Wanted-PreOnboarding-Team-8 / pre-onboarding-9th-3-8

원티드 프리온보딩 3차 과제
https://pre-onboarding-9th-3-8.netlify.app
0 stars 8 forks source link

EDA: 목데이터 특성 파악 #11

Open jiheon788 opened 1 year ago

jiheon788 commented 1 year ago

EDA

목데이터 특성 파악을 중심으로

0. Setting

import warnings
warnings.filterwarnings(action='ignore')
import json, pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.family'] = 'Malgun Gothic'
from statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import kpss

with open("public/mock/mockdata.json", encoding='utf-8') as f:
    js = json.loads(f.read())

df = pd.DataFrame(js['response']).T
df.head()
id value_area value_bar
2023-02-01 14:32:00 성북구 46 13111
2023-02-01 14:32:05 강남구 9 19143
2023-02-01 14:32:10 노원구 79 14798
2023-02-01 14:32:15 중랑구 4 14456
2023-02-01 14:32:20 노원구 97 19116

1. 시각화

plt.figure(figsize=(40, 20))

plt.subplot(2, 2, 1)
plt.pie(df['id'].value_counts(), labels=df['id'].value_counts().index, autopct='%.1f%%')

plt.subplot(2, 2, 2)
plt.scatter(df['value_area'], df['value_bar'])

plt.subplot(2, 2, 3)
plt.plot(df['value_area'])
plt.xticks(rotation=90)

plt.subplot(2, 2, 4)
plt.plot(df['value_bar'])
plt.xticks(rotation=90)

plt.tight_layout()
plt.show()

image

2. 시계열 분석

ADF 테스트와 KPSS 테스트를 모두 사용하여 시계열의 안정성에 대해 교차 확인할 것입니다.

2.1. ADF 안정성 테스트

ADF 테스트는 시계열이 안정적(Stationary)인지 여부를 확인하는데 이용되는 방법입니다.

def adf_test(values):
    result = adfuller(values)
    print('ADF Statistics: %f' % result[0])
    print('p-value: %f' % result[1])
    print('Critical values:')
    for key, value in result[4].items():
        print('\t%s: %.3f' % (key, value))

print('ADF Test: value_area')
adf_test(df['value_area'])
print('\nADF Test: value_bar')
adf_test(df['value_bar'])
ADF Test: value_area
ADF Statistics: -11.450498
p-value: 0.000000
Critical values:
    1%: -3.498
    5%: -2.891
    10%: -2.583

ADF Test: value_bar
ADF Statistics: -5.163666
p-value: 0.000010
Critical values:
    1%: -3.502
    5%: -2.893
    10%: -2.583

2.2. KPSS 안정성 테스트

시계열이 평균 또는 선형 추세 주변에 고정되어 있는지 또는 단위 루트(unit root)로 인해 고정되지 않은지 확인합니다.

def kpss_test(values):    
    statistic, p_value, n_lags, critical_values = kpss(values)

    print(f'KPSS Statistic: {statistic}')
    print(f'p-value: {p_value}')
    print(f'num lags: {n_lags}')
    print('Critial Values:')
    for key, value in critical_values.items():
        print(f'   {key} : {value}')

print('KPSS  Test: value_area')
kpss_test(df['value_area'])
print('\nKPSS  Test: value_bar')
kpss_test(df['value_bar'])
KPSS  Test: value_area
KPSS Statistic: 0.06021346300418588
p-value: 0.1
num lags: 12
Critial Values:
   10% : 0.347
   5% : 0.463
   2.5% : 0.574
   1% : 0.739

KPSS  Test: value_bar
KPSS Statistic: 0.22758849425522884
p-value: 0.1
num lags: 12
Critial Values:
   10% : 0.347
   5% : 0.463
   2.5% : 0.574
   1% : 0.739

2.3. 지역별 안정성 테스트

현재 데이터는 여러 지역이 섞여 있습니다. 각 지역별로 구분하여도 안정적인지 확인합니다.

def adf_test_only_p_value(values):
    result = adfuller(values)
    print('ADF p-value: %f' % result[1])

def kpss_test_only_p_value(values):    
    statistic, p_value, n_lags, critical_values = kpss(values)
    print(f'KPSS p-value: {p_value}')

for loc in df['id'].value_counts().index:
    df_by_loc = df[df['id'] == loc]
    print(f'\n{loc} Test:')
    adf_test_only_p_value(df_by_loc['value_area'])
    kpss_test_only_p_value(df_by_loc['value_area'])
성북구 Test:
ADF p-value: 0.007769
KPSS p-value: 0.1

강남구 Test:
ADF p-value: 0.065291
KPSS p-value: 0.1

노원구 Test:
ADF p-value: 0.000026
KPSS p-value: 0.09626532001173367

중랑구 Test:
ADF p-value: 0.000000
KPSS p-value: 0.08952778863900929

3. 결론

분석을 통해 파악한 특성은 아래와 같습니다.


용어

Reference

greyHairChooseLife commented 1 year ago

자료의 내용을 떠나서, 이런 태도가 그냥 코더와 문제를 해결하려는 사람을 가르는 것 같습니다. 과제에도, 본받는 면에서도 도움이 많이 됩니다. :100: