일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ISLR
- 확률실험
- Bias-Variance Tradeoff
- R문법
- R mutate
- R select
- R ggplot2
- R dplyr
- ggsurvplot
- ggplot2
- 콕스비례모형
- 이산형 확률분포
- R
- 강화학습 #추천서적 #강화학습인액션
- 데이터 핸들링
- 의사결정나무
- CrossValidation
- R 연습문제
- 생존분석
- 카플란마이어
- ggplot()
- geom_errorbar
- 생존그래프
- R 결측치
- 주식데이터시각화
- 교차타당성
- 미국 선거데이터
- 데이터핸들링
- R filter
- dplyr
- Today
- Total
Must Learning With Statistics
[R ggplot2 시각화] 대한민국 코로나 데이터 시각화 본문
이번 포스팅은 대한민국 코로나 바이러스 확진자 데이터를 이용한 시각화를 진행해보도록 하겠습니다. 데이터는 다음 링크에서 받으시면 됩니다.
데이터 다운로드 링크: https://www.kaggle.com/kimdanny/covid19-in-south-korea
1. 데이터 불러오기 및 패키지 로딩
library(ggplot2)
library(dplyr)
library(reshape)
Corona = read.csv("D:\\Dropbox\\DATA SET(Dropbox)\\covid19-in-south-korea\\Corona_rok.csv")
dates | confirmed | deaths | recovered |
---|---|---|---|
1/22/20 | 1 | 0 | 0 |
1/23/20 | 1 | 0 | 0 |
1/24/20 | 2 | 0 | 0 |
1/25/20 | 2 | 0 | 0 |
1/26/20 | 3 | 0 | 0 |
1/27/20 | 4 | 0 | 0 |
데이터 셋은 다음과 같습니다. 날짜, 확진자 수, 사망자 수, 완치자 수가 기록되어 있는 간단한 데이터입니다.
2. 데이터 정리 및 추가
날짜 데이터는 바로 ’Date’타입으로 변경시켜주도록 하겠습니다. 날짜 포맷만 잘 맞추어주면 되는 간단한 작업입니다.
'data.frame': 30 obs. of 4 variables:
$ dates : Date, format: "2020-01-22" "2020-01-23" ...
$ confirmed: int 1 1 2 2 3 4 4 4 4 11 ...
$ deaths : int 0 0 0 0 0 0 0 0 0 0 ...
$ recovered: int 0 0 0 0 0 0 0 0 0 0 ...
날짜데이터를 기반으로 요일 데이터 및 주중, 주말을 나타내는 변수도 만들어보도록 하겠습니다.
Corona$day = format(Corona$dates, format = "%a")
Corona$day = factor(Corona$day, levels = c("일","월","화","수","목","금","토"))
Corona$Weekend = ifelse(Corona$day %in% c("일","토"),"Weekend","Weekdays")
dates | confirmed | deaths | recovered | day | Weekend |
---|---|---|---|---|---|
2020-01-22 | 1 | 0 | 0 | 수 | Weekdays |
2020-01-23 | 1 | 0 | 0 | 목 | Weekdays |
2020-01-24 | 2 | 0 | 0 | 금 | Weekdays |
2020-01-25 | 2 | 0 | 0 | 토 | Weekend |
2020-01-26 | 3 | 0 | 0 | 일 | Weekend |
2020-01-27 | 4 | 0 | 0 | 월 | Weekdays |
3. 시각화 1
geom_point, geom_smooth를 활용하면 간다하게 추세선을 표현할 수가 있습니다. 먼저 그래프 시각화를 위해 wide-form 가지고 있는 현재 데이터를 long-form으로 변경시켜주어야 합니다.
dates | day | Weekend | variable | value |
---|---|---|---|---|
2020-01-22 | 수 | Weekdays | confirmed | 1 |
2020-01-22 | 수 | Weekdays | deaths | 0 |
2020-01-22 | 수 | Weekdays | recovered | 0 |
2020-01-23 | 목 | Weekdays | confirmed | 1 |
2020-01-23 | 목 | Weekdays | deaths | 0 |
2020-01-23 | 목 | Weekdays | recovered | 0 |
ggplot(M_Corona) +
geom_point(aes(x = dates, y = value, col = variable)) +
geom_smooth(aes(x = dates, y = value, col = variable)) +
labs(col = "Types") +
xlab("Dates") + ylab("Counts") +
theme_bw() +
theme(text = element_text(size = 15, face = "bold"),
legend.position = c(0.2,0.80))
geom_point와 geom_smooth, 그리고 theme 옵션 명령어를 통해 다음과 같이 그래프를 만들 수가 있습니다. 확진자가 급등하는게 보이는군요…
4. 시각화 2
이번에는 주중과 주말에 차이가 있는지 없는지 파악해보도록 하겠습니다.
M_Corona %>%
mutate(variable = factor(variable , levels = c("confirmed","recovered","deaths"))) %>%
group_by(Weekend,variable) %>%
summarise(Count = sum(value)) %>%
mutate(Perc = Count / sum(Count))
# A tibble: 6 x 4
# Groups: Weekend [2]
Weekend variable Count Perc
<chr> <fct> <int> <dbl>
1 Weekdays confirmed 463 0.854
2 Weekdays recovered 78 0.144
3 Weekdays deaths 1 0.00185
4 Weekend confirmed 138 0.862
5 Weekend recovered 22 0.138
6 Weekend deaths 0 0
주중과 주말의 차이점을 확인하기 위해서는 위와같이 dplyr의 group_by, summarise, mutate를 활용하여 요약값을 계산해주어야 합니다. factor명령어의 경우 확진자 -> 완치자 -> 사망자 순으로 나타날 수 있도록 순서를 조정해주기 위하여 활용하였습니다.
M_Corona %>%
mutate(variable = factor(variable , levels = c("confirmed","recovered","deaths"))) %>%
group_by(Weekend,variable) %>%
summarise(Count = sum(value)) %>%
mutate(Perc = Count / sum(Count)) %>%
ggplot() +
geom_bar(aes(x = Weekend, y = Perc * 100, fill = variable ), stat = 'identity') +
geom_text(aes(x = Weekend, y = Perc * 100, fill = variable, label = paste0(round(Perc * 100,2),"%")),
position = position_stack(0.5)) +
scale_y_continuous(breaks = seq(0,100,by = 10)) +
labs(fill = "Type") + ylab("Percent (%)") +
theme_bw() +
theme(text = element_text(size = 15, face = "bold"))
시각화 3
마지막으로 확진자 증가량분에 대해 시각화를 해보도록 하겠습니다. 먼저 하루가 지날 떄마닫 몇명의 확진자가 증가하였는지에 대한 값을 계산해야합니다.
Increase = c()
Increase[1] = 0
for( i in 2:nrow(Corona)){
Increase[i] = Corona$confirmed[i] - Corona$confirmed[i-1]
}
Increase
[1] 0 0 1 0 1 1 0 0 0 7 1 3 0 1 3 4 1 0 1 2 1 0 0
[24] 0 0 1 1 1 0 73
간단하게 for문을 활용하면 증가량을 계산할 수가 있습니다.
만들어진 증가량(벡터)에 대해 names를 통해 벡터의 원소들에 인덱스 이름을 정해줍니다. 이를 하는 이유는 증가량이 0보다 큰 날짜들만 뽑았을 때에 대한 인덱스값을 유지시키기 위함입니다.
ggplot(NULL) +
geom_bar(aes(x = 1:length(Increase), y = Increase,fill = Increase), stat = 'identity') +
geom_text(aes(x = as.numeric(names(Increase2)), y = Increase2 + 1, label = Increase2),
stat = 'identity', size = 5) +
scale_fill_gradientn(colours = c("tan3","royalblue")) +
xlab("Days after") + ylab("Increase of Confirmed") +
theme_bw() +
theme(text = element_text(size = 15, face = "bold"))
한달이 되는 시점에서 확진자가 급증했습니다. 이 전염병이 하루 빨리 종식되기를 기원합니다.
'R Code' 카테고리의 다른 글
[R] 중고 자동차 데이터를 활용한 탐색적 자료분석 실전 예시 (1) | 2020.03.01 |
---|---|
[R ggplot2] 테슬라 주가 데이터를 활용한 시계열 자료 시각화 (4) | 2020.02.27 |
관광데이터를 이용한 R 연관규칙 분석 (2) | 2020.02.27 |
[R 대시보드] Flexdashboard 패지키를 활용한 R 대시보드 만들기 2편 (0) | 2020.02.09 |
[R 대시보드] Flexdashboard 패지키를 활용한 R 대시보드 만들기 1편 (0) | 2020.02.09 |