PP圖,QQ 圖,及 python 畫圖

統計學中有時會用到 PP 圖 或 QQ 圖,用來看樣本數據是否服從某一特定分佈,或用來看兩個樣本數據是否服從同一分佈。

若 PP 或 QQ 圖中的點基本落在一條 45度 的線上,則說明服從特定分佈。

一般的步驟爲:

  1. 將樣本數據從小到大排序,假設排序後的樣本數據爲 x1x_1x2x_2\dotsxnx_n
  2. 對於 nn 個樣本數據,對應 nn 個分位數。分位數的取值規則不一樣,一個比較簡答的規則是:第 kk 個分位數的取值爲 Qk=(k0.5)/nQ_k=(k-0.5)/n
  3. 橫座標爲:x1x_1x2x_2\dotsxnx_n,縱座標爲:所判斷分佈的累計分佈函數在分位數的逆函數值 F(Qk)F^-(Q_k),則爲 QQ 圖;若橫座標爲:F(x1)F(x_1)F(x2)F(x_2)\dotsF(xn)F(x_n),縱座標爲:QkQ_k,則爲 PP 圖。

PP 圖與 QQ 圖的功能基本一樣,我見用 QQ 圖的比較多。因爲分位數的取值規則不一樣,因此 QQ 圖可能畫的不太一樣。

下面以正態分佈的隨機樣本爲例,用 python 畫一下圖形,專門的 QQ 圖也可以調用 scipy 中的 probplot 函數

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


n = 100
samples = st.norm.rvs(loc = 5, scale = 2, size = n)

samples_sort = sorted(samples)


x_labels_p = np.zeros(n)
x_labels_p[0] = 1 - 0.5 ** (1/n)
x_labels_p[n - 1] = 0.5 ** (1/n)
for i in range(1, n - 1):
    x_labels_p[i] = (i + 1 - 0.3175)/(n + 0.365)
y_labels_p = st.norm.cdf(samples_sort, loc = 5, scale = 2)

plt.scatter(x_labels_p, y_labels_p)
plt.title('PP plot for normal distribution samle')
plt.show()


x_labels_q = samples_sort
y_labels_q = st.norm.ppf(x_labels_p, loc = 5, scale = 2)

plt.scatter(x_labels_q, y_labels_q)
plt.title('QQ plot for normal distribution samle')
plt.show()

res = st.probplot(samples, sparams=(5, 2), plot = plt) # 若沒有 sparams,默認會標準化樣本數據
plt.title('QQ plot by probplot for normal distribution')
plt.show()

顯示圖形:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

由於 probplot 的分位數取值規則不同,從圖形上看,probplot 的 QQ 圖與自己畫的 QQ 圖略微不一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章