市场数据分析的步骤是什么(5个步骤做好数据分析)

抒情君 14

开篇

作为万金油式的胶水语言,Python几乎无所不能,在数据科学领域的作用更是不可取代。数据分析硬实力中,Python是一个非常值得投入学习的工具。

这其中,数据分析师用得最多的模块非Pandas莫属,如果你已经在接触它了,不妨一起来通过完整的数据分析流程,探索Pandas是如何解决业务问题的。

数据背景

为了能尽量多地使用不同的Pandas函数,我设计了一个古古怪怪但是实际中又很真实的数据,说白了就是比较多不规范的地方,等着我们去清洗。

数据源是改编自一家超市的订单,文末附文件路径。

导入所需模块

import pandas as pd

数据导入

Pandas提供了丰富的数据IO接口,其中最常用的是pd.read_excel及pd.read_csv函数。

data = pd.read_excel(文件路径.xlsx,sheet_name=分页名称)data = pd.read_csv(文件路径.csv)

从超市数据集中把多页数据分别导入:

orders = pd.read_excel(超市数据集.xlsx,sheet_name= 订单表)customers = pd.read_excel(超市数据集.xlsx,sheet_name= 客户表)products = pd.read_excel(超市数据集.xlsx,sheet_name= 产品表)

该环节除了导入数据外,还需要对数据有初步的认识,明确有哪些字段,及其定义

这里我们通过 pd.Series.head() 来查看每个数据表格的字段及示例数据

明确业务问题及分析思路

在业务分析实战中,在开始分析之前,需要先明确分析目标,倒推分析方法、分析指标,再倒推出所需数据。

这就是「以终为始」的落地思维。

假设业务需求是通过用户分层运营、形成差异化用户运营策略。数据分析师评估后认为可基于RFM用户价值模型对顾客进行分群,并通过不同族群画像特征制定运营策略,比如重要价值用户属于金字塔顶端人群,需要提供高成本、价值感的会员服务;而一般价值用户属于价格敏感型的忠诚顾客,需要通过折扣刺激消费等。

因此,这里的分析方法则是对存量用户进行RFM模型分群,并通过统计各族群数据特征,为业务提供策略建议。

明确业务需求及分析方法后,我们才能确定去统计顾客的R、F、M、以及用于画像分析的客单价等指标,此时才能进入下一步。

特征工程与数据清洗

数据科学中有句话叫 Garbage In, Garbage Out,意思是说如果用于分析的数据质量差、存在许多错误,那么即使分析的模型方法再缜密复杂,都不能变出花来,结果仍是不可用的。

所以也就有了数据科家中80%的工作都是在做数据预处理工作的说法。

特征工程主要应用在机器学习算法模型过程,是为使模型效果最佳而进行的系统工程,包括数据预处理(Data PrePorcessing)、特征提取(Feature Extraction)、特征选择(Feature Selection)以及特征构造(Feature Construction)等问题。

直白地说,可以分成两部分: * 数据预处理,可以理解成我们常说的数据清洗; *特征构造,比如此次构建RFM模型及分组用户画像中,R、F、M、客单价等标签就是其对应的特征。

(当然,RFM非机器学习模型,这里是为了便于理解进行的解释。)

数据清洗

什么是数据清洗?数据清洗是指找出数据中的「异常值」并「处理」它们,使数据应用层面的结论更贴近真实业务。

异常值:* 不规范的数据,如空值、重复数据、无用字段等,需要注意是否存在不合理的值,比如订单数据中存在内部测试订单、有超过200岁年龄的顾客等 * 特别注意数据格式是否合理,否则会影响表格合并报错、聚合统计报错等问题 * 不符合业务分析场景的数据,比如要分析2019-2021年的用户行为,则在此时间段之外的行为都不应该被纳入分析

如何处理:* 一般情况下,对于异常值,直接剔除即可 * 但对于数据相对不多,或该特征比较重要的情况下,异常值可以通过用平均值替代等更丰富的方式处理

在了解数据清洗的含义后,我们便可以开始用Pandas来实操该部分内容。

数据类型

先用pd.dtypes来检查数据字段是否合理

发现订单日期、数量是Object(一般即是字符)类型,后面无法用它们进行运算,需要通过pd.Series.astype()或pd.Series.apply()方法来修改字符类型

orders[订单日期] = orders[订单日期].astype(datetime64)orders[数量] = orders[数量].apply(int)

另外,对时间类型的处理也可以通过pd.to_datetime进行:

orders[订单日期] = pd.to_datetime(orders[订单日期])

修改字段名

经验丰富的数据分析师发现字段名字也有问题,订单 Id存在空格不便于后面的引用,需要通过pd.rename()来修改字段名

