brunch

You can make anything
by writing

C.S.Lewis

by 마경근 Apr 20. 2020

논란의 집회 인원, 빅데이터는 알고있다_2

Part3. 알짜 공공데이터 활용 01 - 서울시 생활인구 데이터

3. 데이터 활용 사례 - 서초동 집회 인구 분석


2019년 9월 28일 서초동에서 대규모 집회가 있었으며, 집회 참가 인원에 대하여 많은 논란이 있었다. 물론 이전에도 대규모 집회의 참가 인원에 대하여 논란은 있었으나, 이번처럼 진영별 첨예한 대립은 보기 어려웠다. 

하지만 이번에는 여러 언론을 중심으로 객관적인 방법으로 집회 참가 인원을 파악하려고 노력하였는데, 이 때 사용한 데이터가 서울시가 공개하고 있는 '생활인구 데이터'이다.

KBS는 생활인구 데이터로 집회 참가 인원을 보도


이번 글에서는 서초동 집회 참가 인원 분석을 사례로, 생활인구 데이터의 활용법을 익혀보도록 한다.

분석 절차는 아래의 순서대로 진행한다.  ※ 데이터 분석을 위한 5단계 절차 참고

① 문제 정의 : 분석하고자 하는 구체적 목표를 정의한다.

② 데이터 수집 : 집회 참가 인원 분석에 필요한 데이터를 확인하고 수집한다.

③ 데이터 전처리 : 수집한 데이터를 시각화와 분석이 용이한 형태로 가공한다.

④ 데이터 시각화 및 탐색 : 적합한 차트를 이용하여 데이터를 시각화하고 정의한 문제의 답을 찾는다.

⑤ 결론, 시사점 : 분석 결과와 함께 분석 과정에서 도출된 유의미한 시사점을 기술한다.



3.1. 문제 정의 

다음의 3가지 문제를 분석 대상으로 정의한다.

1) 집회 참가 인원은 몇명인가? 

2) 참가 인원의 성별/연령별 분포는?

3) 집회에 참가한 인원은 어디서 왔는가? 

집회가 발생한 지역(서초3동)은 지역이 넓으며 평소에도 유동인구가 많았을 것으로 예상된다. 이런 상황에서 위의 문제에 답하려면 몇가지 사전 전제가 필요하다.


3.1.1. 집회 지역 공간 범위

아래 왼쪽 사진은 집회가 발생한 날의 사진이다. 사진에 의하면 집회 참가 인원은 서초역을 중심으로 대로변에 모여 있었던 것으로 보인다. 

생활인구 데이터는 행정구역을 경계로 인원을 집계한다.  즉,  아래 가운데 그림처럼 행정동(붉은색 선 내부) 또는 아래 오른쪽 그림처럼 집계구(파란색 선 내부)가 집계 대상이 된다. 

하지만 이 경우, 행정동(서초3동) 전체는 그 범위가 너무 큰 반면에 집계구는 범위가 너무 작아 정확한 범위 설정이 어렵다는 한계가 있다. 

왼쪽 : 서초역 사거리,   가운데 : 행정동(서초3동) 경계,  오른쪽 : 집계구 경계

따라서 아래 그림과 같이 서초역을 중심으로 대로변을 낀 집계구(노란색 영역)만을 공간 범위로 설정하도록 한다(집계구 안의 파란색 숫자는 집계구 코드이며,  가운데 붉은 화살표는 서초역의 위치이다)


  

3.1.2. 단순 유동인구 배제

서초역은 평소에도 유동인구가 많은 지역으로,  순수 집회 인원을 산출하려면 전체 인구 수에서 단순 유동인구 수를 빼야 한다. 하지만, 당일 데이터에서 단순 유동인구만을 식별하는 것은 매우 어려운 일이다. 

이에 대한 대안으로, 집회일(2019년 9월 28일)과 유사한 조건인 1년전 토요일(2018년 10월6일) 인구를 단순 유동인구 수로 가정하여 빼도록 한다.

