Pythonで 一要因分散分析をやってみた【心理統計】

さて、今回は一要因分散分析をPythonで実行してみたいと思います。

細かくいうと、対応のない (被験者間計画の) 一要因分散分析となります。

Pythonで一要因分散分析を実施する

データアップロード

import numpy as np
import pandas as pd

data = {"実験条件1":  [43, 29, 50, 40, 45, 53, 39, 45, 35, 45, 50, 51], 
        "実験条件2":  [50, 40, 51, 49, 46, 51, 37, 44, 42, 44, 55, 60], 
        "統制条件": [29, 27, 34, 43, 37, 43, 48, 44, 29, 31, 40, 45]}
df = pd.DataFrame(data, index = ["ID" + str(i + 1) for i in np.arange(12)])
df.head(3)

今回は上記のようなデータを使用します。

 

グラフを図示してみる

from matplotlib import pyplot as plt

condition1 = df["実験条件1"]
condition2 = df["実験条件2"]
control = df["統制条件"]

# 横軸
horizontal_axis = np.array(["condition1", "condition2", "control"])
# 縦軸
vertical_axis = np.array(np.mean(df))
# エラーバー
error_bar = np.array(np.std(df) / np.sqrt(12))

plt.bar(horizontal_axis, vertical_axis, yerr = error_bar, ecolor="black", capsize=5)
plt.xlabel("condition")
plt.ylabel("score")

横軸は条件 (condition), 縦軸は得点 (score), エラーバーは標準誤差を示しています。

グラフを見る限りでは、condition1ーcontrolの間とcondition2ーcontrolの間に差がありそうですね。

 

一要因分散分析を行う

from scipy import stats as ss
f, p = ss.f_oneway (df["実験条件1"], df["実験条件2"], df["統制条件"])
print("F値 = %(f)s" %locals())
print("p値 = %(p)s" %locals())

出力結果:

F値 = 6.200

p値 = 0.005

 

一要因分散分析を行ったところ、条件の主効果は有意であることがわかりました 。

では、どこの条件間で差があるのか見てみましょう。

TukeyのHSD法を用いて、多重比較を行います。

 

多重比較

Pythonで分散分析 (対応なし・一元配置)」のサイトを参考にしました。

def tukey_hsd( ind, *args ):
    # 第1引数:名称のリスト(index), 第2引数以降: データ (*args: 複数の引数をタプルとして受け取る)
    from statsmodels.stats.multicomp import pairwise_tukeyhsd

    data_arr = np.hstack( args ) 
    ind_arr = np.array([])

    for x in range(len(args)):
      ind_arr = np.append(ind_arr, np.repeat(ind[x], len(args[x]))) 

    print(pairwise_tukeyhsd(data_arr,ind_arr))

 

上記の関数を使って、多重比較してみます。

tukey_hsd(list('ABC') , condition1, condition2, control)

結果、BーC  (condition2ーcontrol) の間でのみ有意な差がありました (p = .004)。

 

こんな感じですかね。

心理統計に必要な情報はとりあえず出力できたでしょうかね (F値の自由度とか偏ηをつけれなくてすまん…)。

ということで以上です。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です