首页 > 其他分享 >pandas 用户数据分析

pandas 用户数据分析

时间:2023-02-06 22:13:39浏览次数:36  
标签:数据分析 status 消费 df 用户 pandas user order

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt

""" 
第一部分:数据类型处理
数据加载
    字段含义:
        user_id:用户ID
        order_dt:购买日期
        order_product:购买产品的数量
        order_amount:购买金额
观察数据
    查看数据的数据类型
    数据中是否存储在缺失值
    将order_dt转换成时间类型
    查看数据的统计描述
        计算所有用户购买商品的平均数量
        计算所有用户购买商品的平均花费在源数据中添加一列表示月份:astype(datetime64[M])
"""
# 加载数据,定义字段含义
df = pd.read_csv("./CDNOW_master.txt", header=None, sep="\s+",
                 names=["user_id", "order_dt", "order_product", "order_amount"])
# 将order_dt转换成时间类型,格式化时间
df["order_dt"] = pd.to_datetime(df["order_dt"], format="%Y%m%d")
# 添加month列
df["month"] = df["order_dt"].values.astype(r"datetime64[M]")

"""
题外
将Datetime类型中的月份提取出来
df["month"] = df["month"].astype("str")
months = df["month"].str.split("-")
print(months.loc[1][1])
for i in range(len(months)):
    months.loc[i] = months.loc[i][1]
df["month"] = months 
"""
""" 
第二部分:按月数据分析
用户每月花费的总金额
    绘制曲线图展示
所有用户每月的产品购买量
所有用户每月的消费总次数
统计每月的消费人数
"""
# 用户每月花费的总金额,并绘制折线图
total = df.groupby(by="month")["order_amount"].sum()
# plt.plot(total)

# 所有用户每月的产品购买量
scale = df.groupby(by="month")["order_product"].sum()
# plt.plot(scale)

# 所有用户每月的消费总次数
count = df.groupby(by="month")["order_amount"].count()
print((count))

# 统计每月的消费人数()
headcount = df.groupby(by="month")["user_id"].nunique()
print(headcount)

""" 
第三部分: 用户个体消费数据分析
用户消费总金额和消费总次数的统计描述
用户消费金额和消费次数的散点图
各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
"""
# 用户消费总金额
print(df.groupby(by="user_id")["order_amount"].sum())
# 用户消费总次数
print(df.groupby(by="user_id").count()["order_amount"])
# 用户消费金额和消费次数的散点图
# 用户消费金额
user_amount_sum = df.groupby(by="user_id")["order_amount"].sum()
# 用户消费次数
user_product_sum = df.groupby(by="user_id")["order_product"].sum()
# 绘图
plt.figure(figsize=(20, 8), dpi=80)
# plt.scatter(user_product_sum, user_amount_sum)

# 各个用户消费总金额的直方分布图(消费金额在1000之内的分布)
user_order_10000 = df.groupby(by="user_id").sum().query(
    "order_amount < 1000")["order_amount"]
# plt.hist(user_order_10000)

# 各个用户消费的总数量的直方分布图(消费商品的数量在100次之内的分布)
user_product_100 = df.groupby(by="user_id").sum().query(
    "order_product < 100")["order_product"]
# plt.hist(user_product_100)


""" 
第四部分: 用户消费行为分析
用户第一次消费的月份分布,和人数统计
    绘制线形图
用户最后一次消费的时间分布,和人数统计
    绘制线形图
新老客户的占比
    消费一次为新用户
    消费多次为老用户
        分析出每一个用户的第一个消费和最后一次消费的时间
        agg(['func1func2]):对分组后的结果进行指定聚合
        分析出新老客户的消费比例
用户分层
    分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm
    RFM模型设计
        R表示客户最近一次交易时间的间隔
            /np.timedelta64(1,"D"):去除days。
        F表示客户购买商品的总数量,F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。
        M表示客户交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。
        将R,F,M作用到rfm表中
    根据价值分层,将用户分为:
        "重要价值客户"
        "重要保持客户"
        "重要挽留客户"
        "重要发展客户"
        "一般价值客户"
        "一般保持客户"
        "一般挽留客户"
        "一般发展客户"
            使用已有的分层模型rfm_func
"""

# 用户第一次消费的月份统计,和人数统计,绘制折线图
# first_con = df.groupby(by="user_id")["month"].min().value_counts().plot()

# 用户最后一次消费的月份统计和人数统计,绘制折线图
# last_con = df.groupby(by="user_id")["month"].max().value_counts().plot()

# 新老用户占比
# 消费一次新用户,消费多次老用户
# 如何获知用户是否为第一次消费? 可以根据用户的消费时间进行判定?
# 如果用户的第一次消费时间和最后一次消费时间一样,则该用户只消费了一次为新用户,否则为老用户
new_old_user_df = df.groupby(by="user_id")["order_dt"].agg(["min", "max"])
# True为新用户,False为老用户
new_old = (new_old_user_df["min"] == new_old_user_df["max"]).value_counts()

# 分析得出每个用户的总购买量和总消费金额and最近一次消费的时间的表格rfm 用透视表
rfm = df.pivot_table(index="user_id", aggfunc={
                     "order_product": "sum", "order_amount": "sum", "order_dt": "max"})


# R表示用户最近一次交易时间的间隔
max_dt = df["order_dt"].max()  # 今天的日期
# 每个用户最后于一次交易的时间
rfm["R"] = (max_dt - df.groupby(by="user_id")
            ["order_dt"].max()) / np.timedelta64(1, "D")
# 删除消费时间字段
rfm.drop(labels="order_dt", axis=1, inplace=True)
# 重命名字段名
rfm.columns = ["M", "F", "R"]

# RFM模型


def rfm_func(x):
    level = x.map(lambda x: "1" if x >= 0 else "0")
    label = level.R + level.F + level.M
    d = {
        "111": "重要价值客户",
        "011": "重要保持客户",
        "101": "重要挽留客户",
        "001": "重要发展客户",
        "110": "一般价值客户",
        "010": "一般保持客户",
        "100": "一般挽留客户",
        "000": "一般发展客户"
    }
    result = d[label]
    return result


# 将rfm_func计算的结果返回给新建label列 (lambda x: x - x.mean()).rfm_func
rfm["label"] = rfm.apply(lambda x: x - x.mean()).apply(rfm_func, axis=1)


""" 
第五部分: 用户的生命周期
将用户划分为活跃用户和其他用户
    统计每个用户每个月的消费次数
    统计每个用户每个月是否消费,消费记录为1否则记录为0
        知识点: DataFrame的apply和applymap的区别
            applymap:返回df
                将函数做用于DataFrame中的所有元素(elements)
            apply:返回Series
                apply()将一个函数作用于DataFrame中的每个行或者列
将用户按照每一个月份分成:
    unreg:观望用户(前两月没买,第三个月才第一次买,则用户前两个月为观望用户)。
    unactive:首月购买后,后序月份没有购买则在没有购买的月份中该用户的为非活用户。 
    new:当前月就进行首次购买的用户在当前月为新用户
    active:连续月份购买的用户在这些月中为活跃用户
    return:购买之后间隔n月再次购买的第一个月份为该月份的回头客
"""
# 统计每个用户每个月的消费次数
user_month_count_df = df.pivot_table(
    index="user_id", values="order_dt", aggfunc="count", columns="month").fillna(value=0)
# 统计每个用户每个月是否消费,消费记录为1否则记录为0
df_purchase = user_month_count_df.applymap(lambda x: 1 if x >= 1 else 0)

# 将df_purchase中的原始数据0和1修改为new,unactive...返回新的df叫df_purchase_new
# 用户生命周期模型,固定算法


def active_status(data):
    status = []
    for i in range(18):
        # 若本月没有消费
        if data[i] == 0:
            if len(status) > 0:
                if status[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] == "unactive":
                    status.append("return")
                elif status[i-1] == "ureg":
                    status.append("new")
                else:
                    status.append("active")
    return status


pivoted_status = df_purchase.apply(active_status, axis=1)

# 将pivoted_status的values转成list,再将list转成DataFrame
# 将df_purchase的index作为df_pruchase_new的index,columns相同
df_pruchase_new = pd.DataFrame(
    data=pivoted_status.values.tolist(), index=df_purchase.index, columns=df_purchase.columns)

# 将每月不同活跃用户进行计数
purchase_status_ct = df_pruchase_new.apply(
    lambda x: pd.value_counts(x), axis=0).fillna(value=0)

# 转置
t_purchase_status_ct = purchase_status_ct.T
print(t_purchase_status_ct.head())

标签:数据分析,status,消费,df,用户,pandas,user,order
From: https://www.cnblogs.com/thankcat/p/17096847.html

相关文章

  • 2. Linux用户管理
    1.用户管理1.1用户信息相关文件​/etc/passwd​​:存储用户的基本信息​root:x:0:0:root:/root:/bin/bash​​用户名:密码占位符:UID:GID:描述:​用户名密码:都是​​x​​,......
  • pandas中的 Series的讲解
    #coding=utf-8importpandasaspdimportnumpyasnpfrompandasimportSeries'''Series的方法与属性属性:values获取某一列的数据值获取的......
  • root用户远程连接RocklyLinux9
    由于RocklyLinux9默认是拒绝Root用户22端口远程访问,所以需要进行调整1、登录服务器2、进入目录vi/etc/ssh/sshd_config3、修改PermitRootLoginprohibit-password为P......
  • 禁用root账户登录,新建用户权限与root一致
    1、使用管理员登录系统2、修改文件vi/etc/passwd修改root❌0:0:root:/root:/bin/bash为root❌0:0:root:/root:/sbin/nologin3、新建用户adduseradmin4、修改......
  • 【交互式用户流程与演示设计】上海道宁与​Overflow让您能更自信的展示您的设计
     Overflow让设计师和产品经理能够自信地展示他们的设计并讲述他们的设计故事独特的动态和交互式演示  Overflow的功能使设计人员能够使用鼠标、......
  • Python数据分析与挖掘操作总结(持续更新...)
    一.实现某列的去重,只保留其中一行的数据内容:使用drop_duplicates方法来实现数据去重,实现方式如下:test=test.drop_duplicates("标题")二.删除某一列中含有’万’字的数字,......
  • 【QostgreSql】不同用户下数据库合并到新库
    场景根据业务需求,需要将user1下的dev数据库和user2下的auth数据库整合到user1的新库prod。经过PostgreSql服务器root用户登录上去发现没有postgres用户。进入home目录......
  • Linux关于用户和组操作的命令
    准备工具本篇已UbuntuLinux系统为例来讲解Linux关于用户和组操作的命令(只有root权限才可以执行下面讲解的命令!)。不用担心其他发行版系统不能使用这些命令,它们的基本操作......
  • 用户下单
    移动端用户将菜品或者套餐加入购物车后,可以点击购物车中的【去结算】按钮页面跳转到订单确认页面,点击【去支付】按钮则完成下单操作。用户下单业务对应的数据表为orde......
  • 五、python——用户输入和while循环
    #函数input()让程序暂停运行,等待用户输入一些文本。#获取用户输入后,Python将其存储在一个变量中,以方便你使用message=input("Tellmesomething,andIwillrepea......