极简数据分析(上) - 10分钟掌握关键数据分析方法

“ 数据分析作为一项未来产品及运营人员必须掌握的技能,在工作中扮演着愈发重要的角色,相信大家目前也或多或少涉及到相关的工作。但平时更多时候可能是凭经验直觉在做分析,经验和直觉作为一种短决策快思考的方式,有时候会很好用,但风险是很大的。好一点的情况可能只是影响产出的效率,坏一点的话可能没法得出有价值的结论,甚至错误的结论。

因此本文更希望的是对我们已经在进行的数据分析行为和潜意识里存储的知识点进行系统性的梳理,形成常规作业的方法。在下次遇到需要数据分析的场景时,能够有一套相对高效科学的流程,而不是凭经验直觉。

工欲善其事必先利其器,选择正确的数据分析工具很重要,工具决定了你处理问题的效率和可处理的问题上限,但越专业的工具通常也意味着更高的上手门槛,因此不论是最常用的excel,还是数据分析类平台,例如SPSS、MATLAB,或者编程语言,例如Python、R,只有与自己需解决的实际问题相匹配的工具才是最合适的。杀鸡用牛刀不好,反过来也做不到,当然这不是本文讨论的要点。比工具更重要的,可能是数据思维,真正决定你能否从数据中挖掘本质事实的其实是思维,可惜这也不是本文讨论的要点。毕竟接下来的十分钟要讲的是直接的分析套路,这么看来本文其实是授人以鱼了。但鱼也是我们需要的,特别是在解决眼下实际问题时,即插即用可能更高效。万一等学会捕鱼,出海归来,食客已饿死大半呢?”

任何工作都是有一定套路的,数据分析也不例外,简单来看,可以分为以下5步:

1. 明确目标

2. 数据预处理

3. 特征分析

4. 算法建模

5. 数据表达

本文分为上下两篇,此篇涉及前3步,完成前3步已经可以进行常规的数据分析和基础的数据可视化工作了。下篇会讲解后2步,包括了回归、分类和聚类等分析时常用的算法建模,以及最终的数据表达。(其实是写到一半写不动了,希望下篇不鸽...)

01 明确目标


在动手前,先想清楚本次分析的目的是什么。数据分析一定是要形成结论的,结论来源于在分析前确定的目标,目标可以以设问或假设等形式被定义。例如提出问题:某类目下的畅销品是什么?再根据分析结果去调整畅销品的备货情况。或给出假设:假设市场上的红酒价格集中在100元左右。再根据分析结果去验证假设。

还可以定义需要由数据分析直接给出指导的问题,例如对未来销售数据的预测,则还需要在完成特征分析后,选择合适的算法建模。

02 数据预处理


在分析前,需要先对采集的数据进行预处理(以数据清洗为主)以适合分析。通常原始数据由于获取方式、渠道和格式等的多样,其质量是不够直接用于分析的。如果数据本身质量太差,即便分析手段再科学,过程再严谨,也只会是“garbage in,garbage out”。因此数据预处理的工作非常重要,也会花费大量时间,甚至会占据整个分析过程60%以上的时间。限于篇幅,只介绍最常见的情况和处理方式。

1. 缺失值处理

根据缺失的数据量和数据的重要程度进行判断。缺失数据不重要时可直接丢弃或作简单填充,缺失数据比较重要时,若缺失量也较大,说明这份数据质量太低,其实不适合做分析,建议寻找新数据源替换或补全,若缺失量在可接收范围内则需要进行插补填充。通常可使用整份数据的均值/中位数/众数进行插补,若数据有明显趋势或可用一定函数表达,可使用临近值插补(上一行数据或下一行数据)或多项式插值法(例如拉格朗日插值法)。Python中自带了拉格朗日插值法,可直接使用作出函数。

from scipy.interpolate import lagrange

2. 异常值处理

异常值代表和数据集偏离程度过高的数据,异常值不一定意味着错误数据,有可能是业务特殊波动造成的影响,例如在双11当天的交易量对比平日来说,很可能就是异常值了。要考虑实际分析目的,判断是否需要处理。异常值的处理方式和缺失值类似,更重要的是如何找出异常值,这里介绍3σ原则,即对于服从正态分布的数据,具体数值与整体平均值的差值大于3倍标准差时,可认定为异常值(p(|x - μ| > 3σ) ≤ 0.003),简单作图可看出这类异常数据的分布和占比情况(红点为异常值)。

