x <- c(2, 3, 4, 5, 100) # 100は外れ値
mean(x) # 外れ値に引っ張られる[1] 22.8
median(x) # 外れ値の影響が小さい[1] 4
分類: 幹(全員必須)
依存関係: U0 → … → U10 → U11 → U12(統計的推測の基礎)
学習目標:
dplyr::group_by() + summarise() でグループ別の記述統計量を算出できるデータを手に入れたら、いきなり統計的検定に入るのではなく、まずデータの特徴を数値で要約します。これが記述統計(descriptive statistics)です。
記述統計の目的は:
データの「真ん中」を表す指標です。
| 指標 | 意味 | Rの関数 | 特徴 |
|---|---|---|---|
| 平均値(mean) | すべての値の合計 ÷ 個数 | mean() |
外れ値の影響を受けやすい |
| 中央値(median) | 値を並べたときの真ん中 | median() |
外れ値に頑健 |
| 最頻値(mode) | 最も頻度が高い値 | 専用関数なし | カテゴリ変数にも使える |
\[\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i\]
年収のように分布が偏っているデータでは中央値の方が「代表的な値」を表すことがあります。
データがどの程度散らばっているかを表す指標です。
| 指標 | 意味 | Rの関数 |
|---|---|---|
| 分散(variance) | 偏差の二乗の平均 | var()(不偏分散) |
| 標準偏差(SD) | 分散の正の平方根 | sd()(不偏SD) |
| 範囲(range) | 最大値 − 最小値 | range(), diff(range()) |
| 四分位範囲(IQR) | 第3四分位 − 第1四分位 | IQR() |
\[s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2, \quad s = \sqrt{s^2}\]
Rの var() と sd() は \(n-1\) で割る不偏推定量を返します。
2変数の直線的な関係の強さを表す指標で、\(-1\) から \(1\) の値をとります。
\[r_{xy} = \frac{\sum(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum(x_i - \bar{x})^2 \cdot \sum(y_i - \bar{y})^2}}\]
| \(|r|\) の目安 | 解釈 |
|---|---|
| 0.00 〜 0.20 | ほぼ無相関 |
| 0.20 〜 0.40 | 弱い相関 |
| 0.40 〜 0.70 | 中程度の相関 |
| 0.70 〜 1.00 | 強い相関 |
注意: 相関係数は直線的な関係の強さを測るものです。曲線的な関係がある場合、相関係数が低くても強い関係がある可能性があります。必ず散布図と合わせて確認してください。
効果量(effect size)は、統計的有意性とは別に、効果の大きさを定量化する指標です。
| 効果量 | 小 | 中 | 大 |
|---|---|---|---|
| Cohenの\(d\) | 0.2 | 0.5 | 0.8 |
| 相関係数\(r\) | 0.1 | 0.3 | 0.5 |
p値が小さくてもサンプルサイズが大きいだけで実質的な差が小さい場合があります。効果量を報告することで、結果の実質的な意味を評価できます。
平均値と中央値の使い分けについて、正しいのはどれですか?
平均値は外れ値の影響を受けやすく、分布が偏っているとデータの「典型的な値」からずれてしまいます。中央値は値の大小順で真ん中にある値なので、外れ値の影響をほとんど受けません。
年収データのように右に裾が長い分布では、平均値 > 中央値になることが多く、中央値の方が実態に近い代表値になります。
Rの var() 関数が返す値は何ですか?
Rの var() は \(n-1\) で割る不偏分散を返します。母分散の推定量として \(n\) ではなく \(n-1\) で割ることで、推定のバイアスを補正しています。
\(n\) で割る標本分散が欲しい場合は var(x) * (n-1) / n とするか、sum((x - mean(x))^2) / length(x) と手計算します。
summary() 関数で数値変数に対して表示される情報に含まれないものはどれですか?
summary() は Min, 1st Qu., Median, Mean, 3rd Qu., Max の6つの値を表示します。標準偏差は含まれないので、sd() で別途計算する必要があります。
相関係数が \(r = -0.85\) のとき、2変数の関係はどのようなものですか?
\(|r| = 0.85\) は強い相関です。符号がマイナスなので、一方が増えると他方が減る負の相関です。相関の強さは絶対値で判断し、方向は符号で判断します。
cor() 関数にデータフレームの数値列を渡すと何が返されますか?
cor(df) は全変数ペアのピアソン相関係数を要素とする相関行列を返します。2変数だけの相関係数が欲しい場合は cor(x, y) とします。
検定結果(p値)も欲しい場合は cor.test(x, y) を使います。
Cohenの\(d = 0.5\) はどのような効果量と見なされますか?
Cohenの基準では、\(d = 0.2\) が小、\(d = 0.5\) が中、\(d = 0.8\) が大とされています。\(d = 0.5\) は2群の平均値差が標準偏差の半分であることを意味します。
ただしこれはあくまで目安であり、研究分野や文脈によって「意味のある大きさ」は異なります。
IQR() は何を計算しますか?
IQR(四分位範囲, Interquartile Range)は第3四分位数(75パーセンタイル)と第1四分位数(25パーセンタイル)の差です。データの中央50%が収まる範囲を表し、外れ値の影響を受けにくい散布度の指標です。
箱ひげ図(box plot)のひげの長さの基準としても使われます。
「統計的に有意だが効果量が小さい」結果が生じる典型的な原因は?
サンプルサイズが大きくなると、ごくわずかな差でもp値が小さくなり「統計的に有意」と判定されます。しかし実質的な差が小さければ、その結果に実用上の意味はほとんどありません。
だからこそ、p値だけでなく効果量を報告し、結果の実質的な意味を評価することが推奨されています。
iris の数値変数(1〜4列目)について、平均、中央値、標準偏差、最小値、最大値を一覧する表を dplyr::summarise() で作成してください。
pacman::p_load(tidyverse)
iris %>%
dplyr::summarise(dplyr::across(1:4, list(
mean = ~ mean(.x),
median = ~ median(.x),
sd = ~ sd(.x),
min = ~ min(.x),
max = ~ max(.x)
))) %>%
tidyr::pivot_longer(everything(),
names_to = c("variable", "stat"),
names_sep = "_(?=[^_]+$)") %>%
tidyr::pivot_wider(names_from = stat, values_from = value)pivot_longer → pivot_wider で見やすい表に整形しています。
BaseballDecade.csv の salary(年俸)について、平均値と中央値を比較してください。どちらが大きいですか?なぜそうなるか考察してください。
平均値の方が大きくなるはずです。年俸は右に裾の長い分布(少数の高額選手が平均を引き上げる)になるため、平均値 > 中央値 になります。このような場合、「代表的な年俸」を表すには中央値の方が適切です。
iris の Sepal.Length と Petal.Length の相関係数を計算し、散布図も描いてください。相関係数と散布図の関係を確認してください。
\(r \approx 0.87\) で強い正の相関があり、散布図でも右上がりの直線的なパターンが見えます。ただし、Speciesごとに色分けすると、種ごとにクラスタが分かれていることもわかります。
BaseballDecade.csv を球団(team)ごとにグループ化し、salary の平均、中央値、標準偏差を計算してください。
pacman::p_load(tidyverse)
df <- readr::read_csv("../data/BaseballDecade.csv")
df %>%
dplyr::group_by(team) %>%
dplyr::summarise(
n = dplyr::n(),
mean_salary = mean(salary, na.rm = TRUE),
median_salary = median(salary, na.rm = TRUE),
sd_salary = sd(salary, na.rm = TRUE)
) %>%
dplyr::arrange(dplyr::desc(mean_salary))球団間で平均年俸に差があることがわかります。また、平均と中央値の乖離が大きい球団は、一部の高額選手が平均を引き上げていることを示唆しています。
iris の数値変数の相関行列を計算し、round() で小数点以下2桁に丸めてください。最も相関が高い変数ペアと最も低い変数ペアを特定してください。
最も相関が高いのは Petal.Length と Petal.Width(\(r \approx 0.96\))、最も相関が低いのは Sepal.Width と他の変数(特に Petal.Length との \(r \approx -0.43\))です。
Sepal.Width だけが他の変数と負の相関を示すのは、Speciesの影響(シンプソンのパラドックス)が関係しています。
BaseballDecade.csv の投手と野手で salary の平均を比較し、Cohenの\(d\)を手計算してください。
\(d = \frac{\bar{x}_1 - \bar{x}_2}{s_p}\)、ここで \(s_p = \sqrt{\frac{(n_1-1)s_1^2 + (n_2-1)s_2^2}{n_1+n_2-2}}\)
pacman::p_load(tidyverse)
df <- readr::read_csv("../data/BaseballDecade.csv")
df2 <- df %>%
dplyr::mutate(pos2 = dplyr::if_else(position == "投手", "投手", "野手"))
# グループ別統計量
stats <- df2 %>%
dplyr::group_by(pos2) %>%
dplyr::summarise(
n = dplyr::n(),
m = mean(salary, na.rm = TRUE),
s = sd(salary, na.rm = TRUE)
)
stats
# Cohenのd(プールされたSD)
n1 <- stats$n[1]; n2 <- stats$n[2]
m1 <- stats$m[1]; m2 <- stats$m[2]
s1 <- stats$s[1]; s2 <- stats$s[2]
sp <- sqrt(((n1 - 1) * s1^2 + (n2 - 1) * s2^2) / (n1 + n2 - 2))
d <- (m1 - m2) / sp
dCohenの\(d\)の絶対値が0.2未満なら小さい差、0.5程度なら中程度、0.8以上なら大きい差と解釈します。
iris の Sepal.Length について、Species別にヒストグラムを描き、各群の平均と標準偏差を重ねて表示してください。
pacman::p_load(tidyverse)
# 群別の統計量
stats <- iris %>%
dplyr::group_by(Species) %>%
dplyr::summarise(m = mean(Sepal.Length), s = sd(Sepal.Length))
ggplot2::ggplot(iris, ggplot2::aes(x = Sepal.Length, fill = Species)) +
ggplot2::geom_histogram(bins = 15, alpha = 0.5, position = "identity") +
ggplot2::geom_vline(data = stats, ggplot2::aes(xintercept = m, color = Species),
linewidth = 1, linetype = "dashed") +
ggplot2::labs(title = "Species別 Sepal.Length の分布")破線が各群の平均値です。3群の分布がどの程度重なっているかは、効果量(群間差÷SD)と対応しています。
cor.test() を使って、iris の Sepal.Length と Petal.Length の相関係数の検定を行ってください。結果からp値と95%信頼区間を読み取ってください。
cor() は相関係数だけを返しますが、cor.test() は検定統計量(t値)、p値、信頼区間も返します。相関係数が統計的に有意かどうかは、帰無仮説 \(\rho = 0\)(母相関がゼロ)を検定しています。
課題: BaseballDecade.csv を読み込み、以下の記述統計レポートをAIと協力して作成してください。
salary の要約統計量(平均、中央値、SD、IQR)提出物: AIとの対話ログ、コード、レポート。
課題: 「相関と因果」の違いについてAIに質問しながら整理してください。
以下の点を含めてください:
iris データセットの Sepal.Width を題材に)提出物: AIとの対話ログ、考察。
このユニットでは、データの特徴を数値で要約する記述統計を学びました:
mean(), median()(分布の偏りに応じて使い分け)var(), sd(), IQR(), range()(Rは不偏推定量を返す)cor()(相関行列)、cor.test()(検定付き)group_by() + summarise() で群別の記述統計量次のユニット: U12. 統計的推測の基礎では、標本から母集団を推測する枠組み(検定、信頼区間、検出力)を学びます。
進捗: あなたは今 11-C-8 まで完了しました!(と仮定)次は 11-B-1 に進みましょう。