Pythonで実行する2要因分散分析

# １．はじめに
実験結果の解析の際，統計検定で2要因分散分析を行う必要が生じました．
一般的にはRを使用すると思われますが，統計解析パッケージPingouinを用いることでPythonでも2要因分散分析が可能であるとわかりました．
そこで，その記録のために本記事を作成した次第です．
是非参考にしていただければと思います．

# ２．2要因分散分析とは
2要因分散分析とは分散分析の内の一つで，詳しい分類は次の通りです．
分かりやすい分類表がありましたので引用させて頂きました[^1]．

[^1]:https://kyoto-edu.sakura.ne.jp/?&year=2024&semester=none&id=excel&course=statistics&content=anova

<table border="1">
  <caption>分散分析の種類</caption>
  <thead>
    <tr>
      <th>分析深度</th>
      <th>要因間</th>
      <th>要因数</th>
      <th>等分散性</th>
      <th>その後の検定</th>
    </tr>
  </thead>
  <tbody>
    <tr><tr>
      <td rowspan="3">要因分析<br>Factorial</td>
      <td rowspan="3">独立したデータ</td>
      <td rowspan="2">一元配置</td>
      <td>Fisher-前提</td>
      <td>多重比較(Tukey-Kramer)</td>
    </tr>
    <tr>
      <td>Welch-前提とせず</td>
      <td>多重比較(Games-Howell)</td>
    </tr>
      <td>二元配置<br>Two-way</td>
      <td>前提</td>
      <td>交互作用→単純主効果検定<br>主効果→多重比較</td>
    </tr>
    <tr>
      <td rowspan="2">反復測定<br>Repeated-Measures</td>
      <td rowspan="2">対応あるデータ</td>
      <td>一元配置</td>
      <td>-</td>
      <td>多重比較(Tukey-Kramer)</td>
    </tr>
    <tr>
      <td>二元配置</td>
      <td>-</td>
      <td>交互作用→単純主効果検定<br>主効果→多重比較</td>
    </tr>
  </tbody>
</table>

### 独立 vs 対応
簡単に分散分析と言っても反復測定分散分析と要因分散分析の二つがあります．
2つの分散分析手法はデータが独立or対応という2つの観点から分類されています．
一元配置・二元配置の場合は次の例のように分類されます．


__例１：一元配置__
__対応のあるデータ__：全員（被験者20名）に「対面授業」と「オンライン授業」を行わせる
　[要因：授業（水準：対面授業/オンライン授業）]
__独立したデータ__：被験者の内，10名が「対面授業」・10名が「オンライン授業」を行わせる
　[要因：授業（水準：対面授業/オンライン授業）]

__例２：二元配置__
__対応のあるデータ__：アルコールの摂取量とタスクの難易度が成績に与える影響
　[要因１：アルコールの摂取量（水準：低/高），要因２：タスクの難易度（水準：易/難）]
__独立したデータ__：教育方法と性別がテストスコアに与える影響
　[要因１：教育方法（水準：学校教育/eラーニング），要因２：性別（水準：男/女）]
 


### 2要因分散分析の検証（その後の検定）
2要因分散分析の結果を確認する際は，先ず交互作用の検定結果を確認します．

__交互作用が有意である場合__
水準ごとの効果の大きさを検定する　-> 単純主効果の検定
__交互作用が有意でない場合__
要因ごとの主効果を確認する

より詳しい説明は以下のサイトから確認されることをお勧めします．
[統計で転ばぬ先の杖](https://www.hituzi.co.jp/hituzigusa/2018/08/09/toukei-6/)




# ３．Pingouinで2要因分散分析を実行する
本記事の本題に入ります．
Pythonで2要因分散分析を行うためにはやや煩わしい方法をとる必要がありますが，Pingouinという統計解析パッケージを使用すると簡単に行うことができます．

PingouinはPython 3 パッケージで現在 Python 3.8 ～ 3.11 で動作が確認されているそうです．
またPingouinの依存関係にPandasが含まれていることから，多くの人にとって検定に使用しやすいものと思われます．

[Pingouinのホームページ](https://pingouin-stats.org/build/html/index.html)

私は今回Pingouinを使って解析を行いましたが，エクセルファイルをデータフレームに格納してから行う方法について説明します．

インストール
---
```
pip install pingouin
```

解析の実行
---
```
import pingouin as pg   #検定解析に用いるパッケージ
import pandas as pd     #エクセルファイルの読み取りのために必要なパッケージ

df = pd.read_excel('エクセルファイルの名前かファイルパス')


anov = pg.mixed_anova(data=df, dv='従属変数', between='群間要因', within='群内要因', subject='被験者', correction=False, effsize="np2")

print(anov)

#dvには従属変数の列名を記述
#betweenには群間要因の列名を記述
#withinには群内要因の列名を記述
#subjectには被験者の列名を記述

```
エクセルファイルの表形式は以下のようになっています．Pingouinで使用するデータフレームはRで使用するデータフレームと形式が異なる点に注意してください．
ここでは上述の例として「教育方法と性別がテストスコアに与える影響」に関するデータフレームをExcelファイルで簡単に作成しました．

| 被験者 | 群間要因 |　群内要因 | 従属変数（テストスコア） |
|:-:|:-:|:-:|:-:|
| A |  男 |  学校教育 | 90  |
| B  |  男 |  eラーニング | 80 |
| C  | 女  | eラーニング  | 77  |
| D  | 男  | eラーニング  | 69  |
| E  |  女 | 学校教育  | 80  |
| F  |  女 | 学校教育  | 88 |

（今回作成したデータフレームは例として作成したものですので，ご自身でデータフレームを作成してください．）

またpg.mixed_anova()の引数は以下の通りです．

dv：従属変数の列名を記述
between：群間要因の列名を記述
within：群内要因の列名を記述
subject：被験者の列名を記述
correction : Greenhouse-Geisser補正の有無
　　auto : デフォルト値。Mauchlyの球面性検定を行い、p値を修正するか判断される。
　　True : する
　　False : しない
effsize :
　　"np2" : 偏イータ二乗 (デフォルト値)
　　"n2"  : イータ二乗
　　"ng2" : 一般化イータ二乗

>参考記事
https://qiita.com/ttttpzm/items/d91c0f4d7fd07f1529ff