关于网站流量数据集的探索
import pandas as pd
import plotly.express as px
import plotly.graph_objects as go
import plotly.subplots as sp
import matplotlib.pyplot as plt
import seaborn as sns
file_path = '/home/mw/input/webs4651/website_wata.csv'
data = pd.read_csv(file_path)
data.head()
Step 01. 描述性统计分析
desc_stats = data.describe()
desc_stats
根据描述性统计分析和可视化结果,我们可以得出以下小结:
页面浏览量 (Page Views):
平均值为4.95,中位数为5,这表明大多数页面的浏览量接近5次。页面浏览量的分布相对均匀,大部分数据集中在较低的浏览量上。会话持续时间 (Session Duration):
平均值为3.02分钟,但标准差较大,为3.10分钟,这表明会话持续时间在用户之间有较大的差异。数据呈现出右偏分布,意味着大多数会话持续时间较短,但有少数会话持续时间较长。跳出率 (Bounce Rate):
平均值为0.28,中位数为0.266,这表明大约有28%的访问者在查看单个页面后离开了网站。数据分布相对均匀,大部分数据集中在较低的跳出率上。页面逗留时间 (Time on Page):
平均值为4.03分钟,标准差为2.89分钟,这表明用户在页面上的逗留时间也有较大的差异。数据呈现出右偏分布,意味着大多数用户在页面上的逗留时间较短,但有少数用户逗留时间较长。以前的访问 (Previous Visits):
平均值为1.98次,这表明大多数用户之前访问过该网站。数据分布相对均匀,大部分用户之前访问过1到3次。转化率 (Conversion Rate):
平均值为0.98,中位数为1.00,这表明大多数访问者都完成了预期的转化行为。数据分布相对均匀,大部分数据集中在1.00,表明高转化率。Step 02. 流量来源分析
分析不同流量来源(如Organic, Social, Paid等)的页面浏览量、跳出率、会话持续时间和转化率。
比较不同流量来源的用户参与度和转化效果。
grouped_by_source = data.groupby('Traffic Source').agg({
'Page Views': ['mean', 'std'],
'Session Duration': ['mean', 'std'],
'Bounce Rate': ['mean', 'std'],
'Conversion Rate': ['mean', 'std']
})
grouped_by_source
# 创建子图网格
rows = 2
cols = 2
fig = sp.make_subplots(rows=rows, cols=cols,
subplot_titles=[
'每个流量来源的平均页面浏览量',
'每个流量来源的平均会话时长',
'每个流量来源的平均跳出率',
'每个流量来源的平均转化率'
],
vertical_spacing=0.15)
# 定义条形图数据
bar_traces = {
'Page Views': go.Bar(x=data['Traffic Source'], y=data['Page Views'], name='页面浏览量'),
'Session Duration': go.Bar(x=data['Traffic Source'], y=data['Session Duration'], name='会话时长'),
'Bounce Rate': go.Bar(x=data['Traffic Source'], y=data['Bounce Rate'], name='跳出率'),
'Conversion Rate': go.Bar(x=data['Traffic Source'], y=data['Conversion Rate'], name='转化率')
}
# 将数据添加到相应的子图
fig.add_trace(bar_traces['Page Views'], row=1, col=1)
fig.add_trace(bar_traces['Session Duration'], row=1, col=2)
fig.add_trace(bar_traces['Bounce Rate'], row=2, col=1)
fig.add_trace(bar_traces['Conversion Rate'], row=2, col=2)
# 更新坐标轴和布局
fig.update_xaxes(title_text='流量来源', row=1, col=1)
fig.update_yaxes(title_text='平均页面浏览量', row=1, col=1)
fig.update_xaxes(title_text='流量来源', row=1, col=2)
fig.update_yaxes(title_text='平均会话时长(分钟)', row=1, col=2)
fig.update_xaxes(title_text='流量来源', row=2, col=1)
fig.update_yaxes(title_text='平均跳出率', row=2, col=1)
fig.update_xaxes(title_text='流量来源', row=2, col=2)
fig.update_yaxes(title_text='平均转化率', row=2, col=2)
# 更新布局
fig.update_layout(
title_text='流量来源分析',
height=800,
# width=1000,
showlegend=False,
template='plotly_white'
)
fig.show()
根据流量来源的分析结果,我们可以得出以下小结:
页面浏览量 (Page Views):
不同流量来源的平均页面浏览量大致相似,其中Organic来源略高。这些来源之间的差异不大,表明不同来源的访客在浏览网站页面数量上相似。会话持续时间 (Session Duration):
不同流量来源的会话持续时间存在一定差异,其中Direct来源的平均会话持续时间最短,而Referral来源的平均会话持续时间最长。这表明Direct来源的访客可能更倾向于快速浏览或寻找特定信息,而Referral来源的访客可能更倾向于深入探索网站内容。跳出率 (Bounce Rate):
不同流量来源的跳出率也有所差异,其中Social来源的跳出率最高,而Referral来源的跳出率最低。这可能表明Social来源的访客更可能是一次性浏览,而Referral来源的访客更可能对网站内容感兴趣。转化率 (Conversion Rate):
不同流量来源的转化率相近,但Referral来源的转化率略高。这表明Referral来源的访客更有可能完成转化目标,可能是由于这些访客对网站内容有较高的兴趣或需求。综合这些指标,我们可以看到不同流量来源对网站的用户参与度和转化效果有不同影响。例如,虽然Social来源的访客可能会产生较高的跳出率,但它们也可能带来较高的流量。而Referral来源的访客可能对网站内容有更深入的兴趣,从而产生较高的转化率。
Step 03. 用户参与度分析
分析页面浏览量、会话持续时间和页面逗留时间之间的关系。
研究跳出率与页面逗留时间之间的关系
# Page Views(页面浏览量)与 Session Duration(会话时长)的散点图
fig1 = px.scatter(
data, x='Page Views', y='Session Duration',
title='页面浏览量 vs 会话时长',
labels={'x': '页面浏览量', 'y': '会话时长(分钟)'},
opacity=0.5 # 设置点的透明度
)
fig1.show() # 显示图表
# Page Views(页面浏览量)与 Time on Page(页面停留时间)的散点图
fig2 = px.scatter(
data, x='Page Views', y='Time on Page',
title='页面浏览量 vs 页面停留时间',
labels={'x': '页面浏览量', 'y': '页面停留时间(分钟)'},
opacity=0.5 # 设置点的透明度
)
fig2.show() # 显示图表
# Bounce Rate(跳出率)与 Time on Page(页面停留时间)的散点图
fig3 = px.scatter(
data, x='Bounce Rate', y='Time on Page',
title='跳出率 vs 页面停留时间',
labels={'x': '跳出率', 'y': '页面停留时间(分钟)'},
opacity=0.5 # 设置点的透明度
)
fig3.show() # 显示图表
#关系概述
#页面浏览量与会话持续时间
session_duration_vs_page_views = data.groupby('Page Views').agg({
'Session Duration': ['mean', 'std']
})
session_duration_vs_page_views.head(5)
#页面浏览量与页面停留时间
time_on_page_vs_page_views = data.groupby('Page Views').agg({
'Time on Page': ['mean', 'std']
})
time_on_page_vs_page_views.head(5)
#跳出率与页面停留时间
bounce_rate_vs_time_on_page = data.groupby('Time on Page').agg({
'Bounce Rate': ['mean', 'std']
})
bounce_rate_vs_time_on_page.head(5)
根据用户参与度的分析结果,我们可以得出以下小结:
页面浏览量与会话持续时间的关系:
随着页面浏览量的增加,平均会话持续时间呈现出先增加后减少的趋势。这表明访问多个页面的用户通常会花费更多的时间在网站上,但当页面浏览量超过一定数量后,会话持续时间可能会下降。页面浏览量与页面逗留时间的关系:
随着页面浏览量的增加,平均页面逗留时间也呈现出先增加后减少的趋势。这与会话持续时间的趋势相似,表明当用户访问更多页面时,他们在每个页面上花费的时间可能会减少。跳出率与页面逗留时间的关系:
随着页面逗留时间的增加,平均跳出率呈现出先减少后增加的趋势。这表明当用户在网站上花费更多时间时,跳出率可能会降低,但当逗留时间过长时,跳出率可能会增加。这可能是因为长时间逗留可能意味着用户在寻找特定信息或感到不满意。这些分析结果可以帮助我们理解用户在网站上的行为模式和参与程度。例如,我们可以看到,尽管访问更多页面的用户通常会花费更多时间在网站上,但这并不意味着他们会更倾向于深入探索网站内容。
Step 04. 回头客行为分析
分析之前访问次数与页面浏览量、会话持续时间等之间的关系。
研究回头客的转化率与新访客的转化率差异。
# 数据聚合
grouped_by_visits = data.groupby('Previous Visits').agg({
'Page Views': ['mean', 'std'],
'Session Duration': ['mean', 'std'],
'Bounce Rate': ['mean', 'std'],
'Conversion Rate': ['mean', 'std']
}).reset_index()
# 扁平化列名
grouped_by_visits.columns = ['Previous Visits', 'Page Views Mean', 'Page Views Std',
'Session Duration Mean', 'Session Duration Std',
'Bounce Rate Mean', 'Bounce Rate Std',
'Conversion Rate Mean', 'Conversion Rate Std']
# 使用 Plotly 进行可视化
fig = go.Figure()
# 页面浏览量
fig.add_trace(go.Bar(
x=grouped_by_visits['Previous Visits'],
y=grouped_by_visits['Page Views Mean'],
name='平均页面浏览量',
marker_color='royalblue'
))
# 会话时长
fig.add_trace(go.Bar(
x=grouped_by_visits['Previous Visits'],
y=grouped_by_visits['Session Duration Mean'],
name='平均会话时长',
marker_color='lightgreen'
))
# 跳出率
fig.add_trace(go.Bar(
x=grouped_by_visits['Previous Visits'],
y=grouped_by_visits['Bounce Rate Mean'],
name='平均跳出率',
marker_color='salmon'
))
# 转化率
fig.add_trace(go.Bar(
x=grouped_by_visits['Previous Visits'],
y=grouped_by_visits['Conversion Rate Mean'],
name='平均转化率',
marker_color='gold'
))
fig.update_layout(
title='重复访客行为分析',
xaxis_title='重复访问次数',
yaxis_title='数值',
barmode='group',
template='plotly_white'
)
fig.show()
根据回头客行为的分析结果,我们可以得出以下小结:
之前访问次数与页面浏览量的关系:
随着之前访问次数的增加,平均页面浏览量呈现出先增加后减少的趋势。这表明回头客通常会访问更多的页面,但当访问次数超过一定数量后,页面浏览量可能会减少。之前访问次数与会话持续时间的的关系:
随着之前访问次数的增加,平均会话持续时间也呈现出先增加后减少的趋势。这与会话持续时间的趋势相似,表明当回头客访问更多页面时,他们在网站上花费的时间可能会减少。之前访问次数与跳出率的关系:
随着之前访问次数的增加,平均跳出率呈现出先减少后增加的趋势。这表明回头客的跳出率可能会低于新访客,但当访问次数过多时,跳出率可能会增加。之前访问次数与转化率的关系:
随着之前访问次数的增加,平均转化率呈现出先增加后减少的趋势。这表明回头客的转化率可能会高于新访客,但当访问次数过多时,转化率可能会降低。这些分析结果可以帮助我们理解回头客的行为模式和他们对网站的参与程度。例如,我们可以看到,尽管回头客通常会访问更多的页面,但这并不意味着他们会更倾向于深入探索网站内容或完成转化目标。
Step 05. 异常值和离群点分析
识别数据中的异常值和离群点,分析其可能的原因和影响。
import scipy.stats as stats
# 使用IQR方法检测异常值
def detect_outliers(df, columns):
outliers = {}
for column in columns:
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
outliers[column] = df[(df[column] < lower_bound) | (df[column] > upper_bound)]
return outliers
# 定义分析的列
columns_to_analyze = ['Page Views', 'Session Duration', 'Bounce Rate', 'Time on Page']
# 检测异常值
outliers = detect_outliers(data, columns_to_analyze)
# 可视化异常值
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(15, 10))
# 页面浏览量
axes[0, 0].hist(data['Page Views'], bins=30, edgecolor='k', alpha=0.7)
axes[0, 0].axvline(x=outliers['Page Views'].iloc[0]['Page Views'], color='r', linestyle='dashed', linewidth=1)
axes[0, 0].axvline(x=outliers['Page Views'].iloc[1]['Page Views'], color='r', linestyle='dashed', linewidth=1)
axes[0, 0].set_title('页面浏览量分布与异常值')
axes[0, 0].set_xlabel('页面浏览量')
axes[0, 0].set_ylabel('频率')
# 会话时长
axes[0, 1].hist(data['Session Duration'], bins=30, edgecolor='k', alpha=0.7)
axes[0, 1].axvline(x=outliers['Session Duration'].iloc[0]['Session Duration'], color='r', linestyle='dashed', linewidth=1)
axes[0, 1].axvline(x=outliers['Session Duration'].iloc[1]['Session Duration'], color='r', linestyle='dashed', linewidth=1)
axes[0, 1].set_title('会话时长分布与异常值')
axes[0, 1].set_xlabel('会话时长(分钟)')
axes[0, 1].set_ylabel('频率')
# 跳出率
axes[1, 0].hist(data['Bounce Rate'], bins=30, edgecolor='k', alpha=0.7)
axes[1, 0].axvline(x=outliers['Bounce Rate'].iloc[0]['Bounce Rate'], color='r', linestyle='dashed', linewidth=1)
axes[1, 0].axvline(x=outliers['Bounce Rate'].iloc[1]['Bounce Rate'], color='r', linestyle='dashed', linewidth=1)
axes[1, 0].set_title('跳出率分布与异常值')
axes[1, 0].set_xlabel('跳出率')
axes[1, 0].set_ylabel('频率')
# 页面停留时间
axes[1, 1].hist(data['Time on Page'], bins=30, edgecolor='k', alpha=0.7)
axes[1, 1].axvline(x=outliers['Time on Page'].iloc[0]['Time on Page'], color='r', linestyle='dashed', linewidth=1)
axes[1, 1].axvline(x=outliers['Time on Page'].iloc[1]['Time on Page'], color='r', linestyle='dashed', linewidth=1)
axes[1, 1].set_title('页面停留时间分布与异常值')
axes[1, 1].set_xlabel('页面停留时间(分钟)')
axes[1, 1].set_ylabel('频率')
plt.tight_layout()
plt.show()
在进行异常值和离群点分析时,我们使用了IQR(四分位距)方法来检测数据集中的异常值。以下是针对所选列的分析结果:
页面浏览量 (Page Views):
数据分布显示了一些异常值,这些异常值在图中用红色虚线标出。这些异常值可能是由于数据录入错误、测量错误或其他异常情况造成的。会话持续时间 (Session Duration):
数据分布同样显示了一些异常值,这些异常值在图中用红色虚线标出。这些异常值可能是由于数据录入错误、测量错误或其他异常情况造成的。跳出率 (Bounce Rate):
数据分布显示了一些异常值,这些异常值在图中用红色虚线标出。这些异常值可能是由于数据录入错误、测量错误或其他异常情况造成的。页面逗留时间 (Time on Page):
数据分布显示了一些异常值,这些异常值在图中用红色虚线标出。这些异常值可能是由于数据录入错误、测量错误或其他异常情况造成的。