探索性數據分析:銀行信貸數據集

探索性數據分析:銀行信貸數據集

歡迎關注天善智能,我們是專注於商業智能BI,人工智能AI,大數據分析與挖掘領域的垂直社區,學習,問答、求職一站式搞定!

對商業智能BI、大數據分析挖掘、機器學習,python,R等數據領域感興趣的同學加微信:tstoutiao,邀請你進入數據愛好者交流群,數據愛好者們都在這兒。

作者:黃天元,復旦大學博士在讀,目前研究涉及文本挖掘、社交網絡分析和機器學習等。希望與大家分享學習經驗,推廣並加深R語言在業界的應用。

郵箱:[email protected]

前言

本文為了迭代一個探索性數據分析的通用模式,首先使用銀行信貸數據進行探索性數據分析,希望能夠得到一個通用的強大探索性解決方案。

導入數據

數據是來自klaR的GermanCredit數據.

library(pacman)
p_load(tidyverse,klaR)
data(GermanCredit)
GermanCredit %>% as_tibble -> df

把表格數據已經導入到df中了。

整體把握

為了最快速地知道:-表格有多少行、多少列-表格的變量都是什麼數據類型的-表格是否存在缺失值,如果存在,是如何缺失的-數據大體的分佈

我們決定使用最便捷的函數。首先,DataExplorer包提供了一個快速儀表盤的生成,簡單粗暴直接出報告,如果是Rstudio的用戶能夠馬上得到一個report.html,在工作目錄中生成。

p_load(DataExplorer)
create_report(df)

先用dlookr對錶格進行審視:

p_load(dlookr)
diagnose(df) %>%
arrange(types) %>%
print(n = Inf)
## # A tibble: 21x 6
## variables types missing_countmissing_percent unique_count unique_rate
##

## 1status fact~ 0 0 4 0.004
## 2 credit_hi~fact~ 0 0 5 0.005
## 3purpose fact~ 0 0 10 0.01
## 4savings fact~ 0 0 5 0.005
## 5 personal_~fact~ 0 0 4 0.004
## 6 other_deb~fact~ 0 0 3 0.003
## 7property fact~ 0 0 4 0.004
## 8 other_ins~fact~ 0 0 3 0.003
## 9housing fact~ 0 0 3 0.003
## 10 job fact~ 0 0 4 0.004
## 11 telephone fact~ 0 0 2 0.002
## 12 foreign_w~ fact~ 0 0 2 0.002
## 13 credit_ri~ fact~ 0 0 2 0.002
## 14 duration nume~ 0 0 33 0.033
## 15 amount nume~ 0 0 921 0.921
## 16 installme~ nume~ 0 0 4 0.004
## 17 present_r~ nume~ 0 0 4 0.004
## 18 age nume~ 0 0 53 0.053
## 19 number_cr~ nume~ 0 0 4 0.004
## 20 people_li~ nume~ 0 0 2 0.002
## 21 employmen~ orde~ 0 0 5 0.005

上面的結果首先顯示出來的,是數據名稱及其類型,其次發現基本沒有缺失,最後是看數據中有多少獨特的取值。此外,我們還可以用skimr包。與上面的方法相比,這個方法會自動對數據類型進行分類,而且還會給出每一個獨特的值的數量,對數值型變量會給出直方圖分佈示意圖。

p_load(skimr)
skim(df)
## Skim summarystatistics
## n obs: 1000
## n variables:21

