시계열 데이터 전처리 | 시계열 데이터 분석 기초 Part.1 #Python #파이썬 상위 162개 베스트 답변

당신은 주제를 찾고 있습니까 “시계열 데이터 전처리 – 시계열 데이터 분석 기초 Part.1 #Python #파이썬“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 데이터 스테이션 이(가) 작성한 기사에는 조회수 6,003회 및 좋아요 69개 개의 좋아요가 있습니다.

시계열 데이터 전처리 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 시계열 데이터 분석 기초 Part.1 #Python #파이썬 – 시계열 데이터 전처리 주제에 대한 세부정보를 참조하세요

안녕하세요. 데이터 스테이션입니다.
매일 10분 데이터 분석은 금주 월/화/목/토요일 진행됩니다.
Q \u0026 A 는 댓글남겨주시면 취합 후, 토요일에 답변드리겠습니다.
감사합니다.
예제 데이터 다운로드 : https://blog.naver.com/data_station/222493262626

시계열 데이터 전처리 주제에 대한 자세한 내용은 여기를 참조하세요.

3. 데이터 전처리 — PseudoLab Tutorial Book

시계열 데이터를 지도학습 문제로 변환 하기 위해서는 예측 대상이 되는 타겟 변수와 예측할 때 사용하는 입력 변수 쌍으로 데이터를 가공해야 합니다. 또한 딥러닝 모델을 …

+ 여기에 표시

Source: pseudo-lab.github.io

Date Published: 11/27/2021

View: 9953

[시계열분석] 시계열 데이터 전처리 실습(Python)(1)

[시계열분석] 시계열 데이터 전처리 실습(Python)(1) – 시간현실반영 및 Scaling. YSY^ 2021. 3. 8. 15:45. 320×100.

+ 여기에 보기

Source: ysyblog.tistory.com

Date Published: 1/15/2021

View: 3545

시계열 데이터에서 전처리하는 방법 – ok-lab

시계열(Time-Series) 데이터에서 전처리 과정에서 수행하는 일은 결측치를 제거하는 것과 노이즈(Noise)를 제거하는 것이다.

+ 여기에 자세히 보기

Source: ok-lab.tistory.com

Date Published: 9/5/2022

View: 2387

시계열 데이터 패턴 추출 (Feature Engineering) 1

에서 다운받을 수 있다. 데이터 전처리 과정. String to DateTime; Frequency 설정; 시계열 데이터 요소 추출 (Count_trend, Count_seasonal); rolling …

+ 여기에 표시

Source: dsbook.tistory.com

Date Published: 7/13/2022

View: 9988

데이터 전처리 : 신호 처리 방법(푸리에 변환) – DACON

zerojin입니다. Numpy에서 제공해주는 FFT 메소드를 통해 시계열 데이터 전처리를 방법을 소개드립니다. 푸리에 변환을 통해 기존 상태 관측 데이터에서 필요 …

+ 여기에 더 보기

Source: dacon.io

Date Published: 10/17/2021

View: 4876

Lecture 8. 시계열 데이터 전처리 – 5 O L E

시계열 데이터 전처리. 5ole 2021. 3. 18. 18:51. Condition Number. Condition number가 클수록 변수들간의 scaling이 필요하거나 다중공선성이 나타남을 의미함 …

+ 여기에 자세히 보기

Source: 5ohyun.tistory.com

Date Published: 12/28/2022

View: 1012

주제와 관련된 이미지 시계열 데이터 전처리

주제와 관련된 더 많은 사진을 참조하십시오 시계열 데이터 분석 기초 Part.1 #Python #파이썬. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

시계열 데이터 분석 기초 Part.1 #Python #파이썬
시계열 데이터 분석 기초 Part.1 #Python #파이썬

주제에 대한 기사 평가 시계열 데이터 전처리

  • Author: 데이터 스테이션
  • Views: 조회수 6,003회
  • Likes: 좋아요 69개
  • Date Published: 2021. 3. 9.
  • Video Url link: https://www.youtube.com/watch?v=0ErbtpR9HQA

3. 데이터 전처리 — PseudoLab Tutorial Book

