GIL's LAB

[데이터 코딩테스트 대비 #1] 미세먼지 농도 본문

데이터사이언스/커리어

[데이터 코딩테스트 대비 #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)에서 만든 데이터를 활용하여 선형 회귀 모델을 학습하라

 

해설

전체 코드는 아래에서 다운로드 받습니다.

예시답안.ipynb
0.03MB

 

(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)

 


데이터 분야 취업 컨설팅 문의는 아래 링크로!

https://kmong.com/gig/380507

 

데이터 사이언스 박사가 데이터 분야 취업, 진학을 도와 | 50000원부터 시작 가능한 총 평점 5점의

18개 총 작업 개수 완료한 총 평점 5점인 데이터사이언스박사의 문서·글쓰기, 이력서 교정 서비스를 18개의 리뷰와 함께 확인해 보세요. 문서·글쓰기, 이력서 교정 제공 등 50000원부터 시작 가능

kmong.com

 

Comments