Blair  - Soul Eater [파이썬 예제] Pandas 9- DataFrame 인구 통계 데이터 파일 분석,시각화

• programming language/python

[파이썬 예제] Pandas 9- DataFrame 인구 통계 데이터 파일 분석,시각화

oujin 2022. 8. 1. 16:16
728x90

행정안전부에서 제공하는 국 내 주민등록 인구 통계 데이터(2020년 2월 기준)를 분석하기

 

CSV예제 파일을 다운받아 주세요

**입력하는 코드가 있는 파일과 같은 폴더에 위치해 있어야 합니다**

 

population_2020.csv
0.00MB

 

 

population.py
0.00MB

 

 

 

 csv파일을 리스트로 저장하기

 

import population as pop
#population.py는 csv파일을 읽어들여 리스트에 저장하는 모듈입니다


list_data = []

pop.get_list(list_data)

# pop모듈의 get_list()함수의 매개변수에 list_data를 전달하여  CSV 파일을 읽어 들여 리스트 list_data에 저장


print(list_data)

[['서울특별시  (1100000000)', '부산광역시  (2600000000)', '대구광역시  (2700000000)', '인천광역시  (2800000000)', '광주광역시  (2900000000)', '대전광역시  (3000000000)', '울산광역시  (3100000000)', '세종특별자치시  (3600000000)', '경기도  (4100000000)', '강원도  (4200000000)', '충청북도  (4300000000)', '충청남도  (4400000000)', '전라북도  (4500000000)', '전라남도  (4600000000)', '경상북도  (4700000000)', '경상남도  (4800000000)', '제주특별자치도  (5000000000)'], ['9,736,962', '3,410,925', '2,432,883', '2,954,955', '1,456,121', '1,473,125', '1,145,710', '343,788', '13,265,377', '1,539,521', '1,598,599', '2,120,995', '1,815,112', '1,861,894', '2,658,956', '3,358,828', '670,876'], ['4,345,877', '1,502,333', '1,033,349', '1,242,107', '618,503', '637,726', '469,551', '136,629', '5,497,087', '721,003', '723,931', '961,890', '818,452', '873,871', '1,229,265', '1,455,655', '293,932'], ['      2.24', '      2.27', '      2.35', '      2.38', '      2.35', '      2.31', '      2.44', '      2.52', '      2.41', '      2.14', '      2.21', '      2.21', '      2.22', '      2.13', '      2.16', '      2.31', '      2.28'], ['4,745,133', '1,673,266', '1,202,364', '1,481,133', '720,686', '735,791', '588,626', '171,403', '6,672,706', '774,358', '809,805', '1,081,153', '902,365', '934,900', '1,338,907', '1,690,600', '337,295'], ['4,991,829', '1,737,659', '1,230,519', '1,473,822', '735,435', '737,334', '557,084', '172,385', '6,592,671', '765,163', '788,794', '1,039,842', '912,747', '926,994', '1,320,049', '1,668,228', '333,581'], ['      0.95', '      0.96', '      0.98', '      1.00', '      0.98', '      1.00', '      1.06', '      0.99', '      1.01', '      1.01', '      1.03', '      1.04', '      0.99', '      1.01', '      1.01', '      1.01', '      1.01']]

 

 

 


 csv 파일을 딕셔너리로 저장하기

 

import population as pop

list_data = []

# CSV 파일을 읽어 들여 리스트 list_data에 저장
pop.get_list(list_data)         

dict_data = {}

keys = ['지역', '총인구수', '세대수', '세대당_인구', '남자_인구수', '여자_인구수', '남여_비율']
# 딕셔너리 dict_data를 위한 키 설정


pop.get_dict(list_data,keys,dict_data)          
# pop모듈의 get_dict()함수를 이용해 리스트 list_data와 딕셔너리의 키 keys를 딕셔너리 dict_data에 저장


print(dict_data)

{'지역': ['서울특별시', '부산광역시', '대구광역시', '인천광역시', '광주광역시', '대전광역시', '울산광역시', '세종특별자치시', '경기도', '강원도', '충청북도', '충청남도', '전라북도', '전라남도', '경상북도', '경상남도', '제주특별자치도'], '총인구수': [9736962, 3410925, 2432883, 2954955, 1456121, 1473125, 1145710, 343788, 13265377, 1539521, 1598599, 2120995, 1815112, 1861894, 2658956, 3358828, 670876], '세대수': [4345877, 1502333, 1033349, 1242107, 618503, 637726, 469551, 136629, 5497087, 721003, 723931, 961890, 818452, 873871, 1229265, 1455655, 293932], '세대당_인구': [2.24, 2.27, 2.35, 2.38, 2.35, 2.31, 2.44, 2.52, 2.41, 2.14, 2.21, 2.21, 2.22, 2.13, 2.16, 2.31, 2.28], '남자_인구수': [4745133, 1673266, 1202364, 1481133, 720686, 735791, 588626, 171403, 6672706, 774358, 809805, 1081153, 902365, 934900, 1338907, 1690600, 337295], '여자_인구수': [4991829, 1737659, 1230519, 1473822, 735435, 737334, 557084, 172385, 6592671, 765163, 788794, 1039842, 912747, 926994, 1320049, 1668228, 333581], '남여_비율': [0.95, 0.96, 0.98, 1.0, 0.98, 1.0, 1.06, 0.99, 1.01, 1.01, 1.03, 1.04, 0.99, 1.01, 1.01, 1.01, 1.01]}

 

 

 


 csv파일의 데이터를 리스트와 딕셔너리로 데이터프레임 만들기

 

import population as pop
import pandas as pd

list_data = []

pop.get_list(list_data)         
# CSV 파일을 읽어 들여 리스트 list_data에 저장

dict_data = {}

keys = ['지역', '총인구수', '세대수', '세대당_인구', '남자_인구수', '여자_인구수', '남여_비율']
# 딕셔너리 dict_data를 위한  설정


pop.get_dict(list_data, keys, dict_data)         

# 리스트 list_data와 딕셔너리의 키 keys를 딕셔너리 dict_data에 저장
     

frame = pd.DataFrame(dict_data)

# 딕셔너리 dict_data를 이용하여 데이터프레임 객체 frame 생성

print(frame)

 

         지역      총인구수      세대수  세대당_인구   남자_인구수   여자_인구수  남여_비율
0     서울특별시   9736962  4345877    2.24  4745133  4991829   0.95
1     부산광역시   3410925  1502333    2.27  1673266  1737659   0.96
2     대구광역시   2432883  1033349    2.35  1202364  1230519   0.98
3     인천광역시   2954955  1242107    2.38  1481133  1473822   1.00
4     광주광역시   1456121   618503    2.35   720686   735435   0.98
5     대전광역시   1473125   637726    2.31   735791   737334   1.00
6     울산광역시   1145710   469551    2.44   588626   557084   1.06
7   세종특별자치시    343788   136629    2.52   171403   172385   0.99
8       경기도  13265377  5497087    2.41  6672706  6592671   1.01
9       강원도   1539521   721003    2.14   774358   765163   1.01
10     충청북도   1598599   723931    2.21   809805   788794   1.03
11     충청남도   2120995   961890    2.21  1081153  1039842   1.04
12     전라북도   1815112   818452    2.22   902365   912747   0.99
13     전라남도   1861894   873871    2.13   934900   926994   1.01
14     경상북도   2658956  1229265    2.16  1338907  1320049   1.01
15     경상남도   3358828  1455655    2.31  1690600  1668228   1.01
16  제주특별자치도    670876   293932    2.28   337295   333581   1.01

 

 

 


▶ 총 인구 순으로 정렬하기

 

●DataFrame 객체의 sort_values() 메소드의 사용 형식 :

데이터프레임명.sort_values(by=[열_이름1, 열_이름2, ...], decending = False)

#DataFrame sort_values() 메소드는 열_이름1, 열 이름2, ... 열을 기준으로 내림차순으로 행 데이터를 정렬

