0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

データ解析では、次のような表記をよく見かけます。

平均値 $\pm$ 何か

ところが、この「何か」には少なくとも次の候補があります。

  • 標準偏差(Standard Deviation: SD)
  • 標準誤差(Standard Error: SE)
  • 95%信頼区間(95% Confidence Interval: 95% CI)

これらは似た場所に登場しますが、表しているものは同じではありません

大まかには、次のように整理できます。

用語 何を表すか 主に答える問い
標準偏差(SD) 個々のデータのばらつき 測定値は平均の周りにどれくらい散らばっているか
標準誤差(SE) 標本平均のばらつき 別の標本を取ると、平均値はどれくらい動くか
95%信頼区間(95% CI) 母平均に対する区間推定 この手順で母平均をどの範囲に推定するか

この記事では、標本平均の標準誤差(standard error of the mean: SEM)を扱います。本文では簡潔にSEと表記します。

正規分布からダミーデータを作り、Google Colabでシミュレーションします。

単に式を並べるのではなく、

  1. 1つの標本を見る
  2. 同じ標本抽出を何度も繰り返す
  3. 信頼区間を何度も作る

という順番で、標準偏差・標準誤差・95%信頼区間の違いを確認します。

この記事のゴール

この記事を読み終えると、次の点を説明できるようになることを目指します。

  • 標準偏差と標準誤差は、何のばらつきを表しているのか
  • 標準誤差がなぜ$s/\sqrt{n}$で計算されるのか
  • 標本サイズを増やすと標準誤差がどう変わるのか
  • 95%信頼区間の「95%」は何を意味するのか
  • グラフのエラーバーにSD・SE・CIのどれを使うべきか

先に結論

最初に、この記事の要点を一文ずつまとめます。

標準偏差は「個々のデータ」のばらつきです。

標準誤差は「標本平均」のばらつきです。

95%信頼区間は、標準誤差と確率分布を使って母平均を区間推定したものです。

覚え方としては、次の3行が便利です。

SD  :データを見る
SE  :平均の揺れを見る
95% CI:母平均を区間で推定する

母集団と標本

統計用語に入る前に、「母集団」と「標本」を確認します。

母集団

知りたい対象全体を母集団と呼びます。

たとえば、ある条件で得られうるすべての測定値を母集団と考えます。

母集団の平均を$\mu$、標準偏差を$\sigma$と書きます。

ただし、実際の研究や調査では、母集団のすべてを測定できるとは限りません。そのため、$\mu$や$\sigma$は通常は未知です。

標本

母集団から実際に取り出して観測した一部のデータを標本と呼びます。

標本サイズを$n$、各測定値を$x_1, x_2, \dots, x_n$とします。

標本から計算した平均は標本平均であり、次の式で表されます。

$$\bar{x}=\frac{1}{n}\sum_{i=1}^{n}x_i$$

標本平均$\bar{x}$を使って、未知の母平均$\mu$を推定します。

Google Colabで準備する

以下のコードはそのままGoogle Colabで実行できます。

from pathlib import Path

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 図の保存先
OUT_DIR = Path("figures")
OUT_DIR.mkdir(exist_ok=True)

# 図を少し見やすくする設定
plt.rcParams.update({
    "figure.dpi": 120,
    "savefig.dpi": 180,
    "font.size": 11,
    "axes.titlesize": 13,
    "axes.labelsize": 11,
    "legend.fontsize": 10,
})

ダミーデータを作る

今回は、教育用として次の母集団を仮定します。

  • 母平均:$\mu=100$
  • 母標準偏差:$\sigma=15$
  • 分布:正規分布
  • 標本サイズ:$n=30$

図中のa.u.はarbitrary units、すなわち任意単位を意味します。

シミュレーションなので、母平均と母標準偏差をあらかじめ知っています。

実際のデータ解析では、これらは未知であり、標本から推定します。

TRUE_MEAN = 100.0
TRUE_SD = 15.0
N = 30

# 乱数を固定して、誰が実行しても同じ結果にする
rng = np.random.default_rng(42)

