#1. COVID19 시도별 접종률 시각화 (30점)

아래의 그림은 COVID19 예방접종의 시도별 현황을 캡쳐한 것이다.

이 정보는 특정 주기로 업데이트 되며 아래의 웹페이지 2번째 테이블에서 확인할 수 있다.

https://ncv.kdca.go.kr/mainStatus.es?mid=a11702000000

판다스의 pd.read_html() 함수를 이용해 위의 페이지에서 그림1의 테이블을 읽어오라. 그리고 folium의 choroplethmap을 활용하여 시도별 2차접종의 접종률을 시각화 하라. 시각화 예시는 아래와 같다.

(풀이)

- 데이터프레임 읽어오기

import pandas as pd
df=pd.read_html('https://ncv.kdca.go.kr/mainStatus.es?mid=a11702000000',encoding='utf-8')[1]
df
구분 1차접종 2차접종 3차접종
구분 당일 실적 당일 누계 당일 실적 당일 누계 당일 실적 당일 누계
0 합계 5851 43493325 1743 42070660 29240 11565083
1 서울 1092 8081511 327 7848156 6576 2173116
2 부산 323 2785658 96 2686254 1691 766316
3 대구 173 1938156 37 1867302 596 443843
4 인천 525 2480025 168 2400474 2436 632558
5 광주 72 1216505 14 1173233 267 316210
6 대전 197 1199583 42 1157132 582 293704
7 울산 80 928762 19 896509 388 207834
8 세종 54 279728 15 268580 166 64957
9 경기 2272 11384986 705 11016264 11819 2817113
10 강원 77 1303677 21 1263853 269 385809
11 충북 113 1376943 34 1334316 805 382193
12 충남 245 1825333 77 1765603 1057 521523
13 전북 111 1545850 29 1497144 584 508956
14 전남 101 1603261 28 1554519 481 544769
15 경북 106 2201519 41 2126360 338 618715
16 경남 218 2778313 62 2673402 833 750044
17 제주 92 563515 28 541559 352 137423

- json 파일

import json
import requests
global_distriction_jsonurl='https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2018/json/skorea-provinces-2018-geo.json'
global_dict = json.loads(requests.get(global_distriction_jsonurl).text)
prov=[global_dict['features'][i]['properties']['name'] for i in range(17)]
prov 
['서울특별시',
 '부산광역시',
 '대구광역시',
 '인천광역시',
 '광주광역시',
 '대전광역시',
 '울산광역시',
 '세종특별자치시',
 '경기도',
 '강원도',
 '충청북도',
 '충청남도',
 '전라북도',
 '전라남도',
 '경상북도',
 '경상남도',
 '제주특별자치도']

- 변형

df.iloc[1:,1:].assign(prov=prov)
1차접종 2차접종 3차접종 prov
당일 실적 당일 누계 당일 실적 당일 누계 당일 실적 당일 누계
1 1092 8081511 327 7848156 6576 2173116 서울특별시
2 323 2785658 96 2686254 1691 766316 부산광역시
3 173 1938156 37 1867302 596 443843 대구광역시
4 525 2480025 168 2400474 2436 632558 인천광역시
5 72 1216505 14 1173233 267 316210 광주광역시
6 197 1199583 42 1157132 582 293704 대전광역시
7 80 928762 19 896509 388 207834 울산광역시
8 54 279728 15 268580 166 64957 세종특별자치시
9 2272 11384986 705 11016264 11819 2817113 경기도
10 77 1303677 21 1263853 269 385809 강원도
11 113 1376943 34 1334316 805 382193 충청북도
12 245 1825333 77 1765603 1057 521523 충청남도
13 111 1545850 29 1497144 584 508956 전라북도
14 101 1603261 28 1554519 481 544769 전라남도
15 106 2201519 41 2126360 338 618715 경상북도
16 218 2778313 62 2673402 833 750044 경상남도
17 92 563515 28 541559 352 137423 제주특별자치도
df.iloc[1:,1:].assign(prov=prov).\
set_index('prov').stack().stack().reset_index().rename(columns={0:'value'})
prov level_1 level_2 value
0 서울특별시 당일 누계 1차접종 8081511
1 서울특별시 당일 누계 2차접종 7848156
2 서울특별시 당일 누계 3차접종 2173116
3 서울특별시 당일 실적 1차접종 1092
4 서울특별시 당일 실적 2차접종 327
... ... ... ... ...
97 제주특별자치도 당일 누계 2차접종 541559
98 제주특별자치도 당일 누계 3차접종 137423
99 제주특별자치도 당일 실적 1차접종 92
100 제주특별자치도 당일 실적 2차접종 28
101 제주특별자치도 당일 실적 3차접종 352

