본문 바로가기

About 배우고 익히는법/Python

국가통계포털(KOSIS) 시도별 인구이동 ③ 데이터클렌징(Data Cleansing): 2편 [출처] [파이썬 데이터 분석] 국가통계포털(KOSIS) 시도별 인구이동 ③ 데이터클렌징(Data Cleansing): 2편

지난 포스팅(링크 참조)에서 사용한 데이터를 계속 사용하겠습니다. 국가통계포털(http://kosis.kr/index/index.do)에서 다운로드한 "전출/전입지(시 도) 별 이동자수" 데이터 중에서 "서울특별시"를 전입지로 갖는 데이터만 추출하여 df_seoul 변수에 저장한 자료입니다. 데이터는 아래와 같은 형태입니다. 

파이썬 Pandas 데이터 클렌징 (Data Cleansing)

Pandas 데이터프레임에 들어 있는 데이터의 분포를 살펴 보는 메소드 함수는 describe( )입니다. 평균값, 중간값 등의 데이터 분포를 나타내는 통계값을 보여줍니다. 

# 데이터 값의 전반적인 분포를 살펴 본다
df_seoul.describe()

파이썬 Pandas 데이터 클렌징 (Data Cleansing)

연도별(열:  column) 데이터의 갯수(count), 평균값(mean), 표준편차(std), 최소값(min), 하위 25%값, 중간값(50%), 상위 25%값(75%), 최대값(max) 정보가 표시됩니다. 데이터의 전반적인 분포, 특히 Numeric Values의 분포를 살펴보는데 유용합니다.  

특정 열(column)의 데이터만을 선택하여 평균값 등을 구할 때는 아래와 같이 파이썬 코드를 작성합니다. 2015 ~ 2017년 동안의 연도별 데이터의 평균값을 아래와 같이 구할 수 있다. 위에서 describe( ) 메소드로 출력한 값과 같은지 확인해보시기 바랍니다. 

# 2017년 데이터의 평균값
mu_2017 = df_seoul["2017"].mean()

# 2015년, 2016년의 각각 평균값
mu_2015_2016 = df_seoul[["2015", "2016"]].mean()

파이썬 Pandas 열(column) 평균값(mean)

이번에는 각 전출지별로 서울로 전입한 인구 수의 누적 합계를 계산해 보겠습니다. 판다스 sum( ) 함수 메소드를 사용하면 간단하게 합계를 구할 수 있습니다. 열 방향 합계를 구할 때는 함수 인자로 axis=1을 입력합니다. 

# 누적 이동 인구 수를 지역별로 구해서 "합계"라는 열(column)에 추가
df_seoul["합계"] = df_seoul.sum(axis=1)

파이썬 pandas 열(column) 합계


이번에는 연도를 나타내는 열이름 리스트를 쉽게 만드는 방법을 먼저 해보겠습니다. 리스트에 들어 있는 개별 원소를 어떤 함수에 하나씩 매핑(mappint)하여 적용하는 map( ) 함수, 숫자형 데이터를 문자열로 변환하는 str( )함수, 어떤 배열 객체를 리스트(list)로 변환하는 list( )함수를 사용합니다. 

# map 함수를 이용하여 2010 ~ 2017까지 숫자를 string으로 변환하고 list에 저장한다. years 변수에는 ["2010", "2011", "2012", ... , "2017"]과 같이 리스트가 저장된다.
years = list(map(str, range(2010, 2018)))

이럿게 단든 years 리스트를 가지고, 2010년부터 2017년까지 호남권(광주광역시, 전라남도, 전라북도)에서 서울로 전입한 인구 이동 데이터만 따로 추출해보겠습니다.  df_seoul[years] 형식으로 해당 연도의 열(column)을 모두 선택하고, loc 메소드를 사용하여 인덱스값 리스트 ["전라남도", "광주광역시", "전라북도"]에 해당하는 행(row) 값만을 따로 선택합니다. 

# 호남권역 -> 서울특별시 전입 인구수만 따로 정리한다
df_honam = df_seoul[years].loc[["전라남도", "광주광역시", "전라북도"]]

이 데이터를  matplotlib 라이브러리를 사용하여 Arear Plot 그래프를 그려 봅니다. 지역 이름을 X축으로 만들어 주기 위해서는 행과 열을 바꿔주는 처리를 먼저 해야 합니다. 행렬의 전치(transpose)라고 부르는데, T 또는 transpose( ) 메소드를 사용합니다.

# matplotlib 라이브터리의 pyplot 메소드를 plt라는 네임스페이스로 불러온다
import matplotlib.pyplot as plt   

# T 메소드를 사용하여 전치행렬을 만든다
tdf_honam = df_honam.T

이처럼 전치를 하는 이유는 matplotlib에서는 pandas dataframe의 index값을 X축 값으로 처리하기 때문입니다. df_honam과 tdf_honam을 plot( ) 함수를 이용하여 Area Plot을 그려서, 전치하기 전과 후의 결과를 비교해 봅니다. 이때 plot( ) 함수 인자로 그래프 종류를 나타내는 kind 옵션에 "area"를 지정합니다. 

# 전치하기 전의 그래프 그리기: df_honam
df_honam.plot(kind="area")

파이썬 matplotlib.pyplot - Area Plot


# 전치한 이후의 그래프 그리기: tdf_honam
tdf_honam.plot(kind="area")

파이썬 matplotlib.pyplot - Area Plot

두 번째그래프와 같이 X축에 연도가 나오고 Y축에 인구가 나오는 것이 의미있는 데이터를 보여준다고 할 수 있습니다. 그래프의 범례에 들어가는 지역명이 한글로 되어 있어서 깨지는 것이 보입니다. 한글이 깨지는 문제는 다음과 같은 코드를 넣어서 해결합니다. (예전에 어느 분 블로그에서 가져온 코드입니다. 블로그 주소가 기억나지 않네요 ㅠ)

import platform
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)
else:
    print('Unknown system!')

파이썬 matplotlib.pyplot - Area Plot

이제 X축 이름과 Y축 이름, 그래프 이름 등을 추가하겠습니다. 그래프를 꾸며 주는 작업이라고 보시면 될 것 같습니다. 

plt.title("호남권역 -> 서울특별시 이동 인구 수")
plt.ylabel("인구 수(명)")
plt.xlabel("연도")
plt.show()

파이썬 matplotlib.pyplot - Area Plot