【无标题】

该篇文章通过分析用户第一次和最后一次消费的月份分布,新老用户比例,以及RFM模型(最近消费时间、消费频率、消费金额)来理解用户行为。利用用户购买量、消费金额和消费时间进行用户分层,识别出不同类型的客户群体,如重要价值客户和一般保持客户等。此外,文章还探讨了用户的生命周期,统计每个月的消费次数以及用户是否在特定月份有消费,进一步细化了用户分类,如新用户、活跃用户和回流用户。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值