# 正規分布から30個のダミーデータを作る
sample = rng.normal(
    loc=TRUE_MEAN,
    scale=TRUE_SD,
    size=N
)

# 標本平均
sample_mean = np.mean(sample)

# 標本標準偏差
# ddof=1 とすると、分母が n-1 になる
sample_sd = np.std(sample, ddof=1)

# 標本平均の標準誤差
sample_se = sample_sd / np.sqrt(N)

# 母標準偏差が未知なので、t分布を用いて95%信頼区間を計算する
confidence_level = 0.95
alpha = 1 - confidence_level
t_crit = stats.t.ppf(
    1 - alpha / 2,
    df=N - 1
)

ci_low = sample_mean - t_crit * sample_se
ci_high = sample_mean + t_crit * sample_se

print(f"sample size n        = {N}")
print(f"sample mean          = {sample_mean:.2f}")
print(f"sample SD            = {sample_sd:.2f}")
print(f"standard error (SE)  = {sample_se:.2f}")
print(f"95% CI               = [{ci_low:.2f}, {ci_high:.2f}]")

実行結果は次のようになります。

sample size n        = 30
sample mean          = 100.25
sample SD            = 11.65
standard error (SE)  = 2.13
95% CI               = [95.90, 104.60]

同じ30個のデータから計算しているのに、

  • 標準偏差は11.65
  • 標準誤差は2.13
  • 95%信頼区間は95.90から104.60

となりました。

数値が違うのは、3つが異なる問いに答えているためです。

1. 標準偏差:個々のデータのばらつき

標準偏差は、個々の測定値が平均値の周りにどれくらい散らばっているかを表します。

今回使う標本標準偏差$s$は、次の式で計算されます。

$$s=\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\bar{x})^2}$$

式の中では、各データ$x_i$と標本平均$\bar{x}$の差を求め、その差を二乗しています。

つまり、標準偏差は「各データが平均からどれくらい離れているか」をまとめた尺度です。

問い1

なぜ分母が$n-1$なのか

標本から母集団のばらつきを推定するときには、分散の分母として$n$ではなく$n-1$を使うのが一般的です。

NumPyのnp.std()は、初期設定では分母に$n$を使います。この記事では標本標準偏差を計算するため、次のようにddof=1を指定しています。

sample_sd = np.std(sample, ddof=1)

$n-1$を使う理由は、標本平均$\bar{x}$を同じデータから推定したことによって失われる自由度を補正するため、と考えられます。

ここでは、「標本標準偏差を計算するときはddof=1」と覚えておけば十分です。

標本と標準偏差を図にする

fig, ax = plt.subplots(figsize=(10, 5))

bins = np.linspace(65, 125, 13)

counts, _, _ = ax.hist(
    sample,
    bins=bins,
    alpha=0.65,
    edgecolor="black",
    label="Observed data"
)

# 標本平均 ± 1標準偏差の範囲
ax.axvspan(
    sample_mean - sample_sd,
    sample_mean + sample_sd,
    alpha=0.18,
    label="Mean ± 1 sample SD"
)

# 標本平均
ax.axvline(
    sample_mean,
    linewidth=2.2,
    label=f"Sample mean = {sample_mean:.2f}"
)

# 各データの位置を短い縦線として表示する
rug_y = -0.28
ax.scatter(
    sample,
    np.full_like(sample, rug_y),
    marker="|",
    s=120,
    clip_on=False
)

ax.set_title(
    "One sample: SD describes the spread of individual observations"
)
ax.set_xlabel("Measured value [a.u.]")
ax.set_ylabel("Count")
ax.set_ylim(
    bottom=-0.65,
    top=max(counts) * 1.18
)
ax.legend()

fig.tight_layout()
fig.savefig(
    OUT_DIR / "fig01_sample_sd.png",
    bbox_inches="tight"
)
plt.show()

fig01_sample_sd.png

この標本では、

$$
\bar{x}=100.25
$$

$$
s=11.65
$$

でした。

薄く塗った範囲は、標本平均$\pm 1$標準偏差、すなわち約88.60から111.90です。

ただし、この範囲は信頼区間ではありません。また、「必ずこの範囲に一定割合のデータが入る」という意味でもありません。

