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

資料臭皮匠發表於2021-01-23
導讀在之前的《資料探勘概念與技術 第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' , 我們將只適用最後三列的分數, 驗證學生分數是否符合正態分佈
Q-Q圖原理詳解及Python實現
我們先通過呼叫python包來畫QQ圖 檢驗是否符合正態分佈
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
可以看到, 學生的三科總分與標準正態分佈的數值畫出的散點圖, 基本分佈在一條直線附近, 可以認為學生分數符合正態分佈, 但不是標準正態分佈,詳細分析我們在下文會講到。
接下來,我們通過手動畫Q-Q圖 來實現檢驗資料是否符合正態分佈
當兩列資料行數相同時,直接將分別排序後的兩列數值畫散點圖
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
可以看到, 我們畫出了和統計包幾乎一樣的QQ圖(最左側和最右側之間的差異, 是由於正態分佈變數是隨機產生的, 每次都會有一些不同)
 
直接將分別排序後的兩列數值畫散點圖, 好像不能體現Q-Q圖的本質, 我們接下來取0到100的500個分位數,畫圖看下情況
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
我們畫出了和上面幾乎一樣的圖, 但是可以看到, 右側的點分佈在在直線下方, 結果是符合直覺的, 因為正態分佈的資料在最右側需要有一些比較大的數字, 但是學生成績被總分300 限制住了, 這就印證了一句話,學霸只能考100是因為滿分只有100
 
檢驗兩列資料是否符合同一分佈
兩列資料行數相同時
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
兩列資料行數不同時
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
可以看到, 'math score' 和 'reading score' 兩列的分位數分佈在y=x 直線附近, 我們可以認為兩列資料符合同一分佈。
 
符合正態和標準正態分佈的區別
在上面檢驗資料是否符合正態分佈時,我們說, 學生分數符合正態分佈, 但不是標準正態分佈。是因為通過仔細觀察會發現, 散點圖並不是沿著y=x 線分佈, 而是沿著 y=ax+b 分佈, 即, 一條有截距且有斜率的直線。
Q-Q散點圖是沿著y=x分佈時, 符合標準正態分佈
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
Q-Q散點圖沿y=ax+b分佈時, 符合正態分佈, 但非標準正態分佈
Q-Q圖原理詳解及Python實現
Q-Q圖原理詳解及Python實現
可以看到, 散點圖基本在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圖"獲
 
關注公眾號:資料臭皮匠;獲得更多精彩內容

作者:範小匠

稽核:灰灰匠

編輯:森匠

相關文章