대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업
[ABC 220831 - 12일차] PANDAS를 활용한 인구 구조 분석
갓생사는 공순이가 되고싶은 콩순이
2022. 9. 2. 00:58
반응형
PANDAS를 활용한 인구 구조 분석하기
한글 깨짐 방지 코드
import matplotlib as mpl
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()
데이터 읽어오기
import pandas as pd
df = pd.read_csv('/content/201907_201907_연령별인구현황_월간.csv', encoding='euc-kr')
df.head()
df.info()
데이터 전처리(정제)
- 1) 행정구역 컬럼의 행정 코드를 삭제하고 주소 데이터만 사용
ex) 서울특별시 종로구 청운효자동(1111051500) → 서울특별시 종로구 청운효자동
df['행정구역'] = df['행정구역'].str.split('(').str.get(0)
df.head()
- 2) 행정구역을 제외한 컬럼명을 변경
ex) 2019년07월_계_총인구수 -> 총인구수, 2019년07월_계_0세 -> 0세 {'2019년07월_계_0세':'0세'}
columns_list = df.columns # 컬럼 이름이 담긴 list
final_col = {} # {'2019년07월_계_0세':'0세'} 딕셔너리
# 행정구역을 제외하고 실행
for col in columns_list[1:] :
final_col[col] = col.split('_')[2]
# 컬럼명 변경
df.rename(columns=final_col, inplace = True)
df.head()
- 3) 데이터에 콤마(,)를 제거하고 숫자형태로 변환
ex) 9,751,415 → 9751415 → int형으로 변환.
df.replace(',','',inplace=True)
: 위의 코드는 just 콤마(,)만 처리하는 replace구문이다.
특수 기호를 모두 제거하는 정규식으로 replace를 사용한다 → 모든 특수기호를 처리하는 방법 → 정규식(regular expression)
df.replace('[^\w]', '', regex=True, inplace=True)
df.head()
- 4) 인덱스 변경 0, 1, 2 → 서울특별시, 서울특별시 종로구 ... → 행정구역을 인덱스로 사용
df.set_index(keys=['행정구역'], inplace = True)
- 5) 형 변환
df = df.astype('int')
- 6) 전체 데이터를 총 인구수로 나눠서 비율을 계산
df = df.div(df['총인구수'], axis=0)
- 7) 총 인구수, 연령구간 인구수 컬럼 삭제
del df['총인구수'], df['연령구간인구수']
- 8) 전처리(정제)한 파일 저장
df.to_csv('201907_인구구조_전처리데이터.csv', encoding='utf-8-sig')
궁금한 지역의 이름을 받고 해당 인구구조 저장하기
adress = input('인구구조가 알고 싶은 지역의 주소(읍면동 단위)를 입력해주세요 : ')
cons = df.index.str.contains(adress) # 해당 지역의 인덱스 찾기 -> in 포함되어 있는 것을 모두 가져옴
df2 = df[cons] # 인구구조 저장
df2.head()
사용자가 선택한 지역 인구구조 시각화
import matplotlib.pyplot as plt
plt.style.use('ggplot')
df2.T.plot()
plt.show()
사용자가 선택한 인구구조와 비슷한 인구구조 찾기
import numpy as np
# 전체데이터 - 잠실2동 빼기 -> 제곱시키기(모두 양수로 변환) ->총 합계(sum()) -> top 5를 뽑을건데 자기 자신은 제외하고 뽑는다
top_5 = np.power(df.sub(df2.iloc[0], axis=1), 2).sum(axis=1).sort_values().index[1:6]
사용자가 선택한 인구구조와 비슷한 5곳 인구구조 시각화
df.loc[top_5].T.plot()
plt.show()
2022년 07월 공공 인구데이터를 활용한 인구 구조 분석 (우리동네랑 비슷한곳 찾기) 한셀로 만들기, 캡쳐 두번 해서 하나의 그림으로 만들자
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 1) 데이터 읽어오기
df1 = pd.read_csv('/content/202207_202207_연령별인구현황_월간.csv', encoding='euc-kr')
# 2) 데이터 전처리(정제)
# 2-1) 행정구역 컬럼의 행정코드를 삭제하고 주소 데이터만 사용
names_split = df1['행정구역'].str.split('(')
df1['행정구역'] = names_split.str.get(0)
# 2-2) 행정구역을 제외한 컬럼명 변경
columns_list = df1.columns
final_col = {}
for col in columns_list[1:] : # 행정구역 열은 제외하고 실행
final_col[col] = col.split('_')[2]
# 2-3) 컬럼명 변경
df1.rename(columns=final_col, inplace=True)
# 2-4) 숫자 데이터에 콤마(,) 없애기
df1.replace('[^\w]', '', regex=True, inplace=True)
# 2-5) index 변경
df1.set_index(keys = ['행정구역'], inplace = True)
# 2-6) 자료형 int로 변환
df1 = df1.astype('int')
# 2-7) Nan 데이터삭제
df1.dropna(inplace=True)
df1 = df1.loc[(df1!=0).any(axis=1)]
# 2-8) 전체 데이터를 총인구수로 나눠서 비율을 계산
df1 = df1.div(df1['총인구수'], axis=0)
# 2-9) 총인구수, 연령구간인구수 삭제
del df1['총인구수'], df1['연령구간인구수']
# 3) 궁금한 지역 이름 받고 인구구조 데이터 저장하기
adr = input('인구구조가 알고 싶은 지역의 주소(읍면동 단위)를 입력하세요 : ')
cons = df1.index.str.contains(adr)
df3 = df1[cons]
# 4) 우리동네와 비슷한 인구구조 시각화
plt.style.use('ggplot')
df3.T.plot()
top5 = np.power(df1.sub(df3.iloc[0], axis=1), 2).sum(axis=1).sort_values().index[1:6]
df1.loc[top5].T.plot()
plt.show()
LIST