Python实现多元线性回归模型信用卡客户价值预测项目源码+数据+项目设计报告

多元线性回归——信用卡客户价值预测

一、背景

这里以信用卡客户的客户价值为例来解释客户价值预测的具体含义:

客户价值预测就是指预测客户在未来一段时间内能带来多少利润,其利润可能来自信用卡的年费、取现手续费、分期手续费、境外交易手续费等。分析出客户价值后,在进行营销、电话接听、催收、产品咨询等各项业务时,就可以针对高价值客户提供区别于普通客户的服务,以进一步挖掘这些高价值客户的价值,并提高他们的忠诚度。

二、数据

  • “客户价值”列为在1年里能给银行带来的收益;
  • “学历”列的数据已经做了预处理,其中
    • 2代表高中及以下学历
    • 3代表本科及以上学历
  • “性别”列中,0 代表女,1 代表男

部分数据如下:

客户价值历史贷款金额贷款次数学历月收入性别
1096625322105670
1558477932102171
1681775233103171
103752313296671
1333548523105670

三、代码实现

1、导入Python库,引入所需的功能和模块。

import matplotlib.pyplot as plt  # 用于绘制数据可视化图形,例如折线图、散点图等
import pandas as pd  # 用于数据处理和分析,提供了高效的数据结构和数据操作功能
import statsmodels.api as sm  # 用于执行统计模型的拟合和推断,包括回归分析、时间序列分析等
from sklearn.linear_model import LinearRegression  # 用于进行线性回归建模和预测
from sklearn.model_selection import train_test_split  # 将数据集分割为训练集和测试集,常用于机器学习中的模型评估和验证

2、读取数据

    data = pd.read_excel(file_path)  # 使用pd.read_excel()函数读取名为'客户价值数据表.xlsx'的Excel文件,并将其存储在data变量中
    # 根据指定的测试集比例(这里是20%)将数据分割为训练集和测试集,并且设置了一个随机种子(这里是42)以确保结果可复现
    train_data, test_data = train_test_split(data, test_size=0.2, random_state=42)
    X = data[['历史贷款金额', '贷款次数', '学历', '月收入', '性别']]  # 从data中选取'历史贷款金额'、'贷款次数'、'学历'、'月收入'、'性别'这几列作为自变量,并将其存储在X变量中
    Y = data['客户价值']  # 从data中选取'客户价值'这一列作为因变量,并将其存储在Y变量中
    X_test = test_data[['历史贷款金额', '贷款次数', '学历', '月收入', '性别']]
    Y_test = test_data['客户价值']

3、搭建多元线性回归模型

    Regress = LinearRegression()  # 创建一个LinearRegression对象,并将其存储在Regress变量中
    Regress.fit(X, Y)  # 使用X和Y进行线性回归拟合,得到回归模型
    Predict = Regress.predict(X)  # 对五个特征变量进行回归预测

    # 2.1绘制真实值和与预测值的散点图形
    plt.scatter(Y, Predict)

    # 2.2设置图例
    plt.xlabel('Actual Value')
    plt.ylabel('Predicted Value')
    plt.title('Regression Graph')
    plt.show()  # 显示

真实值和与预测值的散点图形

在这里插入图片描述

添加一条拟合线

    plt.plot([Y.min(), Y.max()], [Y.min(), Y.max()], 'r-')

在这里插入图片描述

4、构造多元线性回归方程表达式

    K = Regress.coef_
    b = Regress.intercept_
    print('各斜率系数为:\n', str(K))  # 打印输出回归模型的各系数值
    print('常数项系数k0(截距)为:\n', str(b))  # 打印输出回归模型的常数项系数k0
    expression = construct_expression(K, b)  # 计算多元线性回归方程函数表达式
    print("多元线性回归方程为:\n", expression)

各斜率系数为:
[5.71421731e-02 9.61723492e+01 1.13452022e+02 5.61326459e-02 1.97874093e+00]

常数项系数k0(截距)为:
-208.42004079958429

多元线性回归方程为:
Y = -208 + 0.057X1 + 96X2 + 113X3 + 0.056X4 + 1.98X5

5、模型评估

    X1 = sm.add_constant(X)  # 在X变量中添加常数列,并将新的X变量存储在X1中
    est = sm.OLS(Y, X1).fit()  # 使用OLS方法进行普通最小二乘回归拟合,得到回归模型的估计值,将结果存储在est变量中
    print('\n\n回归模型的统计摘要信息如下:\n', est.summary())  # 输出回归模型的统计摘要信息

