渠道归因(一)传统渠道归因

news2024/11/27 6:11:23

渠道归因(一)传统渠道归因

小P:小H,我又来了。。。最近在做ROI数据,但是有个问题。。。

小H:什么问题,不就是收入/成本吗?

小P:是的,每个渠道的成本很容易计算,但是收入就有点问题了。

小H:是不是不知道怎么分配啊?

小P:不愧是你,对的,用户在付费前经历过很多渠道,我感觉把收入分给谁都不好说

小H:这个也不复杂,关于渠道归因的方式有很多种,比如传统渠道归因、基于马尔可夫链、基于shapley value甚至是基于Attention-RNN深度学习。

说到渠道归因,那最容易想到的就是传统的渠道归因,这种方法一般是基于业务决策的。

首次归因:首次点击渠道赋予全部转化

末次归因:末次点击渠道赋予全部转化

线性(平均)归因:每个渠道均分转化

位置归因:自定义位置的权重,一般首位占50%,其余为0

时间衰减归因:距离转化的时间越短的渠道,可以获得越多的功劳权重,权重自定义

首次/末次/线性归因

# pip install Cython
# pip install ChannelAttribution
import pandas as pd
from ChannelAttribution import *
Looking for attribution at path level? Try markov_model_local_api() or ask for ChannelAttributionPro at info@channelattribution.io! Visit https://channelattribution.io for more information.
Version: 2.1.3

本文所有数据如果有需要的同学可关注公众号HsuHeinrich,回复【数据挖掘-渠道归因】自动获取~

Data = pd.read_csv('./Markov/Data.csv',sep=";")
Data.head() 

数据格式要求:

path:转化路径,以>连接

total_conversions:累计转化次数

total_conversion_value:累计转化收益

total_null:累计未转化次数

pathtotal_conversionstotal_conversion_valuetotal_null
0eta > iota > alpha > eta10.2443
1iota > iota > iota > iota23.1956
2alpha > iota > alpha > alpha > alpha > iota > ...26.7546
3beta > eta12.4023
4iota > eta > theta > lambda > lambda > theta >...00.0002
# 传统启发式算法计算各渠道转化次数和转化收益
# first_touch:首次点击模型;last_touch:末尾点击模型;linear_touch:线性(平均)点击模型
heuristic_models(Data,"path","total_conversions", var_value='total_conversion_value')

image-20230206153920384

位置归因

# 自定义位置归因函数,设置首尾权重各50%
def posAttribution(df, path, conversions):
    '''
    df:数据集
    path:用户旅程路径
    conversions:成功转化次数
    '''
    df=df.copy()
    df['leng']=df[path].map(lambda x: len(x.split(">")))
    df['first_touch']=df[path].map(lambda x: [x.strip() for x in x.split(">")][0])
    df['last_touch']=df[path].map(lambda x: [x.strip() for x in x.split(">")][-1])

    df['first_touch_conversions']=df[['leng',conversions]].apply(
        lambda x: x[conversions]*1 if x['leng']==1 else x[conversions]*0.5, axis=1)
    df['last_touch_conversions']=df[['leng',conversions]].apply(
        lambda x: 0 if x['leng']==1 else x[conversions]*0.5, axis=1)

    df1=df.groupby(['first_touch'])['first_touch_conversions'].sum()
    df2=df.groupby(['last_touch'])['last_touch_conversions'].sum()
    df_f=pd.merge(df1, df2, left_index=True, right_index=True, how = 'outer').reset_index()
    df_f['first_last_touch_conversions']=df_f['first_touch_conversions']+df_f['last_touch_conversions']
    df_f.drop(['first_touch_conversions','last_touch_conversions'], axis=1, inplace=True)
    
    return df_f
# 位置归因(首尾归因)
posAttribution(Data,"path","total_conversions")
first_touchfirst_last_touch_conversions
0alpha7377.5
1beta1910.0
2delta3.0
3epsilon315.0
4eta3665.5
5gamma128.5
6iota3980.5
7kappa152.0
8lambda1054.5
9mi2.0
10theta1129.5
11zeta67.0

