数据分析(戴师兄)

产品拆解方法

MECE原则:1.相互独立:无重复(独立性) 2.完全穷尽:无遗漏(完整性)

1.二分法:A、非A

2.矩阵法(象限拆解法):一般根据两个要素(可以使用多个要素)划分 eg:事情根据重要程度和紧急程度划分

3.公式法:所谓公式法就是针对某个指标,用公式层层分解该指标的影响因素。

4.杜邦分析法:利用几种主要的财务比率之间的关系来综合地分析企业的财务状况。

5.AARRR:一个应用的生命周期(用户获取,用户激活,用户留存,用户收益,推荐传播)

6.PEST:PEST分析是指宏观环境的分析,P是政治(politics),E是经济(economy),S是社会(society),T是技术(technology)。在分析一个企业集团所处的背景的时候,通常是通过这四个因素来分析企业集团所面临的状况。

7.RFM:RFM模型是衡量客户价值和客户创利能力的重要工具和手段。最近一次消费 (Recency),消费频率 (Frequency),消费金额 (Monetary)

8.SWOT分析法:S (strengths)是优势、W (weaknesses)是劣势、O (opportunities)是机会、T (threats)是威胁。企业内部分析,以及对于企业和竞争对手之间的分析。

9.5W1H(WWWWWH)分析法也叫六何分析法,是一种思考方法,也可以说是一种创造技法。在企业管理、日常工作生活和学习中得到广泛的应用。

excel篇

sumifs函数(计算数据,条件,条件,条件。。。)

大于等于和小于等于在条件中要加单引号,连接大于等于和变量之间要用 连接。

环比和同比

环比:最小字段前后比较之后-1 本期/上期-1

同比:强调字段前后比较之后-1 本期/同期-1

日期函数存疑

每个月的最后一天:月+1,日-1。即下个月的第一天的前一天

subtotal函数

subtotal(选择计算方式(求和或计数),计算区域),subtotal可以根据源数据筛选进行求和变化。

可以点击函数内部再点击函数可以输出帮助。

if函数

if(条件,真,假)

vlookup函数

vlookup(查找值,查找区域,返回的列在第几列,匹配方式(一般使用精确匹配))查找区域内必须包含查找值与输出值,并且第一种查找变量必须在查找区域的第一列。

查找必须是完完全全相同,有偏差不行。

可以在查找值后面加 &“*” *可代替不定数量字符,?可代替英文输入法下的一个字符。?表示占位符。

聚合运算

vlookup函数同样可以对数据透视表数据进行匹配查找。引用区域要注意是否需要改变。

!!!index和match函数(重点)

match函数:选定行或列里找出查找项所在位置 形式:match(查找项,查找区域,匹配方式)

index函数:输出区域内确定位置的数据。 形式:index(区域,行号,列号) 注:行位置为0的话会输出整行,列位置为0的话会输出整行

周报制作

注意不是直接下拉,重点在于引用已知数据,这样才能产生相应的变化,一定要根据源数据进行引用。

数据》数据验证》选择序列,内容(注意用英文逗号隔开)

加入数据验证后使用sumif

时不仅仅验证时间,同样要验证数据验证内的平台。

开始》条件格式》格式样式》数据条》最小值最大值改成数字》

Tableau篇

tableau社区:tableau,public

Tableau:全世界数据可视化大神,都在基于tableau进行可视化创作

流派:艺术流,分析流,实战流,垃圾流。我们主要学习实战流。

实战流:为实际业务场景服务,追求数据的全面性和逻辑性。无时间美化

1.可以将数据看板发到线上2.自动更新看板3.自由下载数据4.线上修改图标5.邮箱发送数据6.设置数据预警

支持亿级数据的链接分析,自由地对字段进行计算,拖拽可以轻松制作图表,数据可以聚合下钻,图表类型可以灵活转换,内置算法智能建模。数据分析

学习资料

python基础学习:
菜鸟教程:https://www.runoob.com/

廖雪峰的官网:https://www.liaoxuefeng.com/

常用三方库官网:

Numpy官网:https://numpy.org/

Pandas官网:https://pandas.pydata.org/

Matplotlib官网:https://matplotlib.org/

Sklearn官网:https://scikit-learn.org/stable/index.html

tensorflow官网:https://tensorflow.google.cn/api_docs/python/tf/io/read_file?hl=en

问题搜索:
CSDN专业开发者社区:https://www.csdn.net/

机器学习,深度学习数据获取资源:

和鲸社区:https://www.kesci.com/

Kaggle: https://www.kaggle.com/

uci:http://archive.ics.uci.edu/ml/datasets.php

都是免费的学习资源 作者:李小四是数据分析师 https://www.bilibili.com/read/cv9177817?spm_id_from=333.999.0.0 出处:bilibili

anaconda配置集合:pandas,numpy

python部分

多行语句

逻辑行:python解释器需要执行的命令

物理行:程序员编写代码的行

隐式换行要加小括号,也可以使用

list

list.count(obj)统计某个元素再列表中出现的次数

list.index()从列表中找出某个值第一个匹配项的索引位置

list.reverse()反向

list.sort()对列表排序

list.clear()清空列表

list.copy()复制列表

list.append()添加元素只添加最后一个参数

list.insert(索引,元素)

元素修改部分对应切片部分要更换时要使用数组

list01.remove()删除

list01.pop(索引)

del list[索引]删除索引处的值

元组

由一系列变量组成的不可变序列容器,但创建不可以进行增删改。

获取方式与列表一样,创建元组时,如果只有一个元素,那么必须啊要在这个元素后面加逗号,否则产生类型不是tuple类型。

字典

一系列键值对醉成的可变散列容器

里面的元素是由键值对构成的

数据分析(主体)

excel篇

excel基础应用

countif(range,criteria)计算某个区域中满足给定单元条件的单元格数目,参数range为单元格区域,参数criteria为判断条件

countifs(range1,criteria1,…)统计一组条件所指定的单元格数,range1:条件区域1。criteria1:条件1。range2:条件区域2。Criteria2:条件2。等等。。。(区域条件判断之间是且的关系)

累积数据:fn+f4可以直接锁定行列,累积数据过程要用到sum函数,要注意是锁定函数的位置。

语法:SUMIF(range, criteria, [sum_range])。
range:条件区域,criteria:条件。sum_range:求和区域。可以省略,当省略时,条件区域就是求和区域。
说明:单条件求和。
语法:SUMIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], …)。
sum_range:求和区域。criteria_range1:条件区域1。criteria1:条件1。criteria_range2:条件区域2。Criteria2:条件2。等等。。。
需要注意是,此处是多条件求和,至少为三个参数,当为3个参数时,就和单条件求和一样,后面的参数都是成对出现
说明:多条件求和

考察条件判断有几个,一个条件选择sumif函数,多个条件选择sumifs

注意sumifs的条件函数中第一部分是求和区域,后面才是判定条件和条件范围,注意与sumif的区别。一般条件的形式都要在两个双引号里面。

条件格式:开始》条件格式》突出显示单元格》介于》

公式为基础的条件格式:要注意公式存在单元格的地址引用注意相对引用地址和绝对地址的使用。

开始》条件格式》新建格式规则》使用公式确定要设置的单元格》

mod()是求余函数

=内容1&内容2&内容3……. 可以对多个格的内容进行连接

match函数是找出相应匹配项所在行数

index函数是提取数据所在行数据

时间类函数:

year 获取指定日期的年
month 获取指定日期的月
day 获取指定日期的日
today 获取系统当前日期
now 获取系统当前日期和时间
date 返回标准日期格式的时间序列
eomonth 获取指定日期所在月(或前后月)的最后一天 (当前月)
weekday 获取指定日期的星期数

