探索性資料分析(ExploratoryDataAnalysis,EDA)是資料分析的第一步,包含檢查數據的正確性、掌握資料脈絡以規畫進階的分析策略等重要步驟。R提供了許多執行EDA的工具,主要分為兩部分(1).敘述統計;(2).統計圖表。
關於(1).敘述統計(Descriptive-Statistics),可以分為數值型變數與類別型變數兩部分。本教材將針對R對數值型變數的敘述性統計進行說明。
對於描述數值型變數的資料中心點,我們可以使用:mean
計算向量的平均數、median
計算向量的中位數、table+sort
尋找眾數。
請同學輸入mean(x1)
計算x1的平均數
mean(x1)
請同學輸入median(x1)
計算x1的中位數
median(x1)
目前R沒有內建函數可以計算眾數。最簡單的方法是利用table+sort
。請同學輸入table(x1)
來看看x1各種值所出現個數。
table(x1)
從螢幕上的輸出,我們可以看到x1中包含:3個1、1個2、1個3、…、1個10。第一列代表向量元素的名稱,對應到x1中的值。第二列代表出現的次數。
根據table(x1)的輸出,x1的眾數為?
1
如果要取得眾數的值,我們可以使用:names(sort(-table(x1)))[1]
但是這樣會讓結果變成字串型態。在StackOverflow這個網站中,有許多網友討論了如何更方便地計算眾數。有興趣的同學可以參考:http://stackoverflow.com/q/2547402/1182304
另外也有一個套件:modeest
可以幫助我們計算眾數。有興趣的同學也可以自行摸索。
請同學計算分別計算x1,x2,x3與x4的平均數、中位數與眾數。
# 請同學計算x1的平均數
x1.mean <- local({
# 請填寫你的程式碼
mean(x1)
})
# 請同學計算x1的中位數
x1.median <- local({
# 請填寫你的程式碼
median(x1)
})
# 請同學計算x1的眾數
x1.mode <- local({
# 請填寫你的程式碼
1
})
# 請同學計算x2的平均數
x2.mean <- local({
# 請填寫你的程式碼
mean(x2)
})
# 請同學計算x2的中位數
x2.median <- local({
# 請填寫你的程式碼
median(x2)
})
# 請同學計算x2的眾數
x2.mode <- local({
# 請填寫你的程式碼
1
})
# 請同學計算x3的平均數
x3.mean <- local({
# 請填寫你的程式碼
mean(x3)
})
# 請同學計算x3的中位數
x3.median <- local({
# 請填寫你的程式碼
median(x3)
})
# 請同學計算x3的眾數
x3.mode <- local({
# 請填寫你的程式碼
100
})
x4.mean <- mean(x4)
x4.median <- median(x4)
x4.mode <- 2
為了方便比較,我們把同學計算出來的結果整理到變數answer_02
之中。請同學看看該變數
answer_02
請問平均數(mean)、中位數(median)和眾數(mode),哪一個會受到極端觀測值的影響?(比較x1與x2的結果)或是全部都不會受到影響(none)
mean
由於平均數容易受到極端值所影響,實務上可以使用修剪平均(trimmedmean),譬如跳水比賽,有五個評審,最終評分會先刪除最高與最低的分數,再從三個實得分中取得平均。在R中可以使用參數trim來指定要刪減的資料比率。舉例來說,trim=0.2就會刪除前後20%的資料請同學輸入以下程式碼練習修剪平均mean(x2,trim=0.2)
mean(x2, trim=0.2)
請問資料變成原本的100倍後,平均數(mean)、中位數(median)和眾數(mode),哪一個的值不會變成原來的100倍?(比較x1與x3的結果)或是全部都會變成原本的100倍(all)
all
請問資料變成原本的值加1後,平均數(mean)、中位數(median)和眾數(mode),哪一個的值不會變成原來的加1?(比較x1與x4的結果)或是全部都會變成原本的值+1(all)
all
並不是所有度量資料中心的指標,經過線性轉換後都能夠保有相同結果。譬如冪平均(powermean)即是反例。我們熟知的調和平均數、幾何平均數就是冪平均的特例。有興趣的同學請參考:https://en.wikipedia.org/wiki/Generalized_mean
請同學利用prod
(連乘)與^
(開根號)兩個數學算子計算x1的幾何平均數。
prod(x1)^(1/length(x1))
計算幾何平均數還有一個小技巧:exp(mean(log(x1)))
。因為log與exp互為反函數,所以我們可以聯想到廣義平均:F_inv(mean(F(x1))),其中F_inv是F的反函數。
接下來,我們介紹描述數值型變數分散程度的函數。
max(x1)
可以計算x1的最大值,請同學試試看
max(x1)
min(x1)
可以計算x1的最小值,請同學試試看
min(x1)
range(x1)
可以計算x1的最大值和最小值,請同學試試看
range(x1)
diff
則會計算一個數值向量,相鄰元素的差距(後減前)。搭配range
即可計算x1的全距。請同學試試看。
diff(range(x1))
請同學計算x1,x2,x3與x4的最大值、最小值與全距
# 請同學計算x1的最大值
x1.max <- local({
max(x1)
})
# 請同學計算x1的最小值
x1.min <- local({
min(x1)
})
# 請同學計算x1的全距
x1.range <- local({
diff(range(x1))
})
# 請同學計算x2的最大值
x2.max <- local({
max(x2)
})
# 請同學計算x2的最小值
x2.min <- local({
min(x2)
})
# 請同學計算x2的全距
x2.range <- local({
diff(range(x2))
})
# 請同學計算x3的最大值
x3.max <- local({
max(x3)
})
# 請同學計算x3的最小值
x3.min <- local({
min(x3)
})
# 請同學計算x3的全距
x3.range <- local({
diff(range(x3))
})
x4.min <- min(x4)
x4.max <- max(x4)
x4.range <- diff(range(x4))
# 請同學回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_01
,請同學看看它
answer_03_01
請問同學,全距是不是會受到極端觀測值的影響?(比較x1與x2的結果)
Yes
請問同學,在資料放大100倍後,全距的值不會變成原來的100倍?(比較x1與x3的結果)
Yes
請問同學,在資料全部加1後,全距的值會不會改變?(比較x1與x4的結果)
No
abs
可以計算向量的絕對值。mean
可以計算平均值。所以mean(abs(x1-mean(x1)))
就可以計算x1的平均差(MD)。請同學試試看
mean(abs(x1 - mean(x1)))
接著,請同學計算x1、x2和x3的平均差
# 請同學計算x1的全距
x1.MD <- local({
# 請填寫你的程式碼
mean(abs(x1 - mean(x1)))
})
# 請同學計算x2的全距
x2.MD <- local({
# 請填寫你的程式碼
mean(abs(x2 - mean(x2)))
})
# 請同學計算x3的全距
x3.MD <- local({
# 請填寫你的程式碼
mean(abs(x3 - mean(x3)))
})
x4.MD <- mean(abs(x4 - mean(x4)))
# 請同學回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_02
,請同學看看它
answer_03_02
請問同學,平均差是不是會受到極端觀測值的影響?(比較x1與x2的結果)
Yes
請問同學,在資料放大100倍後,平均差的值不會變成原來的100倍?(比較x1與x3的結果)
Yes
請問同學,在資料全部加1後,平均差的值會不會改變?(比較x1與x4的結果)
No
同樣的要領,我們可以計算MAD(MedianAbsoluteDeviation)。請同學組合median
與abs
找出x1的MAD。
median(abs(x1 - median(x1)))
R也有提供內建函數計算MAD。請同學輸入?mad
打開該函數的說明文件
?mad
請問下列哪一個不是mad
的參數?
method
R的mad
函數提供了一些彈性讓使用者設定。再說明之前,我們請同學先試試看:mad(x1)
mad(x1)
同學有沒有注意到,mad(x1)
和我們先前用median
與abs
組合的計算結果不同。這是因為R的mad
預設會使用一個常數(即mad
的參數constant
)來修正輸出結果。
根據Details的說明,如果利用神奇的1.4826乘上原本定義的MAD做修正。在某些條件下,修正後的MAD可以估計母體標準差。
請同學輸入:mad(x1,constant=1)
來看看結果是不是2(我們之前自行計算的結果)
mad(x1, constant = 1)
接著請同學計算x1,x2,x3,x4的MAD
# 請同學計算x1的Median Absolute Deviation
x1.MAD <- local({
# 請填寫你的程式碼
mad(x1, constant = 1)
})
# 請同學計算x2的Median Absolute Deviation
x2.MAD <- local({
# 請填寫你的程式碼
mad(x2, constant = 1)
})
# 請同學計算x3的Median Absolute Deviation
x3.MAD <- local({
# 請填寫你的程式碼
mad(x3, constant = 1)
})
x4.MAD <- mad(x4, constant = 1)
# 請同學回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_03
,請同學看看它
answer_03_03
請問同學,MAD是不是會受到極端觀測值的影響?(比較x1與x2的結果)
No
請問同學,在資料放大100倍後,MAD的值不會變成原來的100倍?(比較x1與x3的結果)
Yes
請問同學,在資料全部加1後,MAD的值會不會改變?(比較x1與x4的結果)
No
接著我們介紹如何計算百分位數
請同學先輸入?quantile
看看這個函數的說明文件
?quantile
quantile
函數的參數probs
即代表我們要選取的百分位。舉例來說,25百分位數,probs
參數就要設定為0.25。75百分位數,probs
就設定為0.75
請問同學,probs
的預設參數為何?
seq(0, 1, 0.25)
這裡複習一下seq
函數。請問同學,seq(0,1,0.25)
的長度會是多少?
5
由上述的說明,我們可以意識到,如果把一個向量放入probs
參數,quantile
函數就可以一次算出所有向量對應的百分位數
在說明文件中,Details的部分也有交代R實作的quantile
算法細節。請問同學,如果要更換實作方式,要用哪一個參數做調整?
type
type
參數一共有幾種設定呢?R實作了多少種quantile
的算法?
9
請同學嘗試算出x1的四分位差(請用預設的type
)
diff(quantile(x1, probs = c(0.25, 0.75)))
R也提供了內建函數來直接計算四分位差。請同學輸入:?IQR
看看說明文件
?IQR
請同學計算x1,x2,x3,x4的四分位差
# 請同學計算x1的四分位差
x1.IQR <- local({
# 請填寫你的程式碼
IQR(x1)
})
# 請同學計算x2的四分位差
x2.IQR <- local({
# 請填寫你的程式碼
IQR(x2)
})
# 請同學計算x3的四分位差
x3.IQR <- local({
# 請填寫你的程式碼
IQR(x3)
})
x4.IQR <- IQR(x4)
# 請同學回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_04
,請同學看看它
answer_03_04
請問同學,四分位差是不是會受到極端觀測值的影響?(比較x1與x2的結果)
No
請問同學,在資料放大100倍後,四分位差的值不會變成原來的100倍?(比較x1與x3的結果)
Yes
請問同學,在資料全部加1後,四分位差的值會不會改變?(比較x1與x4的結果)
No
接下來我們介紹R內建計算變異數與標準差的函數。
請同學先輸入:?var
看看計算變異數的說明文件
?var
請問var
計算的是母體變異數,還是樣本變異數呢?請同學閱讀Details段落的第五段後,作答。A代表母體變異數、B代表樣本變異數
B
請同學直接輸入var(x1)
計算x1的樣本變異數
var(x1)
請同學輸入?sd
閱讀計算標準差的說明文件
?sd
請問同學,sd
計算的是母體標準差,還是樣本標準差?請同學閱讀Details段落後作答。A代表母體標準差、B代表樣本標準差
B
請同學輸入sd(x1)
計算x1的樣本標準差
sd(x1)
請同學計算x1,x2,x3,x4的樣本變異數與樣本標準差
# 請同學計算x1的樣本變異數
x1.var <- local({
# 請填寫你的程式碼
var(x1)
})
# 請同學計算x1的樣本標準差
x1.sd <- local({
# 請填寫你的程式碼
sd(x1)
})
# 請同學計算x2的樣本變異數
x2.var <- local({
# 請填寫你的程式碼
var(x2)
})
# 請同學計算x2的樣本標準差
x2.sd <- local({
# 請填寫你的程式碼
sd(x2)
})
# 請同學計算x3的樣本變異數
x3.var <- local({
# 請填寫你的程式碼
var(x3)
})
# 請同學計算x3的樣本標準差
x3.sd <- local({
# 請填寫你的程式碼
sd(x3)
})
x4.var <- var(x4)
x4.sd <- sd(x4)
# 請同學回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_05
,請同學看看它
answer_03_05
請問同學,變異數是不是會受到極端觀測值的影響?(比較x1與x2的結果)
Yes
請問同學,在資料放大100倍後,變異數的值不會變成原來的100倍?(比較x1與x3的結果)
No
由於變異數帶有平方,所以當資料放大100倍之後,變異數應當要放大10000倍,也就是100的平方。
請問同學,在資料全部加1後,變異數的值會不會改變?(比較x1與x4的結果)
No
值得一提的是,變異數(或標準差)在加法性轉換時會改變,但是平均差(MAD)不變。
接著請同學利用sd
與mean
兩個函數計算x1,x2,x3與x4的變異係數
# 請同學計算x1的變異係數
x1.CV <- local({
# 請填寫你的程式碼
sd(x1) / mean(x1)
})
# 請同學計算x2的變異係數
x2.CV <- local({
# 請填寫你的程式碼
sd(x2) / mean(x2)
})
# 請同學計算x3的變異係數
x3.CV <- local({
# 請填寫你的程式碼
sd(x3) / mean(x3)
})
# 請同學計算x4的變異係數
x4.CV <- local({
# 請填寫你的程式碼
sd(x4) / mean(x4)
})
# 請同學存檔後回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_06
,請同學看看它
answer_03_06
請問同學,變異係數是不是會受到極端觀測值的影響?(比較x1與x2的結果)
Yes
請問同學,在資料放大100倍後,變異係數的值不會變成原來的100倍?(比較x1與x3的結果)
No
事實上,變異係數維持不變
請問同學,在資料平移後,變異係數的值會不會改變(比較x1與x4的結果)?
Yes
最後,我們請同學利用IQR
與median
計算x1,x2,x3與x4的Quartilecoefficientofdispersion
# 請同學計算x1的Quartile coefficient of dispersion
x1.QCD <- local({
# 請填寫你的程式碼
IQR(x1) / median(x1)
})
# 請同學計算x2的Quartile coefficient of dispersion
x2.QCD <- local({
# 請填寫你的程式碼
IQR(x2) / median(x2)
})
# 請同學計算x3的Quartile coefficient of dispersion
x3.QCD <- local({
# 請填寫你的程式碼
IQR(x3) / median(x3)
})
# 請同學計算x4的Quartile coefficient of dispersion
x4.QCD <- local({
# 請填寫你的程式碼
IQR(x4) / median(x4)
})
# 請同學存檔後回到console輸入`submit()`檢查答案
我們把同學計算的結果整理到變數answer_03_07
,請同學看看它
answer_03_07
請問同學,Quartilecoefficientofdispersion是不是會受到極端觀測值的影響?(比較x1與x2的結果)
No
請問同學,在資料放大100倍後,Quartilecoefficientofdispersion的值不會變成原來的100倍?(比較x1與x3的結果)
No
請問同學,在資料平移後,Quartilecoefficientofdispersion的值會不會改變(比較x1與x4的結果)?
Yes
我們將各種分散指標的特性:不受極端值影響(robustness)、不受數據等比例放大的影響(ratio.invariant)、會隨著數據等比例放大(ratio)與不會被數據同加同減影響(shift.invariant)整理到變數answer
。請同學看一看
answer