1:用户消费行为分析
#用户第一次消费的月份分布和人数统计
print(df.groupby(by='user_id')['Month'].min().value_counts())
2:用户最后一次消费的时间分布和人数统计
df.groupby(by='user_id')['Month'].max().value_counts().plot()
plt.show()
3:新老用户占比
#agg聚合函数:分组之后的结果进行多种形式的聚合,返回每列函数的结果。
new_old_user=df.groupby(by='user_id')['order_dt'].agg(('max','min'))
(new_old_user['max']==new_old_user['min']).value_counts()
4:用户分层
#分析每个用户的总购买量,总消费金额,和最近一次的消费时间06:28
#df.pivot_table
rfm=df.pivot_table(index='user_id',aggfunc={'order_dt':'max','order_product':'sum','order_amount':'sum'})
print(rfm)
#RFM
#timedelta64
numpy 允许对两个 Datetime 值进行相减,该操作会产生一个带有时间单位的数字。由于 NumPy 在其核心中没有物理量系统,因此创建了timedelta64数据类型来补充 datetime64。timedelta64 的参数是一个数字,表示单位数和日期/时间单位,例如 (D)ay、(M)onth、(Y)ear、(h)ours、(m)inutes 或(s) 秒。timedelta64 数据类型还接受字符串“NAT”代替“Not A Time”值的数字。
#rfm.columns=['M','F','R']#直接改列名
#分层,封装了一个函数:
##lambda什么意思
##x.map( )什么意思
map()函数不改变原有的 list,而是返回一个新的 list。
#分层,封装了一个函数
def rfm_func(x):
level=x.map(lambda x:'1' if x>=0 else '0')
lable=level.M+level.F+level.R
d = {'111': '重要价值客户', '011': '重要保持客户', '101': '重要挽留客户', '001': '重要发展客户',
'110': '一般价值客户', '010': '一般保持客户', '100': '一般挽留客户', '000': '一般发展客户'}
result=d[lable]
return result
#df.apply是对df中的行或者列进行某种形式的运算
rfm['label']=rfm.apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
print(rfm)
5:用户的生命周期
#统计每个用户,每个月的消费次数
user_month_count_df=df.pivot_table(index='user_id',aggfunc={'order_product':'count'},columns='Month').fillna(0)
6:统计每个月每个用户是否消费?
df.applymap
#df.apply是对df中的行或者列进行某种形式的运算
rfm['label']=rfm.apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
#print(rfm)
#print(df.head())
#print(df.groupby(['user_id','Month'])['order_product'].count())
user_month_count_df=df.pivot_table(index='user_id',aggfunc={'order_product':'count'},columns='Month').fillna(0)
df_phurchase=user_month_count_df.applymap(lambda x:1 if x>=1 else 0)
print(df_phurchase.head())
#将用户按照每一个月份的购买情况分为(观望用户unreg,非活跃用户unactive,新客户New,活跃用户active,回头客return
#固定算法
def active_status(data):
ur = 'unreg' #未注册
ua = 'unactive' #不活跃
n = 'new' #新用户
a = 'active' #活跃
r = 'return' #回流用户:上个月不活跃,这个月活跃
status = []
for i in range(18):
#若本月没有消费
if data[i] == 0:
if len(status) > 0:
if n not in status:
status.append(ur)
else:
status.append(ua)
else:
status.append(ur)
#若本月消费
else:
if len(status) == 0:
status.append(n)
else:
if n not in status:
status.append(n)
elif status[-1] == ua:
status.append(r)
else:
status.append(a)
# 不能直接返回 status,否则会失去表头 ---重点
return pd.Series(status, index = df_phurchase.columns)
pivoted_status =df_phurchase.apply(active_status,axis = 1)
print(pivoted_status.head())
#每月不同活跃用户的统计人数
df_phurchase_new=pd.DataFrame(data=pivoted_status.values.tolist(),index=df_phurchase.index,columns=df_phurchase.columns)
#print(df_phurchase_new.value_counts())
pivoted_status_ct=df_phurchase_new.apply(lambda x:pd.value_counts(x).fillna(0))
print(pivoted_status_ct)