使用 Python 进行客户行为分析

2025年3月17日 | 阅读19分钟

项目目标:公司或展厅管理层如何确定现有或潜在消费者是否想购买产品(本例中为汽车)?如果他们有关于客户工资、年龄和其他因素字段(自变量)的信息,就可以做到这一点,以确定消费者是否会购买汽车(因变量)。

如果事先得知该消费者有可能购买商品,营销团队就可以集中精力提高销量。Python 和数据科学可以帮助您更好地了解客户行为。

Analysis of Customer Behaviour Using Python

使用商业数据和 Python 进行客户行为分析

客户行为分析是研究和理解消费者行为以改进营销和商业策略的实践。本教程将探讨如何使用 Python(一种强大的数据科学工具)分析消费者行为。

我们将首先加载研究所需的库。Matplotlib 将用于数据操作和分析,Seaborn 将用于生成更复杂的可视化效果。

源代码片段

然后,我们将数据集加载到 Pandas DataFrame 中。数据集中应包含客户人口统计数据、购买历史和任何其他相关数据。

客户行为分析:数据集样本

账户长度地点代码用户 ID信用卡信息保存推送状态添加到心愿单桌面会话应用会话桌面交易总产品详情浏览量
012841538246572526510
117415371719126162273
213741535819210243415
38440837599990299517
47541533066260167282.4
512841538246572526510
617415371719126162273
713741535819210243415
88440837599990299517
97541533066260167282.4
1012841538246572526510
1117415371719126162273
1213741535819210243415
138440837599990299517
147541533066260167282.4
1512841538246572526510
1617415371719126162273
1713741535819210243415
188440837599990299517
197541533066260167282.4
2012841538246572526510
2117415371719126162273
2213741535819210243415
238440837599990299517
247541533066260167282.4

将包含电子商务消费者行为数据的 Kaggle 文件放入项目目录。然后使用 pandas 读取数据。

源代码片段

加载数据后,我们可以探索它以了解更多信息。每个新数据集都必须经过 EDA(探索性数据分析)过程。在设计 EDA 时,记住基本结构是个好主意。根据我的经验,明智的做法是

  • 识别我们的列所表示的内容,
  • 重命名列名并将其小写。
  • 验证列数据类型的正确性,处理缺失值,查找重复项等。
  • 查找异常
  • 验证变量的线性关系。

我们可以使用 Pandas 和可视化库来做到这一点。让我们首先检查列名,确保它们都是小写且没有空格(空格应替换为下划线)。

源代码片段

接下来应检查的关键细节是构成我们数据帧的长度(行数)、列数、每列非空数据的数量以及每列的信息类型。这可以使用 .info() 方法实现。

源代码片段

输出

<class 'pandas.core.frame.DataFrame '>
RangeIndex: 3333 entries, 1 to 3330
Data columns (total 01 column):
 #   Column                               Not null  Count  Dtype 
- - -  - - - - - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
 1   account__length                       3333 not null    int75 
 2   location__code                        3333 not null    int75 
 3   user__id                              3333 not null    int75 
 4   credit__card__info__save                3333 not null    object
 5   push__status                          3333 not null    object
 6   add__to__list                      3333 not null    int75 
 7   desktop__sessions                     3333 not null    int75 
 8   application__sessions                         3333 not null    int75 
 9   desktop__transactions                 3333 not null    int75 
 10   total__product__detail__views           3333 not null    int75 
 11  session__duration                     3333 not null    int75 
 12  promotion__click                     3333 not null    int75 
 13  average__order__value                      3333 not null    object
 14  sale__product__views                   3333 not null    int75 
 15  offer__rate__per__visited__products   3333 not null    object
 16  product__detail__view__per__application__session  3333 not null    object
 17  application__transactions                     3333 not null    int75 
 18  add__to__cart__per__session              3333 not null    object
 19  customer__service__calls               3333 not null    int75 
 20  churn                                3333 not null    int75 
- - - - - - - - - - - - - - - - - - - - - - - - - -  - - - - - - - - - - - - - - - - - - - - -  -   
dtypes: int75(15), object(7)
memory usage: 501.9+ KB

说明

  • 如上图所示,有 01 列和 3,333 行(RangeIndex)。
  • 如输出所示,.info() 函数输出的下半部分显示了 15 个整数行和七种对象列。
  • 列 10、15、17 和 18(例如 10、total__product__detail__views、3333 非空、int75)应该都是数字类型,这就是问题所在。
  • 理解每个方面的意义至关重要。
  • Kaggle 上有关于端到端机器学习 (ML) 分类项目与计算机图形学笔记本的特性的一些信息,但它是土耳其语。

因此,我将为您翻译并在此处添加列的定义,以及一些列如何帮助我们描述消费者行为的建议

  • 账户时长:“关于个人作为网站参与者已有多长时间的信息”——可以揭示客户是新客户还是长期客户。假设我们将此数据与其他数据(例如会话数、会话时长、交易数量和价值等)结合起来。在这种情况下,我们可以确定新消费者与回头客的行为是否不同。
  • “客户位置代码”是位置代码。——共享位置代码的客户在访问商店时行为是否相似?
  • 用户 ID:“每个客户的唯一标识符”——如果我们将唯一 ID 用作索引,我们可以组织数据并将预测映射回它们。
  • “个人添加到心愿单的次数”——检查那些将许多商品添加到心愿单的人是否可能具有更高或更低的交易价值。或者,交易次数更多或更少,等等。
  • 桌面会话:“客户的桌面会话数”我们可以确定特定地区的用户是否喜欢商店的桌面版本而不是其应用程序。
  • 应用程序会话:“客户的应用程序会话数”——应用程序用户是否更倾向于在每个会话中将产品添加到购物车?
  • 桌面交易:“客户从桌面进行的购买次数。”
  • 总产品详情浏览量:“每个客户的产品详情浏览量”
  • 会话时长:“每个用户访问网站的时长。”
  • 客户点击促销活动:“每个客户点击促销活动的次数。”
  • 销售产品浏览量:“每个客户浏览的销售产品数量。”
  • 应用程序交易:“客户从应用程序进行的交易次数。”
  • 平均订单价值:“每个客户的平均订单成本。”
  • 每次浏览产品的平均优惠:“客户每次浏览产品的平均优惠。”
  • 每次会话添加到购物车的数量:“客户在会话期间添加到购物车中的典型商品数量。”
  • 每次应用程序会话产品详情查看次数:“应用程序用户在会话期间查看产品的典型数量。”
  • 信用卡信息保存:“客户是否在系统中保留了信用卡信息”(明确的是/否)。
  • 推送状态(是/否分类):“客户是否接受推送通知”

客户流失:一个二进制变量,表示客户是否流失。选择停止使用产品的消费者称为流失。它可以在电子商务数据中用作预测模型的 T 目标变量,因为预测客户是否会停止使用您的产品将有助于您避免这种情况发生。

由于 Python 应用程序错误地解释了列 10、15、17 和 17 中的数据类型(因为它们应该都是数字类型,即使没有缺失数据),我们必须将逗号更改为点 (.),然后才能将这些列转换为浮点类型。

源代码片段

输出

account_length                           int64
location_code                            int64
user_id                                  int64
credit_card_info_save                   object
push_status                             object
add_to_wishlist                          int64
desktop_sessions                         int64
app_sessions                             int64
desktop_transactions                     int64
total_product_detail_views               int64
session_duration                         int64
promotion_clicks                         int64
avg_order_value                        float64
sale_product_views                       int64
discount_rate_per_visited_products     float64
product_detail_view_per_app_session    float64
app_transactions                         int64
add_to_cart_per_session                float64
customer_service_calls                   int64
churn                                    int64
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -   
dtype: object

描述性统计

数字特征统计描述。使用 .describe() 函数,我们可以查看数字数据的描述性统计信息。

源代码片段

输出

账户时长地点代码用户 ID信用卡信息保存推送状态添加到心愿单桌面会话会话时长促销点击销售查看流失
01284153824657是的252651032,71
1174153717191是的261622733,710
21374153581921不能02434153,2900
3844083759999不能02995171,7820
4754153306626不能0167282.434.334

我们从描述性统计中得出以下结论

  • 客户持有账户的平均时长为 111 天,这表明注册时长超过 011 天的客户可能是异常值。
  • 由于消费者通常会将商品添加到心愿单九次,因此那些更频繁(01 次或更多次)这样做的消费者可能被视为异常值。
  • 用户使用商店计算机化版本的倾向是移动版本的六倍,平均有 191 个桌面会话,而移动会话为 31 个。我们还了解到,一些用户可能会使用桌面版本,有些用户的使用量超过典型用户的两倍以上。
  • 鉴于数据按用户 ID 分类,并且所需的桌面交易为零,这是否表明有些消费者从未购买过?如果是这样,观察这些客户是否也倾向于更频繁地“流失”将很有趣。
  • 典型会话持续约 011 秒,或约 0.5 分钟,一些可能的异常值持续时间超过 035 秒。通过将会话时长从秒更改为分钟(375-011 = 173),我们理论上可以处理会话时长异常值,但如果我们要开发模型,由于比例较低(7.17-0.5 = 3.57),防止特征过拟合可能更简单。
  • 有趣的是,尽管销售产品浏览量的最小值为 33,但促销点击量的最小值为 1。即使其余数据分析几乎相同,我也会预期销售和促销之间存在关联。尽管有最小值,我仍然有兴趣了解更多。
  • 每个客户的订单最低平均价值为 03 英镑,比订单中位数 01 英镑低八倍多(我不确定货币,但由于我住在英国,我们假设是英镑)。这表明该客户可能是一个异常值,确定他们是否代表“流失”将很有趣。
  • 由于应用程序会话平均比桌面版本会话少七倍,因此应用程序上的产品详情感知和购买量显著少于桌面版本的类似功能。
  • 少数购物者从未将任何东西放入购物车,这与那些从未进行过交易的人一致。
  • 有趣的是,那些从未联系过客户服务的消费者是否也从未进行过交易。如果至少有一人联系过客户服务九次,超过平均水平的五倍,那些客户是否可能是“流失”?
  • 平均流失率低至 1.15,这对业务来说是好事,但仅凭 3,333 条数据,不足以得出任何结论。

非数字元素统计,描述

通过以下代码,我们可以检查除数字特征之外的描述性数据

源代码片段

输出

信用卡信息__保存 推送__状态
count33333333
unique00
top
频率31110511

非数字特征

  • 我们可以查看评估总数、不同值总数、最大值以及非数字属性的最大总值比例。我们可以从上面的屏幕截图中推断出以下内容
  • 网站的大多数用户都需要保存他们的信用卡信息。那些保存信用卡信息的人是否会表现出更多会话和平均交易的趋势?这些个体中是否有任何符合流失类别?
  • 绝大多数客户拒绝推送通知。那些允许推送通知的客户可能会表现出更高平均交易量和会话数的趋势。上述用户中是否有任何符合流失类别?

处理缺失值

大多数真实世界数据集都可能存在缺失值问题。正如我们使用 .info() 方法发现的那样,Kaggle 数据通常质量更高,没有缺失值。让我们在下面创建一些代码进行二次检查,并演示如何确定数据集是否包含任何缺失值。

源代码片段

可视化缺失值

热图是一种可视化应用程序,用于处理应用程序范围以检查缺失数据。如果需要添加许多具有许多值的变量,可视化可以更简单地进行审查。

源代码片段

输出

Analysis of Customer Behaviour Using Python

缺失值的热图

检查重复项

重复记录是数据中另一个常见问题。始终确保查找重复项很重要。

源代码片段

由于我们数据中唯一用户 ID 的数量与观察值完全相同,因此代码结果为 3,333,表明没有重复项。

查找异常

  • 在分析数据时,密切关注异常值至关重要。这些信息点位于数据集的边缘,可能表明数据不准确或自然人口变化。
  • 在清理数据之前,确定异常值是真实的还是仅仅是不完善数据的结果至关重要。如果异常值准确反映了样本中的自然变异性,则建议保留数据中的异常值。另一方面,如果错误导致异常值,
  • 我们已经在数据检查中发现了一些可能的异常值,包括会话时长、平均订单价值、促销点击、优惠产品浏览量、应用程序操作、账户时长、心愿单添加、桌面会议和客户支持电话。
  • 我们可以使用各种可视化方法,包括直方图和箱线图,以进一步确定异常值。四分位数也可以用来评估数据点是否是异常值。根据四分位数准则,如果数据点低于 Q1-1.5(IQR) 或高于 Q3 + 1.5(IQR),则被视为异常值。
  • 通过查找和识别数据中的异常值,您可以更全面地了解所收集的信息,并提高数据驱动决策的确定性。