运行输出如下:可以看到,模型的R-squared值为0.571,Adj.R-squared值为0.553,整体拟合效果不是特别好,可能是因为本案例的数据量偏少,不过在此数据量条件下也算可以接受的结果。再来观察P值,可以发现大部分特征变量的P值都较小,的确与目标变量(即“客户价值”)显著相关,而“性别”这一特征变量的P值达到了0.951,即与目标变量没有显著相关性,这个结论也符合经验认知,因此,在之后的建模中可以舍去“性别”这一特征变量

在这里插入图片描述

6、模型预测

predict_new_data(Regress, X_test, Y_test)

运行输出如下:

在这里插入图片描述

在这里插入图片描述

真实值与预测值对比图

在这里插入图片描述

7、相关函数

# 构造函数表达式
# 表达式中的系数值在-1到1之间的要保留三位小数,系数值在-10到-1以及1到10之间的要保留两位小数,其余保留整数
def construct_expression(K, b):
    expression = f"Y = {int(b)}"
    for i, coef in enumerate(K):
        if -10 <= coef <= -1 or 1 <= coef <= 10:
            expression += f" + {coef:.2f}*X{i + 1}"
        elif -1 <= coef <= 1:
            expression += f" + {coef:.3f}*X{i + 1}"
        else:
            expression += f" + {int(coef)}*X{i + 1}"
    return expression


# 模型预测
def predict_new_data(model, X_new, Y_new):
    print("\n\n\n\n模型预测使用的数据如下:\n", X_new)
    new_prediction = model.predict(X_new)
    print('模型预测数据的预测结果:\n', new_prediction)
    # 绘制真实值与预测值对比图
    plt.plot(Y_new['客户价值'].tolist(), label='Actual Value')
    plt.plot(new_prediction, label='Predicted Value')
    plt.xlabel('Sample Index')
    plt.ylabel('Value')
    plt.title('Regression Curve Comparison')
    plt.legend()
    plt.show()

8、程序入口

# 程序入口
if __name__ == '__main__':
    path = '客户价值数据表.xlsx'
    multiple_linear_regression(path)  # 调用函数并传入数据文件的路径

完整代码下载地址:Python实现多元线性回归模型信用卡客户价值预测

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/259139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《C++ Primer》第13章 拷贝控制(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 13.5 动态内存管理类&#xff08;P464&#xff09; 某些类需要在运行时分配可变大小的内存空间。这种类通常可以用使用标准库容器来保存它们的数据。有些时候&#xff0c;我们希望类自己进行内存分配&#…

TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)

文章目录 泛型1 泛型2 声明合并 命名空间 模块1 模块2 声明文件简介 泛型1 泛型&#xff08;Generics&#xff09;是指在定义函数、接口或类的时候&#xff0c;不预先指定具体的类型&#xff0c;而在使用的时候再指定类型的一种特性 首先&#xff0c;我们来实现一个函数…

小黑南京归来,参加部里的公务员培训,有点儿社死认识了好多小伙伴的leetcode之旅13. 罗马数字转整数

小黑代码 class Solution:def romanToInt(self, s: str) -> int:chars [M, CM, D, CD, C, XC, L, XL, X, IX, V, IV,I]nums [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]map_ dict((k, v) for k,v in zip(chars, nums))# 字符串长度n len(s)# 结果变量res …

安装Redis+Redis设置成windows下的服务+windows无法启动Redis服务,报错误1067:进程意外终止,解决方法

&#xff08;一&#xff09;安装Redis 官网地址&#xff1a;Redis 不过Redis 的官网不提供 Windows 版本的下载&#xff0c;可以从Github上下载&#xff0c;Windows版本的下载地址&#xff1a; https://github.com/microsoftarchive/redis/releases/ 无需安装&#xff0c;直…

2828. 判别首字母缩略词

2828. 判别首字母缩略词 难度: 简单 来源: 每日一题 2023.12.20 给你一个字符串数组 words 和一个字符串 s &#xff0c;请你判断 s 是不是 words 的 首字母缩略词 。 如果可以按顺序串联 words 中每个字符串的第一个字符形成字符串 s &#xff0c;则认为 s 是 words 的…

比例导引(PNG)-Matlab 程序

本文提供比例导引的matlab程序&#xff0c;想要看理论的可以看书《导弹飞行力学》或者我的博客 比例导引详解 代码 %% 三维比例导引末制导clc;clear; close all;%% 设置导弹初始参数和目标参数% 总步长 length 1000000; x_m zeros(length,1); y_m zeros(length,1); z_m z…

node.js mongoose