3. 数据归一化

如果数据不在一个量级下,直接进行分析其实是没有太大意义的,因此需要对这类数据进行归一化(Normalization)处理。最典型的0-1归一化是将绝对数值映射到(0,1)区间内的一个小数,这样大家都是一个相对的比例,便于分析比较。

0-1归一化的公式为:x' = (x - X_min) / (X_max - X_min),分子为数值与最小值的差,分母为极差(最大值与最小值的差)。

03 特征分析


完成数据预处理后,我们认为已获得了一份高质量可分析的数据,从而可展开分析工作。数据分析是伴随着制图进行的,但此时作图主要是便于分析,并非最终的数据可视化。

以下列举常见的数据分析场景。

1. 分布分析

主要用于观察数据的分布特征和分布类型,适用于非时间序列的数据,例如分析房屋交易数据或班级内考试分数数据等。

对目标字段进行切片,若是定量字段(例如分数)则根据极差进行分段,若是定性字段(例如籍贯)则根据计数统计并进行分段。分段数通常在10个左右比较合适,我们就以10个为例,将目标字段的极差平均分为10个区间,再计算落在每个区间的频数、频率以及累计频率,可大致观察出数据的分布情况。

下图即为对一份房产交易数据进行的分布分析,以房产总价(万元)为目标字段,切分为10个区间,再观察整体的分布情况。可以初步发现交易数集中在低价和高价的房产,中等价位的交易数较少。

2. 对比分析

主要用于观察两个或多个有联系的样本数据之间的比较情况。

最常见的是绝对数间的比较,适用于对比指标基本处于相似量级的情况,例如团队对比各销售人员的销售情况以评定绩效。可使用基础的多系列折线图或柱状图进行比较。在重点分析两者间对比时,可以辅以两者的差值折线图进行分析,例如下图对A、B两名销售人员在一个月内每天的的销售额进行对比,可明显观察出两人的差距变化。

绝对数比较难以看出整体结构性的变化,因此需要通过相对数比较去观察单一数据与总体间的占比关系。计算每份数据在其自身数据总和中的占比,再以折线图表示可观察数据的相对情况。例如下图对比2家不同量级的门店销售数据以观察整体销售趋势时,观察绝对数时,低量级的数据无法反映任何有效信息,转化为相对数据后,即便量级不同,也可对比两者的销售趋势。

除去不同样本间的对比,还存在单一样本在总样本之和中的占比分析,如下图表示了某销售人员在全组销售额情况中的占比,很好理解。

以上3种对比均是不同时间上的对比(横轴均为时间),此外还存在空间对比,即同类指标在同一时间不同空间内的对比,例如对比全部销售人员的年度销售额,可以用简单的柱状图表示。

更为复杂的是动态对比,即同一现象在不同时间上的对比,说起来绕口,但其实却非常常见,最常见的应该就是同比和环比了。快速和大家复习下同比和环比的定义。

同比:与上一时间段内同一期相比,通常比较月同比,例如2019年10月数据与2018年10月数据相比。

同比增速(%) = (本期数 - 上一时段同期数) / 上一时段同期数 = 本期数 / 上时段一同期数 - 1

环比:直接和上一期相比,通常比较月环比,例如2019年10月数据与2019年9月数据相比。

环比增速(%) = (本期数 - 上期数) / 上期数 = 本期数 / 上期数 - 1

3. 统计分析

主要是对数据进行整体统计值的描述,以及观察数据的集中趋势和离中趋势。

集中趋势旨在度量数据向某一中心靠拢的倾向,衡量指标包括了基础的算数平均数、众数和中位数。众数和中位数又称作位置平均数。

离中趋势旨在度量数据以不同维度的距离偏移中心的趋势。衡量指标包括了大家熟悉的极差、方差与标准差。额外介绍一下分位差,它是将数据由小到大排序后的上四分位数(Q3,即位于75%)与下四分位数(Q1,即位于25%)的差,其反映了中间50%数据的离散程度。分位差在后面介绍的箱型图中会有更详细的描述。

4. 帕累托分析

帕累托法则有个更被大众熟知的名称,即二八法则。帕累托分析的目的也是为了找出带来80%收益的关键因素。在其基础上还有衍生出ABC分析法,在零售等行业会经常被使用。

例如下图,假设对全部10款产品销量进行分析,先对商品按照销量由高到低排序,再计算出占比和累积占比,即可观察出80%销量主要由前4款产品贡献,进而可以指导相应商品的库存等计划。

