봉지라면의 봉지 속 이야기

BongjiNoodle's Packet Inside Story

나의 진솔담백한 이야기

컴퓨터공학/데이터분석기초실습

데이터분석기초실습] 6. 데이터 조작① (Pandas 활용 실습)

봉지라면 2022. 12. 4. 02:11
반응형

데이터 조작(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에 업로드
  • 데이터 읽어오기
    • 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()
    
    '''
    출력 결과
    원하는 지역의 이름을 입력해주세요: 김해시
    
    이하 출력 결과는 아래의 사진과 같습니다.
    '''

본 데이터분석기초실습은 [지능형 데이터 공학 및 응용 연구실 - 경상국립대학교 컴퓨터과학부]에서 수업한 자료를 토대로 정리하여 작성하였습니다.



반응형