Cloning into ‘Tutorial-Book-Utils’… remote: Enumerating objects: 24, done. remote: Counting objects: 100% (24/24), done. remote: Compressing objects: 100% (20/20), done. remote: Total 24 (delta 6), reused 14 (delta 3), pack-reused 0 Unpacking objects: 100% (24/24), done. COVIDTimeSeries.zip is done!

[시계열분석] 시계열 데이터 전처리 실습(Python)(1)

728×90

SMALL

[시계열분석] 시계열 데이터 전처리 방향 – 시간현실 반영, 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 올인원 패키지> 강의를 듣고 정리한 내용입니다

728×90

반응형

시계열 데이터에서 전처리하는 방법

728×90

반응형

Contents

시계열(Time-Series) 데이터에서 전처리 과정에서 수행하는 일은 결측치를 제거하는 것과 노이즈(Noise)를 제거하는 것이다. 결측치와 노이즈는 예측 성능을 떨어뜨리는 녀석들 중 하나이기에 사전에 전처리 과정을 수행하여 처리한 후 작업을 수행하는 것이 옳다.

결측치 (Missing Values)

결측치는 말 그대로 값이 존재하지 않는 값을 의미한다. 예를 들어, 식당의 매출을 예측하는 경우 식당의 휴무일에는 매출이 존재하지 않을 것이다. 이와 같은 경우 이를 제거하고 예측하는 형태로 진행할 수 있을 것이다. 실제 데이터를 다룰 때 휴무일과 같은 경우로 데이터가 없을 수도 있고, 단순히 누락되었을 수도 있다.

일반적인 데이터의 구성에서는 큰 문제가 되지 않는다면 결측치를 제거하면 된다. 그러나, 시계열 데이터에서 결측치를 제거하게 되는 경우 그 시점의 평균과 분산의 왜곡을 가져오게 되고 이는 분석 결과에 치명적인 영향을 미칠 수 있다. 휴무일과 같은 데이터는 제거하면 되지만, 누락된 값인 경우 대체함으로써 평균과 분산에 왜곡을 가져오기 때문이다.

그러나 현실에서 접하는 대부분의 데이터는 항상 결측치가 발생한다. 특히 시계열은 시간의 흐름에 따라 그 시기에 데이터를 직접 수집하는 것이기 때문에 그 시기에 네트워크 이슈 혹은 센서 에러 등의 이유로 수집이 불가하면 결측치가 발생하게 되는 것이다.

시계열 데이터가 아닌 경우에는 일반적으로 평균이나 분산으로 대체하거나 결측치를 제거하면 그만이다. 그러나 시계열 데이터는 그렇게 처리할 경우 문제가 발생한다. 그렇다면 시계열 데이터에서의 결측치는 어떻게 처리할 수 있을까? 시계열 데이터는 시간의 흐름에 따라 데이터의 평균과 분산이 변하기에 이러한 특징을 잘 반영하는 방법론을 활용해야 성공적으로 결측치를 대체할 수 있다. 대체하는 방법은 다음과 같다.

Last observation carried Forward (LOCF): 직전에 관측된 값으로 결측치를 대체

직전에 관측된 값으로 결측치를 대체 Next observation carried backwrd (NOCB): 직후에 관측된 값으로 결측치를 대체

직후에 관측된 값으로 결측치를 대체 Moving Average / Median: 직전 N의 time window의 평균치/중앙값으로 결측치를 대체

그러나 결측치 전후의 패턴이 변화하는 구간인 경우에는 이와 같은 방식으로 처리할 경우 문제가 발생한다. 예를 들어, 주가를 예측하는 경우 상승 구간이거나 하락 구간에 결측치가 존재할 때는 이전 값의 평균으로 대체하게 되면 실제 값과 차이가 발생하게 된다. 이런 경우에는 선형 보간법(Linear interpolation)을 통해 해당 값을 찾을 수 있다.

선형 보간법(Linear interpolation)

선형 보간법은 통계적으로 이미 구해진 데이터들로부터 t시점과 t+1시점 사이의 값을 유추하는 형태를 의미힌다. 예를 들어 끝점 $(x_0, y_0)$와 $(x_1, y_1)$가 주어졌을 때, 그 사이에 위치한 $(x,y)$의 값을 추정하기 위해 다음과 같은 수식을 세울 수 있다.

