[ python ] 서울 생활이동 인구

2023. 3. 31. 20:34Python

728x90
반응형

예전에 데이터가 중요하지 않던 시절 아니 정확하게는 데이터에 큰 관심이 없던 시절에는 이동통신사 데이터도 공개하고 유동인구도 자료도 받을 수 있는 시절이 있었는데 지금은 큰 비용을 지불해야 구할 수 있는 귀한 자원이 되었습니다.

정확하게는 코로나 이전 SK 텔레콤에서 지오비전이라는 솔루션을  만들기 전에는 데이터를 받아서 사용할 수 있었는데 지금은 만들어진 솔루션을 사용하는 상황에 있습니다.

예전에 데이터를 받았을 때는 빅데이터의 관심도 툴에도 관심이 없었는데 데이터가 프리 했고 지금은 툴도 다룰 수 있고 관심도 많은데 데이터가 없는 상황이라고 할 수 있을 것 같습니다.

마치 예전에 대학생 때는 시간은 있는데 돈은 없고 회사 다니면서는 돈은 있는데 시간이 없는 것과 같은 상황인 것 같습니다.

매일 방문하고 있는 사이트이지만 인지하지 못하고 있는 부분을 다시 한번 살펴보니 유동인구에 대한 데이터를 제공해 주는 곳이 있었습니다.

바로 서울 열린데이터 광장입니다.

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

예전에 인구는 주민등록 통계로 분석을 진행하였으나 현재는 유동인구를 통한 분석도 병행하고 있습니다. 그런 데이터를 가장 유용하게 사용하려면 물론 통신사 데이터 만한 것이 없을 것입니다.

가끔 사이트를 방문하면 구별로 사람들이 이동하는 화살표를 보기만 해야 하는 상황이 있습니다. 

남들이 만들어 준 데이터를 잘 활용하는 것도 중요하지만 데이터를 다루는 사람은 나만의 데이터를 만들어보고 싶은 욕심이 생길 때가 있을 것입니다.

이 때 활용하시면 굉장히 유용할 것 같아서 제공하는 데이터를 활용해 보기로 했습니다.


데이터 내려받기

생활인구는 행정동 단위 / 자치구 단위가 있으며 마지막에는 데이터 안내해 주는 란이 있습니다.

행정동 단위를 해보는 것도 좋지만 일단 매크로하게 한번 해보고 드릴다운 하는 것이 좋을 것 같아서 자치구 단위로 데이터를 다운로드하였습니다.

생활인구 자치구 202301 데이터입니다. 사이트에 보시면 계속 데이터를 제공해 줄 거 같아서 기대감이 높아집니다.

시간대별 파일이 안에 들어있습니다. 적게는 12M ~ 70M 수준의 용량입니다. 

여기서도 잠깐 상황을 유추해 보면 새벽 2 ~ 5시 사이에 데이터 용량이 적은 것으로 봐서 사람들의 움직임이 많이 없을 것이 아닐까 가정을 해볼 수 있을 것 같습니다.

데이터를 좋아하는 사람으로 이러한 가정이 맞는다면 정말 기분 좋은 일이 아닐까 생각이 됩니다.

맨 처음 파일을 열어서 데이터를 살펴보도록 하겠습니다.

의미 있는 컬럼은 출발, 도착 시군구 코드, 성별, 나이, 평균 이동시간( 분 ), 이동인구( 합 )이  중요하게 작용할 것 같습니다.

어디서 출발해서 어디에 도착하고 연령에 따른 직장인, 학생, 노령인구의 상황 유추가 가능하고 이동시간에 따른 특정 시간의 혼잡도를 파악하는 것도 가능할 것 같습니다.

특히 이동인구를 알 수 있다면 주간 생활공간에 대한 부분도 파악이 가능할 것 같아 활용도가 높을 것 같습니다.

※ 하지만 데이터가 너무 크면 활용도가 떨어지니 최대한 가볍지만 활용도 있는 시각화가 필요할 것 같습니다.


예전에 데이터 시각화 공부를 하면서 활용해 보고 싶은 방법이 있어서 활용해 보도록 하겠습니다.

import pandas as pd
import glob
import altair as alt
import geopandas as gpd

메인 라이브러리는 pandas & altair 입니다. 시각화 라이브러리로 주로 사용하고 있습니다.

해당 데이터는 코드로 나와 있기 때문에 행정구역 코드 데이터를 이름으로 가져올 수 있게 파일을 받았습니다.

시도를 코드로 보기에는 가시성이 떨어질 수 있기 때문에 이름을 표기해 주는 것이 효율적일 것 같습니다.

 

 

