論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
標準偏差
Standard Deviation (σ / SD)
「平均からのズレ」の典型的な大きさ。分散の平方根。データの広がりを元の単位で表す。
記述統計σ / SDstdSD標準偏差

🔖 キーワード索引

standard deviation」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「standard deviation」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

標準偏差分散平均からの距離σ (シグマ)不偏分散標準化正規分布68-95-99.7 ルール変動係数

これらのキーワードは「standard deviation の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

データのばらつきを表すものさしです。

平均からどれくらいズレているかを知るために使います。

テストの点数がみんな同じか、バラバラかを調べます。

この章では標準偏差の結論を短くまとめます。

📖 もっと詳しく

標準偏差(standard deviation, SD, σ)は、 分散の平方根。 「平均からの典型的なズレの大きさ」を、 元の単位で表します。 「日本の年間気温の標準偏差は 4℃」のように直感的に使えるのが強み。

正規分布での 68-95-99.7則:データが正規分布に従うなら、

これがあるおかげで「2σ より外」は珍しい、 「3σ より外」は超レアと判定できます。 統計的品質管理や外れ値検出の基礎。

標準化(z-score):(値 − 平均) / SD で z値を計算すると、 単位を持たない「平均からの SD 単位での距離」になります。 単位の違う変数の比較・統合に必須の操作。

📍 あなたが今見ているもの

🍰 まずはやさしく

データの広がりを示す重要な言葉です。

分析の中で正しく意味を理解するために使います。

都道府県のデータなど、実際の数字で考えます。

このページでは定義から注意点までを順番に読みます。

論文中に 「標準偏差」として登場する用語。

標準偏差 とは:「平均からのズレ」の典型的な大きさ。分散の平方根。データの広がりを元の単位で表す。

本ページでは「standard deviation」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「standard deviation」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む — 標準偏差は「ばらつきを元の単位で表したもの」

🍰 まずはやさしく

ばらつきを使いやすい単位で表したものです。

直感的にデータの散らばり具合を掴むために使います。

お小遣いの金額が平均からいくらズレているか考えます。

この章では標準偏差を感覚的に理解する方法を読みます。

標準偏差(standard deviation, σ)は分散の平方根。 分散は「単位の二乗」になってしまうので解釈が難しい。 平方根を取って元の単位に戻したものが標準偏差。 直感的には「平均からのズレの典型的な大きさ(平均からの平均的な距離)」と読む。

標準偏差と分散の対比

💡 例えば東北6県の食料費の分散が「8.09 千円²」と言われても直感的でない。 標準偏差「2.84 千円」と言えば、 「平均(80.8 千円)から±2.84千円くらい散らばっている」とすぐ分かる

SSDSE 食料費での値

🎮 触って理解する — 標準偏差ラボ

標準偏差 σ は「平均からのズレの典型的な大きさ」。 下のキャンバスでデータ点をドラッグ/クリック追加/ダブルクリック削除すると、 平均 μ を中心とした ±1σ・±2σ・±3σ の帯がヒストグラムに重ねてリアルタイム描画され、 各帯に入るデータの割合が更新されます。 正規分布に近ければ 68 / 95 / 99.7% に、 歪んだ分布ではそこからズレることを実データで体感してください。

💡 使い方:下段の丸い点をドラッグで移動、 グラフ上をクリックで点を追加、 点をダブルクリックで削除。 実データ(食料費)で 1 点を極端な値へ動かすと、 外れ値が σ を一気に押し上げる様子(後述の ロバスト統計で扱う感度)が見えます。 「正規分布デモ」では σ スライダーで帯の広がりが変わり、 割合が 68 / 95 / 99.7% に収束することを確認できます(点数が多いデモではドラッグ編集は無効)。

📎 このラボで確かめられること(関連概念)

📐 拡充A: 標準偏差の厳密な数学定義

🍰 まずはやさしく

分散(ばらつきの指標)にルートをかけた値です。

数学的に正しい大きさを計算するために使います。

部活の記録などの平均からの距離を正確に求めます。

この章では標準偏差を計算する数式について読みます。

標準偏差 (standard deviation, SD) は分散の正の平方根。 母集団の場合と標本の場合で定義が異なる。

$$\sigma = \sqrt{E[(X-\mu)^2]} = \sqrt{\sum_{x} (x-\mu)^2 p(x)}$$

これは「平均からの距離の二乗の期待値の平方根」 = 「平均からの典型距離」と読める。

🔬 数式を言葉で読み解く: 母標準偏差 σ

🔬 数式を言葉で読み解く: 標本標準偏差 s (不偏)

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

🔬 数式を言葉で読み解く: 標準化 (z-score)

$$z_i = \frac{x_i - \bar{x}}{s}$$

🔬 数式を言葉で読み解く — マハラノビス距離・多変量での標準偏差

1変数の標準偏差を多変量に拡張したのがマハラノビス距離。 異常検知、 クラスタリング、 多変量正規分布で頻繁に登場。

$$ d_M(x) = \sqrt{(x - \mu)^T \Sigma^{-1} (x - \mu)} $$

1変数の場合 d_M = |x - μ|/σ = |z-score| に一致。 多変量では「相関構造を考慮した距離」になります。

使用例

💰 金融での標準偏差 — リスク指標

金融工学では標準偏差を「ボラティリティ(volatility)」と呼び、 リスクの基本指標として使います。

① シャープレシオ

$$ \text{Sharpe Ratio} = \frac{\bar{r} - r_f}{\sigma_r} $$

リターンの平均をリスク(標準偏差)で割ったもの。 「1単位のリスク当たり、 どれだけのリターンか」を測定。 Markowitz の現代ポートフォリオ理論の中核。

② Value at Risk (VaR)

「ある期間内に最大いくら損する可能性があるか」を標準偏差ベースで計算:

$$ \text{VaR}_{95\%} = \mu - 1.65 \sigma $$

95%信頼度での最大損失額。 リスク管理の必須指標。

③ Black-Scholes モデル

オプション価格モデルの主要パラメータは原資産のボラティリティ σ。 σ が大きいほどオプション価値は高くなる(不確実性のプレミアム)。

🏭 品質管理での標準偏差 — シックスシグマ

製造業の品質管理では、 標準偏差が中心的役割を果たします。

管理図(control chart)

Shewhart の管理図では、 中心線(平均)と上下限(±3σ)を引き、 観測値がこの範囲外に出たら異常と判定:

シックスシグマ

「製造工程の許容範囲が ±6σ を超える」状態を目指す品質管理手法。 不良率は百万分の3.4 (3.4 ppm) という極めて厳しい基準。 モトローラ、 GE が実装して有名に。

Cp、 Cpk(工程能力指数)

$$ C_p = \frac{\text{USL} - \text{LSL}}{6\sigma} $$

仕様範囲(USL - LSL)を 6σ で割った指標。 Cp ≥ 1.33 で「合格水準」、 ≥ 2.0 でシックスシグマ水準。

📦 IQR との比較 — もう1つのばらつき指標

標準偏差以外にも、 ばらつきを測る指標があります:

指標定義外れ値耐性使い時
標準偏差 σ√(平均偏差の二乗)弱い正規分布、 一般的分析
範囲 (range)max - min最弱概観把握のみ
IQR (四分位範囲)Q3 - Q1強い歪んだ分布、 外れ値あり
MAD (中央絶対偏差)median(|xᵢ - median|)最強ロバスト統計

正規分布の場合:σ ≈ IQR / 1.349 ≈ 1.4826 × MAD という換算式があります。

🧮 計算ステップ

標準偏差の計算手順

  1. 平均 x̄ を計算
  2. 各データの偏差 (xᵢ - x̄) を計算
  3. 偏差の二乗を計算 (xᵢ - x̄)²
  4. 合計 Σ (xᵢ - x̄)²
  5. n(または n-1)で割って分散 σ²
  6. 分散の平方根を取って標準偏差 σ = √σ²

📐 数式

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

または不偏推定として:

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

記号の読み方

記号読み方意味
σシグマ(小文字)母標準偏差
sエス標本標準偏差
ルート/平方根2乗してその値になる数

📊 68-95-99.7ルール — 標準偏差の魔法

データが正規分布に従うとき、 標準偏差にはとても便利な性質があります:

範囲 含まれる確率 直感的な意味
μ ± 1σ68%「典型的」な範囲
μ ± 2σ95%「ほぼ全て」の範囲
μ ± 3σ99.7%「ほぼ確実」、 外側は外れ値候補
68-95-99.7 ルール

実用例

🎯 標準化 (z-score) — 異なる単位を比較可能に

異なる単位の変数(身長 cm と体重 kg)を直接比較できません。 そこで「平均からのズレを標準偏差で割る」のが標準化

$$ z = \frac{x - \mu}{\sigma} $$

標準化

標準化されたデータは平均0、 標準偏差1になり、 「平均から何σ離れているか」を表す無次元の数値になります。

標準化の意味

偏差値との関係

日本の試験で使う偏差値は、 z-score を変形したもの:

$$ T = 50 + 10z $$

📏 変動係数 (CV) — 相対的なばらつき

標準偏差は絶対的なばらつきを表しますが、 「身長の SD = 10cm」と「給料の SD = 10万円」を比較できません。 そこで変動係数(coefficient of variation, CV):

$$ CV = \frac{\sigma}{\mu} \times 100 \% $$

標準偏差を平均で割った無次元の量。 「平均に対する何%のばらつき」を表します。 単位の異なる変数同士を比較できる便利な指標。

使い時

💡 SSDSE 食料費の場合: CV = 5.84 / 80.60 = 7.2%。 「都道府県間の食料費のばらつきは平均の約7%」。

🎲 標準偏差はバイアスを持つ — 知らない人が多い事実

不偏分散 s² の期待値は母分散 σ² に等しい(E[s²] = σ²)が、 √s² の期待値は σ に等しくないのです。 これは Jensen の不等式に起因します:

$$ \mathbb{E}[\sqrt{s^2}] \le \sqrt{\mathbb{E}[s^2]} = \sigma $$

つまり s は σ を過小評価する傾向があります。 正規分布の場合の補正係数 c₄ を使えば不偏標準偏差を得られますが、 実務では補正なしの s を使うのが普通(差は通常小さい)。

補正公式(正規分布の場合)

$$ s_{\text{unbiased}} = \frac{s}{c_4(n)}, \quad c_4(n) = \sqrt{\frac{2}{n-1}} \cdot \frac{\Gamma(n/2)}{\Gamma((n-1)/2)} $$

