You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现多变量组合的营销营收同比波动归因分析?

绝对可行!用Python自动化所有变量组合的营收YoY波动计算

作为营销分析新手,手动逐个分析变量效率低太正常了——用Python完全能帮你把这个流程自动化,一次性生成所有变量组合的营收同比(YoY)波动结果,下面是具体的实现思路和代码:

一、准备工具

首先确保你安装了pandas(处理数据的核心库),itertools是Python自带的工具库,用来生成变量组合,不用额外安装:

pip install pandas

二、数据预处理

先把原始数据整理成pandas可处理的格式,重点是把带$的营收转换成数值,方便后续计算:

import pandas as pd
from itertools import combinations

# 替换成你自己的数据集即可
data = pd.DataFrame({
    'age': ['10-20', '20-30', '10-20', '20-30'],
    'sex': ['Male', 'Female', 'Male', 'Male'],
    'business_unit': ['unit_1', 'unit_2', 'unit_1', 'unit_2'],
    'year': [2018, 2019, 2019, 2020],
    'month': [1, 2, 1, 2],
    'revenue': ['$100', '$250', '$50', '$200'],
    'name': ['chloe', 'arnold', 'chloe', 'arnold']
})

# 把带$的营收字符串转成数值类型
data['revenue'] = data['revenue'].str.replace('$', '').astype(float)

三、生成所有变量组合

我们需要生成除year、month、revenue、name之外的特征列的所有非空组合(从单个变量到多变量的所有搭配):

# 定义需要分析的特征列,根据你的数据集调整
feature_cols = ['age', 'sex', 'business_unit']

# 生成1个、2个、3个变量的所有组合
all_combinations = []
for i in range(1, len(feature_cols)+1):
    all_combinations.extend(combinations(feature_cols, i))

四、计算每个组合的YoY波动

遍历每个变量组合,按「组合列+年份」分组计算总营收,再算出同比变化:

# 存储所有结果的列表
results = []

for combo in all_combinations:
    # 按变量组合 + 年份分组,计算每年的总营收
    grouped = data.groupby(list(combo) + ['year'])['revenue'].sum().reset_index()
    
    # 按变量组合排序,保证年份是递增顺序
    grouped = grouped.sort_values(by=list(combo) + ['year'])
    
    # 计算YoY变化:当前年份营收 - 上一年营收
    grouped['yoy_change'] = grouped.groupby(list(combo))['revenue'].diff()
    
    # 过滤掉没有上一年数据的行(第一年无法计算YoY)
    grouped = grouped.dropna(subset=['yoy_change'])
    
    # 转换成你想要的输出格式
    for _, row in grouped.iterrows():
        # 拼接变量组合的取值
        combo_vals = ' '.join([str(row[col]) for col in combo])
        # 格式化YoY金额(负数显示为-$XX)
        yoy_formatted = f"${row['yoy_change']:.0f}" if row['yoy_change'] >=0 else f"-${abs(row['yoy_change']):.0f}"
        results.append(f"{combo_vals} revenue {yoy_formatted} year over year")

# 打印所有结果
for res in results:
    print(res)

运行后会得到类似这样的输出(对应示例数据):

10-20 revenue -$50 year over year
20-30 revenue -$50 year over year
Male revenue -$50 year over year
Female revenue $0 year over year
unit_1 revenue -$50 year over year
unit_2 revenue -$50 year over year
10-20 Male revenue -$50 year over year
10-20 unit_1 revenue -$50 year over year
Male unit_1 revenue -$50 year over year
20-30 Female revenue $0 year over year
20-30 unit_2 revenue -$50 year over year
Male unit_2 revenue -$50 year over year
10-20 Male unit_1 revenue -$50 year over year
20-30 Female unit_2 revenue $0 year over year
20-30 Male unit_2 revenue -$50 year over year

五、额外优化建议

  • 如果数据集很大(百万级行),可以用dask替代pandas,提升处理速度;
  • 可以把结果保存成CSV文件方便后续分析:pd.DataFrame(results, columns=['result']).to_csv('yoy_results.csv', index=False);
  • 要是需要同比增长率(而非绝对金额),把diff()换成pct_change(),再转成百分比格式即可。

内容的提问来源于stack exchange,提问作者Felipe Ribeiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:57:53