-
통계-12 시계열 데이터통계 2023. 5. 31. 15:52
1. 시계열 데이터
시계열 데이터는 시간을 독립변수로 가지는 데이터이다.
시간의존성: 데이터들이 시간적 연관성을 가지며 서로 영향을 미친다.
계절성: 일정한 주기를 가지며 반복되는 패턴이 나타날 수 있다.
추세: 추세가 증가하거나 감소하는 등 일정한 추세를 가질 수 있다.
자기상관성: 시간적으로 인접한 데이터 사이에 상관관계가 있을 수 있다.
불규칙성: 예측할 수 없는 불규칙한 변동이 발생할 수 있다.
np.random.seed(42) dates = pd.date_range(start="2023-01-01", periods=1000, freq='D') values = np.random.randn(1000) data = pd.DataFrame({ 'Date' : dates, 'Value' : values }) data.to_csv("./data/sample_time_data.csv", index=False, encoding='utf-8')
시간 값과 랜덤한 밸류 값으로 시계열 데이터를 생성하고 데이트 프레임으로 변환하여 저장한다.
data = pd.read_csv("./data/sample_time_data.csv", parse_dates=['Date'] , index_col='Date') plt.plot(data.index, data['Value']) plt.xticks(rotation=-45) plt.show()
데이터를 불러와 시간에 흐름에 따른 랜덤한 값들의 변화를 확인한다.
from statsmodels.tsa.seasonal import seasonal_decompose from statsmodels.graphics.tsaplots import plot_acf result = seasonal_decompose(data['Value'], model='additive', period=365) result.plot() plt.show()
계절성 패키지인 sesonal 패키지와 자기 상관 패키지인 plot_acf 모듈을 불러온다.
계절성 분해를 하는 함수인 seasonal_decompose 함수를 사용하여 결과를 시각화한다. addtive 모델은 구성 요소들이 덧셈으로 이루어져 있으며 선형 직선이고 multiplicative 모델은 구성요소들이 곱셈으로 이루어져 있으며 비선형이다.
데이터를 추세, 계절성, 잔차 성분으로 분해한다. 추세는 데이터의 장기적인 변동 패턴이다. 계절성은 주기적으로 반복되는 패턴이다. 잔차란 모델을 구성하고 남는 것들이다. 즉 위의 시계열 데이터에서 trend와 sesonal 데이터를 뺀 값이다.
plot_acf(data['Value'],lags=50) plt.xlabel('lag') plt.ylabel('autocorrelation') plt.title('autocorrelation function') plt.show()
plot_acf 함수로 자기 상관 함수를 그릴 수 있으며 value 값을 인자로 주어 어떻게 증감하는지를 lags 수 50개로 나타낼 수 있다.
2. 추세
상향 추세: 데이터가 시간에 흐름에 따라 증가하는 추세이다.
하향 추세: 데이터가 시간에 흐름에 따라 감소하는 추세이다.
평평한 추세: 데이터가 시간에 흐름에 따라 일정한 수준을 유지하는 추세이다.
np.random.seed(42) dates = pd.date_range(start='2023-01-01', periods=100, freq='d') values = np.random.randn(100).cumsum() data = pd.DataFrame({'date':dates,'value':values})
랜덤한 데이터 값들을 생성하여 데이터프레임을 구성한다. cumsum 함수는 누적합을 구한다.
data['upward_trend']= np.linspace(0,50,len(data)) print(data['upward_trend']) plt.plot(data['date'], data['upward_trend'], label = 'upward trend') plt.xlabel('date') plt.ylabel('value') plt.title('upward trend') plt.legend() plt.show()
data['down_trend']= np.linspace(50,0,len(data)) plt.plot(data['date'], data['down_trend'], label = 'down trend') plt.xlabel('date') plt.ylabel('value') plt.title('down trend') plt.legend() plt.show()
data['flat_trend']= np.full(len(data),50) plt.plot(data['date'], data['flat_trend'], label = 'flat trend') plt.xlabel('date') plt.ylabel('value') plt.title('flat trend') plt.legend() plt.show()
상향 추세, 하향 추세, 평평한 추세 곡선을 그려서 확인한다.
3. 여러 가지 그래프
plt.plot(data['date'], data['value']) plt.xlabel('date') plt.ylabel('value') plt.title('time series line plot') plt.show()
선 그래프는 가장 일반적인 그래프이다.
plt.scatter(data['date'], data['value']) plt.xlabel('date') plt.ylabel('value') plt.title('time series line plot') plt.show()
산포도 그래프는 데이터의 분포를 점으로 표현한다.
plt.bar(data['date'], data['value']) plt.xlabel('date') plt.ylabel('value') plt.title('time series line plot') plt.show()
막대그래프는 데이처를 막대 형태로 나타낸다.
plt.boxplot( data['value']) plt.xlabel('date') plt.ylabel('value') plt.title('time series line plot') plt.show()
박스 플롯은 데이터의 분포와 이상치를 쉽게 파악할 수 있다.
np.random.seed(42) dates = pd.date_range(start='2023-01-01', periods=100, freq='d') values = np.random.randn(100) data = pd.DataFrame({'date':dates,'value':values}) plt.hist(data['value'],bins=20) plt.xlabel('date') plt.ylabel('value') plt.title('time series line plot') plt.show()
히스토그램은 데이터의 분포를 쉽게 알 수 있다.
pivot_table = data.pivot(index='date',columns = 'value', values= 'value') plt.figure(figsize=(10,6)) sns.heatmap(pivot_table, cmap='YlOrRd', cbar=True) plt.xlabel('value') plt.ylabel('date') plt.title('time series line plot') plt.show()
히트맵은 시간과 다른 변수를 확인할 수 있으며 일반적으로 시간을 x축 변수를 y축으로 설정한다.
plt.subplot(4,1,1) plt.plot(data['date'],data['value']) plt.title('original data') plt.ylabel('value') plt.subplot(4,1,2) plt.plot(data['date'],result.trend) plt.title('trend') plt.ylabel('trend') plt.subplot(4,1,3) plt.plot(data['date'],result.seasonal) plt.title('seasonal') plt.ylabel('seasonal') plt.subplot(4,1,4) plt.plot(data['date'],result.resid) plt.title('resid') plt.ylabel('resid') plt.tight_layout() plt.show()
원본 데이터에서 추세, 계절성, 불규칙성 등 특정 특징을 추출하여 표현할 수 있다.
'통계' 카테고리의 다른 글
통계-14 이상치 (0) 2023.06.04 통계-13 결측치 (0) 2023.06.01 통계-11 크루스칼 왈리스 검정, 프리드만 검정 (0) 2023.05.31 통계-10 윌콕슨 순위합 검정 (0) 2023.05.31