当前位置:   article > 正文

kaggle电商用户价值分析_kaggle电商数据集

kaggle电商数据集

目录

数据来源:

特征说明:

数据处理

结果展示

数据可视化

数据可视化代码:

rfm模型预测

rfm 模型介绍

特征提取:

生成的rfm客户类型图:

k-means聚类

数据来源:

该数据集为在线零售商在2010年12月1日至2011年12月9日间发生的所有网络交易订单信息。
该公司主要销售礼品为主,并且多数客户为批发商。
数据集介绍及来源:
https://www.kaggle.com/carrie1/ecommerce-data

特征说明:

InvoiceNo:订单编号,由六位数字组成,退货订单编号开头有字幕’C’
StockCode:产品编号,由五位数字组成
Description:产品描述
Quantity:产品数量,负数表示退货
InvoiceDate:订单日期与时间
UnitPrice :单价(英镑)
CustomerID:客户编号,由5位数字组成
Country:国家

数据处理

利用pandas库检查缺失值和异常值,删除InvoiceNo列异常值数据(运行后可知该列异常值是A开头+六位数字)并将UnitPrice列的异常值数据进行线性插值填补后存入data2.csv表中。

  1. import pandas as pd
  2. # 读取CSV文件
  3. dataframe = pd.read_csv('data.csv')
  4. # 检查缺失值
  5. missing_values = dataframe.isnull().sum()
  6. print("缺失值数量:\n", missing_values)
  7. # 检查InvoiceNo列异常值
  8. # 定义条件1:订单编号由六位数字组成
  9. condition1 = dataframe['InvoiceNo'].str.isnumeric() & (dataframe['InvoiceNo'].str.len() == 6)
  10. # 定义条件2:退货订单编号以字母'C'开头(即C+六位数字)
  11. condition2 = dataframe['InvoiceNo'].str.match(r'^C\d{6}$')
  12. # 通过逻辑与操作符 (&) 组合两个条件
  13. valid_invoice_conditions = condition1 | condition2
  14. # 通过布尔索引选择满足条件的行,得到清洗后的DataFrame
  15. cleaned_dataframe = dataframe[valid_invoice_conditions]
  16. # 计算'InvoiceNo'列异常值数量
  17. invoice_no_outliers_count = len(dataframe[~valid_invoice_conditions])
  18. print("InvoiceNo列异常值数量:", invoice_no_outliers_count)
  19. # 打印InvoiceNo列异常值
  20. invoice_no_outliers = dataframe[~valid_invoice_conditions]['InvoiceNo']
  21. print("InvoiceNo列异常值:\n", invoice_no_outliers)
  22. # 利用标准差方法检测UnitPrice列的异常值
  23. unit_price_mean = cleaned_dataframe['UnitPrice'].mean()
  24. unit_price_std = cleaned_dataframe['UnitPrice'].std()
  25. upper_bound = unit_price_mean + 3 * unit_price_std
  26. lower_bound = unit_price_mean - 3 * unit_price_std
  27. # 获取UnitPrice列的异常值
  28. unit_price_outliers = (cleaned_dataframe['UnitPrice'] > upper_bound) | (cleaned_dataframe['UnitPrice'] < lower_bound)
  29. # 使用线性插值填充异常值
  30. cleaned_dataframe.loc[:, 'UnitPrice'] = cleaned_dataframe['UnitPrice'].interpolate(method='linear')
  31. # 计算'UnitPrice'列异常值数量
  32. unit_price_outliers_count = len(cleaned_dataframe[unit_price_outliers])
  33. print("UnitPrice列异常值数量:", unit_price_outliers_count)
  34. # 打印UnitPrice列异常值
  35. unit_price_outliers = cleaned_dataframe[unit_price_outliers]['UnitPrice']
  36. print("UnitPrice列异常值:\n", unit_price_outliers)
  37. # 保存清洗后的数据到新表data2.csv
  38. cleaned_dataframe.to_csv('data2.csv', index=False)

结果展示

  1. 缺失值数量:
  2. InvoiceNo 0
  3. StockCode 0
  4. Description 1454
  5. Quantity 0
  6. InvoiceDate 0
  7. UnitPrice 0
  8. CustomerID 135080
  9. Country 0
  10. dtype: int64
  11. InvoiceNo列异常值数量: 3
  12. InvoiceNo列异常值:
  13. 299982 A563185
  14. 299983 A563186
  15. 299984 A563187
  16. Name: InvoiceNo, dtype: object
  17. UnitPrice列异常值数量: 377
  18. UnitPrice列异常值:
  19. 1814 569.77
  20. 3041 607.49
  21. 4989 295.00
  22. 5685 498.47
  23. 6165 887.52
  24. ...
  25. 536834 1008.96
  26. 537254 1683.75
  27. 539368 938.59
  28. 540908 933.17
  29. 541540 1714.17

