데이터사이언스/커리어
[데이터 코딩테스트 대비 #1] 미세먼지 농도
GIL~
2022. 12. 28. 08:20
문제
PM10_seoul.csv는 12월 1일 1시부터 8일 24시까지 한 시간마다 측정한 미세먼지 농도(PM-10) 데이터이다.
date 컬럼은 측정 시간(YYYY-MM-DD:HH)를 나타내며, PM-10은 미세먼지 농도를 나타낸다.
이 데이터를 활용하여 아래에 답하시오.
(1) 시간에 따른 미세먼지 농도를 적절한 그래프로 시각화하세요. 단, x축 이름은 date, y축 이름은 PM-10이어야 합니다.
(2) 시간대별 평균 미세먼지 농도를 계산하세요. 즉, t시(t=1,2,…,24)의 평균 농도를 구하시오.
(3) 시점 t의 미세먼지 농도를 시점 t-1, t-2, t-3, t-4의 농도를 이용하여 예측하는 모델을 학습하기 위한 데이터를 구성하세요. 예를 들어, 8일 24시의 미세먼지 농도를 8일 20 - 23시의 농도로 예측할 수 있도록 구성합니다.
(4) (3)에서 만든 데이터를 활용하여 선형 회귀 모델을 학습하라
해설
전체 코드는 아래에서 다운로드 받습니다.
(1) 시계열 그래프를 그리는데 적절한 그래프는 선 그래프로 다음과 같이 그릴 수 있습니다.
import pandas as pd
df = pd.read_csv("PM10_seoul.csv")
from matplotlib import pyplot as plt
plt.plot(range(len(df)), df['PM-10'])
plt.xlabel("date")
plt.ylabel("PM-10")
plt.show()
실행 결과는 다음과 같습니다.
(2) 시간대별 평균 미세먼지 농도는 groupby를 이용하여 구할 수 있습니다.
먼저 시간을 추출해야 하는데, 다음과 같은 방법이 가능합니다.
방법 1. str.split 사용
df['time'] = df['date'].str.split(':', expand = True).iloc[:, 1]
방법 2. str slice 사용
df['time'] = df['date'].str.slice(-2, )
방법 3. apply 사용
def get_time(value):
return value[-2:]
df['time'] = df['date'].apply(get_time)
다음으로 groupby를 이용해 시간대별 미세먼지 농도를 구합니다.
df.groupby('time')['PM-10'].mean()
이때의 실행 결과는 다음과 같습니다.
time
01 25.875
02 22.000
03 21.000
04 21.000
05 21.375
06 21.375
07 20.250
08 22.375
09 23.125
10 22.750
11 27.000
12 25.125
13 25.250
14 28.000
15 24.500
16 24.500
17 26.500
18 25.500
19 25.125
20 27.000
21 28.125
22 28.125
23 27.250
24 26.625
Name: PM-10, dtype: float64
(3) 시계열 예측 모델링을 위한 데이터 구조를 이해하고 있는지를 묻는 질문으로 shift를 사용하면 쉽게 만들 수 있습니다.
for k in range(1, 5):
df['PM-10_' + str(k)] = df['PM-10'].shift(-k) # k시간전 농도 부착
df.dropna(inplace = True) # shift를 하면서 생기는 결측 제거
df = df.drop(['date', 'time'], axis = 1) # 모델링에 활용하지 않는 변수 제거
이렇게 만든 df의 구조는 다음과 같습니다. 여기서 PM-10이 라벨, 나머지가 특징이라 할 수 있습니다.
(4) PM-10 컬럼을 기준으로 특징과 라벨을 분리하고 이를 바탕으로 모델을 학습합니다
X = df.drop('PM-10', axis = 1)
y = df['PM-10']
from sklearn.linear_model import LinearRegression
model = LinearRegression().fit(X, y)
데이터 분야 취업 컨설팅 문의는 아래 링크로!