---
title: "インフォメーションゲイン（情報利得）とは？計算式・Python実測とGoogle情報利得スコア（SEO）の違い"
url: "https://www.issoh.co.jp/column/details/7554/"
published: 2025-07-04
updated: 2026-09-11
categories: ["SEO"]
publisher: "株式会社一創"
---

# インフォメーションゲイン（情報利得）とは？計算式・Python実測とGoogle情報利得スコア（SEO）の違い

インフォメーションゲイン（情報利得、information gain）とは、ある属性で分割したときに不確実性がどれだけ減ったかを表す、情報理論の指標です。不確実性はエントロピーで測り、情報利得は「分割前のエントロピー − 分割後の平均エントロピー」として定義されます。ID3など、情報利得を分割基準にする決定木は、この値が最大になる属性を選んで枝を伸ばします。一方、SEOの文脈で語られる「情報利得スコア」はGoogleの特許に由来する別概念で、数式も対象も異なります。この記事では定義と計算式を押さえ、14件のデータで実際に値を出し、情報利得が単独では機能しない条件まで実測で示します。

## まとめ：情報利得の要点

情報利得は「エントロピーの減少量」であり、決定木の分割基準として使われます。ただし各属性値で多分岐する場合、行ごとに値が異なる属性は最大の情報利得を取り、選ばれやすくなります。

| 論点              | 結論                | 本記事での実測値                   |
| --------------- | ----------------- | -------------------------- |
| 定義              | 分割前後のエントロピー差      | H(S)=0.9403 bit            |
| 最良の分割属性         | 情報利得が最大の属性        | Outlook 0.2467             |
| 多値属性バイアス        | ID列が最大値を取る        | ID 0.9403                  |
| 利得比で解決するか       | しない               | ID 0.2470 > Outlook 0.1564 |
| scikit-learnの既定 | gini（entropyは選択制） | 1.9.1時点                    |
| SEOの情報利得スコア     | 特許は存在・利用は非公表      | US 11,354,342 B2 ほか        |

機械学習の情報利得とSEOの情報利得スコアは、名前が共通するだけで別物です。前者はシャノンの情報理論に基づく計算可能な量、後者はGoogle特許が記述する「その文書が既読文書に対して追加する情報量」という評価の考え方です。特許には機械学習モデルによる算出方法の例が記載されていますが、決定木の情報利得のような固定の計算式は示されていません。両者を混ぜて説明する解説が多いため、本記事では章を分けています。

## 情報利得の定義式とエントロピーからの導き方

データ集合 S に含まれるクラス i の比率を p(i) とすると、エントロピーは H(S) = −Σ p(i) log2 p(i) です。対数の底が2なので単位はビットになります。クラスが1つに揃えば H=0、2クラスが半々なら H=1 で最大です。エントロピーそのものの意味は[エントロピーとは？情報量の考え方と機械学習での使いどころを実装目線で解説](/tech/details/15244/)で扱っているため、ここでは情報利得の材料として最小限に留めます。

属性 A で S を部分集合 Sv に分けたときの情報利得は、次のように書けます。

IG(S, A) = H(S) − Σ ( |Sv| ÷ |S| ) × H(Sv)

右辺の第2項は、分割後の各枝のエントロピーをデータ件数で重み付けした平均です。機械学習の「朱鷺の杜Wiki」はこれを条件付きエントロピーを使って `Gain(X_A)=H(C) - H(C|X_A)` と表記しています。同じ式で、表現が違うだけです。

### 相互情報量・KLダイバージェンスとの関係

情報利得は、確率分布間の隔たりを表すKullback-Leiblerダイバージェンスとして定義することもできます。ただし、これは一般に対称性を満たさず、数学的な距離ではありません。英語版WikipediaのInformation gain (decision tree)は、観測後の分布と事前分布のKLダイバージェンス IG(X,a) = D\_KL(P\_X|a ∥ P\_X) を形式的定義として与え、そのうえで期待値について「The expected value of the information gain is the mutual information I(X;A)」と述べています。つまり、属性の取りうる値すべてにわたって平均した情報利得が相互情報量です。決定木の実装で計算しているのは、この期待値のほうにあたります。

### 日本語表記が3通りある理由