102 rows × 4 columns

df.iloc[1:,1:].assign(prov=prov).\
set_index('prov').stack().stack().reset_index().rename(columns={0:'value'}).\
query('level_1 == "당일 누계" and level_2 == "2차접종" ' )
prov level_1 level_2 value
1 서울특별시 당일 누계 2차접종 7848156
7 부산광역시 당일 누계 2차접종 2686254
13 대구광역시 당일 누계 2차접종 1867302
19 인천광역시 당일 누계 2차접종 2400474
25 광주광역시 당일 누계 2차접종 1173233
31 대전광역시 당일 누계 2차접종 1157132
37 울산광역시 당일 누계 2차접종 896509
43 세종특별자치시 당일 누계 2차접종 268580
49 경기도 당일 누계 2차접종 11016264
55 강원도 당일 누계 2차접종 1263853
61 충청북도 당일 누계 2차접종 1334316
67 충청남도 당일 누계 2차접종 1765603
73 전라북도 당일 누계 2차접종 1497144
79 전라남도 당일 누계 2차접종 1554519
85 경상북도 당일 누계 2차접종 2126360
91 경상남도 당일 누계 2차접종 2673402
97 제주특별자치도 당일 누계 2차접종 541559

- 머지할 데이터프레임을 찾자

pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv')
행정구역(시군구)별 총인구수 (명)
0 서울특별시 9532428
1 부산광역시 3356311
2 대구광역시 2390721
3 인천광역시 2945009
4 광주광역시 1442454
5 대전광역시 1454228
6 울산광역시 1122566
7 세종특별자치시 368276
8 경기도 13549577
9 강원도 1537717
10 충청북도 1596948
11 충청남도 2118977
12 전라북도 1789770
13 전라남도 1834653
14 경상북도 2627925
15 경상남도 3318161
16 제주특별자치도 676569
pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'}) ## 머지할 df <-- 이름 줄 가치가 X 
prov pop
0 서울특별시 9532428
1 부산광역시 3356311
2 대구광역시 2390721
3 인천광역시 2945009
4 광주광역시 1442454
5 대전광역시 1454228
6 울산광역시 1122566
7 세종특별자치시 368276
8 경기도 13549577
9 강원도 1537717
10 충청북도 1596948
11 충청남도 2118977
12 전라북도 1789770
13 전라남도 1834653
14 경상북도 2627925
15 경상남도 3318161
16 제주특별자치도 676569

- 머지

