Statistical Thinking in Python|ECDF 進行 EDA 探索式分析的好工具

學.誌|Chris Kang
6 min readFeb 13, 2020

--

Photo by Luke Chesser on Unsplash

這篇文章的篇幅會比較短,主要是用來紀錄 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 下:我有你這讀者,寫這篇也心滿意足了!

--

--

學.誌|Chris Kang

嗨!我是 Chris,一位擁有技術背景的獵頭,熱愛解決生活與職涯上的挑戰。專注於產品管理/資料科學/前端開發 / 人生成長,在這條路上,歡迎你找我一起聊聊。歡迎來信合作和交流: chriskang0917@gmail.com