首页 > 其他分享 >机器学习每周挑战——信用卡申请用户数据分析

机器学习每周挑战——信用卡申请用户数据分析

时间:2024-04-04 17:30:09浏览次数:27  
标签:数据分析 信用卡 每周 train Xgb rfc plt test data

数据集的截图

# 字段    说明
# Ind_ID    客户ID
# Gender    性别信息
# Car_owner 是否有车
# Propert_owner 是否有房产
# Children  子女数量
# Annual_income 年收入
# Type_Income   收入类型
# Education 教育程度
# Marital_status    婚姻状况
# Housing_type  居住方式
# Birthday_count    以当前日期为0,往前倒数天数,-1代表昨天
# Employed_days 雇佣开始日期。以当前日期为0,往前倒数天数。正值意味着个人目前未就业。
# Mobile_phone  手机号码
# Work_phone    工作电话
# Phone 电话号码
# EMAIL_ID  电子邮箱
# Type_Occupation   职业
# Family_Members    家庭人数
# Label 0表示申请通过,1表示申请拒绝

# 知道了数据集的情况,我们来看问题
# 问题描述
# 用户特征与信用卡申请结果之间存在哪些主要的相关性或规律?这些相关性反映出什么问题?
#
# 从申请用户的整体特征来看,银行信用卡业务可能存在哪些风险或改进空间?数据反映出的问题对银行信用卡业务有哪些启示?
#
# 根据数据集反映的客户画像和信用卡申请情况,如果你是该银行的风控或市场部门负责人,你会提出哪些战略思考或建议?
#
# 参考分析角度
# 用户画像分析
#
# 分析不同人口统计学特征(如性别、年龄、婚姻状况等)对信用卡申请的影响和规律
# 分析不同社会经济特征(如收入、职业、教育程度等)与申请结果的关系
# 特征选取和模型建立
#
# 评估不同特征对预测信用卡申请结果的重要性,进行特征筛选
# 建立信用卡申请结果预测模型,评估模型性能
# 申请结果分析
#
# 分析不同用户群的申请通过率情况,找到可能的问题原因
# 对申请被拒绝的用户进行细分,寻找拒绝的主要原因

# 知道问题后,我们先进行数据预处理
print(data.info()) # 有缺失值
print(data.isnull().sum() / len(data))  # 可以看出有的列缺失值有点多

# GENDER               7   Annual_income       23   Birthday_count      22     Type_Occupation    488
# GENDER             0.004522   Annual_income      0.014858    Birthday_count     0.014212   Type_Occupation    0.315245
# Type_Occupation    0.315245 这一列缺失值数据占比有点高了,但是,这一列是职业,跟我们的业务相关性较高,我觉得应该将缺失值单独分为一个属性
# 其他的列的缺失值较少,woe们可以填充,也可以删除,我觉得对于信用卡这种模型精度要求较严的,我们就删除,填充的值不是很准确,可能对模型造成一定的影响
# 观察数据,我们可以发现,ID,电话号,邮箱这种特征对我们来说没有用 ,生日记数我也感觉没用
data['Type_Occupation'] = data['Type_Occupation'].fillna("无")
data = data.dropna()
data = data.drop(['Ind_ID','Mobile_phone','Work_Phone','Phone','EMAIL_ID','Birthday_count'],axis=1)
# 分析不同人口统计学特征(如性别、年龄、婚姻状况等)对信用卡申请的影响和规律
# 分析不同社会经济特征(如收入、职业、教育程度等)与申请结果的关系

features = ['GENDER','EDUCATION','Marital_status','Annual_income','Type_Occupation','Type_Income']

for i in range(len(features)):
    # plt.subplot(2,3,i+1)
    plt.figure()

    if data[features[i]].dtype == float:
        data[features[i]] = pd.cut(data[features[i]],bins=10)
        features_data = data[features[i]].value_counts()
        plt.bar(features_data.index.astype(str),features_data.values)
    else:
        features_data = data.groupby(features[i])['label'].sum()
        features_data = features_data.sort_values(ascending=False)
        plt.bar(features_data.index,features_data.values)

    plt.title(features[i]+"与信用卡申请之间的关系")
    plt.xlabel(features[i])
    plt.ylabel("总数量")
    plt.xticks(rotation=60)
    plt.tight_layout()

 

 

 

 

# 这样我们可以看出各个特征列与标签列之间的关系
# 我们看一下标签列的分布情况
labels = data['label'].value_counts()
# print(labels)

plt.figure()
plt.bar(labels.index,labels.values)
plt.title("信用卡申请人数比较")
plt.xticks([0,1],['未申请到信用卡','成功申请到信用卡'])