df.iloc[1:,1:].assign(prov=prov).\
set_index('prov').stack().stack().reset_index().rename(columns={0:'value'}).\
query('level_1 == "당일 누계" and level_2 == "2차접종" ' ).\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'}))
prov level_1 level_2 value pop
0 서울특별시 당일 누계 2차접종 7848156 9532428
1 부산광역시 당일 누계 2차접종 2686254 3356311
2 대구광역시 당일 누계 2차접종 1867302 2390721
3 인천광역시 당일 누계 2차접종 2400474 2945009
4 광주광역시 당일 누계 2차접종 1173233 1442454
5 대전광역시 당일 누계 2차접종 1157132 1454228
6 울산광역시 당일 누계 2차접종 896509 1122566
7 세종특별자치시 당일 누계 2차접종 268580 368276
8 경기도 당일 누계 2차접종 11016264 13549577
9 강원도 당일 누계 2차접종 1263853 1537717
10 충청북도 당일 누계 2차접종 1334316 1596948
11 충청남도 당일 누계 2차접종 1765603 2118977
12 전라북도 당일 누계 2차접종 1497144 1789770
13 전라남도 당일 누계 2차접종 1554519 1834653
14 경상북도 당일 누계 2차접종 2126360 2627925
15 경상남도 당일 누계 2차접종 2673402 3318161
16 제주특별자치도 당일 누계 2차접종 541559 676569
df.iloc[1:,1:].assign(prov=prov).\
set_index('prov').stack().stack().reset_index().rename(columns={0:'value'}).\
query('level_1 == "당일 누계" and level_2 == "2차접종" ' ).\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'})).\
eval('prop= value / pop')
prov level_1 level_2 value pop prop
0 서울특별시 당일 누계 2차접종 7848156 9532428 0.823311
1 부산광역시 당일 누계 2차접종 2686254 3356311 0.800359
2 대구광역시 당일 누계 2차접종 1867302 2390721 0.781062
3 인천광역시 당일 누계 2차접종 2400474 2945009 0.815099
4 광주광역시 당일 누계 2차접종 1173233 1442454 0.813359
5 대전광역시 당일 누계 2차접종 1157132 1454228 0.795702
6 울산광역시 당일 누계 2차접종 896509 1122566 0.798625
7 세종특별자치시 당일 누계 2차접종 268580 368276 0.729290
8 경기도 당일 누계 2차접종 11016264 13549577 0.813034
9 강원도 당일 누계 2차접종 1263853 1537717 0.821902
10 충청북도 당일 누계 2차접종 1334316 1596948 0.835541
11 충청남도 당일 누계 2차접종 1765603 2118977 0.833234
12 전라북도 당일 누계 2차접종 1497144 1789770 0.836501
13 전라남도 당일 누계 2차접종 1554519 1834653 0.847310
14 경상북도 당일 누계 2차접종 2126360 2627925 0.809140
15 경상남도 당일 누계 2차접종 2673402 3318161 0.805688
16 제주특별자치도 당일 누계 2차접종 541559 676569 0.800449
_df=df.iloc[1:,1:].assign(prov=prov).\
set_index('prov').stack().stack().reset_index().rename(columns={0:'value'}).\
query('level_1 == "당일 누계" and level_2 == "2차접종" ' ).\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'})).\
eval('prop= value / pop')

- 저장

import folium
m = folium.Map([36,128],zoom_start=7,scrollWheelZoom=False)
choro = folium.Choropleth(
    data = _df, 
    geo_data= global_dict, 
    columns=['prov','prop'],
    key_on = 'feature.properties.name'
)
choro.add_to(m)   
#m
<folium.features.Choropleth at 0x7fecc0a489a0>

#2. COVID19 시도별/월별 확산과정 시각화 (40점)

아래는 COVID19 확진자수를 지역별로 매일 기록한 자료이다.

https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/covid19_20211202.csv

자료를 판다스로 불러온 결과는 아래와 같다.

일자 계(명) 서울 부산 대구 인천 광주 대전 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주 검역
0 누적(명) 457,612 158,774 16,555 19,114 25,299 6,353 8,809 5,675 1,588 136,546 8,889 8,942 13,174 6,453 4,498 11,471 15,236 3,762 6,474
1 2020-01-20 1 - - - 1 - - - - - - - - - - - - - -
2 2020-01-21 0 - - - - - - - - - - - - - - - - - -
3 2020-01-22 0 - - - - - - - - - - - - - - - - - -
4 2020-01-23 0 - - - - - - - - - - - - - - - - - -
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
679 2021-11-28 3,925 1,673 148 106 278 52 53 4 5 1,090 63 25 121 45 25 103 89 35 10
680 2021-11-29 3,308 1,393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44 3
681 2021-11-30 3,032 1,186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22 8
682 2021-12-01 5,123 2,222 143 86 326 29 88 17 20 1,582 105 48 96 50 40 97 127 27 20
683 2021-12-02 5,266 2,268 158 70 355 39 166 18 8 1,495 145 49 149 71 39 106 94 31 5

일별로 기록된 COVID19 확진자수를 월별로 통합한 뒤 2021-01 ~ 2021-10 기간의 발생률을 계산하여 시각화하라. 시각화는 plotlychoropleth_mapbox를 이용하며 시간의 추이를 표현하기 위해 animation_frame 옵션을 사용한다. 시각화 예시는 생략함.

(풀이)

df = pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/covid19_20211202.csv')
df
일자 계(명) 서울 부산 대구 인천 광주 대전 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주 검역
0 누적(명) 457,612 158,774 16,555 19,114 25,299 6,353 8,809 5,675 1,588 136,546 8,889 8,942 13,174 6,453 4,498 11,471 15,236 3,762 6,474
1 2020-01-20 1 - - - 1 - - - - - - - - - - - - - -
2 2020-01-21 0 - - - - - - - - - - - - - - - - - -
3 2020-01-22 0 - - - - - - - - - - - - - - - - - -
4 2020-01-23 0 - - - - - - - - - - - - - - - - - -
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
679 2021-11-28 3,925 1,673 148 106 278 52 53 4 5 1,090 63 25 121 45 25 103 89 35 10
680 2021-11-29 3,308 1,393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44 3
681 2021-11-30 3,032 1,186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22 8
682 2021-12-01 5,123 2,222 143 86 326 29 88 17 20 1,582 105 48 96 50 40 97 127 27 20
683 2021-12-02 5,266 2,268 158 70 355 39 166 18 8 1,495 145 49 149 71 39 106 94 31 5

684 rows × 20 columns

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0))
서울 부산 대구 인천 광주 대전 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주
일자
2020-01-20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
2020-01-21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2020-01-22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2020-01-23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2020-01-24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2021-11-28 1673 148 106 278 52 53 4 5 1090 63 25 121 45 25 103 89 35
2021-11-29 1393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44
2021-11-30 1186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22
2021-12-01 2222 143 86 326 29 88 17 20 1582 105 48 96 50 40 97 127 27
2021-12-02 2268 158 70 355 39 166 18 8 1495 145 49 149 71 39 106 94 31

683 rows × 17 columns

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index()
prov 일자 서울특별시 부산광역시 대구광역시 인천광역시 광주광역시 대전광역시 울산광역시 세종특별자치시 경기도 강원도 충청북도 충청남도 전라북도 전라남도 경상북도 경상남도 제주특별자치도
0 2020-01-20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2020-01-21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2020-01-22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2020-01-23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2020-01-24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
678 2021-11-28 1673 148 106 278 52 53 4 5 1090 63 25 121 45 25 103 89 35
679 2021-11-29 1393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44
680 2021-11-30 1186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22
681 2021-12-01 2222 143 86 326 29 88 17 20 1582 105 48 96 50 40 97 127 27
682 2021-12-02 2268 158 70 355 39 166 18 8 1495 145 49 149 71 39 106 94 31

683 rows × 18 columns

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index()
prov 일자 서울특별시 부산광역시 대구광역시 인천광역시 광주광역시 대전광역시 울산광역시 세종특별자치시 경기도 강원도 충청북도 충청남도 전라북도 전라남도 경상북도 경상남도 제주특별자치도
0 2020-01-20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2020-01-21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2020-01-22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2020-01-23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2020-01-24 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
678 2021-11-28 1673 148 106 278 52 53 4 5 1090 63 25 121 45 25 103 89 35
679 2021-11-29 1393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44
680 2021-11-30 1186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22
681 2021-12-01 2222 143 86 326 29 88 17 20 1582 105 48 96 50 40 97 127 27
682 2021-12-02 2268 158 70 355 39 166 18 8 1495 145 49 149 71 39 106 94 31

683 rows × 18 columns

- 여기가 어려움. 아래의 변환이 필요함

'2020-01-20', '2020-01'
('2020-01-20', '2020-01')
'2020-01-20'[:7]
'2020-01'
'2020-01-20'.split('-')[0]+ '-' + '2020-01-20'.split('-')[1]
'2020-01'

- 방법1

_df=df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index()
_df.assign(일자=list(map(lambda x: x[:7] , _df['일자'])))
prov 일자 서울특별시 부산광역시 대구광역시 인천광역시 광주광역시 대전광역시 울산광역시 세종특별자치시 경기도 강원도 충청북도 충청남도 전라북도 전라남도 경상북도 경상남도 제주특별자치도
0 2020-01 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2020-01 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
678 2021-11 1673 148 106 278 52 53 4 5 1090 63 25 121 45 25 103 89 35
679 2021-11 1393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44
680 2021-11 1186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22
681 2021-12 2222 143 86 326 29 88 17 20 1582 105 48 96 50 40 97 127 27
682 2021-12 2268 158 70 355 39 166 18 8 1495 145 49 149 71 39 106 94 31

683 rows × 18 columns

- 방법2

df.assign(일자=list(map(lambda x: x[:7], df.일자 )))
일자 계(명) 서울 부산 대구 인천 광주 대전 울산 세종 경기 강원 충북 충남 전북 전남 경북 경남 제주 검역
0 누적(명) 457,612 158,774 16,555 19,114 25,299 6,353 8,809 5,675 1,588 136,546 8,889 8,942 13,174 6,453 4,498 11,471 15,236 3,762 6,474
1 2020-01 1 - - - 1 - - - - - - - - - - - - - -
2 2020-01 0 - - - - - - - - - - - - - - - - - -
3 2020-01 0 - - - - - - - - - - - - - - - - - -
4 2020-01 0 - - - - - - - - - - - - - - - - - -
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
679 2021-11 3,925 1,673 148 106 278 52 53 4 5 1,090 63 25 121 45 25 103 89 35 10
680 2021-11 3,308 1,393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44 3
681 2021-11 3,032 1,186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22 8
682 2021-12 5,123 2,222 143 86 326 29 88 17 20 1,582 105 48 96 50 40 97 127 27 20
683 2021-12 5,266 2,268 158 70 355 39 166 18 8 1,495 145 49 149 71 39 106 94 31 5

684 rows × 20 columns

  • 현실적으로 이정도까지 앞을 내다보는건 힘든것 같아요..

- 방법3

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자'])))
prov 일자 서울특별시 부산광역시 대구광역시 인천광역시 광주광역시 대전광역시 울산광역시 세종특별자치시 경기도 강원도 충청북도 충청남도 전라북도 전라남도 경상북도 경상남도 제주특별자치도
0 2020-01 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2020-01 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2020-01 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
678 2021-11 1673 148 106 278 52 53 4 5 1090 63 25 121 45 25 103 89 35
679 2021-11 1393 144 88 233 61 43 2 15 910 56 33 52 49 28 68 86 44
680 2021-11 1186 79 78 192 52 43 3 22 909 84 59 81 50 36 68 60 22
681 2021-12 2222 143 86 326 29 88 17 20 1582 105 48 96 50 40 97 127 27
682 2021-12 2268 158 70 355 39 166 18 8 1495 145 49 149 71 39 106 94 31

683 rows × 18 columns

- 방법3을 택하도록 하자. 위에서 일자를 ym으로 바꾸고 tidydata를 만들자.

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'})
ym prov value
0 2020-01 서울특별시 0
1 2020-01 부산광역시 0
2 2020-01 대구광역시 0
3 2020-01 인천광역시 1
4 2020-01 광주광역시 0
... ... ... ...
11606 2021-12 전라북도 71
11607 2021-12 전라남도 39
11608 2021-12 경상북도 106
11609 2021-12 경상남도 94
11610 2021-12 제주특별자치도 31

11611 rows × 3 columns

- groupby 적용

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'}).\
groupby(['ym','prov']).agg({'value':sum}).reset_index()
ym prov value
0 2020-01 강원도 0
1 2020-01 경기도 2
2 2020-01 경상남도 0
3 2020-01 경상북도 0
4 2020-01 광주광역시 0
... ... ... ...
403 2021-12 전라남도 79
404 2021-12 전라북도 121
405 2021-12 제주특별자치도 58
406 2021-12 충청남도 245
407 2021-12 충청북도 97

408 rows × 3 columns

- query

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'}).\
groupby(['ym','prov']).agg({'value':sum}).reset_index().\
query('ym >= "2021-01" and ym<="2021-10"')
ym prov value
204 2021-01 강원도 488
205 2021-01 경기도 5353
206 2021-01 경상남도 686
207 2021-01 경상북도 593
208 2021-01 광주광역시 702
... ... ... ...
369 2021-10 전라남도 459
370 2021-10 전라북도 672
371 2021-10 제주특별자치도 225
372 2021-10 충청남도 1467
373 2021-10 충청북도 1556

170 rows × 3 columns

- merge

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'}).\
groupby(['ym','prov']).agg({'value':sum}).reset_index().\
query('ym >= "2021-01" and ym<="2021-10"').\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'})) ## 머지할 df <-- 이름 줄 가치가 X 
ym prov value pop
0 2021-01 강원도 488 1537717
1 2021-02 강원도 169 1537717
2 2021-03 강원도 466 1537717
3 2021-04 강원도 354 1537717
4 2021-05 강원도 501 1537717
... ... ... ... ...
165 2021-06 충청북도 363 1596948
166 2021-07 충청북도 544 1596948
167 2021-08 충청북도 1302 1596948
168 2021-09 충청북도 1192 1596948
169 2021-10 충청북도 1556 1596948

170 rows × 4 columns

- prop = value / pop 을 계산하자

df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'}).\
groupby(['ym','prov']).agg({'value':sum}).reset_index().\
query('ym >= "2021-01" and ym<="2021-10"').\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'})).\
eval('prop = value/pop')
ym prov value pop prop
0 2021-01 강원도 488 1537717 0.000317
1 2021-02 강원도 169 1537717 0.000110
2 2021-03 강원도 466 1537717 0.000303
3 2021-04 강원도 354 1537717 0.000230
4 2021-05 강원도 501 1537717 0.000326
... ... ... ... ... ...
165 2021-06 충청북도 363 1596948 0.000227
166 2021-07 충청북도 544 1596948 0.000341
167 2021-08 충청북도 1302 1596948 0.000815
168 2021-09 충청북도 1192 1596948 0.000746
169 2021-10 충청북도 1556 1596948 0.000974

170 rows × 5 columns

df2=df.iloc[1:].set_index('일자').iloc[:,1:-1].applymap(lambda x: int(x.replace(',','') if x!='-' else 0)).\
T.reset_index().rename(columns={'index':'prov'}).assign(prov=prov).set_index('prov').T.reset_index().\
assign(일자=lambda df: list(map(lambda x: x[:7] , df['일자']))).\
rename(columns={'일자':'ym'}).set_index('ym').stack().reset_index().rename(columns={0:'value'}).\
groupby(['ym','prov']).agg({'value':sum}).reset_index().\
query('ym >= "2021-01" and ym<="2021-10"').\
merge(pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').\
rename(columns={'행정구역(시군구)별':'prov','총인구수 (명)':'pop'})).\
eval('prop = value/pop')
# from IPython.display import HTML
# fig=px.choropleth_mapbox(df2, 
#                      geojson=global_dict, 
#                      color='prop',
#                      locations='prov', 
#                      animation_frame='ym',
#                      featureidkey='properties.name',
#                      center={"lat": 36, "lon": 128},
#                      mapbox_style="carto-positron", 
#                      range_color=(0, df2.prop.max()),
#                      height=1200,
#                      zoom=6.5)
# fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
# HTML(fig.to_html(include_mathjax=False, config=dict({'scrollZoom':False})))