5. group_by 와 summarise 함수 : 집단별로 요약하기

exam <- read.csv("csv_exam.csv")
dplyr::glimpse(exam)
## Observations: 20
## Variables: 5
## $ id      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,...
## $ class   <int> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, ...
## $ math    <int> 50, 60, 45, 30, 25, 50, 80, 90, 20, 50, 65, 45, 46, 48...
## $ english <int> 98, 97, 86, 98, 80, 89, 90, 78, 98, 98, 65, 85, 98, 87...
## $ science <int> 50, 60, 78, 58, 65, 98, 45, 25, 15, 45, 65, 32, 65, 12...

(1) 집단별로 요약하기

exam %>% summarise(mean_math = mean(math))
##   mean_math
## 1     57.45

(2) 집단별로 요약하기

**group_by() 는 출력결과를 데이터프레임의 업그레이드 버전인 tibble 형태로 만들어줌.

exam %>% 
  group_by(class) %>% 
  summarise(mean_math = mean(math))
## # A tibble: 5 x 2
##   class mean_math
##   <int>     <dbl>
## 1     1     46.25
## 2     2     61.25
## 3     3     45.00
## 4     4     56.75
## 5     5     78.00

(3) 여러 요약 통계량 한번에 산출하기

exam %>%
  group_by(class) %>%
  summarise(mean_math = mean(math), 
            sum_math = sum(math),
            median_math = median(math),
            n = n())
## # A tibble: 5 x 5
##   class mean_math sum_math median_math     n
##   <int>     <dbl>    <int>       <dbl> <int>
## 1     1     46.25      185        47.5     4
## 2     2     61.25      245        65.0     4
## 3     3     45.00      180        47.5     4
## 4     4     56.75      227        53.0     4
## 5     5     78.00      312        79.0     4

n()은 데이터가 몇 행으로 되어 있는지 ’빈도’를 구하는 기능

(4) 각 집단별로 다시 집단 나누기

mpg %>%
  group_by(manufacturer, drv) %>%
  summarise(mean_city = mean(cty)) %>% 
  head(10)
## # A tibble: 10 x 3
## # Groups:   manufacturer [5]
##    manufacturer   drv mean_city
##           <chr> <chr>     <dbl>
##  1         audi     4  16.81818
##  2         audi     f  18.85714
##  3    chevrolet     4  12.50000
##  4    chevrolet     f  18.80000
##  5    chevrolet     r  14.10000
##  6        dodge     4  12.00000
##  7        dodge     f  15.81818
##  8         ford     4  13.30769
##  9         ford     r  14.75000
## 10        honda     f  24.44444

(5) dplyr 조합하기

회사별로 “suv” 자동차의 도시 및 고속도로 통합연비 평균을 구해 내림차순으로 정렬하고, 1~5위까지 출력하기

mpg %>% 
  group_by(manufacturer) %>% 
  filter(class == "suv") %>% 
  mutate(mean = (cty + hwy)/2) %>% 
  arrange(desc(mean)) %>% 
  head(5)
## # A tibble: 5 x 12
## # Groups:   manufacturer [1]
##   manufacturer        model displ  year   cyl      trans   drv   cty   hwy
##          <chr>        <chr> <dbl> <int> <int>      <chr> <chr> <int> <int>
## 1       subaru forester awd   2.5  2008     4 manual(m5)     4    20    27
## 2       subaru forester awd   2.5  2008     4   auto(l4)     4    20    26
## 3       subaru forester awd   2.5  2008     4 manual(m5)     4    19    25
## 4       subaru forester awd   2.5  1999     4 manual(m5)     4    18    25
## 5       subaru forester awd   2.5  1999     4   auto(l4)     4    18    24
## # ... with 3 more variables: fl <chr>, class <chr>, mean <dbl>

mpg 데이터 이용한 분석

**Q1. mpg 데이터의 class는 “suv”, “compact” 등 자동차를 틍징에 따라 일곱 종류로 분류한 변수입니다. 어떤 자동차의 연비가 높은지 비교해 보려고 합니다. class별 cty 평균을 구해보세요.

mpg <- as.data.frame(ggplot2::mpg)

mpg %>%
  group_by(class) %>%
  summarise(mean_city = mean(cty))
## # A tibble: 7 x 2
##        class mean_city
##        <chr>     <dbl>
## 1    2seater  15.40000
## 2    compact  20.12766
## 3    midsize  18.75610
## 4    minivan  15.81818
## 5     pickup  13.00000
## 6 subcompact  20.37143
## 7        suv  13.50000

**Q2. 앞 문제의 출력결과는 class 값 알파벳 순으로 정렬되어 있습니다. 어떤 차종의 도시 연비가 높은지 쉽게 알아볼 수 있도록 cty 평균이 높은 순으로 정렬해 출력하세요.

mpg %>%
  group_by(class) %>%
  summarise(mean_city = mean(cty)) %>% 
  arrange(desc(mean_city))
## # A tibble: 7 x 2
##        class mean_city
##        <chr>     <dbl>
## 1 subcompact  20.37143
## 2    compact  20.12766
## 3    midsize  18.75610
## 4    minivan  15.81818
## 5    2seater  15.40000
## 6        suv  13.50000
## 7     pickup  13.00000

**Q3. 어떤 회사 자동차의 hwy(고속도로 연비)가 가장 높은지 알아보려 합니다. hwy 평균이 가장 높은 회사 세곳을 출력하세요.

mpg %>%
  group_by(manufacturer) %>%
  summarise(mean_hwy = mean(hwy)) %>% 
  arrange(desc(mean_hwy)) %>% 
  head(3)
## # A tibble: 3 x 2
##   manufacturer mean_hwy
##          <chr>    <dbl>
## 1        honda 32.55556
## 2   volkswagen 29.22222
## 3      hyundai 26.85714

Q4. 어떤 회사에서 “compact” (경차) 차종을 가장 많이 생산하는지 알아보려고 합니다. 각 회사별 “compact” 차종 수를 내림차순으로 정렬해 출력하세요.

mpg %>%
  group_by(manufacturer) %>% 
  filter(class == "compact") %>%
  summarise(count = n()) %>% 
  arrange(desc(count))
## # A tibble: 5 x 2
##   manufacturer count
##          <chr> <int>
## 1         audi    15
## 2   volkswagen    14
## 3       toyota    12
## 4       subaru     4
## 5       nissan     2