우당탕탕 개발일지

[대기오염 예측모델 개발] EDA, 보조데이터 전처리하기(장소 특성 통일) 본문

인공지능

[대기오염 예측모델 개발] EDA, 보조데이터 전처리하기(장소 특성 통일)

민아당긴아 2024. 9. 28. 11:19

이전 글에 이어서 진행.

장소 데이터에 대한 문제

각 데이터에서 장소를 나타내는 방식이 다 제각각이다.

데이터명 설명
train_data 월별/장소별 대기오염 정도를 나타내는 데이터
test_data 월별/장소별 대기오염 정도를 나타내는 데이터
aux_data_DailyPopulation 월별 행정동 단위 서울 생활인구 정보(성별 및 연령대별 인구수)
aux_data_DailyRain 일별 자치구 단위 강수량 정보
aux_data_MonthlyBike 월별 행정동 단위 대여소 단위 자전거 이용정보
aux_data_MonthlyCar 월별 행정동 단위 자동차 등록정보
aux_data_YearlyMountainFire 연도별 자치구 단위 임야화재 발생 면적, 건수
aux_data_StationLocation 행정동 단위 대기 관측소 위도/경도 정보

어떤 데이터는 행정동 단위, 어떤 데이터는 자치구 단위이다.

단위 개수 항목
행정동 단위 50 ['강남구', '강남대로', '강동구', '강변북로', '강북구', '강서구', '공항대로', '관악구', '관악산', '광진구', '구로구', '금천구', '남산', '노원구', '도봉구', '도산대로', '동대문구', '동작구', '동작대로', '마포구', '마포아트센터', '북한산', '서대문구', '서울숲', '서초구', '성동구', '성북구', '세곡', '송파구', '시흥대로', '신촌로', '양천구', '영등포구', '영등포로', '올림픽공원', '용산구', '은평구', '자연사박물관', '정릉로', '종로', '종로구', '중구', '중랑구', '천호대로', '청계천로', '한강대로', '항동', '행주', '홍릉로', '화랑로'] 
자치구 단위 25 ['강남구', '강동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '노원구', '도봉구', '동대문구', '동작구', '마포구', '서대문구', '서초구', '성동구', '성북구', '송파구', '양천구', '영등포구', '용산구', '은평구', '종로구', '중구', '중랑구']

행정동 단위의 경우, 경기도 2곳(시흥, 김포)를 포함하고 있지만 자치구 단위의 경우 서울시 자치구 25개만 포함하고 있다.

그래서 이 장소 정보 데이터를 통일할 필요가 있다.

 

행정동 단위를 자치구 단위로 바꾸기

처음에는 행정동 단위를 자치구 단위로 바꾸려고 했다.

행정동-자치구가 1:1 대응인 자치구도 있고 n:1인 자치구도 있었다. 예를 들어 '강동구'에 해당하는 행정동은 '강동구', '천호대로'로 2개이지만 '관악구'는 행정동에 '관악구' 1개 뿐이었다.

따라서 행정동을 자치구로 바꾸고, n:1인 자치구의 경우 평균값을 낼 생각이었다. 강동구 0.4 천호대로 0.6 -> 강동구 0.5 이런 식으로.

그런데 이렇게 할 때 두 가지 문제점이 발생한다.

1. 실질적으로 test_data는 행정동 단위이다.

2. 자치구 데이터에는 경기도 2곳이 포함되어 있지 않아, 이를 어떻게 채울지가 애매하다.

 

자치구 단위를 행정동 단위로 바꾸기

그래서 거꾸로 자치구 단위를 행정동 단위로 바꾸기로 했다. 정확히 말하자면 매칭을 그렇게 한다는 뜻. SQL로 따지면 '행정동 단위 데이터'와 '자치구 단위 데이터'를 LEFT JOIN하는 식이다.

train_data와 aux_data_DailyRain 을 예로 들면 다음과 같다.

train_data.location train_data.address train_data.gu 열들 aux_data_DailyRain.gu 열들
신촌로 서울 마포구 노고산동 57-62 (신촌역 7번 출구) 마포구 ~~ 마포구 ~~
마포구 서울 마포구 포은로 6길 10 망원1동주민센터 옥상 마포구 ~~ 마포구 ~~
마포아트센터 서울 마포구 대흥로20길 28 (마포아트센터) 마포구 ~~ 마포구 ~~

train_data.address에서 자치구 정보를 추출해서 새로운 열 gu를 만들어준다.

df['gu'] = df['address'].apply(lambda x: x.split()[1] if x.split()[0] == "서울" else x.split()[0] + " " + x.split()[1])
print(df['gu'].unique().tolist())

['강남구', '서초구', '강동구', '성동구', '강북구', '강서구', '관악구', '광진구', '구로구', '금천구', '용산구', '노원구', '동대문구', '동작구', '마포구', '서대문구', '성북구', '송파구', '양천구', '영등포구', '은평구', '종로구', '중구', '중랑구', '김포시 고촌읍', '도봉구', '과천시 자하동길']

 

데이터를 합치는 과정은 다음 글에 이어서 작성해야지.