目录
1.数据读取
2.数据清洗
3.可视化分析
做图吧
4.RFM模型
本次数据条数为: 51101
import pandas as pd
import numpy as np
1.数据读取
#读取文件
df_data = pd.read_csv("../data/dataset.csv",encoding="gbk")
df_data#因为列标签都是英文,这里我们直接给它翻译一下.(英文-->中文)
df_data.columns = ["行编号","订单ID","订单日期","发货日期","发货模式","客户ID","客户姓名","客户类别","客户所在城市","客户所在州","客户所在国家","邮编","商店所属区域","商店所属州","产品ID","产品类别","产品子类别","产品名称","售价","销售量","折扣","利润","发货成本","订单优先级"
]df_data.head()
2.数据清洗
清洗:异常值,空值,重复数据.
# df_data.info()#空值:
#找到空值,空值直接求和.
# df_data.isnull().sum()# 异常值:
# 订单日期在前 发货日期在后 发货日期-订单日期 < 0
#在网上买东西,还没买就发货了---异常啊...
df_data["发货日期"] = pd.to_datetime(df_data["发货日期"])
df_data["订单日期"] = pd.to_datetime(df_data["订单日期"])
df_data["订单与发货时间差"] = (df_data["发货日期"]-df_data["订单日期"]).dt.total_seconds()
#--精确到秒.# 拿到有异常值的行的索引,然后进行删除
new_df_data = df_data.drop(index=df_data[df_data["订单与发货时间差"]<0].index)
new_df_data# 去重:
new_df_data["行编号"].unique().size
# drop_duplicates 删除重复数据集,只保留一项
new_df_data.drop_duplicates("行编号",inplace=True)
new_df_data# new_df_data.info()
# new_df_data[new_df_data["发货模式"].isnull()]
# 填充,使用出现次数最多的模式填充
new_df_data["发货模式"].fillna(value=new_df_data["发货模式"].mode()[0],inplace=True)#删除一列:
new_df_data.drop(columns=["邮编"],inplace=True)
new_df_data.info()
3.可视化分析
new_df_data.head()new_df_data["销售额"] = new_df_data["售价"] * new_df_data["销售量"]new_df_data["订单年份"] = new_df_data["订单日期"].dt.year
new_df_data["订单月份"] = new_df_data["订单日期"].dt.month
new_df_data["订单季度"] = new_df_data["订单日期"].dt.to_period("Q")#new_df_data.head(1)# 每年的销售额
sales_year = new_df_data.groupby("订单年份")["销售额"].sum()
sales_year# 计算每一年的增长率
sales_year_12 = (sales_year[2012]/sales_year[2011]) - 1
sales_year_13 = (sales_year[2013]/sales_year[2012]) - 1
sales_year_14 = (sales_year[2014]/sales_year[2013]) - 1
print(f"12年增长{sales_year_12}\n13年增长{sales_year_13}\n14年增长{sales_year_14}")#创建二维对象:
sales_rate = pd.DataFrame({"年销售额":sales_year,"订单增张":[0,sales_year_12,sales_year_13,sales_year_14]
}).reset_index()
sales_rate
做图吧
from pyecharts.charts import Bar, Line
from pyecharts import options as opts# 将年份转化为str类型
sales_rate['订单年份'] = sales_rate["订单年份"].astype("str")
bar_img = (Bar().add_xaxis(sales_rate["订单年份"].tolist()).add_yaxis("销售额",sales_rate["年销售额"].tolist(),yaxis_index=0).set_global_opts(yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}$")),xaxis_opts=opts.AxisOpts(name="年份"),tooltip_opts=opts.TooltipOpts(is_show=True,trigger="axis")).extend_axis(yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}%"),type_="value",min_=-2,max_=0.3))
)line_img = (Line().add_xaxis(sales_rate["订单年份"].tolist()).add_yaxis("增长率",sales_rate["订单增张"].tolist(),yaxis_index=1,label_opts=opts.LabelOpts(is_show=False))
)
bar_img.overlap(line_img)
bar_img.render_notebook()
4.RFM模型
R 越小越好. 交易的间隔.
F 越大越好. 交易的次数.
M 越大越好. 交易的金额.
new_df_datadf_data_14 = new_df_data[new_df_data["订单年份"]==2014]
df_data_14df_data_14["订单数"] = 1df_data_14.head()# pivot_table 透视表(只显示我指定的标签)
# 默认显示指定的索引列和所有数值列
rfm_df = df_data_14.pivot_table(index="客户ID",# 指定的列values=["订单日期","订单数","销售额"],# 指定列操作aggfunc = {"订单日期":"max","订单数":"sum","销售额":"sum"})
rfm_df.reset_index()#最后一次购买与上一次购买间隔的天数,
rfm_df["R"] = (rfm_df["订单日期"].max() - rfm_df["订单日期"]).dt.days
rfm_dfrfm_df = rfm_df.rename(columns={"订单数":"F","销售额":"M"})
rfm_df.reset_index()
RFM模型应用
def rfm_func(x):#先把0或1弄出来:level = x.apply(lambda x:"1" if x > 0 else "0")#拼接为字符串:label= level["R"] + level["F"] + level["M"]#定义字典:data = {"011":"重要价值客户","111":"重要挽回客户","001":"重要深耕客户","101":"重要挽留客户","010":"潜力客户","110":"一般维持客户","000":"新用户","100":"流失客户"}#返回字典的值(根据键,返回值)return data[label]# 关系映射
# rfm_df["用户标签"] = rfm_df.apply(lambda x: x-x.mean()).apply(rfm_func,axis=1)
rfm_df = rfm_df[["R","F","M"]]
rfm_df# rfm_df["用户标签"] = rfm_df.apply(lambda x: x-x.mean()).apply(rfm_func,axis=1) #这条出错...
rfm_df.reset_index()