\[ \frac{y-y_0}{x-x_0} = \frac{y_1 – y_0}{x_1 – x_0} \]

\[ y= y_0 + (y_1 – y_0) \cdot \frac{x-x_0}{x_1 – x_0} \]

위 경우에는 선형 보간법에 대해서만 다루었으나, 선형 보간법 외에도 비선형, 스플라인 보간법 등 다양한 보간법이 존재한다. 필요에 따라 다양한 형태로 사잇값을 보간할 수 있다. 비선형 보간법은 선형 함수가 아닌 비선형 함수를 근사 함수로 사용하는 것을 의미하고, 스플라인(Spline) 보간법은 전체 구간을 근사하는 것이 아닌, 소구간으로 분할하여 보간하는 방법을 의미한다.

좌: Linear interpolation, 우: Linear Polinomial

만약 누락된 값이 너무 많은 경우에는 위와 같은 방법으로 처리를 할 수 없다. 이때는 모델링을 통해 해당 부분을 예측하는 형태로 진행하여야 한다. 일반적인 데이터라면 기존에 수집된 데이터로 결측치를 잘 설명할 수 있으나, 시계열 데이터는 시간에 따라 변화하기에 이를 모델링하는 것은 어렵다. 그러나 최근에는 GAN에 기반한 시계열 생성 알고리즘으로 이 부분을 채우고자 하는 연구가 많이 진행되고 있다.

노이즈(Noise)

노이즈는 잡음을 의미하며, 의도하지 않은 데이터의 왜곡을 불러오는 모든 것들을 칭한다. 예를 들어, 음성 처리의 경우 주변의 소음으로 인해 음성 인식이 제대로 되지 않는다면 이때 소음을 노이즈로 판단한다. 시계열 데이터에서는 원래 분포를 왜곡하는 모든 요인을 칭한다.

최근 주식 시장에서는 코로나 사태로 인해 주가가 엄청나게 하락을 하게 되었다. 이 때 해당 부분을 노이즈로 볼 것인지, 아닌지를 판단함에 따라 제거할수도, 제거하지 않을수도 있다. 시계열 데이터에서 노이즈를 제거하는 방법을 Denosing이라고 한다.

가장 간단한 Denosing 방법으로는 Moving Average가 있다. Moving Average는 평균값으로 관측치를 대체하는 방식이며, 이를 통해 이상하게 튀는 값을 평할화(Smoothing)할 수 있다. 노이즈가 정말 많은 환경에서는 노이즈 자체가 평균이 되어버리는 경우가 있으나, 노이즈가 간혹 발생하는 경우에는 매우 효과적이다. 그렇다면 노이즈가 많은 환경에는 어떻게 처리를 해야할까?

노이즈가 많은 환경에서는 노이즈를 Smoothing 혹은 Filtering 하는 법이 있다. 현재 시계열에 발생하는 노이즈가 어떤 특정한 분포를 따른다고 가정하고 해당 분포의 값을 시계열에서 제거하는 형태로 진행한다.

\[ x_{n+1} + \xi = Ax_{n}\]

여기서 $\xi$가 어떤 특정한 분포를 따른다고 가정하고, 이를 근사한 값을 제거함으로써 원래 값을 복원할 수 있다. 따라서, $Ax_n$를 구한다음 $\xi$를 빼서 원래 시계열 구조를 찾는 것이다. 특정한 분포는 일반적으로 가우시안(Gaussian) 분포를 많이 사용한다.

필터링(Filtering)

노이즈를 제거하는 대표적인 필터링 방법은 가우시안 필터링(Gaussian Filtering), 쌍방 필터(Bilateral Filter), 칼만 필터(Kalman Filter)가 있다. 가우시안 필터링은 노이즈가 정규분포를 따른다고 가정하는 것을 의미하고, 쌍방 필터는 변곡점이 큰 지점을 뭉개버리는 특징을 갖는 가우시안 필터링의 단점을 보완해 데이터의 원 분포에 따라 발생하는 엣지(Edge)들을 더 잘 보존하는 방법이다.

가우시안 필터링(Gaussian Filtering)

가우시안 필터링은 시계열 데이터 뿐만 아니라 이미지 처리에서도 많이 사용하는 Filter 중 하나이며, 수식은 다음과 같다.