时间衰减归因

from sklearn.preprocessing import StandardScaler, MinMaxScaler 
from pandas.api.types import is_string_dtype, is_numeric_dtype
import warnings
import pandas as pd
# 读取数据 数据为自定义的
df=pd.read_excel('datas.xlsx')
df.head()

image-20230206153945877

# 自定义时间衰减归因 衰减权重为半衰。例如1->2,则1的权重是66.6%;1->2->3,则1的权重是50%,2的权重是33.3%
def lapsAttribution(df, path, conversions, last_time_lapse):
    def scum(l):
        s=0
        for i in range(1, len(l)+1):
            s+=i
        return s
    
    def lw(l):
        lw=[]
        n=scum(l)
        for i in range(1, len(l)+1):
            lw.append(1/n*i)
        return lw

    df['last_time_sp']=df[last_time_lapse].map(lambda x: str(x).split('>'))
    df['path_sp']=df[path].map(lambda x: [x.strip() for x in x.split(">")])
    df['lts_w']=df['last_time_sp'].map(lambda x:lw(x))
    df['conversions_sp']=df[[conversions,'lts_w']].apply(
            lambda x: [i*x[conversions] for i in x['lts_w']], axis=1)
    
    laps_touch=[]
    conversions_all=[]
    for i in df[['path_sp', 'conversions_sp']].values:
        for m in zip(i[0],i[1]):
            laps_touch.append(m[0])
            conversions_all.append(m[1])

    df_temp=pd.DataFrame({'laps_touch':laps_touch, 'laps_touch_conversions':conversions_all})
    df_f=df_temp.groupby(['laps_touch'])['laps_touch_conversions'].sum().reset_index()
    
    return df_f
lapsAttribution(df, 'path', 'total_conversions', 'last_time_lapse')
laps_touchlaps_touch_conversions
0alpha0.300000
1beta1.333333
2eta2.833333
3iota13.033333
4kappa0.500000

总结

传统渠道归因还是需要依据业务决定的,只要你能说服业务按照其中一种方式进行收入分配,那到这一步基本就够了。实际上,传统的渠道归因是易于理解、好操作、结果接受程度高的~

共勉~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于html+css的图展示134

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

如何打造创意百变的虚拟直播场景?

场景对于直播来说是直接呈现给观众的,也是直播带货的“直接”的视觉冲击的价值核心,所以场景的设计十分重要。今天,我们就一起来看看如何低成本搭建一个网红同款直播间吧! 直播间类型 直播间大体可以分为三种类型:虚拟…

CUDA共享内存详解

为什么需要共享内存? 共享内存的访问速度比访问全局速度快的多,因此对于多次访问全局内存的程序,特别是需要多次将全局内存的运算结果缓存到全局内存的运算,先将临时结果缓存到共享内存再做计算,会提高运算速度。 1、…

C语言使用Wininet库网络编程跳坑记 —— cookies篇