例:n=10 では c₄ ≈ 0.9727、 n=30 では c₄ ≈ 0.9914。 n が大きければ補正不要。

🤖 機械学習での標準偏差

① StandardScaler(特徴量の標準化)

多くの機械学習アルゴリズムは入力スケールに敏感(kNN, SVM, ニューラルネット, PCA, 線形回帰)。 標準化は前処理の必須技術:

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) 北海道 5,092,000 1,681,000 東京都 14,086,000 3,205,000 沖縄県 1,468,000 350,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# ── この抜粋で使うデータを用意します ──
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

import pandas as pd

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]        # 2023 年の 47 都道府県
X = df[['A1101', 'A1303']].astype(float).values   # 総人口・65歳以上人口
X_train, X_test = train_test_split(X, test_size=0.3, random_state=42)

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)  # 同じスケーリングをテストにも

# scaler.mean_ と scaler.scale_ に平均と標準偏差が記録される
print('学習データの平均  :', scaler.mean_.round(1))
print('学習データの標準偏差:', scaler.scale_.round(1))
📤 実行例(実測) 学習データの平均 : [2271500. 681875.] 学習データの標準偏差: [2225833. 586160.2]

② Batch Normalization

深層学習の各層の出力を標準化する技術。 各ミニバッチで平均と標準偏差を計算して使用。

③ 重みの初期化

ニューラルネットの重み初期化(Xavier, He など)は、 標準偏差の精密な制御に基づきます:

$$ W \sim N\left(0, \sigma^2 = \frac{2}{n_{\text{in}}}\right) \quad (\text{He初期化}) $$

④ 不確実性推定

予測値だけでなく、 予測の標準偏差も出すモデル(ガウス過程、 ベイジアンNN)。 「±σ の予測区間」で意思決定の信頼性を示せます。

⑤ Dropout の解釈

Dropoutは「ノード出力に乗法的ノイズを加える」操作で、 これは標準偏差ベースの正則化と数学的に等価です。

🧮 SSDSE-B-2026 実値計算例 — 「消費支出」「人口」「気温」の SD と CV

変数によって平均と標準偏差の関係(変動係数 CV)が大きく異なります。 単位を持たない CV で「相対的なばらつき」を比較しましょう。

変数 平均 SD(ddof=1) CV = SD/平均 解釈
消費支出≈ 29.6 万円≈ 2.4 万円≈ 0.08県間ばらつき小
総人口≈ 265 万人≈ 280 万人≈ 1.06巨大な格差
気温≈ 16.8 ℃≈ 2.0 ℃≈ 0.12消費支出と同程度
📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) B4101(年平均気温) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 11.0 296,888 東京都 14,086,000 17.6 341,320 沖縄県 1,468,000 23.8 251,222 …(全 47 行)
1
2
3
4
5
6
7
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
d = df[df['SSDSE-B-2026'] == 2023]
for c in ['L3221', 'A1101', 'B4101']:
    x = d[c].dropna()
    print(f'{c}: 平均={x.mean():.1f}, SD={x.std(ddof=1):.1f}, '
          f'CV={x.std(ddof=1)/x.mean():.3f}')
📤 実行例(実測) L3221: 平均=295856.0, SD=24144.1, CV=0.082 A1101: 平均=2645808.5, SD=2797551.4, CV=1.057 B4101: 平均=16.8, SD=2.0, CV=0.122

🧮 拡充B: SSDSE-B-2026 で SD を実値計算 — 47 都道府県の総人口

SSDSE-B-2026 の 2023 年 A1101 (総人口) について SD を計算する。

n = 47, mean = 2,645,808.5 標本 SD (ddof=1) = 2,797,551.4 母集団 SD (ddof=0) = 2,767,630.2 median = 1,549,000 min = 537,000 (鳥取県), max = 14,086,000 (東京都)

SD が平均より大きい (CV = 1.06) → ばらつきが平均水準を超える典型的な右に歪んだ分布。 これは「人口」が比率尺度かつ対数正規に近い分布だから。

z-score 上位 5 (大きい方)

人口z-score
東京都14,086,000+4.09
神奈川県9,229,000+2.35
大阪府8,763,000+2.19
愛知県7,477,000+1.73
埼玉県7,331,000+1.67

z-score 下位 5 (小さい方)

人口z-score
鳥取県537,000−0.75
島根県650,000−0.71
高知県666,000−0.71
徳島県695,000−0.70
福井県744,000−0.68

東京の z=+4.09 は「平均から 4 SD 以上離れている」 → 正規分布なら 99.99% タイル超 → 強い外れ値。 しかし対数正規分布ならありえる。 形状を見ずに z-score を解釈してはいけない例。

📊 拡充C: 経験則 (68-95-99.7) を SSDSE で検証

正規分布なら |z|<1 が約 68.3%、 |z|<2 が約 95.4%、 |z|<3 が約 99.7%。 SSDSE-B-2026 の人口データで実際の割合を確認すると:

|z| <= 1: 41/47 = 87.2% (理論 68.3%) |z| <= 2: 44/47 = 93.6% (理論 95.4%) |z| <= 3: 46/47 = 97.9% (理論 99.7%)

💬 「1 SD 内」が理論より大幅に多く (87% vs 68%)、 「2 SD 内」が理論より少ない (94% vs 95%) → 右に歪んだ分布の典型。 平均近くにデータが集中し、 右裾の少数が SD を引き上げる。 正規分布の経験則は 分布が正規に近い場合のみ 適用可能。

このコードでやること: SSDSE-B-2026 の人口で経験則の検証を行う。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop = df[df['SSDSE-B-2026'] == 2023]['A1101'].values
mu, sd = pop.mean(), pop.std(ddof=1)
z = (pop - mu) / sd
for k in [1, 2, 3]:
    n = (np.abs(z) <= k).sum()
    print(f'|z|<={k}: {n}/{len(z)} = {n/len(z)*100:.1f}% (理論 {[68.3, 95.4, 99.7][k-1]}%)')

📤 実行結果:

|z|<=1: 41/47 = 87.2% (理論 68.3%) |z|<=2: 44/47 = 93.6% (理論 95.4%) |z|<=3: 46/47 = 97.9% (理論 99.7%)

💬 経験則が崩れている → 対数変換するか、 中央値・IQR などのロバスト指標で要約する方が現実的。

🔧 拡充D: ddof=0 vs ddof=1 — n と n−1 の使い分け

分散 / SD の分母には nn-1 の 2 つの流派がある。 これは「ベッセル補正」と呼ばれ、 標本から母集団を推定する際の偏りを修正する。

🔬 数式を言葉で読み解く: ベッセル補正

$$E\left[\frac{1}{n-1}\sum (x_i - \bar{x})^2\right] = \sigma^2$$

ライブラリ 関数 デフォルト ddof 変更
pandasdf.std(), df.var()1 (不偏)ddof=0 で母分散風
numpynp.std(), np.var()0 (母集団)ddof=1 で不偏
scipystats.tstd()1
Rsd(), var()1
ExcelSTDEV.S / STDEV.P使い分け明示的

n が大きい (n > 30 程度) と ddof=0 と ddof=1 の差は小さい。 でも n=10 などでは 5% 以上差が出る。 学術論文では 常に不偏 (ddof=1) が原則。

このコードでやること: SSDSE-B-2026 の人口で ddof=0 と ddof=1 の差を計算する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import pandas as pd
import numpy as np

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop = df[df['SSDSE-B-2026'] == 2023]['A1101']

print(f'pandas .std() (ddof=1): {pop.std():,.1f}')
print(f'pandas .std(ddof=0)   : {pop.std(ddof=0):,.1f}')
print(f'numpy  .std() (ddof=0): {np.std(pop):,.1f}')
print(f'numpy  .std(ddof=1)   : {np.std(pop, ddof=1):,.1f}')
ratio = pop.std() / pop.std(ddof=0)
print(f'比 (ddof=1 / ddof=0) = {ratio:.4f}  (理論 √(n/(n-1)) = √(47/46) = {np.sqrt(47/46):.4f})')

📤 実行結果:

pandas .std() (ddof=1): 2,797,551.4 pandas .std(ddof=0) : 2,767,630.2 numpy .std() (ddof=0): 2,767,630.2 numpy .std(ddof=1) : 2,797,551.4 比 (ddof=1 / ddof=0) = 1.0108 (理論 √(n/(n-1)) = √(47/46) = 1.0108)

💬 47 サンプルで ddof の違いは約 1.1% だが、 デフォルト値の違いで pandas と numpy の結果が食い違う点に注意。 報告時は必ず ddof を明記する。

📏 拡充E: SD vs SEM — 標準偏差と標準誤差の混同を避ける

$$\mathrm{SEM} = \frac{s}{\sqrt{n}}$$

SD はデータ自体のばらつき、 SEM (Standard Error of the Mean) は 平均の推定値のばらつき。 全く別物。

🔬 数式を言葉で読み解く: SEM

指標 何を測る n の影響 用途
SDデータ点のばらつき無関係個体差・分布の幅
SEM平均の不確実性$1/\sqrt{n}$ で減る信頼区間・群間比較

論文のエラーバーが SD か SEM かは必ず明記する。 SEM の方が小さくグラフが見栄えするので濫用されがちだが、 「データの幅」を示したいなら SD、 「平均の精度」なら SEM。

📈 拡充F: 変動係数 (Coefficient of Variation, CV)

$$\mathrm{CV} = \frac{s}{|\bar{x}|}$$

単位を消した相対的なばらつき指標。 異なる単位の量を比較するときに使う。 比率尺度のみ意味を持つ (mean=0 や負の量では破綻)。

SSDSE-B-2026 の主要列で CV を計算すると:

A1101 総人口 : mean = 2,645,808, SD = 2,797,551, CV = 1.057 A110101 男性人口 : mean = 1,287,085, SD = 1,373,649, CV = 1.067 A110102 女性人口 : mean = 1,358,723, SD = 1,424,664, CV = 1.049

💬 CV ≈ 1.05〜1.07 で 3 系列がほぼ同じ → 男女別に分けても都道府県間のばらつきの相対的大きさはほとんど変わらない (それぞれの値の分布が比例関係にある)。 これは「日本の人口分布は男女別でほぼ同じ形」を意味する。

🛡 拡充G: ロバストなばらつき指標 (MAD, IQR)

SD は外れ値に弱い (二乗で罰するため)。 ロバストな代替指標として:

このコードでやること: SSDSE-B-2026 で SD と MAD と IQR を比較し、 ロバスト指標の安定性を体験する。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) 北海道 5,092,000 東京都 14,086,000 沖縄県 1,468,000 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import numpy as np
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
pop = df[df['SSDSE-B-2026'] == 2023]['A1101'].values

sd = pop.std(ddof=1)
iqr = np.percentile(pop, 75) - np.percentile(pop, 25)
mad = stats.median_abs_deviation(pop, scale='normal')  # 1.4826 で補正済

print(f'SD              = {sd:,.0f}')
print(f'IQR             = {iqr:,.0f}  (正規なら SD × 1.35 = {sd*1.349:,.0f})')
print(f'MAD (正規 scale) = {mad:,.0f}  (正規なら SD と一致)')

# 東京を除いた場合
pop_no_tokyo = pop[pop < 10_000_000]
print(f'\n東京除外後:')
print(f'SD  = {pop_no_tokyo.std(ddof=1):,.0f} (約 {(1-pop_no_tokyo.std(ddof=1)/sd)*100:.1f}% 減)')
print(f'MAD = {stats.median_abs_deviation(pop_no_tokyo, scale="normal"):,.0f}')

📤 実行結果:

SD = 2,797,551 IQR = 1,602,500 (正規なら SD × 1.35 = 3,773,897) MAD (正規 scale) = 923,661 (正規なら SD と一致) 東京除外後: SD = 2,242,451 (約 19.8% 減) MAD = 872,511

💬 SD は東京 1 個を除くだけで約 20% も減るが MAD の変化は約 5% にとどまる (923,661 → 872,511)。 これがロバスト指標の威力。 外れ値の影響を受けやすい問題では MAD や IQR を優先する。

⚖️ 拡充H: 加重 SD と層別分析

都道府県別データを単純に集約すると「東京の 1 人」と「鳥取の 1 人」が同じ重みになる。 人口を重みにした加重 SD は:

$$s_w = \sqrt{\frac{\sum w_i (x_i - \bar{x}_w)^2}{\sum w_i}}$$ ただし $\bar{x}_w = \frac{\sum w_i x_i}{\sum w_i}$

応用例: 都道府県別の高齢化率を県別人口で加重平均すれば「日本人 1 人当たりが感じる平均的な高齢化率」が出る。 単純平均は「県別の値の平均」で別物。

SD は層内 SD と層間 SD に分解できる (ANOVA の原理):

$$\mathrm{Var}(X) = \mathrm{Var}(E[X \mid G]) + E[\mathrm{Var}(X \mid G)]$$

「全体ばらつき = 群間ばらつき + 群内ばらつきの平均」。 SSDSE で東日本 vs 西日本に分けると、 全体 SD のうち群内が大半 (約 90%) → 「東西」は人口のばらつきをほとんど説明していない。

🧮 数式に値を入れて手で計算する: 標準偏差

合成データ [2,4,7,5,3] で標本 SD と母 SD を計算する。

Step 1: 平均と偏差²

x̄ = 4.2 Σ(x-x̄)² = 14.80

Step 2: SD

標本分散 (n-1) = 14.80/4 = 3.70 標本 SD = √3.70 ≈ 1.924 母分散 (n) = 14.80/5 = 2.96 母 SD = √2.96 ≈ 1.720

🐍 Python で再現

1
2
3
4
import numpy as np
x = np.array([2,4,7,5,3])
print(f"標本 SD: {x.std(ddof=1):.3f}")
print(f"母 SD: {x.std(ddof=0):.3f}")

📤 実行結果

標本 SD: 1.924 母 SD: 1.720

💬 手計算 (Step 2) と Python 出力が完全一致。

🐍 Python での計算

🎯 このコードでやること:標準偏差を numpy(既定 ddof=0、 ÷n)と pandas(既定 ddof=1、 ÷(n-1))で計算し、 両者の挙動差を z-score 変換まで含めて確認する。

📥 入力データ:arr = [10, 20, 30, 40, 50](平均 30 の単純なサンプル)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import pandas as pd

# numpy のデフォルトは ÷n
arr = np.array([10, 20, 30, 40, 50])
print(np.std(arr))         # ÷n: 14.14
print(np.std(arr, ddof=1)) # ÷(n-1): 15.81

# pandas のデフォルトは ÷(n-1)
s = pd.Series(arr)
print(s.std())             # ÷(n-1): 15.81
print(s.std(ddof=0))       # ÷n: 14.14

# describe で要約
print(s.describe())

# 標準化(z-score)
z = (s - s.mean()) / s.std()
print(z)

📤 実行結果

14.142 ← np.std (÷n) 15.811 ← np.std(ddof=1) (÷n-1) 15.811 ← pd.Series.std() (既定で ddof=1) 14.142 ← pd.Series.std(ddof=0) z: -1.26, -0.63, 0.00, 0.63, 1.26 ← z-score 化されたシリーズ

💬 読み方:numpy と pandas で既定値が異なるのが最大の落とし穴。 標本 SD(推測統計用)が必要なら ddof=1 を明示する。 z-score は平均 0・分散 1 にスケール変換される。

StandardScaler を手で書く

1
2
3
4
5
6
7
def fit_transform(X):
    mu = X.mean(axis=0)
    sigma = X.std(axis=0, ddof=0)
    sigma[sigma == 0] = 1.0  # ゼロ除算回避
    return (X - mu) / sigma, mu, sigma

