基于机器学习的用于预测客户的购买品牌行为预测模型 毕业论文+项目源码及数据库文件

!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!!

 💕💕作者:优创学社
💕💕个人简介:本人在读博士研究生,拥有多年程序开发经验,辅导过上万人毕业设计,支持各类专业;如果需要论文、毕设辅导,程序定制可以联系作者
💕💕各类成品java系统 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富,欢迎咨询交流。学习资料、程序开发、技术解答、代码讲解、源码部署,需要请看文末联系方式。

   录

第1部分 项目背景... 1

第2部分 项目目标... 1

第3部分 项目现状... 2

第4部分 解决思路及流程... 2

第5部分 项目实现... 4

5.1        库包需求... 4

5.2        查看数据结构... 4

5.3        数据预处理... 7

5.3.1 数据清洗... 7

5.3.2 数据整理... 8

5.4        数据探索性分析... 10

5.5        构造新数据指标... 13

5.6        新数据指标探索性分析... 18

5.7        构建预测模型... 23

5.7.1 建模前处理数据... 24

5.7.2 划分训练集和测试集... 26

5.7.3 过采样处理... 26

5.7.4 数据标准化... 29

5.7.5 构建逻辑回归模型... 29

5.7.6 构建随机森林分类模型... 31

5.7.7 构建决策树分类模型... 33

5.7.8 构建K近邻分类模型... 36

5.7.9 构建SVM支持向量机分类模型... 38

5.8        模型评估和运用... 40

5.8.1 总结各个模型的可用性... 40

5.8.2 模型选取... 41

第6部分 项目总结... 41

  1. 项目背景

项目背景如下:

  1. 随着信息时代的发展,海量的数据给人们带来海量的信息。尤其是互联网的大量应用,人们在互联网的浏览行为愈发频繁,加上人们在网上的购买行为日益增多,电子商务这一行业也顺势高速发展。网络营销的商机越来越大,大量的电子商务网站也在悄然发展,电商行业的竞争也在加大。
  2. 客户作为电商企业的主要经营对象,分析客户的行为记录,探索客户的行为规律,并将这些规律和网站经营策略相结合,对网站的营销方案作出有利的修改,以及为电商企业增加利润和实施高效管理有着重要意义。
  1. 项目目标

基于上述存在的数据问题,主要实现以下这些目标:

  1. 构建新的数据指标:
  1. 客户-品牌组合id
  2. 某客户是否购买某品牌(目标数据)
  3. 客户是否复购
  4. 一周内客户是否购买
  5. 客户心动天数(同客户同品牌点击后到购买的天数,将时间戳转化为天数)
  6. 客户购买频率(一周内同客户同品牌购买次数)
  1. 删除不需要的数据指标列;
  2. 采用过采样技术,通过减少多数类样本的数量来平衡数据集;
  3. 构建客户购买品牌预测模型并进行训练,对训练好的模型进行修改,提高模型可靠度;
  4. 通过计算模型评估指标值,判断模型的可使用性,并根据模型结果提出相应的营销建议。
  1. 项目现状

目前的电商平台商品种类繁多,客户流量远大于线下的各种百货商场,每一客户对每一商品进行何种操作都会有记录。

通过查看数据结构可知:

  1. 数据集中的数据指标只有客户id、品牌id、行为类型和行为时间,数据指标较少且实际意义均为字符,很难支撑后续的模型构建和预测工作,需要构建新的有分析意义的数据指标
  2. 数据集中的时间戳不方便观察和统计,需要将其转化为时间格式,再转化为天数,以便后续的统计分析;

通过分析客户操作行为类型分布情况可知:客户在一天内可能有多种操作行为,并且更倾向于在电商平台进行浏览点击,购买行为、收藏行为和添加购物车占据了所有记录的比较小的比例,因此项目数据集属于不均衡数据集。若以是否购买作为客户或品牌的分类标签,会导致数据的正负样本失衡,最终导致无法准确判断客户的购买行为,可能需要利用过采样技术来解决这一问题。

  1. 解决思路及流程

项目目标实现流程主要分为个8步骤,流程如下图所示:

  1. 项目实现
    1. 库包需求

库名

版本

numpy

1.23.5

pandas

