一、概念及常识
1、数据分析必备的统计学知识
- 描述统计学
1.平均值、中位数、众数
2.方差、标准差
3.统计分布:正态分布、指数分布、二项分布、卡方分布 - 推论统计学
1.假设检验
2.置信区间
3.显着性测试 - 实验设计
1.A/B测试
2.实验条件控制
3.双盲测试
4.幂律分布
2、数据分析的常用工具
- SQL:数据科学家的必备技能
- ECXCEL:容易上手,所见即所得,无需编程即可对数据进行运算和作图。
- R:专门为数据科学而设计的语言,在数据科学领域比PYTHON略微受欢迎些。
- Python:简单易学,功能强大且丰富,是大学教授中最受欢迎的编程语言。
- Spark:专为大规模数据处理而设计的基于内存计算的引擎。
- Tableau:帮人们查看并处理数据,可进行快速分析、可视化并分享结果
3、从事数据科学需要掌握的技能
要从事数据科学,我们需要从数据知识、计算机知识、专业知识这三个维度考虑
- 具有分析思维
- 基本的大学数学知识,包括微积分和线性代数。
- 统计学知识,包括描述统计学和推导统计学
- 编程基础,如 Python 、R语言、SQL语句
- 算法知识,如回归、分类、聚类算法等。
- 数据可视化,将你的分析结果展示出来。
- 领域专业知识,如商业知识、生物知识等,视具体分析的问题而定。
3.1 数据科学的工作流程
虽然数据分析是一个不断迭代的过程,而且不同的步骤会有些交叉,但是我们依然可以将过程简化为以下七个步骤:
- 明确的问题
- 收集原始数据
- 数据清洗
- 数据探索
- 应用模型进行深度分析
- 传达分析结果
- 是分析过程可再现
在一个数据项目中,我们绝大部分的努力都将花在获取数据和清洗数据上(步骤2-3)以及展示分析结果和过程(6-7)上。
3.2 数据科学中的职业角色
- 数据科学家(data scieneists):有人这样描述数据科学家,他们比统计学家更懂编程,而比工程师更懂统计,
- 数据分析师(data analysts):他们研究数据并提供相应的报告和可视化图表,可以将数据分析师看作数据科学家的低配版,初级数据科学家,一般是从事数据科学工作的第一步,数据分析师不需要具备高深的研究背景来发明新算法,但是他们要熟练掌握现有工具来解决问题。
- 数据工程师( data engineers):他们是软件工程师的一种,为数据科学家们提供软件基础设施服务,建设强壮的数据管道来清洗、转移、聚合多种杂乱无章的数据,并存放道特定的数据库中,他们需要管理数据库系统;写复杂的查询语句来抽取数据,维护多台服务器,懂得hadoop等分布式系统。
二、MySQL必学必会
1、一般查询语句
需要掌握的关键词(包含顺序):
SELECT
FROM
JOIN
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
SELECT
指定需要先择的列,存在多个时用逗号分隔。如果想要查看全部列,则可以使用*号代替。如果需要对查询结果去重,可以添加DISTINCT关键词。另外可对选定的列使用AS关键词进行重命名。
示例代码:
SELECT name, age, occupation,season_contestant FROM bachelorette;
SELECT * FROM bachelorette;
SELECT DISTINCT season_contestant FROM bachelorette;
SELECT name, age, occupation,season_contestant as sc FROM bachelorette;
WHERE
可以用来对查询的项进行过滤。语法格式为:列名+过滤操作符+具体要求。常用的过滤操作符有:
- 比较操作符:=、>、<、>=、<=、!=和<>,其中!=和<>都表示不等于
- 多项匹配:
in
,采用括号将多个需要配匹配的放在一起 - 范围限定:
BETWEEN AND
,匹配某一个范围,请注意,在不同的数据库中,BETWEEN 操作符会产生不同的结果!在使用前需要先确定包含规则,所以推荐使用比较操作符替换BETWEEN AND- 在某些数据库中,BETWEEN 选取介于两个值之间但不包括两个测试值的字段。
- 在某些数据库中,BETWEEN 选取介于两个值之间且包括两个测试值的字段。
- 在某些数据库中,BETWEEN 选取介于两个值之间且包括第一个测试值但不包括最后一个测试值的字段。
- 模糊匹配:
LIKE
,阈值配合使用的时%代表任意个字符,_代表一个字符。 - 空值判断:
IS NULL
。注意,对于字符串为空不能应用控制判断,而使用!=’’ - 语法组合关键词
AND、OR、NOT
。优先级可用()
进行显式声明(括号内的优先)。
示例代码:
SELECT * from Customers WHERE country = 'USA';
SELECT * from Customers WHERE country = 'USA' OR country = 'Brazil';
SELECT * from Products WHERE Price BETWEEN 10 AND 20;
SELECT * from Customers WHERE CustomerName LIKE '%to%';
SELECT * FROM student WHERE dept_name IN ('Comp. Sci.', 'Physics', 'Elec. Eng.');
GROUP BY与聚集函数
GROUP BY允许你对指定的一个或多个列进行分组统计。而分组统计中常会用到聚集函数。常用的聚集函数如下:
- COUNT — 对列进行计数。还可以与DISTINCT一起使用,用来统计不同项目的数量。想对所有列进行统计可以使用
count(1)
或count(*)
,两个表示的含义是一致的。 - AVG — 取列的平均值(部分数据库使用的是AVERAGE关键词)
- MIN — 取列的最小值
- MAX — 取列的最大值
- SUM — 取列的和
示例代码:
SELECT Country, COUNT(CustomerID) FROM Customers GROUP BY Country;
HAVING
和WHERE一样也是一种数据过滤的方法,和WHERE条件不同的是它针对的是使用GROUP BY以后的聚合函数的值。
SELECT Country, COUNT(CustomerID) FROM Customers GROUP BY Country HAVING COUNT(CustomerID) > 3;
ORDER BY
指定要进行排序的以恶个或多个列,与ASC(正序)和DESC(倒序)一起使用。默认为ASC。
示例代码:
SELECT * from Customers WHERE country = 'USA' OR country = 'Brazil' ORDER BY CustomerName;
SELECT * from Customers WHERE country = 'USA' OR country = 'Brazil' ORDER BY CustomerName DESC;
JOIN
可以将多在表组合成一张表后进行查询。其中JOIN的常用操作主要有以下几类:
JOIN的时候需要使用ON关键词指定两张表中关联的列。另外可以对表使用AS关键词进行重命名,避免出现两张表相同列名的问题。重命名后取对应列的方法为表名.列名。
示例代码:
SELECT Orders.OrderID, Customers.CustomerName FROM Orders INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
SELECT Customers.CustomerName, Orders.OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
SELECT Orders.OrderID, Employees.LastName, Employees.FirstName FROM Orders RIGHT JOIN Employees ON Orders.EmployeeID = Employees.EmployeeID;
SELECT Customers.CustomerName, Orders.OrderID FROM Customers FULL OUTER JOIN Orders ON Customers.CustomerID=Orders.CustomerID;
其他的一些JOIN:
另外还有一种JOIN是Cross Join
,代表的是取2张表的笛卡尔积
LIMIT
限制需要返回的数据条目。比如LIMIT 100
,则表示只返回100条数据。如果是LIMIT 10,100
则表示返回从第10个开始,返回100条记录。
2、子查询
嵌套SELECT语句也叫子查询,一个 SELECT 语句的查询结果能够作为另一个语句的输入值。子查询不但能够出现在WHERE子句中,也能够出现在FROM子句中,作为一个临时表使用,也能够出现在SELECT LIST中,作为一个字段值来返回。
- 子查询必须括在圆括号中。
- 子查询的 SELECT 子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
- 子查询不能使用 ORDER BY,不过主查询可以。在子查询中,GROUP BY 可以起到同 ORDER BY 相同的作用。
- 返回多行数据的子查询只能同多值操作符一起使用,比如 IN 操作符。
- SELECT 列表中不能包含任何对 BLOB、ARRAY、CLOB 或者 NCLOB 类型值的引用。
- 子查询不能直接用在集合函数中。
- BETWEEN 操作符不能同子查询一起使用,但是 BETWEEN 操作符可以用在子查询中。
示例代码:
SELECT ename,deptno,sal FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE loc='NEW YORK');
SELECT ename,job,sal,rownum FROM (SELECT ename,job,sal FROM EMP ORDER BY sal);
3、CTE
CTE(Common Table Expressions)相当于生成一张临时表,与临时表不同的是生存周期的不同。不需要显式的创建或删除,也不需要创建表的权限。更准确的说,CTE更像是一个临时的VIEW。可同时定义多个CTE,但只能用一个with,多个CTE中间用逗号”,”分隔。
代码示例:
WITH t1 AS (
SELECT CountryRegionCode
FROM person.CountryRegion
WHERE Name LIKE 'C%'
)
SELECT *
FROM person.CountryRegion;
WITH t1 AS (
SELECT *
FROM table1
WHERE name LIKE 'abc%'
),
t2 AS (
SELECT *
FROM table2
WHERE id > 20
),
t3 AS (
SELECT *
FROM table3
WHERE price < 100
)
SELECT a.*
FROM t1 a LEFT JOIN t2 ON t1.id = t2.id
INNER JOIN t3 ON t1.id = t3.id;
和临时表有个重要的区别,就是生存周期,
CTE也就是common table expressions是sql标准里的语法,CTE与derived table最大的不同之处是:
- 可以自引用,递归使用(recursive cte
- 在语句级别生成独立的临时表. 多次调用只会执行一次
- 一个cte可以引用另外一个cte
- 一个CTE语句其实和CREATE [TEMPORARY] TABLE类似,但
4、UNION 与 UNION ALL
UNION和UNION ALL关键字都是将两个结果集合并为一个,主要区别:UNION在进行表链接后会筛选掉重复的记录,Union All不会去除重复记录。
代码示例:
SELECT column_name(s) FROM table_name1
UNION
SELECT column_name(s) FROM table_name2;
SELECT column_name(s) FROM table_name1
UNION ALL
SELECT column_name(s) FROM table_name2;
5、CASE WHEN
CASE WHEN是对列的数据进行判断,然后设定新的值,CASE WHEN通常使用在SELECT语句内,但有时也会用在WHERE语句内
示例代码:
SELECT
STUDENT_NAME,
(CASE WHEN score < 60 THEN '不及格'
WHEN score >= 60 AND score < 80 THEN '及格'
WHEN score >= 80 THEN '优秀'
ELSE '异常' END) AS REMARK
FROM
TABLE
6、常用函数
上面讲过聚集函数,这里主要介绍的是除聚集函数以外的其他函数。
常用数值处理函数
- ROUND: 确定数字要保存的位数,遵循四舍五入
- ABS: 取绝对值
- MOD: 取除法余数
- SIGN: 正数返回1,负数返回-1,0 返回0
- SQRT: 开方
- FLOOR/CEIL: 向下取整或向上取整
- POWER: 指数
常用字符串处理函数
- TRIM: 删除字符串前后的空格,另外还有RTRIM和LTRIM,可以指定删除左侧还是右侧空格
- SUBSTR: 取得字符串中指定起始位置和长度的字符串默认是从起始位置到结束的子串。
- LOWER/UPPER: 转换大小写
- CONCAT: 字符串拼接
- CONTAINS: 寻找是否包含某个字符
- REPLACE:用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式。
- LEN:返回字符串长度
日期时间处理函数
- NOW(): 返回当前时间
- CURRENT_DATE(): 返回 当前日期
- DATE_ADD/DATE_SUB: 日期的加减
- MONTH/YEAR/DAY/WEEKDAY/QUARTER/WEEK: 返回日期中的年月日周几(看数据库设置,通常0代表周一、1代表周二)
- TO_DATE:将字符串时间转化为日期格式
- DATEDIFF:计算两个日期间的天数
DATE_FORMAT(date, format)函数
DATE_FORMAT(date, format)函数可根据format字符串格式化日期或日期和时间值date,返回结果串。 也可用DATE_FORMAT()来格式化DATE 或DATETIME 值,以便得到所希望的格式。根据format字符串格式化date值:
- %S, %s 两位数字形式的秒( 00,01, . . ., 59)
- %i 两位数字形式的分( 00,01, . . ., 59)
- %H 两位数字形式的小时,24 小时(00,01, . . ., 23)
- %h, %I 两位数字形式的小时,12 小时(01,02, . . ., 12)
- %k 数字形式的小时,24 小时(0,1, . . ., 23)
- %l 数字形式的小时,12 小时(1, 2, . . ., 12)
- %T 24 小时的时间形式(hh : mm : s s)
- %r 12 小时的时间形式(hh