파이썬 함수

파이썬 프로젝트(1) 인구조사 차트 그려보기

개발연습자1 2022. 11. 29. 10:15

지금까지 배운 파이썬 함수들을 이용하여 인구조사 데이터를 차트로 그려보자

 

먼저 한글 데이터를 다루기 위해 다음과 같은 구문을 쓴다.

# 한글 찍기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

%matplotlib inline

import platform

from matplotlib import font_manager, rc
plt.rcParams['axes.unicode_minus'] = False

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

 

데이터를 받아오려면 행정안전부 홈페이지에서 정책 자료에 주인등록 인구통계에 가보면 csv 파일을 다운 받을 수 있다.

이 csv데이터를 불러서 작업을 한다. (본인의 파이썬 연습폴더에 저장하고 불러드린다.)

 

우선 데이터를 불러온다.

df=pd.read_csv('../data/age.csv',encoding='cp949')
df

 

그럼 데이터가 엄청 나오는데(뒤가 짤릴정도로 많다)  이 데이터를 그냥 쓰는것이 아니라 쉼표 단위를 잘라야 한다.

쉼표 단위가 있다면 문자열 데이터로 인식하기 때문이다. 쉼표 단위를 자르는 방법은 코드를 이용한다.

 

# 천딘위마다 컴마가 있으면 thousands로 뺀다.

df = pd.read_csv('../data/age.csv',encoding='cp949',thousands=',')

 

그럼 이렇게 데이터 전체에 쉼표가 없어진걸 알 수 있다. 

 

 

1. 첫번째 '삼청동' 의 인구 구조를, 0세부터 100세 까지 나이대 별로 몇명이 있는지 시각화 하세요. 문제를 풀어보자

 

우선 삼청동 컬럼에서 0세부터 100세까지의 나이대 데이터를 가져와야한다.

#삼청동에서 0세부터~끝까지

df2 = df.loc[df['행정구역'].str.contains("삼청동"),"2019년07월_계_0세": ].values
df2
>>> array([[ 7,  9, 13, 12, 11, 11,  9, 11, 20, 18, 18, 23, 23, 19, 17, 16,
            20, 25, 25, 27, 22, 35, 34, 29, 42, 38, 38, 32, 31, 36, 53, 32,
            29, 42, 45, 29, 45, 50, 45, 52, 43, 36, 34, 29, 35, 33, 41, 37,
            46, 48, 44, 47, 33, 46, 41, 40, 44, 57, 47, 49, 52, 45, 45, 44,
            49, 35, 40, 37, 18, 28, 34, 40, 29, 24, 27, 25, 27, 36, 24, 27,
            17, 18, 16, 19, 16, 12, 14, 10, 11,  9,  1,  6,  6,  2,  3,  1,
            1,  2,  1,  1,  7]], dtype=int64)

 

그래프의 인덱스값을 표시할 넘파이 데이터를 만든다.

 

#x에 넘파이 데이터 저장

x = np.arange(0,100+1)
x

>>> array([  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,  25,
            26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36,  37,  38,
            39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
            52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
            65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
            78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
            91,  92,  93,  94,  95,  96,  97,  98,  99, 100])

 

두데이터의 차원이 맞지 않으면 안되기 때문에 차원을 확인한다.  

#x 데이터 차원확인

x.ndim
>>>1

#df2(심청동)데이터 차원확인

df2.ndim
>>>2

#서로 맞지 않기 때문에 df2를 reshape로 1차원으로 맞춘다.
df2=df2.reshape(101,)
df2

df2.ndim
>>>1

  

이제 차트를 그려보자

 

#x값 y값이 차원이 맞아야 해결된다.

plt.plot(x,df2)
plt.show()

 위처럼 결과가 나올 수 있다.

 

두번째 각 구를 입력하면 그 구의 인구 구조를, 만0세, 15, 25, 35, 45세 까지 5개 영역의 파이차트로, 각 인구수를 시각화 하세요를 풀어보자

 

아까 그 데이터를 활용하면 코드를 간단히 짤수 있다.

 

#입력 함수 input
name = input("구를 입력하세요:") 

#데이터에서 0,15,25,35,45까지만 가져와라
df5 = df.loc[df['행정구역'].str.contains(name), ] 
df6=df5.iloc[0,[3,15+3,25+3,35+3,45+3] ]
df6

#파이차트 그리기
plt.pie(df6, labels=df6.index, autopct='%.1f',startangle= 90 , 
       wedgeprops= {'width':0.7})

#입력을 받으면 구이름+제목 생성
plt.title(name+"인구 구조")

plt.show()

종로구를 입력받으면 이렇게 파이차트가 나온다.

반응형