使用python中的pandas和matplotlib简单实现描述性分析,因为数据为随机生产数据,因此该案例更多的是体现分析思路以及过程实现


导入相关库

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime

中文设置

# 中文设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于解决保存图像是负号‘-’显示为方框的问题

数据源

初始指标:订单时间、水果名称、客户姓名、水果重量、发货地区、订单金额

# 时间
star_time = datetime.date(datetime.datetime.now().year - 2, datetime.datetime.now().month, datetime.datetime.now().day)
end_time = datetime.datetime.now().date() - datetime.timedelta(days=1)
time_range = pd.date_range(star_time, end_time)
time_list = np.random.choice(time_range, size=len(time_range), replace=True)
# 水果
fruits = ['香蕉', '苹果', '葡萄', '橙子', '西瓜', '哈密瓜', '梨', '草莓']
fruits_list = np.random.choice(fruits, size=len(time_range), replace=True)
# 客户
client = ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九']
client_list = np.random.choice(client, size=len(time_range), replace=True)'''
time 下单时间
fruits 水果名称
client 客户姓名
weight 水果重量
'''
# 生成订单数据
order = pd.DataFrame({'time'  : time_list,'fruits': fruits_list,'client': client_list,'weight': np.random.choice(list(range(50, 100)), size=len(time_range), replace=True)
})
# 生成水果信息数据
'''
price:重量
regoin:发货地区
'''
information = pd.DataFrame({'fruits': fruits,'price' : [3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],'regoin': ['华南', '华北', '西北', '华中', '西北', '华南', '华北', '华中']
})
# 数据合并
df = pd.merge(order, information, how='outer').sort_values('time').reset_index(drop=True)# 生成字段,订单金额
df['amount'] = df['weight'] * df['price']

人货场

分析维度:时间

连续两年销售额走势

df2 = df.pivot_table(index='year_month',values='amount',aggfunc=sum)
plt.figure(figsize=(20, 10), dpi=80)
plt.plot(df2.index, df2['amount'], 'r-.')
plt.title('2021-2022每月销量走势',fontsize='xx-large',fontweight='light',horizontalalignment='center',verticalalignment='top')
for a,b in zip(df2.index,df2['amount']):plt.text(a,b+0.05,b,ha='center')
print(df2.head(5))
plt.show()

年度销量、销售额和平均销售额