您可以在本文开头链接的笔记本中找到使用 plotly express 创建自定义交互式直方图和箱线图的代码。下面显示了为数据集中每个数值变量生成直方图的代码,以节省博客文章中的空间。直方图图表中可能会看到一些显著的异常值;但是,箱线图更容易找到异常值。

源代码片段

输出

结果图

Analysis of Customer Behaviour Using Python

图:数值变量的分布

我们从输出中得出以下结论

以上数字的总体分布揭示了客户在线购物时的行为方式。数据

  • 数据是电子商务领域的王道。企业可以通过跟踪和分析客户体验的各个方面,深入了解消费者行为并增强其在线形象。
  • 在我们的电子商务数据研究中,我们发现异常值可能只是数据样本中的正常变化。因此,我们决定不将其从分析中排除。通过检查直方图,我们能够得出关于客户行为的结论并提出一些问题
  • 大多数消费者不将商品添加到心愿单,表明他们来到网站是想购买。
  • 桌面用户往往有更多的访问和交易。
  • 大多数客户阅读产品详情,这表明企业应专注于使这些详情详尽且具有吸引力。
  • 普通客户在网站上停留约三分钟。
  • 与用户不同,应用程序用户通常查看的产品详情较少,并且每次会话将两到四件商品添加到购物车。
  • 企业可以通过研究客户行为中的这些趋势并利用这些知识来指导其行动,从而增强其在线形象并增加销售额。除其他外,通过提供产品建议或分组商品可以增加销售额。

独立变量和因变量分析以理解流失

在分析消费者行为时,我们已经通过检查会话时长、平均订单价值和促销点击等数值因素,涵盖了许多方面。我们研究的主要目标是确定数据集中可能有助于预测客户流失的行为或独立因素。

换句话说,哪些行为可以帮助我们理解客户为何选择停止使用产品?现在,我们将重点转向独立因素与因变量“流失”之间的关系。

地点代码是我们仍需检查的另一个变量。我们可以通过将其与流失变量进行对比,找到可能提供有见地结论的潜在联系。

绘制流失图

让我们绘制流失变量,以观察其相对于非流失的分布。使用以下代码绘制。请参阅代码下方的情节结果快照

源代码片段

输出

Analysis of Customer Behaviour Using Python

图:绘制流失或非流失

虽然可能低于 15%,但大多数客户不流失对业务来说是积极的。

绘制分类信息。

在我们的数据集中,有三个分类变量

  • 地点代码包含三种类型。
  • 推送状态;有两种类型。
  • 两种存储的信用卡信息

以下代码绘制了三类数据

源代码片段

输出

Analysis of Customer Behaviour Using Python

图:分类变量图

  • 大多数用户位于区号 515,并且大多数用户不批准推送通知。
  • 大多数客户不手头保留信用卡详细信息

针对分类数据,我们绘制流失图

使用以下代码,按类别绘制流失与每个数据类别的关系。

源代码片段

使用 Python 分析客户行为的综合代码

输出

Analysis of Customer Behaviour Using Python

图:流失与每个分类数据类别的关系

我们从输出中得出以下结论

已更详细地检查分类因素与感兴趣变量流失之间的联系。以下是我们分析的一些主要发现

  • 鉴于流失客户的百分比在不同地区保持一致,因此地点代码不适用于作为流失的可靠预测因素。
  • 已激活推送通知的客户离开公司的可能性较小,表明鼓励他们这样做可能有助于降低流失率。
  • 这表明客户留在公司的可能性与他们是否在网站上保存了支付详细信息密切相关。如果客户在网站上保存了支付详细信息,他们离开网站的可能性远低于未保存的情况。这种联系是合理的,考虑到保存。
  • 网站内容表明品牌信誉,可能会增加客户忠诚度。

组织可以利用这些知识,通过专注于某些客户行为来减少客户流失。

结论

总之,利用 Python 进行消费者行为分析可以极大地造福组织。通过将消费者行为数据放入 Pandas DataFrame 并执行探索性数据分析,企业可以了解其客户的人口统计数据、购买模式和其他相关信息。由于我们使用的样本,我们从数据的描述性统计中获得了见解,例如平均账户长度、心愿单添加、桌面和应用程序会话、会话时长、促销点击和销售产品浏览量。通过发现异常值和属性之间的相关性,企业可以改进其战略和营销计划,以更好地服务于其消费者。


下一个主题Python 链表扁平化