Nerdy

[R] 오픈 API를 활용한 코로나 19 사망자 수 그래프 그리기 본문

R

[R] 오픈 API를 활용한 코로나 19 사망자 수 그래프 그리기

뚱인데요? 2022. 6. 23. 13:02
728x90

공공데이터 포털 사이트에서 신청한 코로나 19 국내발생현황(사망) 오픈 API 데이터를 가지고 간단하게 그래프를 그려보도록 한다.

 

신청방법은 이전에 올린 글을 참고하면 된다.

https://whiplash-bd.tistory.com/35

 

공공데이터포털 오픈 API 신청 방법 (JSON)

수 많은 데이터들이 모여 있고 볼 수 있는 공공데이터포털에서 오픈 API를 신청하는 방법을 알고자 한다. # 공공데이터포털 사이트 https://www.data.go.kr/index.do 공공데이터 포털 국가에서 보유하고

whiplash-bd.tistory.com

 

먼저 승인된 신청 데이터를 누르고 상세내용을 확인한다.

 

 

신청 데이터 상세보기로 들어가면 서비스 정보를 볼 수 있으며 json URL을 얻는 방법은 인증키를 넣어주면 된다.

 

 

참고문서에 'Open API활용가이드 코로나19 국내발생현황(사망) 조회서비스 v1.2.docx' 문서를 다운 받고 내용을 보면 데이터 구성을 볼 수 있는 'c)응답 메시지 명세'와 json URL을 얻는 방법을 알 수 있는 'd)요청/응답 메시지 예제'를 잘 보면 된다.

 

d) 요청/응답 메시지 예제 를 보면 요청메시지에 URL이 있다. 이 URL 뒷쪽에 '=인증키(URL Encode)'라고 적혀 있는데 개발계정 상세보기에 적혀 있는 일반인증키(Encoding)를 복사한 후 이 부분에 붙여서 주소창에 입력을 하면 응답메시지 처럼 똑같은 메시지를 받을 수 있으며 이 주소창이 json URL이라고 보면 된다.

 

혹시나 본인의 인증키 발급이 없거나 잊어버린 경우 마이페이지에서 인증키 발급현황을 들어가 본인의 인증키 현황을 확인할 수 있고 발급도 가능하다.

 

 

이제 json URL도 구했으니 이를 활용한 R plot을 간단하게 만들어보도록 한다.

 

먼저 오픈 API 데이터 구성은 아래와 같다.

 

항목명(영문) 항목명(국문) 항목크기 항목구분 샘플데이터 항목설명
resultCode 결과코드 2 1 00 결과코드
resultMsg 결과메세지 50 1 조회성공 결과메시지
resultCnt 결과 개수 4 1 1 결과 개수
mmddhh 기준일시 20 1 04.11. 00 데이터 조회 기준 일시
mmdd1 일자_1 10 1 04.05 데이터 조회 기준일 – 6
cnt1 일일발생현황_1 10 1 469 일일
rate1 인구 10만명당 발생현황 _1 10 1 0.91 인구 10만명당
mmdd2 일자_2 10 1 04.06. 데이터 조회 기준일 – 5
cnt2 일일발생현황_2 10 1 393 일일
rate2 인구 10만명당 발생현황 _2 10 1 0.76 인구 10만명당
mmdd3 일자_3 10 1 04.07. 조회 기준일 – 4
cnt3 일일발생현황_3 10 1 323 일일
rate3 인구 10만명당 발생현황 _3 10 1 0.63 인구 10만명당
mmdd4 일자_4 10 1 04.08. 조회 기준일 – 3
cnt4 일일발생현황_4 10 1 282 일일
rate4 인구 10만명당 발생현황 _4 10 1 0.55 인구 10만명당
mmdd5 일자_5 10 1 04.09. 조회 기준일 – 2
cnt5 일일발생현황_5 10 1 287 일일
rate5 인구 10만명당 발생현황 _5 10 1 0.56 인구 10만명당
mmdd6 일자_6 10 1 04.10. 조회 기준일 – 1
cnt6 일일발생현황_6 10 1 237 일일
rate6 인구 10만명당 발생현황 _6 10 1 0.46 인구 10만명당
mmdd7 일자_7 10 1 04.11. 조회 기준일
cnt7 일일발생현황_7 10 1 432 일일
rate7 인구 10만명당 발생현황 _7 10 1 0.84 인구 10만명당
mmdd8 일자_8 10 1 주간일평균 주간일평균
cnt8 일일발생현황_8 10 1 346 일일
rate8 인구 10만명당 발생현황_8 10 1 0.67 인구 10만명당

 

