본문 바로가기

코딩/데이터분석

[Python/데이터분석] 인구 통계 자료 활용하여 원하는 데이터만 시각화해보기

반응형

  행정안전부(mois.go.kr)에서는 주민등록 인구 통계 자료를 자유롭게 일반인들이 사용가능하도록 공유하고 있다.

파이썬 pandas 및 matplotlib 시각화 코드 작성에 익숙해지기 위해 아래와 같이 과제 진행 및 과정을 기록한다.

 

 

주제 :  과거 1년간 서울지역 재외국민 통계자료를 활용하여 2022년 11월 기준 재외국민수, 세대수 시각화해보기

 

 

1. 통계자료 검색 및 다운

 

1) 검색 조건 설정

 

  먼저 실제 받아 볼 통계자료 조건을 선택한다. .csv 파일이나 .xlsx을 선택하여 다운받을 수 있다. 이번에는 csv 파일로 다운로드 진행하여 처리해볼 것이다.

 

  불필요한 데이터를 제거하기 위해 구분의 남여구분/남여구성비/세대당인구는 체크 해제했다.

검색 조건 설정

 

2) csv 자료 확인

 

  자료를 확인해보면 행정구역부터 2021년 11월~2022년 11월까지 재외국민수와 세대수를 서울시 지역별로 확인할 수 있다.

 

데이터 확인(202111_202211_주민등록인구및세대현황_월간.csv)

 

 

2. 파이썬 데이터 처리 및 시각화

 

1)  pandas 통한 데이터 처리

 

  먼저 pandas를 통해 데이터를 필요에 맞게 가공하는 과정을 진행했다.

 

 

- 데이터프레임 생성

###1. csv파일을 pandas를 통해 필요한 형태로 가공.
import pandas as pd

#데이터프레임 생성
df = pd.read_csv('./202111_202211_주민등록인구및세대현황_월간.csv', encoding='CP949', thousands=',')

 

<결과>

 

  초기 전체 데이터를 그대로 데이터프레임으로 생성했기 때문에 불필요한 자료가 많다. 필요한 데이터는 2022년 11월에 대한 데이터이므로 아래와 같이 필요한 열만 필터링하는 코드를 작성한다.

 

 

-  2022년 11월 자료만 데이터프레임으로 재구성

#데이터 프레임에서 2022년 11월 자료만 읽어오도록 리스트 설정
col_list = ['행정구역', '2022년11월_재외국민 수','2022년11월_세대수']
df = df[col_list]

 

<결과>

 

  위 결과 이미지를 보면 0번째 인덱스에 서울특별시 전체 데이터가 들어가있다. 이 부분도 필터링하기 위해 pandas의 데이터프레임 처리 함수 중 iloc을 활용한다. iloc은 행,열 값을 통해 원하는 데이터에 접근할 수 있으며, 각 행 및 열이 리스트의 특성도 가져서 슬라이싱도 가능하다.

 

