【統計】標準誤差を例題を通してわかりやすく解説|python
統計検定などで、信頼区間を求めることは多くあります。
そこで必要なのが標準誤差という概念です。
分布によって誤差の作り方が異なったりするため厄介です。
丁寧に学んでいきましょう。
標準誤差(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です。
この標準誤差をどう評価すれば良いかというと、「推定値が標準誤差*100%くらいは変動しうる」という評価すれば良いです。
今回でいうと、推定値から30%程度は誤差としてブレる可能性があるということです。
これはかなり大きい標準誤差です。
つまり、標準誤差とは母数を推定する標本統計量の標準偏差です。そもそも母集団から標本を抽出するたびに異なる標本が得られるわけで、標本統計量は標本抽出ごとに異なった値を取るのが当然です。
このばらつきを標準誤差は捉えているのです。
特徴としてサンプル数が多くなればなるほど標準誤差は小さくなります。
中心極限定理により標準誤差は、0に確率収束すると言われています。
確かに、サンプル数が限りなく多いのならば、データセットごとの平均値のばらつきは無くなりそうですね。
不偏分散について理解が怪しい方は、【n-1】不偏分散を解説します をご覧ください。
また標準誤差は、統計的仮説検定の場面で使う「t統計量」と呼ばれる統計量に使われます。
例えば、分散未知で1標本を扱う場合の検定統計量は自由度\(n-1\)の\(t\)分布に従います。
詳しくは以下をご覧ください。
標準偏差と標準誤差の関係
上にあげた公式を変形すると、このようになります。
$$SE = {\frac{SD}{\sqrt{n}}}$$
つまり、標準誤差は標準偏差(stanndard 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)は、複数の決定木を組み合わせて強力な予測器を構築する方法です。
GBDTの予測値の標準誤差を求めるには、scikit-learnライブラリを使用することができます。
以下は、GBDTを使用して予測値の標準誤差を求めるための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)
# 標準誤差を計算
mse = mean_squared_error(y_test, y_pred)
std_error = np.sqrt(mse)
print(std_error)
結果は、以下のようになりました。
かなり大きい標準誤差ですね汗
58.28876360010699
このコードでは、GradientBoostingRegressorを使用してGBDTをトレーニングし、その後、predict関数を使用してテストデータの予測値を取得します。
標準誤差は、mean_squared_error関数を使用してMSEを計算し、その平方根を取ることで算出しています。
この例では、MSEを用いて標準誤差を算出していますが、別の評価指標(MAE,R2等)を使用しても可能です。
統計検定のチートシートは以下をクリック!
【最短合格】統計検定準一級のチートシート|難易度や出題範囲について
【最短】統計検定2級合格ロードマップとチートシート|おすすめの本について