21 人が閲覧(直近 30 日) データ分析・GA4

判別分析とは?線形判別・マハラノビス距離・正準判別分析の違いとExcel・Python・Rでの手順

判別分析とは?線形判別・マハラノビス距離・正準判別分析の違いとExcel・Python・Rでの手順

判別分析は、すでにグループ分けが済んだデータから「どの変数がグループを分けているか」を式にし、その式で新しいデータの所属先を当てる手法です。与信審査の完済と延滞、検査データの陽性と陰性のように、答えが分かっている過去データが手元にある場面で使います。この記事では、フィッシャーの線形判別・マハラノビス距離・二次判別の使い分け、事前確率で境界がどう動くか、2群2変数の計算例のExcelでの再現、正準判別分析で取れる軸の本数を、実際に計算した数値で説明します。実装はscikit-learn 1.9.1・R・SPSSの3通りで示します。

まとめ:判別分析の要点と手法の選び方

  • 判別分析は教師あり手法です。グループのラベルが付いた学習データが無ければ使えません。ラベルが無い場合はクラスター分析の領域になります。
  • 線形判別関数は各群の分散共分散行列が等しいことを前提にします。群間の共分散が異なる場合は二次判別分析(QDA)を候補にし、各群の標本数と交差検証の結果を踏まえて選びます。
  • 2群の線形判別では、事前確率などを定数項に反映した「各変数 × 判別係数」の和で判別得点を計算し、その符号で所属先を決められます。係数はExcelのMINVERSEとMMULTで計算できます。
  • 群の大きさが偏っているときは事前確率の置き方で判定が大きく変わります。少数群の見逃しを減らしたいなら事前確率を等しく置くか、誤分類コストを指定します。
  • 正準判別分析で取れる軸の本数の上限は min(群の数 − 1, 変数の数) です。3群4変数のアヤメのデータでは2本になり、第1軸だけで群間の分散の99.12%を説明します。
  • scikit-learn 1.9.1 から、2群の solver="svd" の係数が教科書の手計算の n÷(n−g) 倍になりました。教科書の係数と比較する場合は、符号と正規化の条件をそろえます。報告書には使用バージョン・ソルバー・事前確率を併記し、精度は交差検証で評価します。

判別分析が答える問いと、隣接手法との線引き

判別分析の出発点は、R. A. Fisherが1936年に「Annals of Eugenics」誌 7巻2号 179〜188ページで発表した論文「The Use of Multiple Measurements in Taxonomic Problems」です。アヤメの花のがく片と花弁の長さ・幅から品種を分ける問題を扱い、群内のばらつきに対して群間の差が最も大きくなる方向へデータを射影する、という発想を示しました。この考え方が、現在の線形判別分析(LDA)の骨格です。

判別分析が答えるのは、新しい観測値がどの群に属するかという予測と、どの変数が群を分けているかという解釈の2つです。予測精度を重視する場合は、勾配ブースティングなども候補に加え、同じ検証データと評価指標で比較します。それでも判別分析が実務で残っているのは、判別係数という読める形で「何が効いているか」を説明できるからです。

倒産予測のZスコアに見る判別分析の使われ方

判別分析を倒産予測に用いた代表例が、Edward I. Altmanが1968年に「The Journal of Finance」誌 23巻4号 589〜609ページで発表した倒産予測の論文です。倒産した製造業33社と存続した33社、計66社の財務比率に判別分析をかけ、5つの比率で倒産企業を見分ける判別関数を作りました。広く引用される形は Z = 1.2X1 + 1.4X2 + 3.3X3 + 0.6X4 + 1.0X5 で、X1は運転資本÷総資産、X2は留保利益÷総資産、X3は利払前税引前利益÷総資産、X4は株式時価総額÷負債の簿価、X5は売上高÷総資産です。原論文に載っている係数は .012・.014・.033・.006・.999 と表記が異なるので、自分で計算するときは原論文で各比率の単位を確かめてから使ってください。

このモデルで参考になるのは境界の引き方です。原論文の初期標本では、Zが2.99を超える企業は非倒産群、1.81を下回る企業は倒産群に属し、その間は判定が不確かな領域(zone of ignorance)とされました。判別得点を1本の閾値で二分せず、境界付近を人が見る帯として残す設計で、後半の与信の計算例でも同じ考え方を使えます。X4に株価を使うため、この式をそのまま当てはめられるのは上場企業に限られます。業種や時代の違うデータに係数を流用せず、自社のデータで判別関数を推定し直すのが原則です。

クラスター分析との線引き

混同されやすいのがクラスター分析ですが、両者は前提が正反対です。判別分析は「AとBに分かれていることが既知のデータ」から分ける式を学習します。クラスター分析は分類が未知の状態から、似ているもの同士を機械的に束ねます。既知の群への所属を予測するなら判別分析、新しい群構造を探索するならクラスター分析を選びます。ラベル列の有無だけでなく、分析目的で使い分けます。似たもの同士を束ねる手順はデンドログラムとは?階層的クラスタリングの見方とクラスタ数の決め方で解説しています。

ロジスティック回帰との使い分け

2群の判別であれば、ロジスティック回帰でも同じ問題を解けます。分かれ目は前提の置き方です。確率モデルとしての線形判別分析(LDA)は、各群の説明変数が多変量正規分布に従い、群間で分散共分散行列が等しいと仮定します。この仮定が成り立つときは、判別分析の方が少ないサンプルで安定した係数を得られます。逆に説明変数にカテゴリ変数(性別、契約種別など)が混ざる場合、正規分布の仮定は明らかに崩れるので、ロジスティック回帰を選びます。回帰系の手法との関係は重回帰分析の式の立て方と結果の見方と合わせて見ると整理しやすくなります。

線形判別関数・マハラノビス距離・二次判別の3方式

フィッシャーの線形判別:群間の差と群内のばらつきの比を最大にする方向

フィッシャーの考え方は、データをある方向 w に射影したとき「2群の平均の差の2乗 ÷ 群内の分散」が最大になる w を探す、というものです。式で書くと (w'(m1 − m2))² ÷ (w' Sp w) を最大にします。m1、m2 は群の平均ベクトル、Sp は併合分散共分散行列です。この最大化を解くと、w は Sp の逆行列 × (m1 − m2) に比例するという答えが出ます。2群の線形判別関数の係数はこの w そのものです。

後で使う与信審査の12件で確かめると、w = Sp の逆行列 × (m1 − m2) のときの比は12.6607でした。ランダムに20万通りの方向を試しても、比は12.6607を超えませんでした。この最大値は2群の重心間のマハラノビス距離の2乗と一致します。定数項は2群の平均の中点で判別得点がちょうど0になるように置き、値が正なら一方の群、負ならもう一方の群と判定します。境界は直線(変数が3つなら平面)なので、群の広がりが直線で切れる形をしているときに素直に当たります。

マハラノビス距離による判別

もう1つの解き方が、各群の重心までの距離を測り、近い方の群へ割り当てる方法です。ここで使うマハラノビス距離は、ユークリッド距離を分散共分散行列の逆行列で補正したもので、(x − m) の転置 × Sp の逆行列 × (x − m) の平方根として定義されます。ばらつきの大きい変数の影響を割り引き、変数同士の相関も考慮するため、単位の異なる変数を同じ土俵で比較できます。

両群で同じ Sp を使い、2群の事前確率を等しく置く限り、マハラノビス距離による判別と線形判別関数による判別は同じ境界を与えます。距離の2乗の差を展開すると線形の式に帰着するためです。群ごとに別々の分散共分散行列を使うとき、または事前確率が等しくないときは、境界がずれて判定が食い違います。

事前確率・誤分類コストによる判別境界の調整

判別分析をベイズの判別規則として見ると、各群の事前確率 π1、π2 が境界の位置を決めます。2群の線形判別では、判別得点が0を超えたら群1、ではなく、ln(π2 ÷ π1) を超えたら群1と判定します。事前確率が等しければ ln(1) = 0 なので、上で述べた「符号で決める」規則に戻ります。正しく分類した損失を0とし、群1を群2とする損失をC21、群2を群1とする損失をC12とすると、群1を選ぶ閾値は ln((C12 × π2) ÷ (C21 × π1)) です。

ここで注意が要るのが、scikit-learnの既定です。priors を指定しないと、学習データの群比率を事前確率に使います。多数群600件・少数群150件(群比0.8対0.2)の人工データで、既定のままと事前確率を0.5ずつにした場合を比べました。以下は学習データへの再代入結果で、未知データに対する性能評価ではありません。

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.metrics import confusion_matrix

rng = np.random.default_rng(42)
cov = [[1, 0.3], [0.3, 1]]
X = np.vstack([rng.multivariate_normal([0, 0], cov, 600),
               rng.multivariate_normal([1.2, 0.8], cov, 150)])
y = np.array([0] * 600 + [1] * 150)

for priors in (None, [0.5, 0.5]):
    lda = LinearDiscriminantAnalysis(priors=priors).fit(X, y)
    print("priors =", np.round(lda.priors_, 2))
    print(confusion_matrix(y, lda.predict(X)))
priors = [0.8 0.2]
[[573  27]
 [103  47]]
priors = [0.5 0.5]
[[446 154]
 [ 40 110]]

既定のままでは少数群150件のうち47件(31.3%)しか拾えません。事前確率を等しくすると110件(73.3%)を拾う代わりに、多数群の誤検知が27件から154件に増えます。正答率だけを見ると既定の方が高く出ます(82.7%対74.1%)。少数群が「延滞」や「陽性」のように見逃すと損失が大きい群なら、見逃しと誤検知の費用、必要な再現率を検証データで比較し、既定の閾値を採用できるか判断します。同じデータで同じ Sp を使ったマハラノビス距離の最近重心判定は、事前確率0.5ずつの結果と750件すべてで一致し、既定とは190件で食い違いました。

二次判別分析へ切り替える判断基準

群ごとに分散共分散行列を分けて推定すると、境界は直線ではなく二次曲線になります。これが二次判別分析(QDA)です。切り替えの判断には、群間で分散共分散行列が等しいかを見るBox の M 検定を使います。ただしこの検定は正規性からのずれに敏感で、サンプルが多いと実務上問題にならない差でも有意になります。検定結果だけで機械的に決めるのは避けてください。

アヤメのデータで両者を同じ5分割交差検証にかけると、線形判別が平均0.98、二次判別が平均0.9667で、線形判別の方が上回りました(scikit-learn 1.9.1、乱数シード0)。二次判別は群ごとに分散共分散行列を持つぶんパラメータが増え、群あたりのサンプルが少ないと過学習側に振れます。群間の分散共分散行列の違いと各群の標本数から二次判別を候補にし、同じ交差検証で線形判別より目的の評価指標が改善するかを確認して選びます。

2群2変数の計算例とExcelでの再現手順

与信審査を模した12件のデータで、判別係数が出るまでの計算を追います。完済群6件と延滞群6件について、年収(百万円)と勤続年数(年)の2変数を使います。

群 年収 勤続年数 群 年収 勤続年数
完済 6.2 4 延滞 3.9 5
完済 5.4 9 延滞 4.5 2
完済 7.1 6 延滞 3.2 7
完済 5.1 11 延滞 4.1 3
完済 6.6 7 延滞 3.6 1
完済 5.9 5 延滞 5.2 6

群ごとの平均は完済が (6.05, 7.00)、延滞が (4.0833, 4.00) です。次に各群の不偏分散共分散行列を求め、自由度で重み付けして併合します。完済群と延滞群のサンプル数がどちらも6なので、重みは (6−1) と (6−1) の等分になり、併合分散共分散行列 Sp は次のようになります。

行列 年収・年収 年収・勤続 勤続・勤続
併合分散共分散行列 Sp 0.5243 −0.6300 6.2000
Sp の逆行列 2.1724 0.2207 0.1837

この逆行列に平均の差ベクトル (6.05 − 4.0833, 7.00 − 4.00) を掛けると判別係数が出ます。定数項まで含めた判別得点の式は次のとおりです。

判別得点 = 4.9347 × 年収 + 0.9853 × 勤続年数 − 30.4214

12件に当てはめると、完済群6件はすべて正の値、延滞群は5件が負の値になりました。誤ったのは延滞群の (5.2, 6) の1件だけで、判別得点は +1.151 と完済側に落ちています。的中率は12件中11件で91.7%です。年収の係数は勤続年数の約5倍ですが、年収は百万円、勤続年数は年という異なる単位なので、この比だけではどちらが群を強く分けているか判断できません。重要度を比べるなら、標準化したデータで係数を求め直すか、後述するSPSSの構造行列を見ます。

Excelの分析ツールに判別分析のメニューは無いので、行列関数で組みます。行列を返す関数の入力方法はバージョンで違います。Microsoft 365 では出力範囲の左上のセルに式を入れてEnterを押すだけで結果が広がります。Excel 2021・2024も動的配列に対応します。動的配列に非対応の旧版では、出力範囲(Sp の逆行列なら2行2列)を先に選択し、左上のセルに式を入力してから Ctrl+Shift+Enter で確定します。

工程 Excelの関数
群ごとの平均 AVERAGE
群ごとの分散・共分散 VAR.S、COVARIANCE.S
併合分散共分散行列 自由度で重み付けして加算
逆行列 MINVERSE
行列の積・転置 MMULT、TRANSPOSE

たとえば Sp を F2:G3、平均の差ベクトルを I2:I3 に置いた場合、逆行列は =MINVERSE(F2:G3)、判別係数は =MMULT(MINVERSE(F2:G3),I2:I3) で求まります。定数項は、2群の平均の中点を K2:K3 に置いて =-MMULT(TRANSPOSE(判別係数の範囲),K2:K3) です。

共分散は COVARIANCE.P(分母が n)ではなく COVARIANCE.S(分母が n−1)を使ってください。今回のように両群のサンプル数が等しい場合、COVARIANCE.P にしても係数と定数項が一律1.2倍(4.9347が5.9216、0.9853が1.1824)になるだけで、判定は1件も変わりません。群ごとの件数が違うと群ごとに縮み方が変わり、係数どうしの比までずれるので、判定が入れ替わることがあります。

新規データの判定とマハラノビス距離での確認

年収5.0・勤続8年の申込者を判定すると、判別得点は +2.134 で完済側です。同じ点のマハラノビス距離は完済群の重心まで1.4544、延滞群の重心まで2.5266で、こちらも完済群に近いという結論になります。年収4.6・勤続3年の場合は判別得点が −4.766、マハラノビス距離は完済群まで3.1730、延滞群まで0.7318で、いずれも延滞側です。距離の値は「どちらの群にどれだけ近いか」という余裕の確認に使えます。判別得点が0に近い申込者は判定を機械に任せず人が見る、という運用の線引きにも使えます。

正準判別分析で取れる軸の本数と寄与率

群が3つ以上になると、群間の違いを表すために複数の判別軸が必要になる場合があります。そこで群間の分散を群内の分散で割った比が最大になる軸を順に取り出すのが正準判別分析(CDA)です。取り出せる軸の本数は min(群の数 − 1, 変数の数) に決まっており、これは統計ソフトの仕様ではなく行列の階数から来る上限です。scikit-learnで上限を超える本数を指定すると、n_components cannot be larger than min(n_features, n_classes - 1). というエラーで止まります。

3群4変数のアヤメのデータ(150件)で確かめると、取れる軸は2本でした。第1軸の寄与率が0.9912、第2軸が0.0088で、群の違いはほぼ第1軸だけで説明できます。群間の分離度を示す正準相関は第1軸が0.9848、第2軸が0.4712、群間の差の有意性に使うWilks のラムダは0.0234でした。これらは群内平方和行列の逆行列と群間平方和行列の積の固有値(32.192と0.285)から導いた値です。正準相関は固有値 λ から sqrt(λ ÷ (1 + λ))、Wilks のラムダは 1 ÷ (1 + λ) の全軸の積として求まり、0に近いほど群がよく分かれています。

軸を取り出す操作は次元圧縮そのものですが、主成分分析の固有値・寄与率・負荷量の読み方とは目的が違います。主成分分析は群のラベルを使わず全体の分散が大きい方向を探し、正準判別分析は群のラベルを使って群を分ける方向を探します。群間の分離を目的に可視化するなら、正準判別分析の第1軸・第2軸が候補になります。ただし、主成分分析でも群が分かれる場合があり、正準判別分析でも明瞭な分離は保証されません。

scikit-learn・R・SPSSでの実装と精度の確かめ方

Pythonでは sklearn.discriminant_analysis.LinearDiscriminantAnalysis を使います。以下はscikit-learn 1.9.1(Python 3.13)で実行したコードと、その出力です。

import numpy as np
from sklearn.datasets import load_iris
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.metrics import confusion_matrix

X, y = load_iris(return_X_y=True)
lda = LinearDiscriminantAnalysis().fit(X, y)
print("判別関数の本数:", lda.transform(X).shape[1])
print("各軸の寄与率:", np.round(lda.explained_variance_ratio_, 4))
print("再代入の正答率:", round(lda.score(X, y), 4))
print(confusion_matrix(y, lda.predict(X)))

cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(LinearDiscriminantAnalysis(), X, y, cv=cv)
print("交差検証の正答率:", np.round(scores, 4), "平均", round(scores.mean(), 4))
判別関数の本数: 2
各軸の寄与率: [0.9912 0.0088]
再代入の正答率: 0.98
[[50  0  0]
 [ 0 48  2]
 [ 0  1 49]]
交差検証の正答率: [1.     1.     0.9667 0.9667 0.9667] 平均 0.98

混同行列は行が正解、列が予測です。1つ目の群は50件すべて正解、2つ目の群は2件が3つ目の群へ、3つ目の群は1件が2つ目の群へ流れており、誤分類は合計3件です。今回の5分割では、再代入と交差検証の平均正答率はいずれも0.98で、大きな乖離は見られませんでした。両者が大きく開くときは過学習を疑います。

正答率は当てずっぽうの水準と比べてください。3群が均等なアヤメのデータなら、何も学習しなくても33.3%は当たります。群の比率が9対1に偏ったデータでは多数派に全部倒すだけで90%になるため、正答率ではなく群ごとの再現率や混同行列を見ます。変数が多く共線性が強い場面では、solver を lsqr か eigen に切り替えて shrinkage を併用します。shrinkage は svd では使えず、指定すると shrinkage not supported with 'svd' solver. で止まります。scikit-learn全体の使い方はScikit-learnとは?読み方・できること・使い方を実行例で解説【1.9.1対応】にまとめています。

scikit-learn 1.9で変わった coef_ と、教科書の判別係数への戻し方

