Python數據科學:全棧技術詳解1-個人貸款違約預測模型
來自專欄 Python程序員
Ben,多本數據科學暢銷書作家,先後在亞信、德勤、百度等企業從事電信、金融行業數據挖掘工作。
配套學習教程:數據科學實戰:Python篇 https://edu.hellobi.com/course/270
教科書中一般提供了建模使用的寬表,我們學習的是建立一個邏輯回歸模型作預測。但是當我們面臨許多張原始客戶或帳戶數據表時,很可能手足無措。建模的人都知道構建建模寬表(屬於特徵工程最重要的部分,但是和機器學習中常提到的變數擴增、變數壓縮演算法是兩碼事)是商業數據分析最難、最耗時、最考驗數據科學家功底的環節。本案例使用一套真實的數據集為大家演示貸款違約預測模型開發的全流程。這個流程就是本書第1章介紹的數據挖掘項目的分析思路的直接體現,如圖4-98所示。
圖4-98
1.1數據介紹
本數據為一家銀行的個人金融業務數據集,可以作為銀行場景下進行個人客戶業務分析和數據挖掘的示例。這份數據中涉及到5300個銀行客戶的100萬筆的交易,而且涉及700份貸款信息與近900張信用卡的數據。通過分析這份數據可以獲取與銀行服務相關的業務知識。例如,提供增值服務的銀行客戶經理,希望明確哪些客戶有更多的業務需求,而風險管理的業務人員可以及早發現貸款的潛在損失。
● 賬戶表(Accounts):每條記錄描述了一個賬戶(account_id)的靜態信息,共4500條記錄;
● 顧客信息表(Clients):每條記錄描述了一個客戶(client_id)的特徵信息,共5369條記錄;
● 許可權分配表(Disp):每條記錄描述了顧客(client_id)和賬戶(account_id)之間的關係,以及客戶操作賬戶的許可權,共5369條記錄;
● 支付訂單表(Orders):每條記錄代表描述了一個支付命令,共6471條記錄;
● 交易表(Trans):每條記錄代表每個賬戶(account_id)上的一條交易,共1056320條記錄;
● 貸款表(Loans):每條記錄代表某個賬戶(account_id)的上的一條貸款信息,共682條記錄;
● 信用卡(Cards):每條記錄描述了一個顧客號的信用卡信息,共892條記錄;
● 人口地區統計表(District):每條記錄描述了一個地區的人口統計學信息,共77條記錄。
實際業務中的一個人可以擁有多個賬戶號(account_id),一個賬戶號(account_id)可以對應有多個顧客(client_id),即多個顧客共享一個賬戶號(account_id),但是每個帳戶號(account_id)的所有者(即最高許可權者)只能是一人。賬戶號(account_id)與客戶號(client_id)的對應關係,在表「Disposition」中進行列示;表「Loan」為銀行提供給賬戶號(account_id)的服務;表「Credit card」為銀行提供給的顧客(client_id)的服務,每個客戶可以申請一張信用卡;貸款為基於賬戶的服務,一個賬戶(account_id)在一個時點最多只能有一筆貸款。
關係實體圖(E-R圖)可以直觀的描述表間關係,如圖4-99所示。圖中將每張表的主鍵與外鍵通過實線相連接,可以明確指導我們如何將表進行橫向連接。比如要知道貸款客戶的性別,就需要使用貸款表(Loan)中的account_id先與許可權分配表(Disposition)中的account_id連接,然後再拿client_id和客戶表(Client)中的client_id連接。
圖4-99
1.2業務分析
在貸款審批方面,如果可以通過構建量化模型對客戶的信用等級進行一定的區分。在信貸資金管理方面,得知了每個賬戶的違約概率後,可以預估一下未來的壞賬比例,及時做好資金安排。也可以對違約概可能性較高的客戶進行更加頻繁的「關懷」,及時發現問題,以避免損失。
在這個量化模型中,被解釋變數為二分類變數,因此需要構建一個排序類分類模型。而排序類分類模型中最長使用的演算法是邏輯回歸。
1.3數據理解
建模分析中,獲取預測變數是最為艱難的。需要根據建模的主題進行變數的提取。其中第一步稱為維度分析,即採集的數據涉及哪些大的方面。如下圖所示:
有商業智能(BI)經驗的人初次接觸維度分析這個概念,會聯想起聯機分析處理(OLAP),這兩個概念有相通之處。後者是為業務分析服務的,因此,將信息歸結到公司各級部門這個粒度。比如某支行、分行或總行的某業務數量。數據挖掘的維度分析會更為廣泛,是指將數據按照研究對象進行信息提取的工作。比如,如果需要研究的是個人客戶的消費行為,則需要將數據以客戶為粒度進行歸結。這樣問題就來了,銀行保存的客戶數據非常多,如何去整理這些數據以獲取合適的信息,而且單獨從內部獲取數據是否可以滿足分析的需求?為了回答這些問題,需要對研究的問題進行深入研究,以明確研究需要的客戶信息。不同的分析主題需要的客戶信息是不同的,以下提供了一個信息獲取的框架,在實際操作中可以按照以下4個方面進行考慮。
1、屬性表徵信息:在分析個人客戶時,也被稱為人口統計信息。主要涉及最基本的性別、出生日期的信息。這類指標對客戶的行為預測並不具有因果關係,只是根據歷史數據統計而得到的規律。比如,隨著客戶年齡的提高,會對房貸、消費貸款、教育儲蓄、個人理財等產品依次產生需求,但是年齡並不是對產品需求的根本原因,其實婚齡才是其原因。只不過婚齡和年齡在同時期人群中是高度相關罷了。同理,性別和某種業務表現的高相關性,很多也來自於外部世界對性別類型的一種行為期望。這類數據對於銀行、汽車4S店這類需要客戶臨櫃填寫表格的公司而言是可以獲取「真實」信息的,而對於電商而言,是難以獲取「真實」信息的。但是電商的分析人員也不必氣餒,其實「真實」這個概念是有很多內涵的,根據電商數據雖然不能知道客戶人口學上的「真實」年齡,但是根據其消費行為完全可以刻畫出其消費心理上的「真實」年齡,而後者在預測客戶需求和行為方面更有效。
2、行為信息:行為是內部需求在外部特定環境下的一種表現。首先,行為是內部需求的結果。比如,活期存款的客戶將手頭的錢存起來,應付不時之需的需求。其次,這些行為是在特定環境下表現出來的,在活期理財產品推出之前,活期存款是唯一的選擇。對於銀行而言,行為數據僅限於業務數據,而電信公司可以獲取的行為數據更加廣泛,不僅可以獲取通話行為、上網行為等業務信息,還可以獲取周末出行、業餘生活等個人行為信息。獲取的客戶行為信息越多,對客戶的了解越深入。在這方面,各類企業都具有很大的深挖潛力。由於行為數據均為詳細記錄,數量龐大,而建模數據是一個樣本只能有一條記錄,因此需要對行為數據依照RFM方法進行行為信息的提取,比如過去一年的帳戶餘額就是按照」M」計算得到的,這類變數會稱為一級衍生變數。這還不夠,比如要看帳戶餘額是否有增長趨勢,就要計算過去一年每月的平均帳戶餘額,然後計算前後兩月平均帳戶餘額增長率的均值,這個變數就被稱為二級衍生變數。行為信息的提取可以按照RFM方法做到三級甚至四級衍生變數。
3、狀態信息:指客戶的社會經濟狀態和社會網路關係。社會學認為,人之所以為特定的人,就在於其被固化在特定的關係之中,這被稱為嵌入理論。了解客戶的社會關係,就了解了外界對該客戶的期望,進而推斷出其需求。通過深入的分析,甚至可以推斷出客戶未來的需求,達到比客戶更了解自己的狀態。在這方面,有些企業走在了前面。比如,電信企業通過通話和簡訊行為確定客戶的交友圈,通過信號地理信息定位客戶的工作、生活和休閑區域,來推測其工作類型、所處階層和社交網路類型。有些企業剛剛起步,只是通過客戶住址大致確定一下客戶居住小區的檔次,以確定其社會經濟地位。這類信息是值得每個以客戶為中心的企業花時間和精力去深挖的。
4、利益信息:如果可以知道客戶的內在需求,這當然是最理想的,而這類數據獲取方式是很匱乏的。傳統方式只能通過市場調研、客戶呼入或客戶投訴得到相關數據。現在利用客服、微信公眾號、微博、論壇等留言信息,可以便捷的獲取客戶評價信息。
圖4-100
以上的構建變數的準則是放之四海而皆準的,而具體到違約預測的這個主題種,還需要更有針對性的分析,以往的研究認為影響違約的主要因素有還款能力不足和還款意願不足兩個方面。還款意願不足有可能是慾望大於能力、生活狀態不穩定。以上是概念分析,之後就需要量化,比如使用「資產餘額的變異係數」作為生活狀態不穩定的代理指標。
在建模過程中,有預測價值的變數基本都是衍生變數,比如:
一級衍生,比如最近一年每月的資產餘額均值來自於交易數據中每月的帳戶餘額;
二級衍生,比如年度資產餘額的波動率來自於每月的資產餘額均值;
三級衍生,比如資產餘額的變異係數來自資產餘額的波動率除以資產餘額均值。
大數據元年之前,在數據科學中有一個不成文的規定:如果一個模型中二級以上的衍生變數不達到80%以上的比例,是不好意思提交成果的。老牌數據分析強公司(比如美國的第一資本)基本上是以每人每月約20-50個衍生變數的速度積累十年才擁有所謂的萬級別的衍生變數。而2016年興起的所謂智能自學習建模,宣稱使用原始指標放入模型建模。筆者認為是偽數據科學家大量湧入到這個行業而興起的一股逆流,就像房地產火熱時期許多投機者湧入造成了建築質量的大幅度下滑。這個現象必將會回歸到以分析作為根底的本源,而非炫耀技術。
1.4數據整理
以上介紹了維度分析要注意的主要方面,下面將根據維度分析的框架創建建模用變數。不過我們不要期望可以創建起全部四個維度的變數,一般前三個維度足矣。首先生成被解釋變數。在貸款(Loans)表中還款狀態(status)變數記錄了客戶的貸款償還情況,其中A代表合同終止且正常還款,B代表合同終止但是未還款,C代表合同未結束且正常還款,D代表合同未結束但是已經拖欠貸款了。我們以此構造一個客戶行為信用評級模型,以預測其他客戶貸款違約的概率。
1、數據提取中的取數窗口
我們分析的變數按照時間變化情況可以分為動態變數和靜態變數,屬性變數(比如性別、是否90後)一般是靜態變數,行為、狀態和利益變數均屬於動態變數。動態變數還分為時點變數和區間變數,狀態變數(比如當前帳戶餘額、是否破產)和利益變數(對某產品的訴求)均屬於時點變數。行為變數(存款頻次、平均帳戶餘額的增長率)為區間變數。在建造模型過程中,需要按照下圖所示的取數窗口提取變數。其中有兩個重要的時間窗口:觀察窗口,預測窗口。觀察窗口是觀測和收集供分析的自變數的時間段。預測窗口是觀測因變數變化的時間段,如果在這個時間段中出現顯性狀態(比如出現貸款拖欠)則設置為」1」,如果始終沒有出現,則設置為」0」。
取數窗口期的長短和模型易用性是一對矛盾: 窗口期越短,缺失值越少、可分析的樣本就越多、越便於使用。但是區間變數單個變數的觀測期越短,數據越不穩定,這樣難以獲得穩健的參數。但是取數窗口期越長,新的客戶就因為變數缺失而無法納入到研究樣本。因此取數窗口的長短是需要根據建模面臨的任務靈活調整。本案例中的觀測窗口定為一年。
同樣的,預測窗口可長可短,取決於構建什麼樣的模型,以及目標變數是什麼。通常,越長的預測窗口樣本量越少。然而,預測窗口過短則有些客戶的最終結果還沒有表現出來,即在這種情況下,模型的所預測的結果顯現之時,現實中的商業還未有足夠時間做出反應。本書並非標準的信用評級的教科書,因此沒有嚴格按照信用評級模型的取數窗口進行設置,需要深入學習的讀者請參考《信用風險評分卡研究:基於SAS的開發與實施》。
2、利用pandas導入可用於建模的樣本數據,利用Loans表生成被解釋變數。如圖4-101,4-402所示。
圖4-101
以下為創建被解釋變數。
圖4-102
3、表徵信息:將所有維度的信息歸結到貸款表(LOANS)上,每個貸款帳戶只有一條記錄。尋找有預測能力的指標。首先是客戶表徵信息如性別,年齡。客戶的人口信息保存在客戶信息表(ClIENTS)表中,但是該表是以客戶為主鍵的,需要和許可權分配表(DISP)相連接才可以獲得賬號級別的信息,連接條件如圖4-103和圖104所示。
圖4-103
圖4-104
4、狀態信息:提取借款人居住地情況,如居住地失業率等變數。與district表進行連接。
圖4-104
5、行為信息:根據客戶的帳戶變動的行為信息,考察借款人還款能力,如賬戶平均餘額、餘額的標準差、變異係數、平均入賬和平均支出的比例、貸存比等。
首先將貸款表和交易表按照account_id內連接。
然後將來自貸款表和交易表中的兩個字元串類型的日期變數轉換為日期,為窗口取數作準備。
帳戶餘額和交易額度這兩個為字元變數,有千分位符,需要進行數據清洗,並轉化為數值類型。
以下這個語句實現了窗口取數,只保留了貸款日期前365天至貸款前1天內的交易數據。
以下語句計算了每個貸款帳戶貸款前一年的平均帳戶餘額(代表財富水平)、帳戶餘額的標準差(代表財富穩定情況)和變異係數(代表財富穩定情況的另一個指標)。
以下語句計算平均入賬和平均支出的比例。首先按照上一步時間窗口取數得到的數據集,按照每個帳戶的「借-貸」類型分別匯總交易金額。
上一步匯總後的數據,每個帳號會有兩條記錄,需要將其進行拆分列操作,將每個帳戶兩條觀測轉換為每個帳戶一條觀測。以下語句中使用pd.pivot_table函數進行堆疊列。
以下語句將分別計算的平均帳戶餘額、帳戶餘額的標準差、變異係數、平均入賬和平均支出的比例等變數與之前的data3數據合併。
最後計算貸存比、貸收比。
1.5建立分析模型
這部分是從信息中獲取知識的過程。數據挖掘方法分為分類和描述兩大類,其中預測賬戶的違約情況屬於分類模型。使用邏輯回歸對剛才創建的數據建立模型,建模語句如下。
1)提取狀態為C的用於預測。其它樣本隨機抽樣,建立訓練集與測試集。
2)使用向前逐步法進行邏輯回歸建模
通過以上語句得到結果。以下列出了邏輯回歸的模型參數表。其中申請貸款前一年的貸存比(r_lb)、存款餘額的標準差(stdev_balance)、貸款期限(duration)與違約正相關。存款餘額的均值(avg_balance)、貸款者當地1000人中有多少企業家(A14)與違約負相關。以上這些回歸係數的正負號均符合我們的預期,而且均顯著。
3)模型效果評估
以下使用測試數據進行模型效果評估。此處調用了sklearn的評估模塊繪製ROC曲線。
可以看到模型的ROC曲線非常接近左上角,其曲線下面積(AUC)為0.9435,這說明模型的排序能力很強。
1.6模型運用
在這個案例中,貸款狀態為」C」的帳戶是尚沒有出現違約的合同未到期客戶。這些貸款客戶中有些人的違約可能性較高,需要業務人員重點關注。一旦發現問題時,可以及時處理,挽回損失。可以通過以下語句得到每筆貸款的違約」概率」。
這裡需要強調的是,此處的」概率」僅是代表違約可能性的相對值,並不代表其真實違約概率。比如預測「概率」為0.77的違約可能性高於0.46,這已經足夠了,因為業務人員知道哪些客戶為重點關注的即可。
1.7流程回顧
本例中,我們遵照數據挖掘項目通用的流程:CRISP-DM進行建模。最後回顧一下本案例的業務整理課表構建的流程。
1.業務分析:需要構建一個分類模型預測每個客戶的違約概率,其實是對客戶的信用進行一個排序。分類模型有很多種,其中邏輯回歸是最常用到的。
2. 數據解讀:從業務需求出發,了解、熟悉現有的數據結構、數據質量等信息。主要尋找對客戶違約成本、還款意願、還款能力(資產規模和穩定性)有代表意義的變數
3. 數據準備:結合數據的內在價值與業務分析,提取各類有價值的信息,構建被解釋變數和解釋變數。
4. 模型構建與評價:按照SEMMA標準演算法,即數據抽樣、變數分布探索、修改變數、構建邏輯回歸、評價模型的優劣。
5.模型監控:當模型上線後,對模型的表現進行長期監控,主要檢驗模型預測準確性與數據的穩定性。
由於本章的重點在於介紹建模之前的寬表構建的部分,關於模型構建的細緻化會在其他章節詳細講解,本章節此部分只提供一個粗略的流程。
其實在實際的工作中,上面提供的流程1-3的部分並不一定一次性做好,很多時候這部分是需要多次的反覆驗證、反覆解讀的。因為我們往往需要多次的分析審核,才能較好的理解拿到的數據、並且能夠識別出數據中的異常或錯誤的內容,而此部分若納入了錯誤的數據則會導致後面的如建模等工作完全沒有意義。
推薦閱讀:
※數據分析之數據可視化
※數據挖掘與可視化分析——以武漢市房價為例
※韓家煒在數據挖掘上開闢的「小路」是什麼?
※用數據挖一挖豆瓣5.3的《長城》,水軍力量到底有多強大
※數據分析師值得交的5類朋友