論文一覧に戻る 📚 用語集トップ 🗺 概念マップ
📚 用語解説
📚 用語解説
情報エントロピー
Entropy
ML基礎

🔖 キーワード索引

エントロピー シャノン 不確実性 bit 情報量 決定木 ID3 C4.5 ジニ不純度 log2 確率分布 驚き 純度 ヒストグラム

💡 30秒で分かる結論

情報エントロピー(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 で描画)。

$$H(X) = -\sum_{i=1}^{n} p_i \log_2 p_i$$

英語名 Entropy (Information Entropy)。 別称:シャノンエントロピー。

🔬 数式を言葉で読み解く

記号と意味を逐一突き合わせて読みます。 慣れないうちは式を「日本語で読む」ことが理解の近道です。

🧮 SSDSE-B 実値で計算してみる

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 (ほぼ均等)

🐍 Python 実装

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 実値計算 節を参照。

⚠️ よくある落とし穴(5 つ)

❌ 対数の底を混同
log2 だと bit、 ln だと nats、 log10 だと dits。 公式や別ライブラリと比較するとき必ず底を確認する。
❌ 0確率を $0\log 0=0$ と書き忘れる
実装上は np.where(p>0, p*np.log2(p), 0) または scipy.stats.entropy を使うと安全。
❌ 連続値に直接適用
連続変数は微分エントロピーになり、 単位(スケール変化で値が変わる)に注意。 通常はビン分割してから計算する。
❌ サンプル数が少ないと過小評価
観測されない事象は p=0 として扱われ、 エントロピーが本来より小さく出る。 Miller-Madow補正・Bayes 推定など。
❌ ラベル数が違う指標の単純比較
$H$ はラベル数 $n$ が増えれば伸びる。 公平に比べたいときは $H/\log_2 n$ で正規化する。

✅ 学習チェックリスト

🎨 直感の深掘り — 「驚き」と「平均情報量」

情報エントロピー $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.00.000驚きゼロ
弱い偏り0.9, 0.10.469ほぼ予測可
中庸の偏り0.7, 0.30.881そこそこ予測可
完全に均等0.5, 0.51.000予測不能(最大)

💡 暗号化との接点:暗号文が「ランダムに見える」とはエントロピーが上限近くにあるということ。 偏りがあれば頻度分析で破られる、 という古典暗号の弱点はエントロピーで定量化できます。

🌐 不純度指標の比較 — エントロピー vs ジニ vs 分類誤差

決定木の分割基準として使われる「不純度」には複数の流派があります。 同じ意図でも数式と計算コストが少しずつ違うため、 シーンに応じて使い分けます。

指標特徴採用
シャノンエントロピー$-\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 基準)

⚠️ さらなる落とし穴 — 実務でよく遭遇するパターン

❌ カテゴリ数が多い列が常に勝ってしまう
エントロピーを情報利得に使うと、 値の種類が多い列(例:個人ID)が常に最高利得になるバイアスがある。 C4.5 では「Gain Ratio」(利得を分岐の情報量で割る)で補正する。
❌ ビンの取り方で値が大きく変わる
連続値を qcutcut どちらで切るか、 ビン数をいくつにするかでエントロピーは大きく変動する。 報告時はビン化方法を明示する。
❌ 「情報量が大きい=重要な特徴」と短絡
相互情報量が高くても、 因果ではなく交絡が原因のこともある。 散布図や領域知識と組み合わせて解釈する。
❌ 訓練データで計算したエントロピーをテストに流用
エントロピー=確率の関数。 訓練分布とテスト分布が異なる(共変量シフト)と、 利得計算も歪む。 cross-validation 内で都度計算する。
❌ 「エントロピーが 0 =モデルが完璧」の誤解
$H=0$ は「分割後のラベルが純粋」を意味するだけで、 過学習の典型サイン。 訓練エントロピー 0、 テスト精度大幅低下というのが定石パターン。

🗺 概念マップ上の位置

体系階層のパス:
🌐 機械学習分類決定木分割基準情報エントロピー

情報エントロピーは「情報理論」と「機械学習」を橋渡しする概念。 元々は通信工学(シャノン 1948)の文脈で、 「メッセージを送るのに最低何ビット必要か」という工学的問題から生まれました。 これが 1980 年代に Quinlan によって決定木学習に持ち込まれ(ID3 アルゴリズム)、 以後機械学習の中核ツールになりました。