1.5.3

matplotlib

3.7.2

pyecharts

2.0.3

seaborn

0.12.2

sklearn

1.2.1

    1. 查看数据结构

import pandas as pd

import numpy as np

import matplotlib.pyplot as plt

# 导入数据

df = pd.read_csv('data.csv')

df

输出结果如下。

user_id   brand_id type visit_datetime

0     10944750       13451     0     64

1     10944750       13451     2     64

2     10944750       13451     2     64

3     10944750       13451     0     64

4     10944750       13451     0     64

...    ...    ...    ...    ...

182875   847750   26631     0     730

182876   847750   26631     0     730

182877   847750   2845       0     812

182878   847750   5317       0     88

182879   847750   22353     0     88

# 查看数据情况

df.info()

输出结果如下。

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 182880 entries, 0 to 182879

Data columns (total 4 columns):

 #   Column          Non-Null Count   Dtype

---  ------          --------------   -----

 0   user_id         182880 non-null  int64

 1   brand_id        182880 non-null  int64

 2   type            182880 non-null  int64

 3   visit_datetime  182880 non-null  object

dtypes: int64(3), object(1)

memory usage: 5.6+ MB

# 查看缺失值

df.isnull().sum()

输出结果如下。

user_id           0

brand_id          0

type              0

visit_datetime    0

dtype: int64

# 查看数据重复值

df.duplicated().sum()

输出结果如下。

97850

df['user_id'].nunique()

输出结果如下。

884

df['brand_id'].nunique()

输出结果如下。

9531

df['visit_datetime'].nunique()

输出结果如下。

123

type_pl=df['type'].value_counts()

type_pl

输出结果如下。

0    174539

1      6984

2      1204

3       153

Name: type, dtype: int64

# 查看行为类型分布 

from pyecharts import options as opts

from pyecharts.charts import Pie

labels = ['点击', '购买', '收藏', '加购物车']

data = [[174539], [6984], [1204], [153]] 

pie = (

    Pie(init_opts=opts.InitOpts(width="500px", height="300px"))

    .add("", [list(z) for z in zip(labels, data)])

    .set_colors(['#659AC3','#C46ECA','#D19E76','#86D880'])

    .set_global_opts(

        title_opts=opts.TitleOpts(title="行为类型占比"),

        legend_opts=opts.LegendOpts(orient="vertical", pos_right="", pos_top="right")

    )

    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {d}%"))

)

pie.render_notebook()

输出结果如下图。

行为类型占比分析:可以看出即点击的次数最多,占据了所有记录的 95.44%,购买占了所有记录的4%左右,收藏占了所有记录的0.66%,添加购物车占了所有记录的0.08%。这说明,在网购期间,绝大多数用户以浏览为主,即绝大多数人都喜欢在电商平台“闲逛”,虽然该行为只是浏览点击,但是也反映了该商品吸引了用户点击浏览。添加购物车的行为比点击更代表用户对商品感兴趣。因此项目数据集属于正负不均衡数据集。若以是否购买作为客户或品牌的分类标签,会导致数据的正负样本失衡,最终导致无法准确判断客户的购买行为,可能需要利用欠采样技术或过采样技术来解决这一问题。

    1. 数据预处理

数据预处理是指在进行数据分析之前,对原始数据进行清洗、转换和集成等一系列处理,以便于进行更高效、准确的数据分析。

该项目需要做的数据预处理内容包括:数据清洗(检测和纠正数据中的异常值、缺失值、重复值和错误值等)与数据准备(数据整理排序)。

      1. 数据清洗

# 查看数据情况

df.info()

输出结果如下。

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 182880 entries, 0 to 182879

Data columns (total 4 columns):

 #   Column          Non-Null Count   Dtype

---  ------          --------------   -----

 0   user_id         182880 non-null  int64

 1   brand_id        182880 non-null  int64

 2   type            182880 non-null  int64

 3   visit_datetime  182880 non-null  object

dtypes: int64(3), object(1)

memory usage: 5.6+ MB

数据情况:

无异常值、缺失值。

重复值处理说明:在客户购买品牌行为的数据中,重复值代表了同一观测的多个测量结果,删除重复值可能会导致数据的丢失。因此对于数据重复值不做删除处理。

      1. 数据整理