예를 들어, 집회일(2019년 9월 28일) 인구가 100명이고 비교일(2018년 10월 6일) 인구가 30명이라면, 집회인원을 70명으로 추정하겠다는 의미이다.  


3.1.3. 집회 시간 범위 

집회 인원 측정 시간은 범위는 사람들의 활동이 잦은 오전 7시부터 오후 23시까지로 한다.


3.1.4. 집회 참여자 분류

집회 인원의 성별, 연령별, 거주지 분류는 생활인구 데이터의 속성을 따르기로 한다.



3.2. 데이터 수집

앞 단계에서 정의된 문제를 분석하려면 6종의 데이터가 필요하다. 모든 데이터는 서울열린데이터광장에서 다운로드 가능하다.


3.2.1. 집계구 단위 생활인구데이터(내국인)

- ①집계구 단위 '서울 생활인구(내국인)'을 선택하고, 2019년 9월 데이터(LOCAL_PEOPLE_201909.zip)와 2018년 10월 데이터(LOCAL_PEOPLE_201810.zip)를 동일한 폴더에 다운로드한다. 

- 압축을 풀고, 2019년 9월 28일(LOCAL_PEOPLE_20190928.csv)과 2018년 10월 6일(LOCAL_PEOPLE_20181006.csv)을 제외한 모든 데이터를 삭제한다. 


3.2.2. 서울에서 생활한 서울 外지역 인구

-  행정동 단위 '서울에서 생활한 서울 外지역 인구'를 선택하고, 2019년 9월 데이터 

(METRO_PEOPLE_201909.zip)를 다운로드한다.

- 압축을 풀고, 2019년 9월28일(METRO_PEOPLE_20190928.csv)을 제외한 모든 데이터를 삭제한다. 


3.2.3. 서울에서 생활한 서울 內지역 인구

 행정동 단위 '서울에서 생활한 서울 지內역 인구'를 선택하고, 2019년 9월 데이터 

(INNER_PEOPLE_201909.zip)를 다운로드한다.

- 압축을 풀고, 2019년 9월28일(INNER_PEOPLE_20190928.csv)을 제외한 모든 데이터를 삭제한다. 


3.2.4. 통계지역경계(집계구.shp, 2016)

-  집계구 단위 '통계지역경계(집계구.shp, 2016)'를 선택하고, (통계지역경계(2016년+기준).zip) 데이터를 다운로드한다. 별도의 폴더를 지정하고 압축을 푼다.


3.2.5. 행정구역 코드 정보

 자치구 단위 ' 행정구역 코드 정보'를 선택하고, (행정동코드_매핑정보_20200325.xlsx) 데이터를 다운로드한다.


최종 데이터 다운로드 결과는 아래 그림과 같다.

분석을 위하여 다운로드한 파일들


3.3. 데이터 전처리


3.3.1. 집회지역 집계구 코드 추출

이번 단계에서는 QGIS를 이용하여 집회지역에 해당하는 집계구 코드를 추출한다. 

QGIS는 무료로 사용할 수 있는 오픈소스  SW로 공식 사이트에서 다운로드할 수 있다. 

QGIS를 처음 접한다면 OSGeo(Open Source GeoSpatial) 한국어 지부에서 제공하는 강의자료를 추천한다.


1) QGIS를 실행한다.


2) 화면에 배경지도(구글맵)를 배치한다.

- QGIS [탐색기]의 [XYZ Tiles]를 마우스 오른버튼으로 클릭하고, [새 연결]을 선택하고 아래와 같이 입력한다.

[이름] : 구글지도

[URL] : http://mt0.google.com/vt/lyrs=m&hl=kr&x={x}&y={y}&z={z}&s=Ga

- [XYZ Tiles]에 추가된 '구글지도'를 더블클릭하면, 아래 [레이어] 패널에 '구글지도'가 추가되면서 [캔버스]에 지도가 표시된다.


