Power bi

1,234 阅读29分钟

power bi desktop四大组件

  1. power query(数据连接、清洗、处理)

image.png

  1. power pivot(数据建模、多表连接)

需要单独加载

image.png

  1. power map(地图可视化)
  2. power view(可视化报表)

power query

  1. power query 实现多数据源导入 导入:素材1:txt文本格式导入-Power Query销售记录

image.png

image.png

转数据--进入query编辑器,该编辑器是个独立窗口,但同时该编辑器若不关闭的话,excel软件无法继续操作。

image.png

query编辑器中

image.png

image.png

加载或关闭并上载:会保留原始数据页,将导入的数据直接加载到新的sheet页中,数据导入形式 就是以表的形式加载到新的工作表中

加载到 或 关闭并上载至:会让你选择数据的显示方式,以及数据存放的位置

image.png

若想从excel中继续回到query编辑器

  • 方式一:【查询】菜单栏--编辑

image.png

  • 方式二:【数据】菜单栏--查询和连接 小窗口

image.png

数据源路径补充和强调 由于query的本地形式获取数据是以文件路径行为进行连接的,可以通过以下方式进行查看和调整

  • excel中 image.png
  • query编辑器中 image.png

数据/ 业务场景:

  • 当前连接到的数据源路径,主打--- 读取该路径下的文件下的数据内容
  • 故若别人给到你的项目文件,同时给了你源数据文件的话 或 你源数据文件的路径有被 你移动调整,你需要先做一个重新连接,让其重新读取到你给到的绝对路径下的数据文 件,否则无法重新进入到query编辑器中做再次的清洗处理操作的,只能基于当前加载到excel中的数据内容进行可视化 或 excel的其他操作,以及无法联动更新
  • 比如:源文件的路径不在原来的位置 或 我将我的项目文件【excel工作簿】发给你们, 打开后excel上有数据【因为这是已经加载上来的数据】,但进入query编辑器会发现有 报错,报错信息:读取不到该路径下的文件 image.png 解决方案:重新连接到你电脑上的源数据文件的新路径即可 image.png

power query数据处理

一、 一个案例了解 power query 需求:我公司线下有两家门店,为方便对两家门店进行业务数据整理,规范了两家门店的数据录 入格式,现在需要将两家门店的数据合并进行总体分析,该如何进行数据处理?

image.png

  1. 利用query分别导入一店和二店的数据表
  • 先导一店

补充:query界面介绍 image.png

  1. 在该编辑器中,主页-新建源 导入二店数据

image.png

  1. 切换到一店表中,删除前两行

image.png

  1. 将数据表中的第一行数据,提升为标题

image.png

  1. 当标题行正式拥有确定好以后,再检查数据类型,必须统一,若发现不统一或自动检测不准确,即手动调整

image.png

image.png

  1. 全选数据ctrl+a,删除重复项,保证数据表的唯一性

image.png

  1. 同样的处理方式,将二店也清洗完成
  2. 将一店和二店数据汇总到一起,形成销售总表
  • 前提:两表的字段名称是一样的,顺序无所谓
  • 追加的时候,会以字段名字进行匹配

image.png

image.png

判断追加内容是否成功

- 方式一:基于追加的特点,临时修改某张表的字段名,比如将二店的订单编号 改为 订单id, 回到追加后的表中即可发现 有 单独的id列 和 单独的编号列,同时 订单id为空时,其编号列 均有值;反之一样 --- 追加好了

追加的时候,会以字段名字进行匹配,若该表有,另外一张表没有,另外一张表的数据自动 以null值填充 ,单独形成两列

image.png

  • 方式二:通过上载到excel中,从查询窗口中进行数量的查看

image.png

当数据源的数据内容有调整更新的时候,可联动更新

前提:数据文件路径不能改变,好query得读取到该文件,更新的内容要主要尽量避免字段名的修改

image.png

以及数据下的连接属性