#decending=True 로 설정하면 오름차순으로 데이터가 정 렬

 

 

 

●DataFrame 객체의 reset_index() 메소드의 사용 형식 :

데이터프레임명.reset_index(drop=True)

#DataFrame reset_index(drop=True) 메소드는 해당 객체의 행 인덱스 번호를 0부터 시작하는 일련번호로 재정렬

 

 

 

import population as pop
import pandas as pd

list_data = []

pop.get_list(list_data)         
# CSV 파일을 읽어 들여 리스트 list_data에 저장

dict_data = {}

keys = ['지역', '총인구수', '세대수', '세대당_인구', '남자_인구수', '여자_인구수', '남여_비율']
# 딕셔너리 dict_data를 위한  설정

pop.get_dict(list_data, keys, dict_data)              
# 리스트 list_data와 딕셔너리의 키 keys를 딕셔너리 dict_data에 저장

frame = pd.DataFrame(dict_data)
# 딕셔너리 dict_data를 이용하여 데이터프레임 객체 frame 생성

rank = frame.sort_values(by=['총인구수'],ascending=False)

#열의 인덱스 '총인구수'를 기준으로 내림차순 정렬
print(rank)

rank = rank.reset_index(drop=True)

#rank 객체의 인덱스를 0으로 시작하는 일련번호로 재정렬
print(rank)

 

         지역      총인구수      세대수  세대당_인구   남자_인구수   여자_인구수  남여_비율
8       경기도  13265377  5497087    2.41  6672706  6592671   1.01
0     서울특별시   9736962  4345877    2.24  4745133  4991829   0.95
1     부산광역시   3410925  1502333    2.27  1673266  1737659   0.96
15     경상남도   3358828  1455655    2.31  1690600  1668228   1.01
3     인천광역시   2954955  1242107    2.38  1481133  1473822   1.00
14     경상북도   2658956  1229265    2.16  1338907  1320049   1.01
2     대구광역시   2432883  1033349    2.35  1202364  1230519   0.98
11     충청남도   2120995   961890    2.21  1081153  1039842   1.04
13     전라남도   1861894   873871    2.13   934900   926994   1.01
12     전라북도   1815112   818452    2.22   902365   912747   0.99
10     충청북도   1598599   723931    2.21   809805   788794   1.03
9       강원도   1539521   721003    2.14   774358   765163   1.01
5     대전광역시   1473125   637726    2.31   735791   737334   1.00
4     광주광역시   1456121   618503    2.35   720686   735435   0.98
6     울산광역시   1145710   469551    2.44   588626   557084   1.06
16  제주특별자치도    670876   293932    2.28   337295   333581   1.01
7   세종특별자치시    343788   136629    2.52   171403   172385   0.99
         지역      총인구수      세대수  세대당_인구   남자_인구수   여자_인구수  남여_비율
0       경기도  13265377  5497087    2.41  6672706  6592671   1.01
1     서울특별시   9736962  4345877    2.24  4745133  4991829   0.95
2     부산광역시   3410925  1502333    2.27  1673266  1737659   0.96
3      경상남도   3358828  1455655    2.31  1690600  1668228   1.01
4     인천광역시   2954955  1242107    2.38  1481133  1473822   1.00
5      경상북도   2658956  1229265    2.16  1338907  1320049   1.01
6     대구광역시   2432883  1033349    2.35  1202364  1230519   0.98
7      충청남도   2120995   961890    2.21  1081153  1039842   1.04
8      전라남도   1861894   873871    2.13   934900   926994   1.01
9      전라북도   1815112   818452    2.22   902365   912747   0.99
10     충청북도   1598599   723931    2.21   809805   788794   1.03
11      강원도   1539521   721003    2.14   774358   765163   1.01
12    대전광역시   1473125   637726    2.31   735791   737334   1.00
13    광주광역시   1456121   618503    2.35   720686   735435   0.98
14    울산광역시   1145710   469551    2.44   588626   557084   1.06
15  제주특별자치도    670876   293932    2.28   337295   333581   1.01
16  세종특별자치시    343788   136629    2.52   171403   172385   0.99

 

 

 


