論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説(ジャストインタイム型データサイエンス教育)
分布の形状指標
Shape of Distribution
歪度・尖度・モーメントで分布の「形」を測る
記述統計分布モーメント正規性検定

🔖 キーワード索引(補強・追加分)

🔖 キーワード索引(補強・追加分)

尺度と分布の形 関連の補強キーワード。 クリックで該当箇所へ:

名義尺度 順序尺度 間隔尺度 比率尺度 歪度 尖度 対数正規 Q-Q プロット Shapiro-Wilk ボックスコックス

💡 30秒で分かる結論

🍰 まずはやさしく

データの形を測るものさしです。

分布のクセを見つけるために使います。

テストの点数の偏りを調べる時に便利です。

歪度や尖度の結論をまとめました。

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

🍰 まずはやさしく

データの見た目を表す指標です。

平均や分散だけでは分からない形を調べます。

スマホの利用時間のバラつきなどを考えます。

形を測る方法をまとめて学びます。

本ページでは、 分布の形状指標を統合的に解説します。 歪度(skewness)尖度(kurtosis)モーメント正規性検定を一気通貫で扱います。

平均・分散だけでは分布の「形」は分かりません。 左右非対称か、 裾が厚いか、 を測る指標を体系的に学びます。

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

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

🎨 22. 分布形状の視覚化

🍰 まずはやさしく

データの形を絵にする方法です。

数字だけでは見えない特徴を視覚化します。

部活の記録をグラフにして比べます。

分布を可視化する色々な図について読みます。

📥 入力例(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
import pandas as pd

# df はこのあとのブロックで作っているので、ここでも用意しておく
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True)

import seaborn as sns
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
sns.histplot(df['A1101'], kde=True, ax=axes[0])  # A1101=総人口
sns.boxplot(y=df['A1101'], ax=axes[1])
sns.violinplot(y=df['A1101'], ax=axes[2])
plt.tight_layout(); plt.show()

📐 1. モーメントとは

🍰 まずはやさしく

形の正体を計算する仕組みです。

データのズレを数値で表すために使います。

買い物で使う金額の偏りを計算します。

モーメントという考え方について読みます。

📐 1. モーメントとは

確率変数 $X$ のk 次のモーメントk 次の中心モーメント

$$m_k = \mathbb{E}[X^k], \quad \mu_k = \mathbb{E}[(X-\mu)^k]$$

🔬 数式を言葉で読み解く

記号読み:$m_k$ は「エム・サブ・ケー」原点周りのモーメント、 $\mu_k$ は「ミュー・サブ・ケー」中心モーメント、 $\mu = m_1$ は平均。 $\mathbb{E}[\cdot]$ は期待値(確率重み付き平均)、 $(X-\mu)^k$ は中心からのズレを $k$ 乗したもの → 「散らばり」「左右非対称」「裾の重さ」などを順番に取り出す装置。

🌐 関連手法・派生:モーメントは 分散標準偏差正規分布のパラメータ推定(モーメント法)と直結します。 高次モーメントは分布形状判定の核です。

主要モーメント

↔️ 2. 歪度(Skewness)

$$\gamma_1 = \mathbb{E}\left[\left(\frac{X-\mu}{\sigma}\right)^3\right] = \frac{\mu_3}{\sigma^3}$$

記号読み:$\gamma_1$ は「ガンマ・サブ・1」歪度。 標本では Fisher–Pearson 標準化 $g_1 = \sum (x_i-\bar{x})^3 / (n\sigma^3)$。

解釈

歪度 形状 代表的分布
$\gamma_1 > 0$(右歪み)右の裾が長い、 最頻 < 中央 < 平均所得、 待ち時間、 対数正規
$\gamma_1 = 0$対称正規、 一様、 t分布
$\gamma_1 < 0$(左歪み)左の裾が長い、 平均 < 中央 < 最頻試験得点(天井効果)

実値計算

データ [1, 2, 2, 3, 10]:平均 3.6、 σ ≈ 3.26

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4103(合計特殊出生率) L3221(消費支出(二人以上の世帯)) 北海道 5,092,000 1,681,000 1.06 296,888 東京都 14,086,000 3,205,000 0.99 341,320 沖縄県 1,468,000 350,000 1.6 251,222 …(全 47 行)
1
2
3
4
5
import pandas as pd
from scipy import stats
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
for col in ['A1101', 'L3221', 'A1303', 'A4103']:
    print(f'{col}: skew = {df[col].skew():.3f}')
📤 実行例(実測) A1101: skew = 2.156 L3221: skew = -0.245 A1303: skew = 1.840 A4103: skew = 0.075

🗻 3. 尖度(Kurtosis)

$$\beta_2 = \mathbb{E}\left[\left(\frac{X-\mu}{\sigma}\right)^4\right] = \frac{\mu_4}{\sigma^4}$$

記号読み:$\beta_2$ は生尖度。 正規分布で 3 になる。

超過尖度(Excess Kurtosis)

$$\gamma_2 = \beta_2 - 3$$

正規分布の尖度 3 を基準に「ゼロ中心」に修正。 pandas / scipy はこちらを返す。

解釈

超過尖度 名前 形状
$\gamma_2 > 0$leptokurtic(尖り)頂が尖り、 裾が厚い(外れ値多)
$\gamma_2 = 0$mesokurtic正規と同じ尖り
$\gamma_2 < 0$platykurtic(平ら)頂が平らで裾が薄い
1
2
for col in ['A1101', 'L3221', 'A1303', 'A4103']:
    print(f'{col}: kurtosis = {df[col].kurtosis():.3f}')
📤 実行例(実測) A1101: kurtosis = 4.602 L3221: kurtosis = 0.052 A1303: kurtosis = 2.807 A4103: kurtosis = 0.431

🧪 4. 正規性の検定

1
2
3
4
5
from scipy import stats
x = df['A1101']
print('Shapiro:', stats.shapiro(x))
print('Jarque-Bera:', stats.jarque_bera(x))
print('D\'Agostino:', stats.normaltest(x))
📤 実行例(実測) Shapiro: ShapiroResult(statistic=np.float64(0.6945389497032741), pvalue=np.float64(1.070913342296385e-30)) Jarque-Bera: SignificanceResult(statistic=np.float64(921.4838539848816), pvalue=np.float64(7.985893712807904e-201)) D'Agostino: NormaltestResult(statistic=np.float64(252.91663880525482), pvalue=np.float64(1.201848408430245e-55))

4.1 QQ プロット

標本分位点 vs 理論分位点。 一直線なら正規。 目視で正規性を確認する最強の方法。

1
2
3
4
import statsmodels.api as sm
import matplotlib.pyplot as plt
sm.qqplot(x, line='s')
plt.show()

4.2 Jarque–Bera 統計量

$$JB = \frac{n}{6}\left(\gamma_1^2 + \frac{\gamma_2^2}{4}\right)$$

正規分布のもと $\chi^2_2$ に従う。

🔄 5. 歪んだデータの変換

5.1 対数変換

右歪みデータ(所得、 価格、 待ち時間など)に有効。 $y = \log(x+1)$ で 0 も扱える。

1
2
3
4
import numpy as np
df['log_A1101'] = np.log1p(df['A1101'])
print('変換前 skew:', df['A1101'].skew())
print('変換後 skew:', df['log_A1101'].skew())
📤 実行例(実測) 変換前 skew: 2.1564166801718203 変換後 skew: 0.7812070511438594

5.2 Box-Cox 変換

$$y(\lambda) = \begin{cases} (x^\lambda - 1)/\lambda & (\lambda \ne 0) \\ \log x & (\lambda = 0)\end{cases}$$

$\lambda$ を最尤推定して最も正規に近づける。 $x > 0$ が必要。

5.3 Yeo-Johnson 変換

Box-Cox を負の値にも拡張した変換。

1
2
3
4
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer(method='yeo-johnson')
df[['A1101_yj']] = pt.fit_transform(df[['A1101']])
print(df['A1101_yj'].skew())
📤 実行例(実測) 0.11152165786664608

📊 6. 主要分布の歪度・尖度

分布 歪度 超過尖度
正規 $N(\mu, \sigma^2)$00
一様0-1.2
t分布 (df=5)0+6
指数+2+6
対数正規 (σ=1)+6.18+110
ベルヌーイ (p=0.5)0-2

正規分布 $N(\mu, \sigma^2)$

$\gamma_1 = 0,\ \gamma_2 = 0$(基準)

一様分布 $U(a, b)$

$\gamma_1 = 0,\ \gamma_2 = -6/5 = -1.2$(平坦)

指数分布 $\mathrm{Exp}(\lambda)$

$\gamma_1 = 2,\ \gamma_2 = 6$(強い右歪み・厚裾)

カイ二乗分布 $\chi^2_k$

$\gamma_1 = \sqrt{8/k},\ \gamma_2 = 12/k$(k が小さいほど強い歪み)

ガンマ分布 $\mathrm{Gamma}(\alpha, \beta)$

$\gamma_1 = 2/\sqrt{\alpha},\ \gamma_2 = 6/\alpha$

ベータ分布 $\mathrm{Beta}(\alpha, \beta)$

$\alpha > \beta$ で左歪み、 $\alpha < \beta$ で右歪み。 $\alpha=\beta$ で対称。

対数正規分布

$\gamma_1 = (e^{\sigma^2}+2)\sqrt{e^{\sigma^2}-1}$。 $\sigma$ が小さくても顕著な右歪み。

t分布 (df=ν, ν≥5)

$\gamma_1 = 0,\ \gamma_2 = 6/(\nu-4)$(裾が厚い)

🎲 17. シミュレーションで形状を理解

本講座は実データのみを扱いますが、 教育目的では「ある分布から大量サンプリングして歪度・尖度の収束を見る」シミュレーションが有効。 本ページでは数式と SSDSE-B の実データ計算で代替します。

SSDSE-B の主要変数の歪度・尖度を計算し、 上記の「主要分布」表と照合して、 どの分布に近いかを判断する練習を Q1-Q3 で実施できます。

