如何用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
相关产品推荐
相关产品推荐

