案例分析总结
第一次接触案例分析感觉难度还是挺大的,看完视频一脸懵逼,不知道从何下手,硬生生的把代码抄了一遍。抄完之后,对这个案例分析的思路有了一定的了解,接着按着这个思路把它在做一遍。做完之后,收获满满。下面对这个案例进行总结:
前言:
(1)输入需要用到的第三方工具:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt(加载数据可视化包)
%matplotlib inline(可视化显示在页面)
plt.style.use('ggplot')(更改设计风格)
(2)导入数据
columns=['user_id','order_dt','order_products','order_amount']
df=pd.read_csv("C:/Users/86176/Desktop/CDNOW_master.txt",names=columns,sep='\s+')
(3)查看数据类型及具体描述
df.info()
df.describe()
(4)将日期转化成正确格式
df['order_dt']=pd.to_datetime(df.order_dt,format='%Y%m%d')
df['month']=df.order_dt.values.astype('datetime64[M]')(每月的一号)
进行用户消费趋势的消费(按月)
(1)每月的消费总金额
grouped_month=df.groupby('month')
grouped_month_amount=grouped_month.order_amount.sum()
grouped_month_amount.plot()
(2)每月的消费消费次数
grouped_month.order_amount.count().plot()
(3)每月的产品购买量
grouped_month.order_products.sum().plot()
(4)每月的消费人数
grouped_month.user_id.apply(lambda x:len(x.drop_duplicates())).plot()
apply(lambda x:len(x.drop_duplicates()))-----把重复的user_id去掉
用户个体消费分析
(1)用户消费金额,消费次数的描述统计
grouped_user=df.groupby('user_id')
grouped_user.sum().describe()
grouped_user.count().describe()
(2)用户消费金额散点图
grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
按条件:
grouped_user.sum().query('order_amount<4000').plot.scatter(x='order_amount',y='order_products')
(3)用户消费金额的分布图
grouped_user.sum().query('order_amount<600').order_amount.hist(bins=20)
(4)用户累计消费占比
方法一:
user_cumsum_rate=(grouped_user.sum().sort_values('order_amount').cumsum()) / (grouped_user.sum().sort_values('order_amount').sum())
user_cumsum_rate.reset_index().order_amount.plot()
方法二:
user_cumsum_rate=grouped_user.sum().apply(lambda x:x.cumsum()/x.sum())
user_cumsum_rate.reset_index().order_amount.plot()
用户消费行为
(1)用户第一次消费
grouped_user.order_dt.min().value_counts()
(2)用户最后一次消费
grouped_user.order_dt.max().value_counts()
(3)新老客消费比
多少用户仅消费了一次
user_life=grouped_user.order_dt.agg(['min','max'])
(user_life['min']==user_life['max']).value_counts()
每月新客占比
(grouped_user.min().groupby('month').month.value_counts()) / (df.groupby('month').month.value_counts())
用户分层
RFM
rfm=df.pivot_table(index='user_id',
values=['order_dt','order_products','order_amount'],
aggfunc={'order_dt':'max','order_products':'sum','order_amount':'sum'})
rfm['R']=(rfm.order_dt.max()-rfm.order_dt) / np.np.timedelta64(1,'D')
rfm.rename(columns={'order_amount':'M','order_products':'F'},inplace=True)
新,老,活跃,回流,流失
第一步
rfm['R','F','M'].apply(lambda x:x-x.mean())
def rfm_func(x):
level=x.apply(lambda x: '1' if x>=0 else '0')
label=level.R+level.F+level.M
b={ '111':'重要价值客户',
'011':'重要保持客户',
'101':'重要挽留客户',
'001':'重要发展客户',
'110':'一般价值客户',
'010':'一般保持客户',
'100':'一般挽留客户',
'000':'一般发展客户' }
result=d[label]
return result
rfm['label']=rfm['R','F','M'].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
第二步:
(1)pivot_counts=df.pivot_table(index='user_id',columns='month',
values='order_dt',aggfunc='count').fillna(0)
(2)df_purchase=pivot_counts.applymap(lambda x:1 if x>0 else 0)
(3)def active_status(data):
status=[]
for i in range(18):
if data[i]==0:
if len(status)>0:
if data[i-1]=='unreg':
status.append('unreg')
else:
status.append('unactive')
else:
status.append('unreg')
else:
if len(status)==0:
status.append('new')
else:
if status[i-1]=='unreg':
status.append('new')
elif status[i-1]=='unactive':
status.append('return')
else:
status.append('active')
return status
(4)df_purchase.apply(active_status,axis=0)
用户购买周期(按订单)
用户消费周期描述
order_diff=grouped_user.apply(lambda x:x.order_dt-x.order_dt.shift())
order_diff.describe()
用户消费周期分布
(order_diff/np.timedelta64(1,'D')).hist(bins=20)
用户生命周期(按第一次&最后一次消费)
用户生命周期描述
((user_life['max']-user_life['min'])/np.timedelta64(1,'D')).describe()
用户生命周期分布
((user_life['max']-user_life['min'])/np.timedelta64(1,'D')).hist(bins=20)
复购率和回购率分析
回购率(自然月内,购买多次的用户占比)
(1)purchase_return=pivot_counts.applymap(lamdba x:1 if x>1 else np.NaN if x==0 else 0)
(2)(purchase_return.sum() / purchase_return.count()).plot(figsize=(10,4))
复购率(曾经购买过的用户在某一时期内的再次购买的占比)
(1)def purchase_back(data):
status=[]
if data[i]==1:
if data[i+1]==1:
status.append(1)
else:
status.append(0)
else:
status.append(np.NaN)
return status
(2) purchase_back=df_purchase.apply( purchase_back,axis=1)
(3) (purchase_back.sum() / purchase_back.count()).plot(figsize=(10,4))