기억하려고 적어두는 두번째 미니 프로젝트
< 공공데이터를 활용한 미세먼지 농도 예측하는 머신러닝 모델링 >
데이터는 두가지 활용
1. 에어코리아의 미세먼지 데이터
2. 기상청 기상자료 개방포털의 날씨 데이터
탐색적 데이터 분석

4개의 csv파일을 활용할 예정!
Pandas 라이브러리를 활용하여 데이터를 불러오고 변수에 저장하여 확인하는 절차는 필수
.info()
→ 결측치와 데이터 타입 한번 확인해주기
데이터 전처리와 모델링을 위해 데이터 분석을 진행
시각화를 통해 관측치들의 패턴 탐색, 잘못된 자료 탐색, 변수들간의 관계 파악 가능
→ 주어진 시간이 짧았고 전처리 하느라 시간을 많이 써서 이 과정을 제대로 못했던 것이 아쉽...
데이터 프레임의 변수명만 보고 변수를 날리거나 포함시키기에는 제대로 된 결과를 얻지 못할 수 있으니 어느정도의 시 간을 투자해야하는 과정임 !
시계열데이터
: 시간의 경과와 함께 일정한 간격마다 관측 값이 기록되어 있는 데이터
시계열 데이터는 어떤 특정의 독립변수가 시간의 경과에 따라 종속변수에 대해 어떠한 영향을 미쳤는지 살펴보는데 유용
다중공선성 multicollinearity
: 회귀 분석에서 설명 변수 중에 서로 상관이 높은 것이 포함되어 있을 때는 분산·공분산 행렬의 행렬식이 0에 가까운 값이 되어 회귀 계수의 추정 정밀도가 매우 나빠지는 일이 발생하는데, 이러한 현상을 다중 공선성이라 한다.
특히나 column수가 38개나 되는 날씨 데이터에 대해서는 시각화를 통해 변수간 다중공선성을 확인해 볼 필요가 있었다
ex) 지면온도, 5cm 지중온도, 10cm 지중온도, 20cm 지중온도, 30cm 지중온도
그 다음은 데이터 분석 만큼 중요한 ....
데이터 전처리
위의 4가지 csv파일중 air_21, weather_21은 train 데이터로, air_22, weather_22는 test 데이터로 사용
air 데이터와 weather 데이터를 '측정일시'를 중심으로 합칠 것!
탐색적 데이터 분석 과정에서 .info()로 측정일시의 데이터 타입을 확인했을 때 air와 weather 둘 다 int64 object였음
→ to_datetime으로 데이터 타입 변경
또 !! 잘 살펴보면 두 데이터의 시간 간격이 맞지 않다는 것을 알 수 있다
이 부분은 잘 만져서 맞춰준 다음 'time' 변수 생성해줌
df_21 = pd.merge( air_21, weather_21, how = 'inner' , on = 'time' )
df_22 = pd.merge( air_22, weather_22, how = 'inner' , on = 'time' )
merge 없음 못살아
pd.set_option('display.max_columns', None)
→ column 이 많은 데이터 프레임 확인할 때 유용한 옵션
"........" 으로 생략된 데이터를 확인할 수 있음
통합된 데이터를 보고 이제 사용하지 않을 변수를 제거 !
결측치가 많다고 무작정 drop하기 보다는 일단 살펴보자....
하지만 필요없다고 생각이 되면 과감히 drop함
결측치 처리에도 다양한 선택지가 있는데
평균값으로 채우기, 앞 뒤 데이터로 채우기 등..
나는 가장 무난한 선형 보간법으로 채웠다
shift연산을 이용해 전일 같은 시간의 미세먼지 농도 변수를 추가하기도 하고...
가장 중요한(또?)
머신러닝 모델을 통해 예측하려는 y값(target), 1시간 후 미세먼지 농도 변수 생성까지 하면 전처리 끝 !
이 아니고.....
꽤 중요한 과정
train, test 데이터 분리
전에 말했듯이 21년도 데이터를 train 데이터로, 22년도 데이터를 test 데이터로 저장하면 진짜 끝
머신러닝 모델링
모델링은 3가지로 진행했다
1. LinearRegression

2. RandomForestRegressor


3. GradientBoostingRegressor


두번 모두 PM10의 압도적인 변수 중요도...
PM10이 갖는 feature importance가 매우 높다
Check points
∨ PM10 미세먼지 결측치는 선형보간법(interpolate)으로 대체함
미제먼지 수치를 시각화해서 그래프로 확인한 결과 PM10은 예상할 수 없을 만큼 급격히 변하는 추세가 아니었음
∨ 필요없다면 과감히 변수 제거
대부분의 데이터가 결측치라면 최빈값이나 다양한 방법으로 채워줘도... 의미 없을 가능성 높음, 오히려 안좋을 수 도
∨ shift 수행시 주의
직전 데이터 값을 참고하는 만큼 데이터가 제대로 정렬되어 있는지 확인해야함
이번에도 정렬되어 있지 않아서 sort후 shift 함
∨ to_datetime한 후 데이터 타입이 datetime64로 바뀌어서
날짜 데이터의 month, day, hour을 추출 가능
∨ feature간 상관관계 확인
히트맵을 이용해서 상관관계 확인 후 높은 상관관계를 가지는 변수들은 추리기
→ 중복된 특징을 나타내는 변수가 많아 공선성을 제거하는 것을 통해 더 개선된 결과를 얻을 수 있을 것
'mini project' 카테고리의 다른 글
| 네 번째 미니프로젝트 - 1대1 문의 내용 유형 분류기 (0) | 2023.05.06 |
|---|---|
| 세 번째 미니프로젝트 - 저시력자를 위한 원화 화폐 분류 (0) | 2023.05.06 |
| 다섯 번째 미니 프로젝트 - 스마트폰 센서 데이터 기반 모션 분류 (0) | 2023.04.14 |
| 세 번째 미니프로젝트 - 차량 공유업체의 차량 파손여부 분류 (0) | 2023.03.22 |
| 두 번째 미니프로젝트 - 악성 사이트 탐지 (0) | 2023.03.07 |