PR

Python初心者でも分かる一次元配置の分散分析(ANOVA):Statsmodelsを活用しよう

python
記事内に広告が含まれています。

はじめに

データのパターンや関連性を理解するために統計分析を使うことは多いと思います。最も頻繁に利用されるのは2群間での平均の差の検定だと思いますが、いつも2群間での比較検討ばかりではありませんよね。時には3群以上の比較検討が必要な場合もあると思います。そんな時、力を発揮してくれるのが、一元配置分散分析(ANOVA)です。一次元配置分散分析(ANOVA)は、異なるグループ間の平均値比較を分散を使うことによって、統計的な有意差を検出するための手法です。

本記事では、PythonのパッケージであるStatsmodelsを使って、一次元配置分散分析を行う方法について解説します。さらに、初心者でも理解しやすいように、具体的なコード例を交えながら説明していきます。

一元配置分散分析(ANOVA)の基本

一元配置分散分析は、1つの説明変数に対して、複数のグループ(群)間での平均値に統計的な差があるかどうかを検定します。具体的な例を通じて、一元配置分散分析の基本的な概念を説明します。

例えば、ある薬の効果を検証するために、3つのグループに対してそれぞれ異なる薬を投与し、その効果を測定したいとします。3つのグループは、「薬A」、「薬B」、「薬C」としましょう。(※各グループ被験者数が異なっていても構いません。)

仮説:

  • 帰無仮説(H0): グループの平均値に統計的な差はない。
  • 対立仮説(H1): 少なくとも1つのグループの平均値は他のグループと統計的に異なる。

となりますね。

一元配置分散分析の詳しい解説については下記のLINKを参照にしてください。

PythonのStatsmodelsを使って簡単に一元配置分散分析を求める

では、統計学的な分散分析の説明は脇に置いておいて、早速Statsmodelsを使ってANOVAを求めていきましょう。

Statsmodelsのインストール:

まず最初に、Statsmodelsパッケージをインストールする必要があります。以下のコマンドを使用して、簡単にインストールすることができます。

pip install statsmodels

もし、Jupyter Notebook上でライブラリーをインストールする場合は下のように「!pip」とpipの前に「!」を追加して「Shift + Enter」すればOKです。

!pip install statsmodels

サンプルデータの準備:

データの準備:
一次元配置の分散分析を行うためには、それぞれのグループに属するサンプルの値を含む配列データを準備する必要があります。また、各グループのサンプル数は同じである必要はありません。

例えば、ほぼ同じ学力レベルに振り分けられた中学1年生3クラスがあり、以下の表のような数学テスト結果が得られたとします。それぞれの異なる数学教師が授業を受け持っている場合、これらの3クラスの成績と教師の指導方法に差があるのでしょうか?

class_Aclass_Bclass_C
958368
918975
898579
908974
998175
888981
969073
988277
958480
各クラスの数学テスト得点

上のサンプルデータをpythonコードで書くと、

import numpy as np
import pandas as pd

class_A = np.array([95, 91, 89, 90, 99, 88, 96, 98, 95])
class_B = np.array([83, 89, 85, 89, 81, 89, 90, 82, 84])
class_C = np.array([68, 75, 79, 74, 75, 81, 73, 77, 80])

# データを結合する
data = np.concatenate([class_A, class_B, class_C])

# グループのラベルを作成
labels = ['class_A'] * len(class_A) + ['class_B'] * len(class_B) + ['class_C'] * len(class_C)

# データとラベルからデータフレームを作成
df = pd.DataFrame({'data': data, 'group': labels})

いきなり分散分析に進むのではなく、データを視覚的に確認しましょう

import seaborn as sns

sns.boxplot(x="group", y="data", data=df)

上のコードを実行すると箱ひげ図が作成されます。

う~ん。見るからに各クラスの数学の点数には差があり、指導方法が影響している可能性がありそうですね。

Statsmodelsを使った一次元配置の分散分析の実行:

それでは、Statsmodelsを使って一次元配置の分散分析を実行してみましょう。

from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# 一次元配置の分散分析モデルを作成
model = ols('data ~ group', data=df).fit()

# 分散分析結果を取得
anova_result = anova_lm(model)

# 結果を表示
print(anova_result)

上記のコードを解説します。

ols関数

まず、ols関数を使用して一次元配置の分散分析モデルを作成し、fitメソッドを呼び出してモデルをフィットさせます。

ols関数は、Statsmodelsパッケージの中のformula.apiモジュールから提供される関数です。一元配置の分散分析モデルを作成するためには、ols関数に対して2つの引数を渡す必要があります。

  • 第1引数:分析対象のデータを表す数式の形式で指定します。ここでは、"data ~ group"という数式を指定します。"data"は従属変数(説明したい現象)を示し、"group"は独立変数(グループ)を示します。
  • 第2引数:分析対象のデータを保持しているデータフレームを指定します。このデータフレームには、従属変数と独立変数のデータが含まれています。

ols関数の後に作成したモデルをフィットさせるために、fitメソッドを呼び出します。fitメソッドは、モデルを実際のデータに適合させるためのメソッドです。この適合の過程によって、モデルのパラメータが推定されます。

anova_lm関数

次にanova_lm関数を使って分散分析結果を取得します。

anova_lm関数は、Statsmodelsパッケージの中のstats.anovaモジュールから提供される関数です。この関数は、一元配置分散分析の結果を取得するために使用されます。

結果の見方

最後にprint関数を使って結果を表示しています。結果は以下のようになります。

            df       sum_sq     mean_sq          F        PR(>F)
group      2.0  1412.666667  706.333333  47.440299  4.583563e-09
Residual  24.0   357.333333   14.888889        NaN           NaN

分散分析の結果には、グループ間の差異に基づくF値やp値などが含まれます。ここで、

  • df:自由度
  • sum_sq:平方和
  • mean_sq:平均平方
  • F:F値
  • PR(>F):p値

を表します。もしp値が有意水準(通常は0.05)よりも小さい場合、グループ間に統計的に有意な差があると結論付けることができます。

今回の結果、p値<0.05ですから、「帰無仮説(H0): 各クラスの平均値に統計的な差はない」は棄却され、対立仮説(H1)である「少なくとも1つのクラスの平均値は他のグループと統計的に異なる」ということが結論付けられます

まとめ:

本記事では、PythonのStatsmodelsパッケージを使用して一次元配置の分散分析を行う方法について解説しました。Statsmodelsを使うことで、統計的な有意差を検出するための一次元配置の分散分析を簡単に実行することができます。初心者の方でも分かりやすいように、具体的なコード例を交えて手順を説明しました。是非、自分のデータに適用してみてくださいね。

コメント