\[ G(x,y) = \frac{1}{2 \pi \sigma^2} \exp(-\frac{x^2 + y^2}{2 \sigma^2}) \]

위 수식을 살펴보면 가우시안 필터에서 결정해야할 파라미터는 $\sigma$이다. 일반적으로 $1\sigma$는 68%, $2\sigma$는 95%, $3\sigma$는 99.7%를 설명한다고 알려져있기 때문에 $3\sigma$까지 고려할 때 정확도가 가장 높다고 한다.

경제학에서는 기본적으로 세상의 모든 현상을 가우시안 분포로 설명한다. 그러나 이러한 분포는 주식과 같은 경제 분야에서는 전혀 들어맞지 않는 상황이 발생할 수 있다. 일반적으로 주식 시장에서는 극단적인 경우가 많이 발생하기에 이러한 경우를 팻 테일(Fat Tail)이라 부른다. 이는 정규분포의 양 끝 모양이 더 뚱뚱한 것을 의미한다.

쌍방 필터(Bilateral Filter)

가우시안 필터링은 노이즈를 제거하는데 있어 효과적이지만, 경계성이 뭉개지는 현상이 있다. 이러한 문제점을 보완한 필터링이 바로 쌍방 필터링이며, 수식은 다음과 같다.

\[ \text{BF}[I]_p = \frac{1}{W_p} \sum_{q\in S} G_{\sigma_s} (||p-q||) \cdot G_{\sigma_r} (||I_p – I_q||) I_q \]

칼만 필터(Kalmal Filter)

칼만 필터는 잡음이 포함된 과거 측정값에서 현재 상태의 결합분포를 추정하는 알고리즘이다. 어떠한 정보가 있을 때 해당 데이터는 mixture 모델임(GMM과 같이)을 가정한다. 즉, 다른 분포들의 결합이라는 것을 가정한다. 일반화된 분포를 가정하는 것이 아닌 데이터의 특정에 맞는 분포를 모델링할 수 있어 상당히 많이 사용되며 특히 이미지 트래킹 분야에서 많이 사용되는 필터링 중 하나이다. 수식은 다음과 같다.

\[ \mu_{\text{new}} = \frac{\mu_2 \sigma^2_1 + \mu_1 \sigma^2_2}{\sigma^2_1 + \sigma^2_2} \]

\[ \sigma^2_{\text{new}} = \frac{\sigma^2_1 \sigma^2_2}{\sigma^2_1 + \sigma^2_2} \]

728×90

시계열 데이터 패턴 추출 (Feature Engineering) 1

시계열 데이터 분석을 위해서 사용하는 데이터는

https://github.com/cheonbi/OnlineTSA/tree/master/Data/BikeSharingDemand에서 다운받을 수 있다.

원본 데이터는 Kaggle에서 가져온 것으로

https://www.kaggle.com/c/bike-sharing-demand/overview

에서 다운받을 수 있다.

데이터 전처리 과정

String to DateTime Frequency 설정 시계열 데이터 요소 추출 (Count_trend, Count_seasonal) rolling() (Count_Day, Count_Week) 그룹화(temp_group) + 더미 변수(pd.get_dummies) 지연값 추출(count_lag1,2)

데이터에 관한 설명을 간단하게 하자면, 일단 X의 값을 가지고 자전거 수요량을 예측하기 위해서 만든 데이터 값이다.

Y와 관련된 값으로는 casual, registered, count가 있다.

casual : 자전거 서비스에 등록하지 않은 사람들의 자전거 사용량을 의미한다.

: 자전거 서비스에 등록하지 않은 사람들의 자전거 사용량을 의미한다. registered : 자전거 서비스에 등록한 사람들의 자전거 사용량을 의미한다.

: 자전거 서비스에 등록한 사람들의 자전거 사용량을 의미한다. count : 위의 두가지 수치를 더한 값으로, 총 자전거 사용량을 의미한다.

데이터 확인

1. String to Datetime

데이터를 불러오고 나서 확인하기 위해서 DataFrame을 출력한 결과이다.

가장 첫번째 Column인 datetime이 string형태로 되어있다.

시계열 데이터에서는 datetime에 입력된 형식의 datetime이라는 자료형이 있는데, 시계열 데이터 분석을 하기 위해서는 string으로 되어있는 datetime column의 데이터 형태를 datetime으로 변환해야 한다. 이때, pd.to_datetime() 함수를 이용한다.

# string to datetime if ‘datetime’ in raw_all.columns: raw_all[‘datetime’] = pd.to_datetime(raw_all[‘datetime’]) raw_all[‘DateTime’] = pd.to_datetime(raw_all[‘datetime’]) raw_all.info()

함수를 사용하고 난 뒤의 데이터 형식을 보면

(if문을 사용한 이유는 셀을 중복으로 실행하는 경우 Column이 너무 많아지거나 중복된 Column 이름으로 인해서 에러가 발생하는 것을 방지하기 위해서이다.)

.info()를 통해서 확인했을 때 가장 첫번째 Column의 데이터 형식이 datetime64[ns]인 것을 확인할 수 있다.

# set index as datetime column if raw_all.index.dtype == ‘int64’: raw_all.set_index(‘DateTime’, inplace=True) raw_all

이후에는 set_index() 함수를 통해서 datetime 형식으로 되어있는 데이터를 인덱스로 설정한다.

(inplace는 True일 경우에는 해당 변수에 저장되어 있는 내용을 변경한 값으로 저장하는 것,

False인 경우에는 변경된 내용은 별도로 두고 해당 변수는 상태를 그대로 유지하는 것)

인덱스 자체가 datetime의 값으로 표현되어 있는 것을 확인할 수 있다.

2. Frequency 설정

빈도(Frequency)란 사전적으로 “얼마나 자주”의 뜻을 가진 단어이지만, 시계열 데이터 분석에서 빈도는 분석에 주로 사용되는 시간의 단위라고 보면된다.

빈도를 설정하게 되면 위에서 우리가 인덱스로 설정한 datetime 데이터 형이 자동으로 맞춰준다.

이 기능을 하는 함수는 .asfreq(‘시간단위’)이다. 여기에서는 시간(Hour) 단위로 설정을 해주었다.

raw_all.asfreq(‘H’)

(시간은 ‘H’, 일(day)은 ‘D’, 주(Week)는 ‘W’ 등 한글자 알파벳을 통해서 시간의 빈도를 표현해준다. )

frequency를 시간으로 설정해 주고 DataFrame을 출력했을 때 확인할 수 있다.

.asfreq()를 통해서 빈도를 설정한다면 단순히 의미적으로만 시간의 단위를 설정해주고 끝나는 것인가?

그렇다면 굳이 컴퓨터가 그것을 알아야 할 이유는 무엇일까?

.asfreq()를 통해서 시간의 빈도를 설정하면 단순히 데이터 분석에서 주로 사용하는 시간의 단위를 설정해주는 것 뿐만 아니라,

데이터에 존재하지 않았던, 혹은 누락되었던 시간도 빠짐없이 새로 생긴다.

(다만, 이 때 새로 생성된 행에 대한 나머지 데이터들은 NaN값으로 채워진다. )

(다만, 이 때 새로 생성된 행에 대한 나머지 데이터들은 NaN값으로 채워진다. ) 새롭게 생성된 행들에서 NaN값을 채우기 위해서는 .asfreq()안의 method라는 인자를 통해서 채워줄 수 있다. method = ‘bfill’ : 뒤에 있는 데이터의 값을 그대로 가져와 NaN 값을 채우는 방식 method = ‘ffill’ : 앞에 있는 데이터의 값을 그대로 가져와 NaN 값을 채우는 방식

( .asfreq()의 method parameter 이외에도, .fillna() 등을 통해서 NaN 값들을 채울 수 있다. )

3. 시계열 데이터 요소 추출(Trend, Seasonal, Residual)

Seasonal Decompose

statsmodels.api(sm)을 이용해서

sm.tsa.seasonal_decompose() 함수를 이용하면 데이터 값을 Trend(경향), Seasonal(주기성), Residual(잔차)로 분리할 수 있다.

일단 기본적으로 Y값이 ‘count’ 특성이 어떤 형식으로 되어있는지 시각화를 통해서 확인한다.

# line plot of Y raw_all[[‘count’]].plot(kind=’line’, figsize=(20,6), linewidth=3, fontsize=20, xlim=(‘2012-01-01’, ‘2012-03-01’), ylim=(0,1000)) plt.title(‘Time Series of Target’, fontsize=20) plt.xlabel(‘Index’, fontsize=15) plt.ylabel(‘Demand’, fontsize=15) plt.show()

Y와 관련이 있는 데이터(casual, registered)들의 데이터와 count를 함께 시각화하여 확인해보자.

raw_all[[‘count’,’registered’,’casual’]].plot(kind=’line’, figsize=(20,6), linewidth=3, fontsize=20, xlim=(‘2012-01-01’, ‘2012-06-01’), ylim=(0,1000)) plt.title(‘Time Series of Target’, fontsize=20) plt.xlabel(‘Index’, fontsize=15) plt.ylabel(‘Demand’, fontsize=15) plt.show()

Model Parameter

seasonal_decompose() 에서 model parameter는 additive와 multiplicative 두가지를 입력으로 받는다.

additive : Trend + Seasonal + Residual로 데이터가 구성 되어있다고 가정을 하고 세가지 요소로 분리한다.

: Trend + Seasonal + Residual로 데이터가 구성 되어있다고 가정을 하고 세가지 요소로 분리한다. multiplicative : Trend X Seasonal X Residual로 데이터가 구성 되어있다고 가정을 하고 세가지 요소로 분리한다.

일반적으로 additive가 많이 쓰이고, multiplicative 방식으로 시계열 요소를 분리하는 것은 분리하는 데이터가 백분율 등의 비율을 나타내는 경우에 사용된다고 한다 .

(하지만, 둘 중 어느 방식을 택하는 것은 두가지를 모두 시행하고 시각화를 하여 더욱 적절한 데이터 분리 방식을 선정해야 한다.)

raw_all[‘count’] – seasonal_decompose(model = ‘additive’)

# split data as trend + seasonal + residual plt.rcParams[‘figure.figsize’] = (14, 9) sm.tsa.seasonal_decompose(raw_all[‘count’], model=’additive’).plot() plt.show()

(plt.rcParams[‘figure.figsize’] = (14,9)는 시각화 그래프 설정이므로 시계열 데이터 분석과는 무관한 부분이다. )

위에서부터 기존의 count 데이터, Trend, Seasonal, Residual을 나타내는 그래프이다.

raw_all[‘ count’] – seasonal_decompose(model = ‘multiplicative’)

# split data as trend * seasonal * residual sm.tsa.seasonal_decompose(raw_all[‘count’], model=’multiplicative’).plot() plt.show()

model = ‘additive’에서 반환된 그래프와 비교를 해보았을 때,

Trend, Seasonal에 대한 그래프는 어느정도 유사하지만, Residual에 관해서는 확실히 multiplicative보다는 additive가 더 적절한 그래프를 보여주고 있다는 것을 볼 수 있다.

Reference :

패스트 캠퍼스 파이썬을 활용한 시계열 분석 A-Z

데이터 전처리 : 신호 처리 방법(푸리에 변환)

안녕하세요,

zerojin입니다.

Numpy에서 제공해주는 FFT 메소드를 통해 시계열 데이터 전처리를 방법을 소개드립니다.

푸리에 변환을 통해 기존 상태 관측 데이터에서 필요없는 잡음을 없애는 용도로 사용하시면 됩니다.

참고하셔서 분석에 도움이 됐으면 좋겠습니다. 감사합니다.

(추가로 시계열 분해 자료도 업데이트 하겠습니다.)

Lecture 8. 시계열 데이터 전처리

Condition Number

Condition number가 클수록 변수들간의 scaling이 필요하거나 다중공선성이 나타남을 의미함

Condition number를 감소시켜야 함

1. Scaling

2. 다중공선성 제거 – VIF, PCA를 통해 변수 선택

3. 의존성이 높은 변수들에 패널티를 주는 정규화

Scaling

스케일링을 통해 변수간의 범위 설정

1. StandardScaler()

각 feature가 정규분포를 따른다는 가정

sklearn.preprocessing.StandardScaler().fit() sklearn.preprocessing.StandardScaler().transform() sklearn.preprocessing.StandardScaler().fit_transform()

2. minmaxScaler()