❓ 18. よくある質問

Q. 「歪度・尖度」だけでデータが正規分布かを判定できる?

A. 必要条件にはなりますが十分ではありません。 正規分布は $\gamma_1=0, \gamma_2=0$ ですが、 他にも条件を満たす分布があります。 QQプロット併用が必須。

Q. なぜ「分散」を使うのに「歪度」「尖度」も必要?

A. 分散は「ばらつき」を測りますが「対称性」や「裾の厚さ」は捕捉しません。 リスク管理・モデル選択では裾の挙動が決定的に重要。

Q. 標本サイズが小さい時の歪度の信頼性は?

A. 一般に n < 30 では推定が不安定。 ブートストラップ CI で評価するか、 中央値ベースの頑健な歪度(Bowley)を使う。

🔬 深掘り解説: 分布形状指標を 47 都道府県で実観測する

🔬 深掘り解説: 分布形状指標を 47 都道府県で実観測する

「分布の形状」とは 中心 (mean / median) と ばらつき (variance / std) では掴みきれない、 分布の 非対称性裾の重さ を数値化したものである。 ここでは SSDSE-B-2026 (47 都道府県データ、 出典: 独立行政法人統計センター) を実材料に、 歪度 (skewness)・尖度 (kurtosis) が どんなときに大きく動き、 どんなときに動かないか を都道府県の具体的事例で確認する。 直感を養うには「数式を眺める」ではなく「実値が動く瞬間を観察する」ことが最短ルートである。

A: 歪度 (skewness) を直感で理解する 3 段階

歪度 $\gamma_1 = E[(X-\mu)^3]/\sigma^3$ は、 平均から見た「左右の非対称さ」を 3 乗で増幅して測る。 3 乗のため 外れ値が一発で値を引っ張る のが特徴。 SSDSE-B-2026 の代表列を歪度の大きい順に並べると、 47 都道府県の「東京一極集中」が数値として浮き彫りになる。

ヒストグラム — 分布形状の基本

図 D1: ヒストグラムで分布形状 (中心位置・裾の伸び方・左右対称性) を直感的に確認するのが第一歩。 平均と中央値の位置関係が左右の歪みを示唆する。

列 (SSDSE-B-2026)意味歪度の目安解釈
A1101 総人口+2.29 程度東京・神奈川・大阪の右側ロングテール。 鳥取・島根が左の山を作る。
A1303 65歳以上人口+1.84 程度大都市に高齢者も集積し右裾。
L322108 教育費(二人以上の世帯)+1.37 程度東京・埼玉など都市部で突出。
L322107 交通・通信費+0.97 程度車依存の地方で押し上げ。
L322101 食料費+0.65 程度東京がやや高い、 概ね対称に近い。
L3221 消費支出-0.52 程度ほぼ左右対称(わずかに左裾)。
A4103 合計特殊出生率-0.04 程度ほぼ左右対称。 沖縄が右、 東京が左。

歪度が大きい列は 平均値を「典型値」として報告すると過大評価 につながりやすい。 たとえば人口の平均値は 265 万人前後だが、 実際は 47 都道府県のうち 35 件が平均以下に集中し、 「平均的な都道府県」と呼べる場所が存在しない。 このような場合は 中央値四分位 を併記する設計が必要になる。

B: 尖度 (kurtosis) は「裾の重さ」を測る道具

尖度 $\gamma_2 = E[(X-\mu)^4]/\sigma^4 - 3$ (超過尖度) は 平均から離れた値が「想定より頻繁に」観測されるか を測る。 「尖り具合」と訳されがちだが、 実態は 裾 (tail) の厚み。 正規分布で 0、 t 分布や指数分布で正、 一様分布で負。

分布超過尖度裾の特徴実世界の例
一様分布 U(0,1)-1.2裾が無い (端で打ち切り)乱数生成、 確率の基準
正規分布 N(0,1)0.0標準的な裾身長、 測定誤差
t 分布 (df=5)+6.0重い裾小標本の検定統計量
指数分布+6.0右側に長い裾待ち時間、 故障時間
ラプラス分布+3.0中心が尖り、 裾も厚い金融商品リターン
対数正規分布+10 以上非常に重い右裾所得、 都市人口、 株価
Cauchy 分布分散すら定義されない物理学の共鳴幅

SSDSE-B-2026 の総人口列は超過尖度がおよそ +5 と 正規よりはっきり重い裾 を示す。 これは「都道府県の人口分布は正規ではなく、 一部の超大都市が裾を引き伸ばしている」ことを定量化している。 t 検定・ANOVA など正規性を仮定する検定をそのまま適用すると、 p 値が過小評価される可能性がある。 Shapiro-Wilk 検定 での事前確認や 対数変換 による正規化が必要になる場面。

C: 歪度と尖度の関係 — 同時に動く理由

歪度の二乗 $\gamma_1^2$ と超過尖度 $\gamma_2$ には数学的に $\gamma_2 \geq \gamma_1^2 - 2$ の不等式が成り立つ (Pearson 不等式)。 つまり 歪度が大きい分布は必ず尖度も大きくなる。 47 都道府県データで観測する人口・世帯支出系の列の多くが「右裾 + 重い裾」になるのはこの数学的帰結。

散布図 — 2 変数の同時分布

図 D2: 47 都道府県を 2 次元にプロットすると、 1 変数の歪度・尖度だけでは見えない「外れ点 (東京) が周辺関係を全て持っていく」構造が見える。 散布図と形状指標は併用する。

D: 47 都道府県の人口を Python で実測する

このコードでやること: SSDSE-B-2026 の総人口列 A1101 と消費支出列 L3221(二人以上の世帯)について scipy.stats で歪度と尖度を計算し、 上位/下位 5 都道府県を表示する。 単に数値を出すだけでなく 「なぜその値になるのか」を都道府県名で確認 する。

📥 入力データ (SSDSE-B-2026 の 2023 年 冒頭 4 行):

SSDSE-B-2026 Code Prefecture A1101 L3221 2023 R01000 北海道 5092000 296888 2023 R02000 青森県 1184000 263371 2023 R03000 岩手県 1163000 298536 2023 R04000 宮城県 2264000 305541
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 最新年 (2023) の 47 都道府県
for col in ['A1101', 'L3221']:       # A1101=総人口, L3221=消費支出
    x = df[col].dropna()
    sk = stats.skew(x)
    ku = stats.kurtosis(x)  # 超過尖度 (Fisher 定義)
    print(f'[{col}] n={len(x)} mean={x.mean():.1f} std={x.std():.1f}')
    print(f'  skewness = {sk:+.3f}')
    print(f'  kurtosis = {ku:+.3f} (超過尖度)')
    top = df.nlargest(5, col)[['Prefecture', col]]
    bot = df.nsmallest(5, col)[['Prefecture', col]]
    print('  上位5:', top.to_dict('records'))
    print('  下位5:', bot.to_dict('records'))

📤 実行結果:

[A1101] n=47 mean=2645808.5 std=2797551.4 skewness = +2.219 kurtosis = +4.951 (超過尖度) 上位5: 東京都(14086000), 神奈川県(9229000), 大阪府(8763000), 愛知県(7477000), 埼玉県(7331000) 下位5: 鳥取県(537000), 島根県(650000), 高知県(666000), 徳島県(695000), 福井県(744000) [L3221] n=47 mean=295856.0 std=24144.1 skewness = -0.520 kurtosis = +0.521 (超過尖度) 上位5: 埼玉県(344092), 東京都(341320), 三重県(332663), 富山県(327503), 栃木県(325226) 下位5: 愛媛県(223423), 沖縄県(251222), 宮崎県(257997), 和歌山県(259437), 長崎県(262243)

💬 結果の読み方: A1101 は歪度 +2.22、 超過尖度 +4.95 で 明確な右裾 + やや厚い裾。 東京 1409 万人は次点神奈川の 1.5 倍、 最小の鳥取の 26 倍。 L3221(消費支出)は歪度 -0.52、 超過尖度 +0.52 で「ほぼ左右対称(わずかに左裾)で正規に近い分布」。 消費支出は最大の埼玉 34.4 万円と最小の愛媛 22.3 万円の差が 1.5 倍 程度に収まり、 人口のような極端な集中はない。 このギャップが「人口や経済規模は一極集中するが、 1 世帯あたりの消費支出は地域差が小さい」という政策議論の数値的根拠になる。

E: 形状指標の標本サイズ依存性 — n=47 は信頼できるか

歪度・尖度は 標本サイズが小さいと推定誤差が非常に大きい。 教科書的な経験則は「歪度の標準誤差 ≈ $\sqrt{6/n}$、 尖度の標準誤差 ≈ $\sqrt{24/n}$」。 47 都道府県データではそれぞれ約 0.36、 0.71 となる。

標本サイズ n歪度の標準誤差尖度の標準誤差使用可否
100.771.55参考程度
47 (都道府県)0.360.71大きな偏りなら検出可
1000.240.49中程度の偏りも検出
10000.080.15小さい偏りも有意
100000.0240.049微小偏差まで検出

A1101 (総人口) の歪度 +2.22 は SE=0.36 に対して 6 倍以上の絶対値なので 明確に対称ではない と断言できる。 一方 A4103 (合計特殊出生率) の歪度 -0.04 は SE 内に収まるため「対称的とみなしてよい」。 ここを混同すると「47 都道府県すべての列に歪みがある」と過剰主張する誤りに繋がる。

F: 群間で形状を比較する — 47 都道府県 vs 米国 50 州 (思考実験)

箱ひげ図 — 複数群の分布比較

図 D3: 箱ひげ図は中心位置 (中央値)・ばらつき (IQR)・外れ値・歪み (中央値が箱の中で偏る) を同時に可視化できる。 形状指標と組み合わせて使う標準ツール。