df3 = df.pivot_table(index='year',values=['weight', 'amount'],aggfunc={'weight': sum, 'amount': ['mean', sum]}).round(0)
fig, axis = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)
axis[0].bar(df3.index, df3[('weight', 'sum')].values)
axis[1].bar(df3.index, df3[('amount', 'sum')].values)
axis[2].bar(df3.index, df3[('amount', 'mean')].values)
axis[0].set_title('年度销量对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
axis[1].set_title('年度销售额对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
axis[2].set_title('年度平均销售额对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
for a,b in zip(df3.index,df3[('weight', 'sum')]):axis[0].text(a,b,b,ha='center',fontsize='xx-large')
for a,b in zip(df3.index,df3[('amount', 'sum')]):axis[1].text(a,b,b,ha='center',fontsize='xx-large')
for a,b in zip(df3.index,df3[('amount', 'mean')]):axis[2].text(a,b,b,ha='center',fontsize='xx-large')
print(df3)
plt.show()

分析维度:商品

水果年度销售占比

df4 = df.pivot_table(index='year',values='weight',columns='fruits',aggfunc=sum)
df4 = df4.apply(lambda x: x / x.sum(axis=0), axis=1)
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)
ax[0].pie(list(df4.iloc[0].values),autopct='%1.1f%%',startangle=90,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
ax[1].pie(list(df4.iloc[1].values),autopct='%1.1f%%',startangle=90,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
ax[2].pie(list(df4.iloc[2].values),autopct='%1.1f%%',startangle=90,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
labels = fruits
for i in range(3):ax[i].set_title('{}年'.format((df4.index.values)[i]),bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))# 设置图例ax[i].legend(loc=0, ncol=1, labels=labels, frameon=False)# 设置等比例轴ax[i].axis('equal')
print(df4)
plt.show()

各水果年度销售金额对比

df5 = df.pivot_table(index=['year'],values='amount',columns='fruits',aggfunc=sum).round(0)
fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)ax[0].bar(df5.columns, df5.iloc[0].values, color='r', alpha=0.4)
ax[1].bar(df5.columns, df5.iloc[1].values, color='g', alpha=0.4)
ax[2].bar(df5.columns, df5.iloc[2].values, color='b', alpha=0.4)
ax[0].set_title('2020年各水果销售金额对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
ax[1].set_title('2021年各水果销售金额对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
ax[2].set_title('2022年各水果销售金额对比',fontsize='xx-large',horizontalalignment='center',verticalalignment='top')
for a, b in zip(df5.columns, df5.iloc[0].values):ax[0].text(a, b, b, ha='center', fontsize='xx-large')
for a, b in zip(df5.columns, df5.iloc[1].values):ax[1].text(a, b, b, ha='center', fontsize='xx-large')
for a, b in zip(df5.columns, df5.iloc[2].values):ax[2].text(a, b, b, ha='center', fontsize='xx-large')
print(df5)
plt.show()

商品月度销量变化

df6 = df.pivot_table(index=['month'],values='weight',columns='fruits',aggfunc=sum)
fig = plt.figure(figsize=(20,10),dpi=80,facecolor='white',edgecolor=None)
color_list = ['c', 'm', 'y', 'k', 'r', 'g', 'b', 'black']
for i in range(len(fruits)):plt.bar(df6.index,df6[fruits[i]].values,color=color_list[i],alpha=0.4)
plt.legend('商品月度销量变化堆积图')
print(df6)
plt.show()

分析维度:地区

df7 = df.pivot_table(index='regoin', values='weight', aggfunc=sum)
fig, axis = plt.subplots(nrows=1, ncols=2, figsize=(20, 10), dpi=80)
axis[0].bar(df7.index, df7['weight'], color=['b', 'm', 'g', 'y'])
for a, b in zip(df7.index, df7['weight']):axis[0].text(a, b, b, fontsize='xx-large')
size = [round(i / df7['weight'].sum(), 2) for i in df7['weight'].values]
label = list(df7.index.values)
axis[1].pie(size,startangle=90,labels=label,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})axis[1].set_title('饼图(pie)',bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))
# 设置图例
axis[1].legend(loc=0, ncol=1, labels=label, frameon=False)
# 设置等比例轴
axis[1].axis('equal')
plt.show()
print(df7)

分析维度:客户

df9 = df.pivot_table(index='client',values='amount',aggfunc=['count', sum]).sort_values(by=('count', 'amount')).reset_index(drop=False)
color_list = ['c', 'm', 'y', 'k', 'r', 'g', 'b']
fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 10), dpi=80, facecolor='w', edgecolor=None,alpha=0.4)
ax[0].bar(df9.index, df9.loc[:, ('count', 'amount')],color=color_list)
client_bar_list = [''] + list(df9['client'].values)
ax[0].xticks = list([0] + df9.index)
ax[0].set_xticklabels(client_bar_list)
for a, b in zip(df9.index, df9.loc[:, ('count', 'amount')]):ax[0].text(a, b, b, fontsize='xx-large')
size = [round(i / df9.loc[:, ('sum', 'amount')].sum(), 2) for i in df9.loc[:, ('sum', 'amount')].values]ax[1].pie(size,labels=size,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
ax[1].set_title('饼图(pie)',bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))
ax[1].legend(loc=0, ncol=1, labels=list(df9['client'].values), frameon=False)
ax[1].axis('equal')
print(df9)
plt.show()

RFM用户分层

RFM数据模型

df['R'] = df['time'].apply(lambda x: (datetime.datetime.now() - x).days)
R = df.sort_values(by=['client', 'R'], ascending=[False, True])
R = R.drop_duplicates(['client'], keep='first')
RFM = df.groupby('client').agg({'fruits': 'count', 'amount': sum}).reset_index().rename(columns={'fruits': 'F', 'amount': 'M'})
RFM['R'] = R['R'].values
print(RFM)

RFM打分表

RFM['R'] = RFM.R.apply(lambda x: ('5分' if x < 3else ('4分' if x >= 3 and x < 7else ('3分' if x >= 7 and x < 14else ('2分' if x >= 14 and x < 21else '1分')))))
RFM['M'] = RFM.M.apply(lambda x : ('5分' if x > RFM.M.quantile(0.8)else ('4分' if x > RFM.M.quantile(0.6)else ('3分' if x > RFM.M.quantile(0.4)else ('2分' if x > RFM.M.quantile(0.2)else '1分')))))
RFM['F'] = RFM.F.apply(lambda x : ('5分' if x > RFM.F.quantile(0.8)else ('4分' if x > RFM.F.quantile(0.6)else ('3分' if x > RFM.F.quantile(0.4)else ('2分' if x > RFM.F.quantile(0.2)else '1分')))))
RFM = RFM.replace(['5分','4分','3分','2分','1分'],[5,4,3,2,1])
RFM['total'] = RFM.iloc[:,1:].sum(axis=1)
RFM = RFM.sort_values(by='total',ascending=False)
RFM.set_index(['client'],inplace=True)
print(RFM)

打分表计算

RFM['t_avg'] = (RFM.iloc[:, :3].sum(1) / 3).astype(np.int64)# RFM用户分层
RFM = RFM.apply(lambda x: ''.join([str(i) for i in ((x[['R', 'F', 'M']] > x['t_avg']) * 1).values.tolist()]),axis=1).reset_index(drop=False)
RFM.columns = ['client', 'score']
d = {'score': pd.Series(['111', '110', '101', '100', '011', '010', '001', '000']),'scale': pd.Series(['重要价值客户', '一般价值客户', '重要发展客户', '一般发展客户', '重要保持客户', '一般保持客户', '重要挽留客户', '一般挽留客户'])}
client_scale = pd.DataFrame(d)
RFM = pd.merge(RFM, client_scale, on=['score'])
print(RFM)

各用户层级销售金额及其占比

df = pd.merge(df, RFM, on=['client'])
df11 = df.groupby('scale')['amount'].sum().reset_index(drop=False)
df11['ratio'] = (df11['amount'] / df['amount'].sum().round(2) * 100).round(2).map('{}%'.format)
df11.sort_values(by=['ratio'], ascending=False)
print(RFM)

用户复购分析

各用户各类水果的复购金额和复购次数

df12 = df.groupby(['client', 'fruits']).first().reset_index(drop=False)
df13 = pd.concat([df, df12]).drop_duplicates(['time', 'amount'], keep=False).reset_index(drop=True)
df13 = df13.groupby(['client', 'fruits'])['amount'].agg(['count', sum])
print(df13)

各用户最爱复购水果信息

df14 = df13.reset_index(drop=False).set_index(['client'])
df14['ratio'] = (df14['sum'] / df14.groupby('client')['sum'].sum() * 100).round(2).map('{}%'.format)
df14 = df14.reset_index().sort_values(by=['client', 'count'], ascending=[False, False])
df14 = df14.drop_duplicates(['client'],keep='first').reset_index(drop=True)
print(df14)

复购周期

df15 = df[['client', 'time']].sort_values(['client', 'time'], ascending=[False, True])
df16 = df15.groupby('client').shift(1).rename(columns={'time': 'time1'})
df16 = pd.concat([df15, df16], axis=1)
df16.dropna(inplace=True)
df16['timediff'] = (df16['time'] - df16['time1']).apply(lambda x: x.days)
df17 = df16.pivot_table(index='client',values='timediff',aggfunc=['min', 'max', 'mean', 'median', 'count'])
print(df17)

源代码

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import datetime# 数据源
# 时间
star_time = datetime.date(datetime.datetime.now().year - 2, datetime.datetime.now().month, datetime.datetime.now().day)
end_time = datetime.datetime.now().date() - datetime.timedelta(days=1)
time_range = pd.date_range(star_time, end_time)
time_list = np.random.choice(time_range, size=len(time_range), replace=True)
# 水果
fruits = ['香蕉', '苹果', '葡萄', '橙子', '西瓜', '哈密瓜', '梨', '草莓']
fruits_list = np.random.choice(fruits, size=len(time_range), replace=True)
# 客户
client = ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九']
client_list = np.random.choice(client, size=len(time_range), replace=True)'''
time 下单时间
fruits 水果名称
client 客户姓名
weight 水果重量
'''
# 生成订单数据
order = pd.DataFrame({'time'  : time_list,'fruits': fruits_list,'client': client_list,'weight': np.random.choice(list(range(50, 100)), size=len(time_range), replace=True)
})
# 生成水果信息数据
'''
price:重量
regoin:发货地区
'''
information = pd.DataFrame({'fruits': fruits,'price' : [3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],'regoin': ['华南', '华北', '西北', '华中', '西北', '华南', '华北', '华中']
})
# 数据合并
df = pd.merge(order, information, how='outer').sort_values('time').reset_index(drop=True)# 生成字段,订单金额
df['amount'] = df['weight'] * df['price']# 中文设置
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于显示中文
plt.rcParams['axes.unicode_minus'] = False  # 用于解决保存图像是负号‘-’显示为方框的问题# 人货场模型# 分析维度1:时间
df['year'] = df['time'].dt.year
df['month'] = df['time'].dt.month
df['year_month'] = df['time'].dt.strftime('%Y%m')# 2021-2022销售额走势
df2 = df.pivot_table(index='year_month',values='amount',aggfunc=sum)
# plt.figure(figsize=(20, 10), dpi=80)
# plt.plot(df2.index, df2['amount'], 'r-.')
# plt.title('连续两年销量走势',
#           fontsize='xx-large',
#           fontweight='light',
#           horizontalalignment='center',
#           verticalalignment='top')
# for a,b in zip(df2.index,df2['amount']):
#     plt.text(a,b+0.05,b,ha='center')
# print(df2.head(5))
# plt.show()# 年度销量、销售额和平均销售额
df3 = df.pivot_table(index='year',values=['weight', 'amount'],aggfunc={'weight': sum, 'amount': ['mean', sum]}).round(0)
# fig, axis = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)
# axis[0].bar(df3.index, df3[('weight', 'sum')].values)
# axis[1].bar(df3.index, df3[('amount', 'sum')].values)
# axis[2].bar(df3.index, df3[('amount', 'mean')].values)
# axis[0].set_title('年度销量对比',
#                   fontsize='xx-large',
#                   horizontalalignment='center',
#                   verticalalignment='top')
# axis[1].set_title('年度销售额对比',
#                   fontsize='xx-large',
#                   horizontalalignment='center',
#                   verticalalignment='top')
# axis[2].set_title('年度平均销售额对比',
#                   fontsize='xx-large',
#                   horizontalalignment='center',
#                   verticalalignment='top')
# for a,b in zip(df3.index,df3[('weight', 'sum')]):
#     axis[0].text(a,b,b,ha='center',fontsize='xx-large')
# for a,b in zip(df3.index,df3[('amount', 'sum')]):
#     axis[1].text(a,b,b,ha='center',fontsize='xx-large')
# for a,b in zip(df3.index,df3[('amount', 'mean')]):
#     axis[2].text(a,b,b,ha='center',fontsize='xx-large')
# print(df3)
# plt.show()# 分析维度2:商品
# 水果年度销量占比
df4 = df.pivot_table(index='year',values='weight',columns='fruits',aggfunc=sum)
df4 = df4.apply(lambda x: x / x.sum(axis=0), axis=1)
# fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)
# ax[0].pie(list(df4.iloc[0].values),
#           autopct='%1.1f%%',
#           startangle=90,
#           wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
# ax[1].pie(list(df4.iloc[1].values),
#           autopct='%1.1f%%',
#           startangle=90,
#           wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
# ax[2].pie(list(df4.iloc[2].values),
#           autopct='%1.1f%%',
#           startangle=90,
#           wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
# labels = fruits
# for i in range(3):
#     ax[i].set_title('{}年'.format((df4.index.values)[i]),
#                     bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))
#     ax[i].legend(loc=0, ncol=1, labels=labels, frameon=False)
#     ax[i].axis('equal')
# print(df4)
# plt.show()# 各水果年度销售金额对比
df5 = df.pivot_table(index=['year'],values='amount',columns='fruits',aggfunc=sum).round(0)
# fig, ax = plt.subplots(nrows=1, ncols=3, figsize=(20, 10), dpi=80)
# ax[0].bar(df5.columns, df5.iloc[0].values, color='r', alpha=0.4)
# ax[1].bar(df5.columns, df5.iloc[1].values, color='g', alpha=0.4)
# ax[2].bar(df5.columns, df5.iloc[2].values, color='b', alpha=0.4)
# ax[0].set_title('2020年各水果销售金额对比',
#                 fontsize='xx-large',
#                 horizontalalignment='center',
#                 verticalalignment='top')
# ax[1].set_title('2021年各水果销售金额对比',
#                 fontsize='xx-large',
#                 horizontalalignment='center',
#                 verticalalignment='top')
# ax[2].set_title('2022年各水果销售金额对比',
#                 fontsize='xx-large',
#                 horizontalalignment='center',
#                 verticalalignment='top')
# for a, b in zip(df5.columns, df5.iloc[0].values):
#     ax[0].text(a, b, b, ha='center', fontsize='xx-large')
# for a, b in zip(df5.columns, df5.iloc[1].values):
#     ax[1].text(a, b, b, ha='center', fontsize='xx-large')
# for a, b in zip(df5.columns, df5.iloc[2].values):
#     ax[2].text(a, b, b, ha='center', fontsize='xx-large')
# print(df5)
# plt.show()# 商品月度销量变化
df6 = df.pivot_table(index=['month'],values='weight',columns='fruits',aggfunc=sum)
# fig = plt.figure(figsize=(20,10),dpi=80,facecolor='white',edgecolor=None)
# color_list = ['c', 'm', 'y', 'k', 'r', 'g', 'b', 'black']
# for i in range(len(fruits)):
#     plt.bar(df6.index,df6[fruits[i]].values,color=color_list[i],alpha=0.4)
# plt.legend('商品月度销量变化堆积图')
# print(df6)
# plt.show()# 分析维度3:地区
# 不同地区的销量
df7 = df.pivot_table(index='regoin', values='weight', aggfunc=sum)
# fig, axis = plt.subplots(nrows=1, ncols=2, figsize=(20, 10), dpi=80)
# axis[0].bar(df7.index, df7['weight'], color=['b', 'm', 'g', 'y'])
# for a, b in zip(df7.index, df7['weight']):
#     axis[0].text(a, b, b, fontsize='xx-large')
# size = [round(i / df7['weight'].sum(), 2) for i in df7['weight'].values]
# label = list(df7.index.values)
# axis[1].pie(size,startangle=90,labels=label,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
#
# axis[1].set_title('饼图(pie)',bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))
# # 设置图例
# axis[1].legend(loc=0, ncol=1, labels=label, frameon=False)
# # 设置等比例轴
# axis[1].axis('equal')
# plt.show()
# print(df7)# 不同地区的年度平均销售额
df8 = df.pivot_table(index=['regoin', 'year'],values='amount').round(2)
# print(df8)# 分析维度4:用户
# 用户订单量、金额对比
df9 = df.pivot_table(index='client',values='amount',aggfunc=['count', sum]).sort_values(by=('count', 'amount')).reset_index(drop=False)
# color_list = ['c', 'm', 'y', 'k', 'r', 'g', 'b']
# fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(20, 10), dpi=80, facecolor='w', edgecolor=None,alpha=0.4)
# ax[0].bar(df9.index, df9.loc[:, ('count', 'amount')],color=color_list)
# client_bar_list = [''] + list(df9['client'].values)
# ax[0].xticks = list([0] + df9.index)
# ax[0].set_xticklabels(client_bar_list)
# for a, b in zip(df9.index, df9.loc[:, ('count', 'amount')]):
#     ax[0].text(a, b, b, fontsize='xx-large')
# size = [round(i / df9.loc[:, ('sum', 'amount')].sum(), 2) for i in df9.loc[:, ('sum', 'amount')].values]
#
# ax[1].pie(size,labels=size,wedgeprops={'lw': 5, 'width': 0.3, 'edgecolor': 'w'})
# ax[1].set_title('饼图(pie)',bbox=dict(boxstyle='round,pad=0.5', fc='w', ec='k', lw=1, alpha=0.5))
# ax[1].legend(loc=0, ncol=1, labels=list(df9['client'].values), frameon=False)
# ax[1].axis('equal')
# print(df9)
# plt.show()# RFM用户分层模型分析
# RFM数据模型
df['R'] = df['time'].apply(lambda x: (datetime.datetime.now() - x).days)
R = df.sort_values(by=['client', 'R'], ascending=[False, True])
R = R.drop_duplicates(['client'], keep='first')
RFM = df.groupby('client').agg({'fruits': 'count', 'amount': sum}).reset_index().rename(columns={'fruits': 'F', 'amount': 'M'})
RFM['R'] = R['R'].values
# RFM打分表
RFM['R'] = RFM.R.apply(lambda x: ('5分' if x < 3else ('4分' if x >= 3 and x < 7else ('3分' if x >= 7 and x < 14else ('2分' if x >= 14 and x < 21else '1分')))))
RFM['M'] = RFM.M.apply(lambda x: ('5分' if x > RFM.M.quantile(0.8)else ('4分' if x > RFM.M.quantile(0.6)else ('3分' if x > RFM.M.quantile(0.4)else ('2分' if x > RFM.M.quantile(0.2)else '1分')))))
RFM['F'] = RFM.F.apply(lambda x: ('5分' if x > RFM.F.quantile(0.8)else ('4分' if x > RFM.F.quantile(0.6)else ('3分' if x > RFM.F.quantile(0.4)else ('2分' if x > RFM.F.quantile(0.2)else '1分')))))
RFM = RFM.replace(['5分', '4分', '3分', '2分', '1分'], [5, 4, 3, 2, 1])
RFM['total'] = RFM.iloc[:, 1:].sum(axis=1)
RFM = RFM.sort_values(by='total', ascending=False)
RFM.set_index(['client'], inplace=True)
# print(RFM)
# RFM打分表计算
RFM['t_avg'] = (RFM.iloc[:, :3].sum(1) / 3).astype(np.int64)# RFM用户分层
RFM = RFM.apply(lambda x: ''.join([str(i) for i in ((x[['R', 'F', 'M']] > x['t_avg']) * 1).values.tolist()]),axis=1).reset_index(drop=False)
RFM.columns = ['client', 'score']
d = {'score': pd.Series(['111', '110', '101', '100', '011', '010', '001', '000']),'scale': pd.Series(['重要价值客户', '一般价值客户', '重要发展客户', '一般发展客户', '重要保持客户', '一般保持客户', '重要挽留客户', '一般挽留客户'])}
client_scale = pd.DataFrame(d)
RFM = pd.merge(RFM, client_scale, on=['score'])
# print(RFM)# 各用户层级销售金额及其占比
df = pd.merge(df, RFM, on=['client'])
df11 = df.groupby('scale')['amount'].sum().reset_index(drop=False)
df11['ratio'] = (df11['amount'] / df['amount'].sum().round(2) * 100).round(2).map('{}%'.format)
df11.sort_values(by=['ratio'], ascending=False)
# print(RFM)# 用户复购分析
# 各客户各类水果的复购金额和复购次数
df12 = df.groupby(['client', 'fruits']).first().reset_index(drop=False)
df13 = pd.concat([df, df12]).drop_duplicates(['time', 'amount'], keep=False).reset_index(drop=True)
df13 = df13.groupby(['client', 'fruits'])['amount'].agg(['count', sum])
# print(df13)# 各用户最爱复购水果信息
df14 = df13.reset_index(drop=False).set_index(['client'])
df14['ratio'] = (df14['sum'] / df14.groupby('client')['sum'].sum() * 100).round(2).map('{}%'.format)
df14 = df14.reset_index().sort_values(by=['client', 'count'], ascending=[False, False])
df14 = df14.drop_duplicates(['client'], keep='first').reset_index(drop=True)
# print(df14)# 复购周期
df15 = df[['client', 'time']].sort_values(['client', 'time'], ascending=[False, True])
df16 = df15.groupby('client').shift(1).rename(columns={'time': 'time1'})
df16 = pd.concat([df15, df16], axis=1)
df16.dropna(inplace=True)
df16['timediff'] = (df16['time'] - df16['time1']).apply(lambda x: x.days)
df17 = df16.pivot_table(index='client',values='timediff',aggfunc=['min', 'max', 'mean', 'median', 'count'])
# print(df17)

文末结语

本篇文章仅使用pandas和matplotlib作简单的数据处理,没有把结果打印出来并做分析,是因为仅提供一些分析思路

具体数据的变化需根据打印结果来做分析(每次打印自动刷新数据),读者可继续细化各类分析,如人货场中针对历史销售情况做销量预测;RFM中针对各类用户群体输出运营策略;客户复购分析可根据复购情况退出捆绑套餐,拉动销量低的水果销量


参考文章

Pandas数据分析经典案例 - 云+社区 - 腾讯云

数据分析方法-RFM用户价值分层模型_inganxu的博客-CSDN博客

【数据分析案例】pandas + matplotlib 人货场+RFM+用户复购分析 电商水果销售相关推荐

  1. 一些关于直播间人货场的打造干货,直播电商新手必须要了解人货场的概念

    一些关于直播间人货场的打造干货,直播电商新手必须要了解人货场的概念.人(主播)能说会道,有人设,对产品熟,懂销售,至少话术要能记住80%. 能说会道的主播才能控场带节奏,对产品熟的主播才能深刻理解商品 ...

  2. Pandas数据分析案例(盛华化工锅炉排放数据可视化分析)

    Pandas数据分析案例(盛华化工锅炉排放数据可视化分析) 实验环境 数据集介绍 问题描述 实验步骤 一.数据导入与观察 二.数据转换 三.数据可视化分析 相关资源 实验环境 操作系统:Linux/W ...

  3. 【数据分析案例】某瓣读书数据分析

    前言说明 本文借用原文作者路人甲的爬取数据进行数据分析思路分享,如有侵犯相关版权信息,请联系本文作者删除文章 数据来源 数据源来自路人甲的公众号,可关注「路人甲 TM」公众号获取数据源 部分数据特征为 ...

  4. 电商Sass平台-商城运营后台原型-仓储管理-订单管理-店铺运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-流量分析-电商erp后台管理-用户权限-销量分析

    axure作品内容介绍:电商Sass平台-商城运营后台原型-仓储管理-订单管理-平台运营-采购管理-数据分析-交易分析-留存分析-客户管理-用户运营-围栏管理-商品管理-店铺装修-门店管理-商品档案- ...

  5. 销售指标在下降该怎么分析?手把手教你多种方法和思路分析电商案例

    在电商领域,最常遇到老板丢过来一个问题:"最近这个销售额在下降啊你来给我分析分析,想出几个有用的解决办法来".又或者在数据分析师面试的时候面试官喜欢问:"现在有个产品的销 ...

  6. 神策 FM:Airbnb 如何通过用户体验预测用户复购?

    大家好,我是策小编,一年过去,我们好久不见!本期我们为大家带来一个数据分析案例--Airbnb 如何通过用户体验预测用户复购?根据 Airbnb 数据科学家 Lisa Qian 的文章改编而来. 如果 ...

  7. 用户复购行为,该如何分析

    "1个老用户比20个新用户更有价值"是很多运营挂在嘴边的理论.可一到真刀真枪做数据分析的时候,又变成了让人头大的问题:"复购行为咋分析!" 就算计算出复购率指标 ...

  8. 【BI学习作业13-淘宝定向广告演化与天猫用户复购预测】

    目录 写在前面的话 1.思考题 1.1电商定向广告和搜索广告有怎样的区别,算法模型是否有差别 1.1.1电商定向广告 1.1.2搜索广告 1.2定向广告都有哪些常见的使用模型,包括Attention机 ...

  9. 复购分析实践中,Pandas 遇到了大难题

    作者 | 小z 来源 | 数据不吹牛 在电商等消费场景下,复购率是最耳熟能详的指标之一了.上到平台.下到品牌.店铺,各种复盘分析一定绕不开复购率,今天我们就从实战的角度聊聊复购率. 本文是Pandas ...

最新文章

  1. QS最新世界大学排名发布,清华北大获史上最高名次
  2. 麦肯锡《2020年人工智能状况》报告:企业收入增长,AI真的出了力
  3. c语言数据结构线性表LA和LB,数据结构(C语言版)设有线性表LA(3,5,8,110)和LB(2,6,8,9,11,15,20)求新集合?...
  4. python代码块使用缩进表示-Python 为什么抛弃累赘的花括号,使用缩进来划分代码块?...
  5. JavaScript开发规范 0.01版
  6. 属性与意图识别_解密宝能汽车智能驾舱的“未来属性”
  7. Java类class forName()方法及示例
  8. Android应用开发—Application
  9. 教育|仝卓高考舞弊案细节曝光:为“恢复高考成绩”已起诉1年多
  10. 用简单 JS 实现代替 MYBATIS LOG PLUGIN 的功能
  11. pscad调用matlab的模块,PSCAD模块库功能教程(包含与matlab接口).pdf
  12. 用excel制作双层饼图_教程:用Excel做饼图之复合饼图与双层饼图(2)
  13. 新一代三维GIS技术资料集锦
  14. 正方体最快最简单画_正方体的画法步骤_正方体怎么画
  15. js 中英文混合字符串 截取固定长度字节 方法封装
  16. react路由传参的几种方式
  17. 学习第一天——ipfs安装与使用
  18. 【机房收费系统】之结账
  19. Python中的strip().split(‘\t‘)的用法和解释
  20. 论文笔记-VulDeeLocator: A Deep Learning-based Fine-grained Vulnerability Detector

热门文章

  1. 35岁转行,是我人生中最正确的选择
  2. 今日学习在线编程题:弓形圆心角
  3. 分享一个http请求工具类,超好用。
  4. 计算机常识--工具软件篇
  5. 扩散模型怎么生成的,sample怎么弄得,代码
  6. ROS图像与OpenCV图像相互转换
  7. AWS云服务认证攻略系列(一)AWS Certified Solution Architect Associate 考试经验分享
  8. angular5学习系列之基础知识
  9. 实现mnist手写数字识别(第一周)
  10. pip---中科大源