目標1で見た通り、2×2行列の行列式の値は平行四辺形の面積と等しくなります。そして、ベクトルの位置関係によっては負になることもあります。これをうまく使えば、いびつな形の面積も求められます。検算しやすいように簡単な例で見てみます。図3に示す図形の面積を求めてみましょう。
行列式の値は平行四辺形の面積なので、その半分が三角形の面積です。そこで、頂点を反時計回りに2つずつ並べた、以下のような行列を作ります。(3,2)と(1,4)、(1,4)と(−1,2)、(−1,2)と(1,2)を列ベクトルとした行列にすればいいですね。
これらの行列式を求め、全て足して2で割れば答えが求められます。
早速やってみましょう。手計算でも簡単ですが、コードを書いて確かめてみます。これまでの知識だけで、リスト4のように書けますね。
import numpy as np
A = np.array([[3, 1],
[2, 4]])
B = np.array([[1, -1],
[4, 2]])
C = np.array([[-1, 1],
[2, 2]])
print((np.linalg.det(A) + np.linalg.det(B) + np.linalg.det(C)) / 2)
# 出力例:
# 6.0
なぜこのようになるのかは、次の図4を見れば明らかですが、念のため動画での解説も用意してあります。確実に理解したい方はぜひご視聴ください。
図4 行列式の和でいびつな形の面積が求められる理由ここまでで、行列式の計算方法と考え方、簡単な応用例を見てきました。以下、本筋から少し外れた長めのコラムをはさみます(が、行列式の図形的な理解とつながるお話です)。固有値や固有ベクトルのお話に進みたい方は、コラムを飛ばしてこちらに進んでください。
目標1で見た行列Aの要素はずいぶんと大きな値でしたね。それらの値はいったい何だったのでしょうか。実は、表1のような2×2分割表の値です。
| 好き | 嫌い | 合計 | |
|---|---|---|---|
| 関西人 | 50 | 18 | 68 |
| 関東人 | 24 | 22 | 46 |
| 合計 | 74 | 40 | 14 |
2×2分割表の値(合計は除いた部分)を行列Aとして表すと、χ2検定(独立性の検定)で使われる検定統計量Tと呼ばれる値が以下の式で求められます。χ2は「カイジジョウ」と読みます。
のとき、nを総合計として、
詳細については省きますが、Tの値は、理論的には自由度1のχ2分布(図5)に従う(その確率分布から得られる値である)ことが分かっています。そこで、実際に得られたデータからTの値を求め、それに対するχ2分布の右側確率(P値)が5%(=0.05)よりも小さければ、芸人の好き嫌いと回答者の出身地には関係があると判断します。
図5 自由度1のχ2分布と右側確率(1)式をよく見てみましょう。分子の一部に行列式の公式と同じものがありますね。
コードを書いてTの値と右側確率Pの値を求めてみましょう。
import numpy as np
from scipy import linalg
from scipy.stats import chi2
A = np.array([[50, 18],
[24, 22]])
n = np.sum(A)
ab_cd = np.prod(np.sum(A, axis=0))
ac_bd = np.prod(np.sum(A, axis=1))
t = n*linalg.det(A)**2 / (ab_cd*ac_bd)
p = chi2.sf(t, df=1)
print("検定統計量:", t)
print("P値:", p)
# 出力例:
# 検定統計量: 5.494134927766641
# P値: 0.019080365467678974
リスト5の結果を見ると、P=0.019<0.05なので、芸人の好みと回答者の出身地域には関係がある、ということになります。
実際のところ、ad−bcを求めるのは大した手間ではないので、わざわざ行列式を使うほどのことではありません。また、(1)式は2×2分割表のときにしか使えないので、簡便ですが汎用性には欠けます。さらに言うなら、(1)式を基にTの値を計算しなくても、scipy.statsモジュールのchisquare関数を使えば、配列を指定するだけでχ2検定ができてしまいます(リスト6)。
import numpy as np
from scipy import linalg
from scipy.stats import chi2_contingency
A = np.array([[50, 18],
[24, 22]])
print(chi2_contingency(A, correction=False))
# 出力例:
# (5.494134927766641, 0.019080365467678974, 1, array([[44.14035088, 23.85964912],
# [29.85964912, 16.14035088]]))
長々とお話をしてきましたが、chi2_contingency関数を使えば簡単にできることをなぜ回りくどくやってきたかというと、行列式の図形的な意味を知っていると、Tの値を求める式が実感を持って理解できるようになるからです。(1)式に説明を加えた(2)式をもう一度見てみましょう。
縦横の合計や総合計が変わらないのであれば、nや分母は変わりません。変わるのは行列式の部分だけなので、そこに注目します。すると、行列式の値が小さければTの値も小さくなることが分かります。図5で見た通り、Tの値が小さくなるとP値は大きくなります(「関係がある」とは言いにくくなります)。例えば、行列式の値が0の場合の例としてはリスト2で見た以下のようなものがあります。
この場合、列ベクトルの(10,20)と(20,40)は、原点から引いた同一直線上にある点です。ということは平行四辺形を作ることができません。従って、平行四辺形の面積は0となり、行列式の値も0になるわけです。その場合、(2)式の値も0となり、Pの値は1(=100%)になります。芸人さんの好き嫌いの表に当てはめて言えば、「回答者の出身地に関係なく、好き嫌いの割合は1:2になっている」ということです。
実は、χ2分布というのは分散の分布で、(2)式の行列式の部分は、実際の値と理論値(期待値)との差のばらつき(分散)を反映した値になっています。分散が0ということは「関係がない場合にはこうなる」という理論値と一致するということです。分散が大きくなるということは、実際の値と理論値とのズレが大きいということですね。
行列式の求め方そのものからはずいぶんと離れてしまいましたが(実用面でも行列式をあまり役立てられない話でしたが)、一見関係のなさそうな話であっても、同じ形の式が現れてきた場合には別の領域の知識が利用できることがあります。あるいは本質的に同じだったということもよくあります……というお話でした。
Copyright© Digital Advantage Corp. All Rights Reserved.