json을 활용하기 위해 R에서 jsonlite 패키지를 다운 받고 패키지 로딩을 해준 뒤 fromJSON 함수를 사용해 긁어온 json URL를 넣어준다.

install.packages(jsonlite) #패키지 설치
library(jsonlite) # 패키지 로딩


corona_df <- fromJSON("http://apis.data.go.kr/1790387/covid19CurrentStatusDeaths/...") # 이하 생략

 

객체를 생성하여 넣어준 뒤 구조를 확인한 뒤 사용할 데이터프레임을 추출해서 또 다른 변수에 담는다.

class(corona_df) # 리스트
str(corona_df)

# Result
List of 1
 $ response:List of 4
  ..$ resultMsg : chr "조회성공"
  ..$ result    :'data.frame':	1 obs. of  25 variables:
  .. ..$ cnt3  : chr "14"
  .. ..$ cnt4  : chr "10"
  .. ..$ cnt1  : chr "9"
  .. ..$ cnt2  : chr "11"
  .. ..$ cnt7  : chr "14"
  .. ..$ cnt8  : chr "11"
  .. ..$ cnt5  : chr "12"
  .. ..$ cnt6  : chr "11"
  .. ..$ rate4 : chr "0.02"
  .. ..$ rate5 : chr "0.02"
  .. ..$ rate6 : chr "0.02"
  .. ..$ rate7 : chr "0.03"
  .. ..$ rate1 : chr "0.02"
  .. ..$ rate2 : chr "0.02"
  .. ..$ rate3 : chr "0.03"
  .. ..$ rate8 : chr "0.02"
  .. ..$ mmdd4 : chr "06.20"
  .. ..$ mmdd5 : chr "06.21"
  .. ..$ mmdd6 : chr "06.22"
  .. ..$ mmdd7 : chr "06.23"
  .. ..$ mmdd1 : chr "06.17"
  .. ..$ mmdd2 : chr "06.18"
  .. ..$ mmdd3 : chr "06.19"
  .. ..$ mmdd8 : chr "주간일평균"
  .. ..$ mmddhh: chr "6.23.00시"
  ..$ resultCnt : chr "1"
  ..$ resultCode: chr "1"
  
# 사용할 데이터프레임 추출
df <- corona_df$response$result
class(df) # data.frame

 

 

추출된 데이터프레임은 정렬이 안되어 있어 따로 정렬 작업을 다시 해줬다.

mmdd <- c(df$mmdd1, df$mmdd2, df$mmdd3, df$mmdd4, df$mmdd5, df$mmdd6, df$mmdd7) # 데이터 조회 기준일
cnt <- c(df$cnt1, df$cnt2, df$cnt3, df$cnt4, df$cnt5, df$cnt6, df$cnt7) # 일일 발생현황
rate <- c(df$rate1, df$rate2, df$rate3, df$rate4, df$rate5, df$rate6, df$rate7) # 인구 10만명당 발생현황

covid_deaths <- data.frame(mmdd, cnt, rate, stringsAsFactors = F)

#    mmdd cnt rate
# 1 06.17   9 0.02
# 2 06.18  11 0.02
# 3 06.19  14 0.03
# 4 06.20  10 0.02
# 5 06.21  12 0.02
# 6 06.22  11 0.02
# 7 06.23  14 0.03

 

일일 발생현황과 인구 10만명당 발생현황을 간단하게 plot을 그려본다.

par(mfrow=c(2,1)) # Multiple plot 2행 1열

# 일일 발생현황 plot
x = covid_deaths$mmdd
y1 = covid_deaths$cnt
plot(x, y1, type = 'l', col = 'red', main = '코로나 19 사망자 일일 발생현황',
     xlab = '날짜', ylab = '일일 사망자', cex.main = 2, col.main = "red",
     cex.lab = 1.5, col.lab = 'red')

# 인구 10만명당 발생현황 plot
x = covid_deaths$mmdd
y2 = covid_deaths$rate
plot(x, y2, type = 'l', col = 'darkred',
     main = '인구 10만명당 코로나 19 사망자 발생현황',
     xlab = '날짜', ylab = '인구 10만명당 발생현황',
     cex.main = 2, col.main = "darkred", cex.lab = 1.5, col.lab = 'darkred')

 

■ 결과

728x90