Tidying, Visualising and Summarising Data - Tasks

knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE)

Task 1

다음 코드를 실행하여 데이터를 로드합니다.

library(dslabs)
data(polls_us_election_2016)

library(tidyverse)
  1. grade 값이 결측치(NA)인 여론조사는?

문서가 너무 길어지는 것을 방지하기 위해 head를 사용하여 처음 6개 행만 표시합니다.

polls_us_election_2016 %>%
    filter(is.na(grade)) %>%
    head
         state  startdate    enddate                 pollster grade samplesize
1   New Mexico 2016-11-06 2016-11-06                 Zia Poll  <NA>       8439
2         U.S. 2016-11-05 2016-11-07 The Times-Picayune/Lucid  <NA>       2521
3         U.S. 2016-11-01 2016-11-07    USC Dornsife/LA Times  <NA>       2972
4     Virginia 2016-11-01 2016-11-02                Remington  <NA>       3076
5    Wisconsin 2016-11-01 2016-11-02                Remington  <NA>       2720
6 Pennsylvania 2016-11-01 2016-11-02                Remington  <NA>       2683
  population rawpoll_clinton rawpoll_trump rawpoll_johnson rawpoll_mcmullin
1         lv           46.00         44.00               6               NA
2         lv           45.00         40.00               5               NA
3         lv           43.61         46.84              NA               NA
4         lv           46.00         44.00              NA               NA
5         lv           49.00         41.00              NA               NA
6         lv           46.00         45.00              NA               NA
  adjpoll_clinton adjpoll_trump adjpoll_johnson adjpoll_mcmullin
1        44.82594      41.59978        7.870127               NA
2        45.13966      42.26495        3.679914               NA
3        45.32156      43.38579              NA               NA
4        45.27399      41.91459              NA               NA
5        48.22713      38.86464              NA               NA
6        45.30896      42.94988              NA               NA
  1. 다음 조건을 모두 만족하는 여론조사는? (i) American Strategies, GfK Group, Merrill Poll에서 조사한 경우, (ii) 표본 크기가 1,000명 이상인 경우, (iii) 2016년 10월 20일에 시작된 경우. 힌트: (i) 조건에서는 %in% 연산자가 유용, 벡터는 c()함수로 만들 수 있음. (iii)에서는 날짜 변수의 형식을 확인
polls_us_election_2016 %>%
    filter(pollster %in% c("American Strategies","GfK Group","Merrill Poll") &
               samplesize > 1000 &
               startdate == "2016-10-20")
  state  startdate    enddate  pollster grade samplesize population
1  U.S. 2016-10-20 2016-10-24 GfK Group    B+       1212         lv
  rawpoll_clinton rawpoll_trump rawpoll_johnson rawpoll_mcmullin
1              51            37               6               NA
  adjpoll_clinton adjpoll_trump adjpoll_johnson adjpoll_mcmullin
1        50.28058      39.98632        4.733277               NA
  1. 다음 조건을 모두 만족하는 여론조사는? (i) Johnson 후보의 여론조사 데이터가 누락되지 않은 경우, (ii) 트럼프와 클린턴의 원본 여론조사 지지율 합이 95%를 초과하는 경우, (iii) 오하이오(OH) 주에서 실시된 경우 힌트: 트럼프와 클린턴의 지지율 합계를 계산하는 새로운 변수를 생성한 후 filter() 를 적용
polls_us_election_2016 %>%
    mutate(rawpoll_clintontrump = rawpoll_clinton + rawpoll_trump) %>%
    filter(!is.na(rawpoll_johnson) & rawpoll_clintontrump > 95 & state == "Ohio")
 [1] state                startdate            enddate             
 [4] pollster             grade                samplesize          
 [7] population           rawpoll_clinton      rawpoll_trump       
[10] rawpoll_johnson      rawpoll_mcmullin     adjpoll_clinton     
[13] adjpoll_trump        adjpoll_johnson      adjpoll_mcmullin    
[16] rawpoll_clintontrump
<0 rows> (or 0-length row.names)
  1. 표본 크기가 2,000명 이상인 여론조사에서 트럼프의 평균 지지율이 가장 높은 주는? 힌트: filter(), group_by(), summarise(), arrange() 사용. 내림차순 정렬하려면 arrange() 함수 사용.
polls_us_election_2016 %>%
    filter(samplesize >= 2000) %>%
    group_by(state) %>%
    summarise(mean_trump = mean(rawpoll_trump)) %>%
    arrange(desc(mean_trump))
# A tibble: 26 × 2
   state          mean_trump
   <fct>               <dbl>
 1 Alabama              62.5
 2 Missouri             48.5
 3 Indiana              47  
 4 Texas                46.0
 5 South Carolina       45.5
 6 Georgia              45.3
 7 Kansas               44  
 8 New Mexico           44  
 9 Florida              44.0
10 Ohio                 43.9
# ℹ 16 more rows

Task 2

다음 코드를 실행하여 데이터를 로드합니다.

library(dslabs)
data(gapminder, package = "dslabs")
  1. 대륙/연도별 평균 인구(변수명: mean_pop)를 계산하고, 결과를 새로운 객체 gapminder_mean에 저장하시오. 힌트: 각 연도별 대륙당 하나의 관측치(행)만 있어야 함. group_bysummarise 사용
gapminder_mean <- gapminder %>%
  group_by(continent, year) %>%
  summarise(mean_pop = mean(population)) %>%
  ungroup()
  • 만약 ungroup()을 하지 않으면 이후에 수행하는 mutate(), summarise(), filter() 등의 연산이 여전히 그룹 단위로 적용됩니다. 예를 들면 아래와 같습니다. ungroup() 대신 summarise 함수에서 .groups="drop" 옵션을 써도 됩니다.
df <- tibble(group = c("A", "A", "B", "B"), value = c(1, 2, 3, 4))

# 그룹별 평균 계산
df_summary <- df %>%
  group_by(group) %>%
  summarise(mean_value = mean(value))

# mutate를 추가하지만 ungroup 안 함
df_summary %>%
  mutate(overall_mean = mean(mean_value))
# A tibble: 2 × 3
  group mean_value overall_mean
  <chr>      <dbl>        <dbl>
1 A            1.5          2.5
2 B            3.5          2.5

Task 3

gapminder 데이터를 사용하여 다음의 그래프를 ggplot2로 생성하시오

  1. 2015년 기대수명(Life Expectancy)의 히스토그램을 작성하시오. 힌트: 히스토그램을 만들 때 aes()에 y 값을 지정해야 할까? geom_* 내에서 다음 옵션을 설정하시오: binwidth = 5, boundary = 45, colour = “white”, fill = “#d90502”. 이러한 옵션이 무엇을 의미하는지 설명하시오.

기본 히스토그램:

gapminder %>%
    filter(year == 2015) %>%
    ggplot() +
    aes(x = life_expectancy) +
    geom_histogram()

수정된 히스토그램(축 레이블 포함):

life_exp_hist <- gapminder %>%
    filter(year == 2015) %>%
    ggplot() +
    aes(x = life_expectancy) +
    geom_histogram(binwidth = 5,
                   boundary = 45,
                   colour = "white",
                   fill = "#d90502") +
    labs(x = "기대 수명",
         y = "빈도")
life_exp_hist

facet된 히스토그램:

life_exp_hist +
    facet_grid(rows = vars(continent))

  1. 연도/대륙별 평균 기대수명을 구하고 대륙별로 평균 기대수명에 대한 Boxplot 으로 그리시오. geom_* 옵션: colour = “black”, fill = “#d90502”.
    힌트: continent 및 year 두 개의 변수로 그룹화해야함.
gapminder %>%
    group_by(continent, year) %>%
    summarise(mean_life_exp = mean(life_expectancy)) %>%
    ggplot() +
    aes(x = continent, y = mean_life_exp) +
    geom_boxplot(colour = "black",
                 fill = "#d90502") +
    labs(x = "대륙",
         y = "기대 수명")