分野エントロピーの役割
情報理論符号化の理論下限
統計力学系の乱雑さ(ボルツマンエントロピー)
機械学習分割基準・損失関数(クロスエントロピー)
自然言語処理言語モデルの perplexity = $2^H$
画像圧縮JPEG/PNG のハフマン符号

📚 参考文献・もっと学ぶ

🕰 歴史的展開 — シャノンから決定木まで

出来事意義
1948Shannon "A Mathematical Theory of Communication"エントロピーを通信理論で導入
1951Kullback-Leibler ダイバージェンス2 分布間のズレを定量化
1957Jaynes 最大エントロピー原理分布を「最も無情報な仮定」で推定
1986Quinlan ID3情報利得で決定木を学習
1993Quinlan C4.5利得率(Gain Ratio)で改良
2010s深層学習でクロスエントロピー復権分類モデル損失の標準

❓ よくある質問

Q1. なぜ底が 2 の対数を使うの?

通信工学の都合で「ビット(0/1)」を単位にしたかったから。 数学的には底はどれでも本質は変わらず、 $\log_b a = \log_2 a / \log_2 b$ で換算可能です。 機械学習論文では自然対数(nats 単位)がよく出てきます。

Q2. 連続変数のエントロピーは負になることがあると聞いたが?

それは「微分エントロピー」 $h(X) = -\int f(x)\log f(x)dx$ のこと。 例えば $f$ が狭い区間に集中していると $h$ は負になります。 微分エントロピーは座標変換で値が変わる「スケール依存」の量なので、 比較は同じ単位系で。

Q3. ジニとエントロピー、 どっちを使えばいいの?

経験的にはほぼ同じ結果になるので、 ライブラリ既定(scikit-learn なら gini)で OK。 解釈の文脈や論文の流儀で選びましょう。

Q4. クロスエントロピー損失とは何の関係?

分類モデルの損失関数 $-\sum y_i \log \hat p_i$ は「真の分布 $y$ と予測分布 $\hat p$ のクロスエントロピー」。 これを最小化することは KL ダイバージェンスを最小化することと等価です。

Q5. 47 都道府県は少なすぎて意味のあるエントロピーが出ない?

サンプル数が少ないとエントロピーは過小評価されがちですが、 教育用途では 47 県でも十分。 補正したい場合は Miller-Madow 補正:$H_{MM} = H + (k-1)/(2n)$($k$ はカテゴリ数、 $n$ はサンプル数)。

Q6. NLP の「perplexity」とエントロピーの関係は?

パープレキシティは $\mathrm{PPL} = 2^{H}$。 「平均的に何択の予測難度か」を示し、 言語モデルの標準指標です。 perplexity = 100 とは平均 100 候補から正解 1 つを当てる難しさに相当。

Q7. エントロピーが「乱雑さ」と言われるのは?

熱力学のボルツマンエントロピー $S = k_B \log W$ と数式が同形のため、 「乱雑さ」のメタファーが使われます。 ただし情報理論では「予測しにくさ」「驚きの平均」と捉える方が直感的です。

🧭 これからの学習ルート

  1. ステップ 1情報利得で、 エントロピーが「分割の良さ」をどう測るかを学ぶ
  2. ステップ 2損失関数でクロスエントロピーがどう損失に化けるかを見る
  3. ステップ 3過学習でエントロピー=0 まで木を伸ばす危険性を理解する
  4. ステップ 4汎化で「データには見えないが現実にある」分布のエントロピーを意識する
  5. ステップ 5:実プロジェクトで mutual_info_classif を使って特徴量選択を体験する

📝 コラム — 用語を「使いこなす」ためのヒント

用語は知っているだけでは武器になりません。 「使いどころを判断できる」「同僚に説明できる」「コードに落とせる」の 3 拍子が揃って、 はじめて自分の道具になります。 ここでは、 知識を「使える力」に変えるための実践的ヒントを紹介します。

💡 習慣化のヒント:新しい用語に出会ったら、 「30 秒結論」「最小コード」「失敗パターン」の 3 点を必ずノートに書く。 ジャストインタイム学習はこのルーチンで強化されます。