image.png

image.png

image.png

PQ常用的清洗12招

1.基础行列操作

image.png

image.png

image.png

删除空行:删除整行为空的行

删除重复项:删除当前选定列中包含重复值的行,保留第一行重复的。

删除错误:可以使用列中同时有数字或文本,把列类型改为文本或数字,然后可以删除错误行

利用【转换】--【填充】向下快速按节点进行值的填充,将值向下或向上填充空的格。

image.png

保留行的几个操作

image.png

  1. 删除重复项--针对性删除

query中删除重复项的特性:当数据进行分组【排序】之后,自动保留分组中的第一条数据

排序分组后删除重复项

image.png

但有个bug,主针对于数字内容上,即客户id+金额降序后,然后直接对客户id做去重,按照特性 应该是保留下最大的金额的客户id,但检查发现没有

  • 工作原理: 在排序后,我们所看到的排序效果是前台所显示出来的,但后台所运行的并不是 排序后的结果,真正后台运行的结果是清除排序后我们所看到的。
  • 如何解决:需要在排序后,进行一项对表格没有作用的操作,覆盖掉排序操作,推荐:转换 菜单下的检测数据类型

只要做了排序,不管后续是不是做去重操作还是做其他的处理,都直接连带着加上【检测数据类型】步骤

image.png

  1. 数据格式的转换

空格:substitute 前后空格:trim 回车:clean 合并:concat或& 大小写:lower,upper,proper 提取:left,right,mid

  • 前后空格和非打印字符

image.png

清除:删除回车 --- clean

修整:前后空格删除 --- trim

合并列

  • 建议先复制要合并的两列【右键--重复列】
  • 利用ctrl键,选中要合并的列,转换-文本列-合并列,选择合并时的分隔符。

提取

转换-文本列-提取,类似于left,right,mid

范围:提取起始字符的索引提取n个字符,索引从0开始。

image.png

替换

image.png

从身份证判断性别

  1. 先提取身份证倒数第二位
  2. 【转换】-【编号列】-信息,判断奇偶,返回的是True/False的bool类型
  3. 转换成文本类型,替换成男/女

image.png

转置与反转行

【转换】-【表格】-转置:数据内容的行列互换,字段名不会转置。

image.png

反转行:针对数据行进行倒序的效果

image.png

透视和逆透视

  1. 透视:一维转二维
  2. 逆透视:二维转一维

逆透视其他列最常用。

将除当前选定列的以外的所有列转换为属性值对

选中项目列,逆透视其他列,其他列的列标题会作为转换后结果表中的一个属性列内容,原表中的数据内容则作为该属性列的值列。 image.png

逆透视其他列后,其他列标题则作为属性列的内容。 image.png

透视列

以选中的列作为结果表的列标题的存在,同时需要选择数据去展示的值是哪一列

选中属性列,月份列透视后会变成列标题,值按求合作为值列。 image.png

image.png

image.png

分组依据

分组依据里对于文本列没有《不要聚合操作》,可以先进行求和操作

image.png

image.png

Text.Combine([合并列],分隔符)

分组依据:所有行,会根据分组的字段,形成一个新列,那个列每个都是一张表。

自定义列

  1. 可以进行字段间的四则运算,&可以用于文本之间的拼接,可以将非文本类型转换成文本 image.png
  2. 新建条件列
if 条件1 then 满足条件1的输出
else if 条件2 then 满足条件2的输出
else if 条件3 then 满足条件3的输出
...
else 其他条件的输出

自动化计算距今n天的数据

  • 获取系统时间:DateTime.LocalNow()
  • 时间间隔计算:结束时间-起始时间

为了方便自动化筛选,可以先计算日期与今天的相隔天数,自定义列 =DateTime.LocalNow()-日期, 转换成数字,获取间隔天数,筛选大于n天的数据。

通过新建参数自动化管理

【主页】-【管理参数】-新建参数 image.png