3. 2015년의 영아 사망률(x축)에 대한 출산율(y축)의 산점도. 산점도를 만든 후 해당 geom_* 내에서 size를 3으로, alpha를 0.5로, colour를 “#d90502”로 설정합니다.

기본 산점도:

gapminder %>%
    filter(year == 2015) %>%
    ggplot() +
    aes(x = infant_mortality, y = fertility) +
    geom_point()

축 레이블이 있는 산점도:

gapminder %>%
    filter(year == 2015) %>%
    ggplot() +
    aes(x = infant_mortality, y = fertility) +
    geom_point(size = 3,
               alpha = 0.5,
               colour = "#d90502") +
    labs(x = "영아 사망률", y = "출산율")


Task 4

  1. 2011년 GDP의 평균을 계산하고 mean이라는 객체에 할당하시오. 결측값은 제외. 힌트: mean 함수의 도움말을 읽고 NA를 제거하는 방법을 확인
mean_GDP <- gapminder %>%
    filter(year == 2011) %>%
    summarise(mean(gdp, na.rm = T))
mean_GDP
  mean(gdp, na.rm = T)
1         246954895975
  1. 2011년 GDP의 중앙값을 계산하고 median이라는 객체에 할당하시오. 마찬가지로 결측값을 제외. 중앙값이 평균보다 큰가, 작은가?
median_GDP <- gapminder %>%
    filter(year == 2011) %>%
    summarise(median(gdp, na.rm = T))
median_GDP
  median(gdp, na.rm = T)
1            16031265699

중앙값은 평균보다 훨씬 작습니다.

  1. geom_density를 사용하여 2011년 GDP의 밀도 그래프(density plot)를 생성하시오. 밀도 그래프는 숫자형 변수의 분포를 나타내는 방법임. 또한 다음 코드를 추가하여 평균과 중앙값을 수직선으로 표시하시오.

    geom_vline(xintercept = as.numeric(mean), colour = "red") +
    geom_vline(xintercept = as.numeric(median), colour = "orange")
gdp_density <- gapminder %>%
    filter(year == 2011) %>%
    ggplot() +
    aes(x = gdp) +
    geom_density() +
    geom_vline(xintercept = as.numeric(mean_GDP), colour = "red") +
    geom_vline(xintercept = as.numeric(median_GDP), colour = "orange")
gdp_density

GDP 분포는 매우 왜곡(Skewed)되어 있습니다. GDP가 적은 국가가 많고 GDP가 매우 큰 국가(미국, 일본, 중국)는 적습니다. 이러한 경우 평균은 중앙값보다 (상당히) 클 것입니다. 이것을 더 명확하게 보기 위해 각 눈금이 이전 눈금보다 10배 더 크게 x축을 변환한 그래프가 아래입니다(따라서 척도는 선형이 아닙니다. 즉, 첫 번째 눈금은 100,000, 두 번째는 100만, 세 번째는 1천만 등입니다.).

gdp_density +
    scale_x_log10()

  1. 2015년 출산율(fertility)과 유아 사망률(infant mortality)의 상관관계를 계산하시오. NA 값을 제외하려면 cor() 함수의 use 인수를 “pairwise.complete.obs”로 설정. 이 상관관계 값이 Task 3에서 생성한 그래프와 일치하는가?
gapminder %>%
    filter(year == 2015) %>%
    summarise(cor(fertility, infant_mortality, use = "pairwise.complete.obs"))
  cor(fertility, infant_mortality, use = "pairwise.complete.obs")
1                                                       0.8286402

이 상관 관계는 양수이고 강합니다(1에 비교적 가깝습니다). 이는 Task 3에서 생성된 그래프와 일치합니다. 실제로 해당 그래프는 이러한 두 변수 간의 양의 관계를 보여 주었고 점이 그렇게 분산되지 않았습니다.