3) 집계구 데이터 불러오기

- 상단 메뉴에서, [레이어] > [레이어 추가] > [벡터 레이어 추가]를 선택한다.


- 데이터 원본 관리자 화면에서 아래와 같이 선택하고(집계구.shp 파일은 '통계지역경계(2016년+기준)' 폴더에 있음), 추가 버튼을 클릭한다.

원본유형 : 파일

인코딩 : CP949

원본 :  집계구.shp


- 좌표계 선택 화면이 나타나면, 필터 창에서 '5179'로 검색한 후, 'EPSG:5179'를 선택하고 '확인' 버튼을 클릭한다.


4) 집계구 레이어 투명 색상 변환

- [레이어] 패널의 '집계구'를 마우스 오른 버튼으로 클릭하고, [속성]을 선택한다. 

- [레이어 속성] 창에서 '단순 채우기'를 선택하고, '채우기 색상' 오른쪽의 선택 버튼(역삼각형 모양)을 클릭한 후,  새 창에서 '투명채우기'를 클릭한다.

- 위의 과정을 거치면 투명색으로 변환된 집계구가 화면에 표시된다.


5) 집계구 코드 추출

- 적당한 크기로 지도를 확대하고, [객체선택] 아이콘을 클릭한 후, 키보드의 Ctrl 키와 마우스를 이용하여 대상 집계구 영역을 전부 선택한다(아래 그림의 노란색) 


- [레이어] 패널의 '집계구'를 마우스 오른쪽 버튼으로 클릭하고, [내보내기] > [선택한 객체를 다른 이름으로 저장]을 선택한다. 


- 화면이 열리면, 아래와 같이 값을 선택/입력하고 [확인]을 클릭한다. 나머지는 그대로 둔다.

포맷 : 쉼표로 구분된 값 [CSV]

파일이름 : 집회지역 집계구.csv

인코딩 : CP949


- 텍스트에디터로 저장된 '집회지역 집계구.csv' 파일을 열면, 집회 지역의 집계구 코드(TOT_REG_CD)가 저장되어 있음을 확인할 수 있다.



3.3.2. 집계구 단위 데이터 전처리

집회 참가 인원의 수와 성별, 연령별 집계와 시각화를 위하여 데이터를 전처리한다.

이후부터는 구글의 colab(https://colab.research.google.com/)을 활용한다.


1) 데이터 로딩

- 2018년과 2019년의 집계구 단위 생활인구 데이터를 로드한다. 복잡한 컬럼명을 단순화 하고,  3명 이하 인구 마스킹 문자(*)를 null 값으로 변환하기 위한 설정을 한다.

- 아울러 앞 단계에서 생성한  '집회지역 집계구.csv' 데이터도 함께 로드한다.


2) 분석 범위 데이터 추출

- '2018 집계구 단위 생활인구' 데이터프레임(local_2018)에서 '집회지역 집계구'(area_cd)에 해당하는 집계구 범위를 추출한다.

- 아울러, 오전 7시부터 23시에 해당하는 시간 범위만 추출한다.


3) 데이터 구조화

현재의 열중심 데이터 구조는 분석과 시각화에 적합하지 않다. 행중심 데이터로 변환한다.

- 사용하지 않는 데이터는 모두 삭제하고, melt 메소드를 이용하여 행중심 데이터로 변환한다.

- variable 컬럼에서 성별과 연령 컬럼을 추출하여 별도의 컬럼으로 만든다.

- 2019년 데이터와 2018년 데이터 연산을 위하여 'value' 이외의 컬럼을 인덱스로 설정한다.


4) 집회 참가 인구 계산

- 앞 단계와 동일한 방법으로 2019년 데이터를 일괄 전처리한다.

- 2019년 인원(value)에서 2018년 인원(value)을 감하여 집회 참가 인구를 계산한다.


3.3.3. 행정동 단위 데이터 전처리