df.iloc[행인덱스, 열인덱스

 

 첫번째 행을 제거하려면 아래와 같이 코드를 작성한다. [1:]의 의미는 1행부터 모든걸 출력하겠다는 의미이다. 

[1:, :]와 동일 의미이다.

 

#0번째 인덱스는 서울특별시 전체 인구에 대한 내용이므로 슬라이싱을 통해 생략
df = df.iloc[1:]

 

<결과>

 

 

- 데이터프레임 컬럼명 변경하기

 

  2022년 11월의 정보도 알고있으므로 아래와 같이 단순화시킨다.

#column명을 아래와 같이 변경(재외국민수, 세대수)
df = df.rename(columns={'2022년11월_재외국민 수':'재외국민 수', '2022년11월_세대수':'세대수'})

 

2022년11월_재외국민수 -> 재외국민 수

2022년11월_세대수 -> 세대수

 

 

<결과>

 

 

 

- 행정구역 열의 문자열을 분리하여 재조정하기

 

  서울특별시에 대한 정보는 고정이므로 지역구 정보(종로구,중구,용산구..) 만 분리하여 시각화에 활용하려고 한다. 데이터프레임의 split 함수를 사용한다.

 

#행정구역명을 분리하여 컬럼으로 재조정(빈칸 기준으로 조정)
df_split = df['행정구역'].str.split(' ') #빈칸 기준으로 분리
si = df_split.str.get(0) #서울특별시
gu = df_split.str.get(1) #각 구
code = df_split.str.get(2) #각 코드

 

  빈칸을 기준으로 분리하여 각 si, gu, code 에 분리정보를 저장한다. gu만 출력해보자.

 

지역구 정보

 

 

- 각 분리 정보를 데이터프레임에 포함시키기

 

 위에서 분리했던 si, gu, code 정보를 데이터프레임에 컬럼으로 추가시키고 기존에 있던 '행정구역'열을 삭제한다.

 

df['주소(시)'] = si #데이터프레임 컬럼 추가
df['주소(구)'] = gu #데이터프레임 컬럼 추가
df['주소(코드)'] = code #데이터프레임 컬럼 추가
df = df.drop(columns=['행정구역']) #데이터프레임 기존 행정구역 열 삭제

 

<결과>

 

 

2) 시각화 하기

 

  한 그래프에 다중 막대그래프를 표시하기 위해서 아래 하단의 티스토리 링크를 참고했다. 이중막대를 그릴 때 matplotlib를 활용한 방법을 알려주므로 자세한 내용이 필요한 사람은 아래 링크를 참고.

 

 

- import 하기

 

   라이브러리로는 numpy와 matplotlib를 사용한다.

 

### 2. matplotlib 통한 시각화
import matplotlib.pyplot as plt
from matplotlib import rc
import numpy as np

 

- 변수 설정

 

  그 다음, 막대그래프를 그리기 위해 사전 변수를 설정

 

w = 0.2 #2개 막대그래프 표시를 위한 width
nrow = df.shape[0] #행개수
idx = np.arange(nrow) #행의 갯수를 리스트화
print("df 데이터 개수(지역구 개수) : {}".format(nrow))
print(idx)

 

  위 print의 출력결과는 아래와 같다.

 

<결과>

df 데이터 개수(지역구 개수) : 25
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]

 

- 시각화 코드 작성

plt.figure(figsize = (15,5)) #시각화 그래프 사이즈
plt.bar(idx-w, df['재외국민 수'], width=w, label='재외국민 수')
plt.bar(idx+w, df['세대수'], width=w, label='세대수') 
plt.xticks(idx, df['주소(구)'],rotation=45) #x축 
plt.title('2022년 11월 서울시 재외국민 인구 및 세대수 현황')
plt.legend(loc='upper left') #범례 위치 지정
plt.xlabel('주소(구)') #x축 라벨
plt.ylabel('단위[명]') #y축 라벨

 

<결과>

 

 

  시각화 이미지를 보니 한글이 깨져보인다. 한글이 깨지는 현상을 해결하기 위해 아래 코드 상단에 추가하고 다시 실행해보자. 정상적으로 한글이 출력되는 것을 확인할 수 있다.

 

from matplotlib import rc
rc('font', family='Malgun Gothic')

 

<결과>

 

- 막대그래프 데이터 수치 표시하기

 

막대그래프 데이터 수치 표시는 matplotlib.plot의 text() 메서드를 사용해야 한다. 사용법은 간단하다.

 

※ 사용법

text(x좌표, y좌표, 표시숫자)

 

이중 막대 그래프 표시를 했기 때문에 각 막대(파랑색,주황색)마다 따로 for문을 작성해야 한다. plt.text의 좌표값에서 -0.6과 +20을 해준 이유는 좌표에서 위치를 조정해주기 위해서이다. 잘모르겠으면 그래프를 출력해보고 좌표를 적당한 곳으로 숫자를 수정하면 된다.

 

