-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README.Rmd
177 lines (145 loc) · 5.22 KB
/
README.Rmd
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
---
title: "Netflix Titles"
output: github_document
---
```{r, include=FALSE}
library(ragg)
library(maps)
knitr::opts_chunk$set(dev = 'ragg_png', dpi = 180)
```
分析例
- 月あたりの新作件数
- 国あたりの作品件数
簡単のため同名別作品は区別しないものとする。
renvパッケージをインストールしてから実行すること。
``` r
install.packages("renv")
```
# Load Data
```{r setup}
# CSVファイルのダウンロードと読み込み
# pinsパッケージを使ってキャッシュしておく
csv <- file.path(
"https://raw.githubusercontent.com/rfordatascience/tidytuesday",
"master/data/2021/2021-04-20/netflix_titles.csv"
)
board <- pins::board_url(c(netflix = csv))
netflix <- readr::read_csv(
pins::pin_download(board, 'netflix'),
show_col_types = FALSE
)
# 確認
dplyr::glimpse(netflix)
```
# Number of New Titles Per Month
## 集計
```{r}
added_per_month <- netflix |>
# タイトルと追加した月を抽出
dplyr::transmute(
title,
month_added = date_added |>
lubridate::mdy() |> # 文字列をDateに変換
lubridate::floor_date(unit = "month") # 月ごとに集計するため日付を1日に変更
) |>
# titleごとにmonth_addedの最小値を集計
dplyr::group_by(title) |>
dplyr::summarize(month_added = min(month_added)) |>
# 2015年以降のタイトルのみを抽出
dplyr::filter(lubridate::year(month_added) >= 2015) |>
# 月ごとに行数をカウント
dplyr::count(month_added)
dplyr::glimpse(added_per_month)
```
## 可視化
```{r monthly, fig.width=16/3, fig.height=9/3, warning=FALSE}
ggplot2::ggplot(added_per_month) +
# 高さ一定のタイルを使い色で件数を表現。幅は隙間が生じないよう調整
ggplot2::geom_tile(
ggplot2::aes(x = month_added, y = 1, fill = n, width = 33)
) +
# タイルの色を調整
ggplot2::scale_fill_gradient(
name = NULL, # 凡例のタイトルは不要
low = "black", high = "red", # NETFLIXカラーにする
limits = c(0L, NA_integer_) # 最小値を0に固定、最大値をデータから決定
) +
# 1年ごとに目盛を追加
ggplot2::scale_x_date(date_breaks = "1 years", date_labels = "%Y") +
# NETFLIXと白字で記述
ggplot2::annotate(
"text", label = "NETFLIX", color = "white", size = 20,
x = as.Date(-Inf), y = Inf, hjust = -0.01, vjust = 1.1
) +
# タイトル追加
ggplot2::labs(title = "Number of New Titles Per Month") +
# 見た目をシンプルにする
ggplot2::coord_cartesian(expand = FALSE) + # 不要な余白を除去
ggplot2::theme_minimal() +
ggplot2::theme(
panel.background = ggplot2::element_rect(
fill = "black" # 0件の部分はタイルがないので黒塗り
),
panel.grid = ggplot2::element_blank(), # 目盛線不要
axis.title = ggplot2::element_blank(), # 軸タイトル不要
axis.text.y = ggplot2::element_blank() # 今回はy軸の値に意味がないので省略
)
```
# Number of Titles Per Country
## 集計
```{r}
titles_per_country <- netflix |>
# タイトルと国ごとに1行ずつ抽出
dplyr::group_by(title, country) |>
dplyr::slice(1L) |>
# 国ごとに行数をカウント
dplyr::group_by(country) |>
dplyr::count()
dplyr::glimpse(titles_per_country)
```
`country`列には`"Argentina, Brazil, France, Poland, Germany, Denmark"`などと、カンマ区切りで複数の国が記録されている点に注意。
## 地図データとのマージ
地図データ読み込み。
`region`列が集計結果の`country`列に相当する。
```{r}
world <- ggplot2::map_data("world")
dplyr::glimpse(world)
```
集計結果と地図データのマージ。
地図に合わせて集計結果の`country`列を整形し、再集計してからマージする。
```{r}
titles_per_region <- titles_per_country |>
# country列をregion列に改名
dplyr::rename(region = country) |>
# 1行あたりにカンマ区切りで複数の国名が入っているので行方向に分割
tidyr::separate_rows("region", sep = ", ") |>
# 分割で生じた国名の重複を解消するため、国名ごとにタイトル数の和を集計
dplyr::group_by(region) |>
dplyr::summarize(n = sum(n)) |>
# 地図データとマージ
dplyr::right_join(world, by = "region")
dplyr::glimpse(titles_per_region)
```
## 可視化
```{r worldmap, fig.width=16/3, fig.height=9/3, warning=FALSE}
ggplot2::ggplot(titles_per_region) +
# 地図の表示。国をタイトル数で塗り潰す
ggplot2::geom_map(
ggplot2::aes(long, lat, map_id = region, fill = n),
map = world
) +
# 国ごとの色の塗り方を調整
ggplot2::scale_fill_gradient(
name = NULL, # 凡例のタイトルは不要
low = "black", high = "red", # NETFLIXカラー化
trans = "log", # 件数のレンジが広いので対数をとる
limits = c(1L, NA_integer_), # 最小値を1件にする
label = round # 凡例の数値を整数に丸める
) +
# タイトルの追加
ggplot2::labs(title = "NETFLIX: Number of Titles Per Country") +
# 地図なので縦横比を揃える
ggplot2::coord_equal() +
# 見た目をシンプルにする
ggplot2::theme_void()
```