电商平台零售交易数据分析案例part2
数据分析
取出退货的订单 使用透视图进行观察
df1 = df.loc[df['Quantity'] <= 0]
#使用透视图分析
tt = pd.pivot_table(df1,index=['year'],columns=['month'],values=['amount'],aggfunc={'amount':np.sum},margins=False)
取出除退货订单以外的已完成订单并观察
df2 = df[(df['Quantity'] > 0) & (df['Price'] > 0)]
#使用透视图分析
pp = pd.pivot_table(df2,index=['year'],columns=['month'],values=['amount'],aggfunc={'amount':np.sum},margins=False)
退货率=退货金额/合计金额
以2010年为例来画出退货率的折线图
#取出多列
df2010 = df[['year','month','Quantity','Price','amount']]
#取出2010年的记录
df2010 = df2010.loc[df2010['year'] == '2010']
#2010年每个月的
#合计金额
df2010_1 = df2010[(df2010['Quantity'] > 0) & (df2010['Price'] > 0)]
df2010_1 = df2010_1.groupby('month').sum()
#退货金额
df2010_0 = df2010[(df2010['Quantity'] < 0)]
df2010_0 = df2010_0.groupby('month').sum()
#2010年退货率
#退货率=退货金额/合计金额
th2010 = np.abs(df2010_0['amount']/df2010_1['amount'])
出来的结果是这样的:
顺序是错的
搜了一下怎么解决,看到一个思路是修改行名变成01 02 03
但是用th2010.index[]和th2011.rename({})都失败了,想搜一下怎么把行换顺序也没搜到合适的
可能新建一个来放它/改一下month的数据类型/split的时候顺便加上'0'才能解决吧
后来试了一下在前面取列时强行加上一句把month转成int 后来的数据排序果然正常了
画图时再加一句plt.xticks(range(0,12),th2010.index)把横坐标填充满
从数据中发现问题
1、可以求出一年的退货平均值,对超过平均值的月份重点分析
np.abs(tt/pp).loc['2011'].mean()
2、可以对各年的退货平均值进行对比
RFM分层模型
R:Rencency 最近一次消费
影响因素:店铺记忆强度、接触机会多少、回购周期
应用场景:决定接触策略、决定接触频次、决定刺激力度
F:Frequency 消费频率
影响因素:品牌忠诚度、店铺熟悉度、客户会员等级、购买习惯养成
应用场景:决定资源投入、决定营销优先级、决定活动方案
M:Money 消费金额
影响因素:消费能力、产品认可度
应用场景:决定推荐商品、决定折扣门槛、决定活动方案
#最近一次交易时间 作为参考时间
df2['date'].max()
#最近购买日期间隔
R_value = df2.groupby('Customer ID')['date'].max() #每位客户的最近一次交易日期
R_value = (df2['date'].max() - R_value).dt.days #获得日期天数差距
R_value
#消费频次
F_value = df2.groupby('Customer ID')['Invoice'].nunique()#去重
F_value
#消费总金额
M_value = df2.groupby('Customer ID')['amount'].sum()
M_value
用R_value.describe()来观察异常值
最久远的交易间隔已经两年了……
中位数和平均值相比不算差距很大
画个直方图看看分布情况
import seaborn as sns
sns.set(style = 'darkgrid')
plt.hist(R_value,bins=30)
plt.show()
M_value.describe()
均值和中位数差距过大 方差也很大 异常值严重
plt.hist(M_value[M_value<3000],bins=30)#查看小于平均数的数据
plt.show()
因为看全范围的图的话分布很稀疏 所以就只看看小于平均值的
F_value.describe()
最大值过大 异常值严重
plt.hist(F_value[F_value<20],bins=30)
plt.show()
客户分级
R_bins = [0,30,90,180,360,720]#自定义间隔
F_bins = [1,2,5,10,30,100]#消费频次 可以用quantile查看分位数
M_bins = [0,500,2000,5000,10000,20000]
#值越小越好 代表消费天数近
R_score = pd.cut(R_value,R_bins,labels=[5,4,3,2,1],right=False)
R_score
#值越大越好 频次
F_score = pd.cut(F_value,F_bins,labels=[1,2,3,4,5],right=False)
F_score
#值越大越好
M_score = pd.cut(M_value,M_bins,labels=[1,2,3,4,5],right=False)
M_score
#按列合并RFM
rfm = pd.concat([R_score,F_score,M_score],axis=1)
rfm = rfm.rename(columns={'date':'R_score','Invoice':'F_score','amount':'M_score'})
#为了计算进行数据类型转换
#rfm.astype(float) 失败了
for i in ['R_score','F_score','M_score']:
rfm[i] = rfm[i].astype(float)
查看describe() 按照平均值对客户进行价值分层
rfm['R'] = np.where(rfm['R_score'] > 2.86,'高','低')
rfm['F'] = np.where(rfm['F_score'] > 2.1,'高','低')
rfm['M'] = np.where(rfm['M_score'] > 1.9,'高','低')
rfm['value'] = rfm['R'].str[:] + rfm['F'].str[:] + rfm['M'].str[:]
#空格处理
rfm['value'] = rfm['value'].str.strip()
这个转换是自定义的
高高高:近期消费过+消费频率高+消费金额高=重要价值
低高高:近期未消费+消费频率高+消费金额高=重要挽留
高低高:近期消费过+消费频率低+消费金额高=重要保持
高高低:近期消费过+消费频率高+消费金额低=一般保持
低低高:近期未消费+消费频率低+消费金额高=重要发展
低高低:近期未消费+消费频率高+消费金额低=一般挽留
高低低:近期消费过+消费频率低+消费金额低=一般发展
低低低:近期未消费+消费频率低+消费金额低=一般价值
def trans_value(x):
if x == '高高高':
return '重要价值'
elif x == '低高高':
return '重要挽留'
elif x == '高低高':
return '重要保持'
elif x == '高高低':
return '一般保持'
elif x == '低低高':
return '重要发展'
elif x == '低高低':
return '一般挽留'
elif x == '高低低':
return '一般发展'
elif x == '低低低':
return '一般价值'
rfm['用户等级'] = rfm['value'].apply(trans_value)
value_counts()查看统计情况
可视化
柱状图
#可视化
trace_basic = [go.Bar(x = rfm['用户等级'].value_counts().index,y = rfm['用户等级'].value_counts().values,marker = dict(color='blue',opacity=0.5))]
layout = go.Layout(title = '用户等级情况',xaxis=dict(title='用户重要度'))
figure_basic = go.Figure(data = trace_basic,layout = layout)
pyplot(figure_basic)
饼图
trace = [go.Pie(labels = rfm['用户等级'].value_counts().index,values = rfm['用户等级'].value_counts().values,textfont = dict(size=12,color='blue'))]
layout = go.Layout(title = '用户等级比例')
figure_basic = go.Figure(data = trace,layout = layout)
pyplot(figure_basic)
结论和建议
1、针对退货率:2011年1月和12月退货率很高 异常
需要了解是内部原因还是外部原因导致的
从产品渠道价格促销四个方面找到原因进行改进
2、用户分层得到7类用户
根据数据可知 该公司用户最多的是一般价值&重要价值客户 >50%
对不同的客户提出不同措施:增加推送促销信息/了解消费需求精确推销/增大促销力度等
上一篇: 实用的php脚本编写
下一篇: linux安装mysql.