image.png

找到M函数的公式,将变量替换成参数

image.png

排序

  1. M函数进行排序:排名=Table.AddRankColumn(上一步的名字,"新列名",{"字段名/排名的依据",Order.Descending/Order.Ascending})(1 2 2 2 5跳过重复的),然后in模块修改为最后一个步骤。
  2. 不跳过重复值的排序(1 2 2 3 3 3 4)这种,复制原表,重命为辅助表,将判断依据(数据,销售额)做唯一处理(删除其他列),然后排序,顺便检测数据类型,添加编号列(辅助列),回到原表,按判断依据合并查询,展开得到排名值。

分组排名

按照部门进行销售额排序 image.png

  1. 先将原表的部门(分组依据)和销售额(判断依据)降序,得到每个分组的判断依据排序。复制得到 辅助表1:选中部门(分组依据)+销售额(判断依据)删除其他列,去重后得到分组下唯一的判断依据的排名,添加索引列(从1开始),即该金额属于这部门内的唯一值。--该部门下该金额有一个对应的值。(1,2,2,3,4要先去重再添加索引列。如果是1,2,2,4,4,6的话先添加索引列再去重)
  2. 复制辅助表1,重命名为辅助表2,基于辅助表1,获得每个部门在当前排名下的最小排名值(行编号),分组依据->根据分组获得行编号(最后一列的索引列,分组内最小排名)的最小值
  3. 将辅助表1和2按部门(分组依据)合并,展开得到最小行编号, 自定义列,通过辅助表1中的索引行编号-该部门的最小排名值【行编号】+1=这个部门这个唯一金额的排名情况。
  4. 回到原表,通过部门(分组依据)+金额(判断依据)进行多条件合并,展开排名值,即可得到最后该部门该金额的排名(带有并列的情况,1,2,2,3,4...)

PowerPivot

excel的powerpivot的【管理】进行pp窗口

  1. pp数据导入,不支持批量导入,且导入前源文件不能被打开,先用pq进行清洗,再用pp进行关联操作, 从其他源导入excel文件,如果有列标题,必须勾上使用第一行作为列标题,缓存文件不用勾

image.png

image.png

GMW:成交总金额/销售总金额

北极星指标:唯一关键性指标

多张表的建模,一端表的所有字段可以控制多端表的所有字段 image.png

度量值:=公式

通过pq的方式将数据打开到pp中,先将文件用pq打开,然后关闭并上载至,勾上将此数据添加到数据模型

多张图表是否联动

点击遥控的图表,点击【格式】-【编辑交互】,点击被遥控的表,点击无,就不联动,如果要联动,点击筛选器。

DAX函数

DAX的主要功能正是查询和运算,DAX查询函数负责筛选出有用的数据集合;DAX聚合函数进行数据指标的计算

可以利用dax创建度量值,新建列,以及再power bi desktop中进行新建表的功能

DAX函數 --- 数据分析表达式

  • 类似于Excel函数【数据分析相关的 聚合函数、日期相关、文本相关、逻辑相关等】

  • 基于列或表的计算

  • 引用“表”“列”或“度量值”

  • 通过“ ' ”或“[ ”启动智能感知

    • 单引号 :引用表名

    • 方括号:引用字段名 或 度量值名称

      • 字段名的引用上 最好跟着表名一起,写完整
      • 度量名不需要表名的指定,直接引用即可

规范来说:对于表和字段来说,引用字段最好是完整形式,即要包含表名 // '日期表'[日期],以便和度量值区分开

强调:一定一定要注意的是,你的计算结果到底是一列值 还是 一个度量值,因为在正式写的公式之前是要选择在哪块区域中进行填充的

如果需要再数据源中添加一列,则是对整列的计算,每行返回一个结果值 --- 新建列

而如果是基于表的计算,计算结果成为度量值 ---- 度量值(数据指标/模型指标)

