# 分散分析についてわかりやすく解説！Pythonで実装してみよう！

> 当サイト【スタビジ】の本記事では、統計解析の基本である分散分析について解説していきます！考え方を説明した後、Pythonで実装していきます！

- URL: https://toukei-lab.com/analysis-of-variance
- 公開: 2023.10.02 / 更新: 2025.07.23
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、統計解析の基本である分散分析について解説していきます！考え方を説明した後、Pythonで実装していきます！
:::

こんにちは！スタビジ編集部です！

ある事象の仮説を数理的に確かめるために行われる[統計的検定](/%e6%a4%9c%e5%ae%9a)。

[統計学](/statistics-freshman)の基本であり、<mark>様々なところで用いられている有用な手法です。</mark>

そんな統計的検定の考え方を用いる分析はいくつかありますが、この記事ではその中でも最も基本的な分析である**分散分析**について解説していきます。

:::talk{who="umatan"}
概要を説明した後、Pythonで実装していくよ！
:::

分散分析に関しては以下の動画でもわかりやすく解説していますのであわせてチェックしてみてください！

::youtube{#HFpEgklYb2w}

## 分散分析とは

![Content](/wp-content/uploads/2017/11/Content-amico.png)

分散分析とは、その名の通りデータの「**分散**」をもとに行う分析手法です。

<mark>その目的は、ズバリ「**複数のグループの平均の違いを検定する**」こと！</mark>

例えば、A,B,Cの3クラス（生徒20人ずつ）に対して数学のテストを行ったとしましょう。

なお、**数学担当の教師はそれぞれのクラスで異なる**とします。

その結果、以下のような得点表が得られました。

![分散分析　得点表](/wp-content/uploads/2023/09/Analysis-of-variance_mathtest.jpg)

表を見ると、各クラスの平均点が異なることがわかります。

しかし、この得点表だけで<mark>「数学担当教師の違いにより、各クラスの平均点が異なる」</mark>と結論づけることはできません。

なぜなら、各クラスの平均点の差が<mark>**統計的に意味のある差**なのかがわからない</mark>からです。

また、平均点の差が**数学担当教師の違いによるもの**であるかどうかも定かではありません。

そこで、**分散分析を用いて統計的に解析**し、判断を下すというわけです。

:::talk{who="robotan"}
グループの平均の違いを検定する、、、。なんかt検定と似てない？
:::

:::talk{who="umatan"}
お、よく知ってるね！t検定は対象とするグループ数が2つの場合のみのことを言うんだ！だから、分散分析はt検定の拡張版とも言えるね！
:::

![分散分析　t検定　違い](/wp-content/uploads/2023/09/Analysis-of-variance_diff_ttest.jpg)

:::talk{who="umatan"}
t検定についてはこちらの記事をチェック！
:::

<https://toukei-lab.com/t-test>

## 分散分析の理論と手順

![python](/wp-content/uploads/2019/08/Admin-amico-min-e1613730531228-1024x914.png)

**分散分析の理論と手順**について、先ほどの数学のテストの例を用いて説明していきます。

### 1. ばらつきの分解

各生徒の数学のテストの得点をプロットすると、以下のような図ができます。

なお、図中の✖️は各クラスの平均値を表しています。

![](/wp-content/uploads/2023/09/Analysis-of-variance_math_plot.jpg)

この図を見てみると、全体として、得点はおよそ60点から90点までの間をばらついていることがわかります。

なぜばらついているのかというと、もちろん、**数学担当教師の違い**が原因としてあげられます。

数学担当教師の教え方に差があれば、クラスとしての数学力の差にも違いが生じますからね。

しかし、**同じクラスであっても得点がばらついている**ことがわかります。

その原因としては、個人ごとの数学力の差や今回のテスト問題に対する得意・不得意など、様々なものが考えられます。

しかし、そのようなばらつきの原因を全て把握するというのは現実問題として不可能であり、非効率的です。

そこで、数学担当教師の違い以外による、<mark>ばらつきの様々な原因を併せたものを**実験誤差**として考えていきます。</mark>

つまり、データのばらつきを<mark>「数学担当教師（クラス）の違いによるばらつき」</mark>と<mark>「それ以外の実験誤差によるばらつき」</mark>の2つに分けて考える、ということです。

これが分散分析の基本的な考え方です。

![分散分析　ばらつきの分解](/wp-content/uploads/2023/09/Analysis-of-variance_variance.jpg)

:::talk{who="umatan"}
ちなみに、ばらつきの要因（今回ではクラス）のことを**因子**、その段階（今回ではA、B、C）のことを**水準**と呼ぶよ！
:::

続いて、ばらつきの分解方法を見ていきます。

まず、各生徒の点数データを$x_{ij}$とします。ここで、クラスA,B,Cをクラス1,2,3とし、添字$i$はクラス（$i=1,2,3$）を、添字$j$は生徒番号（$j=1,2,…,20$）を表します。

また、全点数データの平均を$\bar{\bar{x}}$と表します。

さらに、各クラスごとの点数データの平均を$\bar{x}_{i.}$と表します。

これらを用いて、**データのばらつき**を以下の数式で表すことができます。

:::box
総平方和 ： $\displaystyle S_{T}=\sum_{i=1}^{3}\sum_{j=1}^{20}(x_{ij}-\bar{\bar{x}})^2$
:::

総平方和は、個々のデータと全平均との違いを2乗し、全てのデータについて足し合わせたも&#x306E;**（＝全データのばらつき度合い）**&#x3092;示しています。

:::box
群間平方和 ： $\displaystyle S_{A}=\sum_{i=1}^{3}\sum_{j=1}^{20}(\bar{x}_{i.}-\bar{\bar{x}})^2$
:::

群間平方和は、クラス$i$における平均と全平均の違いを2乗し、全てのデータについて足し合わせたも&#x306E;**（＝それぞれのクラスによるばらつき度合い）**&#x3092;示しています。

:::box
群内平方和 ： $\displaystyle S_{E}=\sum_{i=1}^{3}\sum_{j=1}^{20}(x_{ij}-\bar{x}_{i.})^2$
:::

群内平方和は、個々のデータとそれの属するクラス$i$における平均との違いを2乗し、全てのデータについて足し合わせたも&#x306E;**（＝誤差によるばらつき度合い）**&#x3092;示しています。

そして、上の3つの平方和の間には以下の関係が成り立ちます。

:::box
$S_{T}=S_{A}+S_{E}$
:::

つまり、分散分析の考え方を数式を用いて表すと、以下の図のようになります。

![分散分析　ばらつきの分解　数式](/wp-content/uploads/2023/09/Analysis-of-variance_variance_equ.jpg)

### 2. 検定

ばらつきの分解により、全データのばらつきを**クラスの違いによるばらつき（群間平方和）**&#x3068;**誤差によるばらつき（群内平方和）**&#x306E;2つに分けることができました。

ここから、<mark>そのばらつきの大きさを、検定を用いて比較していきます。</mark>

:::talk{who="robotan"}
なんで2つのばらつきを比較するんだ？？
:::

:::talk{who="umatan"}
もしクラスの違いによるばらつきが誤差によるばらつきに比べて大きければ、クラスによる違いを認めることができる！
:::

:::talk{who="robotan"}
なるほど！そのために検定を用いるってわけか！
:::

検定のための準備として、群間平方和、群内平方和をそれぞれの**自由度**で割り、**分散**の形にしておきます。

各自由度の算出方法は以下の通りです。

:::box
全データの自由度 ： $\phi_{T}=(全データ数)-1$

水準の自由度 ： $\phi_{A}=(水準数)-1$

誤差の自由度 ： $\phi_{E}=\phi_{T}-\phi_{A}$
:::

それぞれの分散は以下のように表すことができます。

:::box
群間分散 ： $\displaystyle V_{A}=\frac{S_{A}}{\phi_{A}}$

群内分散 ： $\displaystyle V_{E}=\frac{S_{E}}{\phi_{E}}$
:::

そして、**分散比**$F_{0}$を算出します。

:::box
分散比 ： $\displaystyle F_{0}=\frac{V_{A}}{V_{E}}$
:::

これまで算出してきた様々な値をまとめると、以下のような表を作成することができます。

![分散分析　分散分析表](/wp-content/uploads/2023/10/Analysis-of-variance_table_2.jpg)

これは**分散分析表**と呼ばれるもので、分散分析の際はこのような表にまとめていきながら分析を進めていくことが多いです。

そして、分散比$F_{0}$の値を用いて検定を行います。

ここで用いる検定は**F検定**と呼ばれるものです。

<mark>検定の結果、$F_{0}$が$F(\phi_{A},\phi_{E};\alpha)$（$\alpha$はふつう0.05または0.01）以上の値であれば有意と判定し、</mark>**クラスの違いにより平均点数が異なる**と結論づけることができます。

:::talk{who="umatan"}
自由度、F検定についてはこちらをチェック！
:::

<https://toukei-lab.com/dof>

<https://toukei-lab.com/f_test>

## 分散分析の種類

![stories Data-pana](/wp-content/uploads/2021/01/Data-pana-e1615808087658-1024x875.png)

ここまで分散分析の理論を説明してきましたが、実は分散分析には以下の3つの種類があります。

:::box
**1. 一元配置法\
2\. 二元配置法\
3\. 多元配置法**
:::

分析手順はほとんど変わりませんが、それぞれについて簡単に説明していきます。

### 1. 一元配置法

これは上の例で説明したような、**因子が1つの場合**の分散分析のことを言います。

一元配置法における**データの構造式**は以下のように表すことができます。

:::box
$x_{ij}=\mu+\alpha_{i}+\varepsilon_{ij}$
:::

この式は、個々のデータ$x_{ij}$は、全体の平均$\mu$に因子Aの効果$\alpha_{i}$と誤差$\varepsilon_{ij}$が加わったものであるということを示しています。

なお、**一元配置法では繰り返し数が異なっていても問題ありません。**

ただし、群間平方和を算出する際にそれを考慮する必要があるので気をつけましょう。

:::talk{who="umatan"}
分散分析は各水準ごとに母分散の等しい正規母集団を想定しているから、できるだけ繰り返し数は揃えた方がいいよ！
:::

### 2. 二元配置法

これは**因子が2つの場合**の分散分析のことを言います。

さらに二元配置法は、**繰り返しがある場合**と**繰り返しがない場合**の2つに分けることができます。

#### 繰り返しのある二元配置法

繰り返しのある二元配置法における**データの構造式**は以下のように表すことができます。

:::box
$x_{ijk}=\mu+\alpha_{i}+\beta_{j}+(\alpha\beta)_{ij}+\varepsilon_{ijk}$
:::

この式は、個々のデータ$x_{ijk}$は、全体の平均$\mu$に因子Aの効果$\alpha_{i}$と因子Bの効果$\beta_{j}$、交互作用効果$(\alpha\beta)_{ij}$と誤差$\varepsilon_{ijk}$が加わったものであるということを示しています。

ここで、**交互作用**について簡単に説明します。

交互作用とは、「**因子Aの水準によってBの効果が変わること**」です。

もっと簡単に言えば、「**組み合わせ効果**」です。

例えば、ある料理に砂糖をどんどん加えれば甘さが増していき、塩をどんどん加えれば塩辛さが増していきますね。

しかし、<mark>砂糖の中に少量の塩を加えることで、甘さがより引き立てられる</mark>ことが知られています。

このように、<mark>ある量（水準）同士の組み合わせで効果が大きくなる場合</mark>があり、それを交互作用と呼ぶのです。

:::talk{who="robotan"}
因子の数が増えたことによって、そのような効果も考慮しなきゃいけないんだな！
:::

繰り返しのある二元配置法においても、ばらつきを分解して考えていくという手順は変わりません。

ただし因子が1つ加わったことで、ばらつきの分解が若干異なります。

![分散分析　二元配置法　繰り返しあり](/wp-content/uploads/2023/09/Analysis-of-variance_2factor_rep.jpg)

なお、**繰り返しのある二元配置法では繰り返し数は揃えなければなりません。**

#### 繰り返しのない二元配置法

繰り返しのない二元配置法における**データの構造式**は以下のように表すことができます。

:::box
$x_{ij}=\mu+\alpha_{i}+\beta_{j}+\varepsilon_{ij}$
:::

この式は、個々のデータ$x_{ij}$は、全体の平均$\mu$に因子Aの効果$\alpha_{i}$と因子Bの効果$\beta_{j}$、誤差$\varepsilon_{ij}$が加わったものであるということを示しています。

:::talk{who="robotan"}
あれ、交互作用はないの？
:::

:::talk{who="umatan"}
交互作用があるかないかを見るためには繰り返しが必要なんだ！だから、この場合は交互作用を検出することができないんだ！
:::

そのため、繰り返しのない二元配置法では<mark>あらかじめ交互作用がないことがわかっている場合に用いることがほとんどです。</mark>

また、先ほどと同様、ばらつきを分解して考えていくという手順は変わりませんが、ばらつきの分解が若干異なります。

![分散分析　二元配置法　繰り返しなし](/wp-content/uploads/2023/09/Analysis-of-variance_2factor_non_rep.jpg)

### 3. 多元配置法

これは**因子が3つ以上の場合**の分散分析のことを言います。

取り上げる因子が3つであれば三元配置法、4つであれば四元配置法となります。

<mark>さらに、二元配置法と同様、繰り返しがある場合とない場合の2つに分けることができます。</mark>

構造式などは省略しますが、例えば**繰り返しのある三元配置法**であれば、各因子の主効果の他に、因子AとB、BとC、AとC、AとBとCの4種類の交互作用を考慮する必要があります。

一方、**繰り返しのない三元配置法**であれば、交互作用は検出できません。

ばらつきの分解についても、二元配置法と同様です。

:::talk{who="umatan"}
4因子以上を取り上げた場合は実験回数がとても大きくなってしまうので、直交表と呼ばれるものを用いた実験を行うことが一般的だよ！
:::

## 分散分析をPythonでやってみよう

![stories pc](/wp-content/uploads/2021/01/All-the-data-bro-e1613475965440-1024x789.png)

ここからは、Pythonで実際に分散分析をやっていきます！

一番基本的な、**繰り返しのある一元配置法**をやっていきましょう。

<mark>分析の目的は、最もよい水準を見つけること！</mark>

以下の流れで分析を進めていきます。

:::box
**1. ライブラリのインストール\
2\. データの準備\
3\. 分散分析の実行**
:::

### 1. ライブラリのインストール

今回はscipyのstatsを使って分散分析を行っていきます。

分析で使用する他のモジュール等もここで全てimportしておきます。

```python
import pandas as pd
import numpy as np
from scipy import stats
```

### 2. データの準備

今回は手元で作成したデータを使います。

ある因子A（4水準）を取り上げ、3回ずつの実験で計12個のサンプルが得られた場合を考えます。

**値が高いほどよいサンプル**、であるとします。

```python
#因子A、4水準、繰り返し3
A_Level1 = np.array([2.0, 2.2, 2.1])
A_Level2 = np.array([2.4, 2.8, 2.6])
A_Level3 = np.array([2.1, 2.3, 2.6])
A_Level4 = np.array([2.0, 1.7, 2.0])

#データフレームにまとめる
data = pd.DataFrame({
    '水準1' : A_Level1,
    '水準2' : A_Level2,
    '水準3' : A_Level3,
    '水準4' : A_Level4
})

data = data.T #見やすいようにように転置
data['平均値']=data.T.mean(axis=0).values
data
```

![分散分析　データ](/wp-content/uploads/2023/09/Analysis-of-variance_df_2.jpg)

各水準の平均値に差があり、水準2の平均値が最も高いことがわかります。

ただ、これだけでは**統計的に意味がある差なのかわかりません。**

そのため、分散分析を行っていきます。

### 3. 分散分析(F検定)の実行

[f_oneway関数](https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.f_oneway.html)を用いて、分散分析（F検定）を行います。

```python
fvalue, pvalue = stats.f_oneway(data['水準1'], data['水準2'], data['水準3'], data['水準4'])
print(f"F-val:{fvalue:.4},  P-val:{pvalue:.4}")
```

![分散分析　f検定](/wp-content/uploads/2023/09/Analysis-of-variance_ftest.jpg)

算出されたF値（分散比$F_{0}$）が7.628であり、[p値](/p-value)が0.009862であることを示しています。

p値が0.01を下回っていることから、**高度に有意**であることがわかります。

<mark>ゆえに、因子Aは水準ごとに違いがあり、最も良い水準（最適水準）は**水準2**であると言えます。</mark>

## まとめ

今回は分散分析の概要からPythonでの実装方法まで解説していきました。

<mark>分散分析は、様々な場で活用することのできる手法です。</mark>

複数グループの違いを検証できるのはもちろんのこと、手法の理論を知っておくことで他の分析手法の理解が容易になります。

複数のグループとして観測されたデータが手元にある場合は、分析の第一歩として**分散分析**をぜひやってみましょう！

より分散分析について詳しく知りたい方には以下の書籍がオススメです。是非目を通してみてください！

**■入門　統計解析法**

::product[入門 統計解析法]{url="https://www.amazon.co.jp/dp/4817102667?tag=statistic08-22&linkCode=ogi&th=1&psc=1" image="https://m.media-amazon.com/images/I/41uG1I4bMmL._SL160_.jpg" amazon="https://www.amazon.co.jp/dp/4817102667?tag=statistic08-22&linkCode=ogi&th=1&psc=1" rakuten="https://af.moshimo.com/af/c/click?a_id=858168&p_id=54&pc_id=54&pl_id=616&url=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F%25E5%2585%25A5%25E9%2596%2580%25E7%25B5%25B1%25E8%25A8%2588%25E8%25A7%25A3%25E6%259E%2590%25E6%25B3%2595%2F%3Ff%3D1%26grp%3Dproduct"}

統計学の基本を理解するのにうってつけの本です。基本的に高校レベルの数学ができれば問題なく理解できるレベル。大学生１～２年生の時に非常にお世話になりました。

また、今回分析に用いたPythonについて勉強したい方は以下の記事を参考にしてみてください！

<https://toukei-lab.com/python-learn>

さらに詳しくAIやデータサイエンスの勉強がしたい！という方は当サイト「スタビジ」が提供する[スタビジアカデミー](https://toukei-lab.com/achademy/)というサービスで体系的に学ぶことが可能ですので是非参考にしてみてください！

:::box
**AIデータサイエンス特化スクール「スタアカ」**

![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)
:::

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。

<mark>そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解なども合わせて学べるボリューム満点のコース</mark>になっています！

Pythonが初めての人でも学べるようなカリキュラムにしておりますので是非チェックしてみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}