2022년 8월 17일 수요일

Pandas 인덱스

1. 직접 배정해 주는 방법

직접 배정해주려면 data와 갯수가 맞아야 합니다. 다음과 같은 메소드를 씁니다.

 

DataFrame.index= list

DataFrame.columns = list

 

list로 설정된 값이 인덱스로 들어가게 됩니다.

import numpy as np

import pandas as pd

ddf = pd.Dataframe(np.arange(0,16).reshape(4,4))

ddf


ddf.index = ['r0','r1','r2','r3']

ddf.columns = ['c0','c1','c2','c3']

ddf


2. set_index

set_index로 원래 있던 columns을 index로 불러들이는 방법입니다.

 

DataFrame.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)

 

keys 에는 인덱스로 사용하려는 열의 레이블을 입력받습니다.

멀티 인덱스를 하려면 리스트형태로 값을 넣어주시면 됩니다.

drop은 인덱스로 쓸 열을 데이터 내에서 지울것인지 여부를 결정합니다.

append는 기존의 쓰던 인덱스를 삭제할지 여부를 결정합니다.

inplace는 원본 객체를 변경할지 여부를 결정합니다.

verify_integrity는 인덱스 중복여부를 체크하는 것인데 True로 하면 체크하는 시간 때문에 성능이 떨어집니다.


3. reset_index

설정했던 인덱스를 초기화 해보겠습니다.

 

DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')

 

drop과 inplace만 주로 쓰입니다.

level 은 인덱스에서 주어진 단계를 제거합니다. 기본값은 모든 단계를 제거합니다.

col_level은 멀티인덱스일 경우 어떤 것으로 삽입할것인지 설정합니다. 기본값이 0이어서 첫번째 것이 삽입됩니다.

col_fill은 멀티인덱스일 경우 어떻게 다른 단계의 이름을 붙일 것인지 설정합니다. 기본값은 '' 라서 안 붙여집니다. 

'None'으로 하면 인덱스 이름이 반복됩니다.


만약 데이터를 불러올 때 'index_col'을 통해 지정하지 않았거나 데이터 가공 도중 임의의 인덱스(0,1,2, ... )로 지정되었을 경우 다시 인덱스를 지정할 필요가 있음


인덱스 1부터 시작하기

인덱스를 0이 아닌 1부터 시작하고 싶을 때는 df_name.index=df_name.index+1을 사용하면 됨


ex>  titanic.index=titanic.index + 1






ARIMA

시계열 데이터의 정상성 (Stationary)

- 전통적으로 시계열 분석은 현재 시점까지 시계열 데이터의 확률적 특성이 시간이 지나도 그대로 유지 될 것을 가정하고 있다. 즉 시간과 관계 없이 평균과 분산이 불변해야하고, 두 개의 시점 간의 공분산이 다른 시점 과는 무관해야 한다.

1. Constant μ (mean) for all t.
2. Constant σ (variance) for all t.
3. The autocovariance function between Xt1 and Xt2 only depends on the interval t1 and t2.



1) AR Model

Autoregressive 모델은 자기 회귀 모델이라고 불린다. 과거 시점의 자기 자신의 데이터가 현 시점의 자기 자신에게 영향을 미치는 모델이라는 뜻이다. AR(1)모델의 수식을 보면 아래와 같다. (AR의 차수 p=1 인 경우로 현재 시점부터 과거 p개 이전의 시점까지 데이터의 영향도를 보겠다는 뜻)

X(t) = w*X(t-1) + b + u*e(t)

위 수식을 보면 현재 시점 t에 대한 데이터는 이전 시점의 자기 데이터에 가중치 w를 곱하고 상수 b를 더하고(회귀식), error term인 e(t)에 가중치 u를 곱한 것을 더해서 표현할 수 있다. 여기서 e(t)는 white-noise라고 불리며, 일반적인 정규분포에서 도출된 random한 noise 값이다. 위에서 설명한 stationary와 관련된 것으로, 정상성 조건을 만족시키도록 하는 일종의 whitening이라고 하는 정규화로 보면 된다.

