# 混合ガウスモデルをわかりやすく解説！Pythonで実装していこう！

> 当サイト【スタビジ】の本記事では、混合ガウスモデルについて解説していきます！実際にPythonで実装して、理解を深めていきましょう！

- URL: https://toukei-lab.com/gaussian-mixture-model
- 公開: 2024.02.19 / 更新: 2025.10.23
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
当サイト【スタビジ】の本記事では、混合ガウスモデルについて解説していきます！実際にPythonで実装して、理解を深めていきましょう！
:::

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

**混合ガウスモデル**、皆さんは聞いたことがあるでしょうか？？

あまり馴染みのない言葉かもしれませんが、実は[クラスタリング手法](/クラスター分析)の一種なんです！

今回はそんな混合ガウスモデルについて、その概要からPythonでの実装方法まで詳しく解説していきます！

:::talk{who="robotan"}
ガウスモデルってことは正規分布と何か関係があるのかな？
:::

:::talk{who="umatan"}
その通り！早速見ていこう！
:::

以下のYoutube動画でも解説していますのであわせてチェックしてみてください！

::youtube{#79W7hfdp3ZE}

## 混合ガウスモデルとは

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

**混合ガウスモデル**とは、クラスタリング手法の一種であり、その名の通り**混合ガウス分布（混合正規分布）**&#x3092;基とした手法です。

:::talk{who="robotan"}
混合ガウス分布って何だっけ？
:::

<mark>混合ガウス分布とは、複数のガウス分布（[正規分布](/gauss)）が混合している分布のことです。</mark>

例えば、手元に**日本の成人の身長が男女別に記録されたデータ**があるとします。

以下の図は、そのデータを男女別で描いたものです（男性の平均身長を170、女性の平均身長を157としています）。

![混合ガウス分布　例1](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_ex1.jpg)

あらかじめ男女別で身長が記録されていれば、上のような分布をそれぞれで描くことができますね。

しかし、<mark>もし男女のラベルが身長のデータになかったらどうでしょうか。</mark>

どのデータが男性でどのデータが女性かが全くわからないため、以下の図のような分布が描かれることになります。

![混合ガウス分布　例2](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_ex2.jpg)

<mark>この分布がまさに、2つの正規分布を混合している**混合ガウス分布**となります。</mark>

:::talk{who="robotan"}
じゃあ混合ガウスモデルってのは結局どんな手法なの？
:::

混合ガウスモデルは、**データが複数のガウス分布から生成されていると仮定し、各データがどのガウス分布に所属するかを推定する手法です。**

その推定には、[最尤推定法](/maximum_likelihood_method)を用います。

:::talk{who="umatan"}
元々ラベルのないデータをクラス分けするからクラスタリングの一種！分類予測とは違うので注意しよう！
:::

## 混合ガウスモデルのメリット

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

クラスタリング手法には様々なものがありますが、混合ガウスモデルにはどんなメリットがあるのでしょうか。

ここでは大きなメリットを2つ紹介していきます。

### メリット①：データの確率密度関数を得ることができる

<mark>メリットの一つ目は、データの確率密度関数を得られることです。</mark>

**確率密度関数を得る ＝ データを確率分布として表現できる**ということですから、**新たにサンプリング**を行ったり、**回帰分析や分類予測へ応用**することができます。

### メリット②：クラスター数を自動で決定することができる

<mark>メリットの二つ目は、クラスター数を自動で決定できることです。</mark>

他のクラスタリング手法ではクラスター数を恣意的に決定することが多いですが、混合ガウスモデルではその必要がありません。

具体的には、**BIC（ベイズ情報量基準）**&#x304C;最小となるようなクラスター数を最適なクラスター数とすることができます。

:::talk{who="umatan"}
これはデータを確率密度関数として表すことができるからなんだ！
:::

BICについての簡単な説明は、以下の記事のx-means法の部分を参考にしてみてください！

<https://toukei-lab.com/k-means>

## 混合ガウスモデルをPythonで実装してみよう

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

ここからは、Pythonで実際に混合ガウスモデルを実装していきます。

<mark>分析の目的は、特徴量を用いてデータを複数のクラスターに分類すること！</mark>

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

:::box
**1. ライブラリのインストール\
2\. データの準備\
3\. 混合ガウスモデルによるクラスタリング**
:::

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

今回は機械学習ライブラリ[scikit-learn](/scikit-learn)の[GaussianMixture](https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html)を用いて混合ガウスモデルによるクラスタリングを行っていきます。

それ以外にも必要なライブラリをここでインストールしておきます。

```python
#ライブラリのインストール
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
```

### 2. データの準備

今回は[iris](https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_iris.html)と呼ばれる、アヤメの種類に関するデータセットを用いてクラスタリングを行っていきます。

一般的にirisデータセットは、**4つの特徴量（花びら（petal）／がく片（sepal）それぞれの長さと幅（cm））**&#x3092;用いて**アヤメの種類（3種類）**&#x3092;予測するという目的で使用されますが、今回は予測が目的ではないので特徴量の部分のみを使用します。

```python
#データの準備

#irisデータセットをロード
iris = load_iris()
df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
df
```

![混合ガウスモデル　データフレーム](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_df.jpg)

サンプルサイズは、１種類あたり50サンプル×3種類の計150となっています。

またここで、それぞれの変数の分布を確認してみましょう。

```python
#グラフの表示

#4分割サブプロットを作成
fig, axs = plt.subplots(2, 2, figsize=(10, 8))

# サブプロットにデータをプロット
axs[0, 0].hist(df[iris.feature_names[0]], bins=20,density=True, alpha=0.5, color='b',edgecolor='black')
axs[0, 0].set_title(str(iris.feature_names[0]))
axs[0, 1].hist(df[iris.feature_names[1]], bins=20,density=True, alpha=0.5, color='r',edgecolor='black')
axs[0, 1].set_title(str(iris.feature_names[1]))
axs[1, 0].hist(df[iris.feature_names[2]], bins=20,density=True, alpha=0.5, color='g',edgecolor='black')
axs[1, 0].set_title(str(iris.feature_names[2]))
axs[1, 1].hist(df[iris.feature_names[3]], bins=20,density=True, alpha=0.5, color='y',edgecolor='black')
axs[1, 1].set_title(str(iris.feature_names[3]))

#レイアウトを調整
plt.tight_layout()

#グラフを表示
plt.show()
```

![混合ガウスモデル　分布確認](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_data_plot.png)

<mark>どの特徴量も複数の山ができており、単一のガウス分布ではなさそうであることが読み取れます。</mark>

### 3. 混合ガウスモデルによるクラスタリング

そして今回の目的である混合ガウスモデルによるクラスタリングを行っていきます。

あらかじめ想定されるクラスター数をリストに格納しておき、1から順番にGMM(Gaussian Mixture Model)を行ってBICを算出していく、という流れです。

そして**BICが最も小さくなった場合のクラスター数が最適クラスター数といえます。**

```python
#混合ガウスモデルによるクラスタリング

#データフレーム内のデータ（4次元）を特徴量とする
X = df.values

#想定するクラスター数のリスト
components_num = [1,2,3,4]

#クラスター数を1,2,...と振ってGMMを行い、BICを算出
for i in components_num:
  gmm = GaussianMixture(n_components=i,covariance_type='full') #混合ガウスモデルを定義してフィット
  gmm.fit(X)
  BIC = gmm.bic(X) #BICの計算（GaussianMixtureのBICメソッドを用いる）

  #クラスターを可視化（2次元で表示）
  plt.scatter(X[:, 0], X[:, 1], c=gmm.predict(X), s=50)
  plt.xlabel(str(iris.feature_names[0]))
  plt.ylabel(str(iris.feature_names[1]))

  #クラスタの中心をプロット
  centers = gmm.means_
  plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, marker='X')
  plt.title('The number of cluster : '+str(i)+'  (BIC:'+str(round(BIC,1))+')')

  #レイアウトを調整
  plt.tight_layout()
  
  plt.show()
```

![混合ガウスモデル　クラスター1](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_cluster1.jpg) ![混合ガウスモデル　クラスター2](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_cluster2.jpg) ![混合ガウスモデル　クラスター3](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_cluster3.jpg) ![混合ガウスモデル　クラスター4](/wp-content/uploads/2024/02/gaussian-mixture-model_gauss_cluster4.jpg)

可視化のため2次元で表示していますが、<mark>クラスター数が2のときに最もBICが小さくなっていることがわかります。</mark>

つまり、このデータセットに対して混合ガウスモデルによるクラスタリングを行った結果、**最適なクラスター数は2であり、上図のようなグループ分けがされた**と結論づけることができます。

:::talk{who="robotan"}
クラスター数を自動で決めてくれるのはありがたいな！
:::

しかしここで、ある疑問が浮かび上がってくると思います。

それは、元々3種類のアヤメからなるデータセットであるにもかかわらずこのような結果が得られたのか、ということです。

<mark>その原因の一つとして、分布の重なりが大きい可能性が考えられます。</mark>

クラスター数が3の時の散布図を見てみると、緑色のグループは左上に固まっていますが、紫色と黄色のグループは重なり合っている部分が多いことがわかります。

これは、sepal widthとsepal lengthの2つの特徴量でデータを見たとき、紫色と黄色のデータをうまくグループ分けできていないことを表しています。

それにより、BICの値がクラスター数2のときよりも若干大きくなってしまっているのです。

そのため、混合ガウスモデルを用いてクラスタリングを行う場合、**何かしらの事前情報があるのであればそれに基づいたクラスター数の設定**を、**そうでない場合はBICの値を基準とした自動的なクラスター数の設定**を行っていきましょう。

:::talk{who="umatan"}
状況に応じて使い方を変えていこう！
:::

## まとめ

ここまでご覧いただきありがとうございました！

本記事では混合ガウスモデルの概要からPythonでの実装方法まで解説していきました。

混合ガウスモデルは**単純な理論ながら、様々なデータに対して用いることのできる強力なクラスタリング手法**です。

<mark>背後にガウス分布が想定できるデータであれば、ぜひ使っていきましょう！</mark>

また、今回分析に用いた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="＼今すぐ試す／"}