作業目的: Data Manipulation and Joining

這份作業希望能夠讓你熟悉於清理資料(cleaning data),並且利用視覺化的文法(grammar of graphics) 呈現結果。過程中會用到前幾週學過 dplyr 的動詞,以及 lubridate 和 ggplot2。每個小題都請寫下你的原始碼並且畫出圖表。

這次的作業使用 readr 提供的原始資料,主題是台灣的電影票房,有興趣的話可以點進 【讀 + 數據】咦!颱風都不來!水庫預警之歷年水庫水位最低是⋯⋯? 看一下這篇資料新聞

作業: Data Manipulation and Joining

### 這邊不要動
library(tidyverse)
library(lubridate)

df_reservoir_2020 <- 
  read_csv("data/Lab06/reservoir_data_2020.csv", col_names = F)

df_reservoir_2019 <- 
  read_csv("data/Lab06/reservoir_data_2019.csv", col_names = F)

df_reservoir_2018 <- 
  read_csv("data/Lab06/reservoir_data_2018.csv", col_names = F)

df_reservoir_raw <- df_reservoir_2020 %>%
  bind_rows(df_reservoir_2019) %>%
  bind_rows(df_reservoir_2018 ) %>% 
  rename(name = 1, year = 2, area = 3, town = 4, date = 5, height = 6, value = 7, percentage = 8)

### 給你看資料長這樣
df_reservoir_raw %>% head(5)
#> # A tibble: 5 x 8
#>   name      year area     town                    date  height  value percentage
#>   <chr>    <dbl> <chr>    <chr>                   <chr>  <dbl>  <dbl> <chr>     
#> 1 石門水庫  2020 臺灣北區 桃園市龍潭區、大溪區、復興區… 1/1    242.  1.75e4 88.89 %   
#> 2 西勢水庫  2020 臺灣北區 基隆巿暖暖區            1/1     72.1 4.37e1 100 %     
#> 3 新山水庫  2020 臺灣北區 基隆巿安樂區            1/1     83.8 8.68e2 86.61 %   
#> 4 翡翠水庫  2020 臺灣北區 新北市新店區            1/1    167.  3.09e4 92.24 %   
#> 5 寶山水庫  2020 臺灣北區 新竹縣寶山鄉            1/1    140.  4.32e2 85.79 %

1. dplyr & ggplot2::geom_col()

水庫有多少

A. 各個區域(area)有多少縣市有水庫?
B. 各個區域(area)有多少水庫?
C. 請先分別畫,再想辦法畫在一起!

# 第一步:找縣市
df_reservoir_raw %>% mutate(county = str_sub(town, 1, 3))

# 第二步:以區域跟縣市為單位計算有水庫的縣市、水庫數量
df_reservoir_raw %>% mutate(county = str_sub(town, 1, 3)) %>%
  group_by(area) %>% 
  summarise(n_town = n_distinct(county),
            n_name = n_distinct(name))

# 第三步:畫畫
df_reservoir_agg_area <- df_reservoir_raw %>% mutate(county = str_sub(town, 1, 3)) %>%
  group_by(area) %>% 
  summarise(n_town = n_distinct(county),
            n_name = n_distinct(name))

# A. 畫各個區域(area)有多少縣市有水庫
df_reservoir_agg_area %>%
  ggplot(aes(x = area, y = n_town)) + geom_col() +
  theme(text = element_text(family = "Noto Sans CJK TC Medium"))

# B. 畫各個區域(area)有多少水庫
df_reservoir_agg_area %>%
  ggplot(aes(x = area, y = n_name)) + geom_col() +
  theme(text = element_text(family = "Noto Sans CJK TC Medium"))

# C. 畫在一起
df_reservoir_agg_area %>%
  pivot_longer(names_to = "type", values_to = "value", cols = 2:3) %>%
  ggplot(aes(x = area, y = value)) + geom_col() +
  facet_wrap(type ~ .) +
  theme(text = element_text(family = "Noto Sans CJK TC Medium"))

#> # A tibble: 30,879 x 9
#>    name       year area    town            date  height  value percentage county
#>    <chr>     <dbl> <chr>   <chr>           <chr>  <dbl>  <dbl> <chr>      <chr> 
#>  1 石門水庫   2020 臺灣北區… 桃園市龍潭區、大溪區、復興區… 1/1    242.  1.75e4 88.89 %    桃園市
#>  2 西勢水庫   2020 臺灣北區… 基隆巿暖暖區    1/1     72.1 4.37e1 100 %      基隆巿
#>  3 新山水庫   2020 臺灣北區… 基隆巿安樂區    1/1     83.8 8.68e2 86.61 %    基隆巿
#>  4 翡翠水庫   2020 臺灣北區… 新北市新店區    1/1    167.  3.09e4 92.24 %    新北市
#>  5 寶山水庫   2020 臺灣北區… 新竹縣寶山鄉    1/1    140.  4.32e2 85.79 %    新竹縣
#>  6 寶山第二水庫…  2020 臺灣北區… 新竹縣寶山鄉    1/1    143.  2.23e3 71.01 %    新竹縣
#>  7 永和山水庫…  2020 臺灣中區… 苗栗縣頭份鎮、三灣鄉… 1/1     78.8 2.02e3 67.27 %    苗栗縣
#>  8 大埔水庫   2020 臺灣中區… 新竹縣峨眉鄉    1/1     69.0 4.73e2 89.18 %    新竹縣
#>  9 明德水庫   2020 臺灣中區… 苗栗縣頭屋鄉    1/1     57.9 7.92e2 64.78 %    苗栗縣
#> 10 鯉魚潭水庫…  2020 臺灣中區… 苗栗縣卓蘭鎮大湖鄉… 1/1    294.  8.87e3 77.45 %    苗栗縣
#> # … with 30,869 more rows
#> # A tibble: 4 x 3
#>   area     n_town n_name
#> * <chr>     <int>  <int>
#> 1 澎湖地區      1      5
#> 2 臺灣中區      4      8
#> 3 臺灣北區      4      6
#> 4 臺灣南區      5     11

2. dplyr & ggplot2::geom_col()

台灣本島 2018-2020 02/01 蓄水量各區域蓄水量百分比

A. 台灣本島蓄水量各區域蓄水量百分比的堆疊長條圖
B. 台灣本島蓄水量各區域蓄水量百分比的併排長條圖

# 為什麼看本島而已幹嘛欺負澎湖人
df_reservoir_raw %>%
  filter(date == "2/1") %>% 
  group_by(year, area) %>%
  summarise(value = sum(value))

# 第一步: 計算每年、每區的蓄水量
df_reservoir_raw %>%
  filter(area != "澎湖地區") %>%
  filter(date == "2/1") %>% 
  group_by(year, area) %>%
  summarise(value = sum(value)) %>% ungroup()

# 第二步: 計算每年、每區的蓄水量佔比
df_reservoir_raw %>%
  filter(area != "澎湖地區") %>%
  filter(date == "2/1") %>% 
  group_by(year, area) %>%
  summarise(value = sum(value)) %>% ungroup() %>%
  group_by(year) %>% mutate(per = value/sum(value))

# 第三步:畫畫
df_reservoir_agg_year <- df_reservoir_raw %>%
  filter(area != "澎湖地區") %>%
  filter(date == "2/1") %>% 
  group_by(year, area) %>%
  summarise(value = sum(value)) %>% ungroup() %>%
  group_by(year) %>% mutate(per = value/sum(value))

# A. 台灣本島蓄水量各區域蓄水量百分比的堆疊長條圖
df_reservoir_agg_year %>%
  ggplot(aes(x = year, y = per, fill = area)) +
  geom_col() +
  theme(text = element_text(family = "Noto Sans CJK TC Medium"))

# B. 台灣本島蓄水量各區域蓄水量百分比的併排長條圖
df_reservoir_agg_year %>%
  ggplot(aes(x = year, y = per, fill = area)) +
  geom_col(position = "dodge") +
  theme(text = element_text(family = "Noto Sans CJK TC Medium"))

