Bing Image Creator で生成: Landscape photography, natural green field, blue wide sky, flying a butterfly
の続きです。
前回の分析(のようなもの)で、山手線と東海道線の駅が乗車人数の平均値の上位2路線だとわかりました。今回は、この2つの路線の平均値に統計的に有意な差があるかどうかをinferパッケージを使って調べてみます。inferパッケージは、シミュレーションベースの統計検定をするパッケージです。
こちらのウェブサイトに詳細があります。
今回は
を参考にしています。
はじめに、山手線と東海道線だけのデータフレームを作成します。
それぞれの駅のtotalをグラフにしてみましょう。
赤い色の駅が山手線の駅で、緑色の駅が東海道線です。
それぞれの路線の平均値を計算します。
山手線の平均は7128万2千人で、東海道線の平均は6437万3千人です。
理論ベースのt.test()検定でこの平均値に差があるかどうか調べます。
p値は0.7842です。95%信頼区間は、-44978から58796とゼロを含んいます。つまり、両者の平均値には差がありません。
それでは、いよいよinferパッケージを読み込みます。
2路線の平均値の差をだします。
690万9千人が差です。
totalとlineが全く関係ないと仮定した世界での、この差を1000回シミュレーションして計算します。
この1000回の差をヒストグラムにして視覚化します。
赤い垂線が観察された差、690万9千人の線です。totalとlineが無関係と仮定した世界ではこの690万9千人は、ごくありふれた起こりうる差であることがわかります。
p値を計算します。
0.822とt.test()関数でのp値よりも大きな値です。
t.test()関数では、
でした。
やはり、山手線と東海道線のtotalの平均値は統計学的に有意な差は認められないですね。
続いて、信頼区間を求めましょう。
まずは、ブートストラップ法で1000回、両路線の平均値の差を計算します。
信頼区間を算出します。
-3672万3千人から5810万8千人です。
t.test()関数での信頼区間もみておきます。
グラフにします。
赤い垂直線が0の位置です。緑の区間が95%信頼区間です。0を含んでいますので、山手線の駅のtotalの平均値と東海道線の駅のtotalの平均値の差は差がないことがわかります。
今回は以上です。
次回は、
です。
初めから読むには、
です。
今回のコードは以下になります。
#
# 山手線と東海道線だけのデータフレームを作成
df2 <- df |>
filter(line == "Yamanote Line" | line == "Tokaido Line") |>
mutate(line = factor(line, levels = c("Yamanote Line", "Tokaido Line")))
summary(df2)
#
# totalのグラフ
df2 |>
mutate(station = reorder(station, total)) |>
ggplot(aes(x = station, y = total)) +
geom_col(aes(fill = line)) +
coord_flip() +
theme(legend.position = "none")
#
# totalの平均値
df2 |>
group_by(line) |>
summarize(avg_total = mean(total))
#
# t.test
t_test_result <- t.test(df2$total[df2$line == "Yamanote Line"],
df2$total[df2$line == "Tokaido Line"])
t_test_result
#
# infer package の読み込み
library(infer)
#
# 観測された平均値の差
observed_difference <- df2 |>
specify(total ~ line) |>
calculate(stat = "diff in means", order = c("Yamanote Line", "Tokaido Line"))
observed_difference
71282 - 64373
#
# null distribution を生成
set.seed(141)
null_dist <- df2 |>
specify(total ~ line) |>
hypothesize(null = "independence") |>
generate(reps = 1000, type = "permute") |>
calculate(stat = "diff in means",
order = c("Yamanote Line", "Tokaido Line"))
#
# null distribution を視覚化
null_dist |>
visualize() +
shade_p_value(observed_difference,
direction = "two-sided")
#
# p-value
p_value <- null_dist |>
get_p_value(obs_stat = observed_difference,
direction = "two-sided")
p_value
#
# t.test()関数のp値
t_test_result$p.value
#
# 信頼区間の算出
# bootstrap distributionの生成
set.seed(167)
boot_dist <- df2 |>
specify(total ~ line) |>
generate(reps = 1000, type = "bootstrap") |>
calculate(stat = "diff in means",
order = c("Yamanote Line", "Tokaido Line"))
#
# 信頼区間を算出
percentile_ci <- boot_dist |>
get_confidence_interval(level = 0.95)
percentile_ci
#
# t.test()の信頼区間
t_test_result$conf.int
#
# boot_distを視覚化
boot_dist |>
visualize() +
shade_confidence_interval(endpoints = percentile_ci) +
geom_vline(xintercept = 0, color = "red")
#