orders = orders.rename(columns={订单 Id:订单ID,客户 Id:客户ID,产品 Id:产品ID})customers = customers.rename(columns={客户 Id:客户ID})

多表连接

把字段名以及数据类型处理好后,就可以用pd.merge将多个表格进行连接。

表连接中的on有两种方式,一种是两个表用于连接的字段名是相同的,直接用on即可,如果是不相同,则要用left_on, right_on进行。

data = orders.merge(customers, on=客户ID, how=left)data = data.merge(products, how=left,left_on=产品ID, right_on=物料号)

剔除多余字段

对于第二种情况,得到的表就会存在两列相同含义但名字不同的字段,需要用pd.drop剔除多余字段。此外,行 Id在这里属于无用字段,一并剔除掉。

data.drop([物料号,行 Id],axis=1,inplace=True)

调整后得到的表结构:

文本处理——剔除不符合业务场景数据 根据业务经验,订单表中可能会存在一些内部测试用的数据,它们会对分析结论产生影响,需要把它们找出来剔除。与业务或运维沟通后,明确测试订单的标识是在产品名称列中带测试的字样。

因为是文本内容,需要通过pd.Series.str.contains把它们找到并剔除

data = data[~data[产品名称].str.contains(测试)]

时间处理——剔除非分析范围数据

影响消费者的因素具有时间窗口递减的特性,例如你10年前买了顶可可爱爱的帽子,不代表你今天还需要可可爱爱风格的产品,因为10年时间足以让你发生许多改变;但是如果你10天以前才买了田园风的裙子,那么就可以相信你现在还会喜欢田园风产品,因为你偏好的风格在短期内不会有太大改变。

也就是说,在用户行为分析中,行为数据具有一定时效,因此需要结合业务场景明确时间范围后,再用pd.Series.between()来筛选近符合时间范围的订单数据进行RFM建模分析。

data= data[data[订单日期].between(2019-01-01,2021-08-13)]

特征构造

此环节目的在于构造分析模型,也就是RFM模型及分群画像分析所需的特征字段。

数据聚合——顾客消费特征

首先,是RFM模型中顾客的消费特征: * R:客户最近一次购买离分析日期 (设为2021-08-14)的距离,用以判断购买用户活跃状态 * F:客户消费频次 * M:客户消费金额

这些都是一段时间内消费数据的聚合,所以可以用pd.groupby().agg()实现

consume_df = data.groupby(客户ID).agg(累计消费金额=(销售额,sum),累计消费件数=(数量,sum),累计消费次数=(订单日期, pd.Series.nunique),最近消费日期=(订单日期,max))

其中,R值比较特殊,需要借用datetime模块,计算日期之间的距离

from datetime import datetimeconsume_df[休眠天数] = datetime(2021,8,14) - consume_df[最近消费日期]consume_df[休眠天数] = consume_df[休眠天数].map(lambda x:x.days)

计算所得顾客累计消费数据统计表:

分箱处理——客单价区间划分

根据前面分析思路所述,完成RFM模型用户分群后,还要统计各族群用户消费画像,这里因篇幅限制仅统计各族群客单价分布特征。

此时,计算完客单价数据后,需要用pd.cut对客单价进行分箱操作,形成价格区间。

consume_df[客单价] = consume_df[累计消费金额]/consume_df[累计消费次数]consume_df[客单价区间] = pd.cut(consume_df[客单价],bins=5)

通过pd.Series.value_counts方法统计客单价区间分布情况:

pd.cut中的bins参数为将客单价划分的区间数,填入5,则平均分为5档。当然,还是那句话,这个在实操中需要与业务明确,或结合业务场景确定。

RFM建模

完成数据清洗及特征构造后,就进入到建模分析环节。

Tukey’s Test 离群值检测

根据分析经验,离群值会极大地对统计指标造成影响,产生较大误差,例如把马云放到你们班里,计算得出班级平均资产上百亿。在这里,马云就是离群值,要把它剔除出去。

所以,在开始对RFM阈值进行计算之前,有必要先对R、F、M的值进行离群值检测。

这里我们用Turkey’s Test 方法,简单来说就是通过分位数之间的运算形成数值区间,将在此区间之外的数据标记为离群值。不清楚的同学可以知乎搜一下,这里不展开讲。

Turkey’s Test 示意

Turkey’s Test方法依赖分位数的计算,在Pandas,通过pd.Series.quantile计算分位数

def turkeys_test(fea):Q3 = consume_df[fea].quantile(0.75)Q1 = consume_df[fea].quantile(0.25)max_ = Q3 1.5*(Q3-Q1)min_ = Q1-1.5*(Q3-Q1)if min_

上一篇:

下一篇:

  推荐阅读

分享