情報エントロピー(Entropy (Information Entropy)):情報の不確実性を測る量。 決定木の分割基準にも使う
このページは「情報エントロピー(Entropy (Information Entropy))」の用語解説です。 機械学習の基礎カテゴリにおける重要概念で、 機械学習の基礎 グループ教材の中で繰り返し登場します。 数式・実コード・落とし穴を 1 ページに集約し、 SSDSE-B-2026 都道府県データ(47 件 × 112 列)を題材に 手を動かしながら理解できるよう構成しています。
別称:シャノンエントロピー。 まず 💡 30秒結論 で全体像を、 次に 🎨 直感 → 📐 数式 → 🧮 実値 → 🐍 Python の順で読むのがおすすめ。
情報エントロピーは「どれだけ予測しづらいか」を 1 つの数字に集約したものです。 コインが 確実に表(p=1)なら不確実性は 0 ビット、 表裏が半々(p=0.5)なら 1 ビットでこれが最大。 「驚きの平均量」と思うとイメージしやすいです。
決定木 (ID3 / C4.5) では、 分岐前後のエントロピー差(情報利得)を最大化する変数を選ぶことで、 「不確実性をより多く減らす質問」を優先します。 47 都道府県のうち「人口 100 万人以上か?」のような質問でデータがどれだけ純粋に分かれるかを、 エントロピーで測ります。
本概念は次のように記述されます(KaTeX で描画)。
英語名 Entropy (Information Entropy)。 別称:シャノンエントロピー。
記号と意味を逐一突き合わせて読みます。 慣れないうちは式を「日本語で読む」ことが理解の近道です。
SSDSE-B の 都道府県を「人口で 3 区分」 したラベルに対して、 エントロピーを計算します。 等分布なら $\log_2 3 \approx 1.585$ ビットが上限。
データ出典:SSDSE-B-2026(独立行政法人統計センター)。 47 都道府県 × 複数年(最新 2023)の社会統計データ。
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 df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) # 47都道府県を総人口で 3 区分にラベル付け df['人口クラス'] = pd.qcut(df['総人口'], q=3, labels=['小', '中', '大']) # 各クラスの出現確率 p = df['人口クラス'].value_counts(normalize=True) print(p) # エントロピーを定義通りに計算 H = -np.sum(p * np.log2(p)) print(f'H = {H:.4f} bit') print(f'最大値 log2(3) = {np.log2(3):.4f} bit') # scipy で確認 from scipy.stats import entropy print('scipy(base=2):', entropy(p, base=2)) |
実行結果の要約(出力は環境依存。 概算値):
| 項目 | 値 |
|---|---|
| p(小) | 0.3404 (16県) |
| p(中) | 0.3404 (16県) |
| p(大) | 0.3191 (15県) |
| H(人口クラス) | 1.5839 bit |
| 最大値 log2(3) | 1.5850 bit |
| 正規化エントロピー H/log2(3) | 0.9994 (ほぼ均等) |
scikit-learn / pandas を使った最小実装パターン。 上の SSDSE-B 計算と同じスタイルですが、 ここでは「読み込み→前処理→学習→評価」のテンプレを 4 つのスニペットに分けます。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) print(df.shape, df.columns.tolist()[:8]) |
1 2 3 | X = df[['総人口','65歳以上人口']].values y = df['15歳未満人口'].values print('X shape =', X.shape, ', y shape =', y.shape) |
1 2 3 4 5 6 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=300, random_state=0).fit(X_tr, y_tr) print('R^2 (test) =', model.score(X_te, y_te)) |
1 2 3 4 5 6 | import matplotlib.pyplot as plt pred = model.predict(X_te) plt.scatter(y_te, pred) plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('「情報エントロピー」関連モデルの予測精度') plt.tight_layout(); plt.savefig('out.png', dpi=150) |
※ 「情報エントロピー」固有の本格コードは上の 🧮 SSDSE-B 実値計算 節を参照。
np.where(p>0, p*np.log2(p), 0) または scipy.stats.entropy を使うと安全。情報エントロピー $H(X)$ の本質は 2 段階で理解すると腑に落ちます。 第 1 段階は個別事象の情報量 $I(x_i) = -\log_2 p_i$。 確率の小さい出来事ほど「驚き」が大きく、 大きな情報量を持ちます。 「日本で晴れる」(p=0.7) より「日本で雪が降る」(p=0.05) の方が情報的に重い、 という常識と一致します。 第 2 段階はその期待値として $H(X) = \sum p_i I(x_i)$ を取ること。 これが「平均的にどれだけ予測しづらいか」になります。
下の表で確率分布が偏るほどエントロピーが下がる様子を確認しましょう。 47 都道府県の人口分布で言えば、 「東京と他全部」のように極端に偏った 2 値分布よりも、 「人口でほぼ等分した 3 群」の方がエントロピーは大きくなります。
| 分布 | $p_1, p_2$ | H (bit) | 直感 |
|---|---|---|---|
| 完全予測 | 1.0, 0.0 | 0.000 | 驚きゼロ |
| 弱い偏り | 0.9, 0.1 | 0.469 | ほぼ予測可 |
| 中庸の偏り | 0.7, 0.3 | 0.881 | そこそこ予測可 |
| 完全に均等 | 0.5, 0.5 | 1.000 | 予測不能(最大) |
💡 暗号化との接点:暗号文が「ランダムに見える」とはエントロピーが上限近くにあるということ。 偏りがあれば頻度分析で破られる、 という古典暗号の弱点はエントロピーで定量化できます。
決定木の分割基準として使われる「不純度」には複数の流派があります。 同じ意図でも数式と計算コストが少しずつ違うため、 シーンに応じて使い分けます。
| 指標 | 式 | 特徴 | 採用 |
|---|---|---|---|
| シャノンエントロピー | $-\sum p_i \log_2 p_i$ | 情報理論起源、 対数が必要でやや重い | ID3, C4.5 |
| ジニ不純度 | $1 - \sum p_i^2$ | 対数なしで高速、 経験的に結果はほぼ同じ | CART, scikit-learn 既定 |
| 分類誤差 | $1 - \max_i p_i$ | 枝刈り評価向き、 分割基準には鋭敏でない | 枝刈り段階のみ |
| Tsallis エントロピー | $\frac{1}{q-1}(1-\sum p_i^q)$ | $q$ で「滑らかさ」を制御できる一般化 | 研究・特殊用途 |
ジニとシャノンは「2 値の場合」を可視化するとほとんど同じ凸関数で、 最大点も同じ $p=0.5$。 大規模データで決定木の学習速度を重視するなら CART のジニ、 教科書的に情報理論の言葉で説明したいならエントロピー、 という棲み分けが現実的です。
SSDSE-B の各列について、 「3 区分にしたとき、 ターゲット(少子化指標など)に対する情報量がどれだけあるか」を相互情報量で測ります。 これは決定木が無意識にやっていることを、 1 列ずつ手動でやる作業に相当します。
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 sklearn.feature_selection import mutual_info_classif df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) # ターゲット:合計特殊出生率の高低 2 値 df['出生率高低'] = (df['合計特殊出生率'] > df['合計特殊出生率'].median()).astype(int) y = df['出生率高低'].values # 数値列だけ抽出 num_cols = df.select_dtypes(include=[np.number]).columns num_cols = [c for c in num_cols if c not in ['年度', '出生率高低']] X = df[num_cols].fillna(0).values # 相互情報量で各列のスコア算出 mi = mutual_info_classif(X, y, discrete_features=False, random_state=0) rank = pd.DataFrame({'列': num_cols, '相互情報量': mi}).sort_values('相互情報量', ascending=False) print(rank.head(10)) |
出力例(環境依存):合計特殊出生率と最も情報を共有する列は「未婚率」「保育所数」「県内総生産」など、 直感に合うものが上位に並びます。 これはピアソン相関では捉えにくい非線形関係も拾います。
| 列 | 相互情報量 (推定) | 解釈 |
|---|---|---|
| 未婚率 | 0.34 | 最も情報を共有 |
| 保育所定員 | 0.28 | 育児支援との関連 |
| 県内総生産 | 0.19 | 経済規模の影響 |
| 人口密度 | 0.17 | 都市・地方差 |
エントロピー計算は「自前 numpy」「scipy.stats.entropy」「sklearn の関数」など複数の選択肢があります。 用途で使い分けを。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import numpy as np from scipy.stats import entropy as scipy_entropy from sklearn.metrics import mutual_info_score p = np.array([0.5, 0.3, 0.2]) # 1) 自前 H1 = -np.sum(p * np.log2(p)) # 2) scipy(底を指定可能) H2 = scipy_entropy(p, base=2) # 3) sklearn(経験分布から自動) labels = ['a']*50 + ['b']*30 + ['c']*20 labels2 = labels[:] # 完全に同じ → 相互情報量は H(X) H3 = mutual_info_score(labels, labels2) / np.log(2) # nats → bits print(H1, H2, H3) |
| ライブラリ | 利点 | 注意 |
|---|---|---|
| 自前 numpy | 透明・教育向き | $p=0$ で nan、 自前で処理が必要 |
| scipy.stats.entropy | 底を base=2 で切替、 KL ダイバージェンスも同関数 | 入力は確率(正規化) |
| sklearn.metrics | ラベル直接 OK、 大規模に最適化 | 単位が nats(ln 基準) |
qcut と cut どちらで切るか、 ビン数をいくつにするかでエントロピーは大きく変動する。 報告時はビン化方法を明示する。体系階層のパス:
🌐 機械学習 › 分類 › 決定木 › 分割基準 › 情報エントロピー
情報エントロピーは「情報理論」と「機械学習」を橋渡しする概念。 元々は通信工学(シャノン 1948)の文脈で、 「メッセージを送るのに最低何ビット必要か」という工学的問題から生まれました。 これが 1980 年代に Quinlan によって決定木学習に持ち込まれ(ID3 アルゴリズム)、 以後機械学習の中核ツールになりました。
| 分野 | エントロピーの役割 |
|---|---|
| 情報理論 | 符号化の理論下限 |
| 統計力学 | 系の乱雑さ(ボルツマンエントロピー) |
| 機械学習 | 分割基準・損失関数(クロスエントロピー) |
| 自然言語処理 | 言語モデルの perplexity = $2^H$ |
| 画像圧縮 | JPEG/PNG のハフマン符号 |
| 年 | 出来事 | 意義 |
|---|---|---|
| 1948 | Shannon "A Mathematical Theory of Communication" | エントロピーを通信理論で導入 |
| 1951 | Kullback-Leibler ダイバージェンス | 2 分布間のズレを定量化 |
| 1957 | Jaynes 最大エントロピー原理 | 分布を「最も無情報な仮定」で推定 |
| 1986 | Quinlan ID3 | 情報利得で決定木を学習 |
| 1993 | Quinlan C4.5 | 利得率(Gain Ratio)で改良 |
| 2010s | 深層学習でクロスエントロピー復権 | 分類モデル損失の標準 |
通信工学の都合で「ビット(0/1)」を単位にしたかったから。 数学的には底はどれでも本質は変わらず、 $\log_b a = \log_2 a / \log_2 b$ で換算可能です。 機械学習論文では自然対数(nats 単位)がよく出てきます。
それは「微分エントロピー」 $h(X) = -\int f(x)\log f(x)dx$ のこと。 例えば $f$ が狭い区間に集中していると $h$ は負になります。 微分エントロピーは座標変換で値が変わる「スケール依存」の量なので、 比較は同じ単位系で。
経験的にはほぼ同じ結果になるので、 ライブラリ既定(scikit-learn なら gini)で OK。 解釈の文脈や論文の流儀で選びましょう。
分類モデルの損失関数 $-\sum y_i \log \hat p_i$ は「真の分布 $y$ と予測分布 $\hat p$ のクロスエントロピー」。 これを最小化することは KL ダイバージェンスを最小化することと等価です。
サンプル数が少ないとエントロピーは過小評価されがちですが、 教育用途では 47 県でも十分。 補正したい場合は Miller-Madow 補正:$H_{MM} = H + (k-1)/(2n)$($k$ はカテゴリ数、 $n$ はサンプル数)。
パープレキシティは $\mathrm{PPL} = 2^{H}$。 「平均的に何択の予測難度か」を示し、 言語モデルの標準指標です。 perplexity = 100 とは平均 100 候補から正解 1 つを当てる難しさに相当。
熱力学のボルツマンエントロピー $S = k_B \log W$ と数式が同形のため、 「乱雑さ」のメタファーが使われます。 ただし情報理論では「予測しにくさ」「驚きの平均」と捉える方が直感的です。
用語は知っているだけでは武器になりません。 「使いどころを判断できる」「同僚に説明できる」「コードに落とせる」の 3 拍子が揃って、 はじめて自分の道具になります。 ここでは、 知識を「使える力」に変えるための実践的ヒントを紹介します。
💡 習慣化のヒント:新しい用語に出会ったら、 「30 秒結論」「最小コード」「失敗パターン」の 3 点を必ずノートに書く。 ジャストインタイム学習はこのルーチンで強化されます。