客户价值和客户创利能力分析

一、数据导入

csv_path = './Data/North_American_Superstore.csv'
df = pd.read_csv(csv_path, encoding="gbk")
pd.set_option('display.max_columns', None)
# 原始dataframe中列名中包含空格,需要进行替换
df.rename(columns = lambda x : x.replace(' ',''),inplace = True)
df.head()

二、数据预处理

1.数据概况

print(df.shape)
print("-"*30)
print(df.describe())
print("-"*30)
print(df.info())

 

2.数据清理

异常数据处理

df.loc[df['Sales']<0].Sales.count() # 统计销售额Sales<0的个数
df.loc[df['Sales']<0, ['OrderID', 'CustomerID', 'Sales']] # 查看异常Sales的OrderID和CustomerID
df = df.loc[(df['Sales']>0)&(df['Quantity']>0)] # 取Sales 和 Quantity 均大于零的行

数据格式

# 日期数据格式转换
df['OrderDate'] = pd.to_datetime(df['OrderDate'])

# 查看用户下单的日期范围
print('最晚下单日期是:',df['OrderDate'].max())
print('最早下单日期是:',df['OrderDate'].min())

 

三、客户价值和客户创利能力分析

RFM分析:最近一次消费(Recency近度)、消费频率(Frequency频度)、消费金额(Monetary额度)

重要价值客户(高,高,高):最近消费时间近、消费频次和消费金额都很高,绝对的优质客户。

重要保持客户(低,高,高):最近消费时间较远,但消费频次和金额都很高,说明这是个一段时间没来的忠诚客户,需要主动和他保持联系。

重要发展客户(高,低,高):最近消费时间较近、消费金额高,但频次不高,忠诚度不高,很有潜力的用户,必须重点发展。

重要挽留客户(低,低,高):最近消费时间较远、消费频次不高,但消费金额高,可能是将要流失或者已经要流失的用户,应当基于挽留措施

1.客户RFM表

获取不同客户(CustomerID)在所有时间内的下单次数Frequency

df_f = df.copy()
df_f.drop_duplicates(subset=['OrderID'],keep='first',inplace=True) # 合并相同的订单
df_freq = df_f.groupby('CustomerID',as_index=False).OrderID.count().rename(columns={'OrderID':'Frequency'})
df_freq.set_index('CustomerID',drop=True,inplace=True)
df_freq.head()

 获取不同客户(CustomerID)在所有时间内的订单金额Monetary、利润Profit和最后一次下单距离当前时间的天数Recency

df_group = df.groupby('CustomerID')
df_rm = df_group.agg({'Sales':'sum','OrderDate':'max','Profit':'sum'}).rename(columns={'Sales':'Monetary'})
df_rm['Recency'] = (pd.to_datetime('2019-01-01') - df_rm['OrderDate']).dt.days
df_rm = df_rm.drop('OrderDate',axis=1)
df_rm.head()

 

 获取获取不同客户(CustomerID)在其发生购买的年限内年均下单频次Frequency

DiffYears = df_group.agg({'OrderDate':(lambda df : df.dt.year.max() - df.dt.year.min()+1)}).rename(
columns={'OrderDate':'DiffYears'}).DiffYears
DiffYears.head()
df_freq.Frequency=df_freq.Frequency/DiffYears
df_freq.head()

df_rfm = df_rm.merge(df_freq,on='CustomerID')
df_rfm.head()

 

2.不同类型客户分析

以中位数为界划分对各客户进行类型划分

# 求取RFM各值的中位数
r_med = df_rfm['Recency'].median()
f_med = df_rfm['Frequency'].median()
m_med = df_rfm['Monetary'].median()
r_med,f_med,m_med

# 划分客户类型的函数
def customer_type_func(frame):
customer_type_list = []
for i in range(len(frame)):
if frame.iloc[i,2]<=r_med and frame.iloc[i,3]>=f_med and frame.iloc[i,0]>=m_med:
customer_type_list.append('重要价值客户')
elif frame.iloc[i,2]<=r_med and frame.iloc[i,3]<f_med and frame.iloc[i,0]>=m_med:
customer_type_list.append('重要发展客户')
elif frame.iloc[i,2]>r_med and frame.iloc[i,3]>=f_med and frame.iloc[i,0]>=m_med:
customer_type_list.append('重要保持客户')
elif frame.iloc[i,2]>r_med and frame.iloc[i,3]<f_med and frame.iloc[i,0]>=m_med:
customer_type_list.append('重要挽留客户')
else:
customer_type_list.append('一般客户')
frame['CustomerType'] = customer_type_list
customer_type_func(df_rfm)

分析不同类型客户的总体获利情况

df_rfm['ProfitType'] = (df_rfm.Profit>0)
df_ProfitCustNum= df_rfm.groupby(['CustomerType','ProfitType']).size().reset_index(name='ProfitCustNum')
df_ProfitCustNum

 

 

不同类型客户总订单金额、利润率、利润、客户平均订单金额、客户平均订单利润

 

不同类型客户创利情况分析

 

 

四、同期群分析

同期群分析(Cohort Analysis,亦称群组分析),其主要目的是分析相似群体的行为随时间的变化(比如用户商品的回购、对产品/服务的使用等)

通过将用户按初始行为的发生时间分组(得到同期群),然后再统计初始行为时间后不同时段内留存行为的发生频次。

由于数据集的原因,不能确定历史所有老客户的ID,因此做出假设:以2015上半年下单的客户为老客户,从2015年下半年开始计算新增客户,2016年上半年开始计算客户回购率/留存率

for i, customer_list_half_year in enumerate(u_customer_list):
if i>0 and i<7:
last_list = [] # 保存过去所有时间内客户ID(去重)
retain_list = [] # 保存以后每个半年回购的客户人数
for j in range(0,i):
last_list.extend(u_customer_list[j])
last_list = list(set(last_list))
new_list = [cust for cust in customer_list_half_year if cust not in last_list] # 保存当前周期新增客户ID
for k in range(i+1,8):
retain_list.append(len([cust for cust in u_customer_list[k] if cust in new_list]))
print(label[i]+'新增客户数量为', len(new_list), '留存率依次为',[round(i/len(new_list), 3) for i in retain_list])

 

 

五、Tableau仪表盘搭建

 

posted on 2023-05-13 20:59  尘仙  阅读(189)  评论(0编辑  收藏  举报

导航