度量值的写法:

度量值名: = 表达式/公式

冒号英文输入法,以及一定要给一个度量名称'

度量值最好计算在最底层。

统计订单量

订单量:=counta('订单汇总表'[订单编号]) 非重复计数

1. 运算符号的使用

算术运算:+,-,* ,/

比较运算符:跟excel一样,其中不等于 <>,等于=

文本拼接符:&

逻辑符(多条件之间的的连接符): && --- and(且) ; || --- or(或),and和or只能两个参数,多个参数使用 &&和||,a&&b&&c&&d;

必备的dax函数

文本类型月份排序:月份=format(month([年月]),"00") & "月"(01月、02月、03月)

  • distinctcount(字段)--非重复计数

  • 表名=values(列名或表名):提供列名后,返回唯一值的单个列的表。提供表名后,返回具有相同列的表

关系函数(related,relatedtable)

  • related:返回列

在关系层中,在多端表中去引用或提取对应一端表中的列值(类似于vlookup函数),专为计算列使用--跨表获取相关的维度内容列

related(一端表的列名)

其匹配判断的依据,就是关系连接中连接的那两个字段,比如销售订单表(多端表),每个订单关联一个产品,在产品表中(一端表),在销售订单表中新建列显示每个订单的产品名称(产品名称=related('产品表'[产品名称])

  • relatedtable(表名):返回表

  • 在关系层面中的一端表中获取多端表中的相关行数据--返回多行多列数据【其匹配依据利用的是关系上的连接字段】。通过新建列,在每一行匹配多端表的数据,效果类似于query中的分组依据--所有行。由于返回的是表,所以不能直接用于计算列,需要对返回的表进行聚合计算,例如使用countrows,获取有意义的数据。订单数 = COUNTROWS(RELATEDTABLE(销售表))这样就可以计算出每个产品在销售表中有多少相关的销售记录。

countrows(表):统计表的行量 =countrows(relatedtable('订单汇总表'))

relatedtable('订单汇总表')--得到该省份在汇总中所有对应的数据条信息, countrows()对上方返回的数据表进行行数统计。

一端表直接引用多端表的度量值,度量值会根据连接依据拆分

排名

rank.eq(判断的值,判断的区域范围,判断的方式)

desc:降序

asc:升序

calculate函数---筛选函数(度量值筛选)

calculate(表达式【度量值计算公式/度量值】,筛选条件1,[....筛选条件N])

筛选条件逗号隔开,表示同时满足。

若想得到相同字段之间不同值的或者满足情况

  • calculate(度量值,字段 in{值1,值2,...},条件2)

功能上::从某个度量值内进行特定维度条件的拆分,其筛选条件可省略,具体操作:

  • 若筛选条件为手动编辑固定的一些条件的话,则其返回值本质来讲就是个度量值计算,故计算与 度量值区域
  • 若筛选条件是在一维表中直接使用行维度进行的话,则条件编写省略,其计算区域 为新建列,其条件则自动按该行上的连接维度

重要属性:筛选条件不受自身切片器的影响【即当可视化中的行维度或切片器等与calculate内筛选条件所使用的维度的一样【同一个表下的维度】时候,不会有冲突,以函数为主】

2022年销售总金额:=calculate([销售总金额],year('订单明细表'[下单日期])=2022)

使用数据可视化表检查

行:下单日期

值:销售总金额

filter--筛选函数--表筛选

filter:拷贝+筛选作用,返回值为一张筛选后的数据表

filter(表,筛选条件)

filter(表,条件1 && 或者是 || 条件2)--同时满足(或者满足)条件1和条件2

因为filter返回结果是一张表,故公式运行肯定会报错

  • excel中的dax函数返回表的解决方案
  1. 先在pp中利用度量值区域将公式写好,写完复制等号(=)后面的所有正式的公式计算内容
  2. 切换回excel软件界面,新建一个sheet表---数据菜单栏【现有连接】---表格---随意找一张表进行加载(建议找张少量的,加载会快点)---默认点击确认即可。
  3. 在返回出来的表中随意某个单元格上右击--表格---编辑DAX
  4. 选择命令类型DAX,在表达式框中先输入evaluate,然后换行输入复制来的公式
  5. 确定成功,即可得到公式运行后的展示和输出

calculatetable,返回一张筛选过后的表,通过关系链接来返回满足条件的数据条信息表

其筛选条件若需要进行跨表,则直接引用,不需要related配合【前提,必须有关系】;同时多个条件逗号隔开

calculatetable(表,筛选条件1,筛选条件2...)--条件同时满足

东区自行车销售记录表 = CALCULATETABLE('销售记录','省份区域'[区域]="东区",'产品分类'[产品分类]="自行车")

与filter的主要区别:

  • calculatetable主走关系,跨表直接引用;其逻辑关系是同时满足
  • filter跨表需要related进行配合;同时多个条件需要配合逻辑函数进行
  • filter('订单明细表',related('省份区域'[区域]="南区" && related('产品分类'[产品分类])="自行车")

如果是不同字段之间 或者 满足的情况,只能使用filter进行筛选

若是同个字段之间或者满足的话

calculatetable(表,字段 in {值1,值2,...})

divide安全除法

防止分母为零的情况

divide(分子,分母)

pib中同环比率计算操作

dax函数中同环比率【差异百分比】=(今年【这个月】关键指标-上一年【上个月】关键指标)/上一年【上个月】关键指标

  1. 时间智能偏移函数--dateadd

(新建列或表)返回列或表

```
dateadd(日期,间隔,时间单位)
第一个参数:进行平移计算的日期列
第二个参数:偏移量,负整数,向过去偏移;正整数,向未来偏移,-1就是上一年、上一月,1就是下一年、下一月
第三个参数:偏移的单位:("year":年,"month":月,"quarter":季度,"week":周,"day":日)
```

2. 计算指标

利用dateadd配合calculate自动筛选出上一天,上一月

  • 前一天销售数量 = CALCULATE([销售数量],DATEADD('日期表'[日期],-1,DAY))
  • 销售数量日环比 = DIVIDE([销售数量]-[前一天销售数量],[前一天销售数量])
  • 前一月销售数量 = CALCULATE([销售数量],DATEADD('日期表'[日期],-1,MONTH))
  • 销售数量月环比 = DIVIDE([销售数量]-[前一月销售数量],[前一月销售数量])
  1. 可视化操作
  • 柱形图、条形图:元素之间比较
  • 拆线图:时间--趋势、走势
  • 饼图、环形:占比(比率)
  • 散点、气泡--相关关系(x,y,z数值),集中度,趋势走向
  • 卡片图:展示关键指标

计算完的字段名不能在值字段设置里更改,会影响到本体名字

帕累托分析法

image.png

帕累托分析法:82法则

两种分类方式:

  • 28法则:即利用累计占比直接按80和20作为节点分类
  • ABC分类法:即累计占比指标分为三大类

例如:80%的销量额来源于20%的产品

那么考虑需要得到该产品的销售总金额,需要一张产品唯一的产品维度表(20%的表),且产品id或产品名称肯定是唯一,以及销量额度量值(80%的度量值)。

方式一:回到query使用分组依据,得到产品(唯一)的销量额,但需要源数据

方式二:利用summarize得到数据表,优势是不需要源数据。

dax函数:summarize

summarize:返回一张摘要表,显示对一组数据的分组汇总情况--query中分组依据的函数化

summarize(表,分组的依据字段1,[分组依据字段2,...],新列名1,进行聚合的计算字段表达式1,[新列名2,进行聚合的计算字段表达式2,...])

= SUMMARIZE('销售记录','销售记录'[客户省份],'产品分类'[产品分类],"总金额",[销售总金额],"数量",SUM('销售记录'[数量]))

进行聚合的计算字段表达式是要聚合后的,它会根据前面分组依据进行拆分

若分组依据字段在这张表里没有,可直接引用其他表,不需要related。

本质参数:4个

参数1:从哪张表进行分组操作

参数2:分组依据,若有多个按逗号隔开

参数3和参数4需要连着写,为聚合操作字段返回值给定一个新列名,若有多个聚合操作,写完一个完整的再写第二个,逗号隔开

然后销售额降序,销售额越大价值越高,方便理解和累计。

新建列--=销售总金额度量值,该度量值会按行拆分。

累计占比--累加的金额占总金额的比例

  1. 先对各类产品销售总金额进行降序排序
  2. 对于累加计算的相关函数组合:sumx+filter+earlier sumx--返回每一行的计算的表达式之和

sumx(表,表达式)

filter(表,筛选条件):再次的作用,筛选出基于当前行+当前行之前的数据行形成的数据表

earlier:上下文函数,返回提及列的外部计算传递中的指定列的当前值

  • 参数1:拷贝的内容列
  • 参数2:默认1,一般省略
  • 在此的作用,利用上下文特点,配合filter筛选出当前行+此行之上的其余数据行
  • filter('产品分类',earlier([产品销售金额])<='产品分类'[产品销售总金额])
  • 最后利用sumx对每行筛选出来的这个数据表产品销售总金额进行累加即可
  • sumx(filter('产品分类',earlier([产品销售金额])<='产品分类'[产品销售总金额]),'产品分类'[产品销售总金额])

公式解释:每一行上筛选出当前行+当前行值之前(比当前价值还要高的其余价值数据)形成的数据表,这个字段降序就是earlier('表名'[字段])<=[字段],这个字段升序就是['表名'[字段]]>=[字段]。

新建列:累计占比计算=[列名(销售量金额)累计]/sum(列名(销售量金额))

由累托图可视化:插入--推荐的图表--组合图

对累计占比值进行ABC分类判断:

  • A类因素,发生频率为0%-70%
  • B类因素,发生频率为70%-90%
  • C类因素,发生频率为100%

客户分析

RFM模型三个关键指标:

  • 最近一次消费时间(R值):客户距离最近的一次采购时间的间隔。
  • 最近一段时间内消费频次(F值):指客户在限定的期间内所购买的次数。
  • 最近一段时间内消费金额(M值):客户的消费能力,通常以客户单次的平均消费金额作为衡量指标
  1. 计算当前时间与最后一次购买之间的间隔天数--R:=today()-'销售记录'[下单日期]

    新建度量值R:=min('销售记录'[距离今天的天数间隔])

  2. 对下单订单数量进行统计--F=distinctcount('销售记录'[订单编号])

  3. 对销售金额进行统计--M:=sum('销售记录'[金额])

dax函数:summarize

summarize:返回一张摘要表,显示对一组数据的分组汇总情况--query中分组依据的函数化

summarize(表,分组的依据字段1,[分组依据字段2,...],新列名1,进行聚合的计算字段表达式1,[新列名2,进行聚合的计算字段表达式2,...])

本质参数:4个

参数1:从哪张表进行分组操作

参数2:分组依据,若有多个按逗号隔开

参数3和参数4需要连着写,为聚合操作字段返回值给定一个新列名,若有多个聚合操作,写完一个完整的再写第二个,逗号隔开

时间间隔函数

datediff(起始时间,结束时间,时间单位)

返回两个日期之间的时间间隔(可指定单位)

注意:datediff函数在处理小时单位间隔的计算上比较简单,属于直接从日期时间中提取小时数后
直接相减的,即不考虑分钟情况。故计算结果上会有一定的出入,在不影响整体的情况下,可忽略;但为了提高准确率,先计算间隔分钟[分钟和秒数不影响],对小时上进行手动换算:分钟/60。

分组依据:所有行,获取订单付款时间,将each后面修改为each[#"订单付款时间"], type list。然后自定义列,提取列表中最有价值的两次交易时间,做间隔计算

List.FirstN(列表名,行的数量):返回列表中的前N行,得到一个新列

List.LastN(列表名,行的数量):返回列表中的后N行,得到一个新列

同时由于后续要计算的是间隔,如果只有一次付款时间的话也无法计算,筛选只有一次付款时间的客户

List.Count(列):返回计算列表中的元素个数

也可筛选列中最大值与最小值的计算

List.Min(列):得到列表中的最小值

List.Max(列):得到列表中的最大值

但默认天数从0开始,此计算方法会过于版面,所以配合日期转换的M函数:Duration.Days(),进行24小时制转换

Duration.Days(日期):返回日期的天数,按小时进行换算,返回一个不天数值。

自定义列,计算最近再次交易时间间隔

Duration.Days(List.Max([最近再次交易时间])-List.Min([最近两次交易时间]))

时间智能偏移函数--dateadd

功能:指定间隔移动后的日期

返回值:表或列值

dateadd(日期,间隔,时间单位)

  • 第一个参数:进行平移计算的日期列
  • 第二个参数:偏移量,负整数,向过去偏移【上一个,上N个】;正整数向未来偏移【下一个,下N个】,比如:-1表示上一年、上一月;-2表示上两年、上两月;1表示下一年、下一月。
  • 第三个参数:偏移的单位:年、月、季度、日,枚举值。

注意: 1、dateadd函数需要有行维度依据【日期相关维度】,进行 该行上 该日期的偏移查找 2、在正式的使用过程中【配合calculate进行】,由于会有日期维度的拆解,故比如 像今年 的总金额,去年的总金额等,其实就是直接使用总金额度量值即可,他会自动按 届时的 可 视化中给定的行维度依据【年份、月等】进行拆解,同时所谓的上一年、上一月总金额等, 即让dateadd函数打配合即可,故可视化中 就必须要应用到 年、 月等维度【日期维度】 3、计算与可视化拆解过程中,dateadd函数的参数1 使用日期 与可视化中拉取的维度内容需 要保持在同一张表中,因为dateadd届时只是替换掉calculate中的固定条件而已,故本质还 是由calculate筛选功能在,那么就要注意 calculate函数本质的筛选条件使用的字段 不能与可 视化中拉取的不一样【不一样就会做二次筛选】 -- 即 记得一句话:只要用到维度依据,不管是计算上 还是 可视化中 均优先使用一端表中的内容! 4、 dateadd函数计算时,若涉及到 平年闰年 或 大小月份上,比如当前是31号,找到上一 个月的则直接是上个月的最后一天为基准

在销售记录表中新建度量值:

  • 前一天销售数量 = calculate([销售数量],DATEADD('日期表'[日期],-1,DAY))
  • 较前一天销售数量占比(日环比) = DIVIDE([销售数量]-[前一天销售数量],[前一天销售数量])

image.png

dax函数:values(列或表):提供列名后,返回唯一值的单个列的表(去重),提供表名后,返回具有相同列的表(去重)

计算同环比日期尽可能拿一端表,其次拿日期的表必须和可视化时拆分的日期是同一个表。

计算去年同期、上月同期

上年=calculate(sum(sheet1[销售额]),dateadd(sheet1[年月时间],-1,YEAR))
上月=calculate(sum(sheet1[销售额]),dateadd(sheet1[年月时间],-1,MONTH))
同比增长率=if(isblank(sheet[上年]),"",(sum(sheet1[销售额])-sheet1[上年])/sheet1[上年])
环比增长率=if(isblank(sheet[上月]),"",(sum(sheet1[销售额])-sheet1[上月])/sheet1[上月])

如果字段数值跨度过大,可考虑分组

字段上右键,新建组,组类型为箱,装箱类型为:装箱大小,装箱大小为多少为一组,例如100为一组[0,100]为第一组,[101,200]为第二组。

同样的操作,可以分5为一箱,届时利用数据的深钻功能进行细钻分析。

扩展

利用power query 爬取豆瓣数据

获取数据--Web

image.png

image.png

连接--转换数据--进行query编辑器

批量直接导入方式:走M函数及自定义函数

  1. 主页--高级编辑器 在let正式步骤之前回车,顶格输入:(p as number ) as table => 其中:

p是我们自定义的一个参数名【变量名】而已,名字可更改
(p as number ) --- 这个p的数据类型为 数值类型
此代码就是做了一个自定义函数,利用 页面的调整 来执行下方具体的步骤 (从let 到in)

  1. 找到源步骤中,将"0"【页面的位置】修改为(Number.ToText(p))[数据转换成文本]
  2. 为了能让其快速调用,新建一个页码表,作为p的具体参数值,页码表的内容从0开始增量25,一直到225结束。
  3. 在页码表上进行添加列--调用自定义函数

image.png

O2O优化前和优化后灰度测试

  1. Excel导入优化前后的两个表格

UV:独立访客数 image.png

image.png

  1. 相关指标:(1):预订交易额(2)交易额(3)日均UV(PC+APP);比例指标:(4):预订/交易客单价(5):预订/交易占比(6)预订/交易转化率

  2. 对数据进行预处理(空值、重复值、异常值、辅助列、多表处理)

    • 店铺类型:优质>普通>低质>长尾。
    • 城市,区域字段都为空的数量都是测试数据,可以直接删除(右键-删除行)。
    • 城市为空的数据中有三条为有效数据,可以填充,城市数据可以(百度搜索或向业务部门询问)。也可以填充,如果数据量少可以删除。
    • 子品类为空的数据是父品类【非KTV】,可以暂不处理,也可以填充为其他。
    • 后续指标,【UV,预订交易额,预订订单数等】均有空,都填充为0,ctrl+shift+方向键选中要填充的字段,【查找和选择】-【定位条件】-选中空值-输入0-按ctrl+enter填充。
    • 全选,删除重复项。
  1. 数据录入(格式、字段等统一),若需要对方手动填充,也可设定字段的数据验证
  2. 查看是否有单元格合并,如果有,进行拆分
  3. 因单元格拆分导致的空值、空格等处理
  4. 检查数据的完整性和唯一性--空值和重复值
  5. 数据属性检验:查看是否有数值型和字符型变量在一列中出现
  1. 数据分析
  • 统一pc日均uv和app日均uv形成一个字段。
  • 对比分析,帮优化前后的数据要合并,但没有可直接用于合并的唯一性字段(解决方案:添加辅助列--城市+区域+店铺名称,合并,作为匹配的依据列,增加唯一性)。
  • 通过vlookup匹配优化后的数据

image.png

  1. 预定转换率=预定订单数/(日均UV*7)
  2. 预定客单价=预定交易额/预定订单数
  3. 交易转换率=交易订单数/(日均UV*7)
  4. 交易客单价=交易额/交易订单数
  5. 预定占比=预定订单数/交易订单数

考虑分母为0的情况,使用iferror(值,如果错误显示的值)

  1. 用优化后的指标与优化前的指标做对比

image.png

优化后的字段的N/A值,是因为匹配列并不是唯一的,有些匹配不到,可以删除。

  1. 用数据透视图/表进行分析,

image.png

image.png

预订占比对比是文本,所以可以用二维表进行拆分。

PowerBi Desktop

image.png

导入数据:【文件】-获取数据

转换数据进行pq,如果源不对,进入数据源设置,更改源,刷新,源不对,只影响pq。

新建度量值:表格视图-表工具-新建度量值。

新建列:可以在多端表新建列用related()引用一端表的一个列。

新建表: