[시계열분석] 시계열 데이터 전처리 방향 - 시간현실 반영, Scaling, 다중공선성 처리 : ysyblog.tistory.com/217
해당 포스팅은 위 포스팅에 이어 진행되는 실습입니다.
데이터 코딩은 아래 포스팅에 이어 진행됩니다.
[시계열분석] 시계열 변수 추출 실습(Python)(1) - 시계열 분해 (bike-sharing-demand dataset) :ysyblog.tistory.com/209
[시계열분석] 시계열 변수 추출 실습(Python)(2) - 이동평균/지연값/증감폭/그룹화 (bike-sharing-demand dataset) :ysyblog.tistory.com/210
[시계열분석] 시계열 변수 추출 실습(Python)(3) - 종속변수들과 독립변수들과의 관계를 파악하기 위한 시각화 (bike-sharing-demand dataset) :ysyblog.tistory.com/211
[시계열분석] 시계열 변수 추출 실습(Python)(4) - 시계열 데이터 준비(train/test set 분리) (bike-sharing-demand dataset) :ysyblog.tistory.com/212
[시계열분석] 기본 모델링 실습(Python) - 모델링 및 분석 성능 평가(bike-sharing-demand dataset) : ysyblog.tistory.com/215
시간현실반영
Trend 처리
Test 기간의 FE데이터를 알 수 있을까?
1) 과거 패턴이 반복될 것이다
2) 하나씩 예측하며 업데이트
raw_fe['count_trend'].plot() #1년마다 늘어났다가 줄어드는 패턴을 보임, 이를 활용해서 예측
len(raw_fe.loc['2012-01-01':'2012-12-31', 'count_trend']) #8784
len(raw_fe.loc['2011-01-01':'2011-12-31', 'count_trend']) #8760
raw_fe.loc['2011-02-29', 'count_trend'] #2/29일 데이터가 없음(윤달)
# 2012년 데이터에 2011년데이터를 넣음
# date duplicattion by rules
raw_fe.loc['2012-01-01':'2012-02-28', 'count_trend'] = raw_fe.loc['2011-01-01':'2011-02-28', 'count_trend'].values
raw_fe.loc['2012-03-01':'2012-12-31', 'count_trend'] = raw_fe.loc['2011-03-01':'2011-12-31', 'count_trend'].values
#2012-02-29 데이터 만들기
step = (raw_fe.loc['2011-03-01 00:00:00', 'count_trend'] - raw_fe.loc['2011-02-28 23:00:00', 'count_trend'])/25 #일정한 스텝을 만든다음
step_value = np.arange(raw_fe.loc['2011-02-28 23:00:00', 'count_trend']+step, #더함
raw_fe.loc['2011-03-01 00:00:00', 'count_trend'], step)
step_value = step_value[:24]
raw_fe.loc['2012-02-29', 'count_trend'] = step_value
# result of duplication
raw_fe['count_trend'].plot() # 2011년과 2012년이 같아짐
# result of duplication
raw_fe['count_diff'].plot()
지연값 처리
- train에서 지연된 값은 test로 들어가면 안된다.(미래시점을 안다고 하고 반영한꼴이기 때문)
- 따라서 train_lag의 끝값들을(test셋의 영역에 들어간 값들)을 test의 값들로 채워야함
# calculation of lag data from Y 따라서 test셋을 따로 만든다.
X_test_fe['count_lag1'] = Y_test_fe.shift(1).values
X_test_fe['count_lag1'].fillna(method='bfill', inplace=True)
X_test_fe['count_lag2'] = Y_test_fe.shift(2).values
X_test_fe['count_lag2'].fillna(method='bfill', inplace=True)
X_train_fe['count_lag2'].plot()
코드요약
### Functionalize
### duplicate previous year values to next one
def feature_engineering_year_duplicated(raw, target):
raw_fe = raw.copy()
for col in target:
raw_fe.loc['2012-01-01':'2012-02-28', col] = raw.loc['2011-01-01':'2011-02-28', col].values
raw_fe.loc['2012-03-01':'2012-12-31', col] = raw.loc['2011-03-01':'2011-12-31', col].values
step = (raw.loc['2011-03-01 00:00:00', col] - raw.loc['2011-02-28 23:00:00', col])/25
step_value = np.arange(raw.loc['2011-02-28 23:00:00', col]+step, raw.loc['2011-03-01 00:00:00', col], step)
step_value = step_value[:24]
raw_fe.loc['2012-02-29', col] = step_value
return raw_fe
# target = ['count_trend', 'count_seasonal', 'count_Day', 'count_Week', 'count_diff']
# raw_fe = feature_engineering_year_duplicated(raw_fe, target)
### modify lagged values of X_test
def feature_engineering_lag_modified(Y_test, X_test, target):
X_test_lm = X_test.copy()
for col in target:
X_test_lm[col] = Y_test.shift(1).values
X_test_lm[col].fillna(method='bfill', inplace=True)
X_test_lm[col] = Y_test.shift(2).values
X_test_lm[col].fillna(method='bfill', inplace=True)
return X_test_lm
결과분석
raw_all = pd.read_csv(location)
# Feature Engineering
raw_rd = non_feature_engineering(raw_all)
# Data Split
# Confirm of input and output
Y_colname = ['count']
X_remove = ['datetime', 'DateTime', 'temp_group', 'casual', 'registered']
X_colname = [x for x in raw_rd.columns if x not in Y_colname+X_remove]
X_train_rd, X_test_rd, Y_train_rd, Y_test_rd = datasplit_ts(raw_rd, Y_colname, X_colname, '2012-07-01')
# Applying Base Model
fit_reg1_rd = sm.OLS(Y_train_rd, X_train_rd).fit()
display(fit_reg1_rd.summary())
pred_tr_reg1_rd = fit_reg1_rd.predict(X_train_rd).values
pred_te_reg1_rd = fit_reg1_rd.predict(X_test_rd).values
# Evaluation
Score_reg1_rd, Resid_tr_reg1_rd, Resid_te_reg1_rd = evaluation_trte(Y_train_rd, pred_tr_reg1_rd,
Y_test_rd, pred_te_reg1_rd, graph_on=True)
display(Score_reg1_rd)
# Error Analysis
error_analysis(Resid_tr_reg1_rd, ['Error'], X_train_rd, graph_on=True)
처음 모델링했던 것보다 결정계수는 소폭 줄었지만, 변수들의 p-value도 많이 유의해졌고, 에러율도 많이 낮아졌다.
Scaling
scaler = preprocessing.MinMaxScaler()
scaler_fit = scaler.fit(X_train_feR)
X_train_feRS = pd.DataFrame(scaler_fit.transform(X_train_feR),
index=X_train_feR.index, columns=X_train_feR.columns)
X_test_feRS = pd.DataFrame(scaler_fit.transform(X_test_feR),
index=X_test_feR.index, columns=X_test_feR.columns)
X_test_feRS.describe().T
코드요약
### Functionalize
### scaling of X_train and X_test by X_train_scaler
def feature_engineering_scaling(scaler, X_train, X_test):
# preprocessing.MinMaxScaler()
# preprocessing.StandardScaler()
# preprocessing.RobustScaler()
# preprocessing.Normalizer()
scaler = scaler
scaler_fit = scaler.fit(X_train)
X_train_scaling = pd.DataFrame(scaler_fit.transform(X_train),
index=X_train.index, columns=X_train.columns)
X_test_scaling = pd.DataFrame(scaler_fit.transform(X_test),
index=X_test.index, columns=X_test.columns)
return X_train_scaling, X_test_scaling
결과분석
raw_all = pd.read_csv(location)
# Feature Engineering
raw_fe = feature_engineering(raw_all)
### Reality ###
target = ['count_trend', 'count_seasonal', 'count_Day', 'count_Week', 'count_diff']
raw_feR = feature_engineering_year_duplicated(raw_fe, target)
###############
# Data Split
# Confirm of input and output
Y_colname = ['count']
X_remove = ['datetime', 'DateTime', 'temp_group', 'casual', 'registered']
X_colname = [x for x in raw_fe.columns if x not in Y_colname+X_remove]
X_train_feR, X_test_feR, Y_train_feR, Y_test_feR = datasplit_ts(raw_feR, Y_colname, X_colname, '2012-07-01')
### Reality ###
target = ['count_lag1', 'count_lag2']
X_test_feR = feature_engineering_lag_modified(Y_test_feR, X_test_feR, target)
###############
### Scaling ###
X_train_feRS, X_test_feRS = feature_engineering_scaling(preprocessing.Normalizer(), X_train_feR, X_test_feR)
###############
# Applying Base Model
fit_reg1_feRS = sm.OLS(Y_train_feR, X_train_feRS).fit()
display(fit_reg1_feRS.summary())
pred_tr_reg1_feRS = fit_reg1_feRS.predict(X_train_feRS).values
pred_te_reg1_feRS = fit_reg1_feRS.predict(X_test_feRS).values
# Evaluation
Score_reg1_feRS, Resid_tr_reg1_feRS, Resid_te_reg1_feRS = evaluation_trte(Y_train_feR, pred_tr_reg1_feRS,
Y_test_feR, pred_te_reg1_feRS, graph_on=True)
display(Score_reg1_feRS)
# Error Analysis
error_analysis(Resid_tr_reg1_feRS, ['Error'], X_train_feRS, graph_on=True)
처음 모델링했던 것보다 결정계수는 소폭 줄었지만, 변수들의 p-value도 많이 유의해졌고, 에러율도 많이 낮아졌다.
해당 포스팅은 패스트캠퍼스의 <파이썬을 활용한 시계열 데이터 분석 A-Z 올인원 패키지> 강의를 듣고 정리한 내용입니다
'Data Analysis & ML > 시계열분석' 카테고리의 다른 글
[시계열분석] 정상성이란 (0) | 2021.06.19 |
---|---|
[시계열분석] 시계열 데이터 전처리 실습(Python)(2) - 다중공선성 제거 (0) | 2021.03.08 |
[시계열분석] 시계열 데이터 전처리 방향 - 시간현실 반영, Scaling, 다중공선성 처리 (0) | 2021.03.08 |
[시계열분석] 잔차진단 실습(Python) - 잔차진단 시각화 및 분석(bike-sharing-demand dataset) (0) | 2021.03.05 |
[시계열분석] 기본 모델링 실습(Python) - OLS 모델링 및 분석 성능 평가(bike-sharing-demand dataset) (0) | 2021.03.05 |