library(tidyverse)
library(ggforce)
Monte Carlo method
)MCMC
)によって、ようやくベイズ統計学が使えるようになったsample()
関数によるサンプリングsample()
関数によるサンプリング sample(x = 値の集合ベクトル,
size = 抽出の回数,
replace = 復元抽出の有無,
prob = 各要素が抽出される確率)
x
は 1 から 10
までの値を含む集合ベクトルとする <- c(1, 2, 3, 4, 5, 6) x
x
から無作為に 5 つの値を選びたければsample(x,
size = 5)
[1] 6 2 4 5 3
replace = TRUE
と指定x
に戻して、数字を選ぶsample(x,
size = 5,
replace = TRUE)
[1] 1 6 3 1 3
prob
は各要素が抽出される確率numeric 型
ベクトルを指定prob
の実引数の総和は 1 であることが望ましいsample(x,
size = 5,
replace = TRUE,
prob = c(1, 1, 1, 2, 2, 2))
[1] 4 5 4 4 4
つまり次の二つのコマンドは同じ意味
prob = c(1, 1, 1, 2, 2, 2)
prob = c(1/9, 1/9, 1/, 2/9, 2/9, 2/9)
サイコロを 3 回振るコードを書くなら、抽出の回数
size = 3
サイコロであれば、一回出た目も抽出される可能性がある
→ 復元抽出を行う必要あり(replace = TRUE
)
各目が出る確率は1/6
各値が抽出される確率が等しいので、省略可能
sample(1:6,
3,
replace = TRUE)
[1] 2 4 3
sample(x,
size = 5,
replace = TRUE,
prob = c(2, 1, 2, 1, 2, 1))
[1] 1 4 1 5 2
table()
関数を使うと、各要素が出現した回数が出力されるbarplot()
関数に渡すと棒グラフを作成できる<- sample(1:6,
dice 10^4,
replace = TRUE,
prob = c(2, 1, 2, 1, 2, 1))
table(dice) |>
barplot()
関数名 | 確率分布 | パラメータ |
---|---|---|
rbeta() |
ベータ分布 | n, shape1, shape2 |
rbinom() |
二項分布 | n, size, prob |
rcauchy() |
コーシー分布 | n, location, scale |
rchisq() |
\(X^2\)分布 | n, df |
rexp() |
指数分布 | n, rate |
rf() |
F 分布 | n, |
rgamma() |
ガンマ分布 | n, shape, scale |
rgeom() |
幾何分布 | n, prob |
rhyper() |
超幾何分布 | nn, m, n, k |
rlnorm() |
対数正規分布 | n, meanlog, sdlog |
rmultinom() |
多項分布 | n, size, prob |
rnbinom() |
負の二項分布 | n, size, prob |
rnorm() |
正規分布 | n, mean, sd |
rpois() |
ポアソン分布 | n, lambda |
rt() |
t分布 | n, df |
runif() |
一様分布 | n, min, max |
rweibull() |
ワイブル分布 | n, shape, scale |
mvtnorm::rmvnorm() |
多変量正規分布 | n, mean, sigma |
rnorm(3) |>
round(2)
[1] 0.49 0.76 0.84
rnorm(3) |>
round(2)
[1] -0.64 -0.51 -0.88
rnorm(3) |>
round(2)
[1] -2.37 -0.12 -1.98
seed
)set.seed(numeric型スカラー)
20220826
にして実行してみるset.seed(20220826)
rnorm(3) |>
round(2)
[1] -0.14 -0.87 -0.29
set.seed(20220826)
rnorm(3) |>
round(2)
[1] -0.14 -0.87 -0.29
正解 23 人いれば、同じ誕生日のペアが一組いる確率が 50% になる
n_student
と設定するn_student
個の値を復元抽出する<- 10
n_student <- sample(1:365,
Birth_vec
n_student,replace = TRUE)
Birth_vec
[1] 140 55 363 170 292 335 345 6 179 6
duplicated()
関数を使うTRUE
が、なければ
FALSE
が表示されるduplicated(Birth_vec)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
TRUE
が含まれていれば → 同じ誕生日の人が 2
人以上はいるという意味TRUE
が含まれているかどうかを確かめるにはany()
関数を使うTRUE
があれば(=
同じ誕生日のペアがいれば)→ 返り値は TRUE
FALSE
なら → 返り値は FALSE
any(duplicated(Birth_vec))
[1] TRUE
TRUE
と表示<- 10 # 学生数
n_student <- 100 # 試行回数
n_trials
<- rep(NA, n_trials) # 結果を格納する空ベクトル Result_vec を用意
Result_vec
# 反復処理
for (i in 1:n_trials) {
<- sample(1:365, n_student, replace = TRUE)
Birth_vec <- any(duplicated(Birth_vec))
Result_vec[i]
}
Result_vec
[1] FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[13] FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE
[61] FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE
[73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[85] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE
[97] FALSE FALSE FALSE FALSE
sum(Result_vec)
[1] 12
TRUE
が 12 個 → 100 人のうち 12
人(12%)の誕生日が同じ <- 10 # 学生数
n_student <- 1000 # 試行回数
n_trials
# 結果を格納する空ベクトルを用意する
<- rep(NA, n_trials)
Result_vec
# 反復処理
for (i in 1:n_trials) {
<- sample(1:365, n_student, replace = TRUE)
Birth_vec <- any(duplicated(Birth_vec))
Result_vec[i]
}
sum(Result_vec)
[1] 110
TRUE
が出た回数は 1190回(=
11.9%)<- tibble(Students = 2:100, # 学生数を 2 から 100 まで調整
Prob_df Probs = NA) # Probs は空に指定
for (i in 1:nrow(Prob_df)) {
<- rep(NA, 100) # 試行回数を 100 に固定
Result_vec
for (j in 1:100) { # 試行回数を 100 に固定
<- sample(1:365, Prob_df$Students[i], replace = TRUE)
Birth_vec <- any(duplicated(Birth_vec))
Result_vec[j]
}
$Probs[i] <- mean(Result_vec)
Prob_df }
::datatable(Prob_df) DT
Probs
) が 0.5 (=
50%) になる人数 (Students
) を確かめる|>
Prob_df filter(Probs >= 0.4 & Probs <= 0.6)
# A tibble: 7 × 2
Students Probs
<int> <dbl>
1 19 0.43
2 20 0.43
3 21 0.5
4 22 0.51
5 23 0.59
6 24 0.58
7 25 0.59
%>%
Prob_df ggplot() +
geom_line(aes(x = Students,
y = Probs * 100),
size = 1) +
geom_hline(yintercept = 50, # 50%に赤い点線を引く
color = "red",
linetype = 2) +
labs(x = "学生数",
y = "同じ誕生日の人が2人以上いる割合 (%)\n(試行回数 = 100)") +
theme_minimal(base_family = "HiraKakuProN-W3")
シミュレーション結果(試行回数 = 100) 50人ほどいれば、ほぼ確実に同じ誕生日のペアが一組以上いる
n
人いる場合、同じ誕生日の人が 2 人以上いる確率 \(P(n)\)\[P(n) = 1 - \frac{365!}{365^n(365-n)!}\]
\(3! = 3 × 2 × 1 = 6\)
→ \(365! = 365 × 364 ×....×
1\)
R
では factorial()
関数を使って計算できる
50 人いるときに同じ誕生日のペアがいる確率は
1 - factorial(365) / (365^50 * factorial(365 - 50))
[1] NaN
NaNについて - \(100!\)を計算してみる
factorial(100)
[1] 9.332622e+157
小数点以下に 0 が 157 個もつくほど大きな値
\(200!\)を計算してみる
factorial(200)
[1] Inf
\[P(n) = 1 - \frac{n!×_{365}C_n}{365^n(365-n)!}\]
\[_nC_k = \frac{n!}{k!(n-k)!}\]
choose(n, k)
関数を使って計算できる 1 - ((factorial(50) * choose(365, 50)) / 365^50)
[1] 0.9703736
<- function (n) {
Birth_Expect 1 - ((factorial(n) * choose(365, n)) / 365^n)
}Birth_Expect(22)
[1] 0.4756953
<- function (n) {
Birth_Expect 1 - ((factorial(n) * choose(365, n)) / 365^n)
}Birth_Expect(23)
[1] 0.5072972
「2.1.1 シミュレーション(試行回数 = 100)」
で作成したデータフレーム
(Prob_df
) にこの理論値に Expect
と名前を付けて追加する<- Prob_df |>
Prob_df mutate(Expect = map_dbl(Students,
~Birth_Expect(.x)))
::datatable(Prob_df) DT
pivot_longer()
関数を使って tidy
なデータに変換する<- Prob_df |>
Prob_tidy pivot_longer(cols = Probs:Expect,
names_to = "Type",
values_to = "Prob")
::datatable(Prob_tidy) DT
Probs
) と理論値
(Expect
) を折れ線グラフにしてみる %>%
Prob_tidy mutate(Type = ifelse(Type == "Probs", "シミュレーション", "理論値")) %>%
ggplot() +
geom_line(aes(x = Students,
y = Prob * 100,
color = Type),
size = 1) +
labs(x = "学生数",
y = "同じ誕生日の人が2人以上いる割合 (%)\n(試行回数 = 100)",
color = "") +
theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom")
<- 100 # 学生数
n_student <- 1000 # 試行回数
n_trials
# 結果を格納する空ベクトルを用意する
<- rep(NA, n_trials)
Result_vec
# 反復処理
for (i in 1:n_trials) {
<- sample(1:365,
Birth_vec
n_student, replace = TRUE)
<- any(duplicated(Birth_vec))
Result_vec[i] }
<- tibble(Students = 2:100,
Prob_df Probs = NA)
for (i in 1:nrow(Prob_df)) {
<- rep(NA, n_trials)
Result_vec
for (j in 1:n_trials) {
<- sample(1:365, Prob_df$Students[i], replace = TRUE)
Birth_vec <- any(duplicated(Birth_vec))
Result_vec[j]
}
$Probs[i] <- mean(Result_vec)
Prob_df }
%>%
Prob_df mutate(Expect = map_dbl(Students, ~Birth_Expect(.x))) %>%
pivot_longer(cols = Probs:Expect,
names_to = "Type",
values_to = "Prob") |>
mutate(Type = ifelse(Type == "Probs", "シミュレーション", "理論値")) %>%
ggplot() +
geom_line(aes(x = Students, y = Prob * 100, color = Type), size = 1) +
labs(x = "学生数",
y = "同じ誕生日の人が2人以上いる割合 (%)\n(試行回数 = 1000)",
color = "") +
theme_minimal(base_family = "HiraKakuProN-W3") +
theme(legend.position = "bottom")
1cm
の円の面積を計算してみるStep 1
:
円の周りにぴったり当てはまる正方形を考えるStep 2
: 正方形の中にランダムに点を打ちまくるStep 3
:
「正方形の中」と「円の中」に入った点の数の比を比べるset.seed(2022)
<- tibble(x = runif(100, -1, 1),
pi_df y = runif(100, -1, 1))
pi_df
# A tibble: 100 × 2
x y
<dbl> <dbl>
1 0.632 0.910
2 0.295 -0.594
3 -0.759 0.681
4 0.0876 0.622
5 -0.631 0.148
6 0.272 -0.585
7 -0.851 0.784
8 -0.916 -0.831
9 -0.259 0.243
10 0.515 0.968
# … with 90 more rows
|>
pi_df ggplot() +
geom_rect(aes(xmin = -1,
ymin = -1,
xmax = 1,
ymax = 1),
fill = "white", color = "black") +
geom_point(aes(x = x, y = y)) +
coord_fixed(ratio = 1) +
theme_minimal()
ggforce
パッケージの
geom_circle()
幾何オブジェクトを使うx = 0
と
y = 0
)、円の半径 (r
)(0, 0)
で半径 \(r =
1\) の円を重ねる%>%
pi_df ggplot() +
geom_rect(aes(xmin = -1,
ymin = -1,
xmax = 1,
ymax = 1),
fill = "white", color = "black") +
geom_circle(aes(x0 = 0,
y0 = 0,
r = 1)) +
geom_point(aes(x = x, y = y)) +
coord_fixed(ratio = 1) +
theme_minimal()
in_circle
を作る(x, y)
が、原点が (x′, y′)
、かつ半径
r
の円内に入っている場合、次の式が成立する\[(x-x')^2 + (y - y')^2 < r^2\]
\[x^2 + y^2 < 1^2\]
in_circle
を追加して、打ち込まれた点がこの条件を満たしているかどうかを判別する<- pi_df %>%
pi_df mutate(in_circle = if_else(x^2 + y^2 < 1^2, "円内", "円外"))
geom_point()
内に
color = in_circle
と指定し、color
を
in_circle
変数でマッピングする%>%
pi_df ggplot() +
geom_rect(aes(xmin = -1,
ymin = -1,
xmax = 1,
ymax = 1),
fill = "white",
color = "black") +
geom_point(aes(x = x,
y = y,
color = in_circle), # color を in_circle 変数でマッピング
size = 2) +
geom_circle(aes(x0 = 0,
y0 = 0,
r = 1)) +
labs(x = "X", y = "Y", color = "") +
coord_fixed(ratio = 1) +
theme_void(base_size = 12) +
theme_minimal(base_family = "HiraKakuProN-W3")
group_by()
関数を使って、円内の点と円外の点の個数を数えてみる|>
pi_df group_by(in_circle) |>
summarise(N = n())
# A tibble: 2 × 2
in_circle N
<chr> <int>
1 円内 82
2 円外 18
4 * 0.82
[1] 3.28
set.seed(2022)
<- tibble(x = runif(2000, -1, 1),
pi_df2 y = runif(2000, -1, 1))
<- pi_df2 %>%
pi_df2 mutate(in_circle = if_else(x^2 + y^2 < 1^2, "円内", "円外"))
%>%
pi_df2 ggplot() +
geom_rect(aes(xmin = -1,
ymin = -1,
xmax = 1,
ymax = 1),
fill = "white", color = "black") +
geom_point(aes(x = x,
y = y,
color = in_circle,
alpha = 0.5),
size = 2) +
geom_circle(aes(x0 = 0,
y0 = 0,
r = 1)) +
labs(x = "X", y = "Y", color = "") +
coord_fixed(ratio = 1) +
theme_void(base_size = 12) +
theme_minimal(base_family = "HiraKakuProN-W3")
%>%
pi_df2 group_by(in_circle) %>%
summarise(N = n())
# A tibble: 2 × 2
in_circle N
<chr> <int>
1 円内 1562
2 円外 438
4 * 1562 / 2000
[1] 3.124
x
軸) を 2 から 2000
まで増やした時に得られる円周率 (y
軸)
をシミュレーションで求めてみる<- 2:2000 # 点の数を 2 から 2000 まで変化させる
dots <- length(dots)
n <- rep(NA, n)
results
for (i in 1:n) {
<- tibble(x = runif(dots[i], -1, 1),
results[i] y = runif(dots[i], -1, 1)) |>
mutate(in_circle = if_else(x^2 + y^2 < 1^2, "円内", "円外")) |>
group_by(in_circle) |>
summarise(N = n()) |>
filter(in_circle == "円内") |> # 円の内側に入った点だけを選ぶ
summarise(mean(N/dots[i]*4)) # 推定された円周率を計算する
}
<- unlist(results) # リストのデータをベクトルに変換
pi <- tibble(dots, pi) # データフレーム df_pi を作る
df_pi
%>%
df_pi ggplot() +
geom_line(aes(x = dots,
y = pi),
size = 0.2,
color = "blue",
alpha = 0.8) +
geom_hline(yintercept = 3.14, # 3.14 に赤い点線を引く
color = "red",
linetype = 2) +
labs(x = "正方形に打ち込んだ点の数",
y = "推定された円周率") +
ggtitle("確率を使ったシミュレーションで得られた円周率") +
theme_minimal(base_family = "HiraKakuProN-W3")
bootstrapping
) とはn
とした場合n
のデータセットを再度構築 → 平均値を計算\[data1 〜 Normal(\mu = 2, \sigma = 1)\\ data2 〜 Normal(\mu = 5, \sigma = 1)\]
set.seed(2020)
<- rnorm(100, 2, 1)
data1 <- rnorm(100, 5, 1) data2
<- data.frame(data1, data2)
df
<- df %>%
df_long ::pivot_longer(data1:data2,
tidyrnames_to = "data",
values_to = "score")
df_long
# A tibble: 200 × 2
data score
<chr> <dbl>
1 data1 2.38
2 data2 3.27
3 data1 2.30
4 data2 4.01
5 data1 0.902
6 data2 4.41
7 data1 0.870
8 data2 5.38
9 data1 -0.797
10 data2 5.75
# … with 190 more rows
%>%
df_long ggplot() +
geom_boxplot(aes(x = data,
y = score))
t
検定)をやってみるvar.equal = TRUE
)<- t.test(df_long$score[df_long$data == "data1"],
ttest_result $score[df_long$data == "data2"],
df_longvar.equal = TRUE)
ttest_result
Two Sample t-test
data: df_long$score[df_long$data == "data1"] and df_long$score[df_long$data == "data2"]
t = -17.423, df = 198, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-3.089598 -2.461319
sample estimates:
mean of x mean of y
2.108892 4.884350
ttest_result$stderr
で抽出可能$stderr ttest_result
[1] 0.1592985
①結果を格納する長さ 1 万の空ベクトル result_ve
c
を作成
②i
の初期値を 1 と設定
③data1
から 100個 (= data1
の大きさ)
の値を無作為抽出→sample1
に格納
④data2
から 100個 (= data2
の大きさ)の値を無作為抽出 → sample2
に格納
⑤result_vec
の i
番目の位置に
sample1
の平均値と sample2
の平均値の差分を格納
⑥i
を 1 増加させる
⑦③〜⑥の手順を 1 万回繰り返す
<- 10000
n_trials <- rep(NA, n_trials)
result_vec
for (i in 1:n_trials) {
<- sample(data1, 100, replace = TRUE)
sample1 <- sample(data2, 100, replace = TRUE)
sample2
<- mean(sample1) - mean(sample2)
result_vec[i] }
result_vec
には平均値の差分が 1万個格納されているbootstrap estimate
)
と呼ぶ# 最初のデータの平均値の差分
<- mean(data1) - mean(data2)
delta delta
[1] -2.775459
# ブートストラップ推定量 (平均値の差分の平均値)
<- mean(result_vec)
boot_delta boot_delta
[1] -2.772783
# ブートストラップ推定量のバイアス
<- delta - boot_delta
boot_b boot_b
[1] -0.002676098
-2.775459 - (-2.772783)
[1] -0.002676
result_vec
の標準偏差# ブートストラップ推定量の標準誤差
<- sd(result_vec)
boot_se boot_se
[1] 0.1579615
0.1579615
t
検定の結果から得られた標準誤差 0.1592985
と非常に近い百分位数信頼区間 (Percentile CI
) は
result_Vec
の左側の領域が 2.5%、右側の領域が
2.5%となる区間
- quantile()
関数で計算できる
# 95%信頼区間
quantile(result_vec, c(0.025, 0.975))
2.5% 97.5%
-3.082493 -2.456123
Wald
信頼区間を計算する+ qnorm(c(0.025, 0.975)) * boot_se delta
[1] -3.085058 -2.465860
- boot_b) + qnorm(c(0.025, 0.975)) * boot_se (delta
[1] -3.082381 -2.463184
t検定 | ブートストラップ | |
平均値の差分 | -2.775458 | -2.775459 |
標準誤差 | 0.1592985 | 0.1579615 |
95%信頼区間 | [-3.09, -2.46] | |
95%信頼区間(百分位数) | [-3.08, -2.46] | |
95%信頼区間 (Wald) | [-3.09, -2.47] | |
95%信頼区間(バイアス修正 Wald) | [-3.08, -2.46] | |
2.108892-4.884350
[1] -2.775458
【ゲームのルール】
Question
:
プレイヤーは最初に選んだドアに止まるべきか、それともドアを選び直すべきか?意見 A
:
ドアを選び直しても高級車を得られる確率は同じだから、どちらでも良い
意見 B
:
高級車を得られる確率が上がるから、ドアを選び直すべき
【R を使ったシミュレーション】
高級車はドア 1 にある
プレイヤーは三つのドア(1,2,3)のうち無作為に一つのドアを選ぶ
(モンティがヤギの入っているドアを 1 つ開ける)
プレイヤーは次の二つの選択ができる:
① 最初に選んだドアにとどまる
② 残ったドアに選択を変える
# シミュレーションを行う為に 200個の入れものを準備。
set.seed(1838-3-11) # 乱数の設定。大隈重信の誕生日。
<- 200
trials
# 「ドア 1」「ドア 2」「ドア 3」を無作為に 200 回選ぶ
<- sample(1:3, trials, replace = TRUE)
prize prize
[1] 3 1 3 1 2 2 2 1 1 3 3 2 1 1 2 1 2 3 3 3 3 3 1 2 3 1 2 3 1 1 2 1 1 3 2 1 2
[38] 2 3 3 3 3 1 2 1 3 1 1 1 3 1 3 3 1 2 2 3 2 3 1 3 3 1 2 1 1 3 1 2 1 1 2 3 2
[75] 3 1 3 2 2 2 1 3 2 2 3 3 2 3 2 2 2 2 1 3 3 2 3 1 2 2 3 2 3 2 3 2 3 1 1 2 1
[112] 2 2 3 1 1 1 3 3 1 3 2 1 2 1 2 3 1 2 2 2 2 1 3 1 2 1 2 2 3 3 3 2 1 1 2 3 3
[149] 2 3 2 1 2 3 3 2 3 3 1 1 3 2 3 3 2 3 2 3 3 3 3 2 1 1 3 3 3 2 2 1 3 2 3 3 1
[186] 3 2 3 3 1 2 2 1 2 1 1 1 3 3 2
<- prize == 1
stay head(stay)
[1] FALSE TRUE FALSE TRUE FALSE FALSE
<- prize != 1
move head(move)
[1] TRUE FALSE TRUE FALSE TRUE TRUE
move
では 1 が FALSE
、2 と 3 が
TRUE
と表示prob.stay
と「ドア 1」から動いた時に当たる割合
prob.move
の累積を 200 回分計算するMonty Hall Problem シミュレーションのためのスクリプト
# シミュレーションを行う為に 200個の入れものを準備。
set.seed(1838-3-11) # 乱数の設定。大隈重信の誕生日。
<- 200
trials <- sample(1:3, trials, replace = TRUE) # 「ドア 1」「ドア 2」「ドア 3」を無作為に 200 回選ぶ
prize
prize<- prize == 1 #「ドア 1」に高級車があると指定
stay head(stay)
<- prize != 1 #「ドア 2」と「ドア 3」に高級車はないと指定
move head(move)
<- prob.move <- rep(NA, trials)
prob.stay for (i in 1:trials) {
<- sum(stay[1:i]) / i # 「ドア 1」に止まった時に高級車が当たる割合
prob.stay[i] <- sum(move[1:i]) / i # 「ドア 1」から動いた時に高級車が当たる割合
prob.move[i]
plot(1:trials, prob.move, ylim = c(0, 1), #シミュレーション結果をプロット
type = "l", col = "red",
xlab = "number of trials",
ylab = "prob. of getting a car",
main = "Simulation of Monty Hall Problem")
lines(1:trials, prob.stay, type = "l", col = "blue")
abline(h = c(0.33, 0.66), lty = "dotted") # 勝つ確率が 33% (1/3)と66% (2/3)に点線を引く
legend("topright", lty = 1, col = c("red", "blue"),
legend = c("change", "stay"))}
・実行方法
・R
上で「ファイル」=> 「新規文書」
=> 上のコード(Monty Hall Problem
シミュレーションのためのスクリプト)をペースト
=> Return (Enter)
を押す
注意:RMarkdown
上で実行できないこともないが、動画アニメーションではなく「紙芝居」のような動きをするので、R
上で実行するのがよい