数据整理:需要先将为数字格式的id、行为类型的格式转换为字符格式,更符合现实意义;行为时间需要转换为日期格式。

# 将为数字格式的数据的格式转换为字符格式

df = df.astype(str)

df.info()

输出结果如下。

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 182880 entries, 0 to 182879

Data columns (total 4 columns):

 #   Column          Non-Null Count   Dtype

---  ------          --------------   -----

 0   user_id         182880 non-null  object

 1   brand_id        182880 non-null  object

 2   type            182880 non-null  object

 3   visit_datetime  182880 non-null  object

dtypes: object(4)

memory usage: 5.6+ MB

# 对行为时间列进行日期格式转换

# 假设这是一年内的数据,因此转换时间格式时,年份为默认年份1900

import datetime

df['visit_datetime'] = pd.to_datetime(df['visit_datetime'], format='%m%d')

df

输出结果如下。

user_id   brand_id type visit_datetime

0     10944750       13451     0     1900-06-04

1     10944750       13451     2     1900-06-04

2     10944750       13451     2     1900-06-04

3     10944750       13451     0     1900-06-04

4     10944750       13451     0     1900-06-04

...    ...    ...    ...    ...

182875   847750   26631     0     1900-07-30

182876   847750   26631     0     1900-07-30

182877   847750   2845       0     1900-08-12

182878   847750   5317       0     1900-08-08

182879   847750   22353     0     1900-08-08

数据排序:数据按时间列进行排序,以便后面构建与事件相关的新数据指标

# 数据按时间列进行排序

df.sort_values('visit_datetime', inplace=True)

df

输出结果如下。

user_id   brand_id type visit_datetime

53046     10492250       3228       0     1900-04-15

158705   5011500  20484     0     1900-04-15

158704   5011500  20484     0     1900-04-15

88093     7797000 14294     0     1900-04-15

158703   5011500  20484     0     1900-04-15

...    ...    ...    ...    ...

28533     3226500 16474     0     1900-08-15

28532     3226500 16474     0     1900-08-15

28531     3226500 14071     0     1900-08-15

128575   11939000 21672     0     1900-08-15

149358   3661500 7312       0     1900-08-15

    1. 数据探索性分析

进行探索性数据分析,目的是发现数据中的模式、趋势、异常值和关联关系,以帮助理解数据的特征和可用性。

plt.rcParams['font.sans-serif'] = ["SimHei"]  # 中文显示

# 统计每个字符出现的次数 

user_counts = df["user_id"].value_counts()

# 计算中位数 

mean_count = np.mean(user_counts.values)

# 绘制字符数量分布直方图 

plt.figure(figsize=(10, 6)) 

plt.bar(user_counts.index, user_counts.values) 

plt.xlabel("客户 id") 

plt.ylabel("出现次数") 

plt.title("客户 id 分布情况")

# 绘制中位线

plt.plot(user_counts.index, [mean_count] * len(user_counts.index), color='red', linestyle='-', label='均值线')

plt.annotate(f'{int(mean_count)}', (user_counts.index[-1], mean_count), fontsize=10, color='red', ha='center', va='bottom')

plt.legend()

# 获取当前图形的 x  

xaxis = plt.gca().xaxis

# 隐藏 x  

xaxis.set_visible(False)

# 绘制中位线 

plt.show() 

输出结果如下图。

客户id出现次数分布不均,极少数客户id出现次数过多,接近2500次,而出现次数的平均数仅为206次

plt.rcParams['font.sans-serif'] = ["SimHei"]  # 中文显示

# 统计每个字符出现的次数 

brand_counts = df["brand_id"].value_counts() 

# 计算中位数 

mean_count = np.mean(brand_counts.values)

# 绘制字符数量分布直方图 

plt.figure(figsize=(10, 6)) 

plt.bar(brand_counts.index, brand_counts.values) 

plt.xlabel("品牌 id") 

plt.ylabel("出现次数") 

plt.title("品牌 id 分布情况")

# 绘制中位线

plt.plot(brand_counts.index, [mean_count] * len(brand_counts.index), color='red', linestyle='-', label='均值线')