標準偏差はあくまで、個々のデータの散らばり方を表す1つの尺度です。

2. 標準誤差:標本平均のばらつき

ここからが、標準偏差と標準誤差を区別する重要な部分です。

先ほどは、母集団から30個のデータを1回だけ取り出しました。

しかし、同じ母集団から別の30個を取り出せば、標本平均は少し変わります。

さらに別の30個を取り出せば、平均はまた変わります。

このように標本抽出を繰り返したときにできる、標本平均の分布を標本分布と呼びます。

標本平均の標本分布の標準偏差が、標本平均の標準誤差です。

母標準偏差$\sigma$が分かっている理論上の標準誤差は、次の式になります。

$$SD(\bar{X})=\frac{\sigma}{\sqrt{n}}$$

実際には$\sigma$が未知であることが多いため、標本標準偏差$s$を使って推定します。

$$SE_{\bar{x}}=\frac{s}{\sqrt{n}}$$

今回の標本では、

$$SE_{\bar{x}}=\frac{11.65}{\sqrt{30}}\approx2.13$$

です。

標本抽出を5,000回繰り返す

標準誤差の意味を、シミュレーションで確認します。

1回につき30個のデータを取り出し、標本平均を計算します。これを5,000回繰り返します。

N_SIM = 5000

rng_sim = np.random.default_rng(12345)

# 1回につき30個の測定を行い、それを5,000回繰り返す
repeated_samples = rng_sim.normal(
    loc=TRUE_MEAN,
    scale=TRUE_SD,
    size=(N_SIM, N)
)

# 各回の標本平均
sample_means = repeated_samples.mean(axis=1)

# 個々の測定値の標準偏差
empirical_sd_individual = repeated_samples.ravel().std(ddof=1)

# 5,000個の標本平均の標準偏差
empirical_sd_means = sample_means.std(ddof=1)

# 母標準偏差が既知の場合の理論値
theoretical_se = TRUE_SD / np.sqrt(N)

print(
    f"SD of individual observations       = "
    f"{empirical_sd_individual:.3f}"
)
print(
    f"SD of {N_SIM} sample means          = "
    f"{empirical_sd_means:.3f}"
)
print(
    f"Theoretical sigma / sqrt(n)         = "
    f"{theoretical_se:.3f}"
)

実行結果は次のようになります。

SD of individual observations       = 14.976
SD of 5000 sample means              = 2.744
Theoretical sigma / sqrt(n)          = 2.739

個々のデータの標準偏差は約14.98でした。

一方、5,000個の標本平均の標準偏差は約2.74でした。

理論値は、

$$
\frac{\sigma}{\sqrt{n}}=
\frac{15}{\sqrt{30}}
\approx
2.739
$$

なので、シミュレーション結果とよく一致しています。

分布も描いてみます。

fig, axes = plt.subplots(
    1,
    2,
    figsize=(12, 4.5),
    sharex=True
)

# 左:個々の測定値
axes[0].hist(
    repeated_samples.ravel(),
    bins=60,
    density=True,
    alpha=0.75,
    edgecolor="white"
)
axes[0].axvline(
    TRUE_MEAN,
    linewidth=2,
    label="True mean"
)
axes[0].set_title(
    f"Individual observations\n"
    f"SD ≈ {empirical_sd_individual:.2f}"
)
axes[0].set_xlabel("Value [a.u.]")
axes[0].set_ylabel("Density")
axes[0].legend()

# 右:標本平均
axes[1].hist(
    sample_means,
    bins=45,
    density=True,
    alpha=0.75,
    edgecolor="white"
)
axes[1].axvline(
    TRUE_MEAN,
    linewidth=2,
    label="True mean"
)
axes[1].set_title(
    f"Sample means (n={N})\n"
    f"SD of means ≈ {empirical_sd_means:.2f}"
)
axes[1].set_xlabel("Sample mean [a.u.]")
axes[1].set_ylabel("Density")
axes[1].legend()

# 横軸をそろえて、分布の幅を比較しやすくする
for ax in axes:
    ax.set_xlim(50, 150)

fig.suptitle(
    "The sampling distribution of the mean is narrower",
    y=1.03
)
fig.tight_layout()
fig.savefig(
    OUT_DIR / "fig02_sampling_distribution.png",
    bbox_inches="tight"
)
plt.show()

fig02_sampling_distribution.png

左側は個々の測定値の分布です。幅広く散らばっています。

右側は30個のデータから計算した標本平均の分布です。母平均100の周りに、より狭く集まっています。

ここから、標準偏差と標準誤差の違いを整理できます。

  • 標準偏差:個々の測定値の分布の幅
  • 標準誤差:標本平均の分布の幅

平均を取ると、正負のばらつきがある程度打ち消し合います。そのため、個々の測定値よりも標本平均のほうが安定します。

3. 標本サイズを増やすと標準誤差は小さくなる

標準誤差は、次の式で表されます。

$$
SE_{\bar{x}}=
\frac{s}{\sqrt{n}}
$$

したがって、他の条件が同じなら、標本サイズ$n$が大きくなるほど標準誤差は小さくなります。

この関係をシミュレーションで確認します。

n_values = np.array([
    5,
    10,
    20,
    30,
    50,
    100,
    200
])

N_SIM_PER_N = 5000

rng_n = np.random.default_rng(2025)

empirical_se_by_n = []

for n in n_values:
    sims = rng_n.normal(
        loc=TRUE_MEAN,
        scale=TRUE_SD,
        size=(N_SIM_PER_N, n)
    )

    means_n = sims.mean(axis=1)

    empirical_se_by_n.append(
        means_n.std(ddof=1)
    )

empirical_se_by_n = np.array(empirical_se_by_n)

theoretical_se_by_n = (
    TRUE_SD / np.sqrt(n_values)
)

print(
    " n   empirical SE   "
    "theoretical sigma/sqrt(n)"
)

for n, empirical, theoretical in zip(
    n_values,
    empirical_se_by_n,
    theoretical_se_by_n
):
    print(
        f"{n:3d}      "
        f"{empirical:6.3f}               "
        f"{theoretical:6.3f}"
    )

実行結果は次のようになります。

 n   empirical SE   theoretical sigma/sqrt(n)
  5       6.671                6.708
 10       4.763                4.743
 20       3.430                3.354
 30       2.731                2.739
 50       2.117                2.121
100       1.502                1.500
200       1.075                1.061
fig, ax = plt.subplots(figsize=(8.5, 5))

ax.plot(
    n_values,
    empirical_se_by_n,
    marker="o",
    linewidth=2,
    label="Simulation: SD of sample means"
)

ax.plot(
    n_values,
    theoretical_se_by_n,
    marker="s",
    linestyle="--",
    linewidth=2,
    label=r"Theory: $\sigma/\sqrt{n}$"
)

ax.set_title(
    "Standard error decreases as sample size increases"
)
ax.set_xlabel("Sample size n")
ax.set_ylabel(
    "Standard error of the mean [a.u.]"
)
ax.set_xticks(n_values)
ax.legend()

fig.tight_layout()
fig.savefig(
    OUT_DIR / "fig03_se_sample_size.png",
    bbox_inches="tight"
)
plt.show()

fig03_se_sample_size.png

シミュレーション値と理論値は、よく一致しています。

ここで重要なのは、標準誤差が$n$に反比例するのではなく、$\sqrt{n}$に反比例することです。

たとえば、標準誤差を半分にしたければ、

$$
\frac{1}{\sqrt{n}}
\longrightarrow
\frac{1}{2}
\frac{1}{\sqrt{n}}
$$

とする必要があります。

そのためには、標本サイズを4倍にする必要があります。

標本サイズを2倍にしても、標準誤差は半分にはなりません。

また、標本サイズを増やして小さくなるのは、主として平均値の推定の不確かさです。

個々の測定値そのもののばらつきが、データを多く集めただけで消えるわけではありません。

4. 95%信頼区間:母平均を区間で推定する

標本平均は、母平均をぴったり言い当てるとは限りません。

