ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코로나 바이러스 데이터 분석 (누적확진자와 증가율 그래프)
    잡다R 2020. 3. 31. 02:38
    코로나 바이러스 데이터 분석


     지난 글에 이어 코로나 바이러스 데이터 분석을 진행합니다.

     날짜에 따라 각국의 코로나 바이러스 확진자 증가 또는 감소 상황이 어떤지 살펴보고 전일 대비 증가율을 추세선과 함께 살펴보겠습니다. 데이터는 kaggle 코로나 바이러스 데이터셋에서 3월 29일까지의 코로나 바이러스 데이터를 받아왔습니다.

     먼저 데이터와 tidyverse 라이브러리를 불러오도록 하겠습니다.

    covid19 <- read.csv("covid_19_data.csv")
    library(tidyverse)

     NA값이 있는지 살펴보고 str()함수를 이용하여 데이터를 개괄적으로 살펴봅니다.

    table(is.na(covid19))
    ## 
    ## FALSE 
    ## 80368
    str(covid19)
    ## 'data.frame':    10046 obs. of  8 variables:
    ##  $ SNo            : int  1 2 3 4 5 6 7 8 9 10 ...
    ##  $ ObservationDate: Factor w/ 68 levels "01/22/2020","01/23/2020",..: 1 1 1 1 1 1 1 1 1 1 ...
    ##  $ Province.State : Factor w/ 294 levels ""," Montreal, QC",..: 10 17 38 76 78 88 89 90 91 96 ...
    ##  $ Country.Region : Factor w/ 212 levels " Azerbaijan",..: 120 120 120 120 120 120 120 120 120 120 ...
    ##  $ Last.Update    : Factor w/ 1812 levels "1/22/2020 17:00",..: 1 1 1 1 1 1 1 1 1 1 ...
    ##  $ Confirmed      : num  1 14 6 1 0 26 2 1 4 1 ...
    ##  $ Deaths         : num  0 0 0 0 0 0 0 0 0 0 ...
    ##  $ Recovered      : num  0 0 0 0 0 0 0 0 0 0 ...

     날짜 데이터를 가지고 있는 ObservationDate column의 class가 factor로 되어 있습니다. 이를 날짜형 class로 변환하겠습니다.

    covid19$ObservationDate <- as.Date(covid19$ObservationDate, format = "%m/%d/%Y")

     다음으로 Confirmed column은 어떤 나라의 ‘주’ 또는 ‘시’ 등 지역마다 확진자 수를 나타낸 수치입니다. 국가별 확진자 수를 보기 위해 Province.State column이 아니라 Country.Region column을 기준으로 그룹핑하겠습니다. Confirmed는 누적된 숫자를 의미하기 때문에 일일이 전날 수치를 더해줄 필요는 없습니다.

     또한 코로나 바이러스 발생 국가가 202개 국이여서 모든 국가를 그래프로 보기 힘듭니다. 따라서 상위 10개 국가에 대해서만 그래프를 그려보면 다음과 같습니다.

    q <- covid19 %>% 
      group_by(Country.Region) %>%
      summarise(n = sum(Confirmed)) %>% 
      arrange(desc(n)) %>% 
      head(10)
    
    top10 <- as.character(unlist(q[,1]))
    
    # 그래프 끝에 텍스트를 쓰는 geom_dl() 함수를 위해 필요한 라이브러리
    library(directlabels)
    
    covid19top10 <- covid19 %>% 
      filter(Country.Region %in% top10) %>% 
      group_by(Country.Region, ObservationDate) %>% 
      summarise(confirmed_number = sum(Confirmed)) 
    
    
    covid19top10 %>% 
      ggplot(aes(x = ObservationDate,
                 y = confirmed_number,
                 color = Country.Region)) +
      geom_line(size = 1.2) +
      geom_dl(aes(label = Country.Region), method = list(dl.trans(x = x + 0.1), "last.points")) +
      theme_classic() +
      theme(legend.position = "none",
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank()) +
      xlim(as.Date("2020-01-22"), as.Date("2020-04-11"))

     그래프는 여러 매체를 통해 익히 알고 계실테지만, 미국의 확진자수 증가폭이 정말 가파릅니다. 그 뒤를 이탈리아와 스페인이 따르고 있고 독일과 프랑스는 조금 꺾인 모습이네요.

     반면 우리나라와 중국의 경우 증가폭이 굉장히 낮습니다. 모두 조금만 더 힘을 내서 함께 코로나 바이러스를 극복해요!


     증가율 그래프를 보면 다음과 같습니다.

    covid19top10 <- covid19top10 %>%
      group_by(Country.Region) %>% 
      mutate(ratio = confirmed_number/lag(confirmed_number))
    
    
    covid19top10 %>% 
      filter(Country.Region %in% c("South Korea", "US")) %>% 
      ggplot(aes(x = ObservationDate,
                 y = ratio,
                 color = Country.Region)) +
      geom_line(size = 1.2) +
      geom_dl(aes(label = Country.Region), method = list(dl.trans(x = x + 0.1), "last.points")) +
      theme_classic() +
      theme(legend.position = "none",
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank()) +
      xlim(as.Date("2020-01-22"), as.Date("2020-04-08")) +
      geom_hline(yintercept = 1)

     증가율은 당일 누적 확진자수/전일 누적 확진자수로 구해서 계산했습니다. 확진자가 발생한 첫날의 증가율 값은 NA이며 값은 항상 1이상의 숫자를 가집니다.

     우리나라와 미국을 비교한 그래프를 그렸습니다. 그래프를 보시면 초기에는 두 국가의 증가율이 큰 차이가 없어 보입니다. 하지만 우리나라의 경우 증가율이 점차 1에 수렴해가는 모습을 보이는 반면 미국은 그렇지가 않습니다. 후반에 증가율이 문제가 되는게 누적확진자수가 초기와는 다르기 때문입니다. 누적확진자 증가율이 1.5라는 이야기는, 초기에는 누적확진자가 10명에서 다음날 15명으로 늘었을 때지만, 후반에는 10,000명에서 15,000명으로 늘었다는 이야기입니다. 따라서 증가율의 추세선이 우하향하는 그래프가 안정적입니다.

     추세선을 그려보면 아래와 같습니다.

    covid19top10 %>% 
      filter(Country.Region %in% c("South Korea", "US")) %>% 
      ggplot(aes(x = ObservationDate,
                 y = ratio,
                 color = Country.Region)) +
      geom_line(size = 1.2) +
      geom_smooth(method = "lm",
                  alpha  = 0.2) +
      geom_dl(aes(label = Country.Region), method = list(dl.trans(x = x + 0.1), "last.points")) +
      theme_classic() +
      theme(legend.position = "none",
            axis.text.x=element_blank(),
            axis.ticks.x=element_blank()) +
      xlim(as.Date("2020-01-22"), as.Date("2020-04-08")) +
      geom_hline(yintercept = 1)

     우리나라는 추세선이 확실히 우하향하는데 반해 미국은 우상향하는 모습이네요.. 미국 확진자 수가 15만에 가까운데, 이는 내일 증가율이 10%가 나오면 1만 5천명이 확진판정을 받게 되었다는 이야기입니다. 우리나라 전체 확진자 수가 1만명이 넘지 않는데요.. 음.. 빠른 안정세를 취하기 위해 사회적 거리두기, 마스크 착용, stay at home처럼 모두를 위한 노력이 열심히 이루어지기 바랍니다. 끝으로 코로나 바이러스와 사투를 벌이시는 분들 모두 화이팅하시기 바랍니다!




Designed by Tistory.