X_scaled, mu, sigma = fit_transform(X)

変動係数の計算

1
2
3
4
5
def coefficient_of_variation(x):
    return x.std() / x.mean() * 100

cv_food = coefficient_of_variation(df['L322101'])
print(f'食料費の変動係数: {cv_food:.2f}%')
📤 実行例(実測) 食料費の変動係数: 8.99%

🚧 標準偏差の落とし穴

1️⃣ 正規分布でないと68-95-99.7ルールは使えない

裾の長い分布(所得、 株価変動)では±2σの中に95%が入らない。 必ず分布の形を確認してから使う。

2️⃣ ÷n か ÷(n-1) か — ライブラリで違う

numpy のデフォルトと pandas のデフォルトが違う。 R のデフォルトは ÷(n-1)。 統一するには ddof を明示。

3️⃣ 外れ値の影響

標準偏差は分散の平方根なので、 外れ値で大きく動きます。 中央値ベースの MAD を併用しましょう。

4️⃣ 単位の異なる変数を比較できない

「身長のσ=10cm」と「体重のσ=10kg」は無関係。 比較には変動係数(CV)を使う。

5️⃣ サンプルサイズが小さい

n=5 程度では σ の推定値は大きくブレます。 χ²分布ベースの信頼区間を計算するか、 ブートストラップで確認。

6️⃣ z-score 標準化はテストデータにも fit してはいけない

機械学習で fit_transform(X_train) したら、 transform(X_test) で同じスケーリングをすること。 fit を分けないとデータリークになります。

📜 標準偏差の歴史

🐍 Python 実装バリエーション(numpy / pandas / scipy / statsmodels)

🅰️ numpy(デフォルト ddof=0)

1
2
3
4
5
import numpy as np
x = df['L322101'].dropna().values
print('SD (ddof=0):', np.std(x))             # 母集団 SD
print('SD (ddof=1):', np.std(x, ddof=1))    # 標本 SD(不偏)
print('Var (ddof=1):', np.var(x, ddof=1))
📤 実行例(実測) SD (ddof=0): 6540.511644270959 SD (ddof=1): 6546.31769214687 Var (ddof=1): 42854275.32651512

🅱️ pandas(デフォルト ddof=1)

1
2
3
print(df['L322101'].std())           # ddof=1
print(df['L322101'].std(ddof=0))      # 母集団 SD
print(df.describe().T[['mean', 'std']])  # 全変数
📤 実行例(実測) 6546.3176921468685 6540.511644270957 mean std SSDSE-B-2026 2.017500e+03 3.455117e+00 A1101 2.690688e+06 2.730951e+06 A110101 1.308956e+06 1.345905e+06 A110102 1.381723e+06 1.385860e+06 A1102 2.637011e+06 2.646600e+06 ... ... ... L322106 1.305755e+04 1.897529e+03 L322107 4.168682e+04 7.537372e+03 L322108 1.074375e+04 3.789829e+03 L322109 2.693103e+04 4.219487e+03 L322110 5.978472e+04 8.813813e+03 [110 rows x 2 columns]

🅲 scipy.stats — z-score・SEM

1
2
3
4
5
from scipy import stats
z = stats.zscore(x)               # z-score
sem = stats.sem(x)                # 標準誤差 (SD/√n)
print('zscore[0:5]:', z[:5])
print('SEM:', sem)
📤 実行例(実測) zscore[0:5]: [ 0.22826012 0.02888733 -0.21406002 0.73877064 0.00977568] SEM: 275.6497010176614

🅳 statsmodels — 加重 SD

1
2
3
4
5
from statsmodels.stats.weightstats import DescrStatsW
weights = df['A1101'].dropna()
weighted = DescrStatsW(df['L322101'].dropna().values, weights=weights.values)
print('加重平均:', weighted.mean)
print('加重 SD:', weighted.std)
📤 実行例(実測) 加重平均: 76114.77348214334 加重 SD: 7479.082172205783

📦 「ばらつき」指標早見表

指標 単位 ロバスト性
分散 σ²元単位の 2 乗
標準偏差 σ元単位
SEM = σ/√n元単位弱(平均の誤差)
変動係数 CV無単位
IQR元単位
MAD元単位最強

⚠️ 落とし穴(補強版 — 標準偏差で踏みやすい7つの罠)

