統計検定などで、信頼区間を求めることは多くあります。
そこで必要なのが標準誤差という概念です。
分布によって誤差の作り方が異なったりするため厄介です。
丁寧に学んでいきましょう。
標準誤差(standard error)
標準誤差とは、データセットごとの平均値のバラつきのことを言います。
データのばらつきを説明する標準偏差とは異なるのでご注意ください。
例題を通してみていきましょう。
【例題】
母平均 \(\mu\)、母分散 \(\sigma^2\) をもつ母集団から、大きさ \(n = 100\) の標本を単純無作為抽出し、標本平均 \(50.0\) および不偏分散 \(9.0\) を得たとする。このとき、標本平均の標準誤差はいくらか。
【解説】
標準誤差を求める式は下のようになっています。
$$SE = {\sqrt{\frac{\hat{\sigma}^2}{n}}}$$
不偏分散をサンプル数で割った値の平方根になります。
$$SE = {\sqrt{\frac{9.0}{100}}}=0.3$$
答えは0.3です。
標準誤差はパーセントではなく、標本平均と同じ単位のばらつきです。今回の標本平均は \(50.0\)、標準誤差は \(0.3\) なので、「平均のまわりにだいたい \(0.3\) 程度のばらつきがある」と読みます。相対誤差にするなら \(0.3/50.0=0.006\)、つまり \(0.6\%\) です。「\(0.3\) だから \(30\%\)」ではありません。
つまり、標準誤差とは母数を推定する標本統計量の標準偏差です。そもそも母集団から標本を抽出するたびに異なる標本が得られるわけで、標本統計量は標本抽出ごとに異なった値を取るのが当然です。
このばらつきを標準誤差は捉えているのです。
特徴としてサンプル数が多くなればなるほど標準誤差は小さくなります。
中心極限定理は分布の形の話で、標準誤差そのものが0に収束するという定理ではありません。標本サイズ \(n\) が大きくなると、標準誤差は \(1/\sqrt{n}\) の速さで小さくなります。
確かに、サンプル数が限りなく多いのならば、データセットごとの平均値のばらつきは無くなりそうですね。
不偏分散について理解が怪しい方は、【n-1】不偏分散を解説します をご覧ください。
また標準誤差は、統計的仮説検定の場面で使う「t統計量」と呼ばれる統計量に使われます。
例えば、分散未知で1標本を扱う場合の検定統計量は自由度\(n-1\)の\(t\)分布に従います。
詳しくは以下をご覧ください。
標準偏差と標準誤差の関係
上にあげた公式を変形すると、このようになります。
$$SE = {\frac{SD}{\sqrt{n}}}$$
つまり、標準誤差は標準偏差(standard deviation)をサンプル数の平方根で割ったものです。
Rで少し考えてみましょう。40個の数字をdataに代入します。
【高校数学I】分散と標準偏差とは?(Lv.定期テスト)のデータを使っています。
data <- c(26,21,23,14,21,25,21,19,20,24,18,23,23,24,21,18,21,21,24,26,24,23,23,21,19,20,25,26,25,26,21,19,20,20,21,27,26,21,29,19)
sqrt(var(data))
#標準偏差の計算
std_mean <- function(data) sd(data)/sqrt(length(data))
#平均の標準誤差を求める関数
std_mean(data)
#dataを代入して、平均の標準誤差を出力するsqrt(var(data))
[1] 3.031459
std_mean(data)
[1] 0.4793158
このようになりました。標準偏差は3.03で標準誤差は0.48でした。
以下の40個のデータは「サッカー部の日別出席人数」ですが、データのばらつき自体が3.03で、真の日別平均出席人数との差は0.48ということですね。
回帰における標準誤差について
では、説明変数の回帰係数ごとに計算される標準誤差について解説していきます。
$$SE(\hat{β_t})=\frac{S}{\sqrt{\sum{(X_t-\hat{X_t}})^2}}$$
分母は説明変数がどれくらいバラついているかを示しております。
Sについては以下のように、残差平方和を自由度で割った値になります。
$$S=\sqrt{\frac{\sum{(Y_i-\hat{Y_i})^2}}{n-k}}$$
CODE|python|GBDT
GBDT(Gradient Boosting Decision Tree)は、複数の決定木を組み合わせて強力な予測器を構築する方法です。
ここで計算しているのは予測のRMSE(平均二乗誤差の平方根)であり、回帰係数や標本平均の標準誤差ではありません。混同しやすいので、違いだけ押さえておきましょう。
以下は、GBDTの予測誤差(RMSE)を求めるpythonコードの例です。
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.datasets import load_diabetes
import pandas as pd
diabetes = load_diabetes()
# Pandasによるデータの表示
df_target = pd.DataFrame(diabetes["target"], columns=["target"])
df_data = pd.DataFrame(diabetes["data"], columns=diabetes["feature_names"])
df = pd.concat([df_target, df_data], axis=1)
y = df["target"]
X = df.loc[:, "age":]
# データを読み込み、訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# GBDTをトレーニング
gbdt = GradientBoostingRegressor()
gbdt.fit(X_train, y_train)
# 予測値を取得
y_pred = gbdt.predict(X_test)
# 予測のRMSEを計算(係数や平均の標準誤差ではない)
mse = mean_squared_error(y_test, y_pred)
std_error = np.sqrt(mse)
print(std_error)結果は、以下のようになりました。
これはテストデータでの予測RMSEです。標本平均の標準誤差 \(0.3\) とは別物です。
58.28876360010699
このコードでは、GradientBoostingRegressorを使用してGBDTをトレーニングし、その後、predict関数を使用してテストデータの予測値を取得します。
mean_squared_error の平方根はRMSEです。予測がどれだけ外れたかを測る指標で、推定値のばらつき(標準誤差)ではありません。MAEや \(R^2\) も予測の当てはまりを見る指標であり、標準誤差の代用にはなりません。
統計検定のチートシートは以下をクリック!
