R語言信用評分卡:探索性數據分析

R語言信用評分卡:探索性數據分析

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

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

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

郵箱:[email protected]

前言

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

數據導入

數據是來自klaR的GermanCredit數據

1library(pacman)
2p_load(tidyverse,klaR)
3
4data(GermanCredit)
5GermanCredit %>% as_tibble -> df

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

整體把握

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

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

1p_load(DataExplorer)
2create_report(df)

先用dlookr對錶格進行審視

 1p_load(dlookr)
2
3diagnose(df) %>%
4arrange(types) %>%
5print(n = Inf)
6
7## # A tibble: 21 x 6
8## variables types missing_count missing_percent unique_count unique_rate
9##

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

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

 1p_load(skimr)
2
3skim(df)

4
5## Skim summary statistics
6## n obs: 1000
7## n variables: 21
8##
9## -- Variable type:factor --------------------------------------------------------------------------------------------------
10## variable missing complete n n_unique
11## credit_history 0 1000 1000 5
12## credit_risk 0 1000 1000 2
13## employment_duration 0 1000 1000 5
14## foreign_worker 0 1000 1000 2
15## housing 0 1000 1000 3
16## job 0 1000 1000 4
17## other_debtors 0 1000 1000 3
18## other_installment_plans 0 1000 1000 3
19## personal_status_sex 0 1000 1000 4
20## property 0 1000 1000 4
21## purpose 0 1000 1000 10
22## savings 0 1000 1000 5
23## status 0 1000 1000 4
24## telephone 0 1000 1000 2
25## top_counts ordered
26## exi: 530, cri: 293, del: 88, all: 49 FALSE
27## goo: 700, bad: 300, NA: 0 FALSE
28## 1 <: true="">29## yes: 963, no: 37, NA: 0 FALSE
30## own: 713, ren: 179, for: 108, NA: 0 FALSE
31## ski: 630, uns: 200, man: 148, une: 22 FALSE
32## non: 907, gua: 52, co-: 41, NA: 0 FALSE
33## non: 814, ban: 139, sto: 47, NA: 0 FALSE
34## mal: 548, fem: 310, mal: 92, mal: 50 FALSE
35## car: 332, rea: 282, bui: 232, unk: 154 FALSE
36## dom: 280, car: 234, rad: 181, car: 103 FALSE
37## FALSE
38## no : 394, FALSE
39## no: 596, yes: 404, NA: 0 FALSE
40##
41## -- Variable type:numeric -------------------------------------------------------------------------------------------------
42## variable missing complete n mean sd p0 p25 p50
43## age 0 1000 1000 35.55 11.38 19 27 33
44## amount 0 1000 1000 3271.26 2822.74 250 1365.5 2319.5
45## duration 0 1000 1000 20.9 12.06 4 12 18
46## installment_rate 0 1000 1000 2.97 1.12 1 2 3
47## number_credits 0 1000 1000 1.41 0.58 1 1 1
48## people_liable 0 1000 1000 1.16 0.36 1 1 1
49## present_residence 0 1000 1000 2.85 1.1 1 2 3
50## p75 p100 hist
51## 42 75 ▇▇▆▃▂▁▁▁
52## 3972.25 18424 ▇▃▂▁▁▁▁▁
53## 24 72 ▇▅▅▃▁▁▁▁

54## 4 4 ▂▁▃▁▁▂▁▇
55## 2 4 ▇▁▅▁▁▁▁▁
56## 1 2 ▇▁▁▁▁▁▁▂
57## 4 4 ▂▁▆▁▁▃▁▇

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

1p_load(visdat)
2
3vis_dat(df)
R語言信用評分卡:探索性數據分析

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

單變量數據分佈

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

1p_load(DataExplorer)
2
3#數值型變量的分佈觀察
4plot_density(df)
R語言信用評分卡:探索性數據分析

1#因子型變量的分佈觀察
2plot_bar(df)
R語言信用評分卡:探索性數據分析

R語言信用評分卡:探索性數據分析

雙變量數據分佈

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

1#響應變量為因子變量,因子變量與數值變量的關係,用箱線圖表示
2plot_boxplot(df,by = "credit_risk")
R語言信用評分卡:探索性數據分析

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

1p_load(dlookr)
2
3plot_correlate(df)
R語言信用評分卡:探索性數據分析

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

1plot_correlation(df)

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

1plot_correlation(df,type = "c")
R語言信用評分卡:探索性數據分析

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

1p_load(PerformanceAnalytics)
2
3df %>%

4select_if(is.numeric) %>% #這種圖只能看數值型變量的相互關係
5chart.Correlation()
R語言信用評分卡:探索性數據分析

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

離群值處理

為什麼要進行探索性數據分析?一方面是要對自己的數據表格有一個大致的認識,從而增進商務理解和數據理解,為後續的分析奠定基礎。另一方面,就是看看數據有沒有出問題,如果有缺失值,那麼肯定需要插補或者刪除;如果有離群值,那麼也需要決定究竟是保留還是刪掉。 我們這份數據集是案例數據集,因此沒有缺失值,不過離群點還是可以進行檢測的。如果一個記錄的某一數值遠離其平均水平,那麼認為這個記錄是離群點。至於界定“遠離平均水平”的標準,要視業務本身數據分佈而定。經典的離群點檢測法,是箱線圖判斷離群點的方法(統計學上稱為Tukey’s fences),這是基於單變量的。這個方法大家可以在維基查詢到,網址為https://en.wikipedia.org/wiki/Outlier。很多R包默認的方法都是基於這個規則的,並可以自動刪除、替代、設為缺失值。 發現離群點,要知道離群點背後的意義。比如我們的數據中,年齡這個變量有離群點,因為部分用戶年齡過高,與平均值差距很大。但是這不是因為錯誤導致的,如果直接去除,也是不合適的。這樣一來會減少信息的量,二來會忽視一些本來應該注意到的問題。離群點的尋找,一方面是為了想辦法消除離群點給數據帶來的影響,從而讓我們的機器學習方法具有更強的魯棒性;第二方面,其實可以找到這些離群值,然後對離群值進行一些詳細的研究。很多欺詐的案例都是通過尋找離群點找到的,因為存在欺詐行為的用戶,他們的行為會跟正常的用戶有顯著的差異。 在本案例中,我們首先要看哪些變量存在離群值。應該明確的是,

分類變量是不會有離群值的,只有數值型變量才有探索離群值的意義。我們用dlookr的diagnose_outliers函數,來查看變量離群值的情況。

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

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

1diagnose_report(df)

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

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

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

R語言信用評分卡:探索性數據分析

往期精彩:

  • R語言ETL工程系列:總論
  • R爬蟲小白入門:Rvest爬鏈家網+分析(一)
  • R語言ETL系列:過濾(filter)
  • R語言中文社區2018年終文章整理(作者篇)
  • R語言中文社區2018年終文章整理(類型篇)
R語言信用評分卡:探索性數據分析

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

回覆 Python 1小時破冰入門

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

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

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

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

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

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


分享到:


相關文章: