用Python分析用户消费行为 Student Comsumption Analysis②

** 【续上篇】 用Python分析用户消费行为 Student Comsumption Analysis ① https://blog.csdn.net/weixin_44216391/article/details/89309643

#  【续】本次案例:用户消费行为分析

# 借用阿里天池【数智教育_数据可视化创新大赛】数据源中的学生消费数据来作为本次用户消费行为分析的数据来源。

# 本篇分析方法参考该帖子:http://www.woshipm.com/data-analysis/757648.html
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline
plt.style.use("ggplot")
import warnings
warnings.filterwarnings("ignore")

# plt.rcParams['font.sans-serif']=['SimHei']   # 用来正常显示中文标签
# plt.rcParams['axes.unicode_minus']=False   # 用来正常显示负号

# seaborn中文乱码解决方案
import seaborn as sns
from matplotlib.font_manager import FontProperties
myfont=FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=14)
sns.set(font=myfont.get_name())
df=pd.read_csv("D:/2018_BigData/Python/Python_files_Notebook/theme_practice/student_consumption_day.csv")
df.head()
DealTime bf_StudentID AccName PerSex MonDeal avgMonDeal transaction_times month
0 2018-07-01 13983 裘某某 -3.7 -3.70 1 2018-07-01
1 2018-07-01 14018 虞某某 -9.5 -9.50 1 2018-07-01
2 2018-07-01 14073 刘某某 -8.0 -8.00 1 2018-07-01
3 2018-07-01 14074 周某某 -14.3 -7.15 2 2018-07-01
4 2018-07-01 14097 毛某某 -10.0 -10.00 1 2018-07-01
# 承接上一章,将用户消费数据进行数据透视。

pivoted_counts=df.pivot_table(index="bf_StudentID",columns="month",values="transaction_times",aggfunc="sum").fillna(0)
columns_month=df.month.sort_values().astype("str").unique()
pivoted_counts.columns=columns_month
pivoted_counts.head()
2018-07-01 2018-08-01 2018-09-01 2018-10-01 2018-11-01 2018-12-01 2019-01-01
bf_StudentID
13012 0.0 0.0 10.0 10.0 15.0 7.0 9.0
13564 17.0 25.0 82.0 63.0 69.0 75.0 50.0
13599 8.0 10.0 39.0 33.0 34.0 31.0 26.0
13685 8.0 12.0 28.0 33.0 34.0 39.0 17.0
13947 9.0 22.0 81.0 64.0 66.0 72.0 63.0
# 用applymap+lambda转换数据,只要当月消费超过30次,记为1,反之为0。
pivoted_purchase = pivoted_counts.applymap(lambda x: 1 if x > 30 else 0)
pivoted_purchase.head()
2018-07-01 2018-08-01 2018-09-01 2018-10-01 2018-11-01 2018-12-01 2019-01-01
bf_StudentID
13012 0 0 0 0 0 0 0
13564 0 0 1 1 1 1 1
13599 0 0 1 1 1 1 0
13685 0 0 0 1 1 1 0
13947 0 0 1 1 1 1 1
# 原帖子:

# 接下来进行用户分层,我们按照用户的消费行为,简单划分成几个维度:新用户、活跃用户、不活跃用户、回流用户。
# 新用户的定义是第一次消费。活跃用户即老客,在某一个时间窗口内有过消费。不活跃用户则是时间窗口内没有消费过的老客。回流用户是在上一个窗口中没有消费,而在当前时间窗口内有过消费。以上的时间窗口都是按月统计。
# 比如某用户在1月第一次消费,那么他在1月的分层就是新用户;他在2月消费国,则是活跃用户;3月没有消费,此时是不活跃用户;4月再次消费,此时是回流用户,5月还是消费,是活跃用户。
# 分层会涉及到比较复杂的逻辑判断。

# ----------------------------------------------------------

# 本次学生消费案例:

# 接下来进行用户分层,我们按照学生的消费行为,简单划分成几个维度:新生(新用户)、超爱饭堂的学生(活跃用户)、不爱饭堂的学生(不活跃用户)、偶尔爱饭堂的学生(回流用户)。
# 新生的定义是第一次消费超过30次。超爱饭堂的学生即常客/老客,在某一个时间窗口内有过消费30次以上。不爱饭堂的学生则是时间窗口内没有消费超过30次的老客。回流用户是在上一个窗口中没有消费30次以上,而在当前时间窗口内有过消费30次以上。以上的时间窗口都是按月统计。

# 比如某学生在9月第一次消费30次以上,那么他在9月的分层就是新生(新用户);
# 他在10月消费30次以上,则是超爱饭堂的学生(活跃用户);
# 11月没有消费30次以上,此时是不爱饭堂的学生(不活跃用户);
# 12月再次消费30次以上,此时是偶尔爱饭堂的学生(回流用户);
# 1月还是消费30次以上,是超爱饭堂的学生(活跃用户)。

# 分层会涉及到比较复杂的逻辑判断。
def active_status(data):
    status=[]
    for i in range(7):
        
        # 若本月没有“消费30次以上”
        if data[i] == 0:
            if len(status) > 0:
                if status[i-1] == "unreg":
                    status.append("unreg")
                else:
                    status.append("unlike_canteen")
            else:
                status.append("unreg")
        # 若本月“消费30次以上”
        else:
            if len(status) == 0:
                status.append("new")
            else:
                if status[i-1] == "unlike_canteen":
                    status.append("occasionally_like_canteen")
                elif status[i-1] == "unreg":
                    status.append("new")
                else:
                    status.append("love_canteen")
    return status
                
# 函数写得比较复杂,主要分为两部分的判断,以本月是否“消费60次以上”为界。
# 本月没有“消费60次以上”,还要额外判断他是不是新生(新客),
# 因为部分学生是9月份才“消费30次以上”成为新生(新客),那么在7、8月份他应该连新生(新客)都不是,用unreg表示。
# 如果是老客(即前一个月消费30次以上),则为unlike_canteen。

# 本月若有“月消费30次以上”,需要判断是不是第一次“月消费30次以上”,上一个时间窗口有没有“月消费30次以上”。
# 大家可以多调试几次理顺里面的逻辑关系,对用户进行分层,逻辑确实不会简单,而且这里只是简化版本的。
# pivoted_purchase_status = pivoted_purchase.apply(lambda x: active_status(x),axis = 1)
# pivoted_purchase_status.head()

#  运行报错:("'Series' ob
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值