项目排期表:要用到堆积条形图和条件格式突出显示

将星期数字转换成标准星期,自定义格式语法输入aaa

考勤汇总要使用到合并计算,合并计算中要确定引用位置。

数据汇总分析及业务分析综合案例

均比: 实际值与平均值之间的对比,用以描述实际值的好坏程度。

YTD(Year To Date):从年初到当前日期为止的指定维度的汇总值

QTD(Quarter To Date):从季度初到当前日期为止的指定维度的汇总值

MTD(Month To Date):从月初到当前日期为止的指定维度的汇总值

月同比:相对于前一年同月份

月环比:相对于前一个月的

定基比增长率:当期值与某一固定时期值比较,描述当期值的发展水平

均比: 实际值与平均值之间的对比,用以描述实际值的好坏程度。

状态迁移对比指标: 用以描述状态变化后与变化前数值的占比情况,点击率、转化率等都属于该类指标

出勤率(病假不计入出勤):出勤天数÷规定的月工作日×100% 加班强度比率:当月加班时数÷当月总工作时数×100% 每日工资=月固定工资/21.75天 月基础工资=每日工资x当月有效工作天数x当月实际工作天数调整比例 当月应工作天数=当月自然日天数–当月休息日天数 当月有效工作天数=当月应工作天数–全无薪假期 当月实际工作天数调整比例=21.75天/当月应工作天数 平时加班费=月基础工资÷(21.75天8小时)×1.5倍×平时加班时数 假日加班费=月基础工资÷(21.75天8小时)×2倍×假日加班时数 直接生产人员工资比率=直接生产人员工资总额÷企业工资总额×100%

alt+等号快捷键可以快速实现求和运算。

快捷键

文件重命名:ctrl+Z

打开我的电脑:win+e

快速搜索文件:win+q

直接打开设置:win+i

显示桌面:win+d

快速实现页面转换:win+上下左右

关闭窗口:alt+f4(再按一次是关机)

产生表情符号:win+f4

改变输入法:先按住ctrl再用shift可以实现输入法的切换。win+空格也可以产生类似的效果

放大镜:win+加号(放大),win+减号(缩小)

image-20211029182333326

image-20211029182431706

快速求和:alt+加号

插入列:shift+拖拽列

强制换行:alt+回车

屏幕截屏:shift+win+s

分析方法论

一、零碎需求-用数据使业务问题细节明朗化 (工具辅助,日常取数及业务问题发现)

二、业务建模-数据拓维

三、提供周、月、季度、年整体分析报告

日常取数

1.确认数据范围 2.确认分析维度 3.输出数据指标

案例二

背景:品牌商提出查阅我方数据运营公司下各零售商城市维度下的年销售额情况,从而判断是否合作,或是选择哪个零 售商哪个地区合作

目标:希望解答在全国哪些地区,我方数据运营公司的渠道是具有代表性的/有重大意义的

交付物形式:Excel

漏斗图:条形堆积图修改得到

帕累托分析(二八法则)

二八法则,即百分之八十的问题是百分之二十的原因造成的。在项目管理中主要用于找出核心问题。

柱状图和折线图结合,柱形图降序排列,折线图计算累计百分比,折线图起点是0,折线图比柱状图多一个。折线图的第二个点位于柱形图第一个柱子的最右 上角。

经营分析案例

价格先上升然后衰退,第一部分上升是由产品知名度上升,第二部分衰退是由于竞争者产生。

案例1:维度:商品类别,品牌;统计字段:各年销量,各年销售

业务建模——数据拓维

RFM模型

RFM方法论:从数据中找到重要的维度,在维度中划分出几类,实现分类,分类标准可以是百分数,平均值,二八模型,也可以是企业内部的要求的数值作为分类指标。

方法核心是数据分类。

用户的关键行为:最近一次消费,消费频次,消费金额。

生命周期:用户与商品的接触的整个过程,在这整个过程中可以提取出用户的关键信息。

R:最近一次消费 :基于当前时点,统计用户最近一 次消费时点和当前时点的时间差

F:消费频次: 指定时间区间内统计用户的购买次数

M:消费金额 :指定时间区间内统计用户的消费总金额

image-20211031100358097

消费频次:买返,返点,年卡,优惠劵

用户回流:发短信,客户回访,优惠券,回归奖励,消息推送

刺激消费:捆绑消费,满额打折,满减活动

结合实际业务选取关键数据指标分析,不是千篇一律的最近一次消费时间、消费频次、 消费金额

定义R值、F值、M值数据区间分隔时,发现明显断档数据可以通过散点图、透视表、占 比图等进行判断

除了选取讲解的3个核心业务指标进行交叉分析,也可以同时分析4个、5个指标,或者只 需要分析2个指标

对于划分阈值的计算,除了平均值,还有二八法则,对于更加复杂的业务,可以寻求程 序员或业务员协助确定。

针对不同分层用户的运营策略的制定要结合实际,在制定了运营策略之后,结合公司现 有资源和手段开展具体的落地工作

RFM练习

用户忠诚度模型

重点维度:消费频次,消费金额

使用箱型图

重要价值用户:此类用户最近刚到访平台,而且消费频次和消费金额都很高,是平台营收的主要来源,建议 保持现状并持续关注;

重要发展用户:此类用户最近刚到访平台,且消费金额高,但消费频次低,可通过提升到店频次将此类用户 转化为重要价值用户。建议观察此类用户购物篮的商品品类,参考品类复购周期,若已购买品类本身复购周 期长,则可通过组合销售将复购周期长的商品和复购周期短且日常必需的商品捆绑,引导用户到本平台增 加选购其他品类的商品,并转变为习惯,从而增加到店频次。平台缺少此类用户,可参考重要保持用户的运 营策略实现重要保持用户到重要发展用户的转变;

重要保持用户:此类用户很久没有到访平台,但到店频次和消费金额都很高,建议通过通知提醒顾客喜爱的 商品有优惠活动使用户回流;

重要挽留用户:此类用户很久没有到访平台,且到店频次低,但消费金额高,针对此类用户需要重点召回,建议通过会员日或定期不定品类的促销信息通知用户,提升用户粘性。平台缺少此类用户,可参考一般价值 用户的运营策略实现一般价值用户到重要挽留用户的转变;

一般价值用户:此类用户最近刚到访平台,且到店频次高,但消费金额低,说明用户对价格敏感,可通过促 销装、买二送一等形式刺激用户消费;

一般发展用户:此类用户最近刚到访平台,但到店频次和消费金额都很低,说明平台主要商品对用户没有吸 引力,建立提供此类用户之前的消费明细,挖掘用户喜好;

一般保持用户:此类用户很久没有到访平台,且消费金额低,但到店频次高,说明用户即将转为流失用户, 建议捆绑用户经常购买的商品和日常所需的其他品类商品,引导用户消费品类的转变而实现召回;

一般挽留用户:此类用户很久没有到访平台,到店频次低,消费金额低,在运营成本有限的情况下,可放弃 此类对此类用户的投入,但本平台大部分用户为一般挽留用户,说明用户对平台失去依赖,建议尽快建立用 户激励机制。

分析报告

考虑从总体指标入手,逐层分解总体指标

梳理行业内经常谈及的指标;

将指标拆解为另外两个指标的和或乘积(或同一指标不同维度),逐层下钻,直至无法分解;

将指标按拆解思路排放成树状结构,增加同比或环比值,通过观察变化比率快速定位问题。

树状分析方法论

商品分类:处级》课级》大类》中类》小类》商品名称

sku:指库存计数单位,评定一个商品的最小颗粒度,一个商品对应一个sku值