笔者尝试C语言使用Wininet库进行网络编程时,我尝试使用 InternetSetCookieA() 或 HttpAddRequestHeadersA() 设置 cookie。 HttpAddRequestHeadersA(Request, headers, header_len, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE); InternetSetCookieA(url, NU…

基于SpringBoot+Vue的电影分享平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 当代社会,…

Linux(环境准备)VMware与CentOS及XShell的安装

目录 第 1 章 VMware 1.1 VMware 安装 1.1.1 VMware Workstation Pro 15.5 安装包 ​1.2.2 欢迎界面 1.2.3 同意许可证 1.2.4 选择安装路径 1.2.5 用户体检计划 1.2.6 快捷方式 1.2.7 开始安装 1.2.8 等待安装完成 1.2.9 安装完成 1.2.10 输入许可证 1.2.11 VM…

工欲善其事,必先利其器--Vscode嵌入式Linux开发远程开发设置(适用于多平台)

点击上方“嵌入式应用研究院”,选择“置顶/星标公众号” 干货福利,第一时间送达! 来源 | 嵌入式应用研究院 整理&排版 | 嵌入式应用研究院 最近搭了一台Ubuntu18.04版本的桌面PC,不得不说比起Window搭虚拟机搞起来爽多了&…

python文件首行

类似于一切脚本文件一样,首行可用于指定解释器用于执行文件; 常见的是linux系统下的各个解释器。比如: #!/bin/sh– 使用Bourne shell或兼容的 shell执行文件,假定位于 /bin 目录中#!/bin/bash– 使用Bash shell执行文件#!/usr/…

会声会影如何抠图换背景 会声会影抠图后人物变透明

抠图换背景,大家可能会在图片编辑上应用得比较多。实际上,视频也能通过抠图的方式换背景,其困难程度与背景类型有关。纯色背景会比较简单,非纯色背景会比较难,接下来,一起来看看会声会影如何抠图换背景&…

Cocos Creator3D:制作可任意拉伸的 UI 图像

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 制作可任意拉伸的 UI 图像 UI 系统核心的设计原则是能够自动适应各种不同的设备屏幕尺寸,因此我们在制作 UI 时需要正确设置每个控件元素的尺寸(size&#…

java项目之病人跟踪治疗信息管理系统(ssm+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的病人跟踪治疗信息管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…

【C语言复习】第五篇、关于C语言变量,常量,字符串,转义字符的知识

目录 第一部分、关于变量 1、什么是变量?变量的分类? 2、变量的作用域?变量的生命周期? 第二部分、关于常量 1、什么是常量? 2、如何定义常量? 第三部分、关于字符串 1、什么是字符串? …

2023年春季学期NLP总结作业

自然语言处理(Natural Language Processing,NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。自然语言处理是计算机科学领域与人工智能领域中的一个重要方向…

【网络原理】TCP连接管理机制(三次握手四次挥手)

🥊作者:一只爱打拳的程序猿,Java领域新星创作者,CSDN、阿里云社区优质创作者。 🤼专栏收录于:计算机网络原理 在使用TCP协议进行网络交互时,TCP会进行三次握手即建立连接,TCP四次挥手…

Stable Diffusion局部重绘功能,如何完美抹掉不想要的物体?

网上一堆文生图教程,这种抽卡式东西玩几天就没有意思了,怎么按照自己的意愿生成自己的图是非常有意思的东西,所以我对局部重绘特别感兴趣,借助 SD 的扩散算法,如何利用它的扩散算法来向着自己期望的方向上呈现&#xf…

分享5款十分小众的软件,不好用你找我

今天推荐5款十分小众的软件,但是每个都是非常非常好用的,用完后觉得不好用你找我。 网络测速——NetSpeedMonitor NetSpeedMonitor是一款用于测量和显示你的网络速度的工具。它可以让你在任务栏上看到你的实时上传和下载速度,并提供多种功能…

Win10任务栏一直转圈圈不能操作怎么办?

Win10任务栏一直转圈圈不能操作怎么办?Win10电脑用户遇到了任务栏一直转圈圈不能操作的问题,不知道怎么操作才能解决,这时候用户可以打开桌面上的控制面板,点击卸载更新补丁,也可以通过打开命令提示符窗口,…

【业务功能篇30】代码重构--卫语句/idea内置工具抽象方法

业务场景: 当前我们项目在发布流水线的时候,codecheck 圈复杂度高于10的,或者14的,需要进行一些整改, 什么是圈复杂度? 圈复杂度(Cyclomatic complexity,CC)也称为条件复…

【Leetcode60天带刷】day07哈希表——454.四数相加II , 383. 赎金信 ,15. 三数之和 , 18. 四数之和

题目&#xff1a;454.四数相加II 454. 四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 …

进阶面向对象

面向对象的意义在于 将日常生活中习惯的思维方式引入程序设计中 将需求中的概念直观的映射到解决方案中 以模块为中心构建可复用的软件系统 提高软件产品的可维护性和可拓展性 类和对象是面向对象中的两个基本概念 类&#xff1a;指的是一类事务&#xff0c;是一个抽象的概…