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

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

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

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

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


힌트1. pd.read_html()을 이용할때 encoding='utf-8'옵션을 사용하라.

힌트2. https://ncv.kdca.go.kr/mainStatus.es?mid=a11702000000의 2번째 테이블을 판다스로 읽어온 결과는 아래와 같아야 한다.

구분 1차접종 2차접종 3차(부스터)접종
구분 당일 실적 당일 누계 당일 실적 당일 누계 당일 실적 당일 누계
0 합계 22505 42618296 60388 41192348 179831 3570414
1 서울 3613 7933770 8315 7698119 34397 649999
2 부산 1355 2724073 2942 2631501 11161 209295
3 대구 925 1895746 2485 1830009 7258 130330
4 인천 1331 2430994 3781 2346905 9049 183461
5 광주 669 1190287 2190 1143284 4852 108004
6 대전 659 1173714 1692 1132714 5326 92697
7 울산 527 908812 1657 879965 3311 59007
8 세종 146 272339 357 261860 989 22115
9 경기 6180 11154058 16579 10788551 39809 876808
10 강원 718 1279589 2076 1237178 6373 118575
11 충북 668 1352302 2529 1307212 6536 124993
12 충남 952 1789964 2610 1725422 8595 170692
13 전북 755 1514759 2705 1460057 9037 160277
14 전남 792 1575741 2498 1520694 9319 199860
15 경북 1255 2160015 2942 2085263 9743 193965
16 경남 1510 2712518 3997 2614451 11699 226671
17 제주 450 549615 1033 529163 2377 43665
  • 위의 df는 예시일 뿐이며 시간에 따라 정보가 업데이트 되어 달라질 수 있음

힌트3. 아래의 주소에서 json을 파일을 읽어온뒤 choroplethmap을 그릴때 이용하라.

https://raw.githubusercontent.com/southkorea/southkorea-maps/master/kostat/2018/json/skorea-provinces-2018-geo.json

힌트4. json파일의 지역명과 https://ncv.kdca.go.kr/mainStatus.es?mid=a11702000000의 지역이름을 맞추어라. json파일의 지역명은 아래와 같은 코드로 확인할 수 있다.

[global_dict['features'][i]['properties']['name'] for i in range(17)]
['서울특별시',
 '부산광역시',
 '대구광역시',
 '인천광역시',
 '광주광역시',
 '대전광역시',
 '울산광역시',
 '세종특별자치시',
 '경기도',
 '강원도',
 '충청북도',
 '충청남도',
 '전라북도',
 '전라남도',
 '경상북도',
 '경상남도',
 '제주특별자치도']
  • 여기에서 global_dict는 힌트3의 json파일이 저장된 dictionary 이다

힌트5. 지역별 접종률은 아래의 수식으로 구한다.

$$ \textbf{서울특별시 2차접종 접종률}=\frac{\textbf{서울특별시 2차접종 당일누계}}{\textbf{서울특별시 인구수}} $$

이때 위의 수식의 분모에 사용할 시도별 인구수는 아래의 주소에서 얻을 수 있다.

https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv

힌트6. eval()을 이용하면 데이터프레임에서 간단한 column별 연산을 수행할 수 있다. (필요하다면 참고하라)

(예제) 아래의 데이터프레임에서 $x/y$를 수행하고 결과를 $z$에 저장하라.

import pandas as pd 
df= pd.DataFrame({'x':[1,2,3,4,5],'y':[2,2,2,3,3]})
df
x y
0 1 2
1 2 2
2 3 2
3 4 3
4 5 3

(풀이1)

df.assign(z=list(map(lambda x,y: x/y, df.x,df.y)))
x y z
0 1 2 0.500000
1 2 2 1.000000
2 3 2 1.500000
3 4 3 1.333333
4 5 3 1.666667

(풀이2)

df.eval('z=x/y')
x y z
0 1 2 0.500000
1 2 2 1.000000
2 3 2 1.500000
3 4 3 1.333333
4 5 3 1.666667

- 물론 아래와 같이 수행해도 된다

df['z']= df['x']/df['y']
df

힌트7. 시도별 접종률의 결과는 아래와 같다.

prov prop
0 서울특별시 0.807572
1 부산광역시 0.784046
2 대구광역시 0.765463
3 인천광역시 0.796909
4 광주광역시 0.792597
5 대전광역시 0.778911
6 울산광역시 0.783887
7 세종특별자치시 0.711043
8 경기도 0.796228
9 강원도 0.804555
10 충청북도 0.818569
11 충청남도 0.814271
12 전라북도 0.815779
13 전라남도 0.828873
14 경상북도 0.793502
15 경상남도 0.787922
16 제주특별자치도 0.782127
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=pd.read_html('https://ncv.kdca.go.kr/mainStatus.es?mid=a11702000000', encoding='utf-8')[1]
df
구분 1차접종 2차접종 3차접종 4차접종
구분 당일 실적 당일 누계 당일 실적 당일 누계 당일 실적 당일 누계 당일 실적 당일 누계
0 합계 351 45108313 359 44670449 2497 33572790 11700 7296556
1 서울 83 8340399 95 8261264 632 6056215 2436 1220149
2 부산 11 2879865 13 2850922 145 2134278 534 486620
3 대구 14 2019275 12 1996299 71 1402429 344 258391
4 인천 18 2570573 14 2545958 114 1907197 610 392630
5 광주 7 1262681 9 1250998 69 967940 348 232438
6 대전 9 1246205 8 1233902 107 907392 351 192397
7 울산 2 968589 13 959211 37 719397 334 123231
8 세종 5 298571 3 294799 13 209101 57 34453
9 경기 100 11827188 100 11711109 684 8675274 3119 1671545
10 강원 6 1350228 8 1338835 36 1061864 365 267917
11 충북 7 1429489 11 1416797 80 1105634 409 276043
12 충남 17 1899388 13 1881678 88 1475256 538 363890
13 전북 7 1593715 10 1580475 68 1283965 353 368814
14 전남 17 1654717 11 1640000 66 1363047 407 442734
15 경북 18 2293284 12 2269291 82 1724239 462 392879
16 경남 23 2883576 22 2854121 146 2141841 788 481078
17 제주 7 590570 5 584790 59 437721 245 91347
df1=df.iloc[1:,1:].stack().reset_index().\
query('level_1=="당일 누계"').reset_index().drop(['index','level_0', 'level_1','1차접종', '3차접종', '4차접종'], axis=1).assign(prov=prov)
df1
2차접종 prov
0 8261264 서울특별시
1 2850922 부산광역시
2 1996299 대구광역시
3 2545958 인천광역시
4 1250998 광주광역시
5 1233902 대전광역시
6 959211 울산광역시
7 294799 세종특별자치시
8 11711109 경기도
9 1338835 강원도
10 1416797 충청북도
11 1881678 충청남도
12 1580475 전라북도
13 1640000 전라남도
14 2269291 경상북도
15 2854121 경상남도
16 584790 제주특별자치도
df2 = pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').assign(prov=prov).iloc[:,1:]
df2
총인구수 (명) prov
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 제주특별자치도
df3=pd.merge(df1,df2, on='prov')
df3.columns = ["value","prov","pop"]
df3
value prov pop
0 8261264 서울특별시 9532428
1 2850922 부산광역시 3356311
2 1996299 대구광역시 2390721
3 2545958 인천광역시 2945009
4 1250998 광주광역시 1442454
5 1233902 대전광역시 1454228
6 959211 울산광역시 1122566
7 294799 세종특별자치시 368276
8 11711109 경기도 13549577
9 1338835 강원도 1537717
10 1416797 충청북도 1596948
11 1881678 충청남도 2118977
12 1580475 전라북도 1789770
13 1640000 전라남도 1834653
14 2269291 경상북도 2627925
15 2854121 경상남도 3318161
16 584790 제주특별자치도 676569
_df = df3.eval('prop=value/pop')
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
Make this Notebook Trusted to load map: File -> Trust Notebook