information gain の訳語は文献によって割れています。Weblioの英和辞典では、JST科学技術用語日英対訳辞書が「情報増加」、日英・英日専門用語辞書が「情報利得」を当てています。機械学習分野の日本語資料として定着している朱鷺の杜Wikiは「情報ゲイン」を見出し語にしています。検索するときは3語とも試すのが確実です。読み方は「インフォメーションゲイン」で、カタカナ表記のまま使う実務資料も少なくありません。

## Pythonによる情報利得の計算と出力例

式だけでは感覚がつかみにくいので、Quinlanの決定木論文（[Induction of Decision Trees, Machine Learning 1, 81-106, 1986](https://doi.org/10.1007/BF00116251)）のTable 1にある14件を、P/NをYes/No、Windyのfalse/trueをWeak/Strongに読み替えたデータで、標準ライブラリだけを使って計算します。外部パッケージは不要です。

```
from math import log2
from collections import Counter

def entropy(labels):
    n = len(labels)
    return -sum(v / n * log2(v / n) for v in Counter(labels).values())

# Quinlan (1986) Table 1 の14件: Outlook, Temp, Humidity, Wind, Play
rows = [
    ("Sunny", "Hot", "High", "Weak", "No"),
    ("Sunny", "Hot", "High", "Strong", "No"),
    ("Overcast", "Hot", "High", "Weak", "Yes"),
    ("Rain", "Mild", "High", "Weak", "Yes"),
    ("Rain", "Cool", "Normal", "Weak", "Yes"),
    ("Rain", "Cool", "Normal", "Strong", "No"),
    ("Overcast", "Cool", "Normal", "Strong", "Yes"),
    ("Sunny", "Mild", "High", "Weak", "No"),
    ("Sunny", "Cool", "Normal", "Weak", "Yes"),
    ("Rain", "Mild", "Normal", "Weak", "Yes"),
    ("Sunny", "Mild", "Normal", "Strong", "Yes"),
    ("Overcast", "Mild", "High", "Strong", "Yes"),
    ("Overcast", "Hot", "Normal", "Weak", "Yes"),
    ("Rain", "Mild", "High", "Strong", "No"),
]
cols = ["Outlook", "Temp", "Humidity", "Wind"]
y = [r[4] for r in rows]

def gain_ratio(idx):
    n = len(rows)
    groups = {}
    for r in rows:
        groups.setdefault(r[idx], []).append(r[4])
    remainder = sum(len(g) / n * entropy(g) for g in groups.values())
    gain = entropy(y) - remainder
    split_info = -sum(len(g) / n * log2(len(g) / n) for g in groups.values())
    return gain, split_info, gain / split_info

print("H(S) =", round(entropy(y), 4))
for i, c in enumerate(cols):
    g, s, r = gain_ratio(i)
    print(f"{c:8s} gain={g:.4f} split_info={s:.4f} gain_ratio={r:.4f}")
```

手元のPython 3.14.6で実行した出力が次のとおりです。

```
H(S) = 0.9403
Outlook  gain=0.2467 split_info=1.5774 gain_ratio=0.1564
Temp     gain=0.0292 split_info=1.5567 gain_ratio=0.0188
Humidity gain=0.1518 split_info=1.0000 gain_ratio=0.1518
Wind     gain=0.0481 split_info=0.9852 gain_ratio=0.0488
```

14件のうちYesが9件、Noが5件なので、分割前のエントロピーは0.9403ビットです。4属性のうち情報利得が最大なのはOutlookの0.2467で、決定木はここを根ノードに選びます。Tempの情報利得は0.0292ビットで、分割によって不確実性は減りますが、その減少量は4属性の中で最小です。値の大小は「その属性を知ると答えがどれだけ絞れるか」を直接表しています。

この4つの値は答え合わせができます。Quinlanは原論文に gain(outlook) = 0.246 bits、gain(temperature) = 0.029 bits、gain(humidity) = 0.151 bits、gain(windy) = 0.048 bits と記載しています。上のコードの出力（0.2467 / 0.0292 / 0.1518 / 0.0481）は、いずれも小数第3位を切り捨てるとこの数値に一致します。手元の実装が論文どおりに動いていることの確認になります。

### split\_infoが同時に必要になる理由

上のコードは情報利得と並べて split\_info（分割情報量）と gain\_ratio（利得比）も出しています。split\_info は分割後の枝の数と偏りだけで決まる量で、枝が多く均等なほど大きくなります。Humidityは High と Normal の2値で7件ずつに割れるため split\_info はちょうど1.0000、Outlookは3値なので1.5774です。利得比は情報利得を split\_info で割った値で、枝数の多さによる下駄を外す狙いがあります。ただしQuinlan自身が、この比は「may not always be defined」と断り、その例としてIV(A)、すなわち split\_info が0になる場合を挙げています。属性が1種類の値しか取らないときがこれにあたり、割り算が定義できません。実装するときはこの分岐を先に潰しておく必要があります。次の章で、この補正が効く条件と効かない条件を実測します。

## 情報利得の多値属性バイアスと利得比の限界

情報利得の既知の欠点は、取りうる値の種類が多い属性を過大評価することです。Quinlan自身が1986年の論文で、Kononenkoらの1984年の指摘として「the gain criterion tends to favor attributes with many values」を引き、分析がこれを裏づけると書いています。どの程度偏るのかを、先ほどのデータに一意なID列を足して測ります。

```
# 全行に一意な ID 列を足して、5 番目の属性として評価する
rows_id = [r[:4] + (f"ID{i:02d}",) + (r[4],) for i, r in enumerate(rows)]
n = len(rows_id)
groups = {}
for r in rows_id:
    groups.setdefault(r[4], []).append(r[5])
remainder = sum(len(g) / n * entropy(g) for g in groups.values())
gain = entropy(y) - remainder
split_info = -sum(len(g) / n * log2(len(g) / n) for g in groups.values())
print(f"ID       gain={gain:.4f} split_info={split_info:.4f} "
      f"gain_ratio={gain / split_info:.4f}")
```

```
ID       gain=0.9403 split_info=3.8074 gain_ratio=0.2470
```

IDの情報利得は0.9403、つまり H(S) と完全に一致します。14件を14個の枝に割れば各枝の要素は1件だけになり、分割後のエントロピーが0になるためです。予測能力はまったく無いのに、情報利得の順位では文句なしの1位になります。

問題は利得比を当てた後です。IDの利得比は0.2470で、split\_infoが3.8074と大きいぶん0.9403からは大きく下がりました。それでも最良の実属性であるOutlookの0.1564を上回っています。利得比に置き換えただけでは、依然としてIDが選ばれます。

| 属性       | 値の種類 | gain   | split\_info | gain\_ratio |
| -------- | ---- | ------ | ----------- | ----------- |
| ID       | 14   | 0.9403 | 3.8074      | 0.2470      |
| Outlook  | 3    | 0.2467 | 1.5774      | 0.1564      |
| Humidity | 2    | 0.1518 | 1.0000      | 0.1518      |
| Wind     | 2    | 0.0481 | 0.9852      | 0.0488      |
| Temp     | 3    | 0.0292 | 1.5567      | 0.0188      |

Quinlanが提案した手順は、利得比を単純に最大化するものではありません。原論文の定義は「The gain ratio criterion selects, from among those attributes with an average-or-better gain, the attribute that maximizes the above ratio」です。情報利得が平均以上の属性だけを候補に残し、その中で利得比が最大のものを採るという2段構えになっています。

この2段目のフィルタは、ID列が無ければ正しく働きます。実属性4つの情報利得の平均は0.1189で、これを超えるのはOutlook（0.2467）とHumidity（0.1518）の2つです。Quinlanも同じデータについて「only outlook and humidity have above-average gain」と書き、利得比で比べてもOutlookが選ばれるが「its superiority over the humidity attribute is now much reduced」と述べています。本記事の実測でもOutlook 0.1564とHumidity 0.1518の差はわずか0.0046で、原論文の記述どおりの結果になりました。

問題はID列を候補に加えた瞬間です。平均が0.1189から0.2832へ跳ね上がり、これを満たすのはID（0.9403）だけになります。候補が1つしか残らないため、本来はIDを弾くはずの平均以上フィルタが、逆にIDだけを通してしまいます。利得比という補正は、識別子のような極端な属性に対しては二重に無力です。

したがって、利得比を有効な対策として扱えるのは「識別子に近い列を事前に落としてある」ことが前提です。まず、意味を持たない一意な識別子を特徴量から外して分割基準を比べてください。日時やユーザー情報に予測上の意味がある場合は、時間帯や履歴集計などへの変換も検討します。分割基準のパラメータを変えて対処する問題ではありません。前処理での列の取捨は[特徴量エンジニアリングとは？変換・選択・自動化の工程と実装判断【2026年版】](/tech/details/15843/)で扱っている領域です。

## ジニ不純度との使い分けとscikit-learnでの実際

実務で決定木を書く場合、分割基準は自分で実装せずライブラリの引数で選びます。[Scikit-learnとは？読み方・できること・使い方を実行例で解説](/tech/details/3133/)で紹介しているscikit-learnでは、DecisionTreeClassifier の criterion がそれにあたります。[公式ドキュメント](https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html)は criterion を `{gini, entropy, log_loss}, default=gini` と定義し、「Supported criteria are `gini` for the Gini impurity and `log_loss` and `entropy` both for the Shannon information gain」と説明しています（1.9.1時点）。既定はジニ不純度であり、情報利得を使いたい場合は、criterionに entropy または log\_loss を明示的に指定します。

```
import sklearn
from sklearn.tree import DecisionTreeClassifier, export_text
from sklearn.preprocessing import OrdinalEncoder

print("scikit-learn", sklearn.__version__)
X = OrdinalEncoder().fit_transform([list(r[:4]) for r in rows])
for criterion in ("gini", "entropy"):
    clf = DecisionTreeClassifier(criterion=criterion, random_state=0).fit(X, y)
    print(criterion, "root =", cols[clf.tree_.feature[0]],
          "depth =", clf.get_depth())

stump = DecisionTreeClassifier(criterion="entropy", max_depth=1,
                               random_state=0).fit(X, y)
print(export_text(stump, feature_names=cols))
```

```
scikit-learn 1.6.1
gini root = Outlook depth = 4
entropy root = Outlook depth = 4
|--- Outlook <= 0.50
|   |--- class: Yes
|--- Outlook >  0.50
|   |--- class: No
```

gini と entropy のどちらでも根ノードはOutlookで、木の深さも4で一致しました。両者は不純度の定義が異なり、データによって分割候補の順位も変わります。この14件で結果が一致したことだけでは、他のデータでも一致するとは判断できません。ジニ不純度の式は対数を含みません。ただし、実際の学習時間はデータと実装に依存するため、速度差は使用環境で測定してください。判断基準としては、既定のginiから始め、entropyに変えて精度が動くかを検証する順序で十分です。

### ID3の多分岐とscikit-learnの二分岐の違い

出力の4行目以降に注意してください。手計算ではOutlookをSunny・Overcast・Rainの3枝に分けましたが、scikit-learnは Outlook <= 0.50 という二分岐を作っています。公式ドキュメントは、ID3について「The algorithm creates a multiway tree」と述べる一方、CARTは「constructs binary trees using the feature and threshold that yield the largest information gain at each node」と説明し、さらに「scikit-learn uses an optimized version of the CART algorithm; however, the scikit-learn implementation does not support categorical variables for now」と明記しています。多分岐もカテゴリ変数の直接サポートも無く、利得比を選ぶ criterion も用意されていません。上のコードで OrdinalEncoder を挟んでいるのはそのためで、文字列を0,1,2の数値に置き換えたうえで閾値による二分岐に落としています。

この差は結果にも影響します。順序のないカテゴリを整数に変換すると、本来は無関係なSunny・Overcast・Rainの間に大小関係が生まれ、分割の候補が「ある値以下か否か」に制約されます。カテゴリ変数を素直に扱いたい場合は、One-Hotエンコーディングを使うか、カテゴリ型を直接サポートするLightGBMなどを選ぶ判断になります。ID3やC4.5の解説記事のとおりに手を動かした後でscikit-learnに移ると結果が食い違うのは、アルゴリズム系統が違うためです。木の剪定や過学習対策を含めた全体像は[決定木分析とは？分類木・回帰木の仕組みと過学習を防ぐ剪定・アンサンブルを実装目線で解説](/tech/details/15206/)で整理しています。

## SEOの情報利得スコア：特許の記載と検索実装の確認範囲

SEOの文脈で言われる情報利得スコアは、Googleの特許に登場する概念です。ここで注意したいのは、該当する特許が1件ではないことです。「Contextual estimation of link information gain」という同じ発明の名称で、権利者Google LLC・優先日2018年10月18日の米国特許が複数登録されています。解説記事が引く番号が食い違うのはこのためです。ここでは登録日の異なる2件を挙げます。

| 特許番号             | 登録日        | 公開番号            | Google Patents上の表示 | 同サイトの満了予定   |
| ---------------- | ---------- | --------------- | ------------------ | ----------- |
| US 11,354,342 B2 | 2022年6月7日  | US20200349181A1 | Active             | 2039年6月14日  |
| US 12,013,887 B2 | 2024年6月18日 | US20230342384A1 | Active             | 2038年10月18日 |

[US 12,013,887 B2](https://patents.google.com/patent/US12013887B2/en)のAbstractは、スコアの中身を「An information gain score for a given document is indicative of additional information that is included in the document beyond information contained in documents that were previously viewed by the user」と説明しています。ユーザーが以前に閲覧した文書に対して、その文書が追加で提供する情報の量、という定義です。

同じAbstractには、算出方法についての記述もあります。「the information gain score may be determined for one or more documents by applying data from the documents across a machine learning model to generate an information gain score」、つまり機械学習モデルに文書のデータを通して求める、という例示です。決定木の情報利得のようにエントロピーから計算する固定の式は示されておらず、名称を借りた別の評価概念と捉えるのが正確です。

ここから先は断定できません。特許が存在することと、その技術が検索ランキングで稼働していることは別の話で、Googleは情報利得スコアをランキング要因として使っているとは公表していません。「情報利得スコアで順位が決まる」と書く根拠は現時点でありません。実務上は、既出の内容の要約にとどまらず独自の一次情報を載せるという方向性を支持する材料の一つとして扱うのが妥当です。検索側がページの内容をどう把握しているかという観点では、[GoogleのナレッジグラフとエンティティSEOの密接な関係性](/column/details/7557/)も合わせて参考になります。

## よくある質問

### information gain の日本語訳と読み方は？

読み方は「インフォメーションゲイン」です。訳語は統一されておらず、Weblioの英和辞典ではJST科学技術用語日英対訳辞書が「情報増加」、日英・英日専門用語辞書が「情報利得」を当てています。機械学習分野では朱鷺の杜Wikiの見出し語である「情報ゲイン」もよく使われます。日本語資料を探すときは3語とも試してください。

### エントロピーと情報利得はどう違いますか？

エントロピーはある時点のデータが持つ不確実性の量、情報利得はその不確実性が分割によって減った差分です。本記事の14件では分割前のエントロピーが0.9403ビットで、Outlookで分割すると0.2467ビットぶん減ります。エントロピーは状態を表す量、情報利得は変化量を表す量、という関係になります。

### 情報利得とジニ不純度はどちらを使うべきですか？

scikit-learnの既定であるginiから始めて問題ありません。本記事の実測では gini と entropy のどちらでも根ノードはOutlookで深さも同じ4になりました。ただし、この一致は他のデータで同じ分割になることを保証しません。学習時間と予測性能は、同じ検証条件で比較してください。entropyへの変更は、精度が動くかを検証する対象として扱う程度で足ります。

### 情報利得と相互情報量は同じものですか？

厳密には、属性の取りうる値すべてで平均した情報利得が相互情報量です。英語版Wikipediaは E\_A\[IG(X,A)\] = I(X;A) と記しています。決定木で各属性について計算している値はこの期待値にあたるため、実装上は同じものを指していると考えて差し支えありません。特定の観測値1つに対する情報利得を指す場合のみ、両者は区別されます。

### Googleの情報利得スコアは検索順位に使われていますか？

公表されていません。同名の特許がUS 11,354,342 B2（2022年6月7日登録）とUS 12,013,887 B2（2024年6月18日登録）の2件あり、いずれもGoogle Patents上でActiveであることは確認できますが、これがランキングで稼働しているかについてGoogleは説明していません。確認した範囲では、Google検索セントラルの公開資料にも情報利得スコアをランキング要因として用いると明言した記述はありません。特許の取得は実装の証明ではないため、順位への影響を断定する書き方は避けるべきです。

## 関連記事

- [エントロピーとは？情報量の考え方と機械学習での使いどころを実装目線で解説](/tech/details/15244/)
- [決定木分析とは？分類木・回帰木の仕組みと過学習を防ぐ剪定・アンサンブルを実装目線で解説](/tech/details/15206/)
- [Scikit-learnとは？読み方・できること・使い方を実行例で解説](/tech/details/3133/)
- [特徴量エンジニアリングとは？変換・選択・自動化の工程と実装判断【2026年版】](/tech/details/15843/)
- [GoogleのナレッジグラフとエンティティSEOの密接な関係性](/column/details/7557/)

---

出典: [インフォメーションゲイン（情報利得）とは？計算式・Python実測とGoogle情報利得スコア（SEO）の違い](<https://www.issoh.co.jp/column/details/7554/>)（株式会社一創）
