반응형
데이터 조작(Pandas)
- Pandas 라이브러리 활용 실습
Pandas 활용 실습
행정안전부 연령별 인구현황 자료 분석
- 데이터 내려 받기
- 행정 안전부(https://www.mois.go.kr)사이트 내 정책자료 메뉴 선택 후 통계 카테고리 내 '주민등록인구 통계' 클릭
(바로가기- https://jumin.mois.go.kr/index.jsp) - 왼쪽 주민등록 인구통계 메뉴에서 '연령별 인구현황'을 선택하고 아래의 그림과 같이 설정 후 검색 버튼 누른 뒤, CSV 파일 다운로드
- 다운로드 받은 CSV파일을 Excel을 통해 열어서 확인 후, 전체 선택(Ctrl+A) 후 숫자로 변경
- 이후 파일 이름을 age.csv로 변환 후 저장
- age.csv를 Jupyter Notebook에 업로드
- 행정 안전부(https://www.mois.go.kr)사이트 내 정책자료 메뉴 선택 후 통계 카테고리 내 '주민등록인구 통계' 클릭
- 데이터 읽어오기
- read_csv() 함수를 활용하여 DataFrame으로 저장
- 인코딩 방식 작성, 윈도우에서 만든 CSV파일의 경우 한글 깨짐 문제로 인해 'cp949'로 설정
-
import pandas as pd df= pd.read_csv('age.csv', encoding='cp949', index_col=0) df.head ''' 출력 결과 2022년08월_계_총인구수 2022년08월_계_연령구간인구수 2022년08월_계_0세 2022년08월_계_1세 2022년08월_계_2세 2022년08월_계_3세 2022년08월_계_4세 2022년08월_계_5세 2022년08월_계_6세 2022년08월_계_7세 ... 2022년08월_계_91세 2022년08월_계_92세 2022년08월_계_93세 2022년08월_계_94세 2022년08월_계_95세 2022년08월_계_96세 2022년08월_계_97세 2022년08월_계_98세 2022년08월_계_99세 2022년08월_계_100세 이상 행정구역 서울특별시 (1100000000) 9488454 9488454 40931 44731 45511 49245 52278 57054 64993 67389 ... 7820 6636 5631 4113 2990 1896 1333 1013 950 1706 서울특별시 종로구 (1111000000) 143499 143499 444 484 530 545 580 656 821 781 ... 178 141 122 90 75 47 32 22 23 43 서울특별시 종로구 청운효자동(1111051500) 11766 11766 48 46 48 52 52 80 86 88 ... 15 7 7 5 6 4 3 3 1 3 서울특별시 종로구 사직동(1111053000) 9278 9278 34 30 36 43 45 63 69 69 ... 16 9 18 5 6 8 5 2 4 1 서울특별시 종로구 삼청동(1111054000) 2384 2384 4 7 5 5 13 8 12 13 ... 3 7 1 3 2 1 1 1 0 4 5 rows × 103 columns '''
- 데이터 전처리
- 컬럼 이름 수정(공통된 " 2021년08월_계_"를 삭제)
- replace함수 사용
-
import pandas as pd df= pd.read_csv('age.csv', encoding='cp949', index_col=0) df.columns= df.columns.str.replace('2021년08월_계_','') df.head() ''' 출력 결과 2022년08월_계_총인구수 2022년08월_계_연령구간인구수 2022년08월_계_0세 2022년08월_계_1세 2022년08월_계_2세 2022년08월_계_3세 2022년08월_계_4세 2022년08월_계_5세 2022년08월_계_6세 2022년08월_계_7세 ... 2022년08월_계_91세 2022년08월_계_92세 2022년08월_계_93세 2022년08월_계_94세 2022년08월_계_95세 2022년08월_계_96세 2022년08월_계_97세 2022년08월_계_98세 2022년08월_계_99세 2022년08월_계_100세 이상 행정구역 서울특별시 (1100000000) 9488454 9488454 40931 44731 45511 49245 52278 57054 64993 67389 ... 7820 6636 5631 4113 2990 1896 1333 1013 950 1706 서울특별시 종로구 (1111000000) 143499 143499 444 484 530 545 580 656 821 781 ... 178 141 122 90 75 47 32 22 23 43 서울특별시 종로구 청운효자동(1111051500) 11766 11766 48 46 48 52 52 80 86 88 ... 15 7 7 5 6 4 3 3 1 3 서울특별시 종로구 사직동(1111053000) 9278 9278 34 30 36 43 45 63 69 69 ... 16 9 18 5 6 8 5 2 4 1 서울특별시 종로구 삼청동(1111054000) 2384 2384 4 7 5 5 13 8 12 13 ... 3 7 1 3 2 1 1 1 0 4 5 rows × 103 columns '''
- 총 인구수의 정렬(sort_values())을 통해 결측치(0인 값) 검색
- drop()함수를 통해 총인구수가 0인 행을 삭제
-
import pandas as pd df= pd.read_csv('age.csv', encoding= 'cp949', index_col= 0) df.columns= df.columns.str.replace('2022년08월_계_',"") df= df.sort_values('총인구수') df.drop(df.loc[df['총인구수']== 0].index, inplace= True) df ''' 출력 결과 총인구수 연령구간인구수 0세 1세 2세 3세 4세 5세 6세 7세 ... 91세 92세 93세 94세 95세 96세 97세 98세 99세 100세 이상 행정구역 강원도 철원군 근북면(4278033000) 104 104 0 0 0 0 0 0 0 0 ... 1 0 0 0 0 0 0 0 0 0 서울특별시 강동구 둔촌제1동(1174069000) 131 131 0 0 0 0 0 0 0 1 ... 1 0 0 1 0 1 0 0 1 1 경기도 광명시 광명1동(4121051000) 141 141 0 0 0 0 0 0 0 0 ... 0 1 0 1 0 0 0 0 0 0 경기도 연천군 중면(4180037000) 186 186 0 0 0 0 1 0 0 2 ... 1 0 1 0 0 0 0 0 0 0 전라남도 신안군 흑산면태도출장소(4691036600) 188 188 0 2 0 2 2 1 1 0 ... 2 0 0 0 0 0 0 0 0 0 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 인천광역시 (2800000000) 2963117 2963117 14468 15688 17005 18963 19923 22144 24886 26204 ... 2512 2070 1734 1230 968 570 479 274 292 433 경상남도 (4800000000) 3290991 3290991 13807 16055 17748 19763 22372 25329 29012 30262 ... 3941 3075 2435 1699 1198 781 533 314 287 394 부산광역시 (2600000000) 3331444 3331444 13658 15036 16198 17852 20364 22513 25675 26473 ... 3038 2346 2062 1574 1052 637 472 305 276 435 서울특별시 (1100000000) 9488454 9488454 40931 44731 45511 49245 52278 57054 64993 67389 ... 7820 6636 5631 4113 2990 1896 1333 1013 950 1706 경기도 (4100000000) 13590056 13590056 73111 80275 85000 93054 100842 111122 125301 130333 ... 10585 9087 7302 5462 3809 2468 1808 1256 1175 1889 3851 rows × 103 columns '''
- 연령별 인구 숫자를 비율로 변경, 총인구수와 연령구간 인구 수 데이터(컬럼) 삭제
- 데이터프레임 내부의 값을 총인구수로 나눔(div() 함수 사용)
- del 명령어를 통해 데이터프레임 내부 컬럼 삭제
-
df= df.div(df['총인구수'], axis= 0) del df['총인구수'], df['연령구간인구수'] df.head() ''' 출력 결과 0세 1세 2세 3세 4세 5세 6세 7세 8세 9세 ... 91세 92세 93세 94세 95세 96세 97세 98세 99세 100세 이상 행정구역 서울특별시 (1100000000) 0.004314 0.004714 0.004796 0.005190 0.005510 0.006013 0.006850 0.007102 0.007004 0.007349 ... 0.000824 0.000699 0.000593 0.000433 0.000315 0.000200 0.000140 0.000107 0.000100 0.000180 서울특별시 종로구 (1111000000) 0.003094 0.003373 0.003693 0.003798 0.004042 0.004571 0.005721 0.005443 0.005993 0.006209 ... 0.001240 0.000983 0.000850 0.000627 0.000523 0.000328 0.000223 0.000153 0.000160 0.000300 서울특별시 종로구 청운효자동(1111051500) 0.004080 0.003910 0.004080 0.004420 0.004420 0.006799 0.007309 0.007479 0.008414 0.008074 ... 0.001275 0.000595 0.000595 0.000425 0.000510 0.000340 0.000255 0.000255 0.000085 0.000255 서울특별시 종로구 사직동(1111053000) 0.003665 0.003233 0.003880 0.004635 0.004850 0.006790 0.007437 0.007437 0.007760 0.007006 ... 0.001725 0.000970 0.001940 0.000539 0.000647 0.000862 0.000539 0.000216 0.000431 0.000108 서울특별시 종로구 삼청동(1111054000) 0.001678 0.002936 0.002097 0.002097 0.005453 0.003356 0.005034 0.005453 0.004195 0.005872 ... 0.001258 0.002936 0.000419 0.001258 0.000839 0.000419 0.000419 0.000419 0.000000 0.001678 5 rows × 101 columns '''
- 궁금한 지역 이름 입력받고 해당 지역의 인구 구조 저장
- 파이썬 내부함수인 input()을 활용, 원하는 지역 이름 입력
- str.contains()함수를 통해 입력된 지역 일므과 데이터 내부 이름 matching 검색
-
name = input('원하는 지역의 이름을 입력해주세요 : ') a = df.index.str.contains(name) df2 = df[a] df2 ''' 출력 결과 원하는 지역의 이름을 입력해주세요 : 김해시 0세 1세 2세 3세 4세 5세 6세 7세 8세 9세 ... 91세 92세 93세 94세 95세 96세 97세 98세 99세 100세 이상 행정구역 경상남도 김해시 (4825000000) 0.004848 0.005524 0.006097 0.006935 0.007586 0.008648 0.009876 0.010454 0.010512 0.010864 ... 0.000608 0.000464 0.000390 0.000244 0.000162 0.000095 0.000082 0.000043 0.000047 0.000063 경상남도 김해시 진영읍(4825025000) 0.005509 0.006810 0.008598 0.008742 0.010747 0.010747 0.012933 0.012626 0.013312 0.013023 ... 0.000759 0.000452 0.000379 0.000271 0.000145 0.000072 0.000054 0.000072 0.000054 0.000072 경상남도 김해시 주촌면(4825032000) 0.013059 0.015183 0.014705 0.015024 0.015926 0.016351 0.016510 0.017572 0.015395 0.013059 ... 0.000372 0.000425 0.000372 0.000106 0.000000 0.000106 0.000000 0.000000 0.000000 0.000000 경상남도 김해시 진례면(4825033000) 0.001282 0.001282 0.001924 0.001763 0.002405 0.002725 0.004970 0.003847 0.002886 0.003687 ... 0.002405 0.002244 0.001443 0.001122 0.000321 0.000962 0.000321 0.000000 0.000000 0.000000 경상남도 김해시 한림면(4825034000) 0.000844 0.000985 0.001125 0.003094 0.002110 0.001266 0.001406 0.003094 0.003516 0.003657 ... 0.002250 0.001688 0.001547 0.000985 0.000703 0.000422 0.000422 0.000141 0.000141 0.000141 경상남도 김해시 생림면(4825035000) 0.000536 0.001609 0.002145 0.002414 0.001609 0.001877 0.002145 0.001341 0.002414 0.001609 ... 0.002145 0.001877 0.001609 0.001073 0.000268 0.000805 0.000000 0.000000 0.000000 0.000000 경상남도 김해시 상동면(4825036000) 0.000321 0.001604 0.001283 0.001604 0.000962 0.001925 0.001604 0.003208 0.004491 0.003850 ... 0.002887 0.001604 0.002246 0.000321 0.000000 0.000962 0.000321 0.000321 0.000321 0.000962 경상남도 김해시 대동면(4825037000) 0.000544 0.001268 0.001268 0.002174 0.001087 0.001812 0.002718 0.004530 0.002899 0.002718 ... 0.002537 0.002537 0.001812 0.001631 0.001450 0.000362 0.000362 0.000362 0.000362 0.000544 경상남도 김해시 동상동(4825051000) 0.003896 0.005160 0.004212 0.005792 0.005897 0.004528 0.006108 0.004423 0.005476 0.007898 ... 0.001053 0.000105 0.000316 0.000632 0.000316 0.000105 0.000211 0.000105 0.000000 0.000105 경상남도 김해시 회현동(4825052000) 0.005217 0.004990 0.005104 0.005898 0.006465 0.006805 0.005671 0.006578 0.006692 0.005671 ... 0.001361 0.001248 0.000794 0.000907 0.000227 0.000000 0.000113 0.000000 0.000000 0.000000 경상남도 김해시 부원동(4825053000) 0.004881 0.004466 0.005297 0.005504 0.005193 0.005400 0.005816 0.004466 0.006335 0.004985 ... 0.000519 0.000312 0.000519 0.000104 0.000000 0.000104 0.000312 0.000104 0.000000 0.000000 경상남도 김해시 내외동(4825054000) 0.004060 0.004361 0.004429 0.005031 0.005304 0.005974 0.007081 0.007464 0.007737 0.007819 ... 0.000369 0.000451 0.000301 0.000219 0.000191 0.000027 0.000041 0.000027 0.000055 0.000055 경상남도 김해시 북부동(4825055000) 0.005027 0.005403 0.006046 0.006629 0.007382 0.009361 0.010053 0.011025 0.011340 0.011547 ... 0.000486 0.000328 0.000255 0.000194 0.000097 0.000061 0.000073 0.000036 0.000049 0.000036 경상남도 김해시 칠산서부동(4825056500) 0.001820 0.003961 0.002569 0.004817 0.005245 0.005031 0.005138 0.006316 0.005887 0.007707 ... 0.000749 0.000749 0.000428 0.000214 0.000214 0.000214 0.000000 0.000000 0.000000 0.000214 경상남도 김해시 활천동(4825058000) 0.003124 0.003226 0.003636 0.004251 0.005249 0.005966 0.006171 0.007247 0.007861 0.007784 ... 0.000563 0.000384 0.000410 0.000154 0.000128 0.000026 0.000154 0.000102 0.000102 0.000026 경상남도 김해시 삼안동(4825059000) 0.002315 0.002440 0.002721 0.003722 0.003409 0.004379 0.004911 0.005255 0.005599 0.005818 ... 0.000563 0.000688 0.000500 0.000156 0.000125 0.000094 0.000063 0.000000 0.000063 0.000094 경상남도 김해시 불암동(4825060000) 0.002614 0.002889 0.004403 0.003027 0.006054 0.004403 0.007843 0.007017 0.007567 0.008943 ... 0.000413 0.000550 0.000550 0.000275 0.000138 0.000000 0.000138 0.000138 0.000275 0.000000 경상남도 김해시 장유1동(4825061000) 0.005169 0.005989 0.006738 0.006969 0.007682 0.007843 0.009928 0.010178 0.010516 0.011853 ... 0.000428 0.000339 0.000232 0.000250 0.000196 0.000089 0.000036 0.000053 0.000000 0.000089 경상남도 김해시 장유2동(4825062000) 0.004214 0.005157 0.005905 0.007097 0.007652 0.009953 0.010840 0.011006 0.010507 0.012864 ... 0.000665 0.000305 0.000444 0.000139 0.000166 0.000083 0.000028 0.000000 0.000028 0.000083 경상남도 김해시 장유3동(4825063000) 0.007020 0.007961 0.008792 0.011205 0.011682 0.014640 0.016930 0.018634 0.017639 0.018103 ... 0.000314 0.000150 0.000150 0.000068 0.000095 0.000068 0.000082 0.000000 0.000014 0.000014 20 rows × 101 columns '''
- 데이터를 그래프로 그리기 위해 행과 열을 바꾼 후 plot()함수 실행
- transpose()함수를 활용하여 행과 열을 바꿈 (X축, Y축 설정)
- matplotlib을 활용하여 그래프 작성
-
import matplotlib.pyplot as plt plt.rc('font', family='Malgun Gothic') df2.T.plot() plt.show() ''' 출력 결과는 아래 사진과 같습니다. '''
- 우리 지역과 인구구조가 비슷한 지역 그래프로 나타내기
-
import pandas as pd import numpy as np import matplotlib.pyplot as plt name= input('원하는 지역의 이름을 입력해주세요: ') #지역 이름 입력 ex) "김해시" a= df.index.str.contains(name) df2= df[a] x= df.sub(df2.iloc[0], axis= 1) #궁금한 지역 A의 인규비율에서 B의 인구비율을 뺌(편차) y= np.power(x, 2) #마이너스 값이 있으므로 제곱한 후 모두 더함 z= y.sum(axis= 1) i= z.sort_values().index[:5] #편차가 가장 작은 지역 5곳을 찾음 df.loc[i].T.plot() #결과를 그래프로 보여줌 plt.rc('font', family= 'Malgun Gothic') plt.show() ''' 출력 결과 원하는 지역의 이름을 입력해주세요: 김해시 이하 출력 결과는 아래의 사진과 같습니다. '''
본 데이터분석기초실습은 [지능형 데이터 공학 및 응용 연구실 - 경상국립대학교 컴퓨터과학부]에서 수업한 자료를 토대로 정리하여 작성하였습니다.
반응형