#각 막대그래프 수치 표시
y_list1 = list(df['재외국민 수'])
for i in range(0, nrow):
    plt.text(i-0.6, y_list1[i]+20, y_list1[i]) #재외국민수 각 막대 수치 표시 plt.text(x좌표,y좌표,표시숫자)
    
y_list2 = list(df['세대수'])
for i in range(0, nrow):
    plt.text(i, y_list2[i]+20, y_list2[i]) #세대수 각 막대 수치 표시 plt.text(x좌표,y좌표,표시숫자)

plt.show()

 

<결과>

막대그래프에 수치 표시

 

3. 전체 코드

###1. csv파일을 pandas를 통해 필요한 형태로 가공.
import pandas as pd

#데이터프레임 생성
df = pd.read_csv('./202111_202211_주민등록인구및세대현황_월간.csv', encoding='CP949', thousands=',')

#데이터 프레임에서 2022년 11월 자료만 읽어오도록 리스트 설정
col_list = ['행정구역', '2022년11월_재외국민 수','2022년11월_세대수']
df = df[col_list]

#column명을 아래와 같이 변경(재외국민수, 세대수)
df = df.rename(columns={'2022년11월_재외국민 수':'재외국민 수', '2022년11월_세대수':'세대수'})
print(df)
#0번째 인덱스는 서울특별시 전체 인구에 대한 내용이므로 슬라이싱을 통해 생략
df = df.iloc[1:]

#행정구역명을 분리하여 컬럼으로 재조정(빈칸 기준으로 조정)
df_split = df['행정구역'].str.split(' ') #빈칸 기준으로 분리
si = df_split.str.get(0) #서울특별시
gu = df_split.str.get(1) #각 구
code = df_split.str.get(0) #각 코드

df['주소(시)'] = si #데이터프레임 컬럼 추가
df['주소(구)'] = gu #데이터프레임 컬럼 추가
df['주소(코드)'] = code #데이터프레임 컬럼 추가
df = df.drop(columns=['행정구역']) #데이터프레임 기존 행정구역 열 삭제


### 2. matplotlib 통한 시각화
import matplotlib.pyplot as plt

import numpy as np
from matplotlib import rc
rc('font', family='Malgun Gothic')

w = 0.2 #2개 막대그래프 표시를 위한 width
nrow = df.shape[0] #행개수
idx = np.arange(nrow) #행의 갯수를 리스트화

plt.figure(figsize = (15,5)) #시각화 그래프 사이즈
plt.bar(idx-w, df['재외국민 수'], width=w, label='재외국민 수')
plt.bar(idx+w, df['세대수'], width=w, label='세대수') 
plt.xticks(idx, df['주소(구)'],rotation=45) #x축 
plt.title('2022년 11월 서울시 재외국민 인구 및 세대수 현황')
plt.legend(loc='upper left') #범례 위치 지정
plt.xlabel('주소(구)') #x축 라벨
plt.ylabel('단위[명]') #y축 라벨

#각 막대그래프 수치 표시
y_list1 = list(df['재외국민 수'])
for i in range(0, nrow):
    plt.text(i-0.6, y_list1[i]+20, y_list1[i]) #재외국민수 각 막대 수치 표시 plt.text(x좌표,y좌표,표시숫자)
    
y_list2 = list(df['세대수'])
for i in range(0, nrow):
    plt.text(i, y_list2[i]+20, y_list2[i]) #세대수 각 막대 수치 표시 plt.text(x좌표,y좌표,표시숫자)

plt.show()

 

 

참고링크 : https://tnqkrdmssjan.tistory.com/57

 

[Python] Matplotlib 다중 막대그래프

오늘은 저번 포스트에서 말씀드린 대로 다중 막대그래프를 그리는 법을 간단히 알아보겠습니다. 라이브러리 불러오기 import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rc('font', family = 'Ap

tnqkrdmssjan.tistory.com

 

728x90