2022-08-23

jm·2022년 8월 23일
0

TIL

목록 보기
10/22

어제에 이어서 행정안전부에서 데이터를 받아 인구조사 그래프를 그렸다.



📌 인구구조 다양하게 시각화하기


✅ 성별에 따른 인구분포 그래프 그리기

import csv
import matplotlib.pyplot as plt

f = open('/content/201902_201902_연령별인구현황_gender.csv')
data = csv.reader(f)

# 남성, 여성 데이터 담을 list 변수 선언
m_list = []
f_list = []
address = input('검색할 지역을 입력하세요')

for row in data:
  if address in row[0]:
    for i in row[3:104]:
      m_list.append(-int(i.replace(',','')))  # -int를 통해 남성 데이터 음수로 변환
    
    for i in row[106:]:
      f_list.append(int(i.replace(',','')))

plt.figure(dpi=200)
plt.rcParams['axes.unicode_minus'] = False
plt.title(address + '지역의 남녀 성별 인구 분포')
plt.barh(range(101), m_list, label = '남성')
plt.barh(range(101), f_list, label = '여성')
plt.legend()
plt.show()

🔽 결과


✅ 파이 차트를 통해 성별 비율 확인하기

size = []  

-> 남녀 인구 합계를 담을 리스트 변수 선언

for row in data:
  if address in row[0]:
    sum_m = 0  
    sum_f = 0
    for i in row[3:104]:
      m_list.append(-int(i.replace(',','')))
      sum_m += int(i.replace(',',''))  
    
    for i in row[106:]:
      f_list.append(int(i.replace(',','')))
      sum_f += int(i.replace(',',''))
    break
    
size.append(sum_m)
size.append(sum_f)

-> 합계 구할 변수(sum_m, sum_f)를 선언하여 합계 구하기

plt.figure(dpi=200)
color = ['crimson', 'darkcyan']
label = ['남', '여']
plt.title(address + '지역의 남녀 성별 인구 분포')
plt.pie(size, labels=label, autopct='%.2f%%', colors=color, startangle=90)
plt.legend()
plt.show()

-> 파이 차트 그리기

🔽 결과

(대전 지역을 입력한 결과)


✅ 파이 차트 더 다양하게 그려보기

plt.figure(dpi=200)

size = [1244, 2312, 1031, 1233]
label = ['A형', 'B형', 'AB형', 'O형']
color = ['darkmagenta', 'deeppink', 'hotpink', 'pink']
plt.axis('equal')
plt.pie(size, labels=label, autopct='%.2f%%', colors = color, explode=(0,0,0,0.1), shadow=True, startangle=90)
plt.legend()
plt.show()

-> 색, explode를 이용해 강조, 그림자효과, 시작각도 조절(90도로 설정)


✅ 성별에 따른 인구분포 그래프 그리기2

-> (남자 - 여자) 값을 비교하는 그래프

import csv
import matplotlib.pyplot as plt

f = open('/content/202202_202202_연령별인구현황_gender.csv')
data = csv.reader(f)

# (남성 연령 데이터 - 여성 데이터) 를 담을 list 변수 선언
result = []

address = input('검색할 지역을 입력하세요')

for row in data:
  if address in row[0]:
    for i in range(3, 104):
      result.append(int(row[i].replace(',', '')) - int(row[i+103].replace(',', '')))
    break

# 시각화
plt.figure(dpi=200)
plt.rcParams['axes.unicode_minus'] = False
plt.title(address + '지역의 남녀 인구수')
plt.bar(range(101), result)
#plt.legend()
plt.show()

🔽 결과

📌 pandas 라이브러리



✅ 사용자가 입력한 지역과 인구구조가 유사한 지역 찾기

# 1) 데이터 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('/content/age_2019.csv', encoding = 'utf-8')
# df.head() -> 데이터 앞에서 다섯개 확인df.tail -> 뒤에서 다섯개 확인, df.info() -> 데이터 정보 확인

# 2) 데이터 전처리
# 2-1) 행정코드 삭제
names_split = df['행정구역'].str.split('(')
df['행정구역'] = names_split.str.get(0)  # get(0) -> 첫번째 인덱스에 있는 것을 가져오는 것

# 2-2) 컬럼명 변경(행정구역 제외)
columns_list = df.columns

final_col = {}
for col in columns_list[1:]:  # 행정구역 제외하고 실행
  final_col[col] = col.split('_')[2]

df.rename(columns=final_col, inplace=True)

# 2-3) 콤마(,) 제거 후 숫자 형태로 변환
df.replace('[^\w]', '', regex=True, inplace=True)  # 정규식을 사용한 모든 컬럼의 특수기호 제거

# 2-4) 인덱스 변경(0,1,... -> 서울특별시, 서울특별시 종로구,...)
df.set_index(keys=['행정구역'], inplace=True)

# 2-5) 데이터 형변환
df = df.astype('int')

# 3) 데이터
# 3-1) (각각의 데이터) / (총 인구수) -> 비율 계산
df = df.div(df['총인구수'], axis=0)  # 전체 데이터를 총 인구수로 나워서 비율로 변환, axis는 축(0은 행, 1은 열)

# 3-2) 총인구수와 연령구간인구수 데이터 삭제
del df['총인구수'], df['연령구간인구수']

# 정제된 파일 저장
# df.to_csv('2019_인구구조_정제데이터.csv', encoding='utf-8-sig')

# 4) 사용자에게 지역을 입력받고 그 값을 저장
address = input('인구구조가 알고 싶은 지역의 주소(읍면동 단위)를 입력해주세요: ')  # 지역 이름 넣기

a = df.index.str.contains(address)  # 해당 지역의 인덱스 찾기
df2 = df[a]  # 인구구조 저장

# 5) 사용자가 선택한 인구구조와 가까운 데이터 찾기 
df.sub(df2.iloc[0], axis=1)  # df.sub -> 뺄셈, df.iloc[0] -> 숫자형(int), df.loc[] -> 인덱스명을 적어야 함
np.power(df.sub(df2.iloc[0], axis=1),2).sum(axis=1).sort_values().index[1:6]  # 자기 자신은 빼고, power은 제곱

# ) 시각화
plt.style.use('ggplot')
df.loc[np.power(df.sub(df2.iloc[0], axis=1),2).sum(axis=1).sort_values().index[1:6]].T.plot()
plt.show()

🔽 결과

(잠실2동을 입력한 결과)

1개의 댓글

comment-user-thumbnail
2022년 8월 25일

Pandas 라이브러리를 활용해서 코드 하나로 정리한 것 깔끔하네요 ㅎㅎ

답글 달기