數據分析?從一開始你就錯了!探索性數據分析套路解讀

2021-01-12 R語言中文社區

作者:張土豆,R語言中文社區專欄作者

博客專欄:

https://www.hellobi.com/u/tudouZhang


在最初接觸數據分析時,常常把數據文件一股腦兒導入,接著開始嘗試各種模型,目的就是為了快速得到分析預測結果。但這樣倉促操作的後果並不像想像中高效,很多次在模型結果差的離譜時,回過頭才發現原來數據中的很多「不良」記錄也被用到的分析過程中。有時回過頭再仔細推敲一遍時,很多特徵之間的關係是顯而易見的,然而我卻在運用模型時沒有重點關注。

我開始思考,難道沒有一組「套路」可以操作?讓探索數據的過程更有章法。

在走了很多彎路之後,我學習到了「探索性數據分析」(EDA)這樣一個概念。第一次接觸在Coursera網站的這門ExploratoryData Analysis課程裡,這是一整套「數據分析課程」的其中一門,主要介紹了如何運用R語言對數據進行探索性的發現,將數據用簡單的圖示表示以便於更好的發現數據的潛在特徵。完成課程之初,並不以為這是數據分析過程中一個關鍵的步驟,在做項目時只是簡單的跑跑summary語句大概看看分布,之後還是我行我素。

直到最近在Kaggle上看了越來越多大神們的kernels,才猛然意識到EDA並不是一個可有可無的過程,而是進行建模分析之前的相當關鍵的步驟,它是幫助你熟悉數據並且探索數據的過程。在EDA的過程中,你能探索到越多的數據特性,你在建模的過程中就越高效。

在此決定把EDA過程總結並規範化,以便於自己和大家在未來進行探索性數據分析時有步驟可依。為了方便說明,會用到Kaggle上最近較火的Zillow房產數據分析比賽。

讀取數據

通常情況下,用於導入數據文件的方法有三類。分別是base R 中的read.csv(),readr library read_csv() 和data.table library 中的fread()。

在進行一些小型數據分析時,base R和readr library 足夠應付。但在處理的數據量越來越大時,最高效也最常用的是fread()。在讀入數據時,fread()會自動檢測各類數據,如sep,colClass和nrows等等。並且現在大量的數據都是機器產生的結構化數據,fread()能充分應付這類大型數據,為之後的數據分析開好頭。

library(data.table)train <-fread("train_2016_v2.csv")properties_2016 <-fread("properties_2016.csv")

基本數據統計信息

導入數據之後,就需要對數據進行全方位的查看。在接觸很多項目之後,我發現無論之前看過再多對數據的描述文檔,在真實「摸到」數據之前,其實腦海中對於數據的認知都是非常表面的。那麼數據到手之後,怎麼開始上手?

第一步,看數據。用head()語句首先查看數據結構。head()會列印出前6行數據。假如想要一次性看到更多數據,head()提供了可以設置行列的參數。

head(train)

   parcelid logerror transactiondate

1: 11016594   0.0276     2016-01-01

2: 14366692  -0.1684     2016-01-01

3: 12098116  -0.0040     2016-01-01

4: 12643413   0.0218     2016-01-02

5: 14432541  -0.0050     2016-01-02

6: 11509835  -0.2705     2016-01-02

head(train,10)

也許有不走尋常路的同學,想要從最後幾行數據來認識結構,R提供了tail(),操作和head()一樣。

第二步,查看統計數據。統計數據是指數據的最大最小值等。對於數值類型的數據,統計數據可以讓我們快速了解到這個數據的分布和均值如何,對數據範圍做到心裡有數。對於字符類型的數據,可能需要先轉換類型,再得到統計結果。

summary(train)

parcelid            logerror        transactiondate  

 Min.   : 10711738   Min.   :-4.60500   Length:90275     

 1st Qu.: 11559500   1st Qu.:-0.02530   Class :character 

 Median : 12547337   Median : 0.00600   Mode  :character 

 Mean   : 12984656   Mean   : 0.01146                    

 3rd Qu.: 14227552   3rd Qu.: 0.03920                    

 Max.   :162960842   Max.   : 4.73700  

train$transactiondate <- as.Date(train$transactiondate)summary(train)

   parcelid            logerror        transactiondate    

 Min.   : 10711738   Min.   :-4.60500   Min.   :2016-01-01 

 1st Qu.: 11559500   1st Qu.:-0.02530   1st Qu.:2016-04-05 

 Median : 12547337   Median : 0.00600   Median :2016-06-14 

 Mean   : 12984656   Mean   : 0.01146   Mean   :2016-06-11 

 3rd Qu.: 14227552   3rd Qu.: 0.03920   3rd Qu.:2016-08-19 

 Max.   :162960842   Max.   : 4.73700   Max.   :2016-12-30 

