在进行站外流量复盘之前,必须先搭建好Python数据处理环境。本文基于Python 3.8+版本,使用Pandas进行数据清洗与计算,使用Openpyxl进行Excel报告导出。请确保你的终端已准备好,执行以下命令安装核心依赖库:
```bash pip install pandas numpy openpyxl matplotlib ```安装完成后,新建一个名为traffic_review.py的文件,我们将在这个文件中完成所有复盘逻辑。
为了确保你能直接运行代码验证逻辑,这里首先提供一段生成模拟站外流量日志的代码。在实际业务中,你可以将这部分替换为从数据库(如MySQL)或导出的CSV文件读取数据。模拟数据包含日期、来源渠道、会话ID、用户ID、行为类型及转化金额等关键字段。
```python import pandas as pd import numpy as np from datetime import datetime, timedelta 生成模拟数据 def generate_mock_data(): np.random.seed(42) dates = [datetime.now() - timedelta(days=x) for x in range(30, 0, -1)] data = [] channels = ['Google_Ads', 'Facebook', 'TikTok', 'Email_Newsletter', 'Organic'] for date in dates: 每天随机生成 500-1000 条流量数据 num_records = np.random.randint(500, 1000) for _ in range(num_records): channel = np.random.choice(channels, p=[0.3, 0.25, 0.2, 0.05, 0.2]) session_id = f"{date.strftime('%Y%m%d')}_{np.random.randint(1000, 9999)}" user_id = np.random.randint(10000, 50000) 模拟行为:view, click, purchase action = np.random.choice(['view', 'click', 'purchase'], p=[0.7, 0.2, 0.1]) revenue = 0.0 if action == 'purchase': revenue = np.random.uniform(50, 500) data.append({ 'date': date.strftime('%Y-%m-%d'), 'channel': channel, 'session_id': session_id, 'user_id': user_id, 'action': action, 'revenue': revenue }) df = pd.DataFrame(data) df.to_csv('raw_traffic.csv', index=False) print("模拟数据已生成:raw_traffic.csv") return df 首次运行生成数据,实际使用时请注释掉下面这行,直接读取文件 df = generate_mock_data() ```
站外流量数据最大的痛点在于来源标记混乱(如Facebook可能被标记为fb、FB、FaceBook等)。这一步我们将统一渠道命名,处理缺失值,并筛选出有效流量。
```python 读取数据 df = pd.read_csv('raw_traffic.csv') 1. 渠道名称标准化映射字典 channel_mapping = { 'fb': 'Facebook', 'FB': 'Facebook', 'FaceBook': 'Facebook', 'google': 'Google_Ads', 'gg': 'Google_Ads', 'tiktok': 'TikTok', 'tt': 'TikTok', 'email': 'Email_Newsletter' } 2. 应用映射转换,统一大小写后再映射 df['channel'] = df['channel'].str.lower().map(channel_mapping).fillna(df['channel'].str.capitalize()) 3. 去除关键字段为空的脏数据 df = df.dropna(subset=['session_id', 'user_id', 'channel']) 4. 日期格式转换,确保按时间排序 df['date'] = pd.to_datetime(df['date']) df = df.sort_values('date') print(f"清洗后数据量:{len(df)} 条") ```复盘的核心是计算各渠道的效能。这里我们采用末次点击归因模型,即转化的功劳归因于用户产生转化前最后一次接触的渠道。我们将计算PV、UV、转化数、转化率及ROI。
```python 1. 基础流量统计 traffic_stats = df[df['action'] == 'view'].groupby('channel').agg({ 'user_id': 'nunique', UV 'session_id': 'count' PV }).rename(columns={'user_id': 'UV', 'session_id': 'PV'}) 2. 转化数据提取 purchase_df = df[df['action'] == 'purchase'] 3. 获取每个转化用户对应的最后一次来源渠道(末次归因逻辑) 先按用户和时间排序,确保取最后一条 user_journey = df.sort_values(['user_id', 'date']).groupby('user_id').tail(1) 筛选出有转化的用户及其最后一次渠道 last_click_conversion = user_journey[user_journey['action'] == 'purchase'] 4. 计算转化指标 conversion_stats = last_click_conversion.groupby('channel').agg({ 'user_id': 'count', 转化单量 'revenue': 'sum' 总营收 }).rename(columns={'user_id': 'Conversions', 'revenue': 'Total_Revenue'}) 5. 合并流量与转化数据 report = pd.concat([traffic_stats, conversion_stats], axis=1).fillna(0) 6. 计算衍生指标 转化率 CVR = Conversions / UV report['CVR'] = (report['Conversions'] / report['UV'] 100).round(2) 客单价 AOV = Total_Revenue / Conversions (防止除以0) report['AOV'] = (report['Total_Revenue'] / report['Conversions']).replace([np.inf, -np.inf], 0).round(2) 假设各渠道成本(实际业务中需导入成本表,这里模拟一个固定成本率用于演示ROI) 假设 Google_Ads 成本是营收的 30%, Facebook 25%, TikTok 20%, Email 5%, Organic 0 cost_rate = { 'Google_Ads': 0.3, 'Facebook': 0.25, 'TikTok': 0.2, 'Email_Newsletter': 0.05, 'Organic': 0.0 } report['Cost'] = report.index.map(cost_rate) report['Total_Revenue'] ROI = (Revenue - Cost) / Cost report['ROI'] = ((report['Total_Revenue'] - report['Cost']) / report['Cost']).replace([np.inf, -np.inf], 0).round(2) 重新排列列顺序,方便阅读 final_report = report[['PV', 'UV', 'Conversions', 'CVR', 'Total_Revenue', 'Cost', 'ROI']] ```最后一步是将计算好的结果输出为Excel文件,并包含简单的趋势分析,方便非技术人员查看。我们将使用Pandas的ExcelWriter功能,并添加条件格式高亮显示低效渠道。
```python 定义输出文件名 output_file = '站外流量复盘报告.xlsx' 写入Excel with pd.ExcelWriter(output_file, engine='openpyxl') as writer: 1. 写入汇总数据 final_report.to_excel(writer, sheet_name='渠道汇总复盘') 2. 写入每日趋势数据(辅助分析波动) daily_trend = df.groupby(['date', 'channel']).agg({ 'action': 'count', 'revenue': 'sum' }).rename(columns={'action': 'Actions', 'revenue': 'Daily_Revenue'}) daily_trend.to_excel(writer, sheet_name='每日趋势明细') print(f"复盘报告已生成:{output_file}") 简单的控制台分析建议 print("\n【复盘诊断建议】") 找出ROI低于1的付费渠道 low_roi_channels = final_report[(final_report['ROI'] < 1) & (final_report.index != 'Organic')] if not low_roi_channels.empty: print("警告:以下付费渠道 ROI < 1,建议暂停投放或优化素材:") print(low_roi_channels.index.tolist()) else: print("所有付费渠道 ROI 均健康。") 找出转化率最高的渠道 best_cvr_channel = final_report['CVR'].idxmax() print(f"提示:当前转化率最高的渠道是:{best_cvr_channel},建议扩大该渠道预算。") ```上述代码可以直接复制到本地Python环境中运行。在实际对接生产环境时,需注意以下三个技术细节,避免数据口径偏差:
df = df[df['date'] >= '2023-10-01']。user_id进行归因。如果用户在手机端浏览、PC端购买,且后端未打通User ID,会导致归因失效。生产环境建议引入Device ID映射或使用Google Analytics 4的User ID探索功能。User-Agent包含"bot"、"crawl"、"spider"的记录,以免虚高PV数据误导决策。易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图