scikit-learn 1.9.1(2026年9月リリース)の変更履歴には、LinearDiscriminantAnalysis と QuadraticDiscriminantAnalysis について「now return the same results when using solver="svd" and solver="eigen"」とあり、svd の正規化が 1/(n_samples − n_classes) から 1/n_samples に変わりました(PR #33626)。分母 n は最尤推定の分散共分散行列で、covariance_ の説明にある「biased estimator of covariance」と同じ側です。

影響は係数の値に出ます。1.9.0 までの svd は分母 n−g で計算しており、この等事前確率の2群例では、符号の向きをそろえると手計算やExcelと一致していました。1.9.1 では、掲載例のように2群が同数で事前確率も等しく、正則化を使わない場合、svd・lsqr・eigen の係数と定数項は、符号をそろえると手計算の n÷(n−g) 倍になります(3群以上の svd は coef_ の表し方が lsqr・eigen と違いますが、判定は同じです)。12件の例を両方の版で実行すると、1.9.0 の svd は (−4.9347, −0.9853)、1.9.1 の svd は (−5.9216, −1.1824) で、ちょうど12÷10の1.2倍でした。倍率が係数と定数項で共通なので判定は変わりません。ただし、版を上げただけで報告書の係数が1.2倍に変わります。

import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

X = np.array([[6.2, 4], [5.4, 9], [7.1, 6], [5.1, 11], [6.6, 7], [5.9, 5],
              [3.9, 5], [4.5, 2], [3.2, 7], [4.1, 3], [3.6, 1], [5.2, 6]])
y = np.array([0] * 6 + [1] * 6)  # 0=完済, 1=延滞
n, g = len(y), 2

lda = LinearDiscriminantAnalysis(solver="svd").fit(X, y)
print("coef_:", np.round(lda.coef_, 4), "intercept_:", np.round(lda.intercept_, 4))
# 教科書の判別係数(分母 n−g)へ戻す:符号を反転し (n−g)/n を掛ける
print("教科書の係数:", np.round(-lda.coef_[0] * (n - g) / n, 4),
      "定数項:", np.round(-lda.intercept_[0] * (n - g) / n, 4))
coef_: [[-5.9216 -1.1824]] intercept_: [36.5056]
教科書の係数: [4.9347 0.9853] 定数項: -30.4214

2群では coef_ が1行だけ返り、符号は手計算と逆になります。scikit-learnが2つ目の群(ここでは延滞)を正に取る規約によるもので、判定そのものは同じです。この2群の svd では、事前確率を変更しても、係数は符号をそろえて (n−g)÷n を掛ければ、掲載した手計算の係数に戻せます。一方、lsqr・eigen では、priors を学習データの群比率と異なる値にすると共分散行列の重みが変わるため、一般には同じ定数倍で戻せません。定数項は、事前確率が等しいときだけ同じ換算で戻ります。等しくないときは事前確率の対数比の項が加わるためです。QDA も同じ変更で、群ごとの共分散が分母 n_k になりました(アヤメの1つ目の群のがく片長の分散は、1.9.0の0.12425が1.9.1では0.12176)。

RのMASS::ldaで同じ分析をする手順

Rでは推奨パッケージのMASSに入っている lda() を使います。R 4.6.1・MASS 7.3-66 で、アヤメのデータを分析した結果です。

library(MASS)
fit <- lda(Species ~ ., data = iris)
print(round(fit$svd^2 / sum(fit$svd^2), 4))
print(table(iris$Species, predict(fit)$class))

cv <- lda(Species ~ ., data = iris, CV = TRUE)
cat("一個抜き交差検証の正答率:", mean(cv$class == iris$Species), "\n")
[1] 0.9912 0.0088
             setosa versicolor virginica
  setosa         50          0         0
  versicolor      0         48         2
  virginica       0          1        49
一個抜き交差検証の正答率: 0.98

寄与率はscikit-learnと同じ 0.9912・0.0088 です。print(fit) で表示される「Proportion of trace」がこの値にあたります。CV = TRUE を付けると一個抜き交差検証の判定結果が返り、正答率は0.98でした。prior を省略すると学習データの群比率が事前確率になる点はscikit-learnと同じで、predict() は判定結果の class、事後確率の posterior、判別得点の x を返します。12件の例を lda() にかけると、判別係数(scaling)は (−1.3868, −0.2769) でした。手計算の (4.9347, 0.9853) と比が同じ(約5.01対1)で、群内分散が1になるように縮めた値です。判別軸の符号には任意性があり、群の並び順だけでは決まりません。係数と判別得点の符号を一緒に反転しても分類結果は変わりません。

SPSSの操作手順と出力表の読み方

SPSSでは[分析]→[分類]→[判別分析](英語版は Analyze > Classify > Discriminant)で開き、グループ化変数に群のラベル、独立変数に説明変数を指定します。変数の投入方法は、全変数を同時に入れる「Enter independents together」と、変数を順に出し入れする「Use stepwise method」の2択です。ステップワイズ法の基準には、全体のWilks のラムダを最も小さくする変数を入れる WILKS、最も近い2群間のマハラノビス距離を最大にする変数を入れる MAHAL などがあり、シンタックスの METHOD サブコマンドで選びます(既定の DIRECT は同時投入)。

DISCRIMINANT コマンドの説明による既定出力のうち、ここでは次の4つの表を取り上げます。

出力表 読むところ 本記事の対応箇所
固有値 分散の%・正準相関 寄与率0.9912・正準相関0.9848
Wilks のラムダ ラムダ・カイ2乗・有意確率 Wilks のラムダ0.0234
標準化された正準判別関数係数 変数ごとの重み 単位を揃えた判別係数
構造行列 判別関数と各変数の群内相関 本記事では未計算

Box の M(群間で分散共分散行列が等しいかの検定)、分類関数係数(COEFF)、非標準化係数(RAW)、分類結果の表(TABLE)、交差検証の分類結果(CROSSVALID)は、[統計量]と[分類]のダイアログで追加して初めて出ます。変数の効き方を読むときは、標準化係数より構造行列を優先してください。説明変数どうしの相関が強いと標準化係数の符号は反転することがありますが、構造行列は各変数と判別得点の相関なので、こうした反転が起きにくいからです。

判別分析の前提条件と適用を避ける条件

判別分析の結果が信用できるかは、係数を見る前に前提を確かめたかで決まります。確認するのは、各群の説明変数が正規分布から大きく外れていないか、群間で分散共分散行列が近いか、説明変数同士が強く相関していないかです。前の2つが崩れると判定の境界そのものがずれ、最後の1つが崩れると係数の値が不安定になります。

相関の強さは特に見落とされます。相関の強い変数を同時に入れると、判別係数の符号が実務感覚と逆になったり、データを少し入れ替えただけで係数が大きく振れたりします。上の12件の例では、併合分散共分散行列から求めた年収と勤続年数の相関は −0.3494 で、今回求めた係数は両方とも正でした。ただし、この相関値と1回の推定結果だけでは係数の安定性までは確認できません。強く相関する変数を同時に使うと係数が不安定になる場合がありますが、相関係数だけで符号反転の有無は判断できません。分散拡大係数(VIF)で確認し、片方を落とすか、主成分分析で次元を落としてから判別する方が安定します。

判別分析を選ばない方がよい場面もはっきりしています。説明変数の大半がカテゴリ変数のときは正規分布の仮定が成立しないので、ロジスティック回帰か決定木系の手法を使ってください。群の境界が曲線や入れ子構造になっているときも、線形判別では原理的に届きません。この場合は二次判別か、非線形の写像を挟むカーネル法の仕組みとカーネル関数の種類の適用が候補になります。正則化しない通常の二次判別では、いずれかの群のサンプル数が説明変数の数以下だと標本共分散行列が特異になり、通常の逆行列を使う判別式を計算できません。変数を減らすか、データを集め直すのが先です。判別分析で足りない精度が求められる予測モデルでは、手法の選定から機械学習モデル開発として組み直す方が早い場合もあります。

よくある質問

判別分析とクラスター分析の違いは何ですか?

グループのラベルが既知かどうかが違いです。判別分析はラベル付きの学習データから分ける式を作る教師あり手法、クラスター分析はラベルの無いデータを似たもの同士で束ねる教師なし手法です。クラスター分析で作った群をラベルにして判別分析にかけると、どの変数がその群を分けているかを係数で説明できます。ただし同じデータからラベルを作っているので、このとき出る正答率は分類性能の証拠になりません。

判別分析とロジスティック回帰分析の違いは何ですか?

置いている前提が違います。確率モデルとしての線形判別分析(LDA)は、各群内で説明変数が多変量正規分布に従い、群間で分散共分散行列が等しいと仮定します。ロジスティック回帰はこの仮定を置かず、所属確率を直接モデル化します。見逃しと誤検知の比率は、どちらの手法でも調整できます。ロジスティック回帰は出力確率の閾値を0.5から動かし、判別分析は事後確率や判別得点の閾値を動かすか、事前確率・誤分類コストを指定します。

Excelで判別分析をするにはどうすればよいですか?

分析ツールに判別分析のメニューは無いため、行列関数で組みます。VAR.SとCOVARIANCE.Sで群ごとの分散共分散行列を出して自由度で併合し、MINVERSEの逆行列にMMULTで平均の差ベクトルを掛けたものが判別係数です。定数項は判別係数と2群の平均の中点の積に負号を付けた値です。群ごとのCOVARIANCE.SをCOVARIANCE.P(分母 n)に置き換え、同じ自由度の重みで併合すると、群の件数が異なる場合には判別境界や判定が変わることがあります。

正準判別分析と線形判別分析は何が違いますか?

正準判別分析は、群を最もよく分ける軸を min(群の数 − 1, 変数の数) 本まで順に取り出す枠組みで、群が3つ以上あるときの分離軸の抽出と可視化に使います。線形判別分析は、その軸を使って所属先を判定する分類の側面を指します。実装上は同じクラスで、scikit-learnでは transform が正準判別分析の軸への射影、predict が分類に対応します。2群のときは軸が1本しか取れないため、両者を区別する必要はほとんどありません。

「判別」と「判定」「識別」はどう違いますか?

判別は、性質の違いによって対象がどの種類に属するかを見分けることで、判別分析の「判別」はこの意味です。判定は、基準に照らして合否や可否などの結論を下すことを指します。判別分析の流れでいえば、判別得点を計算して所属先を見分けるのが判別、その結果をもとに「融資する・しない」を決めるのが判定にあたります。識別はパターン認識、分類は機械学習の分野で同じ問題を指すときによく使われる語ですが、使われる範囲は文脈によって重なり、英語の用語とも一対一には対応しません。

関連記事

お気に入りに入れた記事の一覧

一創の公式 SNS

X では毎朝の新着記事と IT ニュースの速報を、YouTube・TikTok・Instagram・LinkedIn・Facebook では記事の解説動画を配信しています。

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.11.09 テックブログ エディオン不正アクセス第2報:カード番号の対象確認とログ・決済画面の改ざん対策
  2. 2026.11.09 テックブログ LANSCOPE不正アクセス第2報:製品への影響と偽連絡の確認、停止中のライセンス認証の窓口
  3. 2026.11.10 テックブログ Claude Fable 5.2とは:料金・破壊的変更4点とFable 5.1からの移行手順【2026年11月】
  4. 2026.11.10 テックブログ ニトリの情報漏洩:最大3,762万件の対象確認となりすまし連絡の見分け方
  5. 2026.11.09 テックブログ ステップゴルフ不正アクセス:口座情報の対象確認と偽連絡・引き落としの注意点

RELATED POSTS 関連記事

目次