47 都道府県の人口分布は「東京一極集中 + 多数の中堅都市 + 少数の小都市」という 3 山構造に近い。 これは形状指標を「全体で 1 つ」しか出さない場合は見落とされる。 群分け (例: 三大都市圏 vs その他) して形状を別々に算出する「層別形状分析」が実務では多用される。

対象平均人口 (人)歪度尖度
三大都市圏東京・神奈川・大阪・愛知・千葉・埼玉・兵庫8,359,000+1.17+0.45
政令市保有県福岡・京都・広島・宮城・新潟・静岡3,053,500+1.13-0.14
地方圏鳥取・島根・高知・徳島637,000-0.90-0.83

G: 尺度水準 (Stevens 1946) × 形状指標の可否マトリクス

形状指標は 間隔尺度・比率尺度 でしか定義されない。 名義 (例: 都道府県名) には足し算がないので平均すら存在せず、 順序 (例: 5 段階評価) でも数値差に意味がないため平均・分散の計算は本質的に不正確。 ところがアンケート 5 件法を平均して「3.8 点だから歪度は…」と語る分析は実務で頻発する。

尺度平均中央値分散歪度・尖度
名義都道府県、 性別、 血液型××××
順序5 件法アンケート、 学年△ (近似)×
間隔気温 (摂氏)、 西暦
比率人口、 所得、 距離、 時間○ (幾何平均・変動係数も可)

SSDSE-B-2026 の数値列は全て比率尺度なので形状指標を計算してよい。 一方 SSDSE-E (学校データ) の教育課程コードや SSDSE-D (社会保障データ) の制度区分コードは名義尺度なので、 数値に見えても歪度を計算してはならない。 「標準化 後の値」「中央値 との比」など演算意味のある変換だけが許される。

H: 形状指標から検定・モデル選択へ — 実務フローチャート

形状指標は そのまま意思決定に使う数値ではなく、 次の分析を選ぶための予備調査値 である。 以下のフローは EDA 段階で頻出する判断パターン。

|歪度|超過尖度推奨アクション理由
< 0.5|·| < 1正規分布近似で t 検定・ANOVA対称・標準裾
0.5 - 1.0|·| < 2中央値併記、 結論は慎重に中程度の歪み
1.0 - 2.02 - 5対数 / 平方根変換を検討片側偏重
> 2.0> 5ノンパラ検定 (Mann-Whitney 等) または対数変換必須正規仮定は破綻
外れ値起因突出値外れ値除外 / Winsorize / robust 統計1-2 点が支配

I: 形状指標を 1 行で計算する 6 種の Python ライブラリ

このコードでやること: 同じデータに対して scipy / pandas / numpy / statsmodels の歪度・尖度を比較し、 ライブラリごとの定義差 (Fisher vs Pearson、 バイアス補正の有無) を確認する。

📥 入力データ: SSDSE-B-2026 の A1101 列 (47 都道府県の総人口)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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])
df = df[df['SSDSE-B-2026'] == 2023]
x = df['A1101'].dropna()

print('scipy.stats.skew (Fisher, bias=True)    :', stats.skew(x, bias=True))
print('scipy.stats.skew (Fisher, bias=False)   :', stats.skew(x, bias=False))
print('pandas .skew()  (Fisher, bias 補正済み)  :', x.skew())

print('scipy.stats.kurtosis (Fisher, bias=True):', stats.kurtosis(x, bias=True))
print('scipy.stats.kurtosis (Pearson)          :', stats.kurtosis(x, fisher=False))
print('pandas .kurt()  (Fisher, bias 補正済み)  :', x.kurt())

📤 実行結果:

scipy.stats.skew (Fisher, bias=True) : 2.219 scipy.stats.skew (Fisher, bias=False) : 2.293 pandas .skew() (Fisher, bias 補正済み) : 2.293 scipy.stats.kurtosis (Fisher, bias=True): 4.951 scipy.stats.kurtosis (Pearson) : 7.951 pandas .kurt() (Fisher, bias 補正済み) : 5.661

💬 結果の読み方: 同じデータでも 3 通りの値が出る。 (1) Fisher vs Pearson の差は 3 (定義の引き算)。 (2) bias 補正 は小標本ほど効く。 47 都道府県程度では数 % の差。 (3) 論文・レポートに記載する際は「scipy.stats.kurtosis (Fisher, bias=True)」のように定義を明示 しないと再現できない。 デフォルトのまま使う場合でも、 README に書く運用を推奨。

J: 形状指標が「動かない」典型ケース

歪度・尖度は便利だが、 以下の場合は値が動かず誤った安心を与える 危険がある。 EDA では数値だけでなく必ずヒストグラム・箱ひげ図と併用する。

K: 関連用語の整理 (前提・並列・発展)

L: 1 ページ要約 — 形状指標の使用フロー

  1. 列が 比率尺度 (人口・所得・距離・時間) であることを確認する。
  2. ヒストグラム箱ひげ図 で目視する。 1 山か 2 山か、 左右どちらに偏るか、 外れ値はあるか。
  3. scipy.stats で歪度・尖度を計算し、 SE と比較する (例: n=47 なら歪度 SE ≈ 0.36)。
  4. |歪度| > 1 なら 対数変換 や Box-Cox 変換を試す。
  5. |歪度| > 2 または超過尖度 > 5 なら 中央値 中心の報告に切り替える、 もしくは ノンパラ検定を選ぶ。
  6. 外れ値除外時の感度分析を行い、 「外れ値 1 点で結論が変わる」なら別途報告する。
  7. レポートには 定義 (Fisher / Pearson, bias 補正の有無) を明示 する。

形状指標は 「数値が小さい = 正常」では決してなく、 双峰・離散・打ち切りなど構造的な異常は見逃す。 必ず図と数値を合わせて判断する規律を持つ。 47 都道府県データは「歪度 +3 級が当たり前の世界」を体感する格好の教材になる。

🔬 深掘り II: 形状指標の応用 — 異常検知・機械学習・レポート設計

M: 異常検知における形状指標の役割

製造業の品質管理、 不正取引検知、 サーバ監視など 「正常時の分布を学習し、 そこから外れた値を検出する」 場面では、 形状指標は次の 3 つの判断に直接使われる。

業界監視対象典型分布歪度尖度推奨手法
製造業寸法誤差正規≈ 0≈ 03σ 管理図 (Shewhart)
サーバ監視レスポンス時間 (ms)対数正規+2 〜 +5+5 〜 +30対数変換 + 3σ、 99 パーセンタイル
金融日次リターン (%)t 分布 (df=4 〜 6)≈ -0.3+3 〜 +10VaR、 EVT (極値統計)
EC サイト注文金額対数正規+3 〜 +6+10 以上ルールベース + Isolation Forest
医療検査値 (Cre, BNP 等)対数正規+1 〜 +3+2 〜 +10対数変換 + Z スコア
気象降水量 (mm)対数正規 + ゼロ過剰+5 以上+20 以上ガンマ + GP 分布混合

N: 機械学習モデルへの影響 — 線形 vs 木 vs 深層

機械学習モデルの種類ごとに、 特徴量の歪度・尖度が予測精度に与える影響は大きく異なる。

モデル歪度の影響尖度の影響対策
線形回帰 (OLS)大 (係数が外れ値に引っ張られる)大 (残差の正規性が崩れる)対数変換、 Box-Cox、 robust 回帰
ロジスティック回帰中 (標準化で緩和)標準化
k 近傍法 (kNN)大 (距離が偏る)標準化 必須、 外れ値除去
決定木 / ランダムフォレスト小 (順位ベース)通常は変換不要
XGBoost / LightGBM通常は変換不要
ニューラルネット中 (勾配消失/爆発)BatchNorm、 LayerNorm、 標準化
SVM (RBF カーネル)標準化 必須、 カーネル幅調整

SSDSE-B-2026 の人口列 A1101 (歪度 +2.2) をそのまま線形回帰に入れると、 東京 1 点が係数を支配する。 同じデータを XGBoost に渡せば順位情報だけ使うため、 東京の影響は限定的になる。 「データ形状を見てから、 モデルを選ぶ・前処理を決める」が EDA の最重要アウトプット。

O: SSDSE-B-2026 の歪度ランキング (47 都道府県、 主要 20 列)

SSDSE-B-2026 のおよそ 100 列のうち、 教材で扱う頻度の高い 20 列を歪度の絶対値順に並べた。 上位は「人口・世帯数の規模系」、 下位は「1 世帯あたり支出や比率系」になりがちで、 これが教材設計の指針になる。

順位意味|歪度|解説
1A1302 15~64歳人口2.52都市圏に生産年齢人口が集中
2A4101 出生数2.37人口比例
3A1101 総人口2.29東京一極集中
4A1102 日本人人口2.25総人口とほぼ同型
5A1301 15歳未満人口2.14人口比例
6A4200 死亡数1.86人口規模に比例
7A1303 65歳以上人口1.84大都市に集積
8L322108 教育費1.37都市部で突出
9B4106 降水日数1.01日本海側が多い
10L322107 交通・通信費0.97車依存の地方で高い
11L322101 食料費0.67東京がやや高い
12L322103 光熱・水道費0.67寒冷地が高い
13L322106 保健医療費0.66やや右
14B4109 降水量mm0.63地域差
15L3221 消費支出0.54わずかに左裾
16L322102 住居費0.40都市が高い
17L322109 教養娯楽費0.19ほぼ対称
18B4101 年平均気温0.16ほぼ対称(沖縄が高温側)
19A4103 合計特殊出生率0.04左右対称
20L322104 家具・家事用品費0.01対称

P: パーセンタイル換算表 — 歪度・尖度から相対位置を読む

「東京は何パーセンタイルに位置するか」は分布形状によって大きく変わる。 同じ z スコア 3 でも、 正規分布なら上位 0.13%、 対数正規 (歪度 3) なら上位 1% 程度、 t 分布 (df=5) なら上位 1.5% といった具合。