目录 官方文档 mongoose Schema Model Query document 关系 官方文档 Mongoose v8.0.3: Getting Started mongoose Mongoose 是一个 Node.js 环境下 MongoDB 的对象建模工具。它提供了一种在应用程序中与 MongoDB 数据库进行交互的方式&#xff0c;使得开发者能够使用…

基于k6和python进行自动化性能测试

摘要&#xff1a;在性能测试中&#xff0c;达到相应的性能指标对于一个软件来说十分重要&#xff0c;在本文中&#xff0c;将介绍一种现代化性能测试工具k6。 import http from k6/http; import { sleep } from k6; export default function () {http.get(https://test-api.co…

JNI 注册

一、 JNI 静态注册 ① 在 Android 的 Java 层定义方法 : 在 MainActivity 类中定义 如下 Native 方法 ; public native String stringFromJNI();② Native 方法实现 : 下面是一个 Native 方法实现的示例 ; extern "C" JNIEXPORT jstring JNICALL Java_kim_hsl_jni_…

JMeter如何进行多服务器远程测试

JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单个电脑的性能影响&#xff0c;往往达不到性能测试的要求&#xff0c;无法有效的模拟高并发的场景&#xff0c;那么…

css实现0.5px宽度/高度显——属性: transform: scale

在大多数设备上&#xff0c;实际上无法直接使用 CSS 来精确地创建 0.5 像素的边框。因为大多数屏幕的最小渲染单位是一个物理像素&#xff0c;所以通常只能以整数像素单位渲染边框。但是&#xff0c;有一些技巧可以模拟出看起来像是 0.5 像素的边框。 这里介绍使用&#xff1a…

Linux内核模块

文章目录 一、内核模块介绍二、模块讲解1、最简模块代码&#xff1a;2、模块三要素3、常用操作命令3.1、 lsmod&#xff1a;显示已加载模块状态3.2、 insmod&#xff1a;载入模块3.3、rmmod&#xff1a;卸载模块3.4、dmesg&#xff1a;显示信息3.5、modinfo&#xff1a;显示ker…

Azure Machine Learning - 提示工程高级技术

本指南将指导你提示设计和提示工程方面的一些高级技术。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的资深架构师&#xff0c…

2023/12/20 work

1. 使用select完成TCP客户端程序 2. 使用poll完成TCP并发服务器 3. 思维导图

linux 内核的 lru_list 的结构

在linux的slab分配的入口slab_alloc有一个传入参数lru&#xff0c;它的作用是使每个slab对象在unused&#xff0c;但可能后面继续使用的时候&#xff0c;不需要free&#xff0c;可以先放在lru_list上。lru_list的结构为&#xff1a; struct list_lru {struct list_lru_node *n…

【Axure RP9】中继器应用及相关案例

一 中继器简介 1.1 中继器是什么 中继器&#xff08;Repeater&#xff09;是一种高级的组件&#xff08;Widget&#xff09;&#xff0c;用于显示文本、图像和其他元素的重复集合。它是一个容器&#xff0c;容器中的每一个项目称作“item”&#xff0c;由于“item”中的数据由…

C# Tcplistener,Tcp服务端简易封装

文章目录 前言相关文章前言设计代码简单使用运行结果 前言 我最近有个需求要写Tcp服务端&#xff0c;我发现Tcp服务端的回调函数比较麻烦&#xff0c;简化Tcp的服务&#xff0c;我打算自己封装一个简单的Tcp服务端。 相关文章 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient…

《数据结构、算法与应用C++语言描述》- 最小输者树模板的C++实现

输者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_31loserTree 输者树&#xff1a;每一个内部节点所记录的都是比赛的输者&#xff0c;晋级的节点记录在边上。本文中&#xff0c;赢者是分数较低的那个&#xff0c;输者是分数高…

线性回归中的似然函数、最大似然估计、最小二乘法怎么来的(让你彻底懂原理)收官之篇

图1 图2 图3 图4 问1&#xff1a;为什么要引入似然函数&#xff1f; 在线性回归中引入似然函数是为了通过概率统计的方法对模型参数进行估计。简单来说&#xff0c;我们希望找到一组参数&#xff0c;使得我们观测到的数据在给定这组参数的情况下最有可能发生。 问:1&#xf…

js之零碎工具(四)

一、数组的去重 简单类型的去重 let arr [1, 2, 2, 3, 4, 4, 5]; let uniqueArr [...new Set(arr)]; console.log(uniqueArr); // 输出&#xff1a;[1, 2, 3, 4, 5]在这个例子中&#xff0c;我们首先创建了一个新的 Set 对象&#xff0c;并将数组 arr 作为参数传递给 Set 的…