第三步,查看缺失數據(missing values)。數據集中通常會有一些缺失或不良數據,造成這些問題的理由很多樣。一些是源於人為的數據錄入問題,例如用戶的性別未填寫。或者有些是在從其他系統導出數據時產生的缺失。面對這些問題,我們在使用數據時應該儘量避免選擇缺失量過大的屬性。所以在分析之前,我們需要掌握數據的缺失情況。

通常採取的操作是統計出每一項屬性中缺失數據所佔比例,然後以圖像簡單直接的呈現出來。我最常用的就是柱狀圖,把排序後的缺失率結果展示出來。因此在之後進行分析決策時,那些缺失率相對較高的特徵應該被排除在外。

color:blue">library(dplyr) missinga_values <- properties_2016 %>%summarise_each(funs(sum(is.na(.))/n()))missing_values <- gather(missinga_values,key ="feature",value = "missing_percent")missing_values %>% ggplot(aes(x =reorder(feature,missing_percent),y = missing_percent)) + geom_bar(stat ="identity",fill ="light blue") + theme_bw() + coord_flip()


單一變量分析

對於有些重要的變量,我們希望了解它的分布組成。比如一組數據的時間分布或者一組數值的區間分布,這些都屬於這個單一變量的變化。

在Zillow這個項目中,交易產生的時間和每筆交易的誤差是我們想要重點研究的。對於這類分析,我們可以畫出數據的直方圖或者密度圖。

train %>% ggplot(aes(x = logerror)) + geom_histogram(bins = 400, fill = "red")++ theme_bw() + theme(axis.title = element_text(size = 16),axis.text = element_text(14))++ ylab("Count") + xlab("Logerror") + coord_cartesian(x=c(-0.5,0.5))


train %>% ggplot(aes(x = logerror)) + geom_density(fill = "steelblue",color = "steelblue") + coord_cartesian(x = c(-0.5,0.5))


對於交易時間分布也是類似,將數據簡單組合歸類之後,畫出分布直方圖。

train %>% + mutate(year_month = make_date(year = year(transactiondate), month= month(transactiondate))) %>% + group_by(year_month) %>% + count() %>% + ggplot(aes(x=year_month,y= n)) + geom_bar(stat= "identity", fill = "lightblue") + geom_vline(aes(xintercept = as.numeric(as.Date("2016-10-01"))),size = 3) + labs(y = "Count")


多變量分析

多變量分析是統計學裡一個重要的方法,也是單變量分析的延伸。幾乎我們想在所面臨的所以數據分析項目都是多變量的,也就是說問題涉及的因素是多種多樣的。這篇文章主要介紹的是探索性分析,所以就只介紹幾個高效好用的多變量分析方法。

關聯性分析

當數據只是一列列數字時,我們很難發現各個變量之間的聯繫,這時候最好的就是對整體做一組關聯性分析,然後將結果用圖像呈現出來。用corrplotlibrary中的cor()可以幫我們求出變量之間的相關矩陣,再做得關係矩陣圖。(關於關係矩陣圖的屬性還有很多介紹,需要的朋友可以查閱corrplotpackage)

library(corrplot)cnt_vars <- c('bathroomcnt', 'bedroomcnt', 'calculatedbathnbr', 'finishedfloor1squarefeet', 'calculatedfinishedsquarefeet', 'fireplacecnt','fullbathcnt', 'garagecarcnt', 'garagetotalsqft', 'roomcnt', 'threequarterbathnbr', 'unitcnt', 'numberofstories', 'logerror')cor_matrix <- cor(dtrain[,..cnt_vars],use = 'pairwise.complete.obs')


corrplot(cor_matrix,insig = "blank")


通過corrplot,我們可以清晰的發現哪些參數之間是正相關或負相關,在之後的建模分析中更有針對性。

組合分析

根據前幾步的初步學習,我們對數據集有了一個基本的了解,接下來可以進一步探查變量之間的關係。通常會有幾組目標組合,想要探查或者驗證我們的猜測是否準確。此時我們就需要提出問題,然後通過做圖將他們展示出來,這樣可以讓我們更容易發現數據規律以及一些我們容易遺漏的情況。

train %>% mutate(year_month = make_date(year = year(transactiondate), month= month(transactiondate))) %>%group_by(year_month) %>%summarize(mean_logerror = mean(logerror)) %>% ggplot(aes(x= year_month, y = mean_logerror)) + geom_line(size =1.5, color = "lightblue") + geom_point(size = 5, color = "lightblue")


