从细分到多层下钻数据分析
细分是网站分析的基本方法,也是数据分析的基本思路。细分分析的过程是对整体数据进行层层拆分,然后找到影响整体的局部因素。
步骤1:全站流量按来源模块可细分为广告、SEM、SEO和直接输入(假设只有4个模块)。细分发现广告是网站流量的主要来源(昨日访问量占比82%),访问量增长2194,比例为67%,说明了广告是网站访问量增长的主要驱动因素。
步骤2:对广告模块做进一步细分,发现其中主要增长模块为Sina,该模块昨日访问量占比79%,环比前日增长1990,比例为85%。如果该模块有不同的位置,还可以做进一步细分。
至此已经找到了昨日网站访问量增长的主要原因是Sina来源流量增长,此时可直接找到Sina模块的业务负责人进行沟通进一步原因。
案例背景
日报、周报、月报等常规性报告是各个公司的基础数据支持形式。在日常报告中,经常会出现很多异常波动的指标,需要分析师找到异常波动的影响因素。但在寻找主要因素时由于需要下探的层级较多,实施起来会非常费时费力。以大型公司的广告投放渠道为例,可能包括以下层级:
- 一级渠道包括SEM、AD、CPS、Social、导航等;
- 二级渠道以SEM为基准包括百度、谷歌、360等;
- 三级渠道以百度为基准包括关键字、网盟等;
- 四级渠道以关键字为基准包括不同的广告计划;
- 五级渠道以广告计划为基准可以细分到不同的广告组;
- 六级渠道以广告组为基础可以细分到不同的关键字。
本案例介绍了一个自动化细分找到主要影响因素的方法——基于自动节点树的数据异常原因下探分析方法,该方法的实施思路是:找到每个层级上影响最大的因素并依次做下一因素的细分,直至最后一个因素。具体过程如下:
- 统计全站在一定周期内、特定指标下的数据环比变化量和环比变化率。
- 指定要分析日期并获得该日期及其前1天的数据。
- 以全站数据为基准,下探第一层级维度并对指定日期和其前1天的数据做分类汇总。
- 计算第一层级维度下分类汇总后的两天数据的差值并得到环比变化量和环比变化率。
- 对第一层级维度下的变化量排序,并分别获得环比变化量最大和最小情况下的维度名称、变化量和变化率。
- 计算下一层级变化量与上一层级变化量的比值,变化量最大值和最小值的比例将被定义为正向贡献率和负向贡献率。
- 循环上述步骤,直至所有层级都计算完成。
- 使用树形图展示所有层级下的变化量最大和最小的维度信息包括维度名称、环比变化量、环比变化率、贡献率等信息。
案例数据
以下是本数据集的6个维度的详细说明:
- date:日期,格式是YYYY/MM/DD。
- source:流量来源一级分类,来源于业务部门的定义。
- site:流量来源二级分类,来源于业务部门的定义。
- channel:流量来源三级分类,来源于业务部门的定义。
- media:流量来源四级分类,来源于业务部门的定义。
- visit:访问量。
python代码
import datetime
import pandas as pd
import numpy as np
from graphviz import Digraph # 画图用库
# 载入数据
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/advertising_data.csv')
# 显示部分数据
df.head()
# 数据类型
df.dtypes
‘‘’
date object
source object
site object
channel object
media object
visit object
dtype: object
‘’’
# 查看缺失值
df.isna().sum()
‘’‘
date 0
source 0
site 0
channel 0
media 0
visit 0
dtype: int64
’‘’
根据上述的数据审车校验结果,需要处理的内容包括:
- 将date列转换为日期型,便于后期基于数据做筛选以及日期计算。
- 将visit列中的“-”进行转换。由于从网站分析工具导出时,“-”代表的是没有数据,因此这里转换为0。
# date列数据转化为日期型数据
df['date'] = df.date.astype('datetime64[ns]')
# 将visit列中的“-”转换为0
df['visit'] = df.visit.replace('-', 0).astype('int64')
这里先将每天的数据与其前1天的数据做环比变化统计:
# 获得每天visit的汇总
day_summary = df.iloc[:,-1].groupby(df.date).sum()
# 通过差分求平移一天后的变化
day_change_value = day_summary.diff(1).rename('change')
# 求变化率
day_change_rate = (day_change_value /