Python
 Computer >> コンピューター >  >> プログラミング >> Python

Matplotlibで2つの分布の差をプロットする方法

Matplotlibで2つの分布の違い(差)を可視化したい場合、各分布に対してカーネル密度推定(KDE)を計算し、それらを同じグラフ上に描画するとともに、両者の差も一緒にプロットするのが効果的です。以下の手順で実装できます。

手順

  • 図のサイズを設定し、rcParamsを使ってサブプロット間および周囲の余白を自動調整します。
  • NumPyを使ってデータセットabを作成します。ここではガンベル分布に従う乱数を生成しています。
  • SciPyのgaussian_kdeを使い、ガウスカーネルによるカーネル密度推定のオブジェクトkdeakdebを取得します。
  • NumPyのlinspace()で評価用のグリッド(x軸の値の配列)を作成します。
  • plot()メソッドを使い、kdea(grid)kdeb(grid)、さらに両者の差kdea(grid) - kdeb(grid)をグリッド上にプロットします。
  • legend()で凡例を左上に配置し、どの線がどの分布に対応するかを分かりやすくします。
  • show()メソッドを呼び出して図を表示します。

コード例

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

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

a = np.random.gumbel(50, 28, 100)
b = np.random.gumbel(60, 37, 100)

kdea = scipy.stats.gaussian_kde(a)
kdeb = scipy.stats.gaussian_kde(b)

grid = np.linspace(0, 50, 100)

plt.plot(grid, kdea(grid), label="Kde A")
plt.plot(grid, kdeb(grid), label="Kde B")
plt.plot(grid, kdea(grid)-kdeb(grid), label="Difference")

plt.legend(loc='upper left')

plt.show()

出力結果

Matplotlibで2つの分布の差をプロットする方法

解説

gaussian_kdeは、与えられたデータから滑らかな確率密度関数を推定するクラスです。ヒストグラムよりもビン幅に依存せず、分布の形状を連続的な曲線として表現できるため、2つの分布を比較する際に便利です。

この例では、パラメータの異なる2つのガンベル分布からそれぞれ100個のサンプルを生成し、KDE曲線を描いています。「Difference」の曲線は、同じx座標における2つの密度値の差を表しており、値が正の領域では分布Aが優勢、負の領域では分布Bが優勢であることが一目で分かります。

なお、比較対象のデータ数が多い場合は、np.random.seed()で乱数シードを固定すると、実行ごとに再現性のある結果が得られます。

  1. Matplotlibでプロット上のグリッドサイズを定義する方法

    Matplotlib を使ってプロット上にグリッド(格子線)を表示し、その間隔(サイズ)を自由に定義する方法を紹介します。基本的な流れは以下の手順のとおりです。 グリッドサイズを定義する手順 figure() メソッドを使って、新しい図(Figure)を作成するか、既存の図をアクティブにします。 サブプロット配置の一部として、add_subplot() で図に Axes(座標軸)を追加します。 入力リストを渡して曲線をプロットします。 margins() メソッドで x 軸・y 軸のマージンを 0 に設定します。 X 軸のグリッド位置を指定するには、set_ticks() に目盛りの座標

  2. Seabornで2つのグラフを横に並べてプロットする方法(Matplotlib)

    データ分析では、複数のグラフを1つの図の中に並べて比較できると非常に便利です。この記事では、SeabornとMatplotlibを組み合わせて、2つのグラフを横並び(1行2列)で表示する方法を解説します。 実装の流れ 2つのグラフを並べて描画するには、以下の手順を実行します。 plt.subplots(1, 2) を使い、figureサイズ(7, 7)で1行2列のサブプロットを作成します。 Pandasを使って、col1 と col2 のキーを持つデータフレームを作成します。 countplot() メソッドを使用し、カテゴリごとの観測値の件数を棒グラフで可視化します。 subplots_a