데이터셋 준비
공공데이터포털에서 데이터셋 다운
강원도_코로나19 확진자 현황
data = pd . read_csv ( '/content/drive/MyDrive/강원도_코로나19 확진자 현황_20210731.csv' , encoding = "CP949" )
data
시군명
확진시기
확진자수
0
춘천
2020-02-22
2
1
원주
2020-02-22
0
2
강릉
2020-02-22
0
3
동해
2020-02-22
0
4
태백
2020-02-22
0
...
...
...
...
9463
화천
2021-07-31
0
9464
양구
2021-07-31
0
9465
인제
2021-07-31
0
9466
고성
2021-07-31
1
9467
양양
2021-07-31
3
9468 rows × 3 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
데이터 분석 및 시각화
# 한글 폰트 적용
import matplotlib
% matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
! apt - get update - qq
! apt - get install fonts - nanum * - qq
font_path = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font_name = fm . FontProperties ( fname = font_path , size = 10 ). get_name ()
print ( font_name )
plt . rc ( 'font' , family = font_name )
fm . _rebuild ()
matplotlib . rcParams [ 'axes.unicode_minus' ] = False
NanumBarunGothic
시군별 코로나 확진자수 시각화
sample = data [ data [ '시군명' ] == '춘천' ]
plt . figure ( figsize = ( 10 , 8 ))
plt . title ( '춘천' )
plt . plot ( sample [ '확진자수' ])
plt . show ()
cols = data [ '시군명' ]. unique ()
cols
array(['춘천', '원주', '강릉', '동해', '태백', '속초', '삼척', '홍천', '횡성', '영월', '평창',
'정선', '철원', '화천', '양구', '인제', '고성', '양양'], dtype=object)
count = data [ '시군명' ]. nunique ()
plt . figure ( figsize = ( 20 , 16 ))
for i in range ( count ):
mask = data [ '시군명' ] == cols [ i ]
sample = data [ mask ]
plt . subplot ( 4 , 5 , i + 1 )
plt . title ( cols [ i ])
plt . plot ( sample [ '확진자수' ])
plt . show ()
plt . figure ( figsize = ( 10 , 8 ))
plt . title ( 'total' )
plt . plot ( data [ '확진자수' ])
plt . show ()
시군별로 봤을 때는 시간이 지날수록 점점 확진자 수는 많아지고 춘천과 원주가 눈에 띕니다. 그리고 강원도 전체적으로 봐도 시간이 지날수록 더 많아집니다.
data [ 'month' ] = data [ '확진시기' ]. map ( lambda x : x . split ( '-' )[ 0 ] + x . split ( '-' )[ 1 ])
data
시군명
확진시기
확진자수
month
0
춘천
2020-02-22
2
202002
1
원주
2020-02-22
0
202002
2
강릉
2020-02-22
0
202002
3
동해
2020-02-22
0
202002
4
태백
2020-02-22
0
202002
...
...
...
...
...
9463
화천
2021-07-31
0
202107
9464
양구
2021-07-31
0
202107
9465
인제
2021-07-31
0
202107
9466
고성
2021-07-31
1
202107
9467
양양
2021-07-31
3
202107
9468 rows × 4 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
월별 확진자수 추이
data . groupby ( 'month' ). mean ()
확진자수
month
202002
0.055556
202003
0.053763
202004
0.027778
202005
0.007168
202006
0.014815
202007
0.016129
202008
0.213262
202009
0.057407
202010
0.103943
202011
0.701852
202012
1.032258
202101
0.835125
202102
0.329365
202103
0.862007
202104
0.625926
202105
0.913978
202106
0.687037
202107
1.734767
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
plt . figure ( figsize = ( 10 , 8 ))
plt . plot ( data . groupby ( 'month' ). mean ())
plt . show ()
지도 위 시각화
시군별 확진자수 평균에 따라 원 크기로 각 위치에 지도로 표시합니다.
라이브러리: follium 이용
folium을 이용하려면 위도와 경도를 알아야 합니다.
강원도 춘천 (+16 km), 위도 37.757687 경도 128.873749
강원도 강릉 (+16 km), 위도 38.078366 경도 128.228302
강원도 인제 (+16 km), 위도 38.214446 경도 128.571625
강원도 속초 (+16 km), 위도 37.348326 경도 127.928925
강원도 원주 (+16 km), 위도 37.53151 경도 129.098969
# dat = data[data['시군명'] == '춘천' | data['시군명'] == '강릉']
data = data [ data [ '시군명' ]. isin ([ '춘천' , '강릉' , '인제' , '속초' , '원주' ])]
data
시군명
확진시기
확진자수
month
0
춘천
2020-02-22
2
202002
1
원주
2020-02-22
0
202002
2
강릉
2020-02-22
0
202002
5
속초
2020-02-22
2
202002
15
인제
2020-02-22
0
202002
...
...
...
...
...
9450
춘천
2021-07-31
8
202107
9451
원주
2021-07-31
8
202107
9452
강릉
2021-07-31
16
202107
9455
속초
2021-07-31
1
202107
9465
인제
2021-07-31
0
202107
2630 rows × 4 columns
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
</svg>
fea1 = { '춘천' : 37.757687 , '강릉' : 38.078366 , '인제' : 38.214446 , '속초' : 37.348326 , '원주' : 37.53151 }
fea2 = { '춘천' : 128.873749 , '강릉' : 128.228302 , '인제' : 128.571625 , '속초' : 127.928925 , '원주' : 129.098969 }
counts = data . groupby ( '시군명' ). mean ()[ '확진자수' ]
counts
시군명
강릉 1.545627
속초 0.671103
원주 1.866920
인제 0.123574
춘천 1.134981
Name: 확진자수, dtype: float64
import folium
map = folium . Map ( location = [ 37.8 , 128.5 ], zoom_start = 10 ) #지도 초기 위치
for i in counts . index :
lat = fea1 [ i ] #위도
long = fea2 [ i ] #경도
folium . CircleMarker ([ lat , long ], radius = counts [ i ] * 50 , color = 'red' , fill = True ). add_to ( map )
map
<iframe src="about:blank" style="position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;" data-html=%3C%21DOCTYPE%20html%3E%0A%3Chead%3E%20%20%20%20%0A%20%20%20%20%3Cmeta%20http-equiv%3D%22content-type%22%20content%3D%22text/html%3B%20charset%3DUTF-8%22%20/%3E%0A%20%20%20%20%3Cscript%3EL_PREFER_CANVAS%3Dfalse%3B%20L_NO_TOUCH%3Dfalse%3B%20L_DISABLE_3D%3Dfalse%3B%3C/script%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//cdn.jsdelivr.net/npm/leaflet%401.4.0/dist/leaflet.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//code.jquery.com/jquery-1.12.4.min.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js%22%3E%3C/script%3E%0A%20%20%20%20%3Cscript%20src%3D%22https%3A//cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.js%22%3E%3C/script%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//cdn.jsdelivr.net/npm/leaflet%401.4.0/dist/leaflet.css%22/%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css%22/%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css%22/%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css%22/%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//cdnjs.cloudflare.com/ajax/libs/Leaflet.awesome-markers/2.0.2/leaflet.awesome-markers.css%22/%3E%0A%20%20%20%20%3Clink%20rel%3D%22stylesheet%22%20href%3D%22https%3A//rawcdn.githack.com/python-visualization/folium/master/folium/templates/leaflet.awesome.rotate.css%22/%3E%0A%20%20%20%20%3Cstyle%3Ehtml%2C%20body%20%7Bwidth%3A%20100%25%3Bheight%3A%20100%25%3Bmargin%3A%200%3Bpadding%3A%200%3B%7D%3C/style%3E%0A%20%20%20%20%3Cstyle%3E%23map%20%7Bposition%3Aabsolute%3Btop%3A0%3Bbottom%3A0%3Bright%3A0%3Bleft%3A0%3B%7D%3C/style%3E%0A%20%20%20%20%0A%20%20%20%20%3Cmeta%20name%3D%22viewport%22%20content%3D%22width%3Ddevice-width%2C%0A%20%20%20%20%20%20%20%20initial-scale%3D1.0%2C%20maximum-scale%3D1.0%2C%20user-scalable%3Dno%22%20/%3E%0A%20%20%20%20%3Cstyle%3E%23map_6c958fba40804be89170cd4abb85df3a%20%7B%0A%20%20%20%20%20%20%20%20position%3A%20relative%3B%0A%20%20%20%20%20%20%20%20width%3A%20100.0%25%3B%0A%20%20%20%20%20%20%20%20height%3A%20100.0%25%3B%0A%20%20%20%20%20%20%20%20left%3A%200.0%25%3B%0A%20%20%20%20%20%20%20%20top%3A%200.0%25%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%3C/style%3E%0A%3C/head%3E%0A%3Cbody%3E%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%3Cdiv%20class%3D%22folium-map%22%20id%3D%22map_6c958fba40804be89170cd4abb85df3a%22%20%3E%3C/div%3E%0A%3C/body%3E%0A%3Cscript%3E%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20var%20bounds%20%3D%20null%3B%0A%20%20%20%20%0A%0A%20%20%20%20var%20map_6c958fba40804be89170cd4abb85df3a%20%3D%20L.map%28%0A%20%20%20%20%20%20%20%20%27map_6c958fba40804be89170cd4abb85df3a%27%2C%20%7B%0A%20%20%20%20%20%20%20%20center%3A%20%5B37.8%2C%20128.5%5D%2C%0A%20%20%20%20%20%20%20%20zoom%3A%2010%2C%0A%20%20%20%20%20%20%20%20maxBounds%3A%20bounds%2C%0A%20%20%20%20%20%20%20%20layers%3A%20%5B%5D%2C%0A%20%20%20%20%20%20%20%20worldCopyJump%3A%20false%2C%0A%20%20%20%20%20%20%20%20crs%3A%20L.CRS.EPSG3857%2C%0A%20%20%20%20%20%20%20%20zoomControl%3A%20true%2C%0A%20%20%20%20%20%20%20%20%7D%29%3B%0A%0A%0A%20%20%20%20%0A%20%20%20%20var%20tile_layer_79e2c2550fed4ee48a7bf028e2765cae%20%3D%20L.tileLayer%28%0A%20%20%20%20%20%20%20%20%27https%3A//%7Bs%7D.tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png%27%2C%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%22attribution%22%3A%20null%2C%0A%20%20%20%20%20%20%20%20%22detectRetina%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22maxNativeZoom%22%3A%2018%2C%0A%20%20%20%20%20%20%20%20%22maxZoom%22%3A%2018%2C%0A%20%20%20%20%20%20%20%20%22minZoom%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%22noWrap%22%3A%20false%2C%0A%20%20%20%20%20%20%20%20%22opacity%22%3A%201%2C%0A%20%20%20%20%20%20%20%20%22subdomains%22%3A%20%22abc%22%2C%0A%20%20%20%20%20%20%20%20%22tms%22%3A%20false%0A%7D%29.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20circle_marker_51ccb625fc014a879eaaae54eb6b157e%20%3D%20L.circleMarker%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B38.078366%2C%20128.228302%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%22bubblingMouseEvents%22%3A%20true%2C%0A%20%20%22color%22%3A%20%22red%22%2C%0A%20%20%22dashArray%22%3A%20null%2C%0A%20%20%22dashOffset%22%3A%20null%2C%0A%20%20%22fill%22%3A%20true%2C%0A%20%20%22fillColor%22%3A%20%22red%22%2C%0A%20%20%22fillOpacity%22%3A%200.2%2C%0A%20%20%22fillRule%22%3A%20%22evenodd%22%2C%0A%20%20%22lineCap%22%3A%20%22round%22%2C%0A%20%20%22lineJoin%22%3A%20%22round%22%2C%0A%20%20%22opacity%22%3A%201.0%2C%0A%20%20%22radius%22%3A%2077.28136882129277%2C%0A%20%20%22stroke%22%3A%20true%2C%0A%20%20%22weight%22%3A%203%0A%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20circle_marker_1eff62cd2b8e4d36bc66ffa80d412a44%20%3D%20L.circleMarker%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B37.348326%2C%20127.928925%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%22bubblingMouseEvents%22%3A%20true%2C%0A%20%20%22color%22%3A%20%22red%22%2C%0A%20%20%22dashArray%22%3A%20null%2C%0A%20%20%22dashOffset%22%3A%20null%2C%0A%20%20%22fill%22%3A%20true%2C%0A%20%20%22fillColor%22%3A%20%22red%22%2C%0A%20%20%22fillOpacity%22%3A%200.2%2C%0A%20%20%22fillRule%22%3A%20%22evenodd%22%2C%0A%20%20%22lineCap%22%3A%20%22round%22%2C%0A%20%20%22lineJoin%22%3A%20%22round%22%2C%0A%20%20%22opacity%22%3A%201.0%2C%0A%20%20%22radius%22%3A%2033.55513307984791%2C%0A%20%20%22stroke%22%3A%20true%2C%0A%20%20%22weight%22%3A%203%0A%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20circle_marker_81ad60aad04748d69ae6b11a231182a5%20%3D%20L.circleMarker%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B37.53151%2C%20129.098969%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%22bubblingMouseEvents%22%3A%20true%2C%0A%20%20%22color%22%3A%20%22red%22%2C%0A%20%20%22dashArray%22%3A%20null%2C%0A%20%20%22dashOffset%22%3A%20null%2C%0A%20%20%22fill%22%3A%20true%2C%0A%20%20%22fillColor%22%3A%20%22red%22%2C%0A%20%20%22fillOpacity%22%3A%200.2%2C%0A%20%20%22fillRule%22%3A%20%22evenodd%22%2C%0A%20%20%22lineCap%22%3A%20%22round%22%2C%0A%20%20%22lineJoin%22%3A%20%22round%22%2C%0A%20%20%22opacity%22%3A%201.0%2C%0A%20%20%22radius%22%3A%2093.34600760456274%2C%0A%20%20%22stroke%22%3A%20true%2C%0A%20%20%22weight%22%3A%203%0A%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20circle_marker_3dc9a4590ac64be28d013f8fe8bd80d3%20%3D%20L.circleMarker%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B38.214446%2C%20128.571625%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%22bubblingMouseEvents%22%3A%20true%2C%0A%20%20%22color%22%3A%20%22red%22%2C%0A%20%20%22dashArray%22%3A%20null%2C%0A%20%20%22dashOffset%22%3A%20null%2C%0A%20%20%22fill%22%3A%20true%2C%0A%20%20%22fillColor%22%3A%20%22red%22%2C%0A%20%20%22fillOpacity%22%3A%200.2%2C%0A%20%20%22fillRule%22%3A%20%22evenodd%22%2C%0A%20%20%22lineCap%22%3A%20%22round%22%2C%0A%20%20%22lineJoin%22%3A%20%22round%22%2C%0A%20%20%22opacity%22%3A%201.0%2C%0A%20%20%22radius%22%3A%206.178707224334601%2C%0A%20%20%22stroke%22%3A%20true%2C%0A%20%20%22weight%22%3A%203%0A%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20var%20circle_marker_eed69f34920d4d4589a7d5c81534d5ed%20%3D%20L.circleMarker%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B37.757687%2C%20128.873749%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%22bubblingMouseEvents%22%3A%20true%2C%0A%20%20%22color%22%3A%20%22red%22%2C%0A%20%20%22dashArray%22%3A%20null%2C%0A%20%20%22dashOffset%22%3A%20null%2C%0A%20%20%22fill%22%3A%20true%2C%0A%20%20%22fillColor%22%3A%20%22red%22%2C%0A%20%20%22fillOpacity%22%3A%200.2%2C%0A%20%20%22fillRule%22%3A%20%22evenodd%22%2C%0A%20%20%22lineCap%22%3A%20%22round%22%2C%0A%20%20%22lineJoin%22%3A%20%22round%22%2C%0A%20%20%22opacity%22%3A%201.0%2C%0A%20%20%22radius%22%3A%2056.749049429657795%2C%0A%20%20%22stroke%22%3A%20true%2C%0A%20%20%22weight%22%3A%203%0A%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.addTo%28map_6c958fba40804be89170cd4abb85df3a%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%0A%3C/script%3E onload="this.contentDocument.open();this.contentDocument.write( decodeURIComponent(this.getAttribute('data-html')));this.contentDocument.close();" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
지도를 보면 인제와 동해는 확진자수가 많고 속초는 적은 것을 알 수 있습니다.
댓글남기기