가장 많이 활용되는 알고리즘

0~1 / -1~1 사이의 값으로 변환

각 feature이 정규분포가 아니거나 표준편차가 매우 작을 때 사용

sklearn.preprocessing.MinMaxScaler().fit() sklearn.preprocessing.MinMaxScaler().transform() sklearn.preprocessing.MinMaxScaler().fit_transform()

3. RobustScaler()

minmax와 유사하지만 IQR을 사용해 25%, 75%값을 사용해 변환

outlier 영향을 최소화하며 적은 데이터에도 효과적임

sklearn.preprocessing.RobustScaler().fit() sklearn.preprocessing.RobustScaler().transform() sklearn.preprocessing.RobustScaler().fit_transform()

4. Normalizer()

각 feature를 전체 변수들의 크기로 나눠 변환

각 feature값은 원점으로부터 반지름 1만큼 떨어진 범위내로 변환

sklearn.preprocessing.Normalizer().fit() sklearn.preprocessing.Normalizer().transform() sklearn.preprocessing.Normalizer().fit_transform()

다중공선성 제거

독립변수들간의 상관관계 존재

1. X와 Y 상관관계 확인

2. X 변수들간의 상관관계 확인

3. Variance Inflation Factor (VIF)

독립변수를 다른 독립변수들의 선형회귀로 나타내, 가장 상호의존적인 변수 제거

특정 변수를 눈으로 보고 삭제 가능

+ Principal Component Analysis (PCA)

다차원인 독립변수행렬을 소차원으로 바꿔 상호의존적인 변수를 제거

특정한 변수를 제거하는 것이 아니라 눈으로 확인 힘듦

vif = pd.DataFrame() vif[‘VIF_Factor’] = [variance_inflation_factor(X_train_feRS.values, i) for i in range(X_train_feRS.shape[1])] vif[‘Feature’] = X_train_feRS.columns vif.sort_values(by=’VIF_Factor’, ascending=True)

VIF 작은 순으로 정렬시 몇 개까지가 효과적인지 분석

train : 12, 13 index test : 12, 13 index

+ 참고 자료 및 출처

김경원 < 파이썬을 활용한 시계열 데이터 분석 A-Z 강의 > ( 패스트캠퍼스 강의 )

키워드에 대한 정보 시계열 데이터 전처리

다음은 Bing에서 시계열 데이터 전처리 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 시계열 데이터 분석 기초 Part.1 #Python #파이썬

  • 데이터 분석
  • 데이터분석
  • 주피터
  • 주피터노트북
  • jupyter
  • jupyter notebook
  • python
  • 파이썬
  • 파이선
  • data
  • 데이터
  • 인공지능
  • 분식이
  • 분석
  • 데이터 투데이
  • 매일 10분 데이터
  • 데이터 전처리
  • 데이터전처리
  • 데이터가공
  • 데이터 가공
  • 엑셀
  • 파이썬 데이터
  • 파이썬 데이터 불러오기
  • 파이썬 설치
  • 아나콘다 설치
  • 아나콘다3
  • 아나콘다
  • python 아나콘다
  • 빅데이터
  • 데이터 교육
  • ainbd
  • 텐서
  • 판다스
  • pandas
  • 넘피
  • numpy
  • sklearn
  • 사이킷 런
  • 라이브러리
  • 패키지
  • 자료 구조
  • 데이터 시각화
  • 시각화
  • 그래프 출력
  • 시각화 분석
  • seaborn
  • 데이터 스테이션
  • 파이썬 데이터분석
  • 파이썬 판다스
  • python pandas
  • pandas 강좌
  • 파이썬 엑셀
  • pandas 데이터 분석
  • 판다스 데이터 분석
  • 파이썬 머신러닝
  • python pandas tutorial
  • 시계열
  • time series
  • ARIMA
  • prophet

시계열 #데이터 #분석 #기초 #Part.1 ##Python ##파이썬


YouTube에서 시계열 데이터 전처리 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 시계열 데이터 분석 기초 Part.1 #Python #파이썬 | 시계열 데이터 전처리, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  중 2 도덕 교과서 Pdf | 시험 잘 보는 법 Top5 (꼭 시험 직전에 봐라) 최근 답변 29개

Leave a Comment