AR Model은 추세가 변하는 상황에서는 적합하지 않은 모델이다.


2) MA Model

Moving average 모델은 이동 평균 모델이라고 불리고, 트렌드 즉 추세가 변하는 상황에서 적합한 모델이다. MA(1) 모델을 수식으로 보면 아래와 같다. (MA의 차수 q=1인 경우로 과거 q개 이전의 변화율을 현재 시점에 반영하겠다는 뜻)

X(t) = w*e(t-1) + b +u*e(t)

위 수식을 보면 AR모델에서의 X(t-1)이 e(t-1)로 바뀌었다. 즉, 이전 상태의 자기자신을 보는 것이 아닌, 이전 항에서의 error텀을 현 시점에 반영하겠다는 뜻이다. 즉 변화율(추세)에 맞춰 추정하겠다는 의미다.


3) ARMA Model

ARMA는 1)의 AR과 2)의 MA모델을 합친 모델이다. 현재 시점의 상태를 파악하는 과거 시점의 자기 자신과 추세까지 전부 반영하겠다는 의미로, ARMA(1,1) 모델에 대한 수식을 보면 아래와 같이 간단하게 합칠 수 있다. (회귀 분석에서 독립 변수의 항이 늘어나는 개념)

 X(t) = w_{1,1}*X(t-1) + w_{2,1}*e(t-1) + b +u*e(t)


4) ARIMA Model

이제까지 AR, MA, ARMA모델의 경우 시계열이 정상성이라는 가정이 있는 상황에서 진행했다면, ARIMA모델에서는 차분이라는 개념을 통해 non-stationary한 상황에서 좀 더 나은 예측을 하는 것이 목표다. (현실세계의 데이터는 non-stationary한 경우가 대부분) 

따라서 ARMA모델에 차분이라는 차수 d가 포함되어 ARIMA(p,d,q)로 표현할 수 있다.

차분이라는 개념은 현재 상태에서 바로 이전 상태를 빼주는 것을 의미하며, 차분을 거친 결과들이 whitening되는 효과를 가져온다.

차분을 수식으로 보면 아래와 같다.

d = 0 : x_t = X_t

d = 1 : x_t = X_{t} - X_{t-1}

d = 2 : x_t = ( X_{t} - X_{t-1} ) - ( X{t-1} - X{t-2} )

결국 1차분이 필요한 ARIMA(1,1,1)모델의 경우 ARMA(1,1)모델의 수식에서 X위치에 1차분이 들어간 식을 대입해주면 된다.


- (p, d, q) 차수의 결정

 1) 차분 차수 d : 시계열 plot을 보고 정상성 여부를 확인하고, 차분을 진행하고, 차분 후의 plot을 보고 여부를 확인하는 프로세스로 진행한다. 

 

2) p, q : p, q의 경우 보통 ACF(Autocorrelation function)와, PACF(Partial Autocorrelation function)를 보고 결정한다. ACF는 k lag 단위로 구분된 시계열 관측치 Xt 와 Xtk 간의 상관 측도이고,  PACF는 다른 모든 짧은 시차 항에 따라 조정한 후 k 시간 단위로 구분된 시계열의 관측치 \(X_{t}\) 와 Xtk 간의 상관 측도 이다. (참고 : ACF. , PACF ) 

아래 표를 보면 ACF와 PACF plot의 형태에 따라 p와 q의 차수를 결정할 수 있다. (아래 예시를 통해 구체적으로 확인)

 ACFPACF
AR(p)ACF plot이 서서히 감소하는 형태PACF plot이 p lag 이후 절단되는 형태
MA(q)ACF plot이 q lag 이후 절단되는 형태 PACF plot이 서서히 감소하는 형태