티스토리 뷰
지난 포스팅에서는 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명 확진자 발생이 보이네요!
그럼 다음 포스팅에서는 이 데이터를 이용해서 그래프를 본격적으로 그려보도록 하겠습니다.
'R' 카테고리의 다른 글
R | round()를 이용한 반올림 (0) | 2020.05.06 |
---|---|
R | COVID-19 데이터로 무엇을 할 수 있을까 | 3. 전체적인 상황을 볼 수 있는 stacked area plot (0) | 2020.04.22 |
R | str_match()를 이용해 원하는 단어 추출하기(stringr) (0) | 2020.04.13 |
R | COVID-19 데이터로 무엇을 할 수 있을까 | 1. 코로나바이러스감염증이란? (0) | 2020.04.01 |
R | prop.table()을 이용해 proportion/비율/퍼센트 구하기 (0) | 2020.03.31 |
- Total
- Today
- Yesterday
- plot
- geom_line
- Excel
- 숫자
- Python
- hist
- Order
- covid
- 데이터
- format
- Heatmap
- coronavirus
- Command
- 2진수
- for loop
- visualizing
- 코로나바이러스
- SEQ
- r
- BIOINFORMATICS
- comma
- geom_bar
- 파이썬
- Visualization
- data
- 엑셀
- 팟빵
- Cast
- Coding
- RStudio
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |