精华内容
下载资源
问答
  • 图片展示广告.rar

    2019-07-04 23:40:50
    图片展示广告
  • 女性产品展示广告网页模板
  • 滑动图片展示广告效果
  • 大幅商品展示广告代码
  • 展示广告-广告匹配

    千次阅读 2014-08-03 23:15:56
    展示广告中的广告匹配算法 多层漏斗模型:  片段触发  相关性排序  业务过滤  CPM过滤  机制设计

    展示广告中的广告匹配算法


    多层漏斗模型:

         片段触发

    片段来源: 当前网页,用户历史行为

            片段类型: 关键词片段,用户/流量标签,规则标签


         相关性排序

             计算当前candidate ad的向量和利用u,c得到的广告向量进行相关性计算,得到其相似度,常在Term维度,Topic维度,

              Category维度进行计算。

            相关性排序: 

             需要人工标注数据来进行模型训练。

              行业矩阵和一些强规则的限制


         业务过滤

    地域过滤、时间过滤、预算过滤、IP过滤等


         CPM过滤

      通过cCPM进行排序进行排序。

               eCPM = bid*Q   (Q=pCTR, bid常采用广义第二定价GSP原则)


          机制设计

                过展现控制

                Hidden Cost: 

                      广告对用户站点体验有伤害

                     对排名CPM调整  CPM=(Bid-HC)*Q

                      对计费进行调整: Price = CPM(next)/Q + HC







    展开全文
  • 3D立体展示广告效果

    2013-04-12 12:58:47
    3D立体展示广告效果,非常漂亮,立体感很强,免费提供给大家使用。
  • 很酷的html滑动图片展示广告效果
  • 灰色系摄影影集展示广告落地页类网站html模板
  • 分享嘉宾:刘斌 360 资深算法工程师编辑整理:赵勇出品平台:DataFunTalk导读:360展示广告平台始终关注广告投放效果,围绕广告后续优化问题先后开发了多款产品。随着产品规模的不...

    分享嘉宾:刘斌 360 资深算法工程师

    编辑整理:赵勇

    出品平台:DataFunTalk

    导读:360展示广告平台始终关注广告投放效果,围绕广告后续优化问题先后开发了多款产品。随着产品规模的不断扩张,有关效果优化的新需求新问题不断产生。本文主要介绍了效果优化系统随业务发展的演进过程,聚焦如何使用算法解决客户痛点,实现广告投放智能化。使大家了解到展示广告算法团队如何分析业务,如何选择算法,如何优化系统的过程。

    01

    背景介绍

    1. 展示广告业务介绍

    市场上有很多媒体,用户访问媒体 ( 比如PC端的搜狐、网易、新浪,移动端的头条等 ) 时页面会出广告,媒体会将用户当前流量相关信息发送给Ad Exchange ( 流量拍卖平台 ),该流量会由Ad Exchange发送给与其对接的多家DSP ( 广告投放系统 ),DSP会根据当前流量选择合适的广告返回给Exchange,响应时间要求在100ms以内,这些广告一般是由客户或者广告主 ( 比如电商类广告主京东、唯品会、苏宁,旅游类广告主携程等 ) 在DSP平台按照流量筛选条件 ( 用户、媒体、时间、地点 ) 设置,Exchange将各个DSP平台返回的结果进行整理,选择出价最高的广告返回给媒体,媒体最终将出价最高的广告展示给用户。

    2. 常见展示广告

    常见的展示广告有:

    • 场景橱窗广告,购物tab栏里出现的购物商品广告,有价格、商品名称;

    • 开屏广告,打开媒体产品时展示由设计师精心设计的广告素材;

    • 信息流广告,用户在阅读信息流内容时,像正常信息流形式一样出现的广告,有标题有图片有内容,这样的信息形式不会特别破坏用户的阅读体验。

    3. 展示广告架构

    展示广告技术架构,可以分为线上系统和线下系统。线上系统以DSP Server切入,Ad Exchange会将流量发送给DSP Server,DSP Server会将信息传递给Ad Search,Ad Search是广告的检索召回系统,海量广告中粗召回匹配的几百个甚至上千个广告投放,Ad Search会将信息发送给Ad Selector,Selector会在几百个广告中选择当前最合理的一个返回给DSP,DSP再返回给Ad Exchange。整个过程的数据都会被记录,以消息的形式发送给Kafka,最后存储在hdfs上。线下系统,ETL会将数据转成标准的训练样本,这些训练样本会提供给CVR、CTR等模型训练,训练好的模型在由线下推送到线上,交给Ad Search、Ad Selector作为广告召回和排序使用。

    4. CPC广告投放设置

    广告有按照点击扣费,有按照曝光扣费,CPC广告是广告主与DSP平台按照点击结算。右图是典型的CPC广告投放设置页面,广告主在设置页面主要需要进行如下操作:

    • 上传素材(图片、文案);

    • 筛选流量(用户、媒体、时间、地点);

    • 设置出价(CPC为一次点击的出价)

    本文主要介绍CPC广告的效果优化。

    02

    效果优化

    1. 一切选项皆可优化

    • 转化:用户看到广告,点击广告之后后续产生的一系列广告主认为有商业价值的行为称为转化。

    • 广告效果优化:获取更多的转化,提高转化的概率,降低获取转化的成本称为广告效果优化。

    360效果优化产品设计的基本理念是一切选项皆可优化。可以将效果优化产品分为两大类,一类是广告主主动开启使用,一类是后端策略优化自动生效。产品的核心是点击到转化的概率预估问题,结合广告主需求去拓展可以做效果优化的场景。

    2. 流量分层处理

    对广告来说,流量是海量的,能够产生转化的流量是极少的,那么流量按照转化的效果自下而上来看,呈现的是一个金字塔结构。针对塔底的低质流量可以采取预算分配和分流量调价两个方案。预算分配是针对点击率低的流量,设置在这类低质流量上的花费上限,如计划的10%或20%,其他主要花费重点用在高质流量上。分流量调价是从出价的角度,对于低质流量的出价是按照正常流量出价打折。塔顶的流量可以采用优选人群方案。根据用户的广告行为训练模型预测其是否会发生转化,模型输出值高的人群被归为优选人群。广告主给这类优选人群更高的出价,这样在竞价过程中更有可能胜出,得到曝光转化机会。

    3. 智能点击出价

    智能点击出价是一款约束了广告主平均点击成本,尽可能优化后续效果的一款广告主主动开启的产品。出价按照转化率分段处理,高段做溢价处理,低段做减价处理。线上策略可以从三个维度进行实现:

    • 广告已经积累了大量样本数据,可以单独为广告实现一个转化率模型,并根据模型设计分段出价;

    • 新广告投放,可以根据广告主的以前的广告数据分布,设计一个模型指导分段出价;

    • 新广告主投放,可以根据同行业的其他广告主的广告数据分布设计模型进行分段出价。

    4. 智能创意组合

    广告主在创建广告单元上传素材时,有很多的素材(图片文案)组合选择,但是不清楚哪种组合转化效果最好,所以广告主会在投放过程中,根据实际的投放效果,选择最佳的素材组合,关闭其他组合。智能创意组合,就是为了解决广告主的这个需求而设计的产品。上图展示的是广告主上传素材的界面,允许广告主上传多个图片和多个文案,算法会根据当前流量选择最佳的图片和最佳的文案组合展现给用户。

    5. 创意组合生成网络

    智能创意组合算法通过强化学习思路实现,打分模型为转化率预估模型,根据当前流量信息和生成网络得到的图片文案的组合作为输入,得到转化率;转化率越高,创意组合越有价值。创意组合生成网络是根据Attention机制实现的,生成网络的输入为图片、文案、上下文信息。在生成网络结构中,以image1为例,将其作为query,与整个图片素材库的关系以及与整个文案库的关系使用Attention建模,得到图片信息经过一个前向网络得到输出分数,如果是多图片,使用Softmax得到多图片的概率分布。组合的结果可以直接选择图片和文案概率最大的,或者是概率分布做采样。在迭代过程中,这两种方式都会有所选择来训练。

    03

    广告投放智能化演进

    1. oCPC:智能化广告投放产品

    o是optimize,oCPC是针对CPC的广告优化。右图展示的是oCPC的广告设置界面。oCPC的特点如下:

    • 相比于正常的CPC广告界面,该界面简化了设置内容,不需要设置点击出价;

    • 量化了广告主的目标——转化类型和目标转化成本;

    • 效量兼顾,既考虑实际转化成本接近目标转化成本,又兼顾扩量的优化,给广告主带来更多未投流量的转化。

    2. 出价逻辑

    普通CPC的出价逻辑,从DSP角度来说,通过点击率预估建立与广告主目标的桥梁,即CPC * PCTR。对于oCPC的出价逻辑:一阶段基于实时反馈,广告投放初期数据少,由系统给出CPC,根据线上实际转化成本的情况来调整出价。二阶段基于模型,当数据积累到一定阶段,训练转化率模型得到PCVR,用客户给出的目标出价CPA*PCVR来模拟CPC出价,即CPA * PCVR * PCTR。

    3. 多模型→单模型

    oCPC的核心是转化率模型:

    • 产品上线初期,客户较少,可以采用分客户训练,针对使用该产品的客户专门优化,避免影响其他正常的客户;

    • 随着数据的积累和效果稳定,在前期投放过程中,出于谨慎考虑,对于客户的投放都是精细化的流量,流量之间相互之间没有重叠;

    • 随着客户对投放量需求的增加,模型需要对之前没有见过的流量做转化率预估,利用同行业客户的相似性,分行业训练模型可以让客户共享投放信息来解决这个问题;

    • 随着产品的成熟,分行业和分客户的多模型维护成本过高,使用单一模型就能满足所有客户需求。

    4. 简单模型→复杂模型

    随着产品的迭代,模型从简单模型发展到复杂模型。产品初期,仅在精细流量上做投放,采用GBDT就可以满足需求。随着可投流量和特征数量增加,GBDT的树深度和棵数有限无法满足需求,采用LR模型解决可投流量扩展问题。随着业务发展拥有海量数据,传统模型存在瓶颈,最终采用了DNN模型解决海量数据问题。

    5. oCPC模型结构

    oCPC模型结构采用PNN架构,将特征分为多个group——广告、媒体、用户、其他上下文;每个group学习一个embedding表示,然后使用embedding相乘得到特征交叉。考虑到神经网络的复杂性,线上计算做了性能优化,预测时广告无关的部分只会计算一次,只有不同的广告特征才会被多次计算。

    6. 单任务→多任务

    转化率模型初期只考虑了点击到转化的样本,训练出一个单任务的转化率模型。随着ESMM和ESM2的出现,360的转化率模型从单任务向多任务模型发展。单任务模型考虑的是点击后到转化的样本,只考虑了曝光的子集样本。如何保持线上线下一致,将曝光无点击的样本加入训练,这就是多任务模型解决的问题。完整的样本空间,子模块CTR PNN模型是曝光样本的点击概率,LOSS1是pctr的loss,子模块CVR PNN模型是点击后转化的概率模型,pcvr表示该曝光样本如果点击,点击到转化的概率。实际需要对于每个曝光样本做曝光转化预估,那么将pctr * pcvr就得到了曝光转化概率pctcvr,而LOSS2就是该曝光转化的loss。曝光到转化之间还存在其他链路,可以使用更多的任务和loss来表示。另外,多任务模型会共享group embedding输入。

    7. 单目标出价→多目标出价

    随着业务发展,客户会有更多的转化要求。在注册目标成本已经满足需求的情况下,考虑付费的优化。参考智能点击出价,训练一个付费模型,在注册率一定的情况下,付费率如果在金字塔顶层,就增加出价,在低层,就减少出价,来满足客户付费优化的需求。付费模型采用MMOE实现,注册是任务A,付费是任务B,Gata A仅作为任务A的输入,Gata B仅作为任务B的输入。对于该模型的任一任务来说,可以由几个固定的专家打分得到。那么专家的输出与Gata A 输出的概率分布作为任务A的输入,专家的输出与Gata B输出的概率分布作为任务B的输入。这个模型在同时拥有多个转化的场景中得到效果验证。

    8. 高延迟→低延迟

    知识蒸馏解决线上高延迟问题。知识蒸馏存在Student模型参数减少过多,导致效果Teacher模型差很多,以下是两个优化方法:

    • 提高Teacher模型复杂度

    • Teacher模型加入点击后转化前的特征

    今天的分享就到这里,谢谢大家。


    在文末分享、点赞、在看,给个3连击呗~


    嘉宾介绍:

    刘斌

    360 | 资深算法工程师

    本科毕业于上海交通大学,研究生毕业于纽约州立大学。2014年作为算法工程师入职360。2015~2017年负责展示广告商品库和人群库系统。2018~2020年专注广告效果优化,作为项目主要负责人先后开发了预算分配系统和oCPC系统。

    展开全文
  • 假设,我们需要在发布时间超过15天的文章中展示广告,我们今天只需要简单的设置一下代码,就能完成。
  • 展示广告立牌是一种小型广告媒体,在不同区域和不同的消费人群分别进行广告展示推广,能让广告有效的传播。铝合金广告立牌整体结构采用铝合金型材和部分不锈钢配件组成,样式美观大方、易安装、更换画面方便、易...


      广告器材在适当的地方使用会使空间利用的恰到好处,更能让广告展示推广更加有效。
      展示广告立牌是一种小型广告媒体,在不同区域和不同的消费人群分别进行广告展示推广,能让广告有效的传播。铝合金广告立牌整体结构采用铝合金型材和部分不锈钢配件组成,样式美观大方、易安装、更换画面方便、易携带。
      铝型材海报架的用途大家都很熟悉,大方独特的外观,便携式的铝型材海报架多被广泛的应用于形象店、连锁专卖店、商场、展览展会、学校展览招生、促销广告等。铝型材海报架的边框一般用牢固、便携的铝合金材质制成,背板大多采用PVC材质板!
      户外展示器材指在广场、活动现场等设置的商业户外展示器材。可以根据某地区消费者的风俗习惯来设置,为经常在此区域人群提供反复的宣传,使其印象强烈。户外展示器材以其独具的艺术性成为美化城市的一种艺术品,是城市经济发达程度的标志之一。
      铝合金广告器材主要作用是用来安装广告宣传画面,起到广告宣传的作用。简单时尚的广告画配上相应档次的广告架,才能彰显产品的品质和企业的档次。
    转载:佛山相甲展示

    转载于:https://my.oschina.net/u/3365817/blog/881003

    展开全文
  • 淘宝展示广告点击率分析

    千次阅读 2020-05-07 16:43:22
    Ali_Display_Ad_Click是阿里巴巴提供的一个淘宝展示广告点击率数据集。 三、数据简介 1.原始样本骨架raw_sample: 从淘宝网站中随机抽样了114万用户8天内的广告展示/点击日志(2600万条记录),构成原始的样本骨架。...

    一、 项目背景

    大数据时代的背景下,广告投放成为了互联网各个行业中运营推广的主流。对于电商行业来说,广告投放的效果,取决于广告投放后为平台带来了多少转化。要有转化,首先就要有流量(点击),因此,如何对广告进行精准投放,提高广告的点击率,进而实现精准营销就显得尤为重要。
    下面我们以阿里巴巴提供的淘宝展示广告点击率数据集为例进行分析。

    二、数据来源

    https://tianchi.aliyun.com/dataset/dataDetail?dataId=56.
    Ali_Display_Ad_Click是阿里巴巴提供的一个淘宝展示广告点击率数据集。

    三、数据简介

    1.原始样本骨架raw_sample:
    从淘宝网站中随机抽样了114万用户8天内的广告展示/点击日志(2600万条记录),构成原始的样本骨架。
    字段说明如下:

    字段 说明
    user_id 脱敏过的用户ID
    adgroup_id 脱敏过的广告单元ID
    time_stamp 时间戳
    pid 资源位
    noclk 为1代表没有点击;为0代表点击
    clk 为0代表没有点击;为1代表点击

    由于数据量较大,本文中只截取其中前200W条数据进行分析。
    2.用户基本信息表user_profile:
    本数据集涵盖了raw_sample中全部用户的基本信息。字段说明如下:

    字段 说明
    user_id 脱敏过的用户ID
    cms_segid 微群ID
    cms_group_id cms_group_id
    final_gender_code 性别 1:男,2:女
    age_level 年龄层次
    pvalue_level 消费档次,1:低档,2:中档,3:高档
    shopping_level 购物深度,1:浅度,2:中度,3:深度
    occupation 是否大学生 ,1:是,0:否
    new_user_class_level 城市层级

    3.广告基本信息表ad_feature:
    本数据集涵盖了raw_sample中全部广告的基本信息。字段说明如下:

    字段 说明
    adgroup_id 脱敏过的广告ID
    cate_id 脱敏过的商品类目ID
    campaign_id 脱敏过的广告计划ID
    customer_id 脱敏过的广告主ID
    brand 脱敏过的品牌ID
    price 宝贝的价格

    其中一个广告ID对应一个商品(宝贝),一个宝贝属于一个类目,一个宝贝属于一个品牌。

    四、数据预处理

    4.1 数据导入

    1. 导入类库

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    import seaborn as sns
    sns.set_style('darkgrid')         # 设置网格类型,默认
    
    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    

    2. 导入数据集

    # 用户基本信息表
    user_data = pd.read_csv('D:/淘宝展示广告点击率预估数据集/user_profile.csv')  # 读取数据
    print(user_data.shape)         # (1061768, 9):说明该表中一共有1061768行、9列
    user_data.head()  # 输出数据前5行
    
    # 广告基本信息表
    ads = pd.read_csv('D:/淘宝展示广告点击率预估数据集/ad_feature.csv')
    print(ads.shape)       # (846811, 6):说明该表中一共有846811行、6列
    ads.head()
    
    # 从原始样本骨架数据raw_sample中选取200W数据作为样本数据
    raw_sample = pd.read_csv('D:/淘宝展示广告点击率预估数据集/raw_sample.csv',nrows=2000000)
    # 将截取的前200W行数写入sample_data.csv文件中
    raw_sample.to_csv('D:/淘宝展示广告点击率预估数据集/sample_data.csv',index=False,sep=',')
    dataset = pd.read_csv('D:/淘宝展示广告点击率预估数据集/sample_data.csv')  # 读取数据
    print(dataset.shape)  # (2000000, 6):说明该表中一共有2000000行、6列
    dataset.head()
    

    从上到下依次为用户基本信息表user_data、广告基本信息表ads、样本数据表dataset,如下图所示:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    4.2 缺失值处理

    1. 缺失值检测

    # 获取用户基本信息表user_data每列的缺失值占比
    user_data_null = user_data.isnull().sum()/len(user_data)*100
    user_data_null = user_data_null.drop(user_data_null[user_data_null==0].index).sort_values(ascending=False)     # 将缺失值占比从高到低排序
    missing_data = pd.DataFrame({'Missing Ratio(%)':user_data_null})
    print(f'user_data含有缺失值的属性个数:{len(user_data_null)}')
    print(missing_data)
    print('-' * 60)
    
    # 获取广告基本信息表ads每列的缺失值占比
    ads_null = ads.isnull().sum()/len(ads)*100
    ads_null = ads_null.drop(ads_null[ads_null==0].index).sort_values(ascending=False)     # 将缺失值占比从高到低排序
    missing_data = pd.DataFrame({'Missing Ratio(%)':ads_null})
    print(f'ads含有缺失值的属性个数:{len(ads_null)}')
    print(missing_data)
    print('-' * 60)
    
    # 获取样本数据表dataset每列的缺失值占比
    dataset_null = dataset.isnull().sum()/len(dataset)*100
    dataset_null = dataset_null.drop(dataset_null[dataset_null==0].index).sort_values(ascending=False)     # 将缺失值占比从高到低排序
    missing_data = pd.DataFrame({'Missing Ratio(%)':dataset_null})
    print(f'dataset含有缺失值的属性个数:{len(dataset_null)}')
    print(missing_data)
    

    分析获取三个表中每个表中有缺失值的属性个数以及该属性中的缺失值占比,输出结果如下图所示:
    在这里插入图片描述
    由结果明显可知:
    用户基本信息表user_data有2个属性含缺失值:pvalue_level(缺失54.24%)、new_user_class_level(缺失32.49%);
    广告基本信息表ads有1个属性含缺失值:brand(缺失29.09%);
    样本数据表dataset不含缺失值。
    所以只需对 user_data、ads 两个表进行缺失值填充。

    2. 缺失值填充

    缺失值填充说明:
    1.user_data表
    ‘pvalue_level’(消费档次:1低2中3高):通过KNN算法(基于K个最近邻的填充算法)进行预测填充;
    'new_user_class_level '(城市层次):该属性值为分类属性,对其进行众数填充。
    2.ads表
    ‘brand’(品牌ID):由于该数据为id类数据,填充其上下条数据的值,在本文中使用的是填充上一条数据的值。

    # 对 'new_user_class_level '进行众数填充
    from sklearn.impute import SimpleImputer   # 导入缺失值处理所需的库impute.SimpleImputer
    # 使用reshape(-1,1)对数据升维,原本是一维,但在sklearn当中的特征矩阵必须是二维的
    city_level = user_data.loc[:,'new_user_class_level '].values.reshape(-1,1)  # loc:对索引名进行切片   
    si = SimpleImputer(strategy = 'most_frequent')  # 实例化,使用众数填补
    user_data.loc[:,'new_user_class_level '] = si.fit_transform(city_level) # fit_transform一步训练导出结果
    user_data.info()
    

    输入结果如下图,可观察到 'new_user_class_level ’ 列中已经不含缺失值:
    在这里插入图片描述

    # 调整数据集user_data的列顺序:将'pvalue_level'列调至最后一列
    columns = ['userid', 'cms_segid', 'cms_group_id', 'final_gender_code', 'age_level',
           'shopping_level', 'occupation', 'new_user_class_level ','pvalue_level']
    user_data = user_data[columns]
    """
    按'pvalue_level'列值是否为空对数据集user_data进行分离
    """
    # 'pvalue_level'列值为空
    pvalue_null = user_data.loc[user_data['pvalue_level'].isnull().values == True]
    # 'pvalue_level'列值为空
    pvalue_nonull = user_data.loc[user_data['pvalue_level'].isnull().values == False]
    """
    对数据集pvalue_null和pvalue_nonull
    分离训练集和测试集
    X_train_user:'pvalue_level'列以外的,且'pvalue_level'列值不为0的部分
    y_train_user:'pvalue_level'列中的,且值不为0
    X_test_user:'pvalue_level'列以外的,且值为0
    y_test_user:'pvalue_level'列中的,且值为0
    """
    X_train_user,y_train_user = pvalue_nonull.iloc[:,:-1],pvalue_nonull.iloc[:,-1]
    X_test_user,y_test_user = pvalue_null.iloc[:,:-1],pvalue_null.iloc[:,-1]
    # 运用K最近邻(k-Nearest Neighbor,KNN)分类算法对'pvalue_level'列预测
    from sklearn.neighbors import KNeighborsClassifier    
    knn = KNeighborsClassifier(n_neighbors=3,weights='distance')  # 根据消费档次1浅2中3深分为3类,weights='distance'表示用欧氏距离进行相似度衡量
    knn.fit(X_train_user,y_train_user)   # 训练数据集
    y_test_user = knn.predict(X_test_user)   # 导出结果
    y_test_user   # 输出结果为:array([2., 2., 2., ..., 1., 2., 2.])
    
    """
    对KNN算法预测的数据进行整理合并填充,将整理后的数据写入新表user
    """
    y_test_user = pd.DataFrame(y_test_user)   # 将y_test_user由array转换成DataFrame结构
    y_test_user.columns = ['pvalue_level']  # 修改y_test_user的列名为'pvalue_level'
    X_test_user.reset_index(drop=True,inplace=True)  # 重置X_test_user索引
    # X_test_user.drop('index',axis=1,inplace=True) # 删除上述操作生成的原index索引列
    pvalue_null = pd.concat([X_test_user,y_test_user],axis=1)  # 横向合并X_test_user,y_test_user两个表
    user = pd.concat([pvalue_nonull,pvalue_null],ignore_index=False)   # 纵向合并pvalue_nonull,pvalue_null表为一个user新表,并重置索引值
    user.to_csv('D:/淘宝展示广告点击率预估数据集/user.csv',index=False,sep=',')  # 将user表数据写入user.csv文件中
    user = pd.read_csv('D:/淘宝展示广告点击率预估数据集/user.csv')  # 读取user数据
    user.info()
    

    输出结果如下,可以观察到user数据集已经不含缺失值:
    在这里插入图片描述

    # 用前一个数据对'brand'缺失的数据进行填充
    ads.fillna(method='pad',inplace=True)
    ads.info()
    

    在这里插入图片描述

    4.3 数据合并

    将dataset、user、ads三个表以表dataset为骨架,分别基于主键userid、adgroup_id进行合并封装,合并为新表data,以便同时构建用户特征广告特征来预测分析用户对广告点击概率。

    """
    合并表user、ads、dataset为ads_user_dataset
    将合并后的数据写入data.csv中并读取
    """
    print(f'dataset表的维度:{dataset.shape}')
    print(f'user表的维度:{user.shape}')
    print(f'ads表的维度:{ads.shape}')
    
    # 修改表dataset中列名user为userid,以便后面基于主键连接
    dataset.rename(columns={'user':'userid'},inplace=True)
    dataset.head()
    
    # 将数据集dataset与用户基本信息表user合并,基于主键userid,how='right'表示以右边表为基准连接
    user_dataset = pd.merge(user,dataset,on='userid',how='right')
    print(f'user_dataset表的维度:{user_dataset.shape}')
    
    # 将数据集与广告基本信息表ads合并,基于主键adgroup_id,how='right'表示以右边表为基准连接
    ads_user_dataset = pd.merge(ads,user_dataset,on='adgroup_id',how='right')
    print(f'ads_user_dataset表的维度:{ads_user_dataset.shape}')
    
    ads_user_dataset.to_csv('D:/淘宝展示广告点击率预估数据集/data.csv',index=False,sep=',')
    data = pd.read_csv('D:/淘宝展示广告点击率预估数据集/data.csv')
    

    合并后各表的数据维度如下图所示:
    在这里插入图片描述
    将用户特征数据user、广告特征数据ads以及样本数据dataset进行合并后,再对合并后的数据集data进行缺失值分析,代码如下:

    # 获取data每列的缺失值占比
    data_null = data.isnull().sum()/len(dataset)*100
    data_null = data_null.drop(data_null[data_null==0].index).sort_values(ascending=False)     # 将缺失值占比从高到低排序
    missing_data = pd.DataFrame({'Missing Ratio(%)':data_null})
    print(f'dataset含有缺失值的属性个数:{len(data_null)}')
    print(missing_data)
    

    在这里插入图片描述
    根据输出结果可知:data中共含有8个属性的缺失值,且这8个含缺失值的属性全都为用户特征数据集user中的属性,同时这8个属性的缺失值占比均为5.81%。据此我们可以推断出应该是在样本数据data存在,但在用户特征表user中不存在这些缺失值的userid。
    因此这些含有缺失值的数据对我们的分析没有太大意义,且缺失占比较小,直接将含有缺失值的行删除即可。
    代码如下:

    # 删除data中含有缺失值的行,直接在原数据上操作
    data.dropna(axis=0, how='any',inplace=True)  
    

    再次输入上面获取data每列的缺失值占比的代码块,查看缺失值的处理情况,结果如下图:
    在这里插入图片描述
    输入data.shape查看删除缺失值后data的数据维度,得到结果:(1883809, 19)

    4.4 时间戳数据处理

    原数据提供的是时间戳形式,我们需要将其转换为日期和时间形式以便分析,从转换后的数据中分别提取日期、时间、小时组成三个新的特征列。

    # 将数据中的时间戳形式转换为日期和时间形式
    import datetime
    import time
    data['time_stamp']=pd.to_datetime(data['time_stamp'],unit='s')
    data['time_stamp']
    # 从转换后的数据中分别提取:日期、时间、小时,组成新的列
    data['date'] = data['time_stamp'].dt.date
    data['time'] = data['time_stamp'].dt.time
    data['hour'] = data['time_stamp'].dt.hour
    # 调整数据集data的列顺序:将'data'、'time'、'hour'这三列数据调至'time_stamp'列后
    columns = ['adgroup_id', 'cate_id', 'campaign_id', 'customer', 'brand', 'price',
           'userid', 'cms_segid', 'cms_group_id', 'final_gender_code', 'age_level',
           'shopping_level', 'occupation', 'new_user_class_level ', 'pvalue_level',
           'time_stamp', 'date', 'time', 'hour', 'pid', 'nonclk', 'clk']
    data = data[columns]
    

    在这里插入图片描述

    4.5 删除不需要的列

    # 删除列'time_stamp'、'time'以及'nonclk'
    data = data.drop(['time_stamp','time','nonclk'],axis=1)
    

    五、分析目标

    提高广告的点击率以实现精准营销
    在这里插入图片描述

    六、分析过程

    本文中画图主要基于Pyecharts库实现
    由于以下分析画图代码过长,将其放置在文末

    6.1 分析广告点击率的整体现状

    1. 分析整体广告点击占比

    根据数据显示,广告的整体点击量仅占展示量的4.94%,即广告的点击率为4.94%,可见很多广告在展示过程中并没有吸引到用户或者说没有投放到有需要的用户群体。
    在这里插入图片描述

    2. 分析几天中广告点击的变化情况

    根据数据显示,几天中广告的整体点击率水平在5%左右浮动,没有太大的波动。2017-05-05这一天广告的展示量与点击量很低,猜测有可能是因为数据采样不均匀导致,后续会重新进行验证分析。
    在这里插入图片描述

    6.2 分析用户的产品偏好

    分析筛选受用户欢迎的广告商品
    我们根据【广告被点击次数】进行分层,进而对现有的广告进行价值分析:
    <10:测试广告是否有价值以及商品对用户是否有吸引力阶段;
    10-20:进一步确认商品对用户有一定的吸引力,之前的点击并非偶然情况;
    20-50:确定商品确实对用户有一定的吸引力,进一步加大广告投放力度,测试广告是否能否为商品带来转化;
    50-100:投放的广告能为商品的转化带来一定的效果;
    >=100:投放的广告能为商品的转化带来一定不错的效果。

    在这里插入图片描述 在这里插入图片描述

    结论:①随着广告点击次数的上升,广告的点击率也在逐步上升,即广告价值与广告点击率呈正比关系。
    ②低价值广告的占比达到整体广告的98.34%之多,而高价值广告仅占整体广告的0.08%,这说明在测试广告价值阶段广告费用被高度浪费。

    我们现阶段要分析筛选出【广告点击次数>=100】,加大力度进行投放,同时进一步对其主要的受众群体进行分析,定位其投放的用户方向,实现用更少的广告费用获取更大的商品转化。

    6.3 分析一天24小时中用户的活跃时间

    在这里插入图片描述
    结论:
    ① 凌晨0点-7点、正午12点-14点这两个时间段是广告投放点击的高峰,傍晚16点-20点这个时间段是广告投放点击的低峰;
    ② 凌晨0点-7点这段时间是连续的高点击率时间,可以在这个时间段加大广告的投放力度;
    ③ 正午12点-14点这个时间段正好是人们的午饭午休时间,所以刷手机点击广告的概率也会增高;
    ④ 其中17点、19点这两个时间点的广告点击率相对较高,这个时间点正好是下班高峰期,人们在下班路上正好刷手机点击广告,建议在18点-19点这个时间段可以适当的加大广告投放力度;
    ⑤ 晚上20:00-0:00期间虽然广告展示量逐渐增加,但是广告的点击率却没有随之增加,反而降低了,猜测是用户如果没有必须且明确购买的需求,大部分用户在这段时间可能更倾向于陪伴家人、煲剧、看电影等休闲节目。

    6.4 分析广告在不同资源位上的点击情况

    在这里插入图片描述
    结论:
    广告在资源位430548_1007上展示量较多,但是相对而言,资源位430539_1007上的广告点击率相对更高,建议可以加大在资源位430539_1007上的广告投放力度。

    6.5 分析广告的受众群体特征

    1. 分析整体的广告受众群体特征

    在这里插入图片描述
    在这里插入图片描述

    ① 广告展示的用户约60%主要集中在微群0,且点击率达到5%;其他有些微群id虽然点击率也很高,但是数据量较小,不足以充分说明;
    ② 用户的男女比例约为1:2,且女性用户的点击率达到5.03%,男性用户的点击率只有4.81%,猜想是女性用户的购物欲会更强一些,建议可以加大对女性用户的广告投放;
    ③ 用户中非大学生用户占绝对主体,且点击率相对大学生用户更高,这符合非大学生用户具有更为独立的经济能力猜想;
    ④ 年龄层级为3、4、5的占比相对较高,点击率分别为:4.85%、4.91%、5.15%,其他层级的点击率虽然高,但是数据量少,不足以说明;
    ⑤ 微群群体3、4、5这三个群体中用户占比较高,且点击率分别高达:4.98%、4.97%、5.28%,建议可以加大对微群群体3、4、5的用户投放力度;
    ⑥ 购物程度为深度的用户占主体,但点击率仅占4.88%,建议对这一部分用户投放其更为感兴趣的广告;
    ⑦ 消费档次为低、中两档的用户占主体,尤其中档用户居多,且低、中档的用户点击率分别为:4.99%、4.95%,而高档用户点击率仅占4.65%,建议可以加大在消费档次为中档用户中的投放力度;
    ⑧ 城市层次为2的用户占主体,且相对其他城市层次的用户点击率最高,为4.99%,建议可以着重投放城市层次2的用户。

    下面用雷达图展示整体主要的受众群体特征:
    在这里插入图片描述

    2. 根据不同广告商品分析获取不同的受众群体特征

    由于广告商品数目过多,就不一一进行分析,我们从查看点击量前10的广告,如下图所示:
    在这里插入图片描述
    我们选取其中广告点击量第一的广告,即:adgroup_id为118317进行主要受众特征分析。
    下图是adgroup_id为118317的点击用户特征分布饼图:
    在这里插入图片描述

    结论:
    adgroup_id为118317的主要受众特征为:

    特征名 特征群体
    微群 0
    cms_group 8>9>7
    性别
    是否大学生
    年龄层次 2>3>1
    购物程度 深度
    消费档次 中档>低档
    城市层次 2

    因此,在投放广告118317时建议侧重对具有上述受众特征的用户进行投放。

    6.6 基于物品的协同过滤推荐

    1. 获取【投放效果不错的广告商品】中相似度高的广告商品
    adgroup_id 与118317的相似度
    8052 0.054313
    79235 0.054313
    42256 0.054313
    29805 0.054313
    280584 0.054313
    169791 0.054313
    170050 0.054313
    203576 0.054313
    19187 0.054313
    239566 0.038405
    2. 根据广告商品的相似度和已知的用户历史行为给用户生成推荐列表

    我们从点击广告118317的用户中筛选满足上述受众特征的用户,筛选出来的userid有:

    1007255, 359747, 387456, 888900, 267564, 1059836, 922603, 538653

    我们分别向这些用户生成推荐列表,则:

    387456的推荐列表 1007255, 359747, 888900, 267564, 1059836, 922603, 538653 的推荐列表
    $1600 电脑

    结论:建议向点击过广告118317的用户群体也尝试投放以下几个广告:150272、205887、42256 、203576、79235。

    七、分析结论

    1、 广告整体的点击率约4.94%,主要是由于低价值广告较多,影响了整体的广告点击率,建议可以从受用户欢迎的商品类目、商品品牌以及广告主、广告计划中筛选要投放的广告商品;
    2 、时间维度:
    ① 凌晨0点-7点是连续的用户点击的活跃时间,建议加大的这个时间段广告投放力度;
    ② 傍晚17点-19点之间正好是下班高峰期,猜想人们在回家途中刷手机看广告点击的可能性会加大,建议可以稍微增加这个时间段的广告投放力度;
    3、资源位430539_1007上的点击率为5.01%,较
    430548_1007资源位的点击率高,建议尝试在资源位430539_1007上进行投放;
    4、广告整体的受众群体是:
    微群0、cms_group为3、女性、非大学生、年龄层次为3/4、购物为深度、消费档次中低档为主、城市层次为2
    如果投放时暂时没有受众群体方向,可以先以这个受众方向为主进行投放
    5、我们以点击量最高的广告id为118317进行分析:
    ①主要受众群体为:
    男性、非大学生、年龄层次2、购物为深度、消费中档、城市层级2、微群0、cms_group为8。
    ②推荐相似广告id为:
    150272、205887、42256 、203576、79235。

    八、代码部分

    8.1 整体广告点击占比饼图

    # 生成点击数据列表
    counts = data.clk.value_counts()
    ratio = data.clk.value_counts()/len(data)*100
    data_clk = pd.DataFrame({'Count':counts, 'Ratio(%)':ratio})
    
    # 绘制饼图对广告整体点击情况进行可视化
    from pyecharts import options as opts
    from pyecharts.charts import Pie
    
    b=data['clk']
    b=b.value_counts()
    b=dict(b)
    b['无点击人数']=b.pop(0)
    b['点击人数']=b.pop(1)
    
    name=pd.DataFrame(b.keys())
    value=pd.DataFrame(b.values())
    name=name[0].tolist()
    value=value[0].tolist()
    words=list(zip(list(name),list(value)))
    
    h=list(zip( list(b.keys()),list(b.values())))
    pie = Pie(init_opts=opts.InitOpts(width="500px", height="320px"))
    pie.add("",words)
    pie.set_global_opts(title_opts=opts.TitleOpts(title="广告整体点击情况",pos_left="40%"),
                        legend_opts=opts.LegendOpts(pos_top="20%", pos_left="80%"))
    pie.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)"))
    pie.render_notebook()
    

    在这里插入图片描述

    8.2 几天中广告点击的变化情况(柱形-折线图)

    data_date = data.groupby('date')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    
    # 建立《2017/05/05至2017/05/13的广告点击情况》的柱形-折线图
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Line
    from pyecharts.faker import Faker
    
    name = data_date.index.tolist()
    v1 = data_date.展示量.tolist()
    v2 = data_date.点击量.tolist()
    v3 = ((data_date.点击率.values)*100).tolist()
    v3 = [round(i,2) for i in v3]
    
    bar = (
        Bar(init_opts=opts.InitOpts(width="680px", height="420px"))
        .add_xaxis(name)
        .add_yaxis("展示量", v1)
        .add_yaxis("点击量", v2)
        .extend_axis(
            yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"), interval=1)
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="2017/05/05至2017/05/13的广告点击情况",pos_left="18%"),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} "), max_=350000),
            legend_opts=opts.LegendOpts(pos_top="10%", pos_right="10%")
        )
        
    )
    
    line = Line().add_xaxis(name).add_yaxis("点击率", v3, yaxis_index=1)
    bar.overlap(line)
    bar.render_notebook()
    

    在这里插入图片描述

    8.3 各点击区间的广告点击情况(堆积柱形-折线图、饼图)

    data_adgroup = data.groupby('adgroup_id')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    data_adgroup['点击量区间'] = data_adgroup.点击量.values   # 添加新列用来分区间
    data_adgroup.sort_values(by='点击量',ascending=False)
    
    # 对所有广告点击量进行分段
    bins = [0,10,20,50,100,100000]
    labels = ['<10','10-20','20-50','50-100','>=100']
    data_adgroup['点击量区间'] = pd.cut(data_adgroup.点击量区间,bins=bins,labels=labels,right=False)
    data_adgroup.sort_values(by='点击量',ascending=False)
    
    data_adgroup_clk= data_adgroup.groupby('点击量区间').agg({
        '点击量':['count',sum],
        '展示量':sum
    })
    data_adgroup_clk.columns = ['广告量','点击量','展示量']
    data_adgroup_clk['点击率'] = data_adgroup_clk.点击量.values/data_adgroup_clk.展示量.values*100
    data_adgroup_clk
    

    在这里插入图片描述

    """
    利用堆积柱形图-折线图可视化分析各点击数区间的广告点击率情况
    """
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Line, Scatter
    from pyecharts.faker import Faker
    
    name = data_adgroup_clk.index.tolist()
    
    v0 = data_adgroup_clk.展示量.tolist()
    v1 = (data_adgroup_clk.展示量-data_adgroup_clk.点击量).tolist()
    v2 = data_adgroup_clk.点击量.tolist()
    v3 = data_adgroup_clk.点击率.tolist()
    v3 = [round(i,2) for i in v3]
    v4 = data_adgroup_clk.广告量.tolist()
    b = dict(zip(name,v4))
    words=list(zip(name,v4))
        
    bar = (
        Bar(init_opts=opts.InitOpts(width="640px", height="460px"))
        .add_xaxis(name)
        
        .add_yaxis("无点击量", v1, stack="stack1", category_gap="60%")
        .add_yaxis("点击量", v2, stack="stack1", category_gap="60%")
    
        .extend_axis(
            yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"), interval=1)
        )
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="各点击数区间的广告点击率情况", pos_left="30%"),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}"), max_=2500000),
            legend_opts=opts.LegendOpts(pos_top="6%", pos_left="50%")
            
        )
    )
    line = Line().add_xaxis(name).add_yaxis("点击率", v3, yaxis_index=1)
    bar.overlap(line)
    bar.render_notebook()
    

    在这里插入图片描述

    """
    利用玫瑰图描绘点击用户所在的城市层次分布
    """
    from pyecharts import options as opts
    from pyecharts.charts import Pie
    pie = (
        Pie(init_opts=opts.InitOpts(width="666px", height="365px"))
        .add("", words, center=["48%", "62%"],radius=["40%", "75%"], rosetype="radius")
        .set_global_opts(title_opts=opts.TitleOpts(title="各点击数区间的广告在整体广告中的占比分布",pos_right="22%"),
                        legend_opts=opts.LegendOpts(pos_top="6%", pos_right="16%"))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)"))   
    )
    pie.render_notebook()
    

    在这里插入图片描述

    8.4 一天24小时中用户的活跃时间(堆积柱形-折线图)

    data_hour = data.groupby('hour')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    data_hour
    
    """
    利用堆积柱形图-折线图可视化分析一天(24小时)中用户的点击情况
    """
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Line
    
    name = data_hour.index.tolist()
    
    v0 = data_hour.展示量.tolist()
    v1 = (data_hour.展示量-data_hour.点击量).tolist()
    v2 = data_hour.点击量.tolist()
    v3 = data_hour.点击率.tolist()
    v3 = ((data_hour.点击率.values)*100).tolist()
    v3 = [round(i,2) for i in v3]
    b = dict(zip(name,v2))
    words=list(zip(name,v2))
    
        
    bar = (
        Bar(init_opts=opts.InitOpts(width="1020px", height="480px"))
        .add_xaxis(name)
        .add_yaxis("无点击量", v1, stack="stack1", category_gap="80%")
        .add_yaxis("点击量", v2, stack="stack1", category_gap="80%")
        .extend_axis(
            yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"), interval=1, min_ = 4.5, max_ = 5.2)
        )
        .set_series_opts(label_opts=opts.LabelOpts(is_show=False, position="right"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="一天(24小时)中用户的点击情况", pos_left="35%"),
            xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} "), max_ = 180000),
            legend_opts=opts.LegendOpts(pos_top="6%", pos_left="55%")
        )
    )
    line = Line().add_xaxis(name).add_yaxis("点击率", v3, yaxis_index=1,markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),)
    bar.overlap(line)
    bar.render_notebook()
    

    在这里插入图片描述

    8.5 广告在不同资源位上的点击情况(堆积柱形图-折线图)

    """
    利用堆积柱形图-折线图可视化分析广告在不同资源位上的点击情况
    """
    data_pid = data.groupby('pid')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    data_pid
    
    from pyecharts import options as opts
    from pyecharts.charts import Bar, Line
    
    name = data_pid.index.tolist()
    
    v0 = data_pid.展示量.tolist()
    v1 = (data_pid.展示量-data_pid.点击量).tolist()
    v2 = data_pid.点击量.tolist()
    v3 = data_pid.点击率.tolist()
    v3 = ((data_pid.点击率.values)*100).tolist()
    v3 = [round(i,2) for i in v3]
    b = dict(zip(name,v2))
    words=list(zip(name,v2))
        
    bar = (
        Bar(init_opts=opts.InitOpts(width="620px", height="460px"))
        .add_xaxis(name)
        
        .add_yaxis("无点击量", v1, stack="stack1", category_gap="80%")
        .add_yaxis("点击量", v2, stack="stack1", category_gap="80%")
    
        .extend_axis(
            yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"), interval=1)
        )
        .set_series_opts(label_opts=opts.LabelOpts(position="right"))
        .set_global_opts(
            title_opts=opts.TitleOpts(title="广告在不同资源位上的点击情况", pos_left="30%"),
            yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}"), max_=1500000),
            legend_opts=opts.LegendOpts(pos_top="6%", pos_left="50%")
            
        )
    )
    line = Line().add_xaxis(name).add_yaxis("点击率", v3, yaxis_index=1)
    bar.overlap(line)
    bar.render_notebook()
    

    在这里插入图片描述

    8.6 广告的受众群体特征

    from pyecharts import options as opts
    from pyecharts.charts import Radar
    
    data1 = [{"value": [0, 3, 2, 3, 2, 3, 0, 2], "name": "主要受众群体"}]
    # data2 = [{"value": [2, 6, 1, 1, 0, 2], "name": "开销分配"}]
    c_schema = [
        {"name": "微群", "max": 97, "min": 0},
        {"name": "cms_group", "max": 12, "min": 0},
        {"name": "性别(1男2女)", "max": 2, "min": 1},
        {"name": "年龄层次", "max": 6, "min": 0},
        {"name": "消费档次(1:低档,2:中档,3:高档)", "max": 3, "min": 1},
        {"name": "购物深度(1:浅层用户,2:中度用户,3:深度用户)", "max": 3, "min": 1},
        {"name": "是否大学生(1:是,0:否)", "max": 1, "min": 0},
        {"name": "城市层级", "max": 4, "min": 1},
    ]
    radar = (
        Radar()
        .set_colors(["#4587E7"])
        .add_schema(
            schema=c_schema,
            shape="circle",
            center=["50%", "50%"],
            radius="80%",
            textstyle_opts=opts.TextStyleOpts(color="#000"),
            angleaxis_opts=opts.AngleAxisOpts(
                min_=0,
                max_=360,
                is_clockwise=False,
                interval=5,
                axistick_opts=opts.AxisTickOpts(is_show=False),
                axislabel_opts=opts.LabelOpts(is_show=False),
                axisline_opts=opts.AxisLineOpts(is_show=False),
                splitline_opts=opts.SplitLineOpts(is_show=False),
            ),
            radiusaxis_opts=opts.RadiusAxisOpts(
                min_=0,
                max_=8,
                interval=2,
                splitarea_opts=opts.SplitAreaOpts(
                    is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)
                ),
            ),
            polar_opts=opts.PolarOpts(),
            splitarea_opt=opts.SplitAreaOpts(is_show=False),
            splitline_opt=opts.SplitLineOpts(is_show=False),
        )
        .add(
            series_name="主要受众群体",
            data=data1,
            areastyle_opts=opts.AreaStyleOpts(opacity=0.1),
            linestyle_opts=opts.LineStyleOpts(width=1, color="#CD0000"),
        )
    
    )
    radar.render_notebook()
    

    在这里插入图片描述
    根据不同广告商品分析获取不同的受众群体特征:

    # 查看所有投放的广告并按点击量排序
    data_adgroup = data.groupby('adgroup_id')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    data_adgroup.sort_values(by='点击量',ascending=False).head(10)
    

    在这里插入图片描述

    # 查看所有投放的广告并按点击量排序
    data_adgroup = data.groupby('adgroup_id')['clk'].agg({
        '展示量':'count',
        '点击量':sum,
        '点击率':np.mean
    })
    data_adgroup.sort_values(by='点击量',ascending=False)  # adgroup_id为118317的广告点击量第一(展示量3474,点击量348,点击率10.02%)
    
    # 筛选adgroup_id为118317的广告
    data_118317 = data[data['adgroup_id']==118317]
    data_118317
    
    # 筛选【adgroup_id为118317】且【被点击】的广告
    data_118317_clk = data_118317[data_118317['clk']==1]
    data_118317_clk
    
    # 根据【adgroup_id】、【userid】这两列去重
    data_118317_clk.drop_duplicates(subset=['userid','adgroup_id'],keep='first',inplace=True)
    
    data_118317_cms = data_118317.groupby('cms_segid')['clk'].agg({
        '点击量':sum,
    })
    data_118317_cms_group = data_118317.groupby('cms_group_id')['clk'].agg({
        '点击量':sum,
    })
    data_118317_gender = data_118317.groupby('final_gender_code')['clk'].agg({
        '点击量':sum,
    })
    data_118317_age = data_118317.groupby('age_level')['clk'].agg({
        '点击量':sum,
    })
    data_118317_shopping = data_118317.groupby('shopping_level')['clk'].agg({
        '点击量':sum,
    })
    data_118317_occupation = data_118317.groupby('occupation')['clk'].agg({
        '点击量':sum,
    })
    data_118317_city = data_118317.groupby('new_user_class_level ')['clk'].agg({
        '点击量':sum,
    })
    data_118317_pvalue = data_118317.groupby('pvalue_level')['clk'].agg({
        '点击量':sum,
    })
    
    from pyecharts import options as opts
    from pyecharts.charts import Pie
    
    name_cms = data_118317_cms.index.tolist()
    for i in range(0,len(name_cms)):
        name_cms[i]=f'微群{name_cms[i]}'
    v_cms = data_118317_cms.点击量.tolist()
    b_cms = dict(zip(name_cms,v_cms))
    words_cms = list(zip(name_cms,v_cms))
    
    name_cms_group = data_118317_cms_group.index.tolist()
    # for i in range(0,13):
    #     name_cms_group[i]=f'cms_group{i}'
    v_cms_group = data_118317_cms_group.点击量.tolist()
    b_cms_group = dict(zip(name_cms_group,v_cms_group))
    words_cms_group = list(zip(name_cms_group,v_cms_group))
    
    name_gender = data_118317_gender.index.tolist()
    name_gender[0]='男'
    name_gender[1]='女'
    v_gender = data_118317_gender.点击量.tolist()
    b_gender = dict(zip(name_gender,v_gender))
    words_gender = list(zip(name_gender,v_gender))
    
    name_age = data_118317_age.index.tolist()
    for i in range(0,7):
        name_age[i]=f'年龄层次{i}'
    v_age = data_118317_age.点击量.tolist()
    b_age = dict(zip(name_age,v_age))
    words_age = list(zip(name_age,v_age))
    
    name_shopping = data_118317_shopping.index.tolist()
    name_shopping[0]='浅度'
    name_shopping[1]='中度'
    name_shopping[2]='深度'
    v_shopping = data_118317_shopping.点击量.tolist()
    b_shopping = dict(zip(name_shopping,v_shopping))
    words_shopping = list(zip(name_shopping,v_shopping))
    
    name_occupation = data_118317_occupation.index.tolist()
    name_occupation[0]='非大学生'
    name_occupation[1]='大学生'
    v_occupation = data_118317_occupation.点击量.tolist()
    b_occupation = dict(zip(name_occupation, v_occupation))
    words_occupation = list(zip(name_occupation, v_occupation))
    
    name_city = data_118317_city.index.tolist()
    for i in range(0,4):
        name_city[i]=f'城市层次{i+1}'
    v_city = data_118317_city.点击量.tolist()
    b_city = dict(zip(name_city, v_city))
    words_city = list(zip(name_city, v_city))
    
    name_pvalue = data_118317_pvalue.index.tolist()
    name_pvalue[0]='低档'
    name_pvalue[1]='中档'
    name_pvalue[2]='高档'
    v_pvalue = data_118317_pvalue.点击量.tolist()
    b_pvalue = dict(zip(name_pvalue, v_pvalue))
    words_pvalue = list(zip(name_pvalue, v_pvalue))
    
    def new_label_opts():
        return opts.LabelOpts( formatter="{b}: {c}({d}%)", position="inside")
    
    
    c = (
        Pie(init_opts=opts.InitOpts(width="980px", height="460px"))
        .add(
            "微群分布",
            words_cms,
            center=["10%", "30%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "cms_group分布",
            words_cms_group,
            center=["35%", "30%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "性别分布",
            words_gender,
            center=["60%", "30%"],
            radius=[40, 80],
            label_opts=opts.LabelOpts(formatter="{b}: {c}({d}%)", position="inside"),
        )
        .add(
            "年龄层次分布",
            words_age,
            center=["85%", "30%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "购物深度分布",
            words_shopping,
            center=["10%", "70%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "是否大学生分布",
            words_occupation,
            center=["35%", "70%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "城市层次分布",
            words_city,
            center=["60%", "70%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .add(
            "消费档次分布",
            words_pvalue,
            center=["85%", "70%"],
            radius=[40, 80],
            label_opts=new_label_opts(),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(title="广告id为【118317】的点击用户特征分布", pos_left="30%"),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_top="6%", pos_left="0%", 
            ),
        )
        .set_series_opts(
            tooltip_opts=opts.TooltipOpts(
                trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
            ),
        )  
    )
    c.render_notebook()
    

    在这里插入图片描述

    8.7 基于物品的协同过滤推荐

    # 筛选有点击的数据
    data_clk_1 = data[data['clk'] == 1]
    
    # 根据【adgroup_id】、【userid】这两列去重
    data_clk_1.drop_duplicates(subset=['userid','adgroup_id'],keep='first',inplace=True)
    
    # 选取【'userid', 'adgroup_id', 'clk'】三列数据
    columns = ['userid', 'adgroup_id', 'clk']
    data_clk_col = data_clk_1[columns]
    
    # 将数据写入.txt
    data_clk_col.to_csv('D:/淘宝展示广告点击率预估数据集/data_clk_col.txt',sep=',',index=False)
    
    f = open('D:/淘宝展示广告点击率预估数据集/data_clk_col.txt', "r", encoding="utf-8")
    dataSet = {}
    
    for line in f:
        userid, adgroup_id, clk = line.strip().split(",")
        dataSet.setdefault(userid, {})
        dataSet [userid][adgroup_id] = clk
    print(dataSet)
    dataSet.pop('userid')
    print('-'*60)
    print(dataSet)
    
    from math import sqrt
    import operator
    
    N={};#喜欢广告i的总人数
    C={};#喜欢广告i也喜欢广告j的人数
    for userid,item in dataSet.items():
        for i,score in item.items():
            N.setdefault(i,0)
            N[i]+=1
            C.setdefault(i,{})
            
            for j,scores in item.items():
                if j not in i:
                    C[i].setdefault(j,0)
                    C[i][j]+=1
                    
    print("---构造的共现矩阵---")
    print ('N:',N);
    print ('C:',C);
    
    # 计算广告与广告之间的相似矩阵
    W={};
    for i,item in C.items():
        W.setdefault(i,{});
        for j,item2 in item.items():
            W[i].setdefault(j,0);
            W[i][j]=C[i][j]/sqrt(N[i]*N[j]);
    print("---构造广告的相似矩阵---")
    print(W)
    
    # 查询【118317】的推荐产品机器相似度并将其转换为dataFrame格式
    recommend_118317 = pd.DataFrame([W['118317']]).T
    
    # 修改列名
    recommend_118317.rename(columns={0:'相似度'},inplace=True)
    
    # 按相似度倒序排序
    recommend_118317.sort_values(by='相似度',ascending=False).head(10)
    

    在这里插入图片描述

    # 获取118317中符合主要受众群体的用户
    data_118317_clk_people = data_118317_clk[(data_118317_clk['cms_segid']==0) & (data_118317_clk['cms_group_id']==8) 
                    & (data_118317_clk['final_gender_code']==1) & (data_118317_clk['occupation']==0)
                   & (data_118317_clk['age_level']==2) & (data_118317_clk['shopping_level']==3)
                   & (data_118317_clk['pvalue_level']==2) & (data_118317_clk['new_user_class_level ']==2)]
    data_118317_clk_people
    

    根据用户历史行为进行推荐在此处以userid为’387456’为例:

    rank={};
    for i,score in dataSet['387456'].items():#获得用户userid‘387456’点击广告历史记录
        for j,w in sorted(W[i].items(),key=operator.itemgetter(1),reverse=True)[0:3]:#获得与广告i相似的k个物品
            if j not in dataSet['387456'].keys():#该相似的广告不在用户userid的记录里
                rank.setdefault(j,0);
                rank[j]+=float(score) * w;
                
    recommend_to_387456 = sorted(rank.items(),key=operator.itemgetter(1),reverse=True)[0:10]
    recommend_to_387456 = pd.DataFrame(recommend_to_387456)
    
    # 修改列名
    recommend_to_387456.rename(columns={0:'adgroup_id'},inplace=True)
    recommend_to_387456.rename(columns={1:'用户点击的概率'},inplace=True)
    
    print("---推荐给用户【387456】----")
    recommend_to_387456
    

    在这里插入图片描述

    展开全文
  • 自从百度信息流诞生以来,奇虎360也推出了自己的dsp广告平台,360点眼效系统。据360官方介绍,360的广告展示模式... 360展示广告主要有四种展示方式,分别是PC信息流、PC文字链、商品推荐、标准图形展示。根据企...
  • HaveUDownload:这是一个电影下载网站,没有展示广告
  • 在线社交网络中基于主题的社交展示广告投放算法,孙陈娜,程祥,社交展示广告近年来成为数字营销的主流方式之一,是在线社交网络中具备社交形态和功能的展示广告,现有研究利用社交影响力提高广
  • 第三期百度计算广告学沙龙( http://wenku.baidu.com/course/view/1488bfd5b9f3f90f76c61b8d ) 介绍了内容匹配广告和展示广告相关技术。本博客记录观看内容匹配广告部分的一些笔记, 绝大多数为原slide内容,只做简单...
  • 在当今竞争日益激烈的市场环境下,尤其是在中国的特定国情下,Google的搜索市场份额相对下滑,谷歌展示广告网络可以说是成功与否的杀手锏。如果你是做品牌推广,那么谷歌强大的内容网络合作伙伴和广告位置是你的不二...
  • 介绍了内容匹配广告和展示广告相关技术。 本博客记录观看品牌展示广告部分的一些笔记, 绝大多数为原slide内容,只做简单的整理。 1. 基本概念 展示广告分类  按广告作用分类:品牌广告(Brand Disp
  • 超级cool的flash+xml 图片展示广告代码超级cool的flash+xml 图片展示广告代码超级cool的flash+xml 图片展示广告代码超级cool的flash+xml 图片展示广告代码超级cool的flash+xml 图片展示广告代码
  • 从本节开始,分五次左右的篇幅按照广告类型分别介绍文本广告和展示广告中的关键问题。 对于展示广告,从目标来说,主要分为两种:一是品牌广告,为了传播良性的品牌意识。二是直接营销广告,是为了获得...
  • FlippingBookFlash翻书效果,关键字 翻书效果flash图片展示广告代码
  • “创新性是一个重要的问题,”谷歌广告员工Vic Fatnani在VentureBeat Summit 2018的舞台上说道,“想象一下,如果你能把你的会话助理带到展示广告中会怎样。” 这就是AdLingo背后的想法,这是由创业公司Fatnani在...
  • 展示广告中冷启动问题的图像特征学习 摘要 1 引言 2 相关工作 3 点击预估问题公式化 4 特征学习结构 4.1 任务分析与结构设计 4.2 视觉元素位置建模 4.3 在一个机器上处理大型数据集 4.4 减少过拟合 4.5 训练...
  • 46、仿新浪广东站的六图五自动连播轮循展示广告效果
  • 该文是百度文库课程《计算广告学之内容匹配广告&...第四章主要讲品牌展示广告,包括品牌展示广告基本概念,售卖,基础技术,精准投放技术以及效果测评。   第一节:品牌展示广告基...
  • WordPress发布时间超过15天的文章中展示广告 假设,我们需要在发布时间超过15天的文章中展示广告,我们今天只需要简单的设置一下代码,就能完成。 初步: 功能实现起来很简单,用PHP编辑器打开当前模版的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,186
精华内容 2,474
关键字:

展示广告