Python实战08:在线书店主题对用户参与度与购买率的影响分析

📮 求内推

👩 个人简介:听障人,96年,计算机专业(本科),从事数据分析工作
🛠 语言与工具:包括但不限于Python、SQL、tableaubi、finebi、powerbi。
💻 期望岗位:数据分析、数据运营、报表开发等(hc偏技术方向)
📍 期望城市:杭州

背景说明

一家在线书店正在优化其网站设计,为用户提供了两种主题:浅色主题和深色主题,并且进行了网站A/B测试。
该在线书店希望通过进一步的数据分析确定哪个主题能带来更好的用户参与度和更高的图书购买转化率。
本数据集包含了使用不同主题的用户交互、参与度等相关数据。

数据说明

数据清洗与预览

import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
from scipy import stats
df = pd.read_csv(r'\website_ab_test.csv')
display(df.head())

为了阅读习惯,我想把Session_Duration换算为分钟单位,这里单位一般是秒。

df['Session_Duration'] = round(df['Session_Duration']/60,2)

print('-'*50)
print("数据集大小:",df.shape)
print('-'*50)
print("数据集存在重复值个数:",df.duplicated().sum())
print('-'*50)
print("数据集存在空值个数:",df.isna().sum())
print('-'*50)
print("数据集信息:",df.info())

# 确认下这些字段唯一值有哪些
for x in ['Theme','Location','Purchases','Added_to_Cart']:
    print(df[x].unique())

display(df.describe(include='all'))

OK,该数据集非常干净,不需要进行任何处理,接下来切入主题吧~

描述性可视化

feature = ['Theme','Purchases','Added_to_Cart','Location']

fig = make_subplots(rows=1,cols=len(feature),subplot_titles=[f'{f} Distribution' for f in feature])

for i,f in enumerate(feature):
    counts = df[f].value_counts().reset_index()
    counts.columns = [f,'count']
    bar_fig = px.bar(counts,x=f,y='count')
    # print(bar_fig['data']) # 代表从图表对象中提取的数据轨迹,包含了一些元数据和图表数据
    for trace in bar_fig['data']:
        fig.add_trace(trace,row=1,col=i+1)
fig.update_layout(height=600,width=1000)
fig.show()

