티스토리 뷰

 

지난 포스팅에서는 COVID-19가 무엇인지에대해서 적어보았는데요, 이번 포스팅에서는 데이터를 다운받고 준비하는 과정에 대해 이야기하려고합니다. 분석이나 시각화에 앞서 데이터를 손봐야하기 때문이죠


코로나19와 관련된 데이터는 다양한 기관에서 현재 제공을 해주고있습니다. 그중에서 저는 datahub의 covid-19 데이터를 받아서 사용을 했습니다. 데이터는 csv 파일의 다운로드 링크를 이용하면 R에서 바로 데이터를 받아 볼 수 있습니다. 

> mydata_raw <- read.csv('https://datahub.io/core/covid-19/r/time-series-19-covid-combined.csv', stringsAsFactors = F)
> mydata_raw %>% dim
[1] 23496     8
> mydata_raw %>% head
        Date Country.Region Province.State Lat Long Confirmed Recovered Deaths
1 2020-01-22    Afghanistan                 33   65         0         0      0
2 2020-01-23    Afghanistan                 33   65         0         0      0
3 2020-01-24    Afghanistan                 33   65         0         0      0
4 2020-01-25    Afghanistan                 33   65         0         0      0
5 2020-01-26    Afghanistan                 33   65         0         0      0
6 2020-01-27    Afghanistan                 33   65         0         0      0

2020-04-21 현재 23496 * 8 데이터 크기를 가지고있음을 확인했는데요.

1.Date
2.Country.Region
3.Province.State
4.Lat
5.Long
6.Confirmed
7.Recovered
8.Deaths

이 데이터중에서 분석에 사용할 부분은 Date, Country.Region, Confirmed, Recovered, Deaths입니다. Province.State로 더 구체적인 지역으로 구분되어 표기된 경우가 있으나 나라별 상황을 살펴보고싶으니 무시하고 진행할예정입니다. 무시하기 위해서는 동일한 Province.State 에 대해서 합산을 하는 과정을 거쳐줍니다. 합산은 aggregation()함수를 이용했는데, 자세한 사용법을 알고싶다면 여기로.

> mydata_aggregated_Confirmed <- aggregate(mydata_raw$Confirmed, by=list(mydata_raw$Date, mydata_raw$Country.Region), FUN=sum)
> mydata_aggregated_Recovered <- aggregate(mydata_raw$Recovered, by=list(mydata_raw$Date, mydata_raw$Country.Region), FUN=sum)
> mydata_aggregated_Deaths <- aggregate(mydata_raw$Deaths, by=list(mydata_raw$Date, mydata_raw$Country.Region), FUN=sum)

Aggregation을 진행한 Confirmed, Recovered, Deaths 값을 얻어주고, 병합합니다.

> mydata_aggregated_tem <- full_join(mydata_aggregated_Confirmed,
+                                        mydata_aggregated_Recovered,
+                                        by = c('Group.1', 'Group.2'))
> mydata_aggregated <- full_join(mydata_aggregated_tem,
+                                mydata_aggregated_Deaths,
+                                by = c('Group.1', 'Group.2'))
> colnames(mydata_aggregated) <- c('Date', 'Country', 'Confirmed', 'Recovered', 'Deaths')

이렇게 병합한 데이터는 크기가 줄어 16465 * 5 dimension을 가지고있습니다.

> mydata_aggregated %>% head
        Date     Country Confirmed Recovered Deaths
1 2020-01-22 Afghanistan         0         0      0
2 2020-01-23 Afghanistan         0         0      0
3 2020-01-24 Afghanistan         0         0      0
4 2020-01-25 Afghanistan         0         0      0
5 2020-01-26 Afghanistan         0         0      0
6 2020-01-27 Afghanistan         0         0      0
> mydata_aggregated %>% dim
[1] 16465     5

> mydata_aggregated$Country %>% 
+   unique %>% 
+   length
[1] 185

데이터에는 총 185국의 정보가 들어있고요,

 

> mydata_aggregated$Date %>% min
[1] "2020-01-22"
> mydata_aggregated$Date %>% max
[1] "2020-04-19"

2020-01-22부터 2020-04-19까지의 데이터가 들어있습니다.


이 데이터에서 더 추가되었으면 하는 부분이 있다고 하면

1. 각 국가별 날짜순서에 맞는 no
2. Active 정보
  *Active = Confirmed - ( Recovered + Deaths )
3. new confirmed / new recover / new deaths 

정도가 있을 것 같습니다.

 

mydata_aggregated$Date.no <- seq(length(unique(mydata_aggregated$Date)))
mydata_aggregated$Active <- mydata_aggregated$Confirmed - (mydata_aggregated$Recovered + mydata_aggregated$Deaths)

no, Active정보는 다음과 같이 간단하게 추가를 할 수 있을 것 같고,

 

mydata_tb <- NULL
date_len <- mydata_aggregated$Date %>% unique %>% length

for (c in unique(mydata_aggregated$Country)){
  tem <- subset(mydata_aggregated, mydata_aggregated$Country==c)
  
  tem$Confirmed.new.day <- tem$Confirmed - matrix(c(0,tem$Confirmed[-length(tem$Confirmed)]), ncol = 1)
  tem$Recovered.new.day <- tem$Recovered - matrix(c(0,tem$Recovered[-length(tem$Recovered)]), ncol = 1)
  tem$Deaths.new.day <- tem$Deaths - matrix(c(0,tem$Deaths[-length(tem$Deaths)]), ncol = 1)
  
  tem$Confirmed.new.week <- tem$Confirmed - matrix(c(rep(0,6),tem$Confirmed[seq(-date_len+5,-date_len)]), ncol = 1)
  tem$Recovered.new.week <- tem$Recovered - matrix(c(rep(0,6),tem$Recovered[seq(-date_len+5,-date_len)]), ncol = 1)
  tem$Deaths.new.week <- tem$Deaths - matrix(c(rep(0,6),tem$Deaths[seq(-date_len+5,-date_len)]), ncol = 1)
  
  mydata_tb <- rbind(mydata_tb,tem)
  
}

new값은 다음과 같이 계산을 해주었습니다. 다만 업데이트가 제때 되지 않아서인지 0으로 표기되는 날들도 있어 그런 문제를 해결하기 위한 방법으로 week단위로도 같이 데이터를 생성했습니다.

 

> mydata_tb %>% 
+   subset(mydata_tb$Country=='Korea, South') %>% 
+   tail
           Date      Country Confirmed Recovered Deaths Date.no Active Confirmed.new.day Recovered.new.day Deaths.new.day Confirmed.new.week Recovered.new.week Deaths.new.week
8094 2020-04-14 Korea, South     10564      7534    222      84   2808                27                87              5                180                758              22
8095 2020-04-15 Korea, South     10591      7616    225      85   2750                27                82              3                168                643              21
8096 2020-04-16 Korea, South     10613      7757    229      86   2627                22               141              4                163                640              21
8097 2020-04-17 Korea, South     10635      7829    230      87   2576                22                72              1                155                586              19
8098 2020-04-18 Korea, South     10653      7937    232      88   2484                18               108              2                141                569              18
8099 2020-04-19 Korea, South     10661      8042    234      89   2385                 8               105              2                124                595              17

2020-04-19 Confirmed.new.day 에서 1 digit인 8명 확진자 발생이 보이네요!


그럼 다음 포스팅에서는 이 데이터를 이용해서 그래프를 본격적으로 그려보도록 하겠습니다.

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함