!!! 有需要的小伙伴可以通过文章末尾名片咨询我哦!!!
💕💕作者:优创学社
💕💕个人简介:本人在读博士研究生,拥有多年程序开发经验,辅导过上万人毕业设计,支持各类专业;如果需要论文、毕设辅导,程序定制可以联系作者
💕💕各类成品java系统 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富,欢迎咨询交流。学习资料、程序开发、技术解答、代码讲解、源码部署,需要请看文末联系方式。
目 录
项目背景如下:
- 随着信息时代的发展,海量的数据给人们带来海量的信息。尤其是互联网的大量应用,人们在互联网的浏览行为愈发频繁,加上人们在网上的购买行为日益增多,电子商务这一行业也顺势高速发展。网络营销的商机越来越大,大量的电子商务网站也在悄然发展,电商行业的竞争也在加大。
- 客户作为电商企业的主要经营对象,分析客户的行为记录,探索客户的行为规律,并将这些规律和网站经营策略相结合,对网站的营销方案作出有利的修改,以及为电商企业增加利润和实施高效管理有着重要意义。
基于上述存在的数据问题,主要实现以下这些目标:
- 构建新的数据指标:
- 客户-品牌组合id
- 某客户是否购买某品牌(目标数据)
- 客户是否复购
- 一周内客户是否购买
- 客户心动天数(同客户同品牌点击后到购买的天数,将时间戳转化为天数)
- 客户购买频率(一周内同客户同品牌购买次数)
- 删除不需要的数据指标列;
- 采用过采样技术,通过减少多数类样本的数量来平衡数据集;
- 构建客户购买品牌预测模型并进行训练,对训练好的模型进行修改,提高模型可靠度;
- 通过计算模型评估指标值,判断模型的可使用性,并根据模型结果提出相应的营销建议。
目前的电商平台商品种类繁多,客户流量远大于线下的各种百货商场,每一客户对每一商品进行何种操作都会有记录。
通过查看数据结构可知:
- 数据集中的数据指标只有客户id、品牌id、行为类型和行为时间,数据指标较少且实际意义均为字符,很难支撑后续的模型构建和预测工作,需要构建新的有分析意义的数据指标;
- 数据集中的时间戳不方便观察和统计,需要将其转化为时间格式,再转化为天数,以便后续的统计分析;
通过分析客户操作行为类型分布情况可知:客户在一天内可能有多种操作行为,并且更倾向于在电商平台进行浏览点击,购买行为、收藏行为和添加购物车占据了所有记录的比较小的比例,因此项目数据集属于不均衡数据集。若以是否购买作为客户或品牌的分类标签,会导致数据的正负样本失衡,最终导致无法准确判断客户的购买行为,可能需要利用过采样技术来解决这一问题。
项目目标实现流程主要分为个8步骤,流程如下图所示:
库名 | 版本 |
numpy | 1.23.5 |
pandas | 1.5.3 |
matplotlib | 3.7.2 |
pyecharts | 2.0.3 |
seaborn | 0.12.2 |
sklearn | 1.2.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 6月4日 1 10944750 13451 2 6月4日 2 10944750 13451 2 6月4日 3 10944750 13451 0 6月4日 4 10944750 13451 0 6月4日 ... ... ... ... ... 182875 847750 26631 0 7月30日 182876 847750 26631 0 7月30日 182877 847750 2845 0 8月12日 182878 847750 5317 0 8月8日 182879 847750 22353 0 8月8日 |
# 查看数据情况 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%。这说明,在网购期间,绝大多数用户以浏览为主,即绝大多数人都喜欢在电商平台“闲逛”,虽然该行为只是浏览点击,但是也反映了该商品吸引了用户点击浏览。添加购物车的行为比点击更代表用户对商品感兴趣。因此项目数据集属于正负不均衡数据集。若以是否购买作为客户或品牌的分类标签,会导致数据的正负样本失衡,最终导致无法准确判断客户的购买行为,可能需要利用欠采样技术或过采样技术来解决这一问题。
数据预处理是指在进行数据分析之前,对原始数据进行清洗、转换和集成等一系列处理,以便于进行更高效、准确的数据分析。
该项目需要做的数据预处理内容包括:数据清洗(检测和纠正数据中的异常值、缺失值、重复值和错误值等)与数据准备(数据整理排序)。
# 查看数据情况 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 |
数据情况:
无异常值、缺失值。
重复值处理说明:在客户购买品牌行为的数据中,重复值代表了同一观测的多个测量结果,删除重复值可能会导致数据的丢失。因此对于数据重复值不做删除处理。
数据整理:需要先将为数字格式的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 |
进行探索性数据分析,目的是发现数据中的模式、趋势、异常值和关联关系,以帮助理解数据的特征和可用性。
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等语言项目。项目均包含完整前后端源码,可正常运行!
!!! 有需要的小伙伴可以点击下方链接咨询我哦!!!