nfeatures = ['Click Through Rate','Conversion Rate','Bounce Rate','Scroll_Depth','Age','Session_Duration']
num_fig = make_subplots(rows=2,cols=3,subplot_titles=[f'{f} Distribution' for f in nfeatures])
for i,f in enumerate(nfeatures):
    q1 = df[f].quantile(0.25)
    q2 = df[f].quantile(0.5)
    q3 = df[f].quantile(0.75)
    df['interval'] = pd.cut(df[f],bins=[-np.inf,q1,q2,q3,np.inf],labels=['Q1-Below', 'Q1-Q2', 'Q2-Q3', 'Q3-Above'])
    interval_groupby = df.groupby('interval')[f].mean().round(3).reset_index(name='mean')
    pie_nfig = px.bar(interval_groupby,x='interval',y='mean')
    num_fig.add_trace(pie_nfig['data'][0],row=(i//3)+1,col=(i%3)+1)
num_fig.update_layout(height=900,width=1000)        
num_fig.show()

小结:

  • Theme: 超出一半的用户使用Dark Theme。表明喜欢深色主题的用户偏多。
  • Added_to_Cart: 超出一半的用户把书籍放入购物车里。表明用户对书籍感兴趣并且可能愿意考虑购买。
  • Purchases: 超出一半的用户购买了书籍。意味着该网站的购物流程可能较为顺畅,用户转换率较高。
  • Click Through Rate: 点击率随着区间的升高而显著增加,从Q1-Below的0.08到Q3-Above的0.44。表明随着用户参与度的增加,他们可能更愿意点击页面上的链接或按钮。
  • Conversion Rate: 转化率同样呈现上升趋势,从Q1-Below的0.07到Q3-Above的0.43。转化率的提升意味着随着用户参与度的增加,他们更有可能完成期望的动作,比如购买。
  • Bounce Rate: 跳出率随着区间的升高而增加,从Q1-Below的0.28到Q3-Above的0.72。表明用户年龄的增长和用户参与度的降低,他们可能访问一次后就离开网站。
  • Scroll_Depth: 滚动深度随着区间的升高而显著增加,从Q1-Below的28.16到Q3-Above的72.1。表明随着用户参与度的增加,他们可能更愿意浏览更多的网页内容。
  • Age: 用户的平均年龄随着区间的升高而增加,从Q1-Below的23.5岁到Q3-Above的59.8岁。表明随着年龄段的不同,用户的行为习惯和偏好会有所不同。
  • Session_Duration: 会话时长随着区间的升高而增加,从Q1-Below的4.3分钟到Q3-Above的26.3分钟。表明随着用户参与度的增加,他们在网站上停留时间可能会增长。

购买转化因素分析

# 把分类变量转换为二元编码
ndf = df.copy()
ndf['Theme'] = ndf['Theme'].map({'Light Theme':1,'Dark Theme':0})
ndf['Added_to_Cart'] =ndf['Added_to_Cart'].map({'Yes':1,'No':0})
ndf['Purchases'] = ndf['Purchases'].map({'Yes':1,'No':0})

Purchases与其他特征的相关性可视化分析

# 购买与否下得各个特征的中位数
flist0 = ['Theme','Click Through Rate','Conversion Rate', 'Bounce Rate','Scroll_Depth', 'Age','Session_Duration','Added_to_Cart']
purchases_fig = make_subplots(rows=2,cols=4,subplot_titles=[f'{f} Distribution' for f in flist0])
for i,f in enumerate(flist0):
    if f in ['Theme','Added_to_Cart']:
        cat_groupby = ndf.groupby(['Purchases',f])[f].count().reset_index(name='count')
        total_groupby = ndf.groupby('Purchases')[f].count().reset_index(name='total')
        merge_groupby = total_groupby.merge(cat_groupby,on='Purchases')
        merge_groupby['per'] = round(merge_groupby['count']/merge_groupby['total']*100,2)
        # display(merge_groupby)
        purchases_pic = px.bar(merge_groupby,x='Purchases',y='per',barmode='stack',color=f)
    else:
        purchases_pic = px.box(ndf,x='Purchases',y=f)
    purchases_fig.add_trace(purchases_pic['data'][0],row=(i//4)+1,col=(i%4)+1)
purchases_fig.update_layout(height=900,width=1000)        
purchases_fig.show()

皮尔逊相关性分析

# 计算是否购买与其他特征的相关性系数
purchases_corr = ndf.select_dtypes(include=[np.number]).corr()
corr_ndf = pd.DataFrame(data=purchases_corr,columns=['Purchases']).sort_values('Purchases',ascending=False).reset_index()
corr_ndf.rename({'index':'Feature','Purchases':'Purchases_corr'},inplace=True)
display(corr_ndf)

小结:

  • Theme:已购买组的不同主题人数的占比基本上一样,且相关性系数为0.03,说明两者关系呈微弱正向相关但不显著。
  • Click Through Rate:未购买组和已购买组的点击率中位数分别为0.26和0.24,且相关性系数为-0.03,说明两者关系呈微弱负向相关但不显著。
  • Conversion Rate:未购买组和已购买组的转化率中位数分别为0.24和0.27,且相关性系数为0.05,说明两者关系呈微弱正向相关但不显著。
  • Bounce Rate:未购买组和已购买组的弹出率中位数分别为0.51和0.52,且相关性系数约为0,说明两者关系不显著。
  • Scroll_Depth:未购买组和已购买组的滚动深度中位数分别为50.36和51.40,且相关性系数约为0,说明两者关系不显著。
  • Age:未购买组和已购买组的年龄中位数均为42岁,且相关性系数约为0.01,说明两者关系不显著
  • Session_Duration:未购买组和已购买组的会话持续时间中位数分别15.38min和15.72min,且相关性系数为0.04,说明两者关系呈微弱正向相关但不显著。
  • Added_to_Cart:已购买组的加入购物车与否人数的占比分别为55.71%(Yes)和44.29%(No),且相关性系数为0.06,说明两者关系呈微弱正向相关但不显著。

鉴于数据集样本大小较大(1000),即使相关性系数较小,也可能在统计学上是显著的。为了进一步验证这一点,可以进行假设检验,例如使用t检验(对于连续变量)或卡方检验(对于分类变量)。
Added_to_Cart相对其他特征而言,对Purchases可能有一定的小影响。除此以外,其他特征对purchases的影响可以忽略。然而,值得注意的是,尽管这些相关性系数表明关系不显著,但在实际应用中,这些特征仍然可能具有一定的业务价值或营销策略上的意义。例如,即使是微弱的正相关性也可能提示营销团队关注这些特征作为潜在的增长点。

假设检验和卡方检验

# 使用P检验/T检验和卡方检验对比已购买与未购买在这这些特征上的均值差异
# 用KS检验方法判断流失与未流失在其特征变量上是否服从正态,如果服从正态则使用T检验否则使用U检验
def pur_analyze_features(data,features):
    results = pd.DataFrame(columns=['Feature','T_Stat','U_Stat','P_Val'])
    
    for feature in features:
        pur_data = data[data['Purchases']=='Yes'][feature]
        nopur_data = data[data['Purchases']=='No'][feature]
        
        # 将数组的分布和理论分布(norm)进行比较,返回ks统计量和p值
        ks_stat_pur,p_val_pur = stats.kstest(pur_data,'norm',args=(pur_data.mean(),pur_data.std()))
        ks_stat_nopur,p_val_nopur = stats.kstest(nopur_data,'norm',args=(nopur_data.mean(),nopur_data.std()))
        
        # p_val<0.05,表示拒绝该数组服从正态分布的原假设。且已购买组和未购买组只要任何一组不满足服从正态分布,那么该数据集只能使用U检验
        if p_val_pur<0.05 or p_val_nopur<0.05:
            # U检验
            u_stat,p_val = stats.mannwhitneyu(pur_data,nopur_data)
            t_stat = None
        else:
            # T检验
            t_stat,p_val = stats.ttest_ind(pur_data,nopur_data,equal_var=False)
            u_stat = None
    
        results = results._append({
            'Feature':feature,
            'T_Stat':t_stat,
            'U_Stat':u_stat,
            'P_Val':p_val
        },ignore_index = True)

    return results

# 卡方检验
def pur_chi_square_features(data,features):
    results = pd.DataFrame(columns=['Feature','Chi_Square','P_Val'])

    for feature in features:
        crosstab = pd.crosstab(data[feature],data['Purchases'])
        chi_square,p_val,dof,expected = stats.chi2_contingency(crosstab)
        results = results._append({
            'Feature':feature,
            'Chi_Square':chi_square,
            'P_Val':p_val
        },ignore_index=True)
        
    return results

pur_stat_df = pd.merge(con_stat_df,cat_stat_df,how='outer',on='Feature')
display(pur_stat_df)

小结:
由此可知,Added_to_Cart的P_Val_y约为0.049。添加到购物车行为在两组间有显著差异(p<0.05),其他所有特征在两组间没有显著的统计学差异。这表明Added_to_cart行为可能是影响购买决策的一个重要因素。

主题的影响因素分析

Theme与其他特征的相关性可视化分析

# 在不同主题下各个特征的中位数
flist1 = ['Click Through Rate', 'Conversion Rate', 'Bounce Rate','Scroll_Depth', 'Age','Session_Duration','Purchases','Added_to_Cart']
theme_fig = make_subplots(rows=2,cols=4,subplot_titles=[f'{f} Distribution' for f in flist1])
for i,f in enumerate(flist1):
    if f in ['Purchases','Added_to_Cart']:
        cat_groupby = ndf.groupby(['Theme',f])[f].count().reset_index(name='count')
        total_groupby = ndf.groupby('Theme')[f].count().reset_index(name='total')
        merge_groupby = total_groupby.merge(cat_groupby,on='Theme')
        merge_groupby['per'] = round(merge_groupby['count']/merge_groupby['total']*100,2)
        # display(merge_groupby)
        box_pic = px.bar(merge_groupby,x='Theme',y='per',barmode='stack',color=f)
    else:
        box_pic = px.box(ndf,x='Theme',y=f)
    theme_fig.add_trace(box_pic['data'][0],row=(i//4)+1,col=(i%4)+1)
theme_fig.update_layout(height=900,width=1000)        
theme_fig.show()

皮尔逊相关性分析

# 主题和其他特征的相关性
theme_corr = ndf.select_dtypes(include=[np.number]).corr()
theme_ndf = pd.DataFrame(data=theme_corr,columns=['Theme']).sort_values('Theme',ascending=False).reset_index()
theme_ndf.rename(columns={'index':'Feature','Theme':'Theme_corr'},inplace=True)
display(theme_ndf)

小结:

  • Click Through Rate:深色主题组和浅色主题组的点击率中位数分别0.27和0.24,且相关性系数为-0.06,说明两者关系呈微弱负向相关但不显著。
  • Conversion Rate:深色主题组和浅色主题组的转化率中位数分别为0.24和0.26,且相关性系数为0.02,说明两者关系呈微弱正向相关但不显著。
  • Bounce Rate:深色主题组和浅色主题组的弹出率中位数分别为0.53和0.50,且相关性系数为-0.04,说明两者关系呈微弱负向相关但不显著。
  • Scroll_Depth:深色主题组和浅色主题组的滚动深度中位数分别为50.02和51.50,且相关性系数为0.02,说明两者关系呈微弱正向相关但不显著。
  • Age:深色主题组和浅色主题组的年龄中位数分别为41岁和42岁,且相关性系数为0.02,说明两者关系呈微弱正向相关但不显著。
  • Session_Duration:深色主题组和浅色主题组的会话持续时间中位数分别为15.21min和15.87min,且相关性系数为0.01,说明两者关系呈微弱正向相关但不显著。
  • Purchases:深色主题组的购买与否人数占比分别为50.39%(Yse)和49.61%(No),浅色主题组的购买与否人数占比分别为53.09%(Yes)和46.91%(No),且相关性系数为0.03,说明两者关系呈微弱正向相关但不显著。
  • Added_to_Cart:深色主题组的加入购物车与否人数的占比分别为51.95%和48.05%,浅色主题组的加入购物车与否人数的占比分别为53.29%%(Yes)和46.71%(No),且相关性系数为0.06,说明两者关系呈微弱正向相关但不显著。

假设检验和卡方检验

# 使用T检验/U检验和卡方检验对比深色主题组和浅色主题组在这些特征上的均值差异
def theme_analyze_features(data,features):
    results = pd.DataFrame(columns=['Feature','T_Stat','U_Stat','P_Value'])

    for feature in features:
        dark_data = data[data['Theme']=='Dark Theme'][feature]
        light_data = data[data['Theme']=='Light Theme'][feature]

        ks_stat_dark,p_value_dark = stats.kstest(dark_data,'norm',args=(dark_data.mean(),dark_data.std()))
        ks_stat_light,p_value_light = stats.kstest(light_data,'norm',args=(light_data.mean(),light_data.std()))

        if p_value_dark<0.05 or p_value_light<0.05:
            u_stat,p_value = stats.mannwhitneyu(dark_data,light_data)
            t_stat = None
        else:
            t_stat,p_value = stats.ttest_ind(dark_data,light_data,equal_var=False)
            u_stat = None

        results = results._append({
            'Feature':feature,
            'T_Stat':t_stat,
            'U_Stat':u_stat,
            'P_Value':p_value
        },ignore_index=True)
        
    return results
theme_con_features = ['Click Through Rate', 'Conversion Rate', 'Bounce Rate', 'Scroll_Depth', 'Age', 'Session_Duration']
theme_con_stat_df = theme_analyze_features(df,theme_con_features)
display(theme_con_stat_df.sort_values('P_Value',ignore_index=True))

def theme_chi_square_features(data,features):
    results = pd.DataFrame(columns=['Feature','Chi_Square','P_Value'])

    for feature in features:
        crosstab = pd.crosstab(data[feature],data['Theme'])
        chi_square,p_value,dof,expected = stats.chi2_contingency(crosstab)

        results = results._append({
            'Feature':feature,
            'Chi_Square':chi_square,
            'P_Value':p_value
        },ignore_index=True)

    return results
theme_cat_features = ['Location','Purchases','Added_to_Cart']
theme_cat_stat_df = theme_chi_square_features(df,theme_cat_features)
display(theme_cat_stat_df.sort_values('P_Value',ignore_index=True))

theme_stat_df = pd.merge(theme_con_stat_df,theme_cat_stat_df,how='outer',on='Feature')
display(theme_stat_df)

小结:
由此可知,Click Through Rate的P_Val_y约为0.045。点击行为在两组间有显著差异(p<0.05),其他所有特征在两组间没有显著的统计学差异。这表明主题可能是影响点击率高低的一个重要因素。

总结

该线上书店网站的主题对用户点击率可能有一定的影响,尤其是深色主题可能是增加用户点击率的一个重要因素。但是对图书购买率没有显著性影响,而是否加入购物车可能是提高购买率的一个重要因素。点击率和是否购物车之间也没有显著性的相关,因此我认为深色主题可能最多会提高用户的参与度,而不是提高购买率的重要因素。至于如何提高购买率还需要更多数据来进行分析。

  • 13
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值