ジャッカード係数

二つの集合がどのくらい似ているのか表す指標である、ジャッカード係数(Jaccard index)を紹介します。

Wikipedia: Jaccard index

これは二つの集合$A, B$に対して、その共通部分の元の個数を、和集合の元の個数で割ったものです。
$A, B$のジャッカード係数$J(A, B)$を数式でと次のようになります。

$$
J (A, B) = \frac{|A \cap B|}{|A \cup B|}
$$
単に共通部分の大きさを数えるだけでなく、和集合の元の個数で割ることにより正規化していることがポイントです。
定義から明らかに、 $0\leq J (A, B) \leq 1$ であり、二つの集合に交わりが大きいほど値が大きくなります。
また、二つの集合がどちらも空集合の時は$1$と定義するそうです。(これは知らなかった)
空集合同士で等しいからそれを表現するためと考えると納得です。

よく似た概念に、ジャッカード距離(Jaccard distance)があります。
距離なので、二つの集合が似てるほど値が小さくなって欲しく、差が大きいほど値が大きくなって欲しいので、次のように定義されています。
$$
d_J(A, B) = 1 – J (A, B) = \frac{|A \cup B| – |A \cap B|}{|A \cup B|}
$$

自分はこれを自然言語処理で使うことが多くあります。
テキストを単語の集合としてテキストの類似度を測ったり、
単語を文字の集合として単語の類似を測ったりですね。

チェビシェフの不等式

たまには何か統計学の話題をだそう、と言うことでチェビシェフの不等式を紹介します。

確率変数$X$に対して、$\mu=E(X)$, $\sigma^2=V(X)$とすると、次の不等式が成立します。
$$
P(|X-\mu|\geq k\sigma) \leq \frac{1}{k^2}
$$

この式の便利さはどんな確率変数についても成立する点にあります。

もっとも、確率変数が従う分布がわかっていれば、これよりはるかに正確に見積もることができます。
ただ、実際の運用上、これは正規分布だとかこれは一様分布だとか何かしら保証されていることは稀で、
正確な分布はわからないけど、標本平均と標本分散だけは取れてて、
平均から大きく外れる確率をざっくり見積もりたいと言う場面は実際にあるのでそのような時に使えます。
(分布の大まかな形から正規分布だとか仮定してしまうことも多いのですが。)

参考文献 : 基礎統計学Ⅰ 統計学入門 (東京大学出版会) P104 5.4 チェビシェフの不等式

scipyで手軽にカイ二乗検定

業務でカイ二乗検定を行う場面は、割と多くあります。
自分の場合は、ABテストの評価で使うことが多いです。

Excelでも自分でコードを書いてでもさっとできるのですが、
scipyに専用の関数が用意されているのでその紹介です。

scipy.stats.chi2_contingency

これを使うと、引数にデータのクロス表を放り込むだけで、
カイ二乗値、p値、自由度、期待度数表を一発で算出してくれます。
3つの値と、期待度数がarray形式ではいったタプルが戻るので、引数を4つ用意して受け取ると便利です。


import pandas as pd
from scipy.stats import chi2_contingency

# 検定対象のデータ(サンプルなので値はダミー)
df = pd.DataFrame([[300, 100], [800, 200]])

chi2, p, dof, expected = chi2_contingency(df, correction=False)

print("カイ二乗値:", chi2)
print("p値:", p)
print("自由度:", dof)
print("期待度数:", expected)

# 以下出力
カイ二乗値: 4.242424242424244
p値: 0.03942583262944296
自由度: 1
期待度数: [[314.28571429  85.71428571]
 [785.71428571 214.28571429]]

このようにめんどな手間がなく一瞬で検定ができました。
ちなみに、
correction=False
はイエーツの修正を”行わない”設定です。
デフォルトがTrueなので注意してください。