본문 바로가기
문송충의 코딩하기/파이썬 데이터 분석

공공데이터 Open API를 활용한 국내 코로나 확진자 수 가져오기 feat 파이썬

by 동장군님 2020. 9. 1.
728x90
반응형

코로나가 다시 미쳐 돌아가고 있다. 거의 끝났다 싶었는데 다시 확진자 수가 폭증하고 있고, 이에 따라 나도 계속해서 재택근무를 하고 있다. 일이 크게 없어서 파이썬으로 코로나 확진자 수가 일별로 어떻게 되는지 공공데이터 API를 통해서 가져와 보도록 하겠다. 뭐 예전 글에서도 공공데이터 갖고 한 분석 내용이 있기 때문에 크게 어려운 점은 없다. 아래 내가 작성한 코드 잘 따라 하면 된다. 

 

pixabay

 

 

1. 공공데이타 API Key 발급

항상 그랫듯이 아래 사이트에 들어간 다음 활용신청을 통해 API 사용할 수 있는 Key 값을 받아야 된다. 발급만 받으면 그 자리에서 바로 활용이 가능하다. 아래 링크에서 신청하기 바란다. 

https://data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15043376

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

data.go.kr

 

2. 데이터 추출

API 키 값을 받은 다음 아래 코드를 실행하면 딕셔너리 형태로 4월부터 8월까지의 코로나 확진 관련 데이터를 받아 볼 수가 있을 것이다.

from urllib.request import urlopen
from urllib.parse import urlencode, unquote, quote_plus
import urllib
import requests
import pandas as pd
import xmltodict
import json

key='~'
url = f'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson?serviceKey={key}&'
queryParams = urlencode({ quote_plus('pageNo') : 1, quote_plus('numOfRows') : 10,quote_plus('startCreateDt') : '20200801',
                        quote_plus('endCreateDt') : '20200831'})

url2 = url + queryParams
response = urlopen(url2) 
results = response.read().decode("utf-8")

results_to_json = xmltodict.parse(results)
data = json.loads(json.dumps(results_to_json))

3. 데이터 전처리

전체 데이타 중에서 날짜, 누적 확진자 수, 격리 해제 환자 수, 치료 중 환자 수, 사망자 수만 가져오겠다. 그리고 그다음 sort_values 함수를 통해 날짜를 오름차순으로 정렬해보도록 하겠다. 여기 데이터에서 문제는 모든 데이터가 누적 기준이다. 그래서 날짜별 확진자 수와 사망자 수를 구해야 되는데 이거는 아래 코드 내 Shift 함수를 사용하면 쉽게 구할 수 있을 것이다. 

corona=data['response']['body']['items']['item']

Date=[]
Cnt=[]
clear_cnt=[]
care_cnt=[]
death_cnt=[]
for i in corona:
    Date.append(i['stateDt'])
    Cnt.append(i['decideCnt'])
    clear_cnt.append(i['clearCnt'])
    care_cnt.append(i['careCnt'])
    death_cnt.append(i['deathCnt'])

df=pd.DataFrame([Date,Cnt,clear_cnt,care_cnt,death_cnt]).T
df.columns=['Date','acc_cnt','clear_cnt','care_cnt','death_cnt']
df=df.sort_values(by='Date', ascending=True)

#Date 열 데이타 날짜 데이터 타입으로 바꾸기
import datetime
df2['Date']=df2['Date'].apply(lambda x: datetime.datetime.strptime(x, '%Y%m%d'))

#날짜 별 확진자/사망자 수 구하기
df['acc_cnt']=df['acc_cnt'].astype(int)
df['death_cnt']=df['death_cnt'].astype(int)
df['확진자 수']=(df.acc_cnt-df.acc_cnt.shift()).fillna(0)
df['사망자 수']=(df.death_cnt-df.death_cnt.shift()).fillna(0)

4. 날짜별 확진자 수, 사망자 수 시각화

날짜 별 확진자 수

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager, rc
from matplotlib import style
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)

plt.rcParams["figure.figsize"] = (15,10)
ax  = df2.plot(x='Date',y=['확진자 수'])
ax.set_ylabel("누적 확진자 수", color="r")

날짜 별 사망자 수

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import font_manager, rc
from matplotlib import style
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)

plt.rcParams["figure.figsize"] = (15,10)
ax  = df2.plot(x='Date',y=['사망자 수'])
ax.set_ylabel("사망자 수", color="r")

728x90
반응형

댓글