Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

2009年の東京都の駅の乗車人数のデータの分析4 - inferパッケージを利用して、平均値の差の検定(t 検定)

Bing Image Creator で生成: Landscape photography, natural green field, blue wide sky, flying a butterfly

www.crosshyou.info

の続きです。

前回の分析(のようなもの)で、山手線と東海道線の駅が乗車人数の平均値の上位2路線だとわかりました。今回は、この2つの路線の平均値に統計的に有意な差があるかどうかをinferパッケージを使って調べてみます。inferパッケージは、シミュレーションベースの統計検定をするパッケージです。

infer.netlify.app

こちらのウェブサイトに詳細があります。

今回は

https://infer.netlify.app/articles/observed_stat_examples#one-numerical-variable-one-categorical-2-levels-diff-in-means

https://infer.netlify.app/articles/observed_stat_examples#one-numerical-variable-one-categorical-2-levels-diff-in-means-1

を参考にしています。

はじめに、山手線と東海道線だけのデータフレームを作成します。

それぞれの駅の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の平均値の差は差がないことがわかります。

今回は以上です。

次回は、

www.crosshyou.info

です。

初めから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# 山手線と東海道線だけのデータフレームを作成
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")
#