# 由图可以看出,申请到信用卡的人数比没申请到信用卡的人数少,数据存在不均衡,因此我们建立模型时,要注意处理不均横的数据
# 由于计算机只能处理数字,因此我们先将字符型数据转换为数值型,这里我们可以用标签编码或者独热编码。这里我们选择标签编码
data['Annual_income'] = pd.factorize(data['Annual_income'])[0]
data['label'] = data['label'].astype(int)


for i in data.columns:
    if data[i].dtype == object:
        encode = LabelEncoder()
        data[i] = encode.fit_transform(data[i])

X = data.drop('label',axis=1)
y = data.label

rfc = RandomForestClassifier(n_estimators=100,random_state=42)
rfc.fit(X,y)

importance = rfc.feature_importances_
sort_importance = importance.argsort()
feature = X.columns

plt.figure()
plt.barh(range(len(sort_importance)),importance[sort_importance])
plt.yticks(range(len(sort_importance)), [feature[i] for i in sort_importance])
plt.title('特征重要性分析')
plt.xlabel("特征重要性")

# plt.show()

# 通过特征重要性分析我们可以看出离职天,年收入和职业类型与信用卡的申请有很大的关联

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)

#分离少数类和多数类
X_minority = X_train[y_train == 1]
y_minority = y_train[y_train == 1]
X_majority = X_train[y_train == 0]
y_majority = y_train[y_train == 0]
X_minority_resampled = resample(X_minority, replace=True, n_samples=len(X_majority), random_state=42)
y_minority_resampled = resample(y_minority, replace=True, n_samples=len(y_majority), random_state=42)
new_X_train = pd.concat([X_majority, X_minority_resampled])
new_y_train = pd.concat([y_majority, y_minority_resampled])


rfc = RandomForestClassifier(n_estimators=100,random_state=42)
rfc.fit(new_X_train,new_y_train)
rfc_y_pred = rfc.predict(X_test)

class_report_rfc = classification_report(y_test,rfc_y_pred)
print(class_report_rfc)

# 有了准确率,F1分数等,我们来绘制混淆矩阵
rfc_corr = confusion_matrix(y_test,rfc_y_pred)
plt.figure()
sns.heatmap(rfc_corr,annot=True,fmt='g')
plt.title('随机森林的混淆矩阵')
# plt.show()
print(rfc.predict_proba(X_test)[:1])
rfc_fpr,rfc_tpr,_ = roc_curve(y_test,rfc.predict_proba(X_test)[:,1])
rfc_roc = auc(rfc_fpr,rfc_tpr)

plt.figure()
plt.plot(rfc_fpr,rfc_tpr,label='ROC(area = %0.2f)')
plt.plot([0,1],[0,1],linestyle='--')
plt.xlabel("False Rate")
plt.ylabel("True Rate")


svm = SVC(kernel='rbf',probability=True,random_state=42)
svm.fit(new_X_train,new_y_train)
svm_y_pred = svm.predict(X_test)

class_report_svm = classification_report(y_test,svm_y_pred)
print(class_report_svm)

# 混淆矩阵
svm_corr = confusion_matrix(y_test,svm_y_pred)
plt.figure()
sns.heatmap(svm_corr,annot=True,fmt='g')
plt.title('支持向量机(SVM)的混淆矩阵')

svm_fpr,svm_tpr,_ = roc_curve(y_test,svm.predict_proba(X_test)[:,1])
svm_roc = auc(svm_fpr,svm_tpr)

plt.figure()
plt.plot(svm_fpr,svm_tpr,label='ROC(area = %0.2f)')
plt.plot([0,1],[0,1],linestyle='--')
plt.xlabel("False Rate")
plt.ylabel("True Rate")


Xgb = xgb.XGBClassifier(random_state=42,use_label_encoder=False)
Xgb.fit(new_X_train,new_y_train)
Xgb_y_pred = Xgb.predict(X_test)

class_report_Xgb = classification_report(y_test,Xgb_y_pred)
print(class_report_Xgb)

# 混淆矩阵
Xgb_corr = confusion_matrix(y_test,Xgb_y_pred)
plt.figure()
sns.heatmap(Xgb_corr,annot=True,fmt='g')
plt.title('XGboost的混淆矩阵')

Xgb_fpr,Xgb_tpr,_ = roc_curve(y_test,Xgb.predict_proba(X_test)[:,1])
Xgb_roc = auc(Xgb_fpr,Xgb_tpr)

plt.figure()
plt.plot(Xgb_fpr,Xgb_tpr,label='ROC(area = %0.2f)')
plt.plot([0,1],[0,1],linestyle='--')
plt.xlabel("False Rate")
plt.ylabel("True Rate")