基准品类:购买物品所处的商品类别。、

选择性粘贴可以选择粘贴为图片链接,就会产生可移动的小图片

报告撰写

销量分析kpi树》对比分析结果》阐述重点问题》总结分析结果

在进行与竞争对手的产品分析时,可以利用合理的爬虫技术爬取合法数据。

数据库篇

表结构数据基础格式是字段,不是单元格,excel中的基础单元是单元格。

在进行表结构数据添加时,是对整个字段进行计算。直接生成一个新列,操作过程是在开始选项卡下的套用表格格式进行操作。

数据库是长期存储在计算机内,有组织的,统一管理相关数据的集合。

数据库管理系统是用于管理数据库的软件,对数据库进行统一的管理和控制,以确保数据库的完整性。

sql是一种结构化查询语言,他是国际标准化组织采纳的标准数据化语言

sql语言分类:数据定义语言:craete,alter,drop;数据操作系统:isert,update,delete;数据查询语言:select;数据控制语言:用于定义数据库访问权限和安全级别,grant

数据定义语言

数据库的增删改查

ctrl+回车,执行命令

一条语句结束后用分号来结尾,关键字之间要用逗号分隔,用缩进来增强可读性,sql对大小写不敏感,用#或–单行注释,用/**/表示多行注释。

使用use命令首先进入数据库。

1
2
drop database test;
--删除一个数据库

创建数据表:create table 表名(字段);

建表之前要先选择数据库:use 数据库名称;

建表时可以不指定约束条件,但是必须指定表名,字段名以及每个字段的数据类型,表面不能与sql的关键字相同,同一个数据库下字段名不能重复。

查看数据库所有表: show tables;

查看表结构:desc 表名;

删除数据表:drop table 表名;

数据类型:int, float,decimal(十进制小数型),char(固定长度字符串型),verchar(可变长度字符串长度,必须声明字符串长度),text(长文本字符串),date,time,daytime,timestamp(时间戳,截至固定时间的秒数)

字符串类型和日期时间型数据都需要用引号括起来.

数据库基本结构

数据库:组织,存储和管理相关数据的集合,同一个数据库管理系统中数据库名必须唯一。

表:由固定列数和固定行数构成的数据集,同一个数据库中表名唯一。

列:一个字段,同一个表中列名必须唯一。

行一条记录。

约束条件

primary key 主键约束 非空不重复。主键约束:非空不重复,唯一的标识表中的记录,例如身份证号,员工号等,每个人都有,非空,且没有重复值。多个字段可以使用联合主键 。

not null 非空约束 不能为空。

unique 唯一约束 不能重复。指定字段的取值不能重复。

auto_increment 自增字段 自动增长。指定字段的取值自动生成,默认从1开始,每增加一条记录,该字段取值加一,只运用于整数型。

default 默认约束 默认值 如果新插入一条记录没有为该字段赋值,系统会自动为这个字段赋值为默认约定设定的值

foreign key 外键约束 与主键相对应,与另一张表进行对照,避免不规范的操作,以确保数据存储的完整性。

外键约束代码:【constraint 外键约束名】foreign key (字段名)references <主表>(主表字段)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table table(
deptno int primary key,
dname varchar(10),
loc varchar(15)
)
create table employee(
empid int primary key auto_increment,
ename varchar(10) unique,
job varchar(10) not null default '未知',
mgr int,
hiredate date,
sal float default 0,
comm float,
deptno int,
foreign key(deptno) references dept(deptno)
);
desc employee;

修改数据表

1
2
3
4
5
6
7
8
9
10
11
12
13
#修改表名称
alter table emop rename emp;
#修改字段名,这个过程相当于重新定义一个字段,可以设置不同的数据类型和约束条件
alter table emp change empid empno int primary key auto_increment;
#修改数据类型
alter table emp modify sal decimal default 0;
#添加新字段,可以调整他的添加位置。
alter table emp add city varchar(20) first;
#修改字段的排列位置,修改过程可以是表中第一列,也可能是表中某一个字段的后面。
alter table emp modify deptno int first;
alter table emp modify deptno int after job;
#删除字段
alter table 表名 drop 字段名;

插入数据

1
2
3
4
5
6
7
8
9
10
11
12
#插入数据,字段和数值要一一对应。当不知道其中某个需要输入的值时,可以输入null作为空值,但必须要输入空值。表名和字段名都可以写中文。
insert into dept(deptno,dname,loc) values (10,'accouting','new york'),(20,'research','dallas');
#查询表
select * from dept;
#导入数据时没有输入字段时,要输入所有字段对应下的数值。
insert into dept values (60,'sales','chicago'),(40,'operation','boston');
#批量导入数据
load data infile "C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\employee.csv"
into table emp
fields terminated by','
ignore 1 lines;
#字段由逗号隔开,由于数据已经创建完毕,可以忽略第一行的字段。

ctrl+h是查找相同项,可以进行修改。

修改数据

1
2
3
4
5
6
7
#修改数据,where判断语句输出的结构没有布尔值,只能输出0和1.
update emp set sal=sal+1000 where ename='smith';
update emp set sal=sal+1000;#可能存在1175错误
set sql_safe_updates=0;#这段代码可以解决上面的错误
#清空数据
delete from emp;#可以添加where条件,是逐条删除数据。
truncate emp;#不能添加where条件,是直接建立一个新表

DQL语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#单表查询
select * from emp;
#查询单个数据表中的行数
select count(*) from emp;
#查找部分表中部分字段,查询出来的不是表,只是一个显示在内存中的临时结果集。不占存储空间。
select ename,job,sal from emp;
#在查询过程中设置别名,添加了一列
select *,sal+1000 from emp;
#这个是不正确的,第一部分在进行添加时只是产生在虚拟结果集中,并不在内存里。故不能用这种方式修改字段名。
alter table emp change sal+1000 sals;
#这种方式才是正确的,在添加字段的同时,修改一个别名。这个过程不会修改原表中的存储记录。
select *,sal+1000 as sals from emp;
#as关键字可以省略。
select *,sal+1000 sals from emp;
#练习:查询员工id,员工姓名,员工年薪,基本工资(12个月)
select empid,ename,sal,sal*12 基本工资 from emp;
#查询不重复的数据:查询emp中的部门。
select distinct deptno from emp;
#查询过程进行多个字段的去重
select distinct deptno,job from emp;
#条件查询
#查询工作在2000和3000之间的员工的所有信息
select * from emp where sal>=2000 and sal<=3000;
select * from emp where sal between 2000 and 3000;
#查询部门号为10或20工资低于2000的员工信息
select * from emp where (deptno=10 or deptno=20) and sal<2000;
select * from emp where deptno in(10,20) and sal<2000;
#找出表中职位为salesman的员工信息:姓名,职位,部门号
select ename,job,deptno from emp where job='salesman';
#空值查询,空值与任何字段计算后都为空。强调:要判定是否为空值时要是有is null或者is not null。
select * from emp where mgr is null;
select * from emp where mgr is not null;
#模糊查询 %匹配多个通配符,-匹配一个通配符。
select * from emp where ename like 'a%';
select * from emp where ename like '%a%';
select * from emp where ename not like '_a%';
#查询结果排序 order by语句 desc是降序排序,asc是升序排序。desc在表格前和在排序中的表示方法不同,一个是展现字段,一个是decend的缩写。
select * from emp order by sal desc;
select * from emp order by sal asc;
select * from emp order by deptno asc,sal desc;#按照顺序排序
#限制查询结果数量,limit后面接显示的是显示的行数,limit跟的数字必须是整数类型。初始行偏移量是0不是1
select * from emp order by sal desc limit 5;
#limit后面接两个数字时,第一个是偏移量,第二个是输出的行数。
select * from emp order by sal desc limit 5,5;

avg(),min(),max(),sum(),count(),这些聚合函数都是忽略表中空值的。

1
2
#全表运算
select count(*) 员工总数, max(sal) 最高工资, min(sal) 最低工资,avg(sal) 平均工资 from emp;

维度:用来分组的分类字段,无需分类字段和有序分类字段。

度量:用来聚合运算的数值字段。(年龄,数量,金额)

1
2
3
4
5
6
7
8
9
10
11
12
13
#分组查询
select deptno,avg(sal) 平均工资 from emp group by deptno;
#就算填入了新的字段也只是显示分组后的第一条数据,其他数据不会显示
select deptno,ename,avg(sal) 平均工资 from emp group by deptno;
#可以对多字段进行分组,同时分组后仍然可以排序。
select deptno,job,avg(sal) from emp group by deptno,job order by avg(sal);
#最后一行代码是找出工作是clerk的在分别在各部门中的平均工资。
select deptno,count(*) from emp group by deptno;
select deptno,job,count(*) from emp group by deptno,job;
select deptno,job,avg(sal) from emp group by deptno,job having job='clerk';
select deptno,job,avg(sal) from emp where job='clerk' group by deptno;#这个和上一行代码的结果是一样的
#找出部门平均工资大于2000的部门。
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;

where与having的区别:

where子句作用于表,having子句作用于组。

where条件查询的作用域是针对数据表进行筛选,而having条件查询则是对分组结果进行过滤。

where在分组和聚合计算之前筛选行,而having 在分组和聚合之后筛选分组的行,因此where子句不能包含聚合函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#多表查询
#左连接是左表为主表。右连接时右表为主表。内连接是不能存在空值的,左右同时存在。全连接包含所有情况。左反连接是左表有,右表没有的。右反连接是右表有,左表没有的。
select * from t1 inner join t2 on t1.key1=t2.key2;#省略inner也是内连接。
select * from t1 left join t2 on t1.key1=t2.key2;
select * from t1 right join t2 on t1.key1=t2.key2;
#纵向合并:1、两张表必须拥有相同数量的字段2、两张表字段的顺序必须相同3、两张表对应字段的数据类型必须一致
#union去重:select 字段1[,字段2,…] from 表名 union select 字段1[,字段2,…] from 表名;
#union all不去重: select 字段1[,字段2,…] from 表名 union all select 字段1[,字段2,…] from 表名;
select * from t1 union select * from t2;
select * from t1 union all select * from t2;
-- 出现在表a却不在表b的userid
select * from a_user left join b_order on a_user.userid=b_order.userid where b_order.userid is null ;

-- 每个userid的最新结束时间
select userid,max(end_time) from b_order group by userid ;


-- 用户结束时间在3月份的userid及tel
select userid,tel from a_user where userid=(select userid from b_order where month(b_order.end_time)=3);(子查询)
select * from a_user left join b_order on a_user.userid=b_order.userid union select * from a_user right join b_order on a_user.userid= b_order.userid;
select b_order.userid,tel from a_user right join b_order on a_user.userid= b_order.userid where month(b_order.end_time)=3;
select t.userid,tel from (select * from b_order where month(end_time)=3) t left join a_user on t.userid=a_user.userid;(子查询方法)
#笛卡尔积连接方法:两张表中的两个行数相乘及得得到的表格的行数=-9
select * from a_user,b_order where a_user.userid=b_order.userid;
#不等值连接
#自连接
select * from emp 员工表 left join emp 领导表 on 员工表.mgr=领导表.empid;
#可以多重表连接,yyh同学你注意只有一个select只在已经连接的表后面进行左连接和右连接,或者其他连接方式,不是子查询关系,只是表连接方式。
select 员工表.empid 员工编号,员工表.ename 员工姓名,dept.dname 部门名称 from emp 员工表 left join emp 领导表 on 员工表.mgr=领导表.empid left join dept on 员工表.deptno =dept.deptno where 员工表.hiredate<领导表.hiredate;

在进行表连接时,判断是一表还是多表主要是判断是否会出现多值。

要查询的主要信息所在表才是主表。

标量子查询:返回的结果是一个数据(单行单列)

行子查询:返回的结果是一行(单行多列)

列子查询:返回的结果是一列(多行单列)

表子查询:返回的结果是一张临时表(多行多列)

1
2
3
4
5
6
7
8
#子查询
select * from emp where sal>avg(emp);#在where语句中不能使用聚合运算。
select * from emp where sal>(select avg(sal) from emp);
#找出列表中与allen相同上司的员工号等。(标量子查询)
select empid,ename,job,mgr from emp where mgr = (select mgr from emp where ename='allen');
#找出和smith同职位同上司的id,姓名,职位。(行子查询)
select empid,ename,job,deptno from emp where deptno = (select deptno from emp where ename ='smith') and job=(select job from emp where ename ='smith')and ename<> 'smith';
select empid,ename,job,deptno from emp where (deptno,job)=(select deptno,job from emp where ename='smith') and ename<>'smith';

列子查询

image-20211103153251416

1
2
3
4
5
6
7
8
9
10
11
12
#查询普通员工的工资等级
select empno,ename,sal,level from emp left join saltable on sal between lowsal and highsal where empno not in (select distinct mgr from emp where mgr is not null);
#查询部门数大于5的所有员工
select empno,ename,deptno from emp where deptno in (select deptno from emp group by deptno having count(empno)>=5);
#找出列表中大于30部门中任意一个员工的工资的员工信息。
select * from emp where sal>any (select sal from emp where deptno =30) and deptno <>30;
select * from emp where sal>(select min(sal) from emp where deptno =30) and deptno <>30;
#找出列表中大于30部门中所有员工的工资的员工信息。
select * from emp where sal>all (select sal from emp where deptno =30) and deptno <>30;
select * from emp where sal> (select max(sal) from emp where deptno =30) and deptno <>30;
#查询各个部门的最高工资的员工
select ename from emp left join (select deptno,max(sal) msal from emp group by deptno) t on emp.deptno=t.deptno where sal=msal;

常用函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#CONCAT(str1,str2,...) 把多个文本字符串合并成一个长字符串()
select concat('CDA','数据', '分析');
#当concat连接的字段中有null值时,连接后的值仍然为null。
select concat('CDA',null, '分析');
#INSTR(str,substr)返回子字符串substr在文本字符串str中第一次出现的位置()
select instr('CDA', 'A');
select instr('数据分析', 'CDA');#找不到返回0,找得到返回对应的位数,位数时从1开始的。
#LEFT(str,len)返回字符串str的左端len个字符
select left('CDA数据分析', 3);
#RIGHT(str,len)返回字符串str的右端len个字符
select right('CDA数据分析', 4);
#MID(str,pos,len)返回字符串str的位置pos起len个字符
select mid('CDA数据分析', 4, 2);
#SUBSTRING ( expression, start, length )
#截取字符串
#expression:字符串、二进制字符串、文本、图像、列或包含列的表达式。请勿使用包含聚合函数的表达式。
#start:整数或可以隐式转换为int 的表达式,指定子字符串的开始位置。
#length:整数或可以隐式转换为 int 的表达式,指定子字符串的长度。
select substring('CDA数据分析',1,3);
#TRIM(str)返回删除了两边空格的字符串str
select rtrim(' CDA数据分析 ');
#REPLACE(str,from_str,to_str)用字符串to_str替换字符串str中的子串from_str并返回
select replace('CDA数据分析', 'CDA', 'cda');
#REPEAT(str,count)返回由count个字符串str连成的一个字符串
select repeat('CDA', 3);
#REVERSE(str)颠倒字符串str的字符顺序并返回
select reverse('CDA');
#UPPER(str)返回大写的字符串str,LOWER(str)返回大写的字符串str,只能转换成英文的
select upper('cda');
select lower('CDA');
1
2
#所有姓名首字母大写
select concat(upper(left(ename,1)),substring(ename,2)) from emp;

数学函数

1
2
3
4
5
6
7
8
9
10
11
#ABS(n)返回n的绝对值
select abs(-32);
#FLOOR(n)返回不大于n的最大整数值
select floor(1.23);
#CEILING(n)返回不小于n的最小整数值
select ceiling(1.23);
#ROUND(n,d)返回n的四舍五入值,保留d位小数(d的默认值为0)
select round(1.58);#当不输入第二位值时,一般直接保留整数。
#RAND(n)返回在范围0到1.0内的随机浮点值(可以使用数字n作为初始值)
select rand();
select rand(2);#属于种下了随机数种子,在产生随机数时,如果种子相同,产生的随机数不会改变,而没有输入n值时产生的随机数,每次输出时时完全不同的,不会重复的。

日期函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#DATE(date)返回指定日期/时间表达式的日期部分或将文本转为日期格式
select date('20200101');
#WEEK(date)返回指定日期是一年中的第几周
select week('2019-01-01');
#MONTH(date)返回指定日期的月份
select month('2020-01-01');
#QUARTER(date)返回指定日期是一年的第几个季度
select quarter('2020-01-01');
#YEAR(date)返回指定日期的年份(范围在1000到9999)
select year('20-01-01');
#DATE_ADD(date,interval expr type)ADDDATE(date,interval expr type)DATE_SUB(date,interval expr type)SUBDATE(date,interval expr type)对日期时间进行加减运算
select date_add("2020-01-01",interval 1 day);
select date_sub("2020-01-01", interval 1 day);
#DATE_FORMAT(date,format)根据format字符串格式化date值
select date_format('20-01-01 12:00:00','%Y-%m-%d');
#CURDATE()以'yyyy-mm-dd'或yyyymmdd格式返回当前日期值(根据返回值所处上下文是字符串或数字)
select curdate();
#CURTIME()以'hh:mm:ss'或hhmmss格式返回当前时间值(根据返回值所处上下文是字符串或数字)
#NOW()以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式返回当前日期时间(根据返回值所处上下文是字符串或数字
select now();
#DATEDIFF(expr1,expr2)返回结束日expr1和起始日expr2之间的天数
#UNIX_TIMESTAMP()返回一个unix时间戳(从'1970-01-01 00:00:00'开始的秒数,date默认值为当前时间)
select unix_timestamp();
#FROM_UNIXTIME(unix_timestamp)以'yyyy-mm-dd hh:mm:ss'或yyyymmddhhmmss格式返回时间戳的值(根据返回值所处上下文是字符串或数字)
select from_unixtime(1577808000);

分组合并函数

1
2
#GROUP_CONCAT([distinct] str [order by str asc/desc] [separator])将group by产生的同一个分组中的值连接起来,返回一个字符串结果。示例:查询每个部门的员工姓名。分隔符默认是逗号。
select deptno,group_concat( distinct ename order by sal desc separator'/') from emp group by deptno;

逻辑函数

1
2
3
4
5
#IFNULL(expression, alt_value)判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。
select ename,sal+ifnull(comm,0) 实发工资 from emp;
#IF(expr1,expr2,expr3)如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。
select ename,sal,if(sal>=3000,'高',if(sal>=1500,'中','低')) 工资级别 from emp;

开窗函数

1
2
3
4
5
6
7
#开窗函数可以保留行数,但分组运算无法达到这种效果。聚合函数是将多条记录聚合为一条;而开窗函数是每条记录都会执行,有几条记录执行完还是几条。聚合函数也可以用于开窗函数中。
select avg(sal) avg_sal from emp;
select avg(sal) over() avg_Sal from emp;
select deptno,avg(sal) from emp group by deptno;
select *,avg(sal) over(partition by deptno) from emp;
#各部门按入职日期计算累计工资总和
select *,sum(sal) over(partition by deptno order by hiredate) sum_sal from emp;

current row 边界是当前行,一般和其他范围关键字一起使用

unbounded preceding 边界是分区中的第一行

unbounded following 边界是分区中的最后一行

expr preceding 边界是当前行减去expr的值

expr following 边界是当前行加上expr的值

1
2
3
rows between 1 preceding and 1 following #窗口范围是当前行、前一行、后一行一共三行记录。
rows unbounded preceding #窗口范围是当前行到分区中的最后一行。
rows between unbounded preceding and unbounded following #窗口范围是当前分区中所有行,等同于不写

序号函数

row_number() 显示分区中不重复不间断的序号

dense_rank() 显示分区中重复不间断的序号

rank() 显示分区中重复间断的序号

1
2
select *,row_number() over(order by hiredate) 排名 from emp;
select *,row_number() over(partition by deptno order by sal desc) 排名1,dense_rank() over(partition by deptno order by sal desc) 排名2, rank() over(partition by deptno order by sal desc)排名3 from emp;

row_number()是整除排序,而rank()是校园排名,并列第一但不会出现第二名,直接变成第三名,dese_rank()是有并列第一的情况下还可以产生第二名。

1
2
#2017年仅投资过cfh和ax产品的用户。
select user_id from cmn_investment_request where year(create_id)=2017 group by user_id having group_concat(distinct invest_item order by invest_item desc)='CFA,AX';

with rollup可以和group by配合使用,对分组后的聚合值求和

powerbi篇

pq页面完成数据的加工处理计算

数据仓库:sql关系型结构和pq关系型结构

二者数据结构种类不同:sql中只有数据表一种:mysql只有一种,pq的数据结构有三种。

产品在不同环境下产生的数据结构种类不同。

数据结构参考方式:不同数据结构间的参考引用方式不一样。

数据仓库是数据库的上层,包含数据库但是不仅仅是数据库,还存在csv,txt,excel等。

pq改变数据不会返还到底层数据库,但是底层数据库的数据更新可以改变上层数据

通过字段名识别列,故我们需要要求字段名不重复,一个字段只能有一种数据类型。

通过主键识别行,主键非空不重复,故在对表操作时一定要先观察主键。主键业务层面上的意义:一个表的记录的单位。其他字段都是用来修饰和扩充主键字段的,如果不能修饰扩充主键字段,那么不能存在在该表中。所有非主键字段都要围绕主键信息进行描述和扩展。

PQ

m函数

先通过新建源里面的空查询,再输入=#share可以调出所有m函数

列表(List)

列表是扩在花括号中的一组数据,列表中每个数据都有属于自己的序号以便自己能够被检 索到,列表中的数据序号从0开始按照排列顺序依次整数递增,大列表内还可以嵌套子列表、 记录等。花括号除了用来括起列表内的所有数据还用来指定列表内数据的序号,通过指定数据序号可以从列表内找到并获取所需的数据值。

记录(Record)

记录用来定义字段和给字段赋值,一个字段由字段名以及字段内的值组成,字段名是唯一 的文本值,是字段的标识符。字段名可以不用引号引用,字段名有两种表达形式:

不加””的表达形式、例如Order

加#和””的表达形式、例如#”Today’s data is:”

记录中的内容写在[]括号内,[]括号同样用于在记录中取特定字段的值。

1
2
3
4
5
6
7
8
9
//例2:定义字以及显示记录内[Item]字段的值
let Source =
[
OrderID = 1,
#"CustomerID" = 1,
Item = "Fishing rod",
Price = 100.00
]
in Source[#"CustomerID"] //equals 1

#share 内置的记录

有””的是文本值,没有”“的代表名称。

表(Table)

表是由行列数据构成的,可以使用隐式或显示方式定义字段(列)的数据类型。使用 #table建表时,可以使用列表或者记录来定义列名,并使用嵌套列表来定义表中的数据,嵌 套列表的大列表内包含所有定义单行用的子列表,而每个子列表则用来定义一行数据。花括 号{}可以用来索引查找指定行的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//例1:隐式字段表
let
Source = #table(
{"OrderID", "CustomerID", "Item", "Price"},
{
{1, 1, "Fishing rod", 100.00},
{2, 1, "1 lb. worms", 5.00}
})
in Source
//例2:显示字段表
let
Source = #table(
type table [OrderID = number, CustomerID = number, Item =
text, Price = number],
{
{1, 1, "Fishing rod", 100.00},
{2, 1, "1 lb. worms", 5.00}
}
)
in Source
1
2
3
4
5
6
7
8
9
10
11
12
//例3:建表后取表中第一行数据
let
Source = #table(
type table [OrderID = number, CustomerID = number, Item =
text, Price = number],
{
{1, 1, "Fishing rod", 100.00},
{2, 1, "1 lb. worms", 5.00}
}
)
in Source{1}
//提取出的是记录
1
2
3
4
let
源 = [订单ID=2,销售人员ID="b",订单金额="200",销售人员表=#table({"销售人员ID","销售人员姓名"},{{"b","王二"}})
]
in 源

爬取网页数据

1
2
3
4
5
(teamname as text) =>
let
源 = Web.Page(Web.Contents("https://china.nba.com/teams/stats/#!/"&teamname)){0}[Data]
in

强调一定Web.Page(Web.Contents(“网址”&一般是调用的限制的名称))后面加上爬取数据中所需数据所在的位置。

补充操作

当我们在pp中操作时,当出现各种编号时,我们一般要将各类编号更改为文本类型,但有些时候在导入数据时,pp会自动识别,并将这类编号字段更改为整数类型,这时我们要将其更改为数字类型,主要通过在右侧应用步骤中,选择更改的类型删除,或者更改m函数,将类型改为type text。

在求环比时要用到时间辅助表

日期辅助表创建:进入pq,在pq内创建空查询,在m函数处编写= List.Dates函数,注意这里的大小写要分开,如果是小写不识别,弹出的界面第一部分是起始时间,第二个是天数,第三个是间隔。

PP

建模:多维数据模型,数学模型

多维数据模型

多维数据模型又叫多维数据集、立方体,指的是相互间通过某种联系被关联在一起的不同类别的数据集合。

多维数据模型:在咨询公司以及 BI工具厂商的介绍性资料中又被 称为“立方体(Cube)”,在这 些资料中常以一个立体正方形的 形式出现。多维数据集可以从多 角度用数据全面映射某种业务的 实际状况。

连接字段,如果在表中作为主键,那么这个表为主表,如果不是主键,就为多表,一般是一对多,一表指向多表。

连接方式:一对一:主键连主键(最不可能出现);一对多:主键连非主键(正常连接方式,但是只有多表字段能当度量);多对多:非主键连非主键(多对多能连但是不能用作汇总)。

多对多可以进行连接但是不能用做汇总。

变量类型

名义型:ID,姓名,血型,产品名称—–》文本型——》可以用做主键(就算是数字也是用文本型存储,例如身份证号)——》维度

有序型:值与值之间有顺序关系,取值不连贯。成绩,健康状况——-》文本型——–》不能当作主键使用——-》维度

连续型:值与值之间有顺序关系,并且取值是连续连贯的。——-》数值型——–》不能当作主键使用——》度量

主键ID:1.文本型2.位数相同3.不同位数代表不同意义

星型结构:一个表和多个表进行连接

image-20211128175258429

筛选过程中,多表出维度,单表出度量

当确定为建立多表之间连接时可以之间在pp中找到第三部分,直接对表与表之间确定连接关系,*表示多表,1表示一表,双向链接一般最好改成单向连接。当没有连接想要创建连接时,只需要确定表与表之间的连接字段,进行对应的拖拽即可。

在使用过程中不能逆着筛选方向进行筛选,筛选方向:输入方向输出度量,输出方向拖拽度量。如果方向产生错误,无法正确汇总。当然可以解决该问题,可以选择双向筛选。

一般日常工作过程中存在需要跨表筛选时,我们可以使用双向箭头。

交叉筛选器方向

双向交叉筛选:连接的两个表可以互相筛选,适用于星型架构,不适用于交叉模式。

一个表到另一个表的路径是多条路径时,众多路径中只有一条路径是有效连接,其他所有路径都是无效路径。这种连接模型是交叉模型。

单向交叉筛选: 维度表可以筛选度量表,绝大多数情况用单向交叉筛选。

image-20211128205700978

圆圈为类型2,叉和正方形都是类型1,跨表取字段均是类型2。

可以更改路径走向。有效和无效之间可以在属性中的“使此关系可用”选项实现改变。

类型2是可用的,但是实际业务场景中几乎不存在类型二,所以不需要使用类型二。他一般显示的是所出维度的表中对应关键字段的度量值,而不是该维度所对应的度量值。

只要进行跨表筛选都属于类型2,类型2均是不可用的。

层级关系:父子级关系条件:1.一个父级值下对应多个子集值。2.一个子集值只属于一个父级值。

跨表取字段条件:维度与连接用字段间是父子集关系时,可以实现跨表取。

尽量实现多表合并,尽量减少表的数量,防止跨表次数过多,造成错误,降低出错率。

DAX

DAX中只需要考虑度量和计算规则即可,计算规则里面的引用是整个字段,而excel表里面引用的是计算区域。

DAX能做什么:1.创建汇总规则》筛选器中实现 2.可以改变列值

DAX的作用:为工作人员提供观测业务的窗口。》就是计算一种具体的指标值。

度量值是用来帮助工作人员进行分析。

指标和指标体系

业务指标:能够分析当下。

业务指标分类:

1.共通类型指标 :(1)汇总类指标 (合计值,平均数,个数·次数,月销售额,季度销售量,年度利润,MTD:月初到当前日期,QTD:季度初期到当前日期,YTD:年初到当前日期) (2)比较类指标(基准比,均比,标准比,目标完成率,同环比,移动平均);(1)1级指标:由数据直接汇总得到(2)2级指标:由1级指标计算得到。

2.特殊指标

财务指标:具有滞后性,能回顾过去,也能展望未来,不能观察现在。

常用函数

问题:用数据透视表求出每名销售人员手中高赢单率低风险商机金额占总商机金额的百分比 (高赢单率:赢单率=0.75 / 低风险:有无拖欠还款情况=“无”)

制作步骤:

  1. 关联商机记录与商机相关企业信息表(商机相关企业信息表是一表,商机记录为多表,字段连接由一对多)

  2. 使用switch函数将赢单率中的数值描述替换为文字描述(0.15=>低、0.25=>低、0.5=>中、 0.75=>高) switch(表达式,值1,结果1,值2,结果2…其他情况结果) 计算的是列值:对行进行计算

  3. 使用related函数将商机相关企业信息表中的有无拖欠还款情况字段内容合并到商机记录表 中来 related(合并字段)

  4. 使用calculate与filter函数的嵌套函数创建高赢单率低风险商机金额加总值

    filter(表,筛选条件) 用于提取限制条件

    calculate(计算规则,条件1,条件2…) 用于计算在各种条件下的汇总规则

    高赢单低风险 = CALCULATE(sum(‘商机记录’[商机金额(M)]),FILTER(‘商机记录’,’商机记录’[winodds]=”h”),filter(‘商机记录’,’商机记录’[risk]=”无”))

  5. 用高赢单率低风险商机金额加总值/商机金额加总值求出高赢单率低风险金额百分比

  6. 创建行标签为销售人员,值为高赢单率低风险商机金额百分比的数据透视表


当判断使用何种汇总规则时,我们要结合汇总字段和所需要求来综合分析。

image-20211201164955293

在这个标识下找到新建列,在列中编辑函数:对应的函数:calculate:多条件计算;filter:条件范围提取;switch:筛选特定值输出对应值;related提取字段转移到新表中;all:所有所选区域下的值

image-20211201165838868

未标识的是维度,求和符号是度量,计算器图标是新建度量

1
全部筛选 = calculate(SUM('商机记录'[金额($M)]),all('区域'[城市名]))

all(‘区域’[城市名])这里面的all就是忽略了城市名字段,直接计算大范围的求和值。

all(‘区域’)这里面是忽略了所有区域,直接计算总的汇总值。

切片器:用来选择显示部分数据。

维度:汇总维度(我们所写在透视表中的行标签字段);筛选维度(能够影响数据,就是切片器)

allselect(’区域‘)只能忽略汇总维度,但不能忽略筛选维度,可以更改切片器的范围以达到改变定基比的对比值所在范围。

平均值陷阱:平均值行数直接受到表的主键影响,如果主键存在重复值的话,在操作时行数比类别数多时,会造成平均数偏低。

filter(范围,条件1&&条件2)这是取交集 filter(范围,条件1||条件2)这是取并集

calculate(sum,区域in范围值)

calculate(sum,not 区域in范围值)

switch(true(),值1(当前面加上true函数时,可以使用比较函数),结果1,值2,结果2)

dax时间函数

切片器右上角的三个点可以改变切片器样式,可以换成列表值,也可以换成界限值。

PREVIOUSMONTH函数在指定的时间段或者时间点下返回上个月的内容。

dateadd函数(时间日期字段,选择值(位移量),位移的单位)返回的是当前日期的偏移量后的值,并且平移后的范围是在所选时间区域内。可以参照单值也可以参照时间段,参照时间点时,参照的范围是值范围内前点和后点分别对应位移后的范围内的值,后点如果是月份最后一天回返回平移后的月份的相应位置,这种属于特殊情况。

例子

1
上月销售额合计 = CALCULATE([销售额合计],DATEADD('日期辅助表'[日期],-1,MONTH))

totalmtd(汇总规则,调用日期范围)从月初到当前时点。

1.函数参照的对象时时间段还是时间点。2.函数参照的位移量是多少 3.函数返回的是时间点还是时间段下的汇总值。

pq中直接得到日期数据:转换数据中直接建立空查询,函数中输入=List.dates即可。但是在输出时一般是列表格式,要首先转换为表格式,如果需要可以稍微测试一下。

ranks(区域,排名的字段(不能使用聚合函数),asc/desc)

ranks函数不能把聚合函数与其他函数直接嵌套使用,先用聚合函数创建好度量值,再把度量值的名称引用到其他函数中使用正确。()部分其他函数可以,默认是降序。

calculate()可以让筛选上下文转换成行上下文。

在使用dateadd这类函数时,不能直接在该表下使用dateadd函数,首先要加入一个新的日期辅助表。

使用日期辅助表来计算dateadd的规则顺序:

1.在PQ中使用listdate函数创建连续日期列表。

2.将日期列表转换为表并更改字段数据类型为日期型

3.在关系图下连接日期辅助表与主体字段表

4.凡是用到日期字段的地方都使用日期辅助表下的日期才行。3

图表决策树

image-20211211173532044

决策树有四种:比较,序列,描述,结构。

比较:仪表盘(事项完成程度),空间不同对象大小多少比较,同一对象不同时间之间进行比较。

序列:折线图(时间序列),漏斗图(状态迁移情况)。

描述:业务描述,统计描述(没有业务维度,只是进行统计描述,数据的分布规律和联系关系)。

结构:不同对象在对应环境下的占比关系;迁移叠加型(瀑布图);既要看不同时间节点,同时看不同图例下(堆积图)。

image-20211212174433161

image-20211212174459647

image-20211212174509484

image-20211212174518754

image-20211212174528795

image-20211212174539124

image-20211212174547183

image-20211212174554654

image-20211212174605304

image-20211212174614534

image-20211212174844410

image-20211212174917769

image-20211212174927403

image-20211212174949869

image-20211212174957694

电商案例

money=流量 * 转换率 * 客单价

客户价值模型QQ图片20211212185348

交互式可视化界面

1.用交互式的方式实现自助式消息获取。

2.用图表及数值表格的展示形式实现所见即所得。

3.帮助决策者发现问题,找到解决问题的正确方法,实现商业洞察。

在字段列表中是先按照数字进行排序,再根据字母进行排序。

主题风格:在视图下选择,不同主题风格字体背景颜色等都会不同。

当不同量纲的变量个数,需要增加值坐标轴个数,让不同量纲个数等于值坐标轴个数。需要增加值坐标轴个数,也可以减少不同量纲的变量个数。在powerbi中可以使用组合图,柱形图和折线图的合并图表,行值和列值分别是折线图和柱形图。

image-20211213213039720

这是地图中的帮助栏,三个向下的部分是下钻(第一个是深化,显示当前父级下的子级;第二个是只显示子级内容;第三个是既显示子级内容,也显示父级内容),第一个上升的部分是上卷

在选取推进哪种用户投入资金促进消费:两个方向:1.基数大小 2.转化难度

电商互联网流量分析

电商黄金公式:销售额 = 流量 * 转化率 * 客单价

流量数量指标:

访问人数(uv):到达店铺页面的非重复用户数

浏览量(pv):店铺内浏览和查看页面的累加次数。

访问数:一个会话内被用户连续访问的次数。

新访客数:新进访客数

流量质量重要指标:

  1. 平均访问深度:浏览量/访问次数
  2. 跳失率:跳出次数/访问次数
  3. 新访客占比:新访客数/访客数

流量转换率指标:

  1. 访客数:到达店铺页面的非重复用户数
  2. 收藏人数:到达访客收藏页面的人数
  3. 加入购物车人数:代打访客中完成订单支付行为的人数
  4. 支付人数:到店访客完成订单支付行为的人数
  5. 收藏人数占比:收藏人数/访客人数
  6. 支付人数占比:支付人数/访客数

建模下新建参数中,可以生成新的切片器,在切片器下选择显示列表,然后选择只能单项选择,继续使用switch函数进行匹配

餐饮案例

餐饮行业有两部分:快消行业和服务行业

由于是快消行业,要快速发现问题,并作出相应的相应,而餐饮行业的利润率较低,为了保证利润率,必须快速找到问题,并尽快做出响应。相较于大公司,必须尽快做出相应的措施,由于高成本低收益,要实时观察。

指标介绍

  1. 销售金额:当日店铺实际收入
  2. 销售kpi:每家店的销售金额与多有店的总平均金额的比
  3. 折扣额:占消费总额的10%-20%
  4. 折扣率:10%-20%
  5. 台数:店铺总台数
  6. 翻台率:当日店铺每张桌子被使用的平均次数
  7. 单均消费:当日店铺所有缴费单的平均金额
  8. 座位数:店铺实际拥有的座位数量
  9. 上座率:当日店铺每个座位被使用的平均次数
  10. 人均消费:当日到店每个人的平均消费金额(销售总额/客流量)

翻台率和上座率,翻台率要比上座率更大一些,如果翻台率很大,但上座率很低,说明散客较多,故桌子过大,桌椅布局不合理。更改桌椅布局。

pp里有个计算规则:当度量值要用到两个不同表中的度量计算得到时,要注意翻倍问题

例:翻台率=单数/台数=count(‘单号详细’[单号])/average(‘店铺情况’[总台数])最后结果会出错,在使用这种表达式时,一般会出现表连接表连接的主键是单号马,每个单号下都有一个总台数。

在使用仪表的时候,要设置最大值和最小值时,要在测量轴设置。

步骤:

一、导入原始数据到Power Query

二、复制“点菜明细”表创建“单汇总金额”表

三、复制“单号详细”表创建“店汇总信息”表

三、针对各个表进行处理

“单汇总金额”表:

  1. 只保留单号及消费金额字段

  2. 使用“分组依据”按照单号对消费金额进行汇总(对重复单号进行排重处理)

“单号详细”表:

  1. 使用“单号”字段横向合并单汇总金额表

  2. 将“单汇总金额”表中的“单汇总金额”字段展开(为“单号详细”表添加金额信息)

  3. 添加“折扣额”字段(折扣额 = 单汇总金额 * 会员折扣)

  4. 更改“付费时间”字段为小时:分:秒格式的时间格式字段

“店面情况”表:

  1. 添加“总座位数”字段(总座位数 = 二人台数2 + 三人台数3 + 四人及以上台数*6)

“点菜明细”表:

  1. 用“单号”字段合并“单号详细”表

  2. 将“单号详细”表中的“店名”字段进行展开(为之后在Power Pivot里创建与店面情况表的链接时用)

  3. 将“店名”字段置为首列

“店汇总信息”表:

  1. 使用“单号”字段横向合并“单汇总金额”表

  2. 将“单汇总金额”表中的“单汇总金额”字段展开(添加金额列)

  3. 添加“折扣额”字段(折扣额 = 单汇总金额 * 会员折扣)

  4. 删除“会员折扣”、“单号”、“付费时间”以及“日期”字段

  5. 使用分组依据功能对“店名”字段进行汇总

  6. 添加“单均消费”字段(单均消费 = 店汇总金额 / 桌数)

  7. 为“单均消费”字段取整

  8. 添加“人均消费”字段(单均消费 = 店汇总金额 / 来店人数)

  9. 为“人均消费”字段取整

  10. 使用“店名”字段横向合并“店面情况”表

  11. 将“店面情况”表中的“总台数”以及“总座位数”字段展开

  12. 添加“翻台率”字段(翻台率 = 桌数 / 总台数)

  13. 为“翻台率”字段取整

  14. 添加“上座率”字段(上座率 = 来店人数 / 总座位数)

  15. 为“上座率”字段取整

  16. 将“桌数”字段改名为“单数”

  17. 添加“折扣率”字段(折扣率 = 折扣总金额 / 店汇总金额)

快销行业案例

sku:最小的存储单位。

对经销商来说:为了避免风险过大,提高销售次数,加大运营速度,加快汇款速度。

相关指标

销售指标

  1. 动销次数:在一段时间内产品销售次数
  2. 动销天数:在一段时间内产品的销售天数
  3. 销售金额合计:一段时间内的销售金额
  4. 销售业绩环比:销售业绩好坏程度指标

库存类指标

  1. 期初库存金额:销售周期开始前的库存金额
  2. 期末库存金额:销售周期结束时的库存金额
  3. 库存周转率:销售周期内的销售金额/期初库存金额*100%

进货类指标

  1. 进货额:采购进货的金额

筛选器:筛选器中有三个部分,这三个部分作用的范围不同,此视觉对象针对的对象是当前选中的视觉对象,此页上的是针对当前页面,而所有页面上的针对的是所有页面的筛选器。

当想要同时在两个页面内同时使用相同的切片器时,可以在视图选项卡下选择同步切片器即可。

乘用车市场案例

案例中要体现的重点:1.明确自己车企的情况 2.知道自己与竞争对手车企的比较情况 3.知道自己车企不同属性的车型和市场中同属性车型 的比较情况。

销售管理分析(销售漏斗管理模型)

关系型销售运营模式:需要销售人员维持关系,销售周期长,需要与客户接触,了解客户需求,提出解决方案,每一条商机都非常重要,跟进实时的进展情况。

非关系型销售运营模式:在企业面向客户,在网站上展出商品直接面向客户,不需要销售人员维持关系,不需要销售人员维系,只需要客户自己进行选择。

电商类型是非关系模式。

关系型销售运营模式下 的销售漏斗管理模型

几乎所有的关系型销售管理模型都是销售漏斗管理模型,分为售前(获得更多的商机),售中(销售人员跟进,提高商机成功率),售后(售后服务活动良好的口碑,以便获得更多的商机)。

CRM:客户关系管理系统

销售漏斗管理模型是针对售终的阶段的模型。

华为的销售漏斗:L2C(Leads to Cash),从销售引领开始到回款为止。

IBM的销售漏斗:O2C(Opptunity to Close),从商机开始到商机成交为止。

售中:商机还为成交,不能叫订单,还是处于商机阶段。

销售漏斗模型:

  1. 先将发现潜在商业机会开始到现金回收为止的整个销售过程分为不同销售阶段。

  2. 再对每一个销售阶段进行有针对性的细致管理。

  3. 最终达到及早发现并回避潜在商机风险的目的。

尽可能降低每个阶段的销售阶段的商机流失。

数据分析要做到提前预测不同接单商机流失的风险

image-20211231171845856

商机的各个指标基本都可变,故我们进行分析时存在很多困难。

一个季度的运营周期是十三周,第一周到第五周真第一阶段,第六周到第十周是第二阶段,第十一周到第十三周是第三阶段。销售周期开始前,要把商机池里的商机分配给不同的销售人员,预计签约日是一个重要指标,要选择预期签约日在周期内的商机分配给不同的销售人员。商机的总量要足够大,观测商机推进效果,销售状态对比,要根据当周和上周状态进行对比,是否向前推进,如果没动或者倒退,那么推进过程过慢。在第二三阶段时,要判断绝对的销售阶段高低,以及转化情况(处在上升阶段的商机的风险较小,转化情况较好)。分析仪要展示的主要是每周销售阶段的变化情况,以及销售阶段的占比情况。第一阶段销售经理要看的是整体的商机的走势以及各个阶段商机的占比情况。经过第一阶段剩下的商机量,要关注商机量与目标商机成单数之间的关系,过低说明在之后的所有阶段不能再有流失,过高,可能牵扯过多销售投入。如果商机量不足,我们可以新增商机量,或者筛选绝对销售阶段低的商机更换。销售经理对于是补充还是继续维持,要进行选择,这是的判断标准是商机的成交可能性(及风险)以及销售人员的能力,补充的商机是来自商机池里的商机,一般都是劣质商机,推进时间已经不足,在这种情况下是从第六周进行补充的商机。销售例会要观测商机的具体情况,及推进水平,商机风险,绝对销售阶段。

经理分为:区域经理和产品经理,区域经理关注区域内的商机,产品经理关注产品销售的商机。

商机赢单:“销售人员根据自己销售行为的进展,根据经验可以给每个阶段一个‘赢率’,即胜算的机会值,如可以给出5%、10%、20%、30%、……、95%、100%等”计算公式=成功签约的合同数/销售人员跟进的商机数

串讲

区域和表

区域到表是为了提高数据处理的效率。

添加列中产出时间对应的年龄,在添加列选项卡下找到日期,选择年限,再在转换选项卡下选择持续时间年数,再进行舍入。