5. 正态性分析

正态分布又名高斯分布,在真实世界中正态分布几乎无处不在,我们实际生产中分析的数据大部分也满足正态分布。本文假定大家对正态分布都有足够的知识,不做过多解释。若对象服从正态分布,所有针对正态分布的定理和经验都可以直接套用。例如在服从正态分布的市场中寻找优先攻克的用户群,再如上述帕累托法则的应用,对于正态分布的样本才能体现其最大价值。因此检验数据是否服从正态分布,有很重要的意义。

通常可直接绘制直方图和密度图进行图形的粗判,或者也可以使用KS检验,若返回pvalue>0.05表示不能拒绝数据服从正态分布的假设,可以认为数据服从正态分布,若pvalue<0.05表示数据绝对不服从正态分布。Python实现方法如下。

from scipy import stats import numpy as np x = np.random.randn(1000)mean = x.mean() # 计算均值std = x.std() # 计算标准差stats.kstest(x,'norm',(mean,std))# .kstest方法:KS检验,参数为:待检验的数据,检验方法(norm为正态分布),均值与标准差>>>KstestResult(statistic=0.019774695987113344, pvalue=0.8290731977218249)

6. 相关性分析

在对数据进行更深入的分析时,我们期望能挖掘出一些不那么容易观察到的现象,比较常见的便是分析连续变量之间的线性相关程度。分析对象间的相关性也是普遍存在,并且非常有价值的信息。例如电商网站推荐的商品组合,一般都是进行关联分析后,寻找到的有强关联的购买组合。

在没有介绍到具体的机器学习算法之前,我们只从数据分析角度去寻找相关性。利用散点图可以进行初步判断,以变量A为横座标,变量B为纵座标,即可观察两者的线性相关程度。例如下图分别对变量A、B和变量B、C进行分析,可以看出A、B间存在正相关,B、C间存在负相关。

在有超过2个变量时,可以利用散点图矩阵在一张图中表现所有变量两两之间的关系,十分高效。矩阵是呈对角线对称的,我们看其中一半就好。例如下图将A、B、C、D,4个变量放入散点图矩阵中,可以看出其中不止一种相关性,具体关系交给大家判断一下。

评估相关性还可以利用一系列相关系数,选择不同的相关系数评估的结果也不一样,选择的方式一定程度取决于数据本身的分布情况,我们只介绍2个常用的相关系数。

皮尔逊系数:该系数用r表示,适用于服从正态分布的数据,因此需要先做正态性检验。对服从正态分布的数据,若|r|>0.5,可认为两者有显著线性相关,若|r|>0.8,则两者高度线性相关,在Python中直接使用.corr()方法调用。

data.corr(method='pearson')

该方法会返回变量间相关系数的矩阵,可以看出A和B之间存在线性相关。

ABCD

A1.00000.8985-0.0482-0.0563

B0.89851.0000-0.0710-0.0413

C-0.0482-0.07101.00000.0712

D-0.0563-0.04130.07121.0000

斯皮尔曼系数:该系数用希腊字母ρ表示,当数据不服从正态分布时可使用斯皮尔曼系数判断,斯皮尔曼系数和皮尔逊系数的计算公式很类似,但其计算采用的是取值的等级(或者说是由小到大的排序序号),而不是取值本身。其判断范围和在Python中的使用方式都和皮尔逊系数一样,注意修改method参数为spearman。

data.corr(method='spearman')

小结


本篇介绍了数据分析工作的前3步:明确目标,预处理和特征分析。根据个人经验,熟练掌握数据预处理和特征分析的方法已经足够解决80%的数据分析问题了。

预处理阶段包括了对缺失值的处理,异常值的判断和处理,以及数据差距过大时的归一化。特征分析包括了观察整体结构组成情况的分布分析,观察不同维度下数据间比较的对比分析,个别汇总描述代表性数值的统计分析,验证二八法则的帕累托分析,以及判断数据分布情况的正态性分析相关性分析

下篇(如有)将迈入算法建模和数据表达,尝试利用机器学习挖掘更深层次的数据特征和运用更高阶的展示技巧进行数据可视化。

See you~


欢迎关注公众号:罗老师别这样

公众号将持续更新深度学习笔记及个人心得,不轻易更新,但更新一定保证价值,望你和作者共同进步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章