##
## -- Variable type:factor--------------------------------------------------------------------------------------------------
## variable missing complete nn_unique
## credit_history 0 1000 1000 5
## credit_risk 0 1000 1000 2
## employment_duration 0 1000 1000 5
## foreign_worker 0 1000 1000 2
## housing 0 1000 1000 3
## job 0 1000 1000 4
## other_debtors 0 1000 1000 3
## other_installment_plans 0 1000 1000 3
## personal_status_sex 0 1000 1000 4
## property 0 1000 1000 4
## purpose 0 1000 1000 10
## savings 0 1000 1000 5
## status 0 1000 1000 4
## telephone 0 1000 1000 2
## top_countsordered
## exi: 530,cri: 293, del: 88, all: 49 FALSE
## goo: 700, bad: 300, NA: 0 FALSE
## 1 <: true="">## yes: 963, no: 37, NA: 0 FALSE
## own: 713,ren: 179, for: 108, NA: 0 FALSE
## ski: 630,uns: 200, man: 148, une: 22 FALSE
## non:907, gua: 52, co-: 41, NA: 0 FALSE
## non:814, ban: 139, sto: 47, NA: 0 FALSE
## mal: 548,fem: 310, mal: 92, mal: 50 FALSE
## car: 332,rea: 282, bui: 232, unk: 154 FALSE
## dom: 280,car: 234, rad: 181, car: 103 FALSE
## FALSE
## no : 394, FALSE
## no: 596, yes: 404, NA: 0 FALSE
##
## -- Variable type:numeric-------------------------------------------------------------------------------------------------
## variable missing complete n mean sd p0 p25 p50
## age 0 1000 1000 35.55 11.38 19 27 33
## amount 0 1000 1000 3271.26 2822.74 250 1365.52319.5
## duration 0 1000 1000 20.9 12.06 4 12 18
## installment_rate 0 1000 1000 2.97 1.12 1 2 3
## number_credits 0 1000 1000 1.41 0.58 1 1 1
## people_liable 0 1000 1000 1.16 0.36 1 1 1
## present_residence 0 1000 1000 2.85 1.1 1 2 3
## p75 p100 hist
## 42 75 ▇▇▆▃▂▁▁▁
## 3972.2518424 ▇▃▂▁▁▁▁▁
## 24 72 ▇▅▅▃▁▁▁▁
## 4 4 ▂▁▃▁▁▂▁▇
## 2 4 ▇▁▅▁▁▁▁▁
## 1 2 ▇▁▁▁▁▁▁▂
## 4 4 ▂▁▆▁▁▃▁▇

一個比較好的可視化方法,是visdat包。

p_load(visdat)
vis_dat(df)
探索性數據分析:銀行信貸數據集

如果數據中有缺失值,也能夠很好地展現出來,但是目前這裡沒有缺失值。

單變量數據分佈

如果大家沒有選擇DataExplorer包的定製化數據報告服務,那麼可以利用函數直接來看。

p_load(DataExplorer)
#數值型變量的分佈觀察
plot_density(df)
探索性數據分析:銀行信貸數據集

#因子型變量的分佈觀察
plot_bar(df)
探索性數據分析:銀行信貸數據集

探索性數據分析:銀行信貸數據集

雙變量數據分佈

在這份數據中,響應變量是credit_risk,它代表著客戶的守信水平,只有兩個因子“Good”和“Bad”。我們想要看它和所有連續變量的關係。

#響應變量為因子變量,因子變量與數值變量的關係,用箱線圖表示
plot_boxplot(df,by = "credit_risk")
探索性數據分析:銀行信貸數據集

如果想知道連續變量之間的關係,讓我們做相關性矩陣圖。

p_load(dlookr)
plot_correlate(df)
探索性數據分析:銀行信貸數據集

圖中,越“橢圓”就越相關,藍色是正相關,紅色是負相關。如果連因子變量的相關性也想知道,那麼就用DataExplorer包中的plot_correlation函數。

plot_correlation(df)

它會把所有因子變量都用one-hot編碼轉化為數值型變量,然後做一個大的相關分析矩陣。如果這不是你想要的,可以設置type參數,得到一個專門分析連續變量的圖。

plot_correlation(df,type = "c")
探索性數據分析:銀行信貸數據集

不過,想要同時獲得相關性的信息,首推PerformanceAnalytics這個包。

p_load(PerformanceAnalytics)
df %>%
select_if(is.numeric) %>% #這種圖只能看數值型變量的相互關係
chart.Correlation()
探索性數據分析:銀行信貸數據集

對於數值型變量,這種能夠同時觀察分佈、相關係數和顯著性水平的圖,非常地有效。

離群值處理

為什麼要進行探索性數據分析?一方面是要對自己的數據表格有一個大致的認識,從而增進商務理解和數據理解,為後續的分析奠定基礎。另一方面,就是看看數據有沒有出問題,如果有缺失值,那麼肯定需要插補或者刪除;如果有離群值,那麼也需要決定究竟是保留還是刪掉。我們這份數據集是案例數據集,因此沒有缺失值,不過離群點還是可以進行檢測的。如果一個記錄的某一數值遠離其平均水平,那麼認為這個記錄是離群點。至於界定“遠離平均水平”的標準,要視業務本身數據分佈而定。經典的離群點檢測法,是箱線圖判斷離群點的方法(統計學上稱為Tukey’s fences),這是基於單變量的。這個方法大家可以在維基查詢到,網址為

