总体思路
基于聚类的精准推荐总体
- 先基于聚类:
- 把用户分群,对每一个客户都标记上标签值。
- 生成推荐规则:
- 在用户没买过的商品中,同类客户总购买次数(平均购买次数)最多的商品,就是这类客户最喜欢的商品
数据清洗
- 优先删除:
- 缺失率90%以上
- 整个字段只有1个值
- 整个字段有效信息几乎没有
- 需要转码:
- 哑变量编码
数据整合
- 目的是生成一张用户所有购买行为的信息表
- 三表进行连接合并
# 导入数据包
import numpy as np
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from sklearn.cluster import KMeans
plt.style.use('seaborn')
plt.rcParams['font.sans-serif']=['Simhei'] #显示中文,解决图中无法显示中文的问题
plt.rcParams['axes.unicode_minus']=False #设置显示中文后,负号显示受影响。解决坐标轴上乱码问题
数据清洗
订单表清洗
数据初步探索
order = pd.read_csv(r"...\order.csv",index_col=0)
order.head(1)
订单编号 | 买家会员名 | 买家应付货款 | 买家应付邮费 | 买家支付积分 | 总金额 | 返点积分 | 买家实际支付金额 | 买家实际支付积分 | 订单状态 | ... | 是否代付 | 定金排名 | 修改后的sku | 修改后的收货地址 | 异常信息 | 天猫卡券抵扣 | 集分宝抵扣 | 是否是O2O交易 | 退款金额 | 预约门店 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 21407300627014900 | 1425 | 58.51 | 0.0 | 0 | 58.51 | 0 | 58.51 | 0 | 交易成功 | ... | 否 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 0.0 | NaN |
1 rows × 45 columns
order.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3989 entries, 0 to 3988
Data columns (total 45 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 订单编号 3989 non-null int64
1 买家会员名 3989 non-null int64
2 买家应付货款 3989 non-null float64
3 买家应付邮费 3989 non-null float64
4 买家支付积分 3989 non-null int64
5 总金额 3989 non-null float64
6 返点积分 3989 non-null int64
7 买家实际支付金额 3989 non-null float64
8 买家实际支付积分 3989 non-null int64
9 订单状态 3989 non-null object
10 买家留言 384 non-null object
11 收货人姓名 3989 non-null int64
12 收货地址 3989 non-null object
13 运送方式 3989 non-null object
14 联系电话 142 non-null object
15 联系手机 3986 non-null object
16 订单创建时间 3989 non-null object
17 订单付款时间 3989 non-null object
18 宝贝标题 3989 non-null object
19 宝贝种类 3989 non-null int64
20 物流单号 3988 non-null object
21 物流公司 3988 non-null object
22 订单备注 460 non-null object
23 宝贝总数量 3989 non-null int64
24 店铺Id 3989 non-null int64
25 店铺名称 3989 non-null int64
26 订单关闭原因 3989 non-null object
27 卖家服务费 3989 non-null int64
28 买家服务费 3989 non-null object
29 发票抬头 0 non-null float64
30 是否手机订单 3728 non-null object
31 分阶段订单信息 0 non-null float64
32 特权订金订单id 0 non-null float64
33 是否上传合同照片 3989 non-null object
34 是否上传小票 3989 non-null object
35 是否代付 3989 non-null object
36 定金排名 0 non-null float64
37 修改后的sku 0 non-null float64
38 修改后的收货地址 61 non-null object
39 异常信息 0 non-null float64
40 天猫卡券抵扣 0 non-null float64
41 集分宝抵扣 12 non-null float64
42 是否是O2O交易 0 non-null float64
43 退款金额 3989 non-null float64
44 预约门店 0 non-null float64
dtypes: float64(15), int64(11), object(19)
memory usage: 1.6+ MB
删除无用信息
# 删除空值项大于20%字段:
order=order.dropna(axis=1,thresh=order.shape[0]*0.2)
#删除整个字段只有一个信息的值:
for i in order.columns:
if order[i].nunique()==1:
del order[i]
# 手动选择与用户购买信息有关字段
order=order[["订单编号","买家会员名","买家实际支付金额","收货地址","宝贝标题 ","宝贝种类","宝贝总数量","退款金额"]]
数据编码
#退款金额0-1独热编码
order.退款金额=np.where(order.退款金额>0,1,0)
#收货地址独热编码
address=order.收货地址.str[:3].str.strip()
address=pd.get_dummies(address,prefix="地址")
#宝贝种类独热编码
kinds=pd.get_dummies(order.宝贝种类,prefix="宝贝种类")
#删除原表中已经编码完成的字段,将编码完成后字段加入订单表
order=order.drop(["收货地址","宝贝种类"],axis=1)
order=pd.concat([order,address,kinds],axis=1)
order.head(1)
订单编号 | 买家会员名 | 买家实际支付金额 | 宝贝标题 | 宝贝总数量 | 退款金额 | 地址_上海 | 地址_云南省 | 地址_内蒙古 | 地址_北京 | ... | 宝贝种类_39 | 宝贝种类_40 | 宝贝种类_41 | 宝贝种类_43 | 宝贝种类_45< |
---|