統計學中有時會用到 PP 圖 或 QQ 圖,用來看樣本數據是否服從某一特定分佈,或用來看兩個樣本數據是否服從同一分佈。
若 PP 或 QQ 圖中的點基本落在一條 45度 的線上,則說明服從特定分佈。
一般的步驟爲:
- 將樣本數據從小到大排序,假設排序後的樣本數據爲 ,,,。
- 對於 個樣本數據,對應 個分位數。分位數的取值規則不一樣,一個比較簡答的規則是:第 個分位數的取值爲
- 橫座標爲:,,,,縱座標爲:所判斷分佈的累計分佈函數在分位數的逆函數值 ,則爲 QQ 圖;若橫座標爲:,,,,縱座標爲:,則爲 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 圖略微不一樣。