知道吗?获取新客户的成本是保持现有客户的五倍,而且现有客户尝试新产品的可能性要高出50%,并且比新客户多花费31%。无论是否拥有一个鼓励客户回头并进行更多业务的忠诚度计划,这都清楚地表明了成功的客户忠诚度计划的重要性和影响。
在这篇文章中,将使用Python Dash构建一个应用,通过将客户分成不同的类别,帮助企业做出数据驱动的决策以提高客户忠诚度。以下是将在文章结束时构建的应用的快照。
将使用来自Kaggle的电子商务数据集,以下是数据的快照。“忠诚客户是那些即使产品不打折也会购买产品,并向朋友推荐产品的人。”
将通过最近一次购买的时间(Recency)、在给定时间段内进行的交易次数(Frequency)以及在给定时间段内花费的金额(Monetary)来进行行为细分,这些将在稍后计算。让在进一步进行之前先了解这些定义。
以下是代码块,它创建了新的变量,包括Recency、Frequency和Monetary:
df['TotalSum'] = df['Quantity'] * df['UnitPrice'] # 创建快照日期
snapshot_date = df['InvoiceDate'].max() + timedelta(days=1)
# 按CustomerID分组
data_process = df.groupby(['CustomerID']).agg({
'InvoiceDate': lambda x: (snapshot_date - x.max()).days,
'InvoiceNo': 'count',
'TotalSum': 'sum'})
# 重命名列
data_process.rename(columns={'InvoiceDate': 'Recency',
'InvoiceNo': 'Frequency',
'TotalSum': 'MonetaryValue'}, inplace=True)
为了避免这篇文章过长,一些涉及探索数据分布、清理数据、数据整理的代码没有详细说明,可以从Github上访问。数据处理结束后,应用阈值来分类并生成数据框。
将使用Dash构建应用,Dash是一个开源的Python框架,用于分析应用。它建立在Flask、Plotly.js和React.js之上。如果使用Python进行数据探索、分析、可视化、建模或报告,会发现它对于构建高度交互式的分析Web应用非常有用,而且代码量非常少。将探索一些关键特性,包括DCC和DAQ组件,使用Plotly Express进行可视化,并为Python中的客户忠诚度计划构建一个应用。
让构建一个交互式的饼图,它根据用户从UI中所做的选择进行更新。现在,将有一个占位符,稍后将其连接到数据和回调()函数。
html.Div(
children=[
html.H6("客户细分"),
dcc.Graph(id="heatmap"),
],
)
类似地,让为Recency和Frequency的分布图保留一个占位符,视觉将根据用户从下拉菜单中选择的国家进行更新。
html.Div(
children=[
html.H6("最近一次购买与频率分布"),
dcc.Graph(id="dist"),
],
)
拥有Recency与Frequency、Recency与Monetary以及Frequency与Monetary的散点图将非常有洞察力。以下是其中一个的代码片段供参考,将为其他组合做同样的事情,确保每个图表的id是唯一的。
html.Div(
children=[
html.H4("最近一次购买与Monetary"),
dcc.Graph(id="fig_mr"),
],
)
需要一个下拉菜单,列出国家,这些国家将从数据集中动态填充。
html.H6("选择国家"),
dcc.Dropdown(
id="country-dropdown",
options=[
{"label": i, "value": i} for i in tmp_df[0]['Country'].unique()
],
value='选择...'
),
其他控件,如单选按钮、DAQ切换开关控件,可以类似地添加。要了解如何添加这些字段,请参阅完整的代码。
在上一节中,已经设计了带有控件和占位符的前端。现在,这两个应该在用户更改输入时相互交互,这可以通过回调来实现。回调是Python函数,每当输入组件的属性发生变化时,Dash会自动调用它们。
@app.callback(
Output("heatmap", 'figure'),
[
Input("category-type", "value"),
Input("country-dropdown", "value")
]
)
def update_pieChart(category, country):
"""[摘要]
参数:
category ([value]): [用户从单选按钮中选择的类别值]
country ([value]): [从下拉菜单中选择的国家]
返回值:
[figure]: [返回fig对象,这是一个饼图]
"""
try:
if country == "选择...":
fig = px.pie(df_pieChart, values='RFM_Level_cnt', names='RFM_Level', template="ggplot2")
fig.update_layout(margin=dict(t=0, b=0, l=0, r=0))
fig.update_layout(legend=dict(
orientation="h",
))
logging.debug('饼图生成成功')
return fig
else:
filtered = df_pieChart[df_pieChart['Country'] == country]
fig = px.pie(filtered, values='RFM_Level_cnt', names='RFM_Level')
fig.update_layout(margin=dict(t=0, b=0, l=0, r=0))
fig.update_layout(legend=dict(
orientation="h",
))
return fig
类似的回调函数被编写以构建视觉和数据之间的交互性,这些数据由相应的逻辑生成。还可以在UI上添加表格,并实现回调,这些回调会在运行时填充数据——表格将根据数据量增长和缩小。可以在这里找到完整的代码。