HOWTO · Python
如何在 Python 中製作分位數-分位數圖
使用 statsmodels 或 openturns 在 Python 中製作分位數-分位數圖,並選擇評估分佈或比較樣本的方法。
本頁內容
分位數-分位數(QQ)圖將樣本分位數與理論分位數或另一個樣本的分位數進行比較。使用 statsmodels 可針對選定的分佈評估樣本,或使用 openturns 比較兩個樣本。QQ 圖是一種視覺診斷工具:它可以揭示形狀和尾部行為的差異,但不是決定性的統計檢定。下面的範例展示了每種方法如何回答不同的問題:一個樣本是否服從某個分佈,或者兩個樣本之間如何比較。
在 Python 中使用 statsmodels 套件的分位數-分位數圖
當您想將資料集與理論分佈(例如常態分佈)進行比較時,請使用 statsmodels。使用 pip install statsmodels 安裝該套件。這個小型的、自包含的 Python 範例僅使用標準函式庫來計算成對的經驗常態分位數和理論常態分位數。這些成對值就是 QQ 圖放在其軸上的值,因此您可以在繪製圖形之前先檢查計算過程。
from statistics import NormalDist
sample = [-1.2, -0.4, 0.1, 0.7, 1.5]
ordered = sorted(sample)
normal = NormalDist()
for index, value in enumerate(ordered, start=1):
probability = (index - 0.5) / len(ordered)
theoretical = normal.inv_cdf(probability)
print(f"{theoretical:.3f} {value:.1f}")
-1.282 -1.2
-0.524 -0.4
0.000 0.1
0.524 0.7
1.282 1.5
若要使用 statsmodels 繪製名為 sample_data 的 NumPy 陣列,請在匯入 matplotlib.pyplot as plt 和 statsmodels.api as sm 之後使用 sm.qqplot(sample_data, line="r"),然後呼叫 plt.show()。line="r" 選項會添加一條最小平方法迴歸參考線。靠近該線的值與所選的理論分位數一致;系統性的彎曲或尾部的偏離可能表示存在需要調查的差異。參考線是一種視覺指引,因此在得出分佈適合的結論之前,請考慮樣本大小和其他診斷。此方法適合在您心中已有目標分佈、並希望擬合線幫助評估模式時使用。
在 Python 中使用 openturns 套件的分位數-分位數圖
當您想直接比較兩個樣本時,請選擇 openturns。使用 pip install openturns 安裝該套件。在 OpenTURNS 工作流程中,使用 ot.Normal().getSample(1000) 和 ot.Uniform().getSample(1000) 建立樣本,將它們傳遞給 ot.VisualTest.DrawQQplot(normal_sample, uniform_sample),然後使用 openturns.viewer 中的 View(qq_graph).show() 顯示圖形。此 API 概要以行內方式顯示,是因為已配置的文章執行環境未安裝 OpenTURNS;它不是已執行的範例,而且顯示圖形還需要圖形檢視器。
在雙樣本 QQ 圖中,每個點將樣本中對應的分位數配對。接近線性的模式表示分位數結構相似,而彎曲或兩端的偏離顯示了樣本的不同之處。這種 OpenTURNS 方法不提供與 statsmodels 範例相同的參考線控制。將其用於樣本與樣本之間的直接比較;當您需要將資料與指定的理論分佈進行比較並選擇參考線時,請使用 statsmodels。
有關另一個 Python 繪圖選項,請參閱如何在 Python 中使用 Gnuplot。