Matplotlib 密度プロット

Suraj Joshi 2023年1月30日
  1. gaussian_kde() メソッドを用いた密度プロットの生成 scipy.stats モジュールからの例
  2. seaborn パッケージから kdeplot() メソッドを用いて密度プロットを生成する
  3. seaborn パッケージから distplot() メソッドを用いて密度プロットを生成する
  4. pandas.DataFrame.plot() メソッドで kind='density' を設定して密度プロットを生成する
Matplotlib 密度プロット

Python を用いて密度プロットを生成するには、まず scipy.stats モジュールの gaussian_kde() メソッドを用いて与えられたデータから密度関数を推定します。次に、密度関数をプロットして密度プロットを生成します。あるいは、seaborn パッケージの kdeplot() を利用するか、pandas.DataFrame.plot() メソッドで kind='density' を指定して密度プロットを生成することもできます。

gaussian_kde() メソッドを用いた密度プロットの生成 scipy.stats モジュールからの例

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde

data = [2, 3, 3, 4, 2, 1, 5, 6, 4, 3, 3, 3, 6, 4, 5, 4, 3, 2]
density = kde.gaussian_kde(data)
x = np.linspace(-2, 10, 300)
y = density(x)

plt.plot(x, y)
plt.title("Density Plot of the data")
plt.show()

出力:

gaussian_kde 法を用いて密度プロットを生成する

ここではまず、gaussian_kde() メソッドを用いて与えられたデータの密度関数を推定します。次に、-2 から 10 までの範囲の値について、plot() メソッドを用いて密度関数をプロットします。

関数 gaussian_kde は帯域幅を自動的に設定しているため、生成された密度プロットは十分に正確ではありません。帯域幅を設定するには、gaussian_kde クラスの covariance_factor 関数を利用します。次に _compute_covariance メソッドを呼び出して、すべての係数が正しく計算されて正確なプロットが生成されるようにします。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import kde

data = [2, 3, 3, 4, 2, 1, 5, 6, 4, 3, 3, 3, 6, 4, 5, 4, 3, 2]
prob_density = kde.gaussian_kde(data)
prob_density.covariance_factor = lambda: 0.25
prob_density._compute_covariance()

x = np.linspace(-2, 10, 300)
y = prob_density(x)

plt.plot(x, y)
plt.title("Density Plot of the data")
plt.show()

出力:

gaussian_kde メソッドを用いて、より精密な密度プロットを生成する

seaborn パッケージから kdeplot() メソッドを用いて密度プロットを生成する

import matplotlib.pyplot as plt
import seaborn as sns

data = [2, 3, 3, 4, 2, 1, 5, 6, 4, 3, 3, 3, 6, 4, 5, 4, 3, 2]
sns.kdeplot(data, bw=0.25)
plt.show()

出力:

kdeplot 法を用いて密度プロットを生成する

このようにして、kdeplot() メソッドにデータを渡すだけで密度プロットを生成することができます。

seaborn パッケージから distplot() メソッドを用いて密度プロットを生成する

また、seaborn パッケージの distplot() メソッドを用いて hist=False を設定して密度プロットを生成することもできます。

import matplotlib.pyplot as plt
import seaborn as sns

data = [2, 3, 3, 4, 2, 1, 5, 6, 4, 3, 3, 3, 6, 4, 5, 4, 3, 2]
sns.distplot(data, hist=False)
plt.show()

出力:

distplot メソッドを用いて密度プロットを生成する

pandas.DataFrame.plot() メソッドで kind='density' を設定して密度プロットを生成する

import pandas as pd
import matplotlib.pyplot as plt

data = [2, 3, 3, 4, 2, 1, 5, 6, 4, 3, 3, 3, 6, 4, 5, 4, 3, 2]
df = pd.DataFrame(data)
df.plot(kind="density")
plt.show()

出力:

pandas.DataFrame.plot で kind=density を設定して密度プロットを生成する

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

関連記事 - Matplotlib Plot