メインコンテンツへスキップ
ブログ一覧に戻る
統計・データサイエンス

数量化Ⅱ類|カテゴリ説明でカテゴリ目的を判別(判別分析との関係)

2025年11月2日
最終更新: 2026年10月8日
8分で読めます

この記事でわかること

数量化Ⅱ類の得点を解約確率と読んでいませんか。架空18件から相関比とカテゴリ得点を計算し、別の検証20件でしきい値による見逃し・余分な対応・仮損失を比較します。図とPythonで一般化固有値問題を確認し、尺度と符号、不均衡、データ漏洩、ロジスティック回帰との違い、未見評価と施策効果を分けて説明します。

2026年10月8日に数量化Ⅱ類の原資料、SciPyの一般化固有値問題、scikit-learnのしきい値・交差検証を再確認した。数量化Ⅱ類の得点は群を分けるための尺度で、相関比や固有ベクトルの符号・尺度をそのまま解約確率や対応効果と読まない。クラス確率、行動しきい値、見逃し・過剰対応の費用、未見データ評価を別に設計し、学習データでしきい値を決めて評価を兼ねない。

30秒で要点

数量化Ⅱ類は、名義カテゴリの回答から得点を作り、解約/継続などの群を分ける方法です。得点の大きさを、そのまま解約確率や施策の効果と読まないことが出発点になります。

  • Ⅰ類は数値の目的変数の予測、Ⅱ類はカテゴリの目的変数の判別を扱います。
  • 基本的な定式化は、得点の全体のばらつきに対して群間のばらつきを大きくする、相関比の最大化です。
  • 得点の符号・原点・尺度を変えても分離の内容が同じ場合があります。尺度と判定方向を明記します。
  • 相関比、確率校正、しきい値別の誤分類数、施策効果は別に確認します。

アンケートの回答を、何のために判別するのか

旧稿のケースを具体化します。予測時点のアンケートで不満要因・利用頻度・プランを取得し、その後の一定期間の解約/継続を判別したい場面です。解約後の回答を混ぜず、同じ顧客が訓練側と評価側をまたがないようにします。解約の定義と観測期間をそろえることも必要です。

表が収まらない場合は、横にスクロールできます

用語意味それだけでは分からないこと
カテゴリスコア各回答水準に付ける数値属性を変える施策の因果効果
個体の得点該当するカテゴリスコアの和校正された解約確率
相関比η²群間平方和を全平方和で割った値未見データの正解率
しきい値得点から対応対象を選ぶ境界対応した場合に解約を防げる割合
林の論文(1954年、pp.121–124)では、カテゴリを示す指示変数の和による得点と、群間分散/全分散の比を扱っています。以下はその考え方を確認する独自の架空教材です。歴史的な調査データを再現したものではありません。

架空18件で、相関比の分子と分母を確認する

数理を見やすくするため、説明項目を満足度1個、回答を高・中・低の3カテゴリに絞ります。各カテゴリ6件、解約9件・継続9件の学習用データです。「高・中・低」という名前から等間隔の点数を先に決めず、ここでは学習した解の一つを最大絶対値1で表示します。

表が収まらない場合は、横にスクロールできます

満足度解約継続件数表示する得点
高156-1
中3360
低5161

全18件の平均得点は0です。解約群の平均は4/9、継続群は-4/9になります。得点の全平方和は12、群間平方和は9×(4/9)²+9×(-4/9)²=32/9なので、η²=(32/9)/12=8/27、約0.2963です。群内平方和は76/9で、群間と足すと12に戻ります。

この比は正解率29.63%という意味ではありません。また、得点1を解約確率100%と読めません。例えば同じ学習データで得点1のカテゴリにも継続1件があります。

架空の学習18件から得た高・中・低の得点-1・0・1と相関比8/27、別の検証20件のしきい値0と1の仮損失12と17を分けて示す
著者が設定した架空教材。上段は学習18件、下段は別の検証20件。得点は確率でなく、仮損失は余分な対応1・見逃し5の設定。最終未見評価と施策効果は未検証。

得点を3倍したり全体に5を足したりしても、分子・分母の対応した変化によりη²は同じです。全体を反転した場合は判定の向きも反転させます。符号の違う点数表だけを見て、別の結論になったと判断しないでください。

ミニコード:冗長な列を除き、得点を求める

全カテゴリ列をそのまま中心化すると列の和が0になり、全平方和行列は特異になります。ここでは高を基準にして中・低の2列を使い、学習データの列平均を引きます。Tを全体、Bを群間の平方和行列とすると、Bv=η²Tvを解きます。

対象はPython3.12、NumPy2.1.3、SciPy1.14.1です。eighの仕様では第2行列の正定値性が必要です。実データで項目が完全に重なる場合などは、この小例と同じ除列だけで解消するとは限りません。

import numpy as np
from scipy.linalg import eigh

# (解約, 継続)件数。全て架空。
counts = [(1, 5), (3, 3), (5, 1)]
rows = [(k, y) for k, (p, n) in enumerate(counts)
        for y, count in [(1, p), (0, n)] for _ in range(count)]
category, y = np.asarray(rows).T
X = np.column_stack([category == 1, category == 2]).astype(float)
center = X.mean(axis=0)
Xc = X - center
T = Xc.T @ Xc
B = np.zeros((2, 2))
for group in (0, 1):
    part = Xc[y == group]
    mean = part.mean(axis=0)
    B += len(part) * np.outer(mean, mean)
assert np.linalg.eigvalsh(T).min() > 0
values, vectors = eigh(B, T)
v = vectors[:, -1]
train = Xc @ v
if train[y == 1].mean() < train[y == 0].mean():
    v = -v
v /= np.max(np.abs(Xc @ v))
train = Xc @ v
category_scores = (np.array([[0., 0.], [1., 0.], [0., 1.]]) - center) @ v
assert np.allclose(category_scores, [-1, 0, 1])
assert np.isclose(values[-1], 8/27)
print("scores", np.round(category_scores, 6).tolist())
print("eta2", round(float(values[-1]), 6))

# 別の架空検証20件。学習済み中心・係数を固定したまま使う。
validation_counts = [(1, 7), (2, 5), (3, 2)]
for threshold in (0., 1.):
    predicted = category_scores >= threshold - 1e-10
    # 許容差は理論上の境界0/1の丸め誤差だけに使用。
    tp = sum(p for flag, (p, n) in zip(predicted, validation_counts) if flag)
    fp = sum(n for flag, (p, n) in zip(predicted, validation_counts) if flag)
    fn, tn = 6 - tp, 14 - fp
    print(threshold, (tp, fp, fn, tn), round(tp/(tp+fp), 6),
          round(tp/6, 6), fp + 5*fn)

この例の全体行列Tは [[4,-2],[-2,4]]、群間行列Bは [[0,0],[0,8/9]] です。固有値は0と8/27になります。得点の正規化は表示を読みやすくする操作で、確率への変換ではありません。

しきい値を変えたら、誰を見逃し誰へ余分に対応するか

次の20件は、上の18件とは別に設定した架空の検証用件数です。解約6件・継続14件で、学習側とは比率も違います。得点を学び直さず、そのまま適用します。

表が収まらない場合は、横にスクロールできます

満足度解約継続適用する得点
高17-1
中250
低321

得点がしきい値以上なら対応対象とします。見逃し1件を5単位、余分な対応1件を1単位とする仮の損失を置きます。売上や実際の解約防止額を測った値ではありません。

表が収まらない場合は、横にスクロールできます

しきい値TP / FP / FN / TNPrecisionRecall仮損失 FP+5FN
0以上5 / 7 / 1 / 75/12 ≈ 0.41675/6 ≈ 0.833312
1以上3 / 2 / 3 / 123/5 = 0.63/6 = 0.517

Precisionの分母は対応対象数、Recallの分母は実際の解約6件です。指標の定義も確認してください。今回の仮損失ではしきい値0を候補にしますが、対応枠が少ない場合などには別の判断になります。

しきい値調整の公式説明のとおり、得点を作る学習としきい値の選択を区別します。この20件で選んだ後の性能を確定するには、さらに未使用の評価データが必要です。この教材では用意していないため、最終的な汎化性能は主張しません。

ロジスティック回帰との比較と運用の条件

表が収まらない場合は、横にスクロールできます

観点数量化Ⅱ類の基本形ロジスティック回帰との比較で見ること
学習の目的得点の群間/全体のばらつきの比を大きくする確率モデルの尤度を基礎とする目的とは異なる
出力判別得点確率が必要なら校正も含めて評価する
多クラス複数の判別軸を検討し得る1本のしきい値だけで全クラスを扱うと決めない
比較条件同じ予測時点・分割・説明項目同じ未見データ、損失、対応容量で比較する

クラス数をGとすれば、群間行列の階数は高々G-1です。今回の二群では非ゼロの判別軸は高々1本です。属性を増やせば有用な軸が無限に増えるわけではありません。

不均衡な実務データでは、陽性の定義と割合、PR曲線や平均適合率、しきい値別の件数・損失を併記します。「不均衡だからRecallだけ」で十分とは限りません。カテゴリ統合、特徴選択、再標本化をするなら訓練側に閉じ、顧客・期間の依存を考慮した分割にします。交差検証を入れても、その設計やデータ漏洩の問題は残ります。

週次で必ず再学習するという規則は設けず、ラベルが確定する遅れ、カテゴリの変化、費用や性能の変化から見直し時期を決めます。得点上位の顧客へのフォローで解約が減るかは、予測とは別の施策評価です。

練習問題で得点と判断を分ける

  1. 不均衡でPrecisionが低いとき、しきい値を上げればよいですか? 今回はPrecisionが上がる一方、Recallが下がり仮損失が増えます。検証側で容量・費用・見逃しを比較し、重み付けや再標本化は別の学習変更として評価します。
  2. 属性が多く過学習したらどうしますか? まず件数、まれな水準、完全に重なる項目を確認します。意味のある統合や特徴選択、正則化した別モデルも候補ですが、選択と評価のデータを分けます。
  3. ロジスティック回帰との違いは何ですか? 目的関数と出力の意味が違います。Ⅱ類の得点を確率と呼ばず、同じ未見データと運用条件で比較します。

目的が売上などの数値なら、数量化Ⅰ類の基準カテゴリと中心化の例へ戻り、何を予測するモデルかを整理できます。

よくある質問(FAQ)