数据可视化

客户世界分布热力图的数据是利用data2.csv数据做数据透视表后得到的国家以及该国客户数量,其余画图的数据都是通过data2.csv的列数据直接进行的。

以上饼图可以直观看到进货数量为5660978,退货数量为484531,,退货数量占总数的7.9%。

该热力图向我们展示了客户在全球的分布以及客户数量,可以直观看到英国客户数量非常多。

上图展示了网络交易订单的价格分布,0-5英镑的商品数量最多,价格越高商品数越少。

上图展示了2010年12月到2011年12月每个月的销售量,2011年2月销售量最低,2011年11月销售量最高。

数据可视化代码:

  1. import pandas as pd
  2. import matplotlib.pyplot as plt
  3. #import plotly.express as px
  4. # 读取数据
  5. df = pd.read_csv('data2.csv')
  6. # 进货与退货数量的饼图
  7. quantity = df['Quantity']
  8. pos_quantity = quantity[quantity > 0].sum()
  9. neg_quantity = -quantity[quantity < 0].sum()
  10. #绘制饼图
  11. labels = ['进货', '退货']
  12. values = [pos_quantity, neg_quantity]
  13. fig1, ax1 = plt.subplots()
  14. patches, texts, autotexts = ax1.pie(values, labels=labels, autopct='%1.1f%%')
  15. ax1.axis('equal')
  16. plt.title('进货与退货之比')
  17. plt.rcParams['font.sans-serif'] = 'SimHei'
  18. # 添加数据标签
  19. for i, text in enumerate(autotexts):
  20. value = values[i]
  21. percentage = '{:.1f}%'.format(value / sum(values) * 100)
  22. text.set_text('{}\n{}'.format(percentage, value))
  23. # 添加图例
  24. ax1.legend(labels, loc='best')
  25. plt.show()
  26. #价格条形图
  27. # 创建数据
  28. data = df['UnitPrice']
  29. df2 = pd.DataFrame(data)
  30. # 将价格分组
  31. bins = [0,1,2,3, 5,10, 50, 100,500,1000, float('inf')]
  32. group_names = ['0-1','1-2','2-3','3-5', '5-10','10-50', '50-100','100-500','500-1000', '>1000']
  33. df2['UnitPriceGroup'] = pd.cut(df2['UnitPrice'], bins, labels=group_names)
  34. # 统计每个分组的数量
  35. unitprice_count = df2['UnitPriceGroup'].value_counts().sort_index()
  36. # 设置中文显示字体
  37. plt.rcParams['font.sans-serif'] = 'SimHei'
  38. plt.rcParams['axes.unicode_minus'] = False
  39. # 绘制条形图
  40. fig, ax = plt.subplots()
  41. bars = ax.bar(unitprice_count.index, unitprice_count.values)
  42. plt.title('UnitPrice列价格分布')
  43. # 添加数据标签
  44. for bar in bars:
  45. height = bar.get_height()
  46. ax.text(bar.get_x() + bar.get_width() / 2, height, height, ha='center', va='bottom')
  47. plt.show()
  48. # 月销售量折线图
  49. df['InvoiceDate'] = pd.to_datetime(df['InvoiceDate'])
  50. df['YearMonth'] = df['InvoiceDate'].dt.strftime('%Y-%m')
  51. sales_count = df.groupby('YearMonth')['Quantity'].sum().reset_index()
  52. fig4, ax4 = plt.subplots()
  53. ax4.plot(sales_count['YearMonth'], sales_count['Quantity'])
  54. plt.xticks(rotation=45)
  55. plt.title('2010年12月到2011年12月每个月销售量的折线图')
  56. plt.show()
  57. plt.rcParams['font.sans-serif']='SimHei'

rfm模型预测

rfm 模型介绍

RFM主要是针对顾客有一定频次的消费,比较适合传统企业里的运营商、银行、航空,或者互联网里的电商、出行,这种必须捆绑客户ID,有一定频次的小额消费的场景,RFM模型主要指:R (Recency-近度)、F (Frequency-频度)和M(Monetary-额度),即根据客户的活跃程度和交易金额贡献所做的分类。

R值:最近一次消费(Recency):客户在店铺消费最近一次和上一次的时间间隔,理论上R值越小的客户是价值越高的客户,即对产品及品牌印象度越高。

F值:消费频率(Frequency):客户在固定时间内的购买次数(一般是1年),购买频率越高,对品牌忠诚度越高。但实际店铺由于受品类宽度的原因(如电子产品等),即使是忠实粉丝用户也很难在1年内购买多次。所以,一般会把F值的时间范围去掉,替换成累计购买次数。

M值:消费金额(Monetary):M值相对于R值和F值最难使用,但最具有价值,金额越高,给店铺创造的收入和利润越高。理论上M值和F值是一样的,都带有时间范围,指的是一段时间(通常是1年)内的消费金额。

rfm模型最后根据这三个指标对客户打分后,会分为八个类型的客户:

特征提取:

为了获得rfm模型的特征,我们对data2.csv表:删除退货订单(退货订单一般都有对应进货订单,去除重复项),给顾客ID为空的行增加NULL,订单时间类型转换。然后再根据数据特点分别计算出R,F,M的值,将其和顾客ID共同放入新表rfm.csv中。最后给rfm.csv表数据的每个指标进行打分,然后将客户分类。

  1. import pandas as pd
  2. # 读取数据集
  3. df = pd.read_csv('data2.csv')
  4. # 把顾客ID类型转为字符串
  5. df['CustomerID'] = df['CustomerID'].astype(str)
  6. # 删除取消订单
  7. df = df[~df['InvoiceNo'].str.contains('C')]
  8. .................................................
  9. #篇幅过长,只展示部分代码
  10. # 定义转换函数
  11. def trans_value(x):
  12. if x == '高高高':
  13. return '高价值客户'
  14. elif x == '高低高':
  15. return '重点深耕客户'
  16. elif x == '低高高':
  17. return '重点唤回客户'
  18. elif x == '低低高':
  19. return '重点挽留客户'
  20. elif x == '高高低':
  21. return '潜力客户'
  22. elif x == '高低低':
  23. return '新客户'
  24. elif x == '低高低':
  25. return '一般保持客户'
  26. else:
  27. return '流失客户'
  28. # 得到最后的客户分级
  29. df1['value'] = df1['R_rank'] + df1['F_rank'].astype(str) + df1['M_rank'].astype(str)
  30. df1['customer_level'] = df1['value'].apply(trans_value)
  31. # 将客户分级信息添加到 df1 中
  32. df1['customer_level'] = df1['value'].apply(trans_value)
  33. # 保存至CSV文件
  34. df1.to_csv('rfm_分类.csv', index=False)
  35. from pyecharts import options as opts
  36. from pyecharts.charts import Pie
  37. # 读取分类表
  38. df_rfm = pd.read_csv('rfm_分类.csv')
  39. # 统计每个客户类型的数量
  40. C_type = df_rfm['customer_level'].value_counts()
  41. c_num = C_type.tolist()
  42. c_type = C_type.index.tolist()
  43. # 绘制饼图
  44. pie = (
  45. Pie()
  46. .add("", [list(z) for z in zip(c_type, c_num)],
  47. rosetype="radius",
  48. radius=["30%", "55%"],
  49. label_opts=opts.LabelOpts(formatter='占比{d}%'),
  50. center=["50%","40%"])
  51. .set_global_opts(
  52. title_opts=opts.TitleOpts(title="客户类型", pos_left="80%", pos_top="5%"),
  53. legend_opts=opts.LegendOpts(type_="scroll", pos_left="80%", orient="vertical", pos_top="15%"),
  54. )
  55. )

生成的rfm客户类型图:


k-means聚类

k值确定:使用轮廓系数法等方法确定k值的选择。

综合手肘法和轮廓系数的值选出k最佳为3。

使用聚类算法对数据进行客户价值分析,并给出对应的雷达图:

根据上面画出的雷达图,可以知道Cluster2是消费近度和消费额都高的一类客户,这类客户一般是高价值客户、重点深耕客户、重点挽留客户;Clsuter1是消费额低,消费频率低,消费近度高的一类客户,一般属于流失客户;Cluster3是消费额一般,消费频率一般,消费近度也不算高的一类客户,一般属于潜力客户、一般保持客户、重点唤回客户。

通过对比RFM模型刻画出的客户分类,K-mens聚类出的客户类型分类少,效果一般。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/742530
推荐阅读
相关标签
  

闽ICP备14008679号