概要
ライブラリ等で、検定を行った際の出力結果がNaNやnanと表示される時の対処法について説明します
例えば、以下のコードのようなウェルチのt検定(平均値の差の検定)を実行したとします
# 検定したい列
column = "column1"
# グループ1とグループ2の標本データ
group1 = df1[column]
group2 = df2[column]
# ウェルチの検定を行う 等分散でない(equal_var = False),
t, p = ttest_ind(group1, group2, equal_var=False)
# t値とp値を表示する
print("t値: ", t)
print("p値: ", p)
出力結果
t値: nan
p値: nan
すると、出力結果がnanと表示され、どうやらおかしいです
t値やp値は数値で表されるべき値です
今回はこれの対処法を解説します
対処法
この原因は、入力値の中にnanが含まれていることです
これが最も起こりやすく多い原因です
その場合は、先ほどのコードをこのように書き換えます
`変更前`
# グループ1とグループ2の標本データ
group1 = df1[column]
group2 = df2[column]
`変更後`
# グループ1とグループ2の標本データ
group1 = df1[column].dropna()
group2 = df2[column].dropna()
こうすることによって、事前にnanの含まれる部分が除外され、出力結果が正しくなります
結論
- nanが入っていると検定はできない
- 対処法
- 入力データからnanを取り除く(データフレームなら
.dropna()
をつける)
- 入力データからnanを取り除く(データフレームなら
- 対処法
余談
ttest_ind
にはnan_policy
というパラメータがあり、nanがあった場合の対応を指定できる
- nan_policy = 'propagate'(デフォルト)
- nanを返す
- nan_policy = 'raise'
- エラーを返す
- nan_policy = 'omit'
- nanを無視して計算する
- しかし、一部使えない検定があるため注意が必要
余談は以下のサイトを参考にしました