본문 바로가기

본 단계에서 부터는 실질적으로 지리데이터를 갖고 서울시 전기차 충전소 분석을 진행하고자 한다.

이 글에서는 간단하게 아래의 두 가지 데이터만 활용해보고자 한다.

 

1. 서울시 전기차 충전소 현황 데이터

2. 서울시 행정동별 생활인구 데이터

 

두 자료가 각각의 전기차 충전의 공급 현황과 수요를 나타내는 데이터라 가정하며, 1번의 경우 앞선 포스트에서 수집 방법에 대해서 다루었으므로, 이번에는 '서울시 행정동별 생활 인구 데이터'를 다루어 보고자 한다.

 

1. 서울시 행정동별 생활인구 데이터 다루기

서울 열린 데이터 광장(http://data.seoul.go.kr/)에는 서울시의 행정동별 생활인구 데이터를 월별로 제공하고 있다. 

(자료 : http://data.seoul.go.kr/dataList/OA-14991/S/1/datasetView.do)

 

본 분석에서는 내국인에 대한 20년 1월 자료를 활용하였다. 최근 데이터를 사용하지 않은 것은 코로나 바이러스로 인한 생활인구 자료에 노이즈가 발생하였을 것을 우려했기 때문인데, 사실 큰 차이는 느껴지지 않았다.

서울시 행정동별 생활인구 데이터의 형태

자료를 보면 행정동별, 일별, 시간대별, 연령대별, 성별별 생활인구가 자세하게 기록되어있는 것을 볼 수 있다. 또한 행정동의 경우 동 이름이 아닌, 행정동 코드로 입력된 것을 확인할 수 있는데, 이를 매핑하기 위해 행정동 코드 자료 또한 구해야 한다. 행정동 코드는 위의 주소와 같은 페이지에서 구할 수 있다.

행정구역 코드 정보는 표시한 곳에서 내려받을 수 있다.

행정동 코드 정보를 얻었으니 우리는 pandas를 활용하여 행정동 코드를 행정동 이름으로 변경하는 작업을 해보고자 한다.

import pandas as pd
pop_df = pd.read_csv('LOCAL_PEOPLE_DONG_202001.csv')
hd_code = pd.read_csv('행정동코드.csv')

#행정동 코드를 key, 행정동명을 value로 하는 dictionary 정의
hd_dict = dict(zip(hd_code['행자부행정동코드'],hd_code['행정동명'])) 

#위에서 정의한 hd_dict를 참고하여 '행정동'이라는 열 생성
pop_df['행정동'] = pop_df['행정동코드'].replace(hd_dict) 

위 코드를 통하여 '행정동'이라는 이름의 열로 행정동명 데이터를 생성하였다. 다음으로는 본 데이터를 분석에 맞게 reshaping하는 작업이 필요하다. 

 

1. 본 분석에서는 생활인구를 크게 주간(10시~17시)과 야간(19시 ~07시)의 두 시간대로 나누어 진행한다. (출퇴근 시간대인 07시~10시와 17시~18시는 생활 인구가 크게 이동하는  제외하였다.) 행정동별로 해당 시간대별 평균 생활인구를 구한다.

 

2. 두 시간대의 행정동별 평균 생활인구수를 구하면, 야간대비 주간 생활인구 증가율을 계산한다.

 

3. 성별 및 연령대별 데이터가 나뉘어져 있는데, 전기차 수요와 보다 관련이 있는 25~54세에 해당하는 남성 및 여성의 생활 인구에 대해서만 다룬다.

 

위의 세 가지 작업을 실행하는 코드는 아래와 같다.

pop_df_day = pop_df[(pop_df['시간대구분']>=10)&(pop_df['시간대구분']<=17)]
pop_df_night = pop_df[(pop_df['시간대구분']>=19)|(pop_df['시간대구분']<=7)]
col_list = ['남자25세부터29세생활인구수','남자30세부터34세생활인구수','남자35세부터39세생활인구수','남자40세부터44세생활인구수',
            '남자45세부터49세생활인구수','남자50세부터54세생활인구수','여자25세부터29세생활인구수','여자30세부터34세생활인구수',
            '여자35세부터39세생활인구수','여자40세부터44세생활인구수','여자45세부터49세생활인구수','여자50세부터54세생활인구수']
            
#행정동별 groupby 후 각 연령대 자료 총계 계산
night = pop_df_night.groupby('행정동').mean()[col_list].sum(axis=1)
day = pop_df_day.groupby('행정동').mean()[col_list].sum(axis=1)

#야간대비 주간 증가율 계산
night_day = day/night

#새로운 데이터프레임 pop_df 생성
pop_df = pd.DataFrame(night_day,columns=['야간대비 주간생활인구 증가율']).reset_index()
pop_df.loc[:,'주간'] = list(day)
pop_df['야간'] = list(night)

위 작업을 통해 얻은 데이터는 아래와 같다.

행정동별 주야간 평균 생활인구와 증가율

이제 우리는 두가지 데이터 모두 전처리가 완료되었다. 이제 H3 라이브러리를 활용한 분석을 할 수 있으면 좋겠지만..

우리가 가진 데이터는 모두 위경도 자료가 매핑되어있지 않다. 따라서 우리는 각 데이터에 있는 주소 데이터를 활용해 위경도 값을 먼저 찾아줘야 한다.

 

2. googlemaps 라이브러리를 활용한 위경도 값 찾기

import googlemaps
from tqdm import tqdm_notebook

def latlng_getter(df, address_col):
    gmaps_key = 'YOUR-API-KEY'
    gmaps = googlemaps.Client(key=gmaps_key)
    for i in tqdm_notebook(range(len(df))):
        address = df.loc[i,address_col]
        json_obj = gmaps.geocode(address,language='ko')
        if type(json_obj) == list: #json obj가 리스트로 불려올 떄도, 그대로 dictionary로 불려올 떄도 있어서 둔 코드
            json_obj = json_obj[0]
        df.loc[i,'lat'] = json_obj['geometry']['location']['lat']
        df.loc[i,'lng'] = json_obj['geometry']['location']['lng']
    return df
    
pop_df = latlng_getter(pop_df,'행정동')
sttn_df = latlng_getter(sttn_df,'address')

위경도 값을 매핑하기 위하여 위와 같은 함수 latlng_getter를 정의하였다. 

googlemaps 라이브러리를 활용하여 googlemaps API에서 행단위로 선택한 열값(주소)을 검색하여 얻은 위경도 값을 각각 'lat', 'lng' 칼럼을 생성하여 부여하였다.

 

이번 분석을 통해 얻은 것

1. 공공데이터를 활용해 행정동별 생활인구를 다루어보았고, 행정동 코드 자료도 받아 이를 매핑하는 과정을 경험함.

 

댓글