分布z = 2 の上側確率z = 3 の上側確率z = 4 の上側確率99% パーセンタイルの z
正規 N(0,1)2.28%0.13%0.003%2.33
t (df=5)5.1%1.5%0.5%3.36
t (df=3)7.0%2.9%1.4%4.54
指数4.5%1.8%0.7%3.61
対数正規 (σ=1)3.5%1.5%0.7%3.71

SSDSE-B-2026 の人口列を z 化すると東京は z=4.0 付近にいる。 正規分布前提で考えると 3 万分の 1 の「奇跡」、 実際は対数正規前提で 100 分の 1 程度の「珍しいが起こり得る」現象。 この差が政策議論で「東京は特別」と片付けるか「他の都市にも起こり得る」と捉えるかの分かれ目になる。

Q: 報告書テンプレート — 形状指標を 1 表で伝える

レポートで形状指標を伝える際の標準テンプレート。 「数値だけ」「視覚化だけ」のいずれも不完全で、 両者を 1 つの表にまとめると読み手に最短で伝わる。

項目総人口 A1101消費支出 L3221合計特殊出生率 A4103
n474747
単位千円/人%
平均2,645,809295,8561.29
中央値1,549,000300,6521.30
標準偏差2,797,55124,1440.13
変動係数1.060.080.10
歪度 (Fisher)+2.22-0.52-0.04
超過尖度+4.95+0.52-0.44
Shapiro-Wilk p< 0.0010.270.94
最小537,000 (鳥取)223,423 (愛媛)0.99 (東京)
最大14,086,000 (東京)344,092 (埼玉)1.60 (沖縄)
推奨報告値中央値 + IQR平均で OK平均で OK
推奨可視化対数軸ヒスト + 箱ひげヒストグラムヒストグラム

この表 1 つで、 読み手は「どの列を平均で語ってよいか」「対数変換が必要か」「外れ値はどこか」を一覧できる。 形状指標を単独で出すのではなく、 中心傾向・ばらつき・検定 p 値・推奨アクションをワンセットで提示するのが熟練アナリストの定型。

R: 教育設計上の注意 — 47 都道府県データを教材で使う際の落とし穴

S: チェックリスト — 形状指標レポート完成度の自己評価

項目合格基準不合格例
尺度水準の明示列ごとに比率/間隔/順序/名義を明記アンケート 5 件法を比率扱い
標本サイズ確認n と歪度 SE を併記「歪度 +1.2」だけ
定義の明示Fisher / Pearson、 bias 補正「scipy で算出」だけ
視覚化との併用ヒストグラム + 数値表数値だけ
外れ値の感度分析除外前後を比較外れ値の存在に言及無し
次アクションの提示対数変換・ノンパラ検定を勧告「歪んでいる」で終わる
中央値・IQR 併記必ず併記平均のみ報告
時系列変化複数年度比較1 時点のみ

この 8 項目を全て満たして初めて「形状指標を理解した分析」と呼べる。 数値を出すだけなら scipy 1 行で終わるが、 そこから読み解きと意思決定に繋げるのが本来の使い方。 SSDSE-B-2026 と ヒストグラム箱ひげ図相関係数 を組み合わせれば、 47 都道府県を題材にした EDA の標準ワークフローを 1 ページで実演できる。

🔬 深掘り III: 形状を「変える」方法 — 変換と再標本化

T: 対数変換が歪度を消す原理

SSDSE-B-2026 の人口列 A1101 は歪度 +2.2、 超過尖度 +5.0 という明確な右裾分布だが、 各値に 自然対数を取るだけ で歪度はおよそ +0.8 まで縮み、 正規性検定でも棄却されない程度に対称化する。 これが対数変換が EDA・回帰分析の前処理で多用される理由である。

背景にある数学的理由は、 「東京 (1409 万) と鳥取 (54 万) は 26 倍の差」だが「log(1409 万) ≒ 16.46 と log(54 万) ≒ 13.19 は 1.25 倍の差」になるためである。 つまり対数変換は 「比率としての差」を「絶対値の差」に変換する 操作で、 比率に意味があるデータ (人口・所得・GDP・株価) に特に効く。

変換数式変換後の人口歪度変換後の人口尖度適用条件
なし$y = x$+2.22+4.95対称データのみ
平方根$y = \sqrt{x}$+1.49+1.54カウントデータ、 $x \geq 0$
対数$y = \ln x$+0.79-0.21$x > 0$、 比率に意味
逆数$y = 1/x$+0.55-0.28$x > 0$、 反転意味のあるデータ
Box-Cox$y = (x^\lambda - 1) / \lambda$+0.12-0.74$\lambda$ を最尤推定
Yeo-Johnson部分的に対数+0.12-0.74負値・ゼロを含むデータ可

U: Python で変換前後の形状を一気に比較

このコードでやること: SSDSE-B-2026 の総人口に 5 種類の変換を適用し、 変換前後の歪度・尖度を一覧表示する。 どの変換が最も「対称化」するかを実値で確認する。

📥 入力データ: SSDSE-B-2026 の A1101 列 (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])
df = df[df['SSDSE-B-2026'] == 2023]
x = df['A1101'].dropna()

# 5 種類の変換
y_sqrt = np.sqrt(x)
y_log = np.log(x)
y_inv = 1.0 / x
y_bc, lam = stats.boxcox(x)  # Box-Cox

print(f'{"変換":<10}{"歪度":>10}{"尖度":>10}')
print(f'{"なし":<10}{stats.skew(x):>10.3f}{stats.kurtosis(x):>10.3f}')
print(f'{"sqrt":<10}{stats.skew(y_sqrt):>10.3f}{stats.kurtosis(y_sqrt):>10.3f}')
print(f'{"log":<10}{stats.skew(y_log):>10.3f}{stats.kurtosis(y_log):>10.3f}')
print(f'{"1/x":<10}{stats.skew(y_inv):>10.3f}{stats.kurtosis(y_inv):>10.3f}')
print(f'{"Box-Cox":<10}{stats.skew(y_bc):>10.3f}{stats.kurtosis(y_bc):>10.3f}  (lambda={lam:.3f})')

📤 実行結果:

変換 歪度 尖度 なし +2.219 +4.951 sqrt +1.485 +1.535 log +0.793 -0.211 1/x +0.552 -0.284 Box-Cox +0.115 -0.741 (lambda=-0.492)

💬 結果の読み方: Box-Cox の最適 λ ≈ -0.49 は 対数変換 (λ=0)逆数変換 (λ=-1) の中間で、 log 単独 (歪度 +0.79) よりさらに裾を圧縮し歪度を +0.12 まで下げる。 とはいえ log でも歪度は +2.2 → +0.8 に大きく改善し、 正規性検定 (D'Agostino) は棄却されなくなる。 実務では λ を最尤推定するより、 解釈しやすい対数変換を選ぶことが多い。

V: 変換のリスクと注意点

変換は万能ではない。 以下の落とし穴に注意する。

W: ブートストラップで形状指標の信頼区間を出す

このコードでやること: 47 都道府県データから復元抽出を 10,000 回繰り返し、 歪度・尖度の 95% 信頼区間を経験分布から求める。 公式の標準誤差 $\sqrt{6/n}$ より信頼性が高い。

📥 入力データ: SSDSE-B-2026 の A1101 列 (47 値)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
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])
df = df[df['SSDSE-B-2026'] == 2023]
x = df['A1101'].dropna().to_numpy()
B = 10000  # ブートストラップ反復回数
rng = np.random.default_rng(42)

sk_boot = np.empty(B)
ku_boot = np.empty(B)
for b in range(B):
    sample = rng.choice(x, size=len(x), replace=True)
    sk_boot[b] = stats.skew(sample)
    ku_boot[b] = stats.kurtosis(sample)

print(f'歪度: 推定={stats.skew(x):.3f}')
print(f'      95% CI=[{np.percentile(sk_boot, 2.5):.3f}, {np.percentile(sk_boot, 97.5):.3f}]')
print(f'尖度: 推定={stats.kurtosis(x):.3f}')
print(f'      95% CI=[{np.percentile(ku_boot, 2.5):.3f}, {np.percentile(ku_boot, 97.5):.3f}]')

📤 実行結果:

歪度: 推定=2.219 95% CI=[1.191, 3.293] 尖度: 推定=4.951 95% CI=[0.046, 11.848]

💬 結果の読み方: 歪度の 95% CI は [1.19, 3.29] と幅広く、 「正確な値はわからないが、 確実に正で、 おおむね 1.2 以上」と言える。 尖度はもっと幅広く [0.05, 11.85]、 つまり「裾は厚めだが、 どれくらい厚いかは標本では正確に分からない」。 n=47 という小標本での形状指標は 「方向は信頼できるが、 桁は信頼できない」 という認識が肝心。

X: 47 都道府県データで実践する形状分析の 1 時間ワークショップ

教材として 1 時間使う想定の段取り。 学習者に「数値を出す」より「数値を解釈する」訓練を施す設計。

時間活動学習目標
0:00 - 0:10CSV 読み込み、 head() / describe()データの全体像を掴む
0:10 - 0:20A1101 のヒストグラム描画右裾の存在を視覚で確認
0:20 - 0:30歪度・尖度の計算、 値の意味数値と図を対応付ける
0:30 - 0:40対数変換 → 再度ヒストグラム変換の効果を体感
0:40 - 0:50他列 (L3221、 A4103) と比較列ごとに形状が違うことを理解
0:50 - 1:00まとめ表作成、 次アクション選択レポート設計を実践

このワークショップを 3 回繰り返すと、 学習者は「ヒストグラムを見ると歪度の符号が予想できる」「数値を見ると変換の要否が判断できる」という直感を獲得する。 形状指標は 覚える対象ではなく、 慣れる対象 である。

Y: よくある誤解と訂正

