brunch

You can make anything
by writing

C.S.Lewis

by 마경근 Jan 15. 2020

좋은 시각화를 위한 깔끔한 데이터

Part2. 공공데이터 시각화 및 탐색

데이터에 숨겨진 인사이트를 효율적이고 아름답게  시각화 하려면, 잘 구조화된 데이터이어야 한다.
데이터 전처리 과정에 많은 노력을 투여하는 이유도 이와 다르지 않다.
이번 글에서는 멋지고 효율적인 데이터 시각화를 위한 전제 조건으로써, '깔끔한 데이터(tidy data)'를 다룬다.


1. 깔끔한 데이터란?

깔끔한 데이터(Tidy Data)는 2014년 발표된 Hadley Wickham의 논문 에 상세히 소개되어 있다. 이 논문에서 저자는 깔끔한 데이터의 요건을 설명하고 R 언어를 이용하여 지저분한 데이터(messy data)를 깔끔한 데이터로 변경하는 방법을 소개하였다.


저자가 말하는 깔끔한 데이터란 '데이터 분석에 즉시 활용이 가능한 데이터'로 다음과 같은 특징을 갖는다.

1. 각 변수(variable)는 테이블의 열(column)을 구성한다.

  → 개체의 속성(예를 들면 키, 몸무게, 성별)을 포함한 공간, 시간 변수는 테이블의 열이 된다. 

2. 각 관측값(observation)은 테이블의 행(row)을 구성한다.

  → 개체의 상태 값(예를 들면 2020년1월에 서울에서 거주하는 172 cm, 67 kg, 남성)은 테이블의 행이 된다.

3. 각 관측 단위(observation unit)는 하나의 테이블을 구성한다.

  → 각테이블은 단일 관측 단위의 변수로만 구성되어야 한다. 여기서 관측 단위란 변수들이 공통적으로 설명하는 대상을 뜻한다. 

깔끔한 데이터의 요소


2. 그렇다면 지저분한 데이터란?


여기서 '지저분한(messy)'이란, 시각화를 포함한 데이터 분석 측면에서 바람직하지 않음을 뜻한다.  하지만 '지저분한' 데이터란 요약과 집계된 데이터임을 의미하기 때문에, 사람의 시각으로는 오히려 보기 좋은 데이터 구조일 수 있다. 


데이터 분석을 위하여 수집하는 데이터는 '지저분한 데이터'인 경우가 대부분인데, 이유는 다음과 같다. 

데이터 분석을 전제로 데이터를 생성하지 않았음

요약과 집계된 데이터가 직관적으로 이해하기 쉬움(피벗팅 테이블 선호)


어쨋든 데이터 시각화 측면에서 '지저분한 데이터'는 바람직한 구조가 아니므로 '깔끔한 데이터' 구조로 변형하는 것이 좋다. 지저분한 데이터는 다음과 같은 특징을 갖는 경우이다.

1. 열(column) 이름이 변수 이름이 아니고 값인 경우

서울시에서 제공하는 '생활인구' 데이터는 컬럼의 이름이 값을 갖는다.

2. 하나의  테이블에 다양한 관측 단위(observational units)가 있는 경우

3. 하나의 열에 여러 변수가 들어 있는 경우

생활인구 데이터는 성(남/여)과 연령 변수가 같이 들어 있다.

4. 변수가 행(row)과 열에 모두 포함되어 있는 경우

5. 하나의 관측 단위(observational units)가 여러 테이블로 나누어져 있는 경우


위에서 설명한 '지저분한 데이터'는 상대적으로 열(column) 수가 많고 행(row)수가 적은 특징을 갖기 때문에  '열 중심 데이터'라고도 불린다.


3. 깔끔한 데이터로 만드는 방법

파이썬을 이용하여 '지저분한 데이터'를  '깔끔한 데이터' 구조로 변형하는 방법은 아래의 블로그를 참조하기 바란다.


여기서는 앞서 예를 든 생활인구 데이터를 깔끔한 데이터로 변경하는 과정을 설명한다.

목표는 아래의 생활인구 데이터를 이용하여..,(전체 파일은 여기서 확인 가능)

아래 그림과 같이, 서울의 ①자치구별 남여 생활인구 비교, ②생활인구가 가장 많은 강남구의 연령 분포, ③강남구의 시간대별 생활인구 분포를 시각화하는 것이다.


생활인구 데이터 시각화 결과

1. 데이터 구조 확인

대상 데이터는, 2020년 1월10일 서울의 자치구별/시간대별 생활인구를 기록한, 600행 31열로 이루어진 테이블이다. 

테이블을 구성하는 변수의 유형은 아래와 같다.

기준일 : 순서가 있는 범주형 데이터 → 순위형

시간대 : 순서가 있는 범주형 데이터 → 순위형

자치구 : 순서가 없는 범주형 데이터 → 명목형

남자0~9세 : 인구수를 정량적으로 기록한 집계형 데이터 → 연속형

데이터는 사람이 한눈에 파악하기에 적합한 구조이지만. 데이터 측면에서는 전형적인 '지저분한 데이터'이다.

열이름에 값이 포함되어 있음 : 0-9세, 10-14세...

하나의 열예 여러 변수 포함 : 성(남자/여자), 연령(10세 또는 5세 단위)

이 데이터 구조로는 원하는 형태의 시각화가 쉽지 않다.


2. 행중심 데이터로 변경

pandas의 melt() 함수를 이용하여 열중심의 데이터를 행중심 데이터로 변경한다. 

변경후 16,800행 5열의 데이터로 행중심 데이터로 변경 되었음을 확인할 수 있다.


3. 하나의 열에 있는 변수 분리

str.slice() 메소드를 이용하여 '성별'과 '연령대' 컬럼(변수)를 생성한다.


4. 데이터 시각화

seaborn 라이브러리를 이용하여 아래의 내용을 시각화한다. 

자치구별 남여 생활인구 비교

생활인구가 가장 많은 강남구의 연령 분포 

강남구의 시간대별 생활인구 분포 

데이터가 깔끔하게 정리되었기 따문에 단 4줄의 코드만으로 원하는 시각화 결과를 얻을 수 있다.

시각화 결과 다음의 사실을 확인할 수 있다.

자치구별 남여 생활인구 비교 → 강남구의 생활인구가 가장 많음(여성이 많음)

생활인구가 가장 많은 강남구의 연령 분포 → 35~39세의 인구가 가장 많음

강남구의 시간대별 생활인구 분포 → 오후 15시경 인구가 가장 많음


전체 소스 코드는 아래의 github 페이지에서 확인할 수 있습니다. 






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