▶국내 전체 인구수, 세대수, 남여 인구수 구하기

import population as pop
import pandas as pd

list_data = []

pop.get_list(list_data)         
# CSV 파일을 읽어 들여 리스트 list_data에 저장

dict_data = {}

keys = ['지역', '총인구수', '세대수', '세대당_인구', '남자_인구수', '여자_인구수', '남여_비율']
# 딕셔너리 dict_data를 위한 키 설정

pop.get_dict(list_data, keys, dict_data)              
# 리스트 list_data와 딕셔너리의 키 keys를 딕셔너리 dict_data에 저장

frame = pd.DataFrame(dict_data)
frame2 = frame.iloc[:,[1,2,4,5]]

#Dataframe의 iloc()메소드를 이용하여, frame의 모든 행 인덱스에 대해 열 인덱스 1, 2, 4, 5, 즉 '총 인구수', '세대수', '남자_인구수', '여자_인구수'에 해당되는 열의 데이터를 추출하여 frame2에 저장


print(frame2)

sum = frame2.sum(axis=0)
# sum() 메소드로 열 방향으로 합계를 구함

print(sum)

print('-' * 50)
print('국내 전체 인구 통계')
print('-' * 50)
print('- 총 인구수 : %d명' % sum.iloc[0])
print('- 총 세대수 : %d명' % sum.iloc[1])
print('- 총 남자 인구수 : %d명' % sum.iloc[2])
print('- 총 여자 인구수 : %d명' % sum.iloc[3])
print('-' * 50)

 

 

 


▶인구 통계 데이터 시각화 하기

import population as pop
import pandas as pd
from matplotlib import rc
rc('font', family='Malgun Gothic')

list_data = []

pop.get_list(list_data)         
# CSV 파일을 읽어 들여 리스트 list_data에 저장

keys = ['지역', '총인구수', '세대수', '세대당_인구', '남자_인구수', '여자_인구수', '남여_비율']
# 딕셔너리 dict_data를 위한 키 설정

dict_data = {}

pop.get_dict(list_data, keys, dict_data)              
# 리스트 list_data와 딕셔너리의 키 keys를 딕셔너리 dict_data에 저장

frame = pd.DataFrame(dict_data)
index = ['서울', '부산', '대구', '인천', '광주', '대전']

#축의 레이블로 사용될 리스트 ['서울', '부산', '대구', '인천', ' 광주', '대전']을 index에 저장

x1 = frame.iloc[:6, 1]

#frame 객체에서 행 인덱스가 0~5인 서울, 부산, 대구, 인천, 광주, 대전에 대해 열 인덱스1, 즉 ‘총인구수’열 데이터를 x1 에 저장

x1 = x1.values.tolist()
#x1 객체의 요소들을 리스트로 변환하여 다시 x1에 저장

#x1 객체는 서울, 부산, 대구, …. 대전에 대응되는 총인구수의 리스트 데이터를 의미


x2 = frame.iloc[:6, 2]

#frame 객체에서 행 인덱스가 0~5인 서울, 부산, 대구, 인천, 광주, 대전에 대해 열 인덱스1, 즉 ‘총세대수’열 데이터를 x1 에 저장
x2 = x2.values.tolist()
#x2 객체의 요소들을 리스트로 변환하여 다시 x2에 저장

#x2 객체는 서울, 부산, 대구, …. 대전에 대응되는 총세대수의 리스트 데이터를 의미


df = pd.DataFrame({'총인구수':x1, '총세대수':x2}, index=index)

print(df)
ax = df.plot.bar(rot=0)

 

       총인구수     총세대수
서울  9736962  4345877
부산  3410925  1502333
대구  2432883  1033349
인천  2954955  1242107
광주  1456121   618503
대전  1473125   637726

 

 

 

 

 

 

 

 

 

출처: 예제 중심 파이썬 입문

궁금한 부분이 있으면 댓글 부탁드립니다^^

728x90