3 분 소요

EDA 발표 (01.25) 이전 데이터분석 (1)

Preprocessing

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
from datetime import datetime
warnings.filterwarnings(action='ignore')

plt.rcParams['font.family'] = 'NanumGothic'

#시각화 색상 통일

col=['#6B4E24','#EECA98','#EBAA4F','#6B5B45','#B8853E','#AB891A','#6B5610','#EBBC23','#F7B50F']

df = pd.read_csv('mapo_2019.csv')

# 시간데이터 datetime으로 변환
df['측정일시'] = df.apply(lambda row: datetime.strptime(str(row['측정일시']), '%Y-%m-%d %H:%M:%S'), axis = 1)

1. 시간별 데이터셋

df_t = df.copy()
df_t['time'] = df_t.apply(lambda row: row['측정일시'].strftime('%H'), axis = 1)

gr_t = df_t.groupby(['time'], as_index=False).agg({'dust':'mean', 'f_dust':'mean',
                                                          'oz':'mean', 'no2':'mean'})
# 측정시간에 따른 대기오염도 농도의 평균

fig, axes = plt.subplots(2,1, figsize=(10, 12))

sns.lineplot(ax = axes[0], data = gr_t, x = gr_t['time'],
             y = gr_t['dust'], marker = 'o', palette = col, label = '미세먼지')
sns.lineplot(ax = axes[0], data = gr_t, x = gr_t['time'],
             y = gr_t['f_dust'], marker = 'o', palette = col, label = '초미세먼지')
axes[0].axvline(x = 11, color = 'r', linewidth = 3)

sns.lineplot(ax = axes[1], data = gr_t, x = gr_t['time'],
             y = gr_t['oz'], marker = 'o', palette = col, label = '오존')
sns.lineplot(ax = axes[1], data = gr_t, x = gr_t['time'],
             y = gr_t['no2'], marker = 'o', palette = col, label = '이산화질소')

for i,ax in enumerate(axes.reshape(-1)): 

    ax.set_facecolor('white')
    ax.grid(b = True, color='#999999')

fig.suptitle('측정시간에 따른 대기오염도 농도의 평균', size = 25)
plt.legend()
plt.show()


미세먼지와 초미세먼지는 11시를 기점으로 오전시간대 (오전 0시 - 8시), 오후시간대 (오후 2시 - 10시)의 시간별 대기오염농도가 대칭되는 분포를 가진다. 오존과 이산화질소는 서로 반비례관계에 있는 시간별 대기오염농도 분포를 가진다.

f, ax = plt.subplots(3, 2, figsize=(15,12))

sns.regplot(x = 'dust', y = 'f_dust', data = gr_t, ax = ax[0,0]).set_title('미세먼지 - 초미세먼지', size = 20)
sns.regplot(x = 'dust', y = 'oz', data = gr_t, ax = ax[0,1]).set_title('미세먼지 - 오존', size = 20)
sns.regplot(x = 'dust', y = 'no2', data = gr_t, ax = ax[1,0]).set_title('미세먼지 - 이산화질소', size = 20)
sns.regplot(x = 'f_dust', y = 'oz', data = gr_t, ax = ax[1,1]).set_title('초미세먼지 - 오존', size = 20)
sns.regplot(x = 'f_dust', y = 'no2', data = gr_t, ax = ax[2,0]).set_title('초미세먼지 - 이산화질소', size = 20)
sns.regplot(x = 'oz', y = 'no2', data = gr_t, ax = ax[2,1]).set_title('오존 - 이산화질소', size = 20)

plt.subplots_adjust(left=0.125, bottom=0.1,  right=0.9, top=0.9, wspace=0.2, hspace=0.35)
plt.show()


미세먼지와 초미세먼지, 그리고 오존과 이산화질소는 상관관계가 있음을 확인 가능합니다.

T-test 1. 시간별 대기오염농도 분포 T-test: 오전 11시를 기점으로 오전시간대와 오후시간대 대기오염농도가 대칭되는 분포를 가지는 데, 각 날짜마다 존재하는 오차일 뿐이지 전체적인 평균은 같을 것이다.

$H_0 : \overline{X_a} = \overline{X_b}$
$H_1 : \overline{X_a} \ne \overline{X_b}$

