Statistical Thinking in Python|ECDF 進行 EDA 探索式分析的好工具
這篇文章的篇幅會比較短,主要是用來紀錄 ECDF(Empirical Cumulative Distribution Function)這個工具的筆記。
一開始沒有意識到這個工具在 探索性數據分析(Exploratory Data Analysis)中的重要角色。直到開始實際分析一些真實數據,每次都要利用多個圖表才能完整判別時,才發現 ECDF 的好用!
想對數據分布有個主要的瞭解,目前主要被使用的有三種工具:
- Histogram 直方圖
- Swarm Plot 蟲圖
- Box Plot 箱型圖
- ECDF (Empirical Cumulative Distribution Function)
但直方圖的在視覺判別上不夠直覺,而且會有所謂的 bin bias (亦即因為資料區間的改變,會影響資料的判讀)。
而 ECDF 基本上可以替帶上面三種圖表所能展現的功能,他不僅可以看分布,還能同時很直覺地觀看資料組成。
What is ECDF (Empirical Cumulative Distribution Function) ?
經驗累積曲線(Empirical Cumulative Distribution Function)其實就是簡單地把你的資料,從最小到最大依序播放給你看。並透過曲線的變化進行資料型態的判別。
How to understand ECDF?
恩…概念是很容易理解沒錯,但這張圖要怎麼看,才能發揮他全部的功能?別急,我們先來換另外一個問法。如果你想要看一個資料的分布,通常最常被拿來解說的是什麼圖表?
沒錯,就是常態(高斯)分布曲線!
高斯曲線,是指樣本會以標準常態的方式分布,其形狀像一個鐘,故又常被稱為鐘型曲線。
如果你對於高斯曲線有些瞭解,那 ECDF 就很容易理解了。簡單來說,底下的面積是指:
「沿著 x 軸對應的數值時,累積多少比例的資料」
以下圖為例,換句話說到了 4.1 的時候,總共約佔了整個數值的 0.4(亦即 40%);而垂直的點則是有相同的數值,因此會出現垂直的資料線。
大致上瞭解概念後,接下來就是實際的 Code 解說啦!話不多說,就讓我們直接進入 Coding 的步驟吧!
Actual Code in Python(程式碼實作案例)
這個部分讀者也能跟著一起做,並在每個環節做完時,都停下來思考––––這個環節的目的是什麼?為什麼要這麼做?
相信你很快也能熟練地運用 ECDF 進行探索性分析!
Data Set:
先隨機設定一組數據
# 前置資料
data = [4.7, 4.5, 4.9, 4. , 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4. ,4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4. , 4.9, 4.7, 4.3, 4.4, 4.8, 5. , 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4. , 4.4, 4.6, 4. , 3.3, 4.2, 4.2, 4.2, 4.3, 3. , 4.1]
Writing the Function:
ECDF 的 Function 概念其實很簡單,就是把每個資料排序後,沿著資料從小到大的順序(x 軸),繪製一個每個資料都等高的值(y 軸),最後把個別得到的值放進 x, y 值並 plot 出來,就是 ECDF 的圖啦!
def ecdf(data):
# 計算資料長度
n = len(data) # 排序資料
x = np.sort(data) # 等分每個資料的間距
y = np.arange(1, n + 1) / n return x, y
Plotting the ECDF:
# Compute ECDF for versicolor data: x_vers, y_vers
x_vers, y_vers = ecdf(data)# Generate plot
_ = plt.plot(x_vers, y_vers, linestyle='none', marker='.')# Label the axes
_ = plt.xlabel('versicolor_petal_length')
_ = plt.ylabel('ECDF')# Display the plot
plt.show()
Percentiles in ECDF
Building Percentile 建立顯示的百分位
# 建立自己想要特別顯示的 percentile
percentiles = np.array([2.5, 25, 50, 75, 97.5])# 計算百分位的數字
ptiles_vers = np.percentile(versicolor_petal_length, percentiles)
Plotting the ECDF in Persontile
# 顯示原本的 ECDF 曲線
_ = plt.plot(x_vers, y_vers, '.')
_ = plt.xlabel('petal length (cm)')
_ = plt.ylabel('ECDF')# 顯示 Percentiles 的點,並以菱形呈現
_ = plt.plot(ptiles_vers, percentiles/100, marker='D', color='red',
linestyle='none')# 顯示圖表
plt.show()
是不是很簡單呢!幾乎不用什麼程式碼,就能夠完成一個好用的工具!如果在分析的過程中,有遇到什麼有趣的狀況,也歡迎你分享給筆者喔!
隨後還會繼續補充有關 ECDF 的進一步運用,如果喜歡本文歡迎你拍個手支持我,你的鼓勵是我繼續寫文章最大的動力!
【希望用你的掌聲來投票與支持】
* 拍 5~10 下:簽個到,表示支持(感謝你的鼓勵啊啊啊)
* 拍 10~20 下:想要我未來多寫「數據分析的工具介紹」內容
* 拍 20~30 下:想要我未來多寫「數據分析的實戰案例」內容
* 拍 30~50 下:我有你這讀者,寫這篇也心滿意足了!