文章内容输出来源:拉勾教育数据分析实战训练营
大学所学专业是市场营销,毕业后很轻松的找了一份销售护肤品的工作,做了一段时间,感觉不是我所喜欢的,然后离职。后来再找工作,也不知道找什么工作,基本上是海投,文员,财务,行政等简历都投,最后去了一家金融公司做核算。在这家公司第一次学会了excel的函数功能,数据透视表等,然后在工作中不断的寻找数据的差异,这种成就感是我以前没有体验过的,更奠定了我要学习数据分析的决心。
然后我就搜索作为数据分析师需要掌握的技能,比如mysql,hive,python,spss等,搜索后才发现我目前所会的只有excel,ppt等办公软件,在真正数据分析师面前只是门外汉罢了。不甘心的我也咨询了好多机构,但都是动辄上万的培训费又让我望而却步,于是我就投机取巧,在淘宝上购买了一套39.9的培训课程来自学,坚持了一两星期,就坚持不下去了,然后就搁置了。
这样忙碌的过了一年左右,再次感觉数据分析是一个趋势,是必须掌握的,重新打开原来淘宝买的,发现真的是一点都学不进去,一个小小的安装问题,都阻碍了我一天的时间,此时我又产生了放弃的想法。这时我很幸运的遇到了拉勾教育的曼巴老师,我们聊了聊,也了解了拉勾的课程体系,感觉挺不错,但是都有一个疑问期,这时我百度,知乎等搜索相关培训,也有网评差的,说导师不负责任啥的,但是我当时却认为,我不能再浪费时间了,必须学习起来,时间不等人,我已经走了一次弯路了,学习是为自己学的,投资理财啥的,还不如投资自己的脑袋,于是就果断了付费购买了课程。
然后就进入了我们拉勾的培训体系,分配了班主任,还有基诺导师,也添加了微信,就是奔着好好学习的,于是紧张的学习生活就开始了。学习时发现,原来拉勾教育是闯关式的学习,一个阶段学会了,作业通过后才可以进入下一关的学习,这样游戏的方式更加刺激我的斗志。
第一阶段的问题对我来说是轻车熟路,问题不大,到了第二阶段mysql时,看着视频,感觉很简单,真正去实际操作时,才发现自己真的成为了“一看就会,一做就废”的状态,自信心受挫,然后我就把问题放到学习群里,群里的大佬太多了,分分钟帮我解决,解决不了的,基诺导师亲自微信指导我,慢慢我的问题多了,感觉我都和基诺导师成为了好朋友,无论何时,只要我有问题,基诺导师看到了都会第一时间回复我,指导我。此时我真的感觉很幸运遇到了拉勾,不然我还在耗时耗力的自学中,学不会,而且还浪费了我大量的时间,错过最佳的能力提升。
学习了一个多月,终于学到了第四阶段的hive--大数据查询利器,过程的艰辛与收货估计只有我们拉勾人才能深有体会。下面展示一下我的前三个阶段的学习笔记,不是那么完美,仅供大家学习参考。大家千万不要想着就三个阶段,so easy! 答案是:NO!每个阶段还有很多小模块,每个模块都有实战作业,作业通过后进入下个模块,整个模块学完了,才能进入下个阶段,真的是过五关斩六将!
学完整个课程,你会发现自己到底有多强!!
课程笔记如下:
第一阶段:数据分析思维与业务流程
一、数据分析师解决了什么问题呢?思维分以下四部
确定(确定和了解问题)
分解(分解问题和数据,使其成为更小的组成部分)
评估(对前两步了解到的情况做出各种结论)
决策(把结论重新组合在一起,作出一个建议或者决策)
二、数据分析流程图
数据库取数--数据处理--数据分析与可视化--产出报告
(一)Excel实战学习(业务逻辑)
问题:某水果店的销售额下滑,如何稳住毛利润?
然后利用Excel,对数据进行处理,对水果品类进行对比分析、象限分析、趋势分析(折线图)等分析,提出结论,给出策略。
(二)问题:在线教育经营分析
逻辑树进行拆解问题,制作关联矩阵,对比分析
使用综合分析法进行渠道排名:
对关键指标通过优化矩阵进行权重划分,确定各指标的权重值
对各指标进行0-1 标准化,消除量纲差异的影响
利用标准化后的指标与指标进行乘积求和计算综合得分
排名后再进行数据0-1标准化,计算出权重,然后再进行排名分析。通过漏斗分析确定各环节的转化率,得出结论和策略,产出报告。
第二阶段:mysql数据分析实战
一、数据语言---DDL
DDL语句(Data Definition Language 数据定义语言):创建数据库、创建表、修改表结构等结构性操作,创建或修改数据库/表结构,不涉及具体存储的数据。
create database 数据库名; 创建指定名称的数据库。
create database 数据库名 character set 字符集;创建指定名称的数据库,并且指定字符集(一般都指定utf8)
use 数据库: 切换数据库
select database(); 查看当前正在使用的数据库
show databases; 查看Mysql中 都有哪些数据库
show create database 数据库名; 查看一个数据库的定义信息
alter database 数据库名 character set 字符集; 数据库的字符集修改操作
drop database 数据库名 从MySql中永久的删除某个数据库
二、数据语言---DML
DML语句(Data Manipulation Language 数据操纵语言):针对table数据表中数据的增删改,使用DML。
基础语法:
create table test2 like test1; 创建一个表结构与 test1 相同的 test2表
show tables; 查看当前数据库中的所有表名
desc 表名; 查看数据表的结构
drop table 表名; 删除表(从数据库中永久删除某一张表)
drop table if exists 表名; 判断表是否存在, 存在的话就删除,不存在就不执行删除
rename table 旧表名 to 新表名;
alter table 表名 add 字段名称 字段类型; 向表中添加新字段
alter table 表名 modify 字段名称 字段类型;修改表中列的数据类型或长度
alter table 表名 change 旧列名 新列名 类型(长度);修改列名称
alter table 表名 drop 列名; 删除列
插入数据:
①insert into 表名(字段名1,字段名2...) values(字段值1,字段值2...);
②insert into 表名 values(字段值1,字段值2...); 注意:添加全部字段
更改数据 update....set....
①语法1:不带条件的修改 update 表名 set 列名 = 值;
②语法2:带条件的修改 update 表名 set 列名 = 值 [where 条件表达式:字段名 = 值 ]
例1:将所有的性别改为女(慎用!!) Update student set sex = '女';
例2:将sid为2的学员,年龄改为20,地址改为北京
Update student set age = 20,address = '北京' where sid = 2;
例3:将sid 为3的学生,性别改为男
Update student set sex = '男' where sid = 3;
删除数据 delete from
删除 sid 为 1 的数据::delete from student where sid = 1;
删除所有数据:delete from student:
如果要删除表中的所有数据,有两种做法:
delete from 表名; 不推荐. 有多少条记录 就执行多少次删除操作.效率低
truncate table 表名: 推荐. 先删除整张表, 然后再重新创建一张一模一样的表. 效率高当一个表中条数非常多,又要做删除动作的时候,如果用delete会很慢,那我们可以使用truncate
三、数据语言---DQL
DQL语句(Data Query Language 数据查询语言):针对table数据表中数据的查询操作,使用DQL。
执行顺序:FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY
条件查询:select 列名 from 表名 where 条件表达式
运 算 符:
where sname!='王五'
where sname<>'王五'
where age>18
where age>=18
where age<30
where age<=30
where age between 18 and 30;
where sname in ('王五','王六')
where sname like '%王%' -- sname中有王这个字
where sname like '王%' -- sname中以王开头
模糊查询:
% :表示匹配任意多个字符串
_ :表示匹配一个字符
四、mysql核心查询
(一)排序 order by
SELECT 字段名 FROM 表名 [WHERE 字段 = 值] ORDER BY 字段名 [ASC / DESC]
ASC 表示升序排序(默认) DESC 表示降序排序
例1: 升序排序:SELECT * FROM emp ORDER BY salary;
降序排序:SELECT * FROM emp ORDER BY salary DESC;
例2: 在薪水排序的基础上,再使用id进行排序, 如果薪水相同就以id 做降序排序
SELECT * FROM emp ORDER BY salary DESC, eid DESC;
(二)聚合函数
语法:SELECT 聚合函数(字段名) FROM
聚合函数作用
count(字段)统计指定列不为NULL的记录行数
sum(字段)计算指定列的数值和
max(字段)计算指定列的最大值
min(字段)计算指定列的最小值
avg(字段)计算指定列的平均值
实例:
#1 查询员工的总数
SELECT COUNT(eid) FROM emp; -- 使用某一个字段
SELECT COUNT(*) FROM emp; -- 使用 *
SELECT COUNT(1) FROM emp; -- 使用 1,与 * 效果一样
#2 查看员工总薪水、最高薪水、最小薪水、薪水的平均值
-- sum函数求和, max函数求最大, min函数求最小, avg函数求平均值
SELECT SUM(salary) AS '总薪水', MAX(salary) AS '最高薪水', MIN(salary) AS '最低薪水', AVG(salary) AS '平均薪水' FROM emp;
#3 查询薪水大于4000员工的个数
SELECT COUNT(*) FROM emp WHERE salary > 4000;
#4 查询部门为'教学部'的所有员工的个数
SELECT COUNT(*) FROM emp WHERE dept_name = '教学部';
#5 查询部门为'市场部'所有员工的平均薪水
SELECT AVG(salary) AS '市场部平均薪资' FROM emp WHERE dept_name = '市场部';
(三)分组
分组查询指的是使用 GROUP BY 语句,对查询的信息进行分组,相同数据作为一组,分组往往和聚合函数一起时候,对数据进行分组,分完组之后在各个组内进行聚合。
SELECT 分组字段/聚合函数 FROM 表名 GROUP BY 分组字段 [HAVING 条件];
例1: 通过性别字段 进行分组,求各组的平均薪资
SELECT sex, AVG(salary) FROM emp GROUP BY sex;
例2.查询每个部门的平均薪资, 部门名称不能为null
SELECT dept_name AS '部门名称', AVG(salary) AS '平均薪资'
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name;
例3:查询平均薪资大于6000的部门
SELECT dept_name , AVG(salary)
FROM emp WHERE dept_name IS NOT NULL GROUP BY dept_name HAVING AVG(salary) > 6000 ;
注意:
需要在分组后,对数据进行过滤,使用having
分组操作中的having子语句,是用于在分组后对数据进行过滤的,作用类似于where条件。而本题中则是先分组后,再进行过滤。
where 与 having的区别
过滤方式特点
wherewhere 进行分组前的过滤where 后面不能写 聚合函数
havinghaving 是分组后的过滤having 后面可以写 聚合函数
(四)limit 关键字
例1:查询emp表中的前 5条数据
SELECT * FROM emp LIMIT 5; SELECT * FROM emp LIMIT 0 , 5;
例2:查询emp表中 从第4条开始,查询6条
-- 起始值默认是从0开始的. SELECT * FROM emp LIMIT 3 , 6;
(五)多表查询的分类
1.内连接查询
SELECT 字段名 FROM 左表, 右表 WHERE 连接条件;
例子:查询商品表的商品名称 和 价格,以及商品的分类信息
可以通过给表起别名的方式, 方便我们的查询(有提示)
SELECT
p.`pname`, p.`price`, c.`cname`
FROM products p , category c WHERE p.`category_id` = c.`cid`
2.显式内连接
SELECT 字段名 FROM 左表 [INNER] JOIN 右表 ON 条件
-- inner 可以省略
1) 查询所有商品信息和对应的分类信息
SELECT * FROM products p INNER JOIN category c ON p.category_id = c.cid;
3.外连接查询
左外连接:SELECT 字段名 FROM 左表 LEFT [OUTER] JOIN 右表 ON 条件
右外连接:SELECT 字段名 FROM 左表 RIGHT [OUTER ]JOIN 右表 ON 条件
各种连接方式的总结
内连接: inner join , 只获取两张表中 交集部分的数据.
左外连接: left join , 以左表为基准 ,查询左表的所有数据, 以及与右表有交集的部分
右外连接: right join , 以右表为基准,查询右表的所有的数据,以及与左表有交集的部分内连接和左外连接使用居多。
(六)合并查询
UNION 操作符用于合并两个或多个 SELECT 语句的结果集,并消除重复行。
注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
UNION 子句的基本语法如下所示:
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
UNION
SELECT column1 [, column2 ] FROM table1 [, table2 ] [WHERE condition]
总结: UNION和UNION ALL关键字都是将两个结果集合并为一个,也有区别。
1.重复值:UNION在进行表连接后会筛选掉重复的记录,而Union All不会去除重复记录。
2.UNION ALL只是简单的将两个结果合并后就返回。
3.在执行效率上,UNION ALL 要比UNION快很多,因此,若可以确认合并的两个结果集中不包含重复数据,那么就使用UNION ALL。
(七)子查询
一条select 查询语句的结果, 作为另一条 select 语句的一部分子查询的特点,子查询必须放在小括号中。子查询的场景中还会有另外一个特点,整个sql至少会有两个select关键字子查询常见分类
where型子查询: 将子查询的结果, 作为父查询的比较条件 =
from型子查询 : 将子查询的结果, 作为 一张表,提供给父层查询使用
exists型子查询: 子查询的结果是单列多行, 类似一个数组, 父层查询使用含子查询的结果
(八)扩展—MySQL函数
数学函数、字符串函数、日期时间函数、条件判断函数、系统信息函数
1.数学函数
函数作用
ABS(x)返回x的绝对值
FLOOR(x)向下取整 CEIL(X)向上取整返回不大于x的最大整数值
RAND()返回0~1的随机数
PI()返回圆周率的值
MOD(x,y)返回x除以y以后的余数
......
-- 系统信息函数
select database();
select version();
select user();
-- 数学函数
1.select abs(-10) as ' 绝 对 值 '
2.select abs(price) from products
3.select floor(5.9) as '向下取整';
4.select ceil(5.01) as '向上取整'
5.select round(5.419,2)as '四舍五入'-- 第二个数值是保留几位小数的意思
6.select rand();-- 返回0-1之间的随机数
7.select pi();-- 返回圆周率
8.select mod(5,2);-- 求余数
-- 字符串函数
函数作用
CONCAT(s1,s2...)将字符串拼接,连接为一个字符串
LEFT(s,n)返回从字符串s开始的n最左字符
TRIM(s)移除掉字串中s的字头或字尾处空格
REPLACE(s,s1,s2)用字符串s2替代字符串s重的字符串s1
SUBSTRING(s,n,len)截取字符串s中第n个位置开始,长度为len的字符串
MID(s,n.len)同SUBSTRING(s,n,len)
REVERSE(s)将字符串s的顺序翻转过来
......
-- 日期和时间函数
函数作用
CURDATE()返回当前日期
CURTIME()返回当前时间
NOW()返回当前日期和时间
MONTH(d)返回月份
YEAR(d)返回年份
......
五、MySQL高级应用
MySQL从8.0开始支持窗口函数,有的也叫分析函数(处理相对复杂的报表统计分析场景),这个功能在大多商业数据库和部分开源数据库中早已支持。
窗口函数:窗口、函数(应用在窗口内的函数) 窗口类似于窗户,限定一个空间范围 。
可以理解为记录集合,窗口函数也就是在满足某种条件的记录集合上执行的特殊函数。
静态窗口:每条记录都要在此窗口内执行函数,窗口大小都是固定的
滑动窗口:不同的记录对应着不同的窗口,动态变化。
(一)窗口函数的基本用法如下:
函数名([expr]) over(partition by <要分列的组> order by <要排序的列> rows between <数据范围>)
其中,over是关键字,用来指定函数执行的窗口范围,包含三个分析子句:分组(partition by)子句,排序(order by)子句,窗口(rows)子句,如果后面括号中什么都不写,则意味着窗口包含满足where条件的所有行,窗口函数基于所有行进行计算;如果不为空,则支持以下语法来设置窗口:
sum(...A...) over(partition by ...B... order by ...C... rows between ...D1... and ...D2 )
avg(...A...) over(partition by ...B... order by ...C... rows between ...D1... and ...D2 )
A: 需要被加工的字段名称 B: 分组的字段名称 C: 排序的字段名称 D: 计算的行
1.rows between 2 preceding and current row # 取当前行和前面两行
2. rows between unbounded preceding and current row # 包括本行和之前所有的行
3. rows between current row and unbounded following # 包括本行和之后所有的行
4.rows between 3 preceding and current row # 包括本行和前面三行
5. rows between 3 preceding and 1 following # 从前面三行和下面一行, 总共五行
# 当order by后面缺少窗口从句条件, 窗口规范默认是rows between unbounded preceding and current row.
# 当order by和窗口从句都缺失, 窗口规范默认是 rows between unbounded preceding and unbounded following
(二)ntile(n) over(partition by ...A... order by ...B... )
n:切分的片数 A:分组的字段名称B:排序的字段名称
ntile(n),用于将分组数据按照顺序切分成n片,返回当前切片值
NTILE不支持ROWS BETWEEN
(三)偏移分析函数
lag(...) over(...)
lead(...) over(...)
总结:
1.Lag和Lead函数可以在同一次查询中取出同一字段的前N行的数据(Lag)和后N行的数据(Lead) 作为独立的列。
2.在实际应用当中,若要用到取今天和昨天的某字段差值时,Lag和Lead函数的应用就显得尤为重要。
lag(exp_str,offset,defval) over(partion by ......order by)
lead(exp_str,offset,defval) over(partion by ......order by)
六、留存率的分析
对于互联网公司,客户的留存非常重要,能够直观反应客户的活跃情况。
在mysql中,我们如何做客户留存呢?它的流程是什么?
1.用用户活跃日期表做自连接,连接方式使用左连接,连接字段使用“用户id”字段,保留两表的用户id与两表的日期。
代码实现:
create view user_table
as SELECT
a.user_id id1,
a.dates date1,
b.user_id id2,
b.dates date2
FROM
temp_user_act a
LEFT JOIN temp_user_act b ON a.user_id = b.user_id;
2.筛选出右表日期大于或等于左表日期的内容(保留一项,不重复)
代码实现:create view date_diffrent as
select * from user_table where date2>=date1;
3.计算以左表日期为基准日的当日用户数,第二日回访用户数,第三日回访用户数,第四日回访用户 数,第八日回访用户数
代码实现:
create view unumber as
select
date1,
count(distinct case when DATEDIFF(date2,date1)=0 then id2 else null end ) device_v,
count(distinct case when DATEDIFF(date2,date1)=1 then id2 else null end ) day1,
count(distinct case when DATEDIFF(date2,date1)=2 then id2 else null end ) day2,
count(distinct case when DATEDIFF(date2,date1)=3 then id2 else null end ) day3,
count(distinct case when DATEDIFF(date2,date1)=7 then id2 else null end ) day7
from date_diffrent
group by date1;
4.3.利用上述数据计算出每日的当日用户数以及次日留存率,二日留存率,三日留存率,7日留存率(率需要使用百分比表示结果);
select
date1,
device_v,
concat(round(day1/device_v*100,2),'%') day1,
concat(round(day2/device_v*100,2),'%') day2,
concat(round(day3/device_v*100,2),'%') day3,
concat(round(day7/device_v*100,2),'%') day7
from unumber;
第三阶段:互联网公司必备-BI商业智能工具
商业智能(Business Intelligence,简称:BI),指用现代数据仓库技术、线上分析处理技术、数据挖掘和数据展现技术进行数据分析以实现商业价值。
可视化:可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,再进行交互处理的理论、方法和技术。
下面我就自己在学习的过程中,遇到的问题,进行记录。没有问题的,就可以看拉勾的讲义学习喽!
(一)以下是tableau遇到的问题以及解决方案
问题一:excel并集容易出错,应该如何做?
1. 保证所需导入并集的excel在一个文件夹里,且文件不能重复。我就因为文件多了一份,导致数据出现重复的问题。具体操作如下:
2. 制作目标完成度靶心图时,一般会出现以下的问题?
3. 编辑标题处,为何有时日期没有呈现出来?
4. 圆环图如何制作?
流程:先制作一个饼图---借助创建参数---拖动2个参数到行功能区---右键双轴---同步---标题去掉---将其中一个饼图参数全部去表---改为白色---调整大小。
以上是我参加数据分析以来所做的笔记总结,希望对迷茫的你有所帮助!