# 오전시간대 미세먼지, 초미세먼지 농도
mor = df_t[(df_t['time'].astype('int') >= 0) & (df_t['time'].astype('int') <= 8)].reset_index()
# 오후시간대 미세먼지, 초미세먼지 농도
sw = df_t[(df_t['time'].astype('int') >= 14) & (df_t['time'].astype('int') <= 22)].reset_index()
sns.kdeplot(data = mor['dust'], color="red", shade=True)
sns.kdeplot(data = sw['dust'], color="blue", shade=True)
plt.show()


from scipy import stats

# 미세먼지 농도 t-test
t_stat, p_value = stats.ttest_ind(mor['dust'], sw['dust'],
                                  equal_var=True, alternative="two-sided")

print("t-statistics : {}, p-value : {}".format(round(t_stat, 4), round(p_value, 4)))

# 초미세먼지 농도 t-test
t_stat, p_value = stats.ttest_ind(mor['f_dust'], sw['f_dust'],
                                  equal_var=True, alternative="two-sided")

print("t-statistics : {}, p-value : {}".format(round(t_stat, 4), round(p_value, 4)))

t-statistics : -2.0247, p-value : 0.0429
t-statistics : 3.4273, p-value : 0.0006 미세먼지 p-value : 0.0429 < 0.05 -> 오전시간대와 오후시간대 미세먼지 농도 평균은 다르다.
초미세먼지 p-value : 0.0006 < 0.05 -> 오전시간대와 오후시간대 초미세먼지 농도 평균은 다르다.

–> 미세먼지는 오후시간대, 초미세먼지는 오전시간대 농도 평균이 높음을 확인할 수 있음.

2. 월별 데이터셋

df_m = df.copy()
df_m['month'] = df_t.apply(lambda row: row['측정일시'].strftime('%m'), axis = 1)

gr_m = df_m.groupby(['month'], as_index=False).agg({'dust':'mean', 'f_dust':'mean',
                                                          'oz':'mean', 'no2':'mean'})
# 측정월에 따른 대기오염도 농도의 평균

fig, axes = plt.subplots(2,1, figsize=(10, 12))

sns.lineplot(ax = axes[0], data = gr_m, x = gr_m['month'],
             y = gr_m['dust'], marker = 'o', palette = col, label = '미세먼지')
sns.lineplot(ax = axes[0], data = gr_m, x = gr_m['month'],
             y = gr_m['f_dust'], marker = 'o', palette = col, label = '초미세먼지')

sns.lineplot(ax = axes[1], data = gr_m, x = gr_m['month'],
             y = gr_m['oz'], marker = 'o', palette = col, label = '오존')
sns.lineplot(ax = axes[1], data = gr_m, x = gr_m['month'],
             y = gr_m['no2'], marker = 'o', palette = col, label = '이산화질소')

for i,ax in enumerate(axes.reshape(-1)): 

    ax.set_facecolor('white')
    ax.grid(b = True, color='#999999')

fig.suptitle('측정월에 따른 대기오염도 농도의 평균', size = 25)
plt.legend()
plt.show()


미세먼지와 초미세먼지는 연초에 농도가 높고 9월즈음에 최저치를 찍음. 오존과 이산화질소는 각각 여름과 겨울에 최고치를 찍는 음의 상관관계를 보임.

2. T-test -> 오존의 계절성: 오존 여름 평균 (6-8월)과 겨울 평균(12-2월) 평균 차이 비교

$H_0 : \overline{X_a} = \overline{X_b}$
$H_1 : \overline{X_a} \ne \overline{X_b}$

# 오전시간대 미세먼지, 초미세먼지 농도
summer = df_m[(df_m['month'].astype('int') >= 6) & (df_m['month'].astype('int') <= 8)].reset_index()
# 오후시간대 미세먼지, 초미세먼지 농도
winter = df_m[(df_m['month'].astype('int') >= 12) | (df_m['month'].astype('int') <= 2)].reset_index()
sns.kdeplot(data = summer['oz'], color="red", shade=True)
sns.kdeplot(data = winter['oz'], color="blue", shade=True)
plt.show()


from scipy import stats

# 오존 농도 t-test
t_stat, p_value = stats.ttest_ind(summer['oz'], winter['oz'],
                                  equal_var=True, alternative="two-sided")

print("t-statistics : {}, p-value : {}".format(round(t_stat, 4), round(p_value, 4)))

t-statistics : 48.386, p-value : 0.0
오존 p-value : 0.0000 < 0.05 -> 여름 > 겨울 오존 농도
–> 오존은 겨울보다 여름에 농도가 높은 계절성을 보인다

댓글남기기