1.TURF分析简介
TURF分析(Total Unduplicated Reach and Frequency)是累计净到达率和频次分析的简称。最初被应用于媒介研究领域。典型应用场景是,在既定条件下,例如预算等资源限制或就当前实施的媒体组合投放计划,哪些渠道组合能让广告投放达到最高的到达率。
- T 总计
- U 不重复,删除重复的样本
- R 到达率,计算不重复的样本
- F 频次,计算各样本的重要性
2.TURF分析使用范围
2.1 可以应用的场景
1、什么样的广告投放组合,可以触达最大用户人群?
2、产品应该投放到哪些渠道才能最大范围覆盖潜在消费者?
3、产品线、口味、包装的最佳组合方式是什么?
4、哪种促销活动组合能尽可能吸引最大消费群?
2.2 使用条件
- 多选情形:必须存在多选才有意义。
- 全样本回答:需要所有样本进行回答。
- 样本量要求:TURF 通常需要较大的样本量,推荐使用配额抽样。
- 互斥行为:删除重复样本的前提是被访者的行为是互斥的。
- 结果保留:通常需要提前确定吸引最多消费者的促销组合具体包含几个促销计划。
3.python中实现TURF分析
在python中实现其实是一件比较容易的事情,但实际在处理过程中可能会遇到统计上的问题,尤其是两两组合,甚至多个组合进行统计的情况。
3.1 输入数据
输入的数据格式截图举例:
数据的值需为0或1,不允许出现其他值;
一个用户可以多选,比如用户4会同时接触到广告1和广告3。
3.2 核心代码
核心代码主要是组合的生成,以下为对应的代码:
import itertools
cols=['广告1', '广告2', '广告3', '广告4', '广告5', '广告6']
#按照两两组合生成列表
list(itertools.combinations(cols,2))
3.3 整体代码
import itertools
import numpy as np
import pandas as pd
def TURF_tool(input_df,cols,max_cbts=10):
'''生成TURF分析结果,input_df为标准输入的dataframe,cols为需要进行组合的列名,需要为可迭代对象;max_cbts用于控制最大的组合数量'''
#先生成组合方式,此处生成所有组合,实际调用时通过max_cbts来控制
combinations=[]
for i in range(len(cols)):
combine=list(itertools.combinations(cols,i+1))
combinations.append(combine)
#统计以上结果,并进行汇总
#将对应数据选出,然后对所有列进行all处理,然后利用sum求和计算出符合条件的数量,如df.loc[:,list(combinations[1][0])].all(axis=1).sum()
# df.loc[:,list(combinations[1][0])]
combine_list=[]
for i in range(max_cbts):
print("正在计算第{}种组合\n".format(i+1))
temp=combinations[i]
temp_length= len(combinations[i])
for j in range(temp_length):
statis_dict={}
#提取组合方式,为可迭代对象
combine_cols=combinations[i][j]
# 按照组合形式,进行统计结果
#计算到达数
count_combine=input_df.loc[:,combine_cols].any(axis=1).sum()
#计算频数,即累计数量
acuum_combine=input_df.loc[:,combine_cols].sum().sum()
statis_dict['组合']=combine_cols
statis_dict['组合数']= i+1
statis_dict['到达数']=count_combine
statis_dict['频数']=acuum_combine
combine_list.append(statis_dict)
combine_result=pd.DataFrame(combine_list)
#得出总数
# combine_result['总数']=input_df.loc[:,cols].any(axis=1).sum()
combine_result['总数']=len(input_df)
#计算到达率
combine_result['到达率']=combine_result['到达数']/combine_result['总数']
#计算频率
combine_result['频率']=combine_result['频数']/combine_result['频数'].max()
#进行排序
combine_result=combine_result.sort_values('到达率',ascending=False)
return combine_result
注意事项:
-
数据格式要求: 输入数据值应为 0 或 1,代表未选择或选择的情况,确保数据的一致性和准确性。
-
样本数量: 建议在进行 TURF 分析时保证足够大的样本量,以获得可靠的结果。
-
组合种类控制: 通过cols可以控制输入的组合类型,如果cols的数量过大可能会造成计算效率低下的问题,因此在使用时候可以考虑预先进行筛选,使其能够控制在一定范围之内,或者子集抽样,硬件升级等。
-
组合数量控制: 通过 max_cbts 参数可以控制最大的组合数量,确保结果的可管理性和易读性。