1.处理数据异常值:
(1) 丢弃逾期,呆账,强制停卡,退票记录,拒往记录为 1 ,瑕疵户为 2 的记录 。
(2) 丢弃呆账,强制停卡,退票为 1 ,拒往记录为 2 的记录。
(3) 丢弃频率为 5 ,刷卡金额不等于 1 的数据。
import pandas as pd
import numpy as np
data=pd.read_csv("credit_card.csv",encoding='gbk')
#查看数据集情况:
#data.info()
#data.describe()
print("原数据的形状为",data.shape)
# 丢弃逾期,呆账,强制停卡,退票,拒往记录为 1 ,瑕疵户为 2 的记录。
ind1 = data['逾期'] == 1
ind2 = data['呆账'] == 1
ind3 = data['强制停卡记录'] == 1
ind4 = data['退票'] == 1
ind5 = data['拒往记录'] == 1
ind6 = data['瑕疵户'] == 2
data2 = ind1&ind2&ind3&ind4&ind5&ind6
data3 = data.loc[data2,:]
data4 = data.loc[data2 == False,:]
print(' 逾期,呆账,强制停卡,退票记录,拒往记录为 1 , \
瑕疵户为 2 的数据形状为: ',data3.shape)
print(' 删除逾期,呆账,强制停卡,退票记录,拒往记录为 1 , \
瑕疵户为 2 的记录后 , 数据的形状为: ',data4.shape)
# 丢弃呆账,强制停卡,退票为 1 ,拒往记录为 2 的记录
ind7 = data4['拒往记录'] == 2
data5 = ind2&ind3&ind4&ind7
data6 = data4.loc[data5 == False,:]
print(' 删除呆账,强制停卡,退票为 1 ,拒往记录为 2 的记录后, \
数据的形状为: ',data6.shape)
# 丢弃频率为 5 ,刷卡金额不等于 1 的数据
ind8 = data6['频率'] == 5
ind9 = data6['月刷卡额'] !=1
data7 = ind8&ind9
data8 = data6.loc[data7 == False,:]
print(' 删除频率为 5 ,刷卡金额不等于 1 的记录后,数据的形状为: ',data8.shape)
data8.to_csv('data8.csv')
2.特征工程:
(1) 据特征瑕疵户,逾期,呆账,强制停卡,退票,拒往记录构建历史行为特征。
(2) 根据特征借款余额,个人月收入,个人月开销,家庭月收入和月刷卡金额,构建出经济风险情况特征。
(3) 根据特征职业,年龄,住家,构建出收入风险情况特征。
(4) 标准化历史行为,经济风险情况,收入风险情况特征。
import os
import numpy as np
import pandas as pd
data8 = pd.read_csv('data8.csv',encoding='utf-8',index_col=0, engine = 'python')
# 构建历史行为特征
card_selection1 = data8[['瑕疵户','逾期','呆账','强制停卡记录','退票','拒往记录']]
print('历史行为特征前5行数据为: \n',card_selection1.head())
# 构建经济风险情况特征
card_selection2 = data8[['借款余额','个人月收入','个人月开销','家庭月收入','月刷卡额']]
print('经济风险情况特征前5行数据为: \n',card_selection2.head())
# 构建收入风险情况特征
card_selection3 = data8[['职业','年龄','住家']]
print('收入风险情况特征前5行数据为: \n',card_selection3.head())
#特征合并,选取完所需的特征之后,将相关特征列合并
# 合并历史行为、经济风险情况、收入风险情况特征
card_features = pd.concat([card_selection1,card_selection2,card_selection3], axis=1)
print(' 构建 L 、 F 、 S 特征前 5 个特征为: \n',card_features.head())
#特征标准化,由于聚类模型并不需要划分数据集,标准化可以使用 sklearn 的 preprocessing 模块
from sklearn.preprocessing import StandardScaler
data9 = StandardScaler().fit_transform(card_features)
np.savez('card_scale.npz',data9)
print(' 标准化后的 LFS 模型的前 5 个特征为 :\n',data9[:5,:])
3.构建历史行为特征,划分出历史行为特征数据:
import pandas as pd
import numpy as np
data=pd.read_csv("data8.csv",encoding='gbk')#已经进行数据清洗
#查看数据集情况:
data.info()
data.describe()
#(1) 据特征瑕疵户,逾期,呆账,强制停卡,退票,拒往记录构建历史行为特征。
data_active=data.iloc[:,[2,3,4,6,7,8]]
#定义聚类特征数据
data_means=data.iloc[:,[0]]
#查看历史行为特征数据集情况:
print("查看历史行为特征数据集情况:")
data_active.describe()
data_active.info()
#计算评分 数值越低,评分越低
def GetScore(x):
if x>=2:
a =0
else:
a =1
return a
score_1=data_active['瑕疵户'].apply(GetScore)
score_2=data_active['逾期'].apply(GetScore)
score_3=data_active['呆账'].apply(GetScore)
score_4=data_active['退票'].apply(GetScore)
score_5=data_active['拒往记录'].apply(GetScore)
score_6=data_active['强制停卡记录'].apply(GetScore)
#加权求和 历史行为
data_means.loc[:,'history_credit_risk']=score_1+score_2*2+score_3*3+score_4*3+score_5*3+score_6
4.构建经济风险情况特征
#划分出经济风险情况特征数据
data_encomic=data.iloc[:,[5,18,19,21,22]]
#查看经济风险情况特征数据情况
print("查看经济风险情况特征数据情况")
data_encomic.describe()
data_encomic.info()
#借款额度分数
def GetScore_encomic(x):
if x>=2:
a =1
else:
a =0
return a
score_yu=data_encomic['月刷卡额'].apply(GetScore_encomic)
#个人月收入情况分数
data_person=data_encomic['个人月收入']/data_encomic['个人月开销']
data_person_Scores=[]
for i in range(data_encomic.shape[0]):
if data_person[i]<1:
data_person_Scores.append(0)
else:
data_person_Scores.append(1)
#家庭月收入情况分数
data_mouth=data_encomic['家庭月收入']/data_encomic['月刷卡额']
data_mouth_Scores=[]
for i in range(data_encomic.shape[0]):
if data_person[i]<1:
data_mouth_Scores.append(0)
else:
data_mouth_Scores.append(1)
#经济风险
data_means['economic_risk']=np.array(data_mouth_Scores) + np.array(data_person_Scores)+np.array(score_yu)
5.构建收入风险情况特征
data_shouru=data.iloc[:,[14,17,20]]
#查看收入风险情况特征数据情况
print("查看收入风险情况特征数据情况")
data_shouru.describe()
data_shouru.info()
#住家评分
HouseScore = []
for i in range(data_shouru.shape[0]):
if 3 <= data_shouru.loc[i, '住家'] <= 5:
HouseScore.append(0)
else:
HouseScore.append(1)
#职业评分
JobScore = []
for i in range(data_shouru.shape[0]):
if(data_shouru.loc[i, '职业'] <= 7) | (data_shouru.loc[i, '职业'] == 19) | (data_shouru.loc[i, '职业'] == 21):
JobScore.append(2)
if(data_shouru.loc[i, '职业'] >= 8) & (data_shouru.loc[i, '职业'] <= 11):
JobScore.append(1)
if(data_shouru.loc[i, '职业'] <= 18) & (data_shouru.loc[i, '职业'] >= 12) | (data_shouru.loc[i, '职业'] == 20) | (data_shouru.loc[i, '职业'] == 22):
JobScore.append(0)
#年龄评分
AgeScore = []
for i in range(data_shouru.shape[0]):
if data_shouru.loc[i, '年龄'] <= 2:
AgeScore.append(1)
else:
AgeScore.append(0)
#收入风险
data_means['income_risk'] = np.array(HouseScore) + np.array(JobScore) + np.array(AgeScore)
6.聚类分析
#标准化构建的三个特征数据集
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
data_means_stander = sc_X.fit_transform(data_means.iloc[:,[1,2,3]])
#聚类训练
from sklearn.cluster import KMeans #导入kmeans算法
k = 5 ## 确定聚类中心数
#构建模型
kmeans_model = KMeans(n_clusters = k,n_jobs=4,random_state=123)
fit_kmeans = kmeans_model.fit(data_means_stander) #模型训练
#客户特征分析排名
data_means['count']=data_means['income_risk']+data_means['economic_risk']+data_means.loc[:,'history_credit_risk']
sort_values=data_means.sort_values("count",inplace=False)
#查看聚类中心
c1=kmeans_model.cluster_centers_
print('查看聚类中心:\n',c1)
#保存客户的类别标签
data_means['lable']=kmeans_model.labels_
l1=data_means['lable']
print('查看样本的类别标签:\n',l1)
#统计不同类别样本的数目
r1 = pd.Series(kmeans_model.labels_).value_counts()
print('最终每个类别的数目为:\n',r1)
# 输出聚类分群的结果
cluster_center = pd.DataFrame(c1,columns = ['income_risk','economic_risk','history_credit_risk',]) # 将聚类中心放在数据框中
cluster_center.index = pd.DataFrame(l1).drop_duplicates().iloc[:,0] # 将样本类别作为数据框索引
print(cluster_center)
#data_means.to_csv("mean.csv",index=False,sep=',', encoding="utf_8_sig")