① ddof=0(母集団)と ddof=1(標本)を混同
numpy のデフォルトは ddof=0(分母 n、 母集団の SD)、 pandas のデフォルトは ddof=1(分母 n−1、 標本の不偏 SD)です。 同じデータでも結果が違ってきます。 SSDSE-B(47 都道府県全数)なら母集団の SD(ddof=0)が論理的、 標本抽出データなら ddof=1 が標準。 「numpy と pandas で SD が違う」は ddof の違いがほぼ全てで、 明示的に ddof= を指定する習慣をつけると安全です。
② 外れ値の影響を意識せずに SD を使う
SD は平均からの2 乗距離を見るため、 外れ値 1 つで劇的に大きくなります。 SSDSE-B の人口分布で東京(1409 万人)と鳥取(54 万人)が同居すると、 SD は鳥取 1 つだけの世界より桁違いに大きくなる。 「ばらつきを表現したい」のが目的なら、 ロバスト指標(IQR, MAD)を併記するのが堅実。 外れ値の影響を消したいなら 5% トリム SD などを検討。
③ SD のバイアスを知らない(√不偏推定量ではない)
「ddof=1 なら不偏」と思いがちですが、 これは分散の不偏推定量であって、 SD(その平方根)は不偏ではありません。 √は非線形変換なので、 期待値の√は√の期待値と異なるからです。 厳密には c₄(n) という補正係数で割る必要がありますが、 通常はほぼ無視できる(n=30 で 0.991 など)。 工程能力の品質管理など極めて高精度を要する場面で c₄ 補正が登場します。
④ 68-95-99.7 則を任意の分布で適用
68-95-99.7 則(±1/2/3 σ の確率)は正規分布限定のルール。 ロングテール分布や歪んだ分布では成立せず、 「±3σ より外は珍しい」が嘘になります。 株式リターンのような fat tail 分布では、 ±3σ より外の事象が「100 年に 1 度」のはずなのに「数年に 1 度」起きる(2008 金融危機)。 Chebyshev の不等式(任意分布で ±kσ 内に少なくとも 1−1/k² 含む)が分布不問の安全な代替。
⑤ 異なる単位の SD を直接比較
「気温の SD は 5 度、 降水量の SD は 50mm」と並べても比較不能です。 単位が違うものを比較するなら変動係数(CV = SD/平均)を使うべき。 ただし CV も平均が 0 に近い変数(残差、 株式リターン)では不安定になります。 標準化(z 化)してから比較するのが汎用的な方法。 「SD が大きいから変動が激しい」だけでは情報不足です。
⑥ 加重 SD を「重みなし」で計算
人口加重平均 / 加重 SD が必要な集計(都道府県別人口加重)で、 単純な np.std を使うと過小評価になります。 加重 SD は statsmodels.stats.weightstats.DescrStatsW または numpy で重み付き分散を自前計算(np.cov に aweights)。 「47 都道府県の平均所得の SD」と「日本国民1人あたりの所得の SD」は別物、 という意識が重要。
⑦ SD と SEM(標準誤差)を混同
SD(標準偏差)は個々の値のばらつき、 SEM(標準誤差)は平均の推定誤差で、 SEM = SD/√n。 大学院生の論文で頻繁に混同されます。 「データの散らばり」を示したいときは SD(誤差棒は SD ±)、 「平均の信頼性」を示したいときは SEM(誤差棒は SEM ±)または 95% CI。 図表の説明文に「Error bars represent SD/SEM」を必ず明記する習慣を。

⚠️ 拡充I: SD にまつわる落とし穴

🗺️ 概念マップ — 3つの視点で体系を理解する

標準偏差 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス記述統計ばらつき標準偏差

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 標準偏差 を置き、 そこから 分散・平均・標準化・正規分布・相関係数・信頼区間 など 計 16 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語あとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「標準偏差」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「標準偏差」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 標準偏差隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンスばらつき → 標準偏差 という入れ子の位置を示します。 「ばらつきには他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🔗 隣接手法への橋渡し

標準偏差は記述統計の中核指標。 SSDSE-B-2026 の人口 A1101 (47 都道府県、 東京 14.1M を含む) では SD ≈ 280 万人と大きく、 平均 ≈ 265 万人とほぼ同じスケール。 これは「典型値とばらつきが同オーダー」という分布の歪みを示し、 SD 単独報告では誤解を招くので IQR / CV と併記する。

SD は平均と組で報告 (mean ± SD) し、 CV = SD/mean で単位無し相対ばらつきに変換することで都道府県間の異種指標 (人口と医師数) を比較可能にする。

🌳 手法選択フロー

標準偏差を「ばらつき指標」として使う場面は多いが、 データの性質と目的によって SD そのまま使うべきか、 別のロバスト指標に切り替えるべきかが変わる。 以下に典型シナリオと推奨ばらつき指標を示す。

典型シナリオ別の手法選択

シナリオ重視する観点推奨ばらつき指標
分布が正規 / 対称・サンプル十分理論との整合・68-95-99.7 則の活用標本 SD (ddof=1)
外れ値が混在 / 分布が歪む頑健性・中央値からの絶対偏差MAD (中央絶対偏差) / IQR
単位の異なる変数を比較したいスケール無次元化変動係数 CV (= SD/平均) / z-score
母集団全体のデータ (悉皆調査)バイアス補正不要・分母 n母 SD (ddof=0) — SSDSE-B 47 都道府県は悉皆
標本平均の精度を知りたい推定誤差の不確実性標準誤差 SE = SD/√n (SD と区別する)
時系列データの揺らぎ時間依存性・自己相関の考慮ローリング SD / 条件付き SD (GARCH)

選んだ後の検証ステップ

  1. 分母確認: numpy 既定 ddof=0 (母 SD)、 pandas 既定 ddof=1 (標本 SD) — 算出ルートを必ず明示
  2. 外れ値感度: 東京除外で人口 SD が 280 万 → 224 万 (約 2 割減) のように大きく動かないか、 SD と MAD を併記して感度を比較
  3. 単位確認: 報告値の単位 (人・千円・%) を明示。 元データと同じ単位であることを確認
  4. CV 併記: 平均と SD だけでなく、 CV = SD/平均で「ばらつきの相対的大きさ」を補足
  5. 正規性確認: SD の解釈で 68-95-99.7 則を引くなら、 ヒストグラムや Q-Q プロットで正規性を確認 (歪んでいれば四分位ベースに切替)

