Q-Q圖原理詳解及Python實現


導讀在之前的《數據挖掘概念與技術 第2章》的文章中我們介紹了Q-Q圖的概念,並且通過調用現成的python函數, 畫出了Q-Q圖, 驗證了Q-Q圖的兩個主要作用,1. 檢驗一列數據是否符合正態分布 2. 檢驗兩列數據是否符合同一分布本篇文章將更加全面的為大家介紹QQ圖的原理以及自己手寫函數實現畫圖過程
本文的代碼文件(jupyter)和數據文件可以在我們的公眾號"數據臭皮匠" 中回復"QQ圖"獲取

Q-Q圖是什么

QQ圖是quantile-quantile(分位數-分位數圖) 的簡稱,上面也有介紹它的兩個主要作用:
1.檢驗一列數據是否符合正態分布
2.檢驗兩列數據是否符合同一分布
 
Q-Q圖的原理
要弄清Q-Q圖的原理,我們先來介紹下分位數的概念。這里我們引用下百度百科的介紹:
分位數, 指的就是連續分布函數中的一個點,這個點對應概率p。若概率0<p<1,隨機變量X或它的概率分布的分位數Za,是指滿足條件p(X≤Za)=α的實數。
 
What...?? 是不是感覺有點抽象,別着急,我們繼續往下看分位數的實例-百分位數。
 
百分位數,統計學術語,如果將一組數據從小到大排序,並計算相應的累計百分位,則某一百分位所對應數據的值就稱為這一百分位的百分位數。可表示為:一組n個觀測值按數值大小排列。如,處於p%位置的值稱第p百分位數。
給大家舉個例子:初三年級有1000名學生, 期末考試成績按照從高到低的順序排列, 排名第10的同學, 剛好位於全校1000名同學的1%處, 他的分數就是全校期末考試分數的第1百分位數, 記為P1, 同理, 第20名同學對應的分數就是第2百分位數P2, ... 第990名同學的分數為第99百分位數 P99。
 
那么Q-Q圖的原理就是,通過把一列樣本數據的分位數與已知分布的一列數據的分位數相比較,從而來檢驗數據的分布情況。所以, Q-Q圖的兩個功能都是比較兩列數據的分位數是否分布在y=x的直線上。當兩列數據行數相同時, 首先將兩列數據分別從高到低排序, 直接畫散點圖就可以了, 當兩列數據行數不一樣時, 需要分別計算出每列數據的百分位數, 再將兩列數據的百分位數畫散點圖, 檢查散點圖是否分布在y=x直線附近。
 
檢驗數據是否符合正態分布
我們接下來的實例數據及引用自自kaggle的Students Performance in Exams , 你可以在我們公眾號后台回復"QQ圖"來獲取它。
首先來介紹一下我們的數據集。數據共1000行, 8列, 每行代表一名學生的屬性信息, 最后三列為三科成績, 分別是: 'math score', 'reading score', 'writing score' , 我們將只適用最后三列的分數, 驗證學生分數是否符合正態分布
我們先通過調用python包來畫QQ圖 檢驗是否符合正態分布
可以看到, 學生的三科總分與標准正態分布的數值畫出的散點圖, 基本分布在一條直線附近, 可以認為學生分數符合正態分布, 但不是標准正態分布,詳細分析我們在下文會講到。
接下來,我們通過手動畫Q-Q圖 來實現檢驗數據是否符合正態分布
當兩列數據行數相同時,直接將分別排序后的兩列數值畫散點圖
可以看到, 我們畫出了和統計包幾乎一樣的QQ圖(最左側和最右側之間的差異, 是由於正態分布變量是隨機產生的, 每次都會有一些不同)
 
直接將分別排序后的兩列數值畫散點圖, 好像不能體現Q-Q圖的本質, 我們接下來取0到100的500個分位數,畫圖看下情況
我們畫出了和上面幾乎一樣的圖, 但是可以看到, 右側的點分布在在直線下方, 結果是符合直覺的, 因為正態分布的數據在最右側需要有一些比較大的數字, 但是學生成績被總分300 限制住了, 這就印證了一句話,學霸只能考100是因為滿分只有100
 
檢驗兩列數據是否符合同一分布
兩列數據行數相同時
兩列數據行數不同時
可以看到, 'math score' 和 'reading score' 兩列的分位數分布在y=x 直線附近, 我們可以認為兩列數據符合同一分布。
 
符合正態和標准正態分布的區別
在上面檢驗數據是否符合正態分布時,我們說, 學生分數符合正態分布, 但不是標准正態分布。是因為通過仔細觀察會發現, 散點圖並不是沿着y=x 線分布, 而是沿着 y=ax+b 分布, 即, 一條有截距且有斜率的直線。
Q-Q散點圖是沿着y=x分布時, 符合標准正態分布
Q-Q散點圖沿y=ax+b分布時, 符合正態分布, 但非標准正態分布
可以看到, 散點圖基本在y = ax+b 的附近分布, 這時我們可以說,score_tol 列符合正態分布, 但不是標准正太分布。
一般認為,Q-Q圖的散點需要分布在y=x 直線附近才認為符合正態分布, 為什么散點圖分布在y=ax+b附近, 仍然可以認為, score_tol 符合正態分布呢? 因為, 從圖中可以看到, score_tol 列可以寫成正態分布的列val 的線性函數 score_tol = a * val + b 而正態分布的性質決定了, 如果一個變量x服從正態分布, 那么他的函數ax+b 也符合正態分布。
本文的Python代碼和數據文件可以在我們的公眾號"數據臭皮匠" 中回復"QQ圖"獲
 
關注公眾號:數據臭皮匠;獲得更多精彩內容

作者:范小匠

審核:灰灰匠

編輯:森匠


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM