广告投放分析(Python,Sql)

一、项目背景与目的

1. 背景

随着互联网的飞速发展,各种网络产品应运而生,如电商网站,移动应用,视频媒体,新媒体等等。网络广告也成为了一种主要的广告形式。而网络广告的形式具有复杂和多样化的特点。

2. 问题

当我们完成一个重点活动的全网营销。该从哪些维度来总结和评估本次推广的得失呢?
实现广告的精准投放就是最大化投入产出的过程,需要知道我们的用户在哪里,在哪些渠道能够更大化用户价值,以及各个渠道用户价值的变化规律。通过对渠道方式和渠道质量的追踪,以引流和转化率为关键事件,做好渠道的优化和维护。

二、分析维度

1. 主体方向

本次项目将通过研究阿里天池数据,从广告及渠道,投放时间,投放人群,以点击率为数据指标进行数据分析,从而给出更好的方案和建议,实现高效率高产出。

2. 维度细分

2.1 广告及渠道

  1. 不同的商品价格对点击率的影响
  2. 100元以内广告商品点击率的用户组成
  3. 哪些类别的广告点击率更高,哪些类别的点击率低
  4. 低点击率商品分析
  5. 高点击商品与用户性别关系
  6. top10商品资源位点击量

2.2 投放时间

  1. 各时段点击量
  2. 每日点击量趋势
  3. 高点击商品各时段点击量

2.3 人群画像

  1. 年龄层与消费档次
  2. 购物深度与性别
  3. 不同年龄段、不同性别的用户点击率有什么差异
  4. 用户价值

三、数据概览

1. 数据描述

本数据集是阿里巴巴提供的一个淘宝展示广告点击率预估数据集,抽样114万用户8天内的广告展示(2600万条记录)以及全部广告的基本信息,用户的基本信息。
在这里插入图片描述
本项目将三个数据集链接在一起,以方便后续分析。

2. 数据含义及基本信息

(1) user_id:脱敏过的用户ID;             (2) adgroup_id:脱敏过的广告单元ID;
(3) time_stamp:时间戳;                  (4) pid:资源位;
(5) noclk:为1代表没有点击;为0代表点击;  (6) clk:为0代表没有点击;为1代表点击;

(1) adgroup_id:脱敏过的广告ID;          (2) cate_id:脱敏过的商品类目ID;
(3) campaign_id:脱敏过的广告计划ID;     (4) customer_id:脱敏过的广告主ID;
(5) brand:脱敏过的品牌ID;               (6) price: 宝贝的价格

(1) userid:脱敏过的用户ID;              (2) cms_segid:微群ID;
(3) cms_group_id:cms_group_id;         (4) final_gender_code:性别 1:,2:女;
(5) age_level:年龄层次;                 (6) pvalue_level:消费档次,1:低档,2:中档,3:高档;
(7) shopping_level:购物深度,1:浅层用户,2:中度用户,3:深度用户
(8) occupation:是否大学生 ,1:,0:(9) new_user_class_level:城市层级
******************** 基本信息
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1048575 entries, 0 to 1048574
Data columns (total 20 columns):
user                     1048575 non-null int64
time_stamp               1048575 non-null int64
adgroup_id               1048575 non-null int64
pid                      1048575 non-null object
nonclk                   1048575 non-null int64
clk                      1048575 non-null int64
cate_id                  1048575 non-null int64
campaign_id              1048575 non-null int64
customer                 1048575 non-null int64
brand                    862458 non-null float64
price                    1048575 non-null float64
userid                   987618 non-null float64
cms_segid                987618 non-null float64
cms_group_id             987618 non-null float64
final_gender_code        987618 non-null float64
age_level                987618 non-null float64
pvalue_level             460409 non-null float64
shopping_level           987618 non-null float64
occupation               987618 non-null float64
new_user_class_level     717615 non-null float64
dtypes: float64(11), int64(8), object(1)
memory usage: 164.0+ MB
None
******************** 空值
user                          0
time_stamp                    0
adgroup_id                    0
pid                           0
nonclk                        0
clk                           0
cate_id                       0
campaign_id                   0
customer                      0
brand                    186117
price                         0
userid                    60957
cms_segid                 60957
cms_group_id              60957
final_gender_code         60957
age_level                 60957
pvalue_level             588166
shopping_level            60957
occupation                60957
new_user_class_level     330960
dtype: int64
******************** 重复值
False    1048575
dtype: int64

3. 数据处理

3.1 去空

df = df.dropna(subset=["userid"],axis=0)

3.2 异常极值处理

bin2000_10 = np.arange(0,200000,1000)
df_cut_10 = pd.cut(df.price,bin2000_10).value_counts()
df_cut_10

Sql写法

DELETE FROM ad WHERE price > 100000 OR price < 1

这里以1000作为区间,进行切片,发现出现价格过大的情况,属于异常值,因此截取价格在1~100000的数据。

3. 新增日期项

df["day"]=df["time_stamp"].apply(lambda x:datetime.datetime.fromtimestamp(x))
df['date'] = df['day'].dt.date
df['week'] = df['day'].dt.dayofweek+1
df['hour'] = df['day'].dt.hour

Sql写法

alter table ad add date VARCHAR(32);
UPDATE ad SET date = FROM_UNIXTIME(time_stamp,'%Y-%m-%d %H:%i:%s');
新增日期(%Y-%m-%d)一列
alter table ad add day VARCHAR(32)
UPDATE ad SET day = cast(date as DATE)
新增小时列
alter table ad add hour VARCHAR(32)
UPDATE ad SET h
  • 15
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的 Flink 计算广告点击率的 Java 示例代码: ```java import org.apache.flink.api.common.functions.AggregateFunction; import org.apache.flink.api.java.tuple.Tuple; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.flink.streaming.api.TimeCharacteristic; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.functions.KeyedProcessFunction; import org.apache.flink.streaming.api.functions.timestamps.AscendingTimestampExtractor; import org.apache.flink.streaming.api.windowing.time.Time; import org.apache.flink.util.Collector; public class AdClickRateDemo { public static void main(String[] args) throws Exception { // 设置执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); // 读取数据源 DataStream<String> inputStream = env.socketTextStream("localhost", 9999); // 转换数据格式 DataStream<AdClickEvent> adClickEventStream = inputStream.map(line -> { String[] fields = line.split(","); return new AdClickEvent(Long.parseLong(fields[0]), Long.parseLong(fields[1]), fields[2], fields[3], Long.parseLong(fields[4])); }).assignTimestampsAndWatermarks(new AscendingTimestampExtractor<AdClickEvent>() { @Override public long extractAscendingTimestamp(AdClickEvent element) { return element.getTimestamp(); } }); // 按广告 ID 分组计算点击量和展示量 DataStream<Tuple2<String, Long>> adClickCountStream = adClickEventStream .keyBy("adId") .timeWindow(Time.minutes(1), Time.seconds(10)) .aggregate(new AdClickEventAggFunc()); // 过滤点击率小于阈值的广告 DataStream<String> filteredAdStream = adClickCountStream .keyBy(0) .process(new AdClickRateFilterFunc(0.01)); // 输出结果 filteredAdStream.print(); env.execute("Ad Click Rate Demo"); } // 广告点击事件 public static class AdClickEvent { private long userId; private long adId; private String province; private String city; private long timestamp; public AdClickEvent() {} public AdClickEvent(long userId, long adId, String province, String city, long timestamp) { this.userId = userId; this.adId = adId; this.province = province; this.city = city; this.timestamp = timestamp; } // getters and setters } // 广告点击量和展示量统计函数 public static class AdClickEventAggFunc implements AggregateFunction<AdClickEvent, Tuple2<Long, Long>, Tuple2<String, Long>> { @Override public Tuple2<Long, Long> createAccumulator() { return Tuple2.of(0L, 0L); } @Override public Tuple2<Long, Long> add(AdClickEvent value, Tuple2<Long, Long> accumulator) { return Tuple2.of(accumulator.f0 + 1, accumulator.f1); } @Override public Tuple2<String, Long> getResult(Tuple2<Long, Long> accumulator) { return Tuple2.of(String.valueOf(accumulator.f1), accumulator.f0); } @Override public Tuple2<Long, Long> merge(Tuple2<Long, Long> a, Tuple2<Long, Long> b) { return Tuple2.of(a.f0 + b.f0, a.f1 + b.f1); } } // 过滤点击率小于阈值的广告函数 public static class AdClickRateFilterFunc extends KeyedProcessFunction<Tuple, Tuple2<String, Long>, String> { private double clickRateThreshold; public AdClickRateFilterFunc(double clickRateThreshold) { this.clickRateThreshold = clickRateThreshold; } @Override public void processElement(Tuple2<String, Long> value, Context ctx, Collector<String> out) throws Exception { double clickRate = (double) value.f1 / ctx.timerService().currentProcessingTime(); if (clickRate > clickRateThreshold) { out.collect(value.f0); } } } } ``` 注意,这只是一个简单示例,实际应用中可能需要更复杂的数据处理和计算逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值