https://en.wikipedia.org/wiki/Outlier。很多R包默認的方法都是基於這個規則的,並可以自動刪除、替代、設為缺失值。發現離群點,要知道離群點背後的意義。比如我們的數據中,年齡這個變量有離群點,因為部分用戶年齡過高,與平均值差距很大。但是這不是因為錯誤導致的,如果直接去除,也是不合適的。這樣一來會減少信息的量,二來會忽視一些本來應該注意到的問題。離群點的尋找,一方面是為了想辦法消除離群點給數據帶來的影響,從而讓我們的機器學習方法具有更強的魯棒性;第二方面,其實可以找到這些離群值,然後對離群值進行一些詳細的研究。很多欺詐的案例都是通過尋找離群點找到的,因為存在欺詐行為的用戶,他們的行為會跟正常的用戶有顯著的差異。在本案例中,我們首先要看哪些變量存在離群值。應該明確的是,分類變量是不會有離群值的,只有數值型變量才有探索離群值的意義。我們用dlookr的diagnose_outliers函數,來查看變量離群值的情況。

diagnose_outlier(df)
## # A tibble: 7 x 6
## variablesoutliers_cnt outliers_ratio outliers_mean with_mean
##
## 1 duration 70 7. 50.5 20.9
## 2 amount 72 7.2 10940. 3271.
## 3 installm~ 0 0 NaN 2.97
## 4 present_~ 0 0 NaN 2.84
## 5 age 23 2.3 68.5 35.5
## 6 number_c~ 6 0.6 4 1.41
## 7 people_l~ 155 15.5 2 1.16
## # ... with 1 more variable: without_mean

6個列中,第一列為變量名稱,第二列是離群值個數,後面分別是離群值比例、離群值均值、包含離群值的全體的均值、去除離群值的全體的均值。因為installment_rate和present_residence變量不存在利群值,因此無法計算離群值的均值。我們看到people_liable是擔保人的數量,其實它應該被認定為一個分類變量,因為它的取值只有1和2,所以如果對這個離群值做處理顯然是錯誤的。迴歸方法對離群值是敏感的,不過我們可以對變量先進行中心化、標準化,從而減少離群值的影響。如果想要得到整個數據質量報告,可以用dlookr的diagonse_report函數。

diagnose_report(df)

小結

探索性數據分析的下一步,應該是數據預處理(特徵工程)。如果不瞭解業務和數據,那麼預處理就無從談起。因此我們做探索性數據分析的時候,需要儘可能地觀察數據的特點,並思考其背後的原因。一般來說,探索性數據分析需要知道一下幾點:

  • 數據的行列數,即多少樣本、多少特徵
  • 數據特徵的屬性,也就是說這些數據有多少分類變量、多少數值變量
  • 數據特徵的分佈,數值變量要看密度分佈,分類變量要看每個分類的佔比
  • 數據特徵之間的相關性,是否存在共線性?解釋變量與響應變量的關係是否明顯?
  • 數據是否存在缺失值?如果存在缺失值,是否能夠解釋缺失的原因?是隨機缺失還是非隨機缺失,或者是介於兩者之間。是否能夠根據其自身的特徵和缺失的特點來進行插值,或者是應該剔除掉?(本案例沒有出現這個情況,沒有討論,今後的案例會嘗試討論這個問題)
  • 數據特徵中是否存在離群值?離群值是什麼原因導致的?是真實的還是因為錯誤的操作?為了進行建模,應該如何處理這些離群值?(z中心化?取對數?還是直接剔除掉)

總的來說,探索性數據分析就是對數據特徵的挖掘過程,發現它們的特點,一方面加深我們對業務的認識,另一方面也防止明顯的錯誤。以上均為個人對數據進行探索的一些方法,如果有更多探索性的方法,請各位大佬積極補充。希望能夠最後迭代出一套較為通用的探索性數據分析方法,從而為廣大的數據科學家帶來便利。

往期精彩:


  • R語言文本特徵工程:詞袋模型
  • R語言ETL工程系列:總論
  • R語言ETL工程系列:R語言基礎設置
  • R語言ETL工程系列:讀寫(read/write)
探索性數據分析:銀行信貸數據集

回覆 爬蟲 爬蟲三大案例實戰

回覆 Python 1小時破冰入門

回覆 數據挖掘 R語言入門及數據挖掘

回覆 人工智能 三個月入門人工智能

回覆 數據分析師 數據分析師成長之路

回覆 機器學習 機器學習的商業應用

回覆 數據科學 數據科學實戰

回覆 常用算法 常用數據挖掘算法


分享到:


相關文章: