税理士目指す人のブログ

筋トレや読書のことをはじめとして、プログラミングその他日常生活における様々なことについて書いていきます。

Output Blog

主に筋トレ・プログラミングについて書きます

Pythonでマクネマー検定を行う方法【プログラミング】

スポンサーリンク



"Pythonでマクネマー検定を行う方法【プログラミング】"
Pythonでマクネマー検定を行う方法を知りたいですか?
Googleのサジェストには「マクネマー python」とか出てくるにも関わらず、日本語の記事は全く存在しなかったので僕が書きたいと思います。
本記事では、マクネマー検定の概要およびPythonで行う方法を解説します。
是非ご覧下さい。


マクネマー検定とは

マクネマー検定は様々な研究に使われています。
共通のデータに対して、2つの手法やシステム間に統計的な有意差があるかどうかを調べます。

今回は自然言語処理を例にとります。
例えば以下のようになります。

システムA正解 システムA不正解
システムB正解 32 25 57
システムB不正解 10 33 43
42 58 100

このとき、システムAの正解率(精度)は42%、システムBは57%ということになります。
単純な精度ではシステムBが優位に思えますが、統計的な観点からも検定する必要があります。
これを行うのがマクネマー検定です。

この場合、

  1. 有意仮説 : 2つのシステムは有意差がある
  2. 帰無仮説 : 2つのシステムは差がない

として、有意差を確認します。
この時、考えるのは2つのシステムでどちらか一方のみ正解となった35事例です。
帰無仮説が成立するとすると、この35事例は2つのシステムどちらかで50%の確率で正解します。
よって片方のシステムの成功数の確率分布は、確率0.5の二項分布に従います。
これを数式で表せば、

p = 2 \times \sum_{k=0}^10 \frac{{}_{35} C_k}{2^{35}} \approx 0.0167

となります。
有意水準を5%で考えれば、帰無仮説を棄却。
よって2つのシステム間に有意差があるとなります。

有意水準を1%で考えれば、帰無仮説を採択です。
2つのシステム間には差がありません。


以上の流れが、マクネマー検定となります。


pythonでマクネマー検定を実装する方法

statsmodelsを使います。

import numpy as np
from statsmodels.stats import contingency_tables

ar = np.array([[32,25],[10,33]])
a = contingency_tables.mcnemar(ar).pvalue
print(a)

出力

0.01667384780012073

2 × 2の行列を入力します。これでpの値が得られます。


パラメーターは以下です。

statsmodels.stats.contingency_tables.mcnemar(table、exact = True、correction = True

exactはデフォルトでTrue、Trueの場合は二項分布、Falseの場合はカイ二乗分布です。
correctionはexactがFalseの場合のみ適用されます。カイ二乗分布に連続性の補正を加えます。

上記では、.pvalueを使っています。
デフォルト出力は、Bunchクラスが出力されます。
これはほとんど辞書だと思ってもらって構いません。

出力には、pvalueとstatisticがあります。
pvalueはそのままPの値、statisticはexactがFalseの場合にはカイ二乗統計量です。
Trueの場合は、上記の例の場合、25と10の小さいほうが与えられます。


まとめ

いかがでしたか?
本記事では、Pythonでマクネマー検定を行う方法をまとめました。
日本語記事が全くないと思うので参考にしてくださいね。

スポンサーリンク