plt.annotate(f'{int(mean_count)}', (brand_counts.index[-1], mean_count), fontsize=10, color='red', ha='center', va='bottom')

plt.legend()

# 设置纵坐标最大值为 1200 

plt.ylim(0, 1200)

# 获取当前图形的 x  

xaxis = plt.gca().xaxis

# 隐藏 x  

xaxis.set_visible(False)

plt.show()

输出结果如下图。

品牌id出现次数分布不均,极少数品牌id出现次数过多,接近1000次,而出现次数的平均数仅为19次。

通过分析月份、日的数据分布,我们可以了解训练数据的集中趋势、离散程度、分布形状等信息,从而更好地了解数据的整体特征和规律。这对于后续的特征选择和模型选可能有帮助。 此外,对于时间序列数据,分析月份、日的数据分布还可以帮助我们了解数据的周期性变化和趋势性变化,从而更好地进行预测和趋势分析。

# 分解出月、日

df['Month'] = df.visit_datetime.dt.month

df['Day'] = df.visit_datetime.dt.day

df

输出结果如下。

user_id   brand_id type visit_datetime Month    Day

53046     10492250       3228       0     1900-04-15    4     15

158705   5011500  20484     0     1900-04-15    4     15

158704   5011500  20484     0     1900-04-15    4     15

88093     7797000 14294     0     1900-04-15    4     15

158703   5011500  20484     0     1900-04-15    4     15

...    ...    ...    ...    ...    ...    ...

28533     3226500 16474     0     1900-08-15    8     15

28532     3226500 16474     0     1900-08-15    8     15

28531     3226500 14071     0     1900-08-15    8     15

128575   11939000 21672     0     1900-08-15    8     15

149358   3661500 7312       0     1900-08-15    8     15

# 月份、日数据分布分析

import seaborn as sns

for column in df.select_dtypes(include='number'):

    plt.figure(figsize=(5, 3))

    sns.countplot(data=df, x=column)

    plt.xticks(rotation=90)

    plt.show()

输出结果如下图。

行为时间分析:客户在7月份的行为数据最多,4、8月份行为数据较少;客户在每日的行为数据量大部分差不多,11号与15号数据较多,31号较少可能是部分月份没有31号,因此缺失了31号的数据。

项目名称:客户购买品牌预测

项目背景和目的:本项目旨在通过分析电商平台的客户行为数据,了解客户对品牌的行为情况,为电商企业的市场推广和产品决策提供支持。

数据分析方法:本项目采用了数据清洗、数据可视化、统计分析和机器学习等方法。首先对数据进行清洗,然后采用数据可视化方法对数据进行探索性分析,通过统计分析方法得出客户对品牌的行为情况,最后使用机器学习方法对客户购买行为进行预测分析。

数据分析结果:通过数据分析,得出以下结论:

  1. “客户是否复购”与“客户购买频率”这两个指标一般可以体现客户的忠诚度,“客户购买频率”一定程度上决定了客户最终是否会购买该品牌,但“客户是否复购”对客户最终购买情况影响并不大,客户复购的原因可能各不相同,有些客户可能因为产品价格低廉、购买方便等原因进行复购,而有些客户可能是因为产品品质好、满足了他们的需求而复购。因此,也不能简单地认为客户复购就意味着他们对产品满意并且忠诚。

  2. “某客户一周内是否购买任何品牌”这个指标体现了客户自身的购买习惯,这一指标也会影响最后客户对品牌的购买情况。

  3. “客户心动天数”这个指标体现了客户对某品牌点击后到购买的天数,客户心动天数与购买意愿有联系,因此可以判断购买情况。

结论和建议:根据数据分析结果,建议电商企业提高顾客忠诚度,从而提高复购率和购买频率;并且关注一周内购买过商品的客户,可以针对性地提供相关服务来吸引这一类更有购买意愿的客户;提供优质的产品和服务、开展有针对性的促销活动等方式,使客户在第一次点击过后对品牌有一定印象,并能在一定时间内进行购买。

更多项目:

另有10000+份项目源码,项目有java(包含springboot,ssm,jsp等),小程序,python,php,net等语言项目。项目均包含完整前后端源码,可正常运行!

!!! 有需要的小伙伴可以点击下方链接咨询我哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优创学社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值