#> # A tibble: 12 x 3
#> # Groups:   year [3]
#>     year area       value
#>    <dbl> <chr>      <dbl>
#>  1  2018 澎湖地區    52.9
#>  2  2018 臺灣中區 44200. 
#>  3  2018 臺灣北區 55346. 
#>  4  2018 臺灣南區 38493. 
#>  5  2019 澎湖地區    97.0
#>  6  2019 臺灣中區 30229. 
#>  7  2019 臺灣北區 45796. 
#>  8  2019 臺灣南區 44365. 
#>  9  2020 澎湖地區    67.6
#> 10  2020 臺灣中區 32228. 
#> 11  2020 臺灣北區 47751. 
#> 12  2020 臺灣南區 47136. 
#> # A tibble: 9 x 3
#>    year area      value
#>   <dbl> <chr>     <dbl>
#> 1  2018 臺灣中區 44200.
#> 2  2018 臺灣北區 55346.
#> 3  2018 臺灣南區 38493.
#> 4  2019 臺灣中區 30229.
#> 5  2019 臺灣北區 45796.
#> 6  2019 臺灣南區 44365.
#> 7  2020 臺灣中區 32228.
#> 8  2020 臺灣北區 47751.
#> 9  2020 臺灣南區 47136.
#> # A tibble: 9 x 4
#> # Groups:   year [3]
#>    year area      value   per
#>   <dbl> <chr>     <dbl> <dbl>
#> 1  2018 臺灣中區 44200. 0.320
#> 2  2018 臺灣北區 55346. 0.401
#> 3  2018 臺灣南區 38493. 0.279
#> 4  2019 臺灣中區 30229. 0.251
#> 5  2019 臺灣北區 45796. 0.380
#> 6  2019 臺灣南區 44365. 0.369
#> 7  2020 臺灣中區 32228. 0.254
#> 8  2020 臺灣北區 47751. 0.376
#> 9  2020 臺灣南區 47136. 0.371

3. lubridate & ggplot2::geom_line()

石門水庫蓄水量百分比變化

A. 2019 年每天的蓄水量百分比變化
B. 2018-2020年 1 月的蓄水量百分比變化比較

# 先來看看資料長相
df_reservoir_raw %>% filter(name == "石門水庫") %>% count(year)

# A. 2019 年每天的蓄水量百分比變化
df_reservoir_raw %>% filter(name == "石門水庫") %>% filter(year == 2019) %>%
  ggplot(aes(x = date, y = percentage))

df_reservoir_raw %>% select(date, percentage) %>% head(5)

df_reservoir_raw %>% filter(name == "石門水庫") %>% filter(year == 2019) %>%
  mutate(percentage = str_remove_all(percentage, " |\\%")) %>%
  mutate(percentage = as.numeric(percentage)) %>%
  mutate(percentage = percentage/100) %>%
  mutate(date2 = str_c(year, "/", date)) %>%
  mutate(date2 = as_date(date2)) %>%
  filter(!is.na(date2)) %>%
  ggplot(aes(x = date2, y = percentage)) + geom_line()

# B. 石門水庫蓄水量百分比變化: 想看這三年間 1 月的比較
df_reservoir_raw %>% filter(name == "石門水庫") %>% 
  mutate(percentage = str_remove_all(percentage, " |\\%")) %>%
  mutate(percentage = as.numeric(percentage)) %>%
  mutate(percentage = percentage/100) %>%
  mutate(date2 = str_c(year, "/", date)) %>%
  mutate(date2 = as_date(date2)) %>%
  filter(!is.na(date2)) %>%
  mutate(month = month(date2)) %>%
  filter(month == 1) %>%
  ggplot(aes(x = date2, y = percentage, color = year)) + geom_line()

df_reservoir_raw %>% filter(name == "石門水庫") %>% 
  mutate(percentage = str_remove_all(percentage, " |\\%")) %>%
  mutate(percentage = as.numeric(percentage)) %>%
  mutate(percentage = percentage/100) %>%
  mutate(date2 = str_c(year, "/", date)) %>%
  mutate(date2 = as_date(date2)) %>%
  filter(!is.na(date2)) %>%
  mutate(month = month(date2)) %>%
  mutate(day = day(date2)) %>%
  filter(month == 1) %>%
  ggplot(aes(x = day, y = percentage, color = year)) + geom_line()

df_reservoir_raw %>% filter(name == "石門水庫") %>% 
  mutate(percentage = str_remove_all(percentage, " |\\%")) %>%
  mutate(percentage = as.numeric(percentage)) %>%
  mutate(percentage = percentage/100) %>%
  mutate(date2 = str_c(year, "/", date)) %>%
  mutate(date2 = as_date(date2)) %>%
  filter(!is.na(date2)) %>%
  mutate(month = month(date2)) %>%
  mutate(day = day(date2)) %>%
  mutate(year = as.factor(year)) %>%
  filter(month == 1) %>%
  ggplot(aes(x = day, y = percentage, color = year, group = year)) + geom_line()

#> # A tibble: 3 x 2
#>    year     n
#> * <dbl> <int>
#> 1  2018   372
#> 2  2019   371
#> 3  2020   287
#> # A tibble: 5 x 2
#>   date  percentage
#>   <chr> <chr>     
#> 1 1/1   88.89 %   
#> 2 1/1   100 %     
#> 3 1/1   86.61 %   
#> 4 1/1   92.24 %   
#> 5 1/1   85.79 %