前面講了大數定理,講了中心極限定理,有讀者留言讓講講切比雪夫定理,安排。這一篇就來講講切比雪夫定理。
在講切比雪夫定理之前,我們先看下切比雪夫不等式:
其中P表示概率,X是隨機變量,μ是期望,k是常數,σ是標準差,整個公式表示距離期望μ越遠的值出現的概率是越小的。
再拿正態分布這張圖來感受下,大部分值都是分布在均值附近的,離均值越遠的值是越少的,對應出現的概率也就越低。
關於不等式的證明,我們就不證明了,有興趣的同學可以去了解下,我們直接拿來用就好。
看完不了不等式,我們再來看定理,其實是一回事的,切比雪夫定理表示:
在任意一個數據集中,位於其均值±m個標準差範圍內的數值比例至少為1-1/m2,其中m為大於1的任意正數。
對於m=2,m=3和m=5有如下結果:
所有數據中,至少有3/4(或75%)的數據位於均值±2個標準差範圍內。
所有數據中,至少有8/9(或88.9%)的數據位於均值±3個標準差範圍內。
所有數據中,至少有24/25(或96%)的數據位於均值±5個標準差範圍內。
拿前面的正態分布為例,在均值±2個標準差範圍內的數據約佔到全部的95%。
我們來模擬生成兩個不同分布(正態&非正態)的數據驗證下:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#生成正態數據
norm_data = np.random.randn(1,990)
#生成非正態數據
x = np.arange(0.01,1,0.001)
long_data = 1/x
data = pd.DataFrame({"norm_data":norm_data.reshape(990,),"long_data":long_data})
#繪製概率分布圖
plt.figure(figsize = (8,8))
plt.subplot(221)
sns.distplot(data["norm_data"])
plt.subplot(222)
sns.distplot(data["long_data"])
#將正態&非正態數據按照標準差進行切分
norm_data_std_bin = [-np.inf
,data["norm_data"].mean() - 3*data["norm_data"].std()
,data["norm_data"].mean() - 2*data["norm_data"].std()
,data["norm_data"].mean() - 1*data["norm_data"].std()
,data["norm_data"].mean()
,data["norm_data"].mean() + 1*data["norm_data"].std()
,data["norm_data"].mean() + 2*data["norm_data"].std()
,data["norm_data"].mean() + 3*data["norm_data"].std()
,np.inf]
long_data_std_bin = [-np.inf
,data["long_data"].mean() - 3*data["long_data"].std()
,data["long_data"].mean() - 2*data["long_data"].std()
,data["long_data"].mean() - 1*data["long_data"].std()
,data["long_data"].mean()
,data["long_data"].mean() + 1*data["long_data"].std()
,data["long_data"].mean() + 2*data["long_data"].std()
,data["long_data"].mean() + 3*data["long_data"].std()
,np.inf]
data["norm_data_cut"] = pd.cut(data["norm_data"],bins = norm_data_std_bin)
data["long_data_cut"] = pd.cut(data["long_data"],bins = long_data_std_bin)
plt.subplot(223)
(data["norm_data_cut"].value_counts().sort_index()/data["norm_data_cut"].count()).plot(kind = "bar",rot = 30)
plt.xticks(np.arange(0,8),["[-inf,u-3σ]","[u-3σ,u-2σ]","[u-2σ,u-σ]","[u-σ,u]","[u,u+σ]","[u+σ,u+2σ]","[u+2σ,u+3σ]","[u+3σ,+inf]"])
plt.subplot(224)
(data["long_data_cut"].value_counts().sort_index()/data["long_data_cut"].count()).plot(kind = "bar",rot = 30)
plt.xticks(np.arange(0,8),["[-inf,u-3σ]","[u-3σ,u-2σ]","[u-2σ,u-σ]","[u-σ,u]","[u,u+σ]","[u+σ,u+2σ]","[u+2σ,u+3σ]","[u+3σ,+inf]"])
通過運行上面的代碼可以得到如下四張圖:
第一行是正態&非正態數據的概率分布,第一張是完美的正態分布,第二張是長尾分布。
第二行是正態&非正態數據中均值±m個標準差範圍內的數據佔比,可以看到第一張圖中的數據佔比與我們前面的正態分布示意圖中是一致的,第二張圖因為是長尾分布,所以大部分數據都集中在了均值均值±1個標準差範圍內。
綜上,不管是正態分布還是非正態分布,隨機變量的分布情況都是滿足切比雪夫定理的。這就像,有人說他月薪不超過100w一樣。在大多數情況下都是正確的。
切比雪夫定理的一個應用場景就是用來對數據進行預估,比如你現在知道一個群體收入的均值和標準差,然後想要根據均值和標準差得出這個群體的整體收入情況,比如90%的人的收入是多少、80%的人的收入是多少?這個預估問題應該怎麼算呢?
如果你已經確切的知道了這個群體的收入是符合正態分布的,那就簡單了,我們知道正態分布中的數據是平均的分布在均值兩側的,90%的人會有45%的人小於均值,另外45%的人大於均值。
可現實情況中,並不是所有的數據都是符合正態分布的,也並不可以知道所有數據的真實分布情況,這個時候就可以用切比雪夫定理。要預估90%的人的收入問題,只需要讓1-1/m2等於90%,即可求出m值,通過m值就可以知道90%的人的收入情況。
如果知道具體的分布,可以用具體的分布去進行估計,這樣肯定更加準確,但是如果不知道具體分布的時候,可以用切比雪夫,雖然不是很精確,但是總比閉著眼睛猜要靠譜點。