plt.show()

 

 

 

 

 

 

              precision    recall  f1-score   support       (随机森林)

           0       0.94      0.92      0.93       410             (0和1代表着标签列的0和1)
           1       0.33      0.41      0.37        39

    accuracy                           0.88       449
   macro avg       0.64      0.67      0.65       449
weighted avg       0.89      0.88      0.88       449


              precision    recall  f1-score   support      (SVM)

           0       0.95      0.05      0.10       410
           1       0.09      0.97      0.16        39

    accuracy                           0.13       449
   macro avg       0.52      0.51      0.13       449
weighted avg       0.88      0.13      0.10       449

              precision    recall  f1-score   support        (XGboost)

           0       0.94      0.92      0.93       410
           1       0.34      0.41      0.37        39

    accuracy                           0.88       449
   macro avg       0.64      0.67      0.65       449
weighted avg       0.89      0.88      0.88       449
 

标签:数据分析,信用卡,每周,train,Xgb,rfc,plt,test,data
From: https://blog.csdn.net/qq_60688380/article/details/137357202

相关文章

  • Python快速入门系列-8(Python数据分析与可视化)
    第八章:Python数据分析与可视化8.1数据处理与清洗8.1.1数据加载与查看8.1.2数据清洗与处理8.1.3数据转换与整理8.2数据可视化工具介绍8.2.1Matplotlib8.2.2Seaborn8.2.3Plotly8.3数据挖掘与机器学习简介8.3.1Scikit-learn8.3.2TensorFl......
  • 数据分析的利器,Pandas 软件包详解与应用示例
    左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。公众号:一点sir在中土大地上,有一位名为"数据剑客"的江湖人士,他手持一柄闪烁着银光的利剑,剑法犀利,能够破解数据的种种奥秘。传言他曾在一场数据风暴中横扫八方,击溃了无数数据乱象,以无情的数据剑法征服了各路数据恶徒......
  • “金三银四”变“铜三铁四”,会Python数据分析的人却笑了
    金三银四,本该是一年一度的招聘旺季。但今年的职场风向好像有些变化,大型互联网公司纷纷裁员,大批应届毕业生开始“春招”,如今3月份已经接近尾声,而招聘市场却反常的冷淡,尤其是互联网行业,新增职位量大幅下降。大家一边笑称今年的金三银四“氧化”成了“铜三铁四”,一边“投简历......
  • 智能交通系统设计:基于MATLAB的智能交通系统设计和仿真,包括交通流仿真、交通信号控制和
    鱼弦:公众号【红尘灯塔】,CSDN内容合伙人、CSDN新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于MATLAB的智能交通系统设计:原理、应用、实现与分析1.智能交通系统概述1.1......
  • 如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池
    如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池第三章通过免费代理网站建立ip池文章目录如何利用爬虫与数据分析指导选择首篇小说类型:第三章通过免费代理网站建立ip池前言一、获取免费ip1.封装requests请求网址方法2.获取代理ip—开心代......
  • 2024年AI订阅、游戏消费、流媒体订阅、域名购买等常用的美元信用卡使用场景科普大全!
    应用场景卡BIN详细应用AI软件支付534786、556150虚拟信用卡用于支付AI软件订阅,如ChatGPTPlus、OpenAI-APIKey、Midjourney、POE等。电商网站购物559666、531993适用于Amazon、Ebay、Etsy、Alibaba、Shopify、Walmart、TikTok、AliExpress、Lazada、Rakuten、Wish、BestBuy、......
  • 数据分析-Matplotlib模块
    简介Pyplot是Matplotlib的子库,提供了和MATLAB类似的绘图API。Pyplot是常用的绘图模块,能很方便让用户绘制2D图表。Pyplot包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。pyplot子模块的......
  • agate 一个方便的python 数据分析包
    对于基于python数据处理的同学,使用pandas的可能比较多,但是agate也是一个很不错的选择,比如dbt对于seed模型的处理就基于了agateagate包含的特性易读以及用户用好的api完整的类似sql的操作unicode支持比较完整的文档插件化的扩展支持(比如sql,excel)与ipython,jupyter以......
  • R语言分段回归数据分析案例报告
    原文链接: http://tecdat.cn/?p=3805原文出处:拓端数据部落公众号 我们在这里讨论所谓的“分段线性回归模型”,因为它们利用包含虚拟变量的交互项。读取数据  data=read.csv("artificial-cover.csv")查看部分数据  head(data)##   tree.covershurb.gr......
  • 数据分析(三)线性回归模型实现
    1.惩罚线性回归模型概述线性回归在实际应用时需要对普通最小二乘法进行一些修改。普通最小二乘法只在训练数据上最小化错误,难以顾及所有数据。惩罚线性回归方法是一族用于克服最小二乘法(OLS)过拟合问题的方法。岭回归是惩罚线性回归的一个特例。岭回归通过对回归系数的平方......