cor_temp %>% group_by(yearbuilt) %>% summarize(mean_logerror = mean(logerror),n()) %>% ggplot(aes(x = yearbuilt,y= mean_logerror))+ geom_smooth(color = "grey40") + geom_point(color = "red") + ggtitle("Relationship between Built_year and logerror") +labs(x="Built year",y="Mean logerror") + coord_cartesian(ylim = c(0,0.075)) + theme_bw()


以上就是我在不斷摔跤試錯過程中總結的一些套路,大家學會了麼?歡迎大家相互交流,讓我們在數據分析的道路上共同進步!


微信回復關鍵字即可學習

回復 R              R語言快速入門免費視頻 
回復 統計          統計方法及其在R中的實現
回復 用戶畫像   民生銀行客戶畫像搭建與應用 
回復 大數據      大數據系列免費視頻教程
回復 可視化      利用R語言做數據可視化
回復 數據挖掘   數據挖掘算法原理解釋與應用
回復 機器學習   R&Python機器學習入門 

相關焦點

  • 數據分析領域的探索性數據分析究竟是什麼?
    我們經常討論數據分析和Bl科學方面:執行複雜查詢所需的計算和算法。當然,Bl的很大一部分是數學,在一般情況下理解數據需要計劃如何在一端構建分析結構,在另一端解釋結果,在一些人眼中這是一種藝術形式。什麼是探索性數據分析?探索性數據分析(EDA)是數據分析過程的第一步。
  • 從電影中看:探索性數據分析思維應用
    這些是否也是你的疑問?或者說,在聽過各位乘客的回答後,你是否也產生了一些疑問?如果答案是「yes」,恭喜你,你已經在做探索性分析了!EDA——探索性數據分析探索性數據分析(EDA)是數據分析過程的第一部分。
  • 探索性數據分析(EDA),你會使用嗎?
    所謂探索性數據分析(Exploratory Data Analysis,以下簡稱EDA),是指對已有的數據(特別是調查或觀察得來的原始數據)在儘量少的先驗假定下進行探索,通過作圖、制表、方程擬合、計算特徵量等手段探索數據的結構和規律的一種數據分析方法。
  • 從零開始數據分析:一個數據分析師的數據分析流程 | 網際網路數據...
    數據分析百科給出準確定義:指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。簡而言之就是有目的的收集數據、分析數據,使之成為信息的過程。
  • 從零開始數據分析:一個數據分析師的數據分析流程
    數據分析百科給出準確定義:指用適當的統計分析方法對收集來的大量數據進行分析,提取有用信息和形成結論而對數據加以詳細研究和概括總結的過程。簡而言之就是有目的的收集數據、分析數據,使之成為信息的過程。
  • Pandas自動進行探索性數據分析,節省可視化和理解數據的時間
    根據Wikipedia的說法,探索性數據分析(EDA)是一種分析數據集以總結其主要特徵的方法,通常使用視覺方法。因此,EDA是理解基礎數據,變量分布及其相關性的過程。這使得EDA成為構建任何統計模型之前任何數據科學過程中的第一步。
  • 如何使用Pandas-Profiling進行探索性數據分析
    當開始一個新的機器學習項目時,獲得機器學習數據集之後的第一步就是要了解它。我們可以通過執行探索性數據分析(EDA)來實現這一點。這包括找出每個變量的數據類型、目標變量的分布、每個預測變量的不同值的數量、數據集中是否有重複值或缺失值等。進行EDA探索機器學習數據集的過程往往是非常耗時的。什麼是Pandas-Profiling?
  • 探索性因素分析與驗證性因素分析的差異
    研究者的假定是每個指標變量都與某個因子匹配,而且只能通過因子載荷憑知覺推斷數據的因子結構。驗證性因子分析的主要目的是決定事前定義因子的模型擬合實際數據的能力,以試圖檢驗觀測變量的因子個數和因子載荷是否與基於預先建立的理論的預期一致。驗證性因子分析的主要目的是決定事前定義因子的模型擬合實際數據的能力,以試圖檢驗觀測變量的因子個數和因子載荷是否與基於預先建立的理論的預期一致。
  • 常見的四種數據分析方法
    當開始數據分析項目時,通常首先分別分析每個變量,以描述擁有的數據並評估其質量,接下來的步驟是探索變量之間存在的關係。這些關係可能會導致對數據所代表的總體得出某些推論或結論。結論可能會導致數學模型預測當前不在數據集中的數據結果。但是,在導致決策或行動步驟之前,數據分析無效。
  • 怎樣提升數據分析能力,數據分析的正確步驟
    在這個大數據時代,數據分析能力在職場中顯得尤為重要,不會數據分析基本就是一塊廢柴,在職場中很難生存,但要想學好數據分析,並沒有那麼容易,很多人都是下定決心入門學習,可是又不知道從哪開始,複雜的算法、龐大的數據、眼花繚亂的代碼……最終還是止步於頭腦鬥爭,無法付諸實際行動。但只要你克服了以下6大難題,數據分析能力蹭蹭往上漲。
  • 如何提升數據分析能力,數據分析的正確步驟
    在這個大數據時代,數據分析能力在職場中顯得尤為重要,不會數據分析基本就是一塊廢柴,在職場中很難生存,但要想學好數據分析,並沒有那麼容易,很多人都是下定決心入門學習,可是又不知道從哪開始,複雜的算法、龐大的數據、眼花繚亂的代碼……最終還是止步於頭腦鬥爭,無法付諸實際行動。但只要你克服了以下6大難題,數據分析能力蹭蹭往上漲。1.很難獲得用戶操作行為完整日誌。
  • 數據分析常規分析思路及圖表類型解讀
    大數據是一種從各種類型的數據中快速獲取有效且有價值的信息的技術。 在大數據領域,當今已經出現了大量新的且易於操作的技術。 有效的工具。 毋庸置疑,大數據市場是一座待挖掘的金礦。隨著數據使用量的增長,將有更多的人通過數據來尋求專業問題的答案。
  • 驗證性因子分析與探索性因子分析的區別 | 附:量表編制步驟
    最近有老師問驗證性因子分析和探索性因子分析的區別,是不是在做量表的時候需要做驗證性因子分析?那麼是在什麼時候做?很明顯,編制量表的時候一定是需要做驗證性因子分析的。1.在進行探索性因子分析的時候,量表條目最終能形成幾個條目是未知的。
  • 探索性因子分析
    探索性因子分析(EFA)數據要求:等距數據;樣本規模是指標的10
  • 數據分析方法:RFM模型
    編輯導語:RFM是很傳統的數據分析模型,幾乎所有文章都會提到它,然而市面上流傳的各種亂用、錯用也非常多;本文作者對RMF做出了詳細的分析,我們一起來了解一下。上一篇講了【用戶畫像高大上,但90%的人都做失敗了】以後,很多同學表示想看RFM,今天它來了。
  • 探索性數據分析的圖形化探索
    1.圖形化探索圖形化探索又稱為可視化描述,通過圖表的形式將數據的各個特徵呈現出來,不同的圖有著各自的優勢和缺陷,在實際運用過程中可以綜合使用進行數據的分析:累積分布圖箱型圖條形圖餅圖散點圖圖形化探索相比於數位化的探索結果看起來更直觀,更能反應數據分布的特點
  • 大數據開發和大數據分析有什麼不同?
    不管是你使用Siri,google搜索,還是瀏覽facebook的好友動態,你都在消費者數據分析的結果。我們賦予了數據如此大的轉變的能力,也難怪近幾年越來越多的數據相關的角色被創造出來。這些角色的職責範圍,從預測未來,到發現你周圍世界的模式,到建設操作著數百萬記錄的系統。在這篇文章中。我們將討論不同的數據相關的角色,他們如何組合在一起,並且幫你找出那些角色是適合你自己的。
  • 大數據分析與數據分析的根本區別在哪裡?
    作者:CDA數據分析師大數據分析與數據分析這幾年一直都是個高頻詞,很多人都開始紛紛轉行到這個領域,也有不少人開始躍躍欲試,想找準時機進到大數據或數據分析領域。如今大數據分析和數據分析火爆,要說時機,可謂處處都是時機,關鍵要明了的一點是,大數據分析和數據分析兩者的根本區別在哪裡,只有真正了解了,才會知曉更加適合自己的領域是大數據分析師還是數據分析師。畢竟職場如戰場,時間就是生活,不容兒戲,更不容怠慢。下面我來好好告訴大家兩者的本質區別到底是什麼!大數據分析:指無法在可承受的時間範圍內用常規軟體工具進行捕捉、管理和處理的數據集合。
  • 探索性測試和手工測試的比較和分析
    探索性測試和猜數字遊戲完全一樣。在這裡要猜的數字就是你要找的bug。你問的問題就是你做的測試,每個問題的答案就是你測試過程中產品的輸出。第一輪你只有一個非常模糊的範圍比如測試某個模塊的某個功能。在你測試的時候通過觀察產品的反應和輸出來判斷分析下一步做什麼會發現bug。當然實際測試中不會像猜數字那樣直接和簡單。下面我們來看一下一個真實的測試例子。
  • 14個超有趣的數據分析項目,數據集都給你整理好啦
    轉載自大數據文摘 對於那些對數據,數據分析或數據科學感興趣的人,提供一份可以利用業餘時間完成的數據科學項目清單,一共14個! 項目分為三種類型: 可視化項目 探索性數據分析(EDA)項目 預測建模 可視化項目 最容易上手的就是數據可視化, 以下