Matplotlibで2つの分布の差をプロットする方法
Matplotlibで2つの分布の違い(差)を可視化したい場合、各分布に対してカーネル密度推定(KDE)を計算し、それらを同じグラフ上に描画するとともに、両者の差も一緒にプロットするのが効果的です。以下の手順で実装できます。
手順
- 図のサイズを設定し、rcParamsを使ってサブプロット間および周囲の余白を自動調整します。
- NumPyを使ってデータセットaとbを作成します。ここではガンベル分布に従う乱数を生成しています。
- SciPyのgaussian_kdeを使い、ガウスカーネルによるカーネル密度推定のオブジェクトkdeaとkdebを取得します。
- 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()
出力結果

解説
gaussian_kdeは、与えられたデータから滑らかな確率密度関数を推定するクラスです。ヒストグラムよりもビン幅に依存せず、分布の形状を連続的な曲線として表現できるため、2つの分布を比較する際に便利です。
この例では、パラメータの異なる2つのガンベル分布からそれぞれ100個のサンプルを生成し、KDE曲線を描いています。「Difference」の曲線は、同じx座標における2つの密度値の差を表しており、値が正の領域では分布Aが優勢、負の領域では分布Bが優勢であることが一目で分かります。
なお、比較対象のデータ数が多い場合は、np.random.seed()で乱数シードを固定すると、実行ごとに再現性のある結果が得られます。
-
Matplotlibでプロット上のグリッドサイズを定義する方法
Matplotlib を使ってプロット上にグリッド(格子線)を表示し、その間隔(サイズ)を自由に定義する方法を紹介します。基本的な流れは以下の手順のとおりです。 グリッドサイズを定義する手順 figure() メソッドを使って、新しい図(Figure)を作成するか、既存の図をアクティブにします。 サブプロット配置の一部として、add_subplot() で図に Axes(座標軸)を追加します。 入力リストを渡して曲線をプロットします。 margins() メソッドで x 軸・y 軸のマージンを 0 に設定します。 X 軸のグリッド位置を指定するには、set_ticks() に目盛りの座標
-
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