1. 程式人生 > >一維資料視覺化:累積分佈函式(Cumulative Distribution Function)

一維資料視覺化:累積分佈函式(Cumulative Distribution Function)

對於一維資料的視覺化,直方圖(Histogram)核密度估計(Kernel Density Estimates)可以很好的表示各個資料值的概率分佈,但在表示資料累積分佈上這兩種方法就無能為力了。資料的累積分佈,也即小於等於當前資料值的所有資料的概率分佈,對於表示資料點在某個區間內出現的概率有很大的幫助。從數學上來說,累積分佈函式(Cumulative Distribution Function, 簡稱CDF)是概率分佈函式的積分;而在繪製累積分佈函式的時候,由於真實的概率分佈函式未知,因此往往定義為直方圖分佈的積分:
cdf_histo_relation

累積分佈函式(CDF)的使用

以-4到4之間分佈的10000個數據點為例,繪製成直方圖與核密度估計是這樣的:

10000data_histo
10000data_kde

這兩張圖可以很好的表示-4到4之間任意資料值的概率大小,但是在回答下面幾個問題的時候就比較困難了:

  1. 所有大於2的資料點在總資料集中所佔比例約有多大?
  2. 所有大於1.3而小於2的資料點在總資料集中所佔比例是多少?

在上述例子中,資料集大致遵循正態分佈,因此從直方圖或核密度估計的結果中推測這兩個問題的答案還是可能的;但是對於不規則的概率分佈曲線來說,這樣做就基本上行不通了。回答上述問題的通用方法是繪製累積分佈函式圖:
10000data_cdf
根據這張累積分佈函式圖,可以很方便地回答之前的兩個問題:

  1. CDF中橫軸上的2對應的Y值約為0.98,因此所有大於2的資料點所佔比例約為2%。
  2. CDF中橫軸上的1.3對應的Y值約為0.75,因此所有介於1.3和2之間的資料點所佔比例約為23% (0.98-0.75)。

與直方圖、核密度估計相比,累積分佈函式存在以下幾個特點:

  • 累積分佈函式是X軸單調遞增函式。
  • 累積分佈函式更加平滑,影象中噪音更小。
  • 累積分佈函式沒有引入頻寬等外部概念,因此不會丟失任何資料資訊。對於給定的資料集,累積分佈函式是唯一的。
  • 累積分佈函式一般都經過歸一化處理,單調遞增且趨近於1。

R中累積分佈函式(CDF)的實現

在R中,累積分佈函式的繪製是通過ecdf()函式來實現的。對於任何資料分佈,累積分佈函式都是概率分佈函式的積分;因為真實的概率分佈函式未知,所以真實的累積分佈函式也就無法從資料樣本中精確推匯出來了。ecdf()函式中的e代表Empirical,意思是根據觀察值而來的,也即具體描繪出來的CDF曲線是根據各個資料點的加和而得到的。

直方圖(Histogram)文章中近200個點的CPU使用率資料為例,用R繪製CDF的語句為:

cpu <- scan("cpu_data.txt")
plot(ecdf(cpu))

其結果為:
cpu_data_cdf
可以看到,累積分佈函式圖很好的表示了各個區間內資料分佈的概率。美中不足的是,上面的影象中資料點過大,各資料點間也沒有進行連線,因此在視覺效果上與“曲線”相差甚遠。為了美化累積分佈函式圖,可以在plot()函式的呼叫過程中設定引數:

cpu <- scan("cpu_data.txt")
plot(ecdf(cpu),do.points=FALSE, verticals=TRUE)

從而得到更加自然的結果:
cpu_data_cdf_verticals

如果需要用平滑曲線來擬合累積分佈函式,從而作出更加漂亮的圖的話,可以使用sROC包中的kCDF()函式:

//安裝sROC包
install.packages("sROC")//載入sROC包
library(sROC)
plot(kCDF(cpu))

結果如下:
kCDF
上圖中,中間的黑色加粗曲線是擬合的累積分佈函式,而淺灰色的區域則是置信區間。