从小白到数据分析师的成长之路

文章内容输出来源:拉勾教育数据分析实战训练营

大学所学专业是市场营销,毕业后很轻松的找了一份销售护肤品的工作,做了一段时间,感觉不是我所喜欢的,然后离职。后来再找工作,也不知道找什么工作,基本上是海投,文员,财务,行政等简历都投,最后去了一家金融公司做核算。在这家公司第一次学会了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个参数到行功能区---右键双轴---同步---标题去掉---将其中一个饼图参数全部去表---改为白色---调整大小。


以上是我参加数据分析以来所做的笔记总结,希望对迷茫的你有所帮助!


你可能感兴趣的:(从小白到数据分析师的成长之路)