誤解正しい理解
「尖度は分布の尖り具合」実態は「裾の厚さ」。 中心がいくら尖っても裾が薄ければ尖度は負になる。
「歪度 0 = 正規分布」対称ならどんな分布でも歪度 0。 一様分布も二峰分布も歪度 0 になり得る。
「歪度・尖度が小さい = 正規」正規性の必要条件であって十分条件ではない。 Shapiro-Wilk や Q-Q プロットで確認する。
「対数変換すれば必ず正規」対数変換が効くのは対数正規型のみ。 t 分布や二峰分布には効かない。
「scipy のデフォルトでよい」scipy.stats.kurtosis のデフォルトは Fisher 定義・bias=True。 pandas は bias=False。 ライブラリ間で値が違うので定義の明示が必要。
「歪度が大きいとモデル精度が下がる」線形モデルは下がるが、 木系モデル (XGBoost 等) は影響を受けにくい。 モデル次第。
「正規分布から外れたら検定不能」大標本なら中心極限定理で平均の検定は使える。 中央値検定やノンパラ検定もある。

Z: まとめ — この記事 1 本で達成すべき理解

この記事を読み終えたら、 自分の手元のデータ (SSDSE-B-2026 や、 任意の業務データ) で ヒストグラム → 歪度・尖度算出 → 対数変換 → 再度形状確認 → レポート表作成、 という 1 時間ワークフローを実践してほしい。 「数値を出す」のではなく「数値で議論する」訓練が、 データサイエンティストとしての地力を作る。

🔬 深掘り IV: 形状指標の歴史と次の一歩

AA: 統計学者たちが形状指標を発明した経緯

歪度・尖度の概念は Karl Pearson (1857-1936) が 1890 年代に提唱した。 当時の問題意識は「経済データや生物計測データは正規分布に従わない場合が多い」というもので、 Pearson は分布族 (Pearson distribution family) を構築し、 そのパラメータとして歪度 (β₁) と尖度 (β₂) を導入した。 これが現代の skewness / kurtosis の祖型である。

その後 Ronald Fisher (1890-1962) がモーメント法と標準誤差の理論を整備し、 「歪度・尖度の標準誤差は標本サイズに依存する」ことを定量化した。 現代の scipy.stats における Fisher 定義 (超過尖度) はこの伝統を引き継いでいる。 一方 Pearson 定義 (尖度に 3 を足したもの) は教科書によって今も使われており、 ライブラリ間の値の食い違いの原因になっている。

年代出来事影響
1895K. Pearson が歪度・尖度を定義分布族の特徴付け
1925Fisher がモーメント法の標準誤差を確立推定精度の数学化
1946Stevens が尺度水準 (名義/順序/間隔/比率) を分類形状指標の適用範囲が明確化
1964Box & Cox が変換族を提案歪度を消す手法の理論化
1970sTukey が EDA を提唱、 箱ひげ図が普及数値と図の併用が標準化
1990sscipy / pandas が形状指標の計算を 1 行で実装実務での普及
2020s機械学習の前処理で形状指標が再注目XGBoost 等で必要性の再定義

BB: 形状指標の次の一歩 — L モーメント・ベイズ推定・分位回帰

古典的な歪度・尖度は外れ値に弱いため、 現代では以下の代替指標も使われる。

CC: 1 文サマリ集 — 47 都道府県データで学ぶ形状指標

これらの 1 文を覚えておけば、 同僚や上司に 47 都道府県データの形状特性を 30 秒で説明できる。 細部の数式や標準誤差の公式は scipy.stats のドキュメントを引けば良いが、 「東京を 1 点除けば歪度は半減する」「対数を取れば対称」 という具体例は記憶に残しておく価値がある。

DD: この記事の使い方 (再掲)

  1. 初学者: 直感ボックス → ヒストグラム → 歪度・尖度の値順で読む。
  2. EDA を始める実務者: Q (報告書テンプレート) → S (チェックリスト) → 自分のデータに適用。
  3. 機械学習エンジニア: N (モデル別影響表) → T (変換) → 前処理パイプラインに組み込む。
  4. 教育者: X (1 時間ワークショップ) → 学習者にデータを配布 → 実演させる。
  5. 研究者: BB (L モーメント・ベイズ) → 古典指標の限界を超える手法を選ぶ。

形状指標は 「使うと意思決定が速くなる道具」 であって、 「覚えるべき公式」ではない。 47 都道府県データで何度も実演し、 自分の感覚として根付かせるのが学習の王道。

🔬 深掘り V: 理解度チェックと自己診断

EE: 理解度チェック 12 問

  1. SSDSE-B-2026 の総人口列 A1101 を平均で報告すべきか、 中央値で報告すべきか。 理由付きで答えよ。 (ヒント: 歪度 +2.2)
  2. 歪度の標準誤差は標本サイズ n=47 でいくらか。 公式と計算過程を示せ。
  3. 「尖度が大きい = 中心が尖っている」は正しいか。 反例を 1 つ挙げよ。
  4. 対数変換が効くデータと効かないデータを 2 例ずつ挙げよ。
  5. scipy.stats.kurtosis と pandas .kurt() の値が違う理由を説明せよ。
  6. n=10 のデータで歪度 +2.0 を観測した。 「強い右裾」と断言できるか。
  7. 双峰分布の歪度・尖度はどうなるか。 一般傾向を述べよ。
  8. Pearson 不等式 $\gamma_2 \geq \gamma_1^2 - 2$ を SSDSE-B-2026 の A1101 列で検証せよ。
  9. Box-Cox 変換の λ が 0 のとき、 変換は何になるか。
  10. L モーメントが古典的モーメントより堅牢な理由を 1 文で説明せよ。
  11. 「形状指標が小さい = 正規分布」は正しいか。 必要条件 / 十分条件で答えよ。
  12. 47 都道府県の人口について、 z = 4.0 (東京) の上側確率を正規分布前提と対数正規前提で求め、 比較せよ。

FF: 解答例 (要点のみ)

  1. 中央値で報告。 平均は東京 1 点に引っ張られる過大評価。
  2. $\sqrt{6/47} \approx 0.357$。 つまり「歪度 ±0.7 程度の幅では区別できない」。
  3. 誤り。 一様分布は中心が平らだが「尖度 -1.2」となる。 尖度は「裾の厚さ」を測る。
  4. 効く: 人口・所得・GDP・株価。 効かない: 気温・パーセント・スコア (既に対称)。
  5. デフォルトの bias 補正設定が違う (scipy は bias=True、 pandas は bias=False)。
  6. 断言できない。 n=10 では歪度 SE が 0.77 で、 +2.0 ÷ 0.77 = 2.6σ 程度。 90% 程度の信頼度。
  7. 歪度 ≈ 0 (左右対称)、 尖度 ≈ 負 (中心が平ら / 二峰)。 数値だけでは検出できない。
  8. $\gamma_1 = 2.22$、 $\gamma_2 = 4.95$。 $2.22^2 - 2 = 2.93 \leq 4.95$ で不等式成立。
  9. $\ln x$ (自然対数)。 $\lambda = 0$ は対数変換に対応する極限。
  10. 順序統計量の線形結合で定義され、 大きな値の影響が中心化される。
  11. 必要条件のみ。 双峰分布も歪度 0、 尖度 0 になり得る。 Q-Q プロットで補完する。
  12. 正規前提: 約 3 万分の 1 (0.003%)。 対数正規前提: 約 100 分の 1 (1%)。 約 300 倍の差。

GG: 自己診断フローチャート

正解数レベル次のアクション
11 - 12熟達L モーメント・分位回帰など発展手法へ
8 - 10実務可自分のデータで報告書テンプレート Q を実装
5 - 7理解中深掘り I・II を再読、 SSDSE-B で実演
0 - 4初学者基本セクション 1-12 を読み直し、 ヒストグラム平均中央値 を先に確認

形状指標は 1 度の通読では身につかない。 同じ SSDSE-B-2026 で年度を変え、 列を変え、 群を変えて何度も実演するうちに、 ヒストグラムを見ただけで歪度の桁が言えるようになる。 そこまで来れば「形状指標を理解した」と言える。

🎯 締め: 形状指標を学ぶ意義の再確認

中心傾向 (平均・中央値) と ばらつき (分散・標準偏差) は、 高校数学で習う「基本中の基本」である。 ところが 形状指標 (歪度・尖度) は教科書ではほとんど触れられず、 大学の統計学講義でも「定義だけ示して終わり」になりがちな扱いを受けている。 これは情報量に対する教育投資のミスマッチで、 現代のデータサイエンス実務では形状指標が以下の場面で必須となる。

SSDSE-B-2026 の 47 都道府県データは、 これら 5 つの場面を すべて 1 つの教材で体験できる 稀有な題材である。 是非自分の手元でコードを動かし、 数値を出し、 図を描き、 同僚に説明してほしい。 形状指標は 使うほど磨かれる感覚 であり、 公式を暗記するだけでは絶対に身につかない。 この記事を読み終えたあなたの次の一歩は、 自分のデータで歪度と尖度を計算することである。

🧮 SSDSE-B 実値計算例(47都道府県データ)

SSDSE-B の連続変数(総人口・消費支出・合計特殊出生率など)について、 尺度水準と分布形状(歪度・尖度・正規性)を体系的に分析する完全例。

① 計算コード

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 A1101(総人口) A1303(65歳以上人口) A4103(合計特殊出生率) L3221(消費支出(二人以上の世帯)) L322101(食料費(二人以上の世帯)) 北海道 5,092,000 1,681,000 1.06 296,888 74,341 東京都 14,086,000 3,205,000 0.99 341,320 97,776 沖縄県 1,468,000 350,000 1.6 251,222 73,453 …(全 47 行)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]  # 最新年 (2023) の 47 都道府県

# 各変数の尺度・形状指標
fig, axes = plt.subplots(2, 3, figsize=(14, 8))
vars_to_check = ['A1101', 'A1303', 'L3221', 'L322101', 'A4103', 'L322109']
results = []
for i, var in enumerate(vars_to_check):
    x = df[var].dropna().values
    skew = stats.skew(x)
    kurt = stats.kurtosis(x)  # excess kurtosis
    shapiro_w, shapiro_p = stats.shapiro(x)
    results.append({
        '列': var, '平均': x.mean(), 'SD': x.std(),
        '歪度': skew, '尖度': kurt,
        'Shapiro-W': shapiro_w, 'Shapiro-p': shapiro_p,
    })
    ax = axes[i // 3, i % 3]
    ax.hist(x, bins=15, edgecolor='black', alpha=0.7)
    ax.set_title(f'{var}\n歪度={skew:.2f}, 尖度={kurt:.2f}')

plt.tight_layout(); plt.savefig('shape_check.png', dpi=110)
print(pd.DataFrame(results).round(3))
📤 実行例(実測) 列 平均 SD 歪度 尖度 Shapiro-W Shapiro-p 0 A1101 2645808.511 2767630.215 2.219 4.951 0.689 0.000 1 A1303 770829.787 686418.312 1.782 2.459 0.738 0.000 2 L3221 295856.021 23885.824 -0.520 0.521 0.970 0.266 3 L322101 80597.936 5779.283 0.652 0.062 0.952 0.051 4 A4103 1.293 0.132 -0.043 -0.444 0.989 0.945 5 L322109 27409.149 4447.301 0.184 0.699 0.970 0.262

② 期待出力

項目 参考 解釈
変数歪度尖度Shapiro-p解釈
A1101 総人口+2.22+4.95< 0.001右に長い裾(東京が突出)
A1303 65歳以上人口+1.78+2.46< 0.001右裾(大都市に集積)
L3221 消費支出-0.52+0.520.27ほぼ対称
L322101 食料費+0.65+0.060.05やや右・ほぼ正規
A4103 合計特殊出生率-0.04-0.440.94正規に近い
L322109 教養娯楽費+0.18+0.700.26ほぼ対称

👉 値は SSDSE-B-2026(2023 年・47 都道府県)の実測値。 同じ手順で他年度・他変数にも適用可能。

🧮 数式に値を入れて手で計算する: 歪度と尖度

SSDSE-B-2026 風の右に長い分布(人口 1 千人未満の小規模自治体多数 + 東京・神奈川など極端値)を模した 10 件 x=[1,2,2,3,3,3,4,4,5,10] で歪度・尖度を計算する。

Step 1: データ

x = [1, 2, 2, 3, 3, 3, 4, 4, 5, 10] 歪度 (右に長い)、 尖度 (高峰)

Step 2: 計算

平均 ≈ 3.7, σ ≈ 2.37(母標準偏差) 歪度 = E[(x-μ)³]/σ³ ≈ 1.67 (右歪み) 尖度 = E[(x-μ)⁴]/σ⁴ - 3 ≈ 2.24 (高峰)

🐍 Python で再現

1
2
3
4
5
import numpy as np
from scipy import stats
x = np.array([1, 2, 2, 3, 3, 3, 4, 4, 5, 10])
print(f"歪度: {stats.skew(x):.3f}")
print(f"尖度: {stats.kurtosis(x):.3f}")

📤 実行結果

歪度: 1.669 尖度: 2.239

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

🐍 10. ライブラリ早見表

🐍 10. ライブラリ早見表

用途 関数
歪度pandas .skew(), scipy.stats.skew
尖度(超過)pandas .kurtosis(), scipy.stats.kurtosis
Shapiro–Wilkscipy.stats.shapiro
Jarque–Berascipy.stats.jarque_bera
D'Agostinoscipy.stats.normaltest
K-Sscipy.stats.kstest
Anderson–Darlingscipy.stats.anderson
QQプロットstatsmodels.api.qqplot, scipy.stats.probplot
Box-Coxscipy.stats.boxcox
Yeo-Johnsonsklearn.preprocessing.PowerTransformer

📜 11. 形状指標の歴史

💼 12. 実務応用

📊 13. 高階モーメント・関連指標

5次モーメント以上

金融工学では「co-skewness」「co-kurtosis」など多変量への拡張が研究されています。 ただし高次モーメントは標本誤差が大きく、 実務では 3 次・4 次までが標準。

L-moments(L-モーメント)

順序統計量に基づくモーメント。 通常のモーメントより外れ値に頑健。 水文学・気象統計でよく使われる。

$$L_1 = E[X_{1:1}], \quad L_2 = (E[X_{2:2}] - E[X_{1:2}])/2, \dots$$

L-skewness $\tau_3 = L_3/L_2$、 L-kurtosis $\tau_4 = L_4/L_2$ は有界。

頑健な歪度・尖度

🔢 14. モーメント母関数(MGF)

$$M_X(t) = \mathbb{E}[e^{tX}]$$

テイラー展開すると:

$$M_X(t) = \sum_{k=0}^{\infty} \frac{m_k}{k!} t^k$$

つまりすべてのモーメントを内包する関数。 分布の同一性・独立和の証明等に多用される。

特性関数

$\phi_X(t) = \mathbb{E}[e^{itX}]$。 MGF が存在しない分布でも常に存在し、 分布を一意に決める。

✅ 15. 分布形状チェックリスト

A. scikit-learn による実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from sklearn.preprocessing import PowerTransformer, QuantileTransformer, StandardScaler
import matplotlib.pyplot as plt

# 右に裾の長い変数の変換比較
x = df['A1101'].values.reshape(-1, 1)

fig, axes = plt.subplots(1, 4, figsize=(16, 4))
for i, (name, tr) in enumerate([
    ('元データ', None),
    ('Standard', StandardScaler()),
    ('Yeo-Johnson', PowerTransformer(method='yeo-johnson')),
    ('Quantile→Normal', QuantileTransformer(output_distribution='normal')),
]):
    if tr is None:
        z = x.ravel()
    else:
        z = tr.fit_transform(x).ravel()
    axes[i].hist(z, bins=15, edgecolor='black')
    axes[i].set_title(f'{name}\n歪度={stats.skew(z):.2f}')

plt.tight_layout(); plt.savefig('transform_compare.png', dpi=110)

B. scipy / statsmodels による実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from scipy import stats
import numpy as np

# Box-Cox 変換(正値のみ)
x = df['A1101'].values  # 全部正値
x_bc, lambda_bc = stats.boxcox(x)
print(f'Best Box-Cox λ = {lambda_bc:.3f}')
print(f'変換前 歪度 = {stats.skew(x):+.3f}')
print(f'変換後 歪度 = {stats.skew(x_bc):+.3f}')

# Yeo-Johnson(負値も OK)
x_yj, lambda_yj = stats.yeojohnson(x)
print(f'Best Yeo-Johnson λ = {lambda_yj:.3f}')

# Anderson-Darling 検定(より厳しい正規性検定)
result = stats.anderson(x_bc, dist='norm')
print(f'AD stat = {result.statistic:.3f}')
for sig, crit in zip(result.significance_level, result.critical_values):
    print(f'  α={sig}%: critical={crit:.3f}, 棄却={"是" if result.statistic > crit else "否"}')

# Jarque-Bera(歪度・尖度ベース)
jb_stat, jb_p = stats.jarque_bera(x)
print(f'\nJarque-Bera = {jb_stat:.2f}, p = {jb_p:.4f}')
📤 実行例(実測) Best Box-Cox λ = -0.492 変換前 歪度 = +2.219 変換後 歪度 = +0.115 Best Yeo-Johnson λ = -0.492 AD stat = 0.301 α=15.0%: critical=0.536, 棄却=否 α=10.0%: critical=0.611, 棄却=否 α=5.0%: critical=0.733, 棄却=否 α=2.5%: critical=0.855, 棄却=否 α=1.0%: critical=1.017, 棄却=否 Jarque-Bera = 86.58, p = 0.0000

C. Optuna でハイパラ・選択最適化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import optuna
from scipy import stats

# 最適な変換を Optuna で探索(正規性最大化)
def objective(trial):
    method = trial.suggest_categorical('method', ['none', 'log', 'sqrt', 'boxcox', 'yeo-johnson'])
    x = df['A1101'].values
    if method == 'none':
        z = x.copy()
    elif method == 'log':
        z = np.log(x + 1)
    elif method == 'sqrt':
        z = np.sqrt(x)
    elif method == 'boxcox':
        z, _ = stats.boxcox(x)
    else:
        z, _ = stats.yeojohnson(x)
    # 歪度の絶対値を最小化(より正規に近づける)
    return abs(stats.skew(z))

study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=20)
print('Best transform:', study.best_params, '|skew|:', study.best_value)
📤 実行例(実測) Best transform: {'method': 'boxcox'} |skew|: 0.11536973192189902

D. ライブラリ早見表

ライブラリ / 関数 用途
scipy.stats.skew, kurtosis歪度・尖度
scipy.stats.shapiro, kstest, jarque_bera正規性検定
scipy.stats.probplotQ-Q プロット
scipy.stats.boxcox, yeojohnson分布変換
statsmodels.graphics.gofplots.qqplotQ-Q(より柔軟)

🐍 拡充F: 形状診断 Python フロー (SSDSE-B-2026)

このコードでやること: SSDSE-B-2026 の主要数値列について、 歪度・尖度・正規性検定 (D'Agostino) を一括計算し、 推奨される変換 (log, sqrt, Box-Cox) を提案する。

📥 入力例: 2023 年 47 都道府県 × A1101, A110101, A110102 (人口、 男性人口、 女性人口)

Prefecture A1101 A110101 A110102 0 北海道 5092000 2405000 2688000 1 青森県 1184000 559000 626000
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import pandas as pd, numpy as np
from scipy import stats

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

for c in cols:
    x = latest[c].values
    sk = stats.skew(x)
    kt = stats.kurtosis(x)
    stat, p = stats.normaltest(x)
    suggest = '対数変換を検討' if sk > 1 else 'そのままで OK'
    print(f'{c}: skew={sk:.2f} kurt={kt:.2f} p_normal={p:.2e}{suggest}')

📤 実行結果:

A1101: skew=2.22 kurt=4.95 p_normal=1.32e-08 → 対数変換を検討 A110101: skew=2.23 kurt=5.01 p_normal=1.14e-08 → 対数変換を検討 A110102: skew=2.21 kurt=4.89 p_normal=1.53e-08 → 対数変換を検討

💬 男性・女性人口とも総人口と同じ右裾の歪み。 性比 (男/女) を計算すれば 0.94 前後にほぼ集中するため形状が変わる。 同じ「人口」系列でも、 比を取ると尺度水準と形状の両方が変わる典型例。

📉 拡充G: ヒストグラム形状の分類 — 5 つの典型形

形状 特徴 代表分布 SSDSE での例
釣鐘型 (対称)中心が高く左右対称正規、 tlog(人口) のヒスト
右裾長 (skew>0)少数の大きな値対数正規、 ガンマ、 パレート人口、 所得、 GDP
左裾長 (skew<0)天井近くに集中ベータ (a>b)出席率、 投票率
二峰 (bimodal)2 つの山混合正規都市圏 vs 地方の分布
一様範囲内ほぼ平坦一様分布擬似乱数、 順位データ

形状が複雑な場合 (二峰、 重い裾) は要約統計量の解釈に注意。 平均と中央値の差が大きいなら歪み、 IQR と SD の比が経験則 (約 1.35) から外れるなら重い裾を疑う。

🔄 拡充H: 変換による尺度の変化

降格は自由 (情報を捨てる)、 昇格は不可 (情報を作り出せない)。 「名義データを平均すれば間隔風になる」は錯覚。

⚠️ 7. よくある落とし穴

落とし穴 対処
尖度の定義違い「超過尖度」か「生尖度」を明示。 pandas/scipy は超過尖度。
小標本の歪度・尖度n < 20 では推定が不安定。 ブートストラップ CI を付ける。
外れ値の影響高次モーメントは外れ値に超敏感。 ロバスト指標(MAD等)も併用。
「p > 0.05 で正規」と決定「棄却できない」は「正規である」ではない。 QQ プロット併用。
大標本での過検出n が大きいと僅かな逸脱でも有意に。 効果量を見る。
対数変換時の 0 値log1p(x) または log(x + c)
Box-Cox を負値に適用Yeo-Johnson に切り替える。

🏋️ 8. 練習問題(SSDSE-B-2026)

Q1. SSDSE-B のすべての数値変数について歪度・尖度を計算し、 最も右歪みが強い変数を特定しなさい。
📥 入力例(SSDSE-B-2026 全体:564 行 × 112 列 = 47 都道府県 × 2012〜2023 年) 年度 地域コード 都道府県 A1101(総人口) A1303(65歳以上人口) A4101(出生数) … 2023 R01000 北海道 5,092,000 1,681,000 24,430 … 2023 R13000 東京都 14,086,000 3,205,000 86,348 … 2023 R47000 沖縄県 1,468,000 350,000 12,549 … …(残り 112 列は住宅・家計・教育・医療など)
1
2
3
4
5
import pandas as pd
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
num = df.select_dtypes(include='number')
sk = num.skew().sort_values(ascending=False)
print(sk.head(10))
📤 実行例(実測) J250502 6.270830 G7102 6.131696 E6202 5.298720 E6502 4.768378 E650210 4.708118 C5403 4.656284 E6302 4.524132 E650110 4.422657 E7201 4.030894 E6102 3.857927 dtype: float64
Q2. 総人口「A1101」のヒストグラムを描き、 対数変換前後で歪度・QQプロットを比較しなさい。
1
2
3
4
5
6
7
8
9
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
df['A1101'].hist(ax=axes[0,0], bins=20); axes[0,0].set_title(f'生 skew={df["A1101"].skew():.2f}')
np.log1p(df['A1101']).hist(ax=axes[0,1], bins=20); axes[0,1].set_title(f'log skew={np.log1p(df["A1101"]).skew():.2f}')
sm.qqplot(df['A1101'], line='s', ax=axes[1,0])
sm.qqplot(np.log1p(df['A1101']), line='s', ax=axes[1,1])
plt.tight_layout(); plt.show()
Q3. Shapiro–Wilk と Jarque–Bera で各変数の正規性を検定し、 結果が一致するかを確認しなさい。
1
2
3
4
5
from scipy import stats
for col in num.columns[:10]:
    sw = stats.shapiro(num[col]).pvalue
    jb = stats.jarque_bera(num[col]).pvalue
    print(f'{col}: SW p={sw:.4f}, JB p={jb:.4f}')
📤 実行例(実測) SSDSE-B-2026: SW p=0.0000, JB p=0.0000 A1101: SW p=0.0000, JB p=0.0000 A110101: SW p=0.0000, JB p=0.0000 A110102: SW p=0.0000, JB p=0.0000 A1102: SW p=0.0000, JB p=0.0000 A110201: SW p=0.0000, JB p=0.0000 A110202: SW p=0.0000, JB p=0.0000 A1301: SW p=0.0000, JB p=0.0000 A130101: SW p=0.0000, JB p=0.0000 A130102: SW p=0.0000, JB p=0.0000

📝 9. 報告フォーマット

❌ NG例

「総人口は歪んでいたので log を取りました。」

✅ OK例

「総人口 (A1101) は強い右歪み(歪度 = 2.22, 超過尖度 = 4.95、 Shapiro–Wilk p < .001、 QQ プロットも著しく逸脱)を示したため、 対数変換を適用。 変換後は歪度 0.79、 超過尖度 -0.21、 D'Agostino 検定も棄却されず(p = 0.07)。 以降の解析は変換後の値で実施。」

⚠️ 落とし穴(拡張版・各 100 文字以上)

① 順序尺度を間隔尺度として扱う
「満足度 1〜5」のような順序データに、 平均値・分散・回帰係数を直接計算すると誤った結論を生む。 1 と 2 の差、 4 と 5 の差が等しいとは限らない。 順序ロジット・順序プロビット、 ノンパラ手法(Spearman 相関、 Mann-Whitney U)を使う。 質問紙調査で頻発する誤り。
② 比率と差を間違える
比率尺度(絶対 0 がある)と間隔尺度(相対 0、 摂氏など)を区別しない。 「気温が 10℃ から 20℃ に上がった → 2 倍暑くなった」は誤り(℃ は間隔尺度)。 ケルビンなら比率尺度。 比率の議論には絶対 0 の存在が前提。
③ 歪度を「相対的」と勘違い
歪度の符号は分布の歪み方を示すが、 「大きさ」の判断には基準が必要。 |skew| < 0.5 が「対称に近い」、 0.5-1.0 が「中程度」、 > 1.0 が「強い歪み」が経験則。 さらに n が小さいと歪度の推定そのものが不安定。 信頼区間(Joanes-Gill 補正)を見る。
④ 尖度の値が意味する範囲を誤解
scipy.stats.kurtosis のデフォルトは excess kurtosis(正規分布で 0)。 SAS や Stata のデフォルトは「3 を引かない」kurtosis(正規で 3)。 ライブラリで挙動が違うため、 必ずドキュメントで確認。 「尖度 3.5」と書かれても、 +0.5 か +6.5 か区別しないと意味不明。
⑤ 正規性検定の使い方を誤る
Shapiro-Wilk・KS 検定は、 n が大きいと「軽微な逸脱」も有意になる(過敏)。 n=10000 で p<0.001 でも、 ヒストグラムを見れば実用上は正規。 検定だけでなく Q-Q プロットと歪度・尖度を併用する。 さらに「正規でないから検定が使えない」は中心極限定理で大抵問題ない。
⑥ 対数変換の誤用
「右に裾が長い」と機械的に log 変換するのは危険。 (1) 0 や負値があれば適用不可、 (2) 解釈が変わる(log y の β は弾力性的)、 (3) Box-Cox や Yeo-Johnson のほうが柔軟。 単純な log 化が常に最善ではないことを認識し、 変換前後の Q-Q プロットで判断。
⑦ 外れ値と裾の長さを混同
極端な値が 1 個あるのと、 全体に裾が長いのは別問題。 前者は外れ値処理(除外・調整)、 後者は変換や分布仮定の変更で対処。 SSDSE で「東京」が外れ値か、 自然な裾の一部かを判断するには、 ロバスト統計(中央値・IQR)と比較する。

⚠️ 拡充I: 尺度・形状にまつわる落とし穴

📈 拡充J: SSDSE-B-2026 の時系列で形状の変化を追う

このコードでやること: A1101 (総人口) の歪度を 2014 〜 2023 年で並べ、 形状の経年変化を確認する。

📥 入力例: 564 行 (47 県 × 12 年)

1
2
3
4
5
6
7
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
for y in sorted(df['SSDSE-B-2026'].unique()):
    sub = df[df['SSDSE-B-2026'] == y]['A1101']
    print(f'{y}: n={len(sub)} skew={stats.skew(sub):.3f} kurt={stats.kurtosis(sub):.3f}')

📤 実行結果 (一部):

2014: n=47 skew=2.093 kurt=4.197 2018: n=47 skew=2.165 kurt=4.636 2020: n=47 skew=2.193 kurt=4.803 2023: n=47 skew=2.219 kurt=4.951

💬 歪度・尖度ともわずかに上昇 → 東京一極集中が進行し、 裾がより重くなっている。 形状指標は政策評価の客観的指標としても使える。

🎯 拡充K: 形状から検定を選ぶ早見表

形状診断 推奨される 2 群比較 推奨される相関
正規 + 等分散Student t (ttest_ind)Pearson
正規 + 不等分散Welch t (equal_var=False)Pearson
非正規 (歪み中)log 変換 → tlog 変換 → Pearson
非正規 (強い歪み・外れ値)Mann-Whitney USpearman, Kendall
順序尺度Wilcoxon 順位和Spearman, Kendall
名義尺度カイ二乗、 Fisher 正確検定クラメル V、 ファイ係数

正規性の判定は「サンプルサイズ依存」。 n=20 で「正規」と出ても n=2000 で「非正規」と出るのは検定の性質上当然。 ヒストグラム + Q-Q プロット + 効果量の総合判断が大切。

🗺️ 19. 歪度・尖度から分布を推測する

歪度・尖度の値から「どの分布族に近いか」を推測する目安:

歪度 超過尖度 候補分布 対処
≈ 0≈ 0正規そのまま解析可
≈ 0一様・ベータ(2,2)そのまま or ベータフィット
≈ 0t分布・混合正規頑健統計、 ノンパラ
1〜23〜6対数正規・ガンマlog 変換
> 2> 6パレート・指数log 変換、 Box-Cox
天井効果データ反転後 log、 順位ベース

🎯 20. モーメント法(パラメータ推定)

分布のパラメータを「標本モーメント=理論モーメント」で推定する古典的手法。

例:正規分布

例:ガンマ分布

MLE より計算簡便だが、 一般に効率が悪い(漸近分散が大きい)。

scale shape MAD (Median Ab 四分位範囲 IQR トリム平均 ウィンザライズ平均 Huber M推定量 名義 / 順序 / 間隔 /

🔗 隣接手法への橋渡し

「位置・尺度・形状」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

同じ平均でも分布の形が違えば 意味のある比較 はできない。 位置・尺度・形状の 3 視点で分布を立体的に捉えることが、 統計的判断の基本姿勢である。

🌳 手法選択フロー

「分布の形状指標」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。

  1. Step 1: 目的は記述か予測か?
    • 記述 (現状把握・要約) → 集計・可視化・要約統計量で全体像を掴む
    • 予測 (未知データへの推定) → モデル構築・検証フェーズへ移行
  2. Step 2: データの種類・規模は?
    • 数値データ・小〜中規模 → 「分布の形状指標」やその拡張手法を直接適用
    • カテゴリデータ → 度数分布表エントロピー等の離散分布指標と組み合わせ
    • 大規模・高次元 → Q-Q プロットカーネル密度推定等の効率的形状診断を選択
  3. Step 3: 結果の解釈・共有は?
    • 専門家向け → 数値指標・統計検定で精緻に評価
    • 非専門家向け → 可視化・自然言語での要約を重視

このフローに沿って判断することで、 「分布の形状指標」を中核とした適切な手法選択ができる。

🎮 触って理解する

分布は 位置(平均 μ)・尺度(標準偏差 σ)・形状(歪度 γ₁・超過尖度 γ₂) の 3 要素で特徴づけられます。 スライダーを動かすと曲線がリアルタイムに変化します。 平均を変えると左右へ平行移動標準偏差を変えると幅が伸縮歪度を変えると左右非対称に尖度を変えると頂の尖り・裾の重さが変わります。 灰色の破線は「同じ平均・同じ標準偏差の正規分布」。 青い曲線と重ねることで、 平均と SD が同じでも形が全く違うことを体感できます。(曲線グラフ上を左右にドラッグ/スワイプしても平均を動かせます)

曲線は Gram–Charlier A 級数(正規分布を歪度・尖度で補正した密度)。 この密度は平均・分散・歪度・超過尖度がスライダー値に 厳密に一致 します。 極端な形状では密度が負に触れることがあり、その領域は 0 に丸めて表示しています(近似の限界)。

💡 直感:分布は「位置・尺度・形」で決まる

1 つの分布を言い当てるには、 まず どこにあるか(位置)、 次に どれだけ広がるか(尺度)、 最後に どんな形か(形状) の順に見ます。 平均は分布を左右に平行移動させるだけで形を変えません。 標準偏差は横に引き伸ばす/縮めるだけで対称性は保ちます。 歪度と尖度こそが「形」そのもの——左右非対称か、 中央が尖って裾が重いか——を決めます。

⚠️ よくある落とし穴:平均と SD だけでは形は分からない

上の「正規分布」「右に歪む」「尖って厚裾」プリセットは いずれも平均 μ=0・標準偏差 σ=1.6 で共通ですが、 見た目は全く違います。 平均と標準偏差(=1・2 次モーメント)が一致しても、 3 次(歪度)・4 次(尖度)が違えば分布は別物です。 「平均 ± SD で 68%」のような正規分布前提の目安は、 右歪みや厚裾の分布では大きく外れます。 要約統計量を報告するときは ヒストグラム箱ひげ図Q-Q プロット で形も併せて確認しましょう。

🔬 発展:モーメントと分布族

位置・尺度・形状は モーメントの階層に対応します。 1 次(平均)=位置、 2 次(分散標準偏差)=尺度、 3 次(歪度)と 4 次(超過尖度)=形状。 標準化した分布(μ=0, σ=1)を残しても、 高次モーメントが分布を区別します。 実務では 「位置・尺度パラメータ」を持つ分布族(正規・t・ロジスティックなど)を選び、 形状は分布族そのもの(正規・対数正規・指数・t 分布…)で表現します。 上のデモの Gram–Charlier 展開は、 正規分布に歪度・尖度の項を足して「形をずらす」直感を与える古典的手法で、 正規性検定 の Jarque–Bera 統計量(歪度²+尖度²で正規からのズレを測る)とも発想を共有します。

🔖 🔖 キーワード索引(チップから該当箇所へジャンプ)

論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:

モーメント 中心モーメント 歪度 左歪み 右歪み 尖度 超過尖度 尖り分布 平らな分布 正規性検定 Shapiro–Wilk Jarque–Bera QQプロット 変数変換 Box-Cox

🧭 解説深化: 「scipy を使わずに形状を診断する」+「1 点で崩れる指標の脆さ」

本ページ本文(モーメント・歪度・尖度・A〜S の深掘り)とは重複しない角度として、ここでは (1) 数式ライブラリを使わずに歪みの向きを当てる実務ワザ と (2) 尖度が「たった 1 点」でどれほど崩れるかを、SSDSE-B-2026(2023 年・47 都道府県)の実測値だけで示す。合成データは一切使っていない。

直感 — 平均と中央値の「ズレ」が歪度の符号を教えてくれる

歪度の厳密値(Fisher の $g_1$)は 3 乗のモーメントが必要で暗算できないが、符号(右裾か左裾か)だけなら中学生でも出せる。ピアソンの第 2 歪度係数 $\;\mathrm{Sk}_2 = \dfrac{\text{平均}-\text{中央値}}{\text{標準偏差}}\;$ を使えばよい。平均が中央値より大きければ右裾(正)、小さければ左裾(負)。SSDSE-B-2026 の実測 5 列で照合すると、符号は 5 列すべてで Fisher 歪度と一致した(下表は実際に pandas+scipy.stats.skew(bias=False) で出力した数値)。

列コード / 内容$\mathrm{Sk}_2=\frac{平均-中央値}{標準偏差}$Fisher 歪度 $g_1$符号一致
A1101 総人口+0.392+2.293
A5101 転入者数(日本人移動者)+0.336+3.515
A1303 65 歳以上人口+0.356+1.842
B4102 最高気温(月平均の最高値)−0.096−0.572
L3221 消費支出(二人以上世帯)−0.199−0.537

$\mathrm{Sk}_2$ は $[-3,+3]$ に収まる(ピアソン不等式)ため、絶対値は Fisher 歪度より圧縮されて出る。だが「向きを瞬時に掴む」目的には十分で、平均中央値 を並べただけの表からでも歪みの向きが読める、という設計上の示唆になる。

落とし穴(重要)— 尖度は「1 点」で半分になる:破綻点ゼロの指標

本文 J 章でも「外れ値 1 点で動く」と触れているが、ここではその大きさを実数で確定させる。A1101 総人口から東京都(14,086,000 人)ただ 1 件を除くと(n=47→46)、実測値は次のように動く。

指標全 47 件東京都を除く 46 件変化
Fisher 歪度 $g_1$+2.293+1.820−21%
超過尖度 $g_2$+5.661+2.404−58%
平均2,645,8092,397,109−9.4%
中央値1,549,0001,508,500−2.6%

尖度は 47 分の 1 のデータを消しただけでほぼ半減した。これは偶然ではなく、歪度・尖度が定義上「破綻点(breakdown point)ゼロ」——たった 1 点の暴走で任意の値へ飛ぶ——だからだ。4 乗のモーメントを含む尖度は特に敏感で、最大値がずば抜けているほど 1 点支配になる。対照的に中央値の変化はわずか −2.6%。ここに、点推定の歪度・尖度を単独で報告してはいけない理由がある。必ず「外れ値を除いた感度分析」か ロバスト統計(中央値・IQR・MAD)を併記し、箱ひげ図 で 1 点支配の構造を可視化すること。

⚠️ さらに危険なのは符号が逆転しうるケース。上の例は元々右裾が強いので除去後も正のままだが、|歪度| が小さい列(本文の L322104 ≈ +0.01 など)では 1 点の増減で符号すら反転し、「右歪み」と「左歪み」を取り違える。|歪度|<0.3 の列で歪度の向きを断言するのは避けるのが安全側の運用。

発展 — 「1 点に強い形状指標」への置き換え

モーメント型が脆いなら、分位点ベースの形状指標に置き換える手がある。ボウリー歪度(四分位歪度) $\;\dfrac{(Q_3-Q_2)-(Q_2-Q_1)}{Q_3-Q_1}\;$ は 四分位 だけで作れて破綻点 25% と頑健、範囲も $[-1,+1]$ に収まり解釈しやすい。裾の重さは「上位 1% と中央値の比」のような分位点比で測れば、4 乗モーメントの暴走を回避できる。実務フローとしては——(1) まず $\mathrm{Sk}_2$ で向きを掴む → (2) モーメント歪度・尖度で強さを測る → (3) 外れ値除去で感度を確認 → (4) 結論が 1 点で変わるならボウリー歪度や 中央値 報告に切り替える、という 4 段が破綻点ゼロの罠を回避する定石になる。標準化(z 化)は中心と尺度を揃えるだけで形状は変えない点に注意(歪みを直したいなら対数・平方根・Box-Cox)。

※ 本セクションの数値は pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) で読み、df[df['SSDSE-B-2026']==2023] の 47 都道府県に対し scipy.stats.skew / kurtosis (bias=False) を実行して得た実測値。合成・架空データは含まない。