Open yamamoto-yuta opened 10 months ago
# 必要に合わせてコメントアウトを外して記載してください # 記事の説明文(無い場合は本文先頭200文字を使用) #ogp_description: # サムネイル画像のテーマ -> 'default' or 'upload' thumbnail_theme: default # サムネイル画像の背景画像(1280x670px推奨, なくてもOK) #thumbnail_image_url: # 予約投稿の日時(無い場合は現在時刻を使用) #posted_at: YYYY-MM-DD hh:mm
※ この記事は、私が2023/01/08に書いたメモを転記したものです。
2つの確率分布の分位数を互いにプロットして,両者がどのくらい類似した確率分布なのかを可視化する手法.
縦軸に調べたい確率分布の分位数,横軸に理論分布の確率密度関数の逆関数をプロットする.分布が類似していれば $y=x$ 的な直前上にプロットされる.
Q-Qプロットの一例:
引用: 【Python】正規分布に従っているかを調べる手法3種 | データサイエンス情報局
Q-Qプロットの縦軸,横軸の関係をアニメーションにしたもの:
引用: 【統計学】Q-Qプロットの仕組みをアニメーションで理解する。 - Qiita
検証コード全体はコチラ:
Google Colab: https://colab.research.google.com/drive/1wSn2s6tbKpCUa6Gbi7zMsIzWZzTCkT_-?usp=sharing
import:
import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib import scipy.stats as st from scipy.special import ndtri
サンプリングしたデータのヒストグラム:
N = 200 # データ件数 MEAN = 10 # 平均 STD = 3 # 標準偏差 data = np.random.normal(loc=MEAN, scale=STD, size=N) plt.title(f"正規分布からランダムサンプリングしたプロットのヒストグラム\n(平均={MEAN},標準偏差={STD})") plt.xlabel("階級") plt.ylabel("度数") plt.hist(data, bins=20) plt.grid(True) plt.show()
データの分位数:
sorted_data = np.sort(data) x = np.linspace(0, 1, N) plt.figure(figsize=(5, 5)) plt.title("正規分布からランダムサンプリングしたプロットの分位数") plt.xlabel("分位数") plt.ylabel("値") plt.xlim(0, 1) plt.scatter(x, sorted_data) plt.grid(True) plt.show()
今回の理論分布は正規分布なので,正規分布の確率密度関数(=正規累積分布関数)の逆関数を用いる.
正規累積分布:
x = np.linspace(-STD, STD, N) y_cdf = st.norm.cdf(x) plt.figure(figsize=(5, 5)) plt.title(f"正規累積分布関数\n(定義域=[{-STD}, {STD}])") plt.xlabel("x") plt.ylabel("y") plt.scatter(x, y_cdf) plt.grid(True)
正規累積分布関数の逆関数:
x = np.linspace(0, 1, N) inv_norm = ndtri(x) plt.figure(figsize=(5, 5)) plt.title(f"正規累積分布関数の逆関数\n(定義域=[{0}, {1}])") plt.xlabel("x") plt.ylabel("y") plt.scatter(x, inv_norm) plt.grid(True)
plt.figure(figsize=(5, 5)) plt.title(f"Q-Qプロット") plt.xlabel("理論分布") plt.ylabel("対象データの分布") plt.scatter(inv_norm, sorted_data) plt.grid(True)
グラフが一直線になっていることが分かり,対象データの確率分布が正規分布に類似していることが確認できた.
SciPyの stats.probplot() を使えば簡単にQ-Qプロットを作成できる.
stats.probplot()
fig = plt.subplots(figsize=(5, 5)) st.probplot(sorted_data, dist="norm", plot=plt) plt.show()
※ この記事は、私が2023/01/08に書いたメモを転記したものです。
「Q-Qプロット」って何?
2つの確率分布の分位数を互いにプロットして,両者がどのくらい類似した確率分布なのかを可視化する手法.
縦軸に調べたい確率分布の分位数,横軸に理論分布の確率密度関数の逆関数をプロットする.分布が類似していれば $y=x$ 的な直前上にプロットされる.
Q-Qプロットの一例:
Q-Qプロットの縦軸,横軸の関係をアニメーションにしたもの:
やってみる
検証コード全体はコチラ:
import:
正規分布からランダムサンプリングしたデータが正規分布と類似しているか調べる
縦軸
サンプリングしたデータのヒストグラム:
データの分位数:
横軸
今回の理論分布は正規分布なので,正規分布の確率密度関数(=正規累積分布関数)の逆関数を用いる.
正規累積分布:
正規累積分布関数の逆関数:
Q-Qプロット
グラフが一直線になっていることが分かり,対象データの確率分布が正規分布に類似していることが確認できた.
個人的な理解
実用
SciPyの
stats.probplot()
を使えば簡単にQ-Qプロットを作成できる.参考記事