探索性数据分析
探索性數據分析
介紹
當有人扔給你一份數據時,你對這份數據完全陌生,又沒有足夠的業務背景,會不會感覺無從下手。如果你什么都不管,直接把數據喂給各種模型,卻發現效果不好,因為你沒有好的特征,那么你可能需要的是數據探索。
首先什么是探索性數據分析(Exploratory Data Analysis,EDA)?
實際上,這是一系列的方法,它的目的就是讓你最大化對數據的直覺,為了讓你對數據有感覺,你不僅需要知道數據里有什么,你還需要知道數據里沒有什么,而完成這件事情的方法只有一個,那就是結合各種統計學的圖形把數據以各種形式展現在我們面前。它可以完成這些事情:
舉一個例子:
| 10 | 8.04 | 10 | 9.14 | 10 | 7.46 | 8 | 6.58 |
| 8 | 6.95 | 8 | 8.14 | 8 | 6.77 | 8 | 5.76 |
| 13 | 7.58 | 13 | 8.74 | 13 | 12.74 | 8 | 7.71 |
| 9 | 8.81 | 9 | 8.77 | 9 | 7.11 | 8 | 8.84 |
| 11 | 8.33 | 11 | 9.26 | 11 | 7.81 | 8 | 8.47 |
| 14 | 9.96 | 14 | 8.1 | 14 | 8.84 | 8 | 7.04 |
| 6 | 7.24 | 6 | 6.13 | 6 | 6.08 | 8 | 5.25 |
| 4 | 4.26 | 4 | 3.1 | 4 | 5.39 | 19 | 12.5 |
| 12 | 10.84 | 12 | 9.13 | 12 | 8.15 | 8 | 5.56 |
| 7 | 4.82 | 7 | 7.26 | 7 | 6.42 | 8 | 7.91 |
| 5 | 5.68 | 5 | 4.74 | 5 | 5.73 | 8 | 6.89 |
有這么一些數據,如果你通過一些描述性的指標來表示這些數據,你或許可以得到這些:
對于X1 Y1這兩列數據
N = 11
Mean of X = 9.0
Mean of Y = 7.5
Intercept = 3
Slope = 0.5
Standard deviation of residuals = 1.126
Correlation = 81.7%
對于X2 Y2這兩列數據
N = 11
Mean of X = 9.0
Mean of Y = 7.5
Intercept = 3
Slope = 0.5
Standard deviation of residuals = 1.126
Correlation = 81.7%
對于X3 Y3這兩列數據
N = 11
Mean of X = 9.0
Mean of Y = 7.5
Intercept = 3
Slope = 0.5
Standard deviation of residuals = 1.126
Correlation = 81.7%
X4 Y4跟他們都是一模一樣的,但是如果你把他們畫出來你會發現他們完全不一樣。
我們從圖中可以非常容易看出
EDA技術
在這一節將要介紹當你拿到一些數據時,去探索它所用到的一些技術,以及分析的方法。這些技術可以劃分為兩類,一是基于圖像的,二是基于定量方法的。
探索性數據分析常用的一些常見問題:
數據的典型值是多少(均值,中位數等)?
典型值的不確定性是什么?
一組數據的良好分布擬合是什么?
數據的分位數是多少?
一個工程上的修改是否有作用?
一個因子是否有影響?
最重要的因素是什么?
來自不同實驗室的測量結果是否相等?
將響應變量與一組因子變量相關聯的最佳函數是什么?
什么是最好的因子設置?
我們可以將時間相關數據中的信號與噪聲分離嗎?
第一步,你需要根據你的任務來決定EDA需要回答以上哪些問題,哪些問題對你來說是最重要的。當你決定好需要回答哪些問題時,就可以選擇合適的EDA技術去回答你的問題。
接來下我會逐一介紹各個數據探索的技術
下面部分用到的數據在這里:https://raw.githubusercontent.com/358463121/markdown_notebook/master/eda/data.txt,直接復制到R中運行即可
1.自相關圖
這是一種常見的檢驗數據集隨機性的技術。它通過計算不同時滯下的自相關系數來刻畫。
圖中的Y軸是自相關系數:
取值在-1到1之間
橫坐標是:時滯(time lag) h(h=1,2,3,…)
從形式上看自協方差則是序列的樣本方差。自相關圖刻畫了不同時滯下時間序列的自相關性。所以自相關圖還常常用來對AR模型進行定階。
比如說有這么一個時間序列AR(2):
那么它的1階,2階的自相關系數應該很大,然后階數越大,自相關系數逐漸減少。
自相關圖可以回答以下幾個問題:
我們對比幾張自相關圖看看:
隨機序列:
弱自相關(系數的取值很小):
強自相關:
正弦波:
2.雙柱狀圖(Bihistogram)
這是一種與兩樣本t檢驗相對應的技術,當你還在糾結于均值,尺度,偏度,異常值,峭度等等數字背后直觀感覺時,其實簡單的把數據的直方圖就很明顯了。
它除了比較兩個變量的分布之外,還可以有另外的用法。比如說,我們可以畫出不同性別,男女這兩個水平下的身高的分布,從而比較性別是否會對身高有顯著的影響。
可以用R語言來畫該圖
library(Hmisc) histbackback(split(y,batch),ylab="Strength of Ceramic",brks=seq(300,900,by=25))3.塊圖(Block Plot)
這是一個對應于方差分析(ANOVA)的EDA技術。它可以給予我們方差分析所沒有的直觀感受。它可以直觀地判斷一個因子是否有用。
- 縱坐標:變量Y的值(平均失敗每小時)
- 橫坐標:所有次要因子的水平的組合(在這里是plant speed shift這3個因子共有種組合)
- 圖中的1,2表示主要因子(weld method)取1和取2時對Y的不同影響。
從圖中我們可以看到,顯然不管次要因子的取值如何,weld method取2時,大部分時間都比取1更有效。從而證明了,我們這個weld method因子是一個非常泛化和穩定的特征。我們也可以從圖中看到次要因子的哪一個組合是最有效的。
畫圖代碼:
library(dplyr) avg<-df%>%group_by(lab,batch)%>%summarise(x=mean(y))## Generate the block plot. boxplot(avg$x ~ avg$lab, medlty="blank",ylab="Ceramic Strength",xlab="Laboratory",main="Batch Means for Each Laboratory") ## Add labels for the batch means. text(avg$lab[avg$batch==1], avg$x[avg$batch==1],labels=avg$batch[avg$batch==1], pos=1) text(avg$lab[avg$batch==2], avg$x[avg$batch==2],labels=avg$batch[avg$batch==2], pos=3)4.Bootstrap Plot
- 縱坐標:有放回抽樣的樣本計算出來的統計量
- 橫坐標:抽樣的次數
Bootstrap Plot就是簡單地把每次抽樣,從而計算得到的統計量畫出來
這圖是500次隨機抽樣,計算均值的Bootstrap圖,可以看到均值集中在650左右,同時也可以計算出均值所在的90%置信區間是[644.7045,655.5157]
要注意的是bootstrap 并不適用于所有的分布和統計量。 例如,由于均勻分布的形狀,bootstrap 不適于估計嚴重依賴于尾部的統計的分布,例如取值范圍。
library(boot) ## Bootstrap and CI for mean. d is a vector of integer indexes set.seed(0) samplemean <- function(x, d) {return(mean(x[d])) } b1 = boot(y, samplemean, R=500) z1 = boot.ci(b1, conf=0.9, type="basic") meanci = paste("90% CI: ", "(", round(z1$basic[4],4), ", ", round(z1$basic[5],4), ")", sep="" ) ## Generate bootstrap plot. par(mfrow=c(1,2)) plot(b1$t,type="l",ylab="Mean",main=meanci) hist(b1$t,main="Bootstrap Mean",xlab="Mean")5.Box-Cox Linearity Plot
box-cox變換:
它可以用來消除偏斜和其他分布特征,使得能夠將數據向正態分布靠攏。這樣做的目的是因為大部分模型或檢驗都需要對變量的分布做正態性假設,如果變量不滿足正態分布,那么就有可能導致模型不準確,那么做一個box-cox變換或許是一個不錯的選擇。
這一個圖可以回答這兩個問題
當然,對于boxcox的參數使得數據變換后的正態性最強來進行選擇。
以下是通過對Y回歸,然后計算不同的取值越好(這是因為線性模型是假設噪聲服從正態分布的)
library(MASS) boxcox(Volume ~ log(Height) + log(Girth), data = trees,lambda = seq(-0.25, 0.25, length = 10))6.箱線圖
這個大家都很熟,我也不多說。簡單地說,箱線圖刻畫了一個變量的1/4分位數 3/4分位數,中位數,還有異常值。
箱線圖同樣可以用來判斷一個因子的影響是否顯著,通過將不同水平的箱線圖畫出來,看看是否會對目標變量Y的分布有影響。
7.Complex Demodulation Amplitude Plot
一個常用的時間序列分析模型就是一個正弦模型:
而這個圖,則是用來確定這個振幅是不是一個常用的。即模型可以寫成這樣:
我們通過把不同時間下的振幅計算出來,就可以得到我們的Complex Demodulation Amplitude Plot:
- 振幅穩定在390附近
- 振幅有一個啟動的過程
- 在左右振幅有一個較大的波動,可以考慮在那附近出現了異常,需要仔細排查。
還有一個畫移相的圖
8.等高線圖(Contour Plot)
當你有3個變量時,你可以使用等高線圖來觀測x,y的取值對z變量的影響。當然,你可以選擇畫三維圖。
#等高線圖一個簡單的例子 x <- -6:16 contour(outer(x, x), method = "edge", vfont = c("sans serif", "plain"))DOE Contour Plot
這是一種專門用于全因子設計和部分因子設計的等高線圖。通常這些設計用”-1”或”-“表示低水平,用”+1”或”+”表示高水平。也有可能出現中水平,則用”0”表示。
看不懂 下一個。。
9.DOE Scatter Plot
DOE散點圖是用于分析試驗數據的方法。它畫出了每個因子對應的每個水平對因變量Y的影響。如果每個水平有重復值,那么就可以用這個方法,將不同水平對應的Y取值畫到圖上。同樣,你也可以畫出不同水平下的均值或標準差,然后用直線連接,那么這就是 DOE mean plot和DOE standard deviation plot。
在這個圖中,有7個因子,里面中間的水平線表示所有數據的均值。從這個圖里面我們可以看到:
同理,如果我們畫出每個水平對應Y的均值就可以得到DOE Mean Plot
從這個圖可以看出因子的重要程度為:4>2>1>7>6>3,5
它可以用來判斷因子的重要程度,以及重要程度的排名。
畫出不同因子水平的標準差就可以得到DOE Standard Deviation Plot
10.Lag plot
lag plot可以用來檢查數據或時間序列是不是隨機序列。如果是隨機的,那么在lag plot中是看不出任何結構的。
這個圖就是簡單地以作為縱軸。
從上面這個圖可以看出有著顯著的線性關系。這一個數據顯然是非負的,而且也可以看出這個時間序列或許是滿足自回歸模型的。
當然,同樣可以使用滯后2期,3期來畫這個圖,不過一般都設lag=1.
我們多看幾個例子:
隨機數據:
適中程度的自回歸:
強烈的自回歸:
數據服從正弦模型以及存在離群值:
data=cumsum(runif(100,-5,5)) lag.plot(data)11.線性相關圖(Linear Correlation Plot)
線性相關圖常用于評估各組之間對目標變量Y的相關性是否一致。除了考慮相關性是否一致,你也可以考慮斜率(Linear Slope Plot)或截距(Linear Intercept Plot)與目標變量Y是否一致。
舉個例子,你可以將一個一年的數據分為12個月,你希望知道每個月的客流量對你商品銷量的影響是否一樣。那你就可以畫線性相關圖來檢驗你的假設。
當然,有時候你的數據可能沒有分組,那么如果你有的數據來自不同的數據源,也可以把數據源作為分組。
從這個圖可以看到每個組的相關性都是差不多的。
如果我們把相關系數變成截距可以得到:
可以看到截距是有所差異的,不過這些差異其實很小。
再看看斜率的:
所有的分組的斜率都在0.174的附近,偏差0.002,差異也很小,這可能意味著我們只需用其實一個分組進行擬合就足夠了。
你還可以畫出不同分組擬合后殘差的標準差:
其中實線部分是使用全部數據的誤差的標準差,這個值一般都會比分組數據的大。
12.均值圖(Mean Plot)
均值圖一般用來比較數據中不同分組之間均值的差異。這個分組是由分析師決定的。比如說,我們可以用一個月作為一組,這樣一年就可以分成12組。所以這個均值圖就是將每個分組的均值畫出來就可以了。當然,你也可以將均值替換成中位數,眾數,切尾平均數,縮尾均值等統計量。
這個圖可以回答以下問題:
13.Q-Q圖(Quantile-Quantile Plot )與P-P圖(probability–probability plot)
P-P圖是數據的經驗累積分布函數與特定的累積分布函數F(·)間的比較。 而Q-Q圖則是數據分位數與某個理論分布分位數間的比較。 P-P圖和Q-Q圖的構造和解釋主要有三個不同點:
Q-Q圖的構造不需要指定F(·)的位置或尺度參數。理論分位數可以從一個指定的理論分布中直接計算。若點在圖上的排列呈線性,而且位置和尺度參數可以直觀地對應于該直線的截距和斜率。相比之下,P-P圖的構造需要F(·)的位置和尺度參數來評估有序數據的cdf。
Q-Q圖上點是否呈線性趨勢并不受分布的位置或尺度參數變化的影響。而在P-P圖上,位置或尺度的變化不一定能保持線性。
在Q-Q圖上,表示特定理論分布的參考線取決于該分布的位置和尺度參數,其截距和斜率對應于位置和尺度參數。在P-P圖上,任何分布的參考線總是對角線y = x。
因此,如果您的目標是將數據分布與僅在位置和規模上變化的分布族進行比較,特別是如果要從圖中估計位置和比例參數,則應使用Q-Q圖。
P-P圖的優點是它們在高概率密度的區域是可區分的,因為在這些區域中,經驗和理論累積分布比在低概率密度區域變化得快的多。例如,如果將數據分布與特定的正態分布進行比較,兩個分布間的差異在P-P圖上要比在Q-Q圖更明顯。
這是一個QQ圖,從這個圖里面可以看出:
- 這兩個batch的數據(橫縱坐標)顯然不是來自同一個分布的
- batch1的數據明細的大于batch2的數據
- 數據在525到625間差異較大,而再之后則差異沒那么大。
QQ圖的組成:
- 橫坐標:數據集1的分位數
- 縱坐標:數據集2的分位數
QQ圖可以告訴我們:
- 兩個數據是否來自同一分布,你也可以檢驗數據是否來自某個特定分布,比如說正態分布,這時你只需要計算正態分布的理論分位數就可以了,下面同理。
- 兩個數據是否有相同的位置與尺度
- 兩個數據是否有相似的分布形狀
- 兩個數據的分布的尾部是否有相似的地方
14.散點圖
這或許是最為常用的方法之一了,我估計大家都很熟。。我就簡單過一下
這是隨機數據的散點圖形狀:
線性相關的數據:
二次曲線的數據:
指數關系的數據:
正弦數據:
與X獨立的同方差擾動:
與X不獨立的異方差性(隨著X增大噪聲的方差也增大):
關于異方差,這個可以通過加權最小二乘法,boxcox變換,對數變換等方法來解決。
15.Spectral Plot
通過傅里葉變換,將數據從時域變換到頻域
看上面這幅動圖,里面最后藍色的線就是我們的Spectral Plot
如果模型是這個形式的:
從這幅圖可以看出其主要頻率是0.3
這個圖可以回答一下問題:
關于傅里葉變換已經有很多出色的資料,我不多說了,比如說這個,傅里葉分析之掐死教程(完整版)
16.Weibull Plot
威布爾分布(Weibull distribution),又稱韋伯分布或韋布爾分布,是可靠性分析和壽命檢驗的理論基礎。它在可靠性工程中被廣泛應用,尤其適用于機電類產品的磨損累計失效的分布形式。由于它可以利用概率值很容易地推斷出它的分布參數,被廣泛應用于各種壽命試驗的數據處理。
它的條件概率密度如下:
其中是尺度(scale)參數。
對于這個分布的解釋我們可以這樣理解,
- 失敗概率隨著時間增加而增加。這一情況通常會出現在壽命等問題上。
若數據服從Weibull分布,那么數據就會有如此的關系:
我們把ln(x)作為x軸,作為Y軸就可以得到以下這個圖:
該圖顯示在該63.2%點處的水平線和水平線與最小二乘擬合線相交的垂直線。該垂直線示出尺度參數的值。
這個Weibull圖顯示:
注意,x軸(“0”,“1”和“2”)上的值是指數。 這些實際上表示值100 = 1,101 = 10和102 = 100。(100表示10的0次方)
威布爾圖由以下形成:
- y軸:威布爾累積概率表示為百分比
- x軸:有序故障次數(在LOG10刻度中)
垂直刻度是ln(-ln(1-p)),其中p =(i-0.3)/(n + 0.4),i是觀察的秩。 選擇該尺度以便線性化Weibull數據的所得圖。
17.Youden Plot
Youden圖是用于分析interlab數據的圖形技術,適用于每個實驗在同一產品上進行兩次評估或在兩個不同產品上運行一次評估時。
Youden圖是用于比較實驗室內變異性和實驗室間變異性的簡單但有效的方法。
此圖顯示:
Youden圖形由以下形成:
此外,圖符號是lab id(通常是從1到k的整數,其中k是實驗室的數量),有時會繪制45度的基準線,理想情況下,產生兩次相同產物的實驗室應該按理產生相似的結果。離開此參考線表示與實驗室不一致。如果兩個不同的產品在測試,45度線則可能不合適。然而,如果實驗室是一致的,點應該靠近一些擬合的直線。
Youden圖本質上是一個散點圖,因此在支持散點圖的任何通用統計程序中為Youden圖寫一個宏應該是可行的。
18.t-sne
我覺得在這里有必要提一下t-sne這個技術。想象一下你有一個包含數百個特征(變量)的數據集,對數據所屬的域幾乎沒有什么了解。 您需要識別數據中的隱藏模式,探索和分析數據集。
這是否讓你不舒服? 它讓我的手汗水,當我第一次遇到這種情況。 你想知道如何探索一個多維數據集嗎? 這是許多數據科學家經常問的問題之一。 而t-sne可以做到這一點。目前有很多t-sne介紹的文章,比如:從SNE到t-SNE再到LargeVis
和Comprehensive Guide on t-SNE algorithm with implementation in R & Python。
簡單地說它是一種非線性降維的算法。通過將數據降到2維或3維,然后就可以用一個散點圖或3d圖來表示我們這些高維的數據,而且它的效果也非常的好。另外降維后的結果也可以作為一個額外特征加入到其他任務中。
這個算法的核心思想就是,高維數據下數據間的距離,與映射到低維后數據間的距離應該是非常相似的。通過優化這個目標就可以得到非常好的效果。它與SNE不同的地方就是將低維空間下數據間的距離用t分布來表示,這就可以使得高維中距離較近的點在低維更近,高維中距離較遠的點在低維更遠。具體原因可以看這里從SNE到t-SNE再到LargeVis
我們來試試這個算法,先下載一份minist數據:https://pan.baidu.com/s/1bpiT3Vh
這是一份手寫字體圖片的數據,每個樣本是一個圖片,每個圖片的大小是28*28,展開后就一共有784個取值為0-254的像素特征。這里一共有10000個樣本。數據的第一列是標簽。
我們在R運行下面代碼可以得到這樣的圖:
可以看到基本上相同數字的變量都聚集在一起了,它的區分效果也是很棒的。不過綠色跟粉色的區分度就比較低。
它在tensorflow中同樣也有相應的實現,具體可以看:谷歌開源Embedding Projector,可將高維數據可視化
用tensorflow做出來的效果也是很驚艷的
參考資料
http://www.itl.nist.gov/div898/handbook/index.htm
http://onlinestatbook.com/2/transformations/box-cox.html
這是用Dataplot畫圖的代碼
Comparison of P-P Plots and Q-Q Plots
傅里葉分析之掐死教程(完整版)
Weibull distribution
從SNE到t-SNE再到LargeVis
Comprehensive Guide on t-SNE algorithm with implementation in R & Python
word2vec 中的數學原理詳解
Laurens V D M, Hinton G. Visualizing Data using t-SNE[J]. Journal of Machine Learning Research, 2008, 9(2605):2579-2605.
作為分享主義者(sharism),本人所有互聯網發布的圖文均遵從CC版權,轉載請保留作者信息并注明作者a358463121專欄:http://blog.csdn.net/a358463121,如果涉及源代碼請注明GitHub地址:https://github.com/358463121/。商業使用請聯系作者。
總結
- 上一篇: Python编程的例子----股票数据接
- 下一篇: 数学建模常用模型之秩和比综合评价法