배경지도 만들기

Geometry 시각화를 하면 더욱 효과가 좋을 것 같아서 행정구역 공간파일도 다운로드하였습니다.

해당 파일은 GRS 80 좌표를 쓰고 있기 때문에 익숙한 위경도 좌표로 crs를 사용해서 변경해 주었습니다.

alt.Chart( sigu_g ).mark_geoshape(
    fill = 'lightgray', stroke = 'white'
).encode()

해당 공간파일은 동별 구역이므로 구별로 합쳐줘야 할 필요가 있을 것 같습니다.

Geopandas의 함수를 활용해서 구별로 데이터를 요약해 주었습니다.

선과 선을 연결해 주기 위해서 해당 자치구의 중심의 위경도를 구해 주도록 하겠습니다.

altair를 사용하면 간단하게 해당 지도를 구할 수 있습니다.

데이터 전처리
files = []

for file in glob.glob( 'D://*/*/생활 이동인구/생활이동_자치구_202301/*'):
    a = pd.read_csv( file, encoding = 'cp949' )
    files.append( a )
move = pd.concat( files )

데이터를 for loop를 활용해서 하나로 합쳐보았습니다. 파워쿼리를 이용한 데이터 합치기와 동일한 방법입니다.

 

[ 파워 BI ] 파워 쿼리를 이용한 데이터 합치기 ( 파일 합치기 )

파일이 여러개가 있을 때 데이터를 하나로 합치는 방법을 알아보도록 하겠습니다. 매일 매일 Report를 받아야 하는 업무 진행 시 매우 유용하게 사용할 수 있는 방법입니다.엑셀 표를 활용한 데이

sunconnector.tistory.com

pop = move.copy()
pop[ '이동인구(합)' ] = pop[ '이동인구(합)' ].replace( '*', 3 ).astype( float )
pop[ [ '출발 시군구 코드', '도착 시군구 코드' ] ] = pop[ [ '출발 시군구 코드', '도착 시군구 코드' ] ].astype( str )

이동인구에 숫자가 아닌 문자가 합쳐져 있어서 데이터의 의미에 따라 최대 값인 3으로 변경해 주고 데이터 조인을 위해서 데이터 형식을 문자로 변경해 주도록 하겠습니다.

반응형
pop = pop.groupby( [ '출발 시군구 코드', '도착 시군구 코드', '도착시간' ] ).sum()[ '이동인구(합)' ].reset_index()
pop = pop[ pop[ '출발 시군구 코드' ].isin( gu[ 'SIGUNGU_CD' ] ) ]
pop =  pop[ pop[ '도착 시군구 코드' ].isin( gu[ 'SIGUNGU_CD' ] ) ]
pop = pop.merge( region[ [ '시군구', 'name' ] ], left_on = '출발 시군구 코드', right_on = '시군구' ).drop( '시군구', axis = 1 )

제가 가진 구별 코드는 서울만 있기 때문에 서울 외 다른 지역으로 이동한 것은 필터링하겠습니다.

( 사실 전국도 있지만 일단 서울만 진행해 보도록 하겠습니다 )

데이터 시각화

사용방법
▷ 행정구역 이름을 클릭
▷ 아래 Hour 슬라이더를 사용해서 시간대별 유동인구 변화를 파악

데이터 출발 지역과 도착 지역을 lookup을 활용해서 선으로 연결 후 클릭 시 데이터가 변할 수 있도록 selection을 활용해서 interactive 시각화를 진행해 줍니다.

마지막에 slider를 추가해서 마무리해줍니다.

아래 지도에서 구를 선택 후 슬라이더를 조정하시면 동작 됩니다.


행정구역별 생활인구 변화

 

도봉구는 출근 시간 중구, 서초구 다양한 지역으로 인구가 빠져나가는 것을 볼 수 있습니다

17시경에는 강북구, 노원구의 인근 지역으로 인구 이동이 많은데 아마도 고령 인구의 이동이 있지 않을까 생각이 듭니다.

 

중구 지역은 인구의 이동이 많지는 않으나 종로구, 강남구, 성동구로 인구가 이동하고 있는 Trend를 보이고 있습니다. 

22시까지도 인구의 이동이 많이 일어나는데 아마도 회사의 힘든 하루를 위로해 주는 동반자와 좋은 시간을 보내고 복귀하고 있는 것으로 예측됩니다.

거주 지역이나 관심 지역의 이동현황을 보시면서 다양한 인사이트를 얻어보셨으면 좋겠습니다. 

728x90
반응형