本文旨在分享用敘述統計和統計圖形來描述或理解變數,包括如何分類特徵以及決定特徵與目標變數、或其他變數之間的相關性
在進行EDA時我們會使用許多種技術,本文會提到一些常用的統計技術或統計圖表,並簡述其原理。
Crosstab
Crosstab(交叉表)可以用來表示同一個群組中的兩個變數彼此的關係(以比例呈現),如下所示:
在上面的例子中,我們將Sex, Survived合成同一組,並觀察他們之間的交叉關係,可以看到當Sex=female時,Survived顯然高於Sex=male時,鑑於這個資料來自於鐵達尼號資料集,我們可以知道在鐵達尼號的訓練資料中,女性的生存機率要明顯優於男性。
就算變數並非二元變數,也是可以使用的,如下所示:變數FamilySize總共有9個類別,我們能夠一一找出他們的交叉關係。
foo = pd.Categorical(['a', 'b'], categories=['a', 'b', 'c'])
>>> bar = pd.Categorical(['d', 'e'], categories=['d', 'e', 'f'])
>>> pd.crosstab(foo, bar)
col_0 d e
row_0
a 1 0
b 0 1
boxplot
Boxplot可以用來表示資料的離群值,最大、最小值,平均數、中位數與 四分位距,是資訊含量相當豐富的圖表。
在進行預處理時,透過boxplot來了解資料的離群狀況,來尋找變數與變數之間的離群是否有相關,是否需要去除離群值再做標準化等問題。
np.random.seed(1234)
>>> df = pd.DataFrame(np.random.randn(10, 4),
... columns=['Col1', 'Col2', 'Col3', 'Col4'])
>>> boxplot = df.boxplot(column=['Col1', 'Col2', 'Col3'])
Histogram(直方圖)
Histogram可以分別將變數投射到X軸與Y軸上,用來判斷變數與變數之間的關係以及趨勢。對於判斷連續區間中資料數量的變化非常有幫助。
df = pd.DataFrame({
... 'length': [1.5, 0.5, 1.2, 0.9, 3],
... 'width': [0.7, 0.2, 0.15, 0.2, 1.1]
... }, index=['pig', 'rabbit', 'duck', 'chicken', 'horse'])
>>> hist = df.hist(bins=3)
barplot
barplot(長條圖)可以用來表示兩個變數中,A變數與B變數之間的關係。
import seaborn as sns
>>> sns.set(style="whitegrid")
>>> tips = sns.load_dataset("tips")
>>> ax = sns.barplot(x="day", y="total_bill", data=tips)
pointplot
point提供了與barplot相似的作用,但僅以一條包含圓點直線表示,並且會將變數中不同類別的元素相連,更容易看出A變數與B變數之間,隨著A類別(X軸)的不同在B變數上的表現。
import seaborn as sns
>>> sns.set(style="darkgrid")
>>> tips = sns.load_dataset("tips")
>>> ax = sns.pointplot(x="time", y="total_bill", data=tips)
HeatMap
Heatmap(熱圖),是計算變數間皮爾森相關係數(預設),並以顏色來區分數值高低的矩陣圖。
要注意的是當資料中包含離群值會對皮爾森相關係數造成嚴重影響,建議要使用斯皮爾曼相關係數(spearman)或肯德爾相關係數(kendell)來繪製熱圖。
import numpy as np; np.random.seed(0)
>>> import seaborn as sns; sns.set()
>>> uniform_data = np.random.rand(10, 12)
>>> ax = sns.heatmap(uniform_data)