そこで、1つの値だけではなく、母平均を区間として推定します。

母標準偏差$\sigma$が未知で、母集団を正規分布とみなす1標本の平均では、95%信頼区間を次のように計算できます。

$$
\bar{x}
\pm
t_{0.975,n-1}
\frac{s}{\sqrt{n}}
$$

ここで、

  • $\bar{x}$:標本平均
  • $s$:標本標準偏差
  • $n$:標本サイズ
  • $t_{0.975,n-1}$:自由度$n-1$の$t$分布の上側2.5%点

です。

今回の標本では、

$$
\bar{x}=100.25
$$

$$
SE_{\bar{x}}=2.13
$$

$$
t_{0.975,29}\approx2.045
$$

なので、信頼区間の半幅は、

$$
2.045\times2.13
\approx
4.35
$$

です。

したがって、95%信頼区間は、

$$
100.25\pm4.35
$$

すなわち、

$$
[95.90,\ 104.60]
$$

となります。

問2

なぜ$t$分布を使うのか

母標準偏差$\sigma$が分かっていれば、正規分布を使った区間を考えられます。

しかし通常は$\sigma$も未知であり、標本標準偏差$s$で代用します。

この追加の不確かさを考慮するため、特に標本サイズが小さい場合には、正規分布より裾の厚い$t$分布を使います。

標本サイズが大きくなると、$t$分布は標準正規分布に近づきます。

5. 95%信頼区間の「95%」は何を意味するのか

ここは、最も誤解されやすい部分です。

95%信頼区間は、個々のデータの95%が入る範囲ではありません。

また、頻度論的な解釈では、計算後の1本の区間について、

母平均が95%の確率でこの区間に入っている

と厳密に解釈するわけでもありません。

基本的な意味は、次のとおりです。

同じ条件で標本抽出と区間計算を何度も繰り返すと、作られた区間の約95%が真の母平均を含む。

これをシミュレーションで確認します。

100個の95%信頼区間を作る

N_EXPERIMENTS = 100

rng_ci = np.random.default_rng(123)

# 30個の測定からなる実験を100回行う
experiments = rng_ci.normal(
    loc=TRUE_MEAN,
    scale=TRUE_SD,
    size=(N_EXPERIMENTS, N)
)

# 各実験の平均、SD、SE
means = experiments.mean(axis=1)
sds = experiments.std(axis=1, ddof=1)
ses = sds / np.sqrt(N)

# 各実験の95%信頼区間
ci_lows = means - t_crit * ses
ci_highs = means + t_crit * ses

# 真の母平均100を含むかどうか
covered = (
    (ci_lows <= TRUE_MEAN)
    &
    (TRUE_MEAN <= ci_highs)
)

# 図を読みやすくするため、標本平均の順に並べる
order = np.argsort(means)

means_sorted = means[order]
lows_sorted = ci_lows[order]
highs_sorted = ci_highs[order]
covered_sorted = covered[order]

y = np.arange(
    1,
    N_EXPERIMENTS + 1
)

print(
    f"Intervals containing the true mean: "
    f"{covered.sum()} / {N_EXPERIMENTS} "
    f"({covered.mean() * 100:.1f}%)"
)

実行結果は次のようになります。

Intervals containing the true mean: 94 / 100 (94.0%)
fig, ax = plt.subplots(
    figsize=(9, 10)
)

for (
    yi,
    mean_i,
    low_i,
    high_i,
    is_covered
) in zip(
    y,
    means_sorted,
    lows_sorted,
    highs_sorted,
    covered_sorted
):
    color = (
        "tab:blue"
        if is_covered
        else "tab:red"
    )

    ax.hlines(
        yi,
        low_i,
        high_i,
        color=color,
        linewidth=1.4
    )

    ax.plot(
        mean_i,
        yi,
        "o",
        color=color,
        markersize=3.5
    )

ax.axvline(
    TRUE_MEAN,
    color="black",
    linestyle="--",
    linewidth=2,
    label=f"True mean = {TRUE_MEAN:.0f}"
)

ax.set_title(
    "100 independently calculated 95% confidence intervals\n"
    "Red intervals miss the true mean"
)
ax.set_xlabel(
    "Estimated population mean [a.u.]"
)
ax.set_ylabel(
    "Repeated sample "
    "(sorted by sample mean)"
)
ax.legend()

fig.tight_layout()
fig.savefig(
    OUT_DIR / "fig04_confidence_intervals.png",
    bbox_inches="tight"
)
plt.show()

fig04_confidence_intervals.png

黒い破線が真の母平均$\mu=100$です。

青い区間は真の母平均を含み、赤い区間は含みません。

この100回では94本、つまり94%の区間が真の母平均を含みました。

「95%信頼区間」だからといって、100回のうち必ず95回成功するわけではありません。100回程度では、偶然による上下があります。

そこで、同じ計算を10,000回行ってみます。

N_LARGE = 10000

rng_large = np.random.default_rng(999)

large_samples = rng_large.normal(
    loc=TRUE_MEAN,
    scale=TRUE_SD,
    size=(N_LARGE, N)
)

large_means = large_samples.mean(axis=1)
large_sds = large_samples.std(axis=1, ddof=1)
large_ses = large_sds / np.sqrt(N)

large_lows = (
    large_means
    -
    t_crit * large_ses
)

large_highs = (
    large_means
    +
    t_crit * large_ses
)

large_covered = (
    (large_lows <= TRUE_MEAN)
    &
    (TRUE_MEAN <= large_highs)
)

print(
    f"Coverage in {N_LARGE} experiments: "
    f"{large_covered.mean() * 100:.2f}%"
)

実行結果は次のようになります。

Coverage in 10000 experiments: 95.40%

反復回数を増やすと、被覆率は設定した95%に近づきました。

このシミュレーションでは、

  • 観測値は互いに独立
  • 母集団は正規分布
  • 各回の標本サイズは30
  • $t$分布を使った平均の信頼区間

という条件を満たしているため、理論どおりの挙動を確認できます。

SD・SE・95% CIの関係をまとめる

今回得られた数値を並べてみます。

指標 今回の値 表しているもの
標本平均 100.25 30個のデータの中心
標本標準偏差 11.65 個々のデータのばらつき
標準誤差 2.13 標本平均の推定上のばらつき
95%信頼区間 95.90〜104.60 母平均に対する区間推定

標準誤差は標準偏差から計算されます。

$$
SE_{\bar{x}}=
\frac{s}{\sqrt{n}}
$$

95%信頼区間は、標準誤差に$t$分布の臨界値を掛けて計算されます。

$$
95%\ CI=
\bar{x}
\pm
t_{0.975,n-1}
SE_{\bar{x}}
$$

したがって、3つは無関係ではありません。

しかし、それぞれが答える問いは異なります。

標準偏差
    ↓  nの平方根で割る
標準誤差
    ↓  t分布の臨界値を掛ける
信頼区間の半幅

よくある誤解

誤解1:SDとSEはどちらも「誤差」なので同じ

同じではありません。

  • SDは個々のデータのばらつき
  • SEは統計量、ここでは標本平均の標本分布のばらつき

です。

SEは通常、SDより小さくなります。

誤解2:SEが小さければ、個々のデータもそろっている

必ずしもそうではありません。

標本サイズ$n$を大きくすると、個々のデータのばらつきが大きくても、平均のSEは小さくできます。

つまり、

個々のデータは大きくばらついているが、平均値は精密に推定できる

という状況は起こりえます。

誤解3:95%信頼区間には個々のデータの95%が入る

入りません。

95%信頼区間は、母平均などの母数に対する区間推定です。

個々の将来観測値が入る範囲を考えたい場合は、予測区間など別の概念が必要です。

誤解4:今回の95%信頼区間には、95%の確率で母平均がある

頻度論では、母平均$\mu$は固定された未知の値です。

ランダムなのは、標本を取り直すたびに変わる信頼区間のほうです。

したがって、95%は、

この方法で区間を作り続けたときの長期的な被覆率

として解釈します。

誤解5:標本サイズを増やせば、あらゆる問題が解決する

標本サイズを増やすと、通常はSEや信頼区間の幅が小さくなります。

しかし、次の問題は標本サイズを増やすだけでは解決しません。

  • 測定の系統誤差
  • 偏った標本抽出
  • データリーク
  • 外れ値処理の誤り
  • 観測値の非独立性
  • モデルの仮定違反

大量の偏ったデータからは、偏った推定を高精度に得てしまうこともあります。

グラフのエラーバーには何を使うべきか

SD・SE・95% CIのどれを使うかは、伝えたい内容によって変わります。

個々のデータのばらつきを伝えたい

標準偏差が候補になります。

ただし、可能であれば散布図やストリッププロットなどで、生データそのものも示すと分布が伝わりやすくなります。

平均値の推定の不確かさを伝えたい

標準誤差または信頼区間が候補になります。

特に95%信頼区間は、「平均値をどの程度の幅で推定しているか」を比較的直接的に示せます。

最も重要なこと

エラーバーを描いたら、必ず何を表しているか明記します。

mean ± SD
mean ± SE
mean with 95% CI

単に、

mean ± error

とだけ書くと、読者はその幅の意味を判断できません。

この計算を使うときの前提と注意点

この記事の95%信頼区間は、1標本の平均に対する基本的な$t$区間です。

特に小標本で理論どおりの被覆率を得るには、母集団が正規分布であるという仮定が重要です。

また、次の点にも注意が必要です。

観測値が独立であるか

同じ個体を繰り返し測定したデータ、時系列データ、同じ実験単位に属する複数の測定値などは、互いに独立でないことがあります。

相関したデータをすべて独立な$n$として数えると、SEを過小評価する可能性があります。

分布が強く歪んでいないか

強い歪み、重い裾、極端な外れ値がある場合、平均・SD・通常の$t$区間がデータをうまく要約しないことがあります。

その場合は、次の選択肢を検討します。

  • データ変換
  • ロバストな統計量
  • Bootstrap信頼区間
  • 分布に合わせた統計モデル

標本が母集団を代表しているか

信頼区間が表すのは、指定した統計モデルのもとでの標本抽出の不確かさです。

標本抽出自体に偏りがある場合、信頼区間が狭くても正しい母集団を捉えているとは限りません。

試してみる演習

コードの値を少し変えると、理解が深まります。値を変更した後は、関連するセルを上から順に再実行してください。

演習1:標本サイズを変える

N = 5

または、

N = 100

として、SD・SE・95%信頼区間がどう変わるか確認してください。

演習2:母集団のばらつきを変える

TRUE_SD = 5.0

または、

TRUE_SD = 30.0

として、標準偏差と信頼区間の幅を比較してください。

演習3:信頼水準を変える

confidence_level = 0.90

または、

confidence_level = 0.99

として、区間の幅がどう変わるか確認してください。

一般に、より高い信頼水準を求めるほど、区間は広くなります。

演習4:正規分布以外を試す

たとえば、歪みのある対数正規分布からデータを作ります。

sample = rng.lognormal(
    mean=4.5,
    sigma=0.5,
    size=N
)

小標本で通常の$t$区間を使ったとき、被覆率がどう変わるか試してみると、統計手法の仮定を考える練習になります。

まとめ

この記事では、ダミーデータと反復シミュレーションを使って、標準偏差・標準誤差・95%信頼区間を比較しました。

  • 標準偏差(SD)は、個々のデータのばらつきを表す
  • 標準誤差(SE)は、標本平均の標本分布のばらつきを表す
  • 平均のSEは、独立な観測を仮定すると$s/\sqrt{n}$で推定できる
  • 標本サイズを4倍にすると、SEはおおよそ半分になる
  • 95%信頼区間は、標本平均とSEから母平均を区間推定したもの
  • 95%は「個々のデータの95%が入る」という意味ではない
  • 95%は、同じ区間推定手順を反復したときの長期的な被覆率を表す
  • エラーバーには、SD・SE・CIのどれを使ったか必ず明記する

最後に、最も短い覚え方をもう一度示します。

SD  :データのばらつき
SE  :平均のばらつき
95% CI:母平均の区間推定
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?