金融风控-- >客户流失预警模型-- >金融数据分析
從這篇博文開始,我將介紹機(jī)器學(xué)習(xí),深度學(xué)習(xí)在金融風(fēng)控這個(gè)行業(yè)上的應(yīng)用。其實(shí)機(jī)器學(xué)習(xí),深度學(xué)習(xí)在一些相關(guān)場(chǎng)景上的應(yīng)用,其解決方法都是大同小異,差不多都是固定的解決套路,但是需要結(jié)合這個(gè)場(chǎng)景這個(gè)行業(yè)領(lǐng)域的相關(guān)知識(shí)來(lái)解決。
這篇博文將開始介紹客戶流失預(yù)警模型,而本篇博文將主要側(cè)重介紹金融數(shù)據(jù)分析,預(yù)處理。
客戶流失預(yù)警模型的業(yè)務(wù)意義
-
嚴(yán)格地講,客戶流失指的是客戶在該行所有業(yè)務(wù)終止,并銷號(hào)。但是具體業(yè)務(wù)部門可單獨(dú)定義在該部門的全部或某些業(yè)務(wù)上,客戶的終止行為。
-
對(duì)專家及金融業(yè)業(yè)內(nèi)人士的走訪及調(diào)研結(jié)果表明,商業(yè)銀行客戶流失較為嚴(yán)重。國(guó)內(nèi)商業(yè)銀行,客戶流失率可達(dá)20%甚至更高。而獲得新客戶的成本,可達(dá)維護(hù)現(xiàn)有客戶的5倍。
-
因此,從海量客戶交易記錄中挖掘出對(duì)流失有影響的信息,建立高效的客戶流失預(yù)警體系尤為重要。
建立量化模型,合理預(yù)測(cè)客群的潛在流失風(fēng)險(xiǎn)
? 常用的風(fēng)險(xiǎn)因子
? 客戶持有的產(chǎn)品數(shù)量、種類
? 客戶的年齡、性別
? 受地理區(qū)域的影響
? 受產(chǎn)品類別的影響
? 交易的間隔時(shí)間
? 營(yíng)銷、促銷手段
? 銀行的服務(wù)方式和態(tài)度
數(shù)據(jù)介紹和描述
本案例搜集了17,241例數(shù)據(jù),其中有1,741例流失樣本,總流失率達(dá)到10.10%
銀行自有字段(有效記錄占100%)
?賬戶類信息
?個(gè)人類信息
?存款類信息
?消費(fèi)、交易類信息
?理財(cái)、基金類信息
?柜臺(tái)服務(wù)、網(wǎng)銀類信息
外部三方數(shù)據(jù)(可能存在缺失值)
?外呼客服數(shù)據(jù)
?資產(chǎn)類數(shù)據(jù)
?其他消費(fèi)類數(shù)據(jù)
單因子分析之連續(xù)變量
1)有效記錄的占比
因?yàn)樵紨?shù)據(jù)可能存在大量的缺失值,故我們需要查看這個(gè)單因子數(shù)據(jù)上缺失值占總個(gè)數(shù)據(jù)的比值情況。如果占比特別大,則有可能會(huì)不考慮這個(gè)因子。
2)整體分布
我們需要看看這個(gè)原始數(shù)據(jù)在這個(gè)單因子上的初始分布,有時(shí)候因?yàn)樵紨?shù)據(jù)在這個(gè)單因子上存在極端值,導(dǎo)致看不來(lái)這個(gè)單因子數(shù)據(jù)分布情況,這時(shí)就需要進(jìn)行截?cái)?#xff0c;去除一些極端值,看看這個(gè)單因子數(shù)據(jù)的截?cái)喾植?/strong>。
3)按目標(biāo)變量分布的差異
這里指的是流失的人群數(shù)據(jù)在這個(gè)單因子上分布情況,非流失的人群數(shù)據(jù)在這個(gè)單因子上分布情況。
連續(xù)性變量的畫圖代碼:
def NumVarPerf(df,col,target,filepath, truncation=False):''':param df: the dataset containing numerical independent variable and dependent variable:param col: independent variable with numerical type:param target: dependent variable, class of 0-1:param filepath: the location where we save the histogram:param truncation: indication whether we need to do some truncation for outliers:return: the descriptive statistics'''#extract target variable and specific indepedent variablevalidDf = df.loc[df[col] == df[col]][[col,target]]#the percentage of valid elementsvalidRcd = validDf.shape[0]*1.0/df.shape[0]#format the percentage in the form of percentvalidRcdFmt = "%.2f%%"%(validRcd*100)#the descriptive statistics of each numerical columndescStats = validDf[col].describe()mu = "%.2e" % descStats['mean']std = "%.2e" % descStats['std']maxVal = "%.2e" % descStats['max']minVal = "%.2e" % descStats['min']#we show the distribution by churn/not churn statex = validDf.loc[validDf[target]==1][col]y = validDf.loc[validDf[target]==0][col]xweights = 100.0 * np.ones_like(x) / x.sizeyweights = 100.0 * np.ones_like(y) / y.size#if need truncation, truncate the numbers in 95th quantileif truncation == True:'''如果選擇截?cái)?#xff0c;這里選擇把大于0.95的分位點(diǎn)的數(shù)值全用0.95的分位點(diǎn)值代替。'''pcnt95 = np.percentile(validDf[col],95)x = x.map(lambda x: min(x,pcnt95))y = y.map(lambda x: min(x,pcnt95))fig, ax = pyplot.subplots()ax.hist(x.values, weights=xweights, alpha=0.5,label='Attrition')ax.hist(y.values, weights=yweights, alpha=0.5,label='Retained')titleText = 'Histogram of '+ col +'\n'+'valid pcnt ='+validRcdFmt+', Mean ='+mu + ', Std='+std+'\n max='+maxVal+', min='+minValax.set(title= titleText, ylabel='% of Dataset in Bin')ax.margins(0.05)ax.set_ylim(bottom=0)pyplot.legend(loc='upper right')figSavePath = filepath+str(col)+'.png'pyplot.savefig(figSavePath)pyplot.close(1)以上這段代碼需要注意兩點(diǎn):
①剛開始我在畫直方圖時(shí)用的是這句代碼:
②還是這句代碼
xweights = 100.0 * np.ones_like(x) / x.size ax.hist(x, weights=xweights, alpha=0.5,label='Attrition')這里需要了解hist是如何畫圖的,以及里面的參數(shù)意義
直方圖是一種能對(duì)值頻率進(jìn)行離散化顯示的柱狀圖。數(shù)據(jù)點(diǎn)被拆分到離散的,間隔均勻的面元中,繪制的是各種數(shù)據(jù)點(diǎn)的數(shù)量。即是橫坐標(biāo)表示數(shù)據(jù)的 一個(gè)區(qū)間劃分,縱坐標(biāo)表示數(shù)據(jù)點(diǎn)出現(xiàn)在這個(gè)區(qū)間內(nèi),其頻率為多少。 設(shè)置參數(shù)weigths,表示縱坐標(biāo)不是表示頻率,而是表示出現(xiàn)在這個(gè)區(qū)間內(nèi)的數(shù)據(jù)點(diǎn)數(shù)量占總的數(shù)量的比值。 這里面是100.0 * np.ones_like(x) / x.size表示所占的百分比。 alpha參數(shù)表示畫出的直方圖的透明度為多少。這里設(shè)為0.5半透明,那么兩個(gè)直方圖重合在一起的地方就會(huì)變色。我們看看“ASSET_MON_AVG_BAL(資產(chǎn)當(dāng)前總余額)”這個(gè)單因子的初始分布:
NumVarPerf(AllData,'ASSET_MON_AVG_BAL','CHURN_CUST_IND',truncation=False) ##初始分布①橫坐標(biāo)表示余額的一些區(qū)間,縱坐標(biāo)表示這個(gè)區(qū)間內(nèi)所占總余額的百分比,從圖上看,幾乎看不出分布情況,為什么呢?
②我們看看這張圖的title,valid_pcnt=100.0%:數(shù)據(jù)的有效記錄占比100%,因?yàn)橘Y產(chǎn)當(dāng)前總余額這個(gè)字段是銀行內(nèi)部數(shù)據(jù)。
③這個(gè)字段的平均值Mean=1.18e+05,而max=4.45e+07,很明顯這個(gè)最大值比平均值大了不止一個(gè)數(shù)量級(jí)。明顯存在極端值。因?yàn)闃O端值的存在,導(dǎo)致看不出較小數(shù)據(jù)的分布情況。
那我們?cè)囋嚾サ魳O端值看看截?cái)喾植既绾?#xff1f;
當(dāng)前“ASSET_MON_AVG_BAL(資產(chǎn)當(dāng)前總余額)”極端分布:095分位點(diǎn)以內(nèi)的分布情況:
①這個(gè)時(shí)候從直方圖分布就能看出,流失客戶的余額基本上小于200000,資產(chǎn)較少,資產(chǎn)越少的客戶流失量占總的流失客戶數(shù)越大。
②高資產(chǎn)的客戶流失則比較少。余額大于200000的客戶基本上沒有流失。
③這就說(shuō)明了流失和非流失這兩類在“ASSET_MON_AVG_BAL(資產(chǎn)當(dāng)前總余額)”這個(gè)單因子上的差異還是比較明顯的。
上面我們通過(guò)直方圖得出流失和非流失這兩類在“ASSET_MON_AVG_BAL(資產(chǎn)當(dāng)前總余額)”這個(gè)單因子上的差異還是比較明顯。那么這只是在直觀上的感覺,現(xiàn)在希望對(duì)其差異進(jìn)行量化的分析。
首先我們得了解下什么是單因子分析:
單因素方差分析: (一)單因素方差分析概念理解步驟①是用來(lái)研究一個(gè)控制變量的不同水平是否對(duì)觀測(cè)變量產(chǎn)生了顯著影響。這里,由于僅研究單個(gè)因素對(duì)觀測(cè)變量的影響,因此稱為單因素方差分析。②單因素方差分析的第一步是明確觀測(cè)變量和控制變量。例如,上述問題中的觀測(cè)變量分別是農(nóng)作物產(chǎn)量、婦女生育率、工資收入;控制變量分別為施肥量、地區(qū)、學(xué)歷。③單因素方差分析的第二步是剖析觀測(cè)變量的方差。方差分析認(rèn)為:觀測(cè)變量值的變動(dòng)會(huì)受控制變量和隨機(jī)變量?jī)煞矫娴挠绊憽?jù)此,單因素方差分析將觀測(cè)變量<<總的離差平方和分解為組間離差平方和和組內(nèi)離差平方和兩部分,用數(shù)學(xué)形式表述為:SST=SSA+SSE>>。④單因素方差分析的第三步是通過(guò)比較觀測(cè)變量總離差平方和各部分所占的比例,推斷控制變量是否給觀測(cè)變量帶來(lái)了顯著影響。(二)單因素方差分析原理總結(jié)容易理解:在觀測(cè)變量總離差平方和中,如果組間離差平方和所占比例較大,則說(shuō)明觀測(cè)變量的變動(dòng)主要是由控制變量引起的,可以主要由控制變量來(lái)解釋,控制變量給觀測(cè)變量帶來(lái)了顯著影響;反之,如果組間離差平方和所占比例小,則說(shuō)明觀測(cè)變量的變動(dòng)不是主要由控制變量引起的,不可以主要由控制變量來(lái)解釋,控制變量的不同水平?jīng)]有給觀測(cè)變量帶來(lái)顯著影響,觀測(cè)變量值的變動(dòng)是由隨機(jī)變量因素引起的。(三)單因素方差分析基本步驟 1、提出原假設(shè):H0——無(wú)差異;H1——有顯著差異 2、選擇檢驗(yàn)統(tǒng)計(jì)量:方差分析采用的檢驗(yàn)統(tǒng)計(jì)量是F統(tǒng)計(jì)量,即F值檢驗(yàn)。 3、計(jì)算檢驗(yàn)統(tǒng)計(jì)量的觀測(cè)值和概率P值:該步驟的目的就是計(jì)算檢驗(yàn)統(tǒng)計(jì)量的觀測(cè)值和相應(yīng)的概率P值。 4、給定顯著性水平,并作出決策。說(shuō)了這么多,其實(shí)就一句話:
總差異=組間差異+組內(nèi)差異
當(dāng)組間離差平方和所占比例較大,則說(shuō)明觀測(cè)變量的變動(dòng)主要是由控制變量引起的,可以主要由控制變量來(lái)解釋,控制變量給觀測(cè)變量帶來(lái)了顯著影響;反之,如果組間離差平方和所占比例小,則說(shuō)明觀測(cè)變量的變動(dòng)不是主要由控制變量引起的,不可以主要由控制變量來(lái)解釋,控制變量的不同水平?jīng)]有給觀測(cè)變量帶來(lái)顯著影響,觀測(cè)變量值的變動(dòng)是由隨機(jī)變量因素引起的。
from statsmodels.formula.api import ols from statsmodels.stats.anova import anova_lmresult=anova_lm(ols('ASSET_MON_AVG_BAL~CHURN_CUST_IND',AllData).fit()) print result打印結(jié)果:
這里得出的PR,p值小于0.05,p值越小,原假設(shè)越不成立,這里原假設(shè)指的是:在流失和非流失中,客戶在“ASSET_MON_AVG_BAL(資產(chǎn)當(dāng)前總余額)”這個(gè)單因子上沒有顯著性差異。故我們可以通過(guò)概率這種量化的方式得出結(jié)論:流失和不流失的人群在資產(chǎn)余額這個(gè)單因子上有顯著性差異。
注:這里我們是用流失狀態(tài)來(lái)得出對(duì)應(yīng)資產(chǎn)狀態(tài)是不同的,并不是用資產(chǎn)狀態(tài)去預(yù)測(cè)是否流失。這是個(gè)相關(guān)性問題,不是因果性問題。
單因子分析之類別變量
1)有效記錄的占比
2) 種類
3)整體分布
4)按目標(biāo)變量分布的差異
類別性變量畫圖代碼:
def CharVarPerf(df,col,target,filepath):''':param df: the dataset containing numerical independent variable and dependent variable:param col: independent variable with numerical type:param target: dependent variable, class of 0-1:param filepath: the location where we save the histogram:return: the descriptive statistics'''validDf = df.loc[df[col] == df[col]][[col, target]]validRcd = validDf.shape[0]*1.0/df.shape[0]recdNum = validDf.shape[0]validRcdFmt = "%.2f%%"%(validRcd*100)freqDict = {}churnRateDict = {}#for each category in the categorical variable, we count the percentage and churn ratefor v in set(validDf[col]):vDf = validDf.loc[validDf[col] == v]freqDict[v] = vDf.shape[0]*1.0/recdNumchurnRateDict[v] = sum(vDf[target])*1.0/vDf.shape[0]descStats = pd.DataFrame({'percent':freqDict,'churn rate':churnRateDict})fig = pyplot.figure() # Create matplotlib figureax = fig.add_subplot(111) # Create matplotlib axesax2 = ax.twinx() # Create another axes that shares the same x-axis as ax.pyplot.title('The percentage and churn rate for '+col+'\n valid pcnt ='+validRcdFmt)descStats['churn rate'].plot(kind='line', color='red', ax=ax)descStats.percent.plot(kind='bar', color='blue', ax=ax2, width=0.2,position = 1)ax.set_ylabel('churn rate')ax2.set_ylabel('percentage')figSavePath = filepath+str(col)+'.png'pyplot.savefig(figSavePath)pyplot.close(1) 我們以性別這個(gè)類別性變量為例: CharVarPerf(AllData,'GENDER_CD','CHURN_CUST_IND',filepath) 上圖中藍(lán)色柱狀圖,1表示女性,2,表示男性,z表未知,對(duì)應(yīng)右邊percentage,表示女性,男性,未知,占總?cè)藬?shù)的占比情況,未知人數(shù)很少 可以忽略不計(jì),紅線表示流失占比,對(duì)應(yīng)左邊churn_rate。由上圖可知三點(diǎn):
①:絕大多數(shù)性別已知
②:已知性別中,男性占比比較高
③:男性流失率低于女性
④:未知性別的客戶流失率顯著高于已知性別客戶。
那么如何用量化的方式去檢驗(yàn)得出這些結(jié)論呢?
首先了解卡方檢驗(yàn)
卡方檢驗(yàn)就是統(tǒng)計(jì)樣本的實(shí)際觀測(cè)值與理論推斷值之間的偏離程度,實(shí)際觀測(cè)值與理論推斷值之間的偏離程度就決定卡方值的大小,卡方值越大, 越不符合;卡方值越小,偏差越小,越趨于符合,若兩個(gè)值完全相等時(shí),卡方值就為0,表明理論值完全符合。 注意:卡方檢驗(yàn)針對(duì)分類變量。 (1)提出原假設(shè):H0:總體X的分布函數(shù)為F(x)如果總體分布為離散型,則假設(shè)具體為H0:總體X的分布律為P{X=xi}=pi, i=1,2,... (2)將總體X的取值范圍分成k個(gè)互不相交的小區(qū)間A1,A2,A3,…,Ak,如可取A1=(a0,a1],A2=(a1,a2],...,Ak=(ak-1,ak),其中a0可取-∞,ak可取+∞,區(qū)間的劃分視具體情況而定,但要使每個(gè)小區(qū)間所含的樣本值個(gè)數(shù)不小于5,而區(qū)間個(gè)數(shù)k不要太大也不要太小。 (3)把落入第i個(gè)小區(qū)間的Ai的樣本值的個(gè)數(shù)記作fi,成為組頻數(shù)(真實(shí)值),所有組頻數(shù)之和f1+f2+...+fk等于樣本容量n。 (4)當(dāng)H0為真時(shí),根據(jù)所假設(shè)的總體理論分布,可算出總體X的值落入第i 個(gè)小區(qū)間Ai的概率pi,于是,npi就是落入第i個(gè)小區(qū)間Ai的樣本值的 理論頻數(shù)(理論值)。(5)當(dāng)H0為真時(shí),n次試驗(yàn)中樣本值落入第i個(gè)小區(qū)間Ai的頻率fi/n與概率pi應(yīng)很接近,當(dāng)H0不真時(shí),則fi/n與pi相差很大。 基于這種思想,皮爾遜引進(jìn)如下檢驗(yàn)統(tǒng)計(jì)量(下圖公式),在0假設(shè)成立的情況下服從自由度為k-1的卡方分布。差異的量化:用卡方檢驗(yàn)來(lái)衡量某因子對(duì)目標(biāo)變量的偏好。
原理:如果某因子跟目標(biāo)變量獨(dú)立,(即該因子對(duì)目標(biāo)變量影響較小)則目標(biāo)變量在該因子上的分布是均勻的,即卡方值應(yīng)該較小。用來(lái)衡量類別性變量分布的差異性。
計(jì)算卡方值代碼:
chisqDf = AllData[['GENDER_CD','CHURN_CUST_IND']] grouped = chisqDf['CHURN_CUST_IND'].groupby(chisqDf['GENDER_CD'])##以GENDER_CD(性別)對(duì)CHURN_CUST_IND(是否流失,0,1)進(jìn)行分組 count = list(grouped.count()) # 按性別(男,女,未知)分組,計(jì)算每組有多少個(gè)CHURN_CUST_IND,也就是統(tǒng)計(jì)男性人數(shù),女性人數(shù),未知人數(shù) churn = list(grouped.sum()) # 按性別(男,女,未知)分組,對(duì)每組內(nèi)所有的CHURN_CUST_IND求和,也就是統(tǒng)計(jì)男性中流失人數(shù),女性中流失人數(shù)等 chisqTable = pd.DataFrame({'total':count,'churn':churn}) chisqTable['expected'] = chisqTable['total'].map(lambda x: round(x*0.101)) chisqValList = chisqTable[['churn','expected']].apply(lambda x: (x[0]-x[1])**2/x[1], axis=1) chisqVal = sum(chisqValList) print chisqVal得出同樣結(jié)果:32.6579
當(dāng)然可以引入相關(guān)的包來(lái)計(jì)算卡方值:
首先我們根據(jù)之前給出數(shù)據(jù)總的人群流失率為10.10%,假設(shè)性別對(duì)目標(biāo)變量(客戶是否流失)沒有影響,兩者相互獨(dú)立,那么男性,女性分布的流失率應(yīng)該也在10.10%左右,即可算出其期望流失數(shù)。再根據(jù)真實(shí)的流失數(shù)算出卡方值為32.66,。通過(guò)查表,我們得知:在自由度為2,置信度為0.05下的卡方分為點(diǎn)為5.99.其32.66大于5.99,那么可得出結(jié)論,性別這個(gè)變量對(duì)其目標(biāo)變量差異性顯著。
多因子分析
- 變量直接由于業(yè)務(wù)關(guān)系,計(jì)算邏輯等因素存在一定的兩兩共線性(呈正相關(guān)或者負(fù)相關(guān)),需要研究這種共線性并做出適當(dāng)?shù)奶幚怼?/li>
- 信息的冗余(注意只是對(duì)于一階的線性關(guān)系,可能會(huì)冗余)
- 維護(hù)數(shù)據(jù)的成本(當(dāng)一個(gè)變量可以代替另外一個(gè)變量時(shí),我們可以去掉其中一個(gè)變量)
- 對(duì)某些模型存在一定的影響(在線性回歸模型中,我們假設(shè)兩個(gè)變量x1,x2具有很強(qiáng)的相關(guān)性,那么在求中的很有可能是奇異的,就是不可逆的)
隨機(jī)選取15個(gè)連續(xù)性變量,畫出其散點(diǎn)矩陣圖,得出兩兩直接的相關(guān)性
from pandas.tools.plotting import scatter_matrix corrCols = random.sample(numericCols,15) sampleDf = AllData[corrCols] for col in corrCols:sampleDf.rename(columns = {col:col_to_index[col]}, inplace = True) scatter_matrix(sampleDf, alpha=0.2, figsize=(6, 6), diagonal='kde')其實(shí)這篇博文講的主要是機(jī)器學(xué)習(xí)里面的特征選擇部分,在單因子分析中,如果某個(gè)變量對(duì)目標(biāo)變量影響不大甚至完全獨(dú)立,那么可以去掉這個(gè)變量。
如果兩個(gè)變量相關(guān)性很高,其中一個(gè)變量解釋性比較高,另外一個(gè)變量解釋性比較低時(shí),即使解釋性比較低的變量效果更好一些,我們也會(huì)將其去掉,保留解釋性比較高的那個(gè)變量。當(dāng)然這是在回歸模型中(奇異性問題)。其他模型不需要剔除。
在做模型時(shí),首先是做單因素分析,剔除那些缺失度比較高的,對(duì)結(jié)果影響不大的變量。
總結(jié)
以上是生活随笔為你收集整理的金融风控-- >客户流失预警模型-- >金融数据分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 风控-数据分析
- 下一篇: 利用poi实现table表格导出exce