기말고사 (ver 1.0)
아래의 그림은 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번째 테이블을 판다스로 읽어온 결과는 아래와 같아야 한다.
- 위의 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
(풀이1)
df.assign(z=list(map(lambda x,y: x/y, df.x,df.y)))
(풀이2)
df.eval('z=x/y')
-
물론 아래와 같이 수행해도 된다
df['z']= df['x']/df['y']
df
힌트7. 시도별 접종률의 결과는 아래와 같다.
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
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
df2 = pd.read_csv('https://raw.githubusercontent.com/guebin/2021DV/master/_notebooks/2021-11-22-prov.csv').assign(prov=prov).iloc[:,1:]
df2
df3=pd.merge(df1,df2, on='prov')
df3.columns = ["value","prov","pop"]
df3
_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