행정안전부(mois.go.kr)에서는 주민등록 인구 통계 자료를 자유롭게 일반인들이 사용가능하도록 공유하고 있다.
파이썬 pandas 및 matplotlib 시각화 코드 작성에 익숙해지기 위해 아래와 같이 과제 진행 및 과정을 기록한다.
주제 : 과거 1년간 서울지역 재외국민 통계자료를 활용하여 2022년 11월 기준 재외국민수, 세대수 시각화해보기
1. 통계자료 검색 및 다운
1) 검색 조건 설정
먼저 실제 받아 볼 통계자료 조건을 선택한다. .csv 파일이나 .xlsx을 선택하여 다운받을 수 있다. 이번에는 csv 파일로 다운로드 진행하여 처리해볼 것이다.
불필요한 데이터를 제거하기 위해 구분의 남여구분/남여구성비/세대당인구는 체크 해제했다.

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

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
'코딩 > 데이터분석' 카테고리의 다른 글
[Python/데이터분석]iris 데이터셋 K-means 알고리즘 적용 및 결과 해석 (1) | 2023.10.29 |
---|---|
[Python/파이썬] matplotlib 2편 : 그래프 시각화 y축 숫자가 섞여서 나오는 문제 해결 (0) | 2022.11.10 |
[Python/파이썬] 필요한 부분만 정리하는 matplotlib 1편 (0) | 2021.08.15 |
[Python/파이썬] Numpy 기초 2편 : numpy의 여러가지 연산 (1) | 2021.06.30 |
[Python/파이썬] Numpy 기초 1편 : Array 생성 및 인덱싱,슬라이싱 (0) | 2021.06.29 |