🔖 キーワード索引(拡張版 — 標準偏差)

分散・SD・標準化・68-95-99.7則・ロバスト代替を網羅。

SSDSE-B 実値 分散 標本 SD vs 母 SD ddof=0/1 z-score 68-95-99.7則 変動係数 MAD 外れ値感度 分母 n vs n-1 numpy pandas scipy.stats

🎨 追記: 直感をもう一段 — 「分散との違い」と経験則が効く/崩れる実例

標準偏差は「平均からの典型的な距離」。 各データと平均の差(偏差)を二乗して平均したものが分散で、 その平方根で元の単位に戻したのが標準偏差。 二乗するのは (1) 符号を消し (2) 大きな外れを強く効かせるため。 平方根で戻すので単位はデータと同じ(人・円・℃)になり、 「平均 ± SD」と同じ物差しで語れる。 分散は単位が二乗(人²・円²)で直感が効かないのに対し、 標準偏差は「ばらつきの代表的な幅」としてそのまま読めるのが価値。

💡 分散 vs 標準偏差(SSDSE-B-2026 食料費 L322101・47県 実測): 分散 ≈ 3.41×10⁷ 円²(= 5,842²)は単位が「円²」で直感が効かない。 標準偏差 = √分散 = 5,842 円なら「県ごとの食料費は平均 80,598 円から ±約 5,842 円が典型」とそのまま読める。 同じ情報でも、 平方根で単位を戻すだけで解釈可能性が一変する。

📊 68-95-99.7 則は「正規に近ければ効く / 歪めば崩れる」— 2 変数で実測比較

経験則(μ±1σ≈68%, ±2σ≈95%, ±3σ≈99.7%)は 正規分布限定のもの。 SSDSE-B-2026 の ほぼ対称な食料費強く右に歪む総人口で実測すると、 効く/崩れるが対照的に現れる。

範囲 正規分布の理論 食料費 実測(ほぼ対称) 総人口 実測(右に歪む)
μ±1σ68.3%66.0%87.2%
μ±2σ95.4%95.7%93.6%
μ±3σ99.7%100.0%97.9%

💬 食料費は理論値にほぼ一致(66.0 / 95.7 / 100.0%)→ 経験則が使える。 総人口は μ±1σ が 87% と過剰・μ±2σ が 93.6% と不足 → 平均近くにデータが密集し、 東京など少数の巨大値が右裾を作る歪んだ分布の典型。 SD を報告する前に必ず ヒストグラムで形を見ること。 歪むなら 中央値IQR対数変換に切り替える。

⚠️ 追記: 落とし穴の要点(実測付きの再確認)

🚀 追記: 発展 — チェビシェフの不等式と分散の加法性

📐 チェビシェフの不等式 — 分布を仮定しない安全網

68-95-99.7 則は正規分布専用だが、 チェビシェフの不等式任意の分布で成り立つ下限を与える:

$$P(|X-\mu| \ge k\sigma) \le \frac{1}{k^2} \quad\Longleftrightarrow\quad P(|X-\mu| < k\sigma) \ge 1-\frac{1}{k^2}$$

SSDSE-B-2026 の実測で下限と実際を比較すると、 右に歪む人口でも下限は必ず満たされる:

総人口: k=2 → 下限 75.0% ≤ 実測 93.6% / k=3 → 下限 88.9% ≤ 実測 97.9% 食料費: k=2 → 下限 75.0% ≤ 実測 95.7% / k=3 → 下限 88.9% ≤ 実測 100.0%

💬 歪んだ人口分布でも「±2σ の外は多くても 1/4」という保証は破れない。 分布形を確認できない場面での安全側の目安になる。

➕ 分散の加法性 — 「和のばらつき」には共分散が要る

2 変数の和の分散は、 単純な足し算ではなく共分散を足したものになる:

$$\mathrm{Var}(X+Y) = \mathrm{Var}(X) + \mathrm{Var}(Y) + 2\,\mathrm{Cov}(X,Y)$$

独立(Cov=0)のときだけ Var(X+Y)=Var(X)+Var(Y) が成り立つ。 標準偏差はそもそも加法的でない(一般に SD(X+Y) ≠ SD(X)+SD(Y))。 SSDSE-B-2026 の男性人口(A110101)と女性人口(A110102)は相関 r=0.999 とほぼ完全連動なので、 共分散項が支配的になる:

SD(男)=1,373,649 SD(女)=1,424,664 (相関 r=0.999) Var(男)+Var(女) = 3.92×10¹² → √ = 1,979,035 ← 独立と仮定した誤り Var(男)+Var(女)+2Cov(男,女) = 7.83×10¹² → √ = 2,797,588 ← 正しい Var(男+女)

💬 独立を仮定して分散を足すと SD を約 3 割過小評価する(1,979,035 vs 2,797,588)。 共分散を無視した「SD の足し算」は誤り。 全体分散を群間+群内に分ける分散分解(本文 拡充H)や、 資産を組み合わせたポートフォリオのリスク計算も同じ原理に立つ。

🧭 その他の発展の勘所(詳細は各ページ)