집회에 참가한 인구의 주소지를 집계하기 위하여 관련 데이터를 전처리한다.


1) 데이터 로딩

- 관련 데이터를 로드한다.


2) 서울 外지역 인구 데이터 전처리

- 오전 07시부터 23시까지 서초3동에서 생활하였던 인구만을 추출한다.

- 데이터 분석과 시각화를 위하여 열중심의 데이터를 행중심 구조로 변경한다.

- null 값이 있는 행은 모두 삭제한다.

- 성별과 연령 컬럼을 생성한다.

- sgg 테이블과 머지하여 서울외 거주자의 거주지 컬럼을 추가한다.


3) 서울  內지역 인구 데이터 전처리

- 오전 07시부터 23시까지 서초3동에서 생활하였던 인구만을 추출한다.

- 나머지 절차는 앞단계(서울 外지역 인구 데이터 전처리)와 동일하다.



3.4. 데이터 시각화 및 탐색


3.4.1. 집회 참가 인원


1) 2019년과 2018년 유동인구 비교

- 2019년 집회지역의 시간대별 유동인구를 시각화하고, 2018년 동일한 조건의 유동인구를 시각화하여 인구 차이를 비교한다.

- 평시(2018년 기준)에는 14시 경에 가장 많은 유동인구 가 있으나, 집회일에는 18시에 가장 많은 유동인구가 있었음을 확인할 수 있다(120,758명)


2) 집회 인구 추정

- 2019년에서 2018년 유동인구 수를 감하면, 집회 참가 인구 수를 추정할 수 있다. 

- 집회 장소에는 아침부터 저녁까지 평시보다 많은 인구가 몰렸는데, 오후 12시부터 본격적으로 증가하기 시작하여  19시에 정점(97,838명)을 찍고 서서히 빠지는 양상을 보였다.


3.4.2. 성별/연령별 분포


1) 성별 분포

- 집회 당일에 남성(242,912)이 여성(237,636)보다 약간 많았다.


- 오후와 저녁 시간대에는 특히 남성이 많았다. 


2) 연령별 분포

- 40대 후반부터 50대까지의 인구가 가장 많이 참여하였는데(256,603), 이는 전체 참여 인구(480,548)의 약 54%가 된다.


- 히트맵을 이용하면, 40대 후반(45세~49세)의 인구가 저녁 19시를 중심으로 가장 많았음(18,388명)을 확인할 수 있다. 

3.4.3. 참가인원 주소지  


1) 서울 內 지역

- 서울 내에서는 해당 지역인 서초구 주민(178,646명)이 가장 많았으며, 강남구(44,456명)와 관악구(40,311명) 인구가 그 뒤를 따랐다. 


2) 서울 外 지역

- 서울 외 지역에서는 성남시 분당구 주민(21,349명)이 가장 많았으며, 경기 부천시(13,124명), 용인시 수지구(12,903명)이 순으로 참여 인구가 많았다. 


4. 결론, 시사점

집회 참가 인원은 집계 방식(연 인원 or 특정 시점 인원)과 지역 범위 설정에 따라 크게 달라질 수있다.  더우기 '생활인구 데이터'도 결국 '추정치' 데이터이기 때문에 정확한 집회 인원 산출은 애초에 불가능하다. 하지만, 현재 여건에서 데이터를 이용하여 객관적이고 과학적으로 집회 인원을 산출하였다는 사실에 의미를 부여할 수 있을 것으로 생각한다.

이번에 소개한 분석 사례는 상권 분석 등 다른 분야에도 응용이 가능할 것으로 기대한다. 신용카드 매출과 같은 다른 성격의 데이터와 융합하여 분석하면, 보다 입체적인 분석 결과를 얻을 수 있을 것으로 기대한다.


분석에 사용한 소스코드는 아래의 github 페이지에서 확인 가능하다.

분석에 사용한 소스 데이터는 아래의 구글 드라이브에서 다운로드 가능하다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari