最近在udacity上报了数据分析的进阶课程,在此开一篇文章记录下学习过程。
笔记内容可能来自课程内内容,也可能来自于互联网上其他资源。对于重要的内容我会再文末留下链接用于回溯和参考。
了解数据分析
课程介绍
- 入门课程
- Python入门
- 了解常见流程
- 用Python做数据分析
- 统计学基础知识
- 进阶课程
- 数据清洗
- 探索性数据分析
- 可视化
- 进阶求值
- +8周求职内容
- 简历
- 领英、Github档案简历
- 行为导向模拟面试
- 技术模拟面试
讲师组成
- 博士毕业生
- 计算机科学家
- 数据科学家
- 公司创始人
- 工程师
- 数据分析课程的项目总监
其中
Sebastian Thrun 优达学城创始人
斯坦福大学终身教授,Google 无人车之父,作为一名计算机科学家,创办和投身于 Udacity 后,他致力于为全世界各个年龄段的知识爱好者提供最前沿的硅谷高等教育方式。
进阶课程要求
- SQL技能:熟练使用 SELECT, FROM, GROUP BY, WHERE, HAVING, ORDER, MIN, MAX, COUNT
- SQL技能:熟悉 LEFT JOIN, OUTER JOIN, INNER JOIN 的区别
- SQL技能:熟悉子查询(Sub Query)
- Python技能:熟练使用 Python:循环,条件判断,字符串,整形数,浮点数,字典,列表,函数定义与调用
- Python(或R)技能:熟练读取、写入 CSV
- Python(或R)技能:熟练筛选数据表,查看基本表格属性,分组与聚合
- Python(或R)技能:熟练作图(条形图,直方图,散点图等):Matplotlib in Python 或者 Ggplot2 in R
- Python(或R)技能:熟练重命名表头,函数映射(apply)
数据分析的常见流程
- 提出问题
- 数据收集与清洗(大部分的时间消耗在这里)
- 了解数据来源
- 根据使用目的来清洗数据
- 需要掌握高效的清洗技能
- 数据探索
- 数据的体积很大,几百MB上GB
- 得出结论或作出预测
- 选出最佳的发现来回答问题(选择性盲目?)
- 有时建立机器学习模型来对未来的数据做出预测
- 结果交流(报告)
工具
- SQL
- Python
- numpy
- pandas
- Jupyter
- R
- ggplot2
- RColorBrewer
- Swirl
- knitr
- lm
- ddply
- gridExtra
- tidyverse
- dyplr
- filter()
- group_by()
- mutate()
- arrange()
- reshape2
- Tableau
收集数据
数据组织结构类型
- 平面文件,如csv、tsv(tab seperated values)
- HTML
- JSON
- TXT
- 关系型数据库
- Other
- Excel
- Pickle(Python自带的序列化库所生成的文件)
- HDF5
- SAS
- STATA
Python中的关系数据库
- pandas
pandas.read_sql()
df.to_sql()
- sqlalchemy
评估数据
据说 80% 的数据分析时间用于清洗和准备数据。
数据集是杂乱还是具有条理,这取决于行、列和表如何与观察值、变量和类型匹配。具有条理的数据具有以下特征:
- 每个变量构成一列。
- 每个观察结果构成一行。
- 每种类型的观察单位构成一个表格。
在用pandas库评估数据的时候,可以使用 data frame 的df.head()
, df.tail()
, df.info()
和series.value_counts()
方法。
df.info() result:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 19001 entries, 0 to 19000
Data columns (total ?? columns):
jobpost 19001 non-null object
date 19001 non-null object
Title 18973 non-null object
Company 18994 non-null object
AnnouncementCode 1208 non-null object
Term 7676 non-null object
Eligibility 4930 non-null object
Audience 640 non-null object
StartDate 9675 non-null object
Duration 10798 non-null object
Location 18969 non-null object
dtypes: bool(1), int64(2), object(21)
memory usage: 3.4+ MB
评估数据就是检查数据是否存在两种问题:
- 数据质量问题(即内容问题),例如不准确或重复的数据
- 缺乏整洁度(即结构性问题),每个变量必须是一列,每个观察值必须是一行,每种类型的观察单位必须是一个表格
目测评估
四个主要的数据质量纬度:
- 完整性
- 有效性
- 准确性
- 一致性
编程评估
.head
(DataFrame 和 Series).tail
(DataFrame 和 Series).sample
(DataFrame 和 Series).info
(仅限于 DataFrame).describe
(DataFrame 和 Series).value_counts
(仅限于 Series)- 各种索引和筛选数据的方法 (
.loc
and bracket notation with/without boolean indexing, also.iloc
)
清洗数据
提高整洁度指转换数据集,使每个变量成一列,每个观察结果成一行,每种类型的观察单位构成一个表格。
数据清理流程:确定方案(defining)、编写代码(code)以及检验效果(test)
- 定义: 指以书面形式定义数据清洗计划,其中我们需将评估转变为定义的清洗任务
- 代码: 将这些定义转换为代码并执行该代码
- 测试: 测试我们的数据集,通常使用代码,以确保有效完成我们的清洗工作
步骤:
- 首先,你将解决数据缺失问题 (同时了解为什么一般有必要先解决完整性问题)
- 接着,你将解决整洁度问题 (同时了解为什么这通常是第二步)
- 最后,你将解决质量问题
评估、清洗迭代
…
存储数据(可选)
如果需要使用清洗后的数据
整理与EDA、ETL
EDA
EDA, 探索性数据分析:一个定义:即一种分析方法,重点是确定数据中的一般模式,以及确定数据的意外异常值和特征。
关于探索数据,然后再扩大数据,最大限度发挥我们分析、可视化和建模的潜力。探索数据时,通常会使用简单的可视化来总结数据的主要特征。以便于进行其他操作,例如删除异常值,并根据现有数据创建新的和更具描述性的功能,我们也将这称为 特征工程。或者检测和删除异常值,使建模更具适用性。
探索单一变量
# 安装主题
install.packages('ggthemes', dependencies = TRUE)
library(ggthemes)
# 按月分成不同直方图,直方图按天进行分割
qplot(x=dob_day, data=pf) +
scale_x_continuous(breaks=1:31) +
facet_wrap(~dob_month, ncol=4)
# 定义直方图bin宽度,限制数据范围,设置数据分割点
qplot(x = friend_count, data = pf, binwidth = 10) +
scale_x_continuous(limits = c(0, 1000),
breaks = seq(0, 1000, 50))
# 用户年龄直方图,以年为单位
qplot(x = tenure/365, data = subset(pf, !is.na(gender)), binwidth = .1, xlab='Number of years using FB', ylab='Number of users in the sample', color=I('black'), fill=I('#099dd9')) +
scale_x_continuous(limits = c(0, 8), breaks = seq(0, 10, 1))
# 在一个图像内创建多个图形
install.packages("gridExtra")
# define individual plots
p1 = ggplot(...)
p2 = ggplot(...)
p3 = ggplot(...)
p4 = ggplot(...)
# arrange plots in grid
grid.arrange(p1, p2, p3, p4, ncol=2)
# 好友数转换后的直方图
p1 <- qplot(x = friend_count, data = pf, color=I('black'), fill=I('#099dd9'))
p2 <- qplot(x = log10(friend_count)+1, data = pf, color=I('black'), fill=I('#099dd9'))
p3 <- qplot(x = sqrt(friend_count), data = pf, color=I('black'), fill=I('#099dd9'))
grid.arrange(p1, p2, p3, ncol=1)
# 男女好友数频率分布对比
qplot(x=friend_count, y=..count../sum(..count..),
data = subset(pf, !is.na(gender)),
geom = 'freqpoly', color=gender,
binwidth=10) +
scale_x_continuous(lim=c(0, 1000), breaks = seq(0, 1000, 50))
# 男女好友数箱线图
qplot(x=gender, y = friend_count, data=subset(pf, !is.na(gender)),
geom = 'boxplot') +
coord_cartesian(ylim=c(0, 250))
# 好友请求发出数统计
by(pf$friendships_initiated, pf$gender, summary)
# logical stattistics
pf$mobile_check_in <- NA
pf$mobile_check_in <- ifelse(pf$mobile_likes > 0, 1, 0)
pf$mobile_check_in <- factor(pf$mobile_check_in)
summary(pf$mobile_check_in)
sum(pf$mobile_check_in == 1) / length(pf$mobile_check_in)
探索两个变量
- 散点图
- 抖动
- 透明度
- 条件平均
- 相关系数
ETL (extract-transform-load)
- 用户不同:ETL把IT作为最终用户,而商业人员几乎不会看到或参与ETL过程
- 数据不同:ETL被设计用来处理已经结构化的数据,而数据整理是处理各种数据源来得到格式化的数据
- 使用场景不同:ETL被用来提取、转换、载入数据并存储到数据中心,并利用商业智能应用软件来报告和分析数据;而且数据平台通常为商业人员提供了浏览和上传整理后的数据的权限
分析与可视化
%matplotlib inline
的作用
在 Jupyter 当前 notebook 上启用画图功能
- https://stackoverflow.com/questions/43027980/purpose-of-matplotlib-inline/43028034
- http://ipython.readthedocs.io/en/stable/interactive/plotting.html
knowledge tree
代码示例
你还可以使用以下代码读入数据:
read.delim('pseudo_facebook.tsv')
散点图的等效 ggplot 语法:
ggplot(aes(x = age, y = friend_count), data = pf) +
geom_point()
数据分析总结
过程总览
- 统计知识
- 数据清洗
- 收集
- 平面文件,如csv、tsv
- HTML
- JSON
- TXT
- 关系型数据库
- Other
- Excel
- Pickle(Python自带的序列化库所生成的文件)
- HDF5
- SAS
- STATA
- 评估
- 完整性
- 有效性
- 准确性
- 一致性
- 清洗
- 定义
- 代码
- 测试
- 对清洗过的数据
- 存储
- 分析
- 可视化
- 汇报
- 数据清洗过程
- 数据分析和可视化
- 收集
- 探索性数据分析
- R
- 探索一个变量
- 探索两个变量
- 探索多个变量
- R
- 通过数据讲故事
- 可视化基础知识
- 设计原则
- Tableau
- 创建可视化
- 讲故事
收集
根据数据来源及其格式,收集数据的步骤各不相同。
高级收集过程:获取数据(从互联网下载文件、抓取网页、查询 API 等),然后将该数据导入编程环境(例如 Jupyter Notebook)。
评估
评估数据的目的包括:
质量:内容问题。低质量数据也称为脏数据。
整洁度:使分析难易进行的问题。不整洁数据也称为杂乱数据。条理数据的要求包括:
每个变量成一列。
每个观察结果成一行。
每种观察单位构成一个表格。
评估类型:
目测评估:使用你喜欢的软件应用程序(Google 表格、Excel、文本编辑器等)观察数据。
编程评估:使用代码来查看数据的特定部分和摘要(例如 pandas 的 head、tail 和 info方法)。
清洗
清洗类型:
手动(不推荐,除非问题是一次性出现)
编程
编程数据清洗过程:
定义:将评估转换为定义的清洗任务。这些定义也可以作为指令列表,以便其他人(或你自己将来)可以回顾和重现自己的工作。
代码:将这些定义转换为代码并运行。
练习:可视上或使用代码练习数据集,确保清洗操作可顺序进行。
清洗之前,请务必备份原始数据!
重新评估与迭代
清洗后,如有必要,请重新评估和迭代任何数据整理步骤。
存储(可选)
例如,如果将来使用,可将数据存储到文件或数据库中。
项目
- 检验心理学现象:计算描述统计学结果,并根据心理现象“普鲁斯特效应”对数据集进行统计学检验
- WeRateDogs 推特数据:收集各种来源和形式的数据,评估质量和清洁度,然后进行清洗;通过分析和可视化展示清洗过程
- 探索性数据分析:从优达学城提供的数据集中选择一个,或自己寻找一个数据集,对其进行完整的探索性数据分析
- 创建一个 Tableau 故事:使用数据集创建 Tableau 数据可视化,以讲述有关数据的故事或突出显示数据的趋势或模式。这是数据可视化的理论和实践
思维
学习方法
- Learning by doing 是最高效的学习方法,
- 需要有能力自己寻找解决方案,并且实现它
- 不断练习、巩固
- 顶尖科技企业最看中的应聘者能力是项目能力、解决问题的能力
- 实战项目能够帮助你真正掌握技能,更可以展示你解决问题的能力
SQL, Python
略
R
- links
- commands
<-
- c
- nchar
- data
- str
- dim
- names
- row.names
- head
- tail
$
- mean
- getwd()
- setwd()
- list.files()
- read.csv()
- read.table()
- write.csv()
- write.table()
- load(), save() (R data file)
subset(<data-frame>, <condition>)
<data-frame>[<row-condition>, <column-condition>]
summary(<data-frame>)
str(<data-frame>)
levels(<data-series>)
- ggplot
- qplot
facet_wrap(<formula>)
facet_grid(<formula>)
na.omit(<date-frame>)
by(<opts>)
- (layer functions, statement + ?)
coord_cartesian(<opts>)
scale_x_continuous(breaks=1:31)
geom_point(alpha=1/20)
geom_jitter(alpha=1/20)
xlim(a, b)
coord_trans(x='log10', y='log10')
scale_x_discrete
- length
- nrow
- ncol
- ggsave
- summarise
- range
- seq
%.%
(chain command)- 在较新版本的 dplyr (0.3.x+) 中,语法
%.%
已被弃用且替换为%>%
。
- 在较新版本的 dplyr (0.3.x+) 中,语法
- quantile
- Concepts
- 因子变量:数据集的列
- 有序因子:对数据集列的元素值的集合进行排序。how to work with ordered factors
- 分面
- 自由标尺(free scale)
安装ggplot2
install.packages('ggplot2', dependencies = TRUE)
library(ggplot2)
# 如果你看到错误信息,可以尝试在 http://xquartz.macosforge.org/ 重新安装 XQuartz,然后运行以下代码
install.packages('devtools', dependencies = T)
library(devtools)
install_version("colorspace","1.2-4")
install.packages('RColorBrewer', dependencies = TRUE)
library(RColorBrewer)
如何排序因子
reddit$age.range <- factor(reddit$age.range, levels=c("Under 18", "18-24", "25-34", "35-44", "45-54", "55-64", "65 or Above"))
qplot(data=reddit, x=age.range)
数学知识
- 概率常识
- 贝叶斯定理
- 描述统计学(descriptive statistics)
- 推断统计学(inferential statistics)
- 假设(hypothesis)检验
具体内容:
- 正态分布(normal distribution)
- 总体(population)均值(mean)、标准差(standard deviation)
- 抽样(sample)均值、标准差
- 抽样的定义:在统计学中,抽样(Sampling)是一种推论统计方法,它是指从目标总体(Population,或称为母体)中抽取一部分个体作为样本(Sample),通过观察样本的某一或某些属性,依据所获得的数据对总体的数量特征得出具有一定可靠性的估计判断,从而达到对总体的认识。
- 抽样获得的是一组样本数据。
- 抽样均值的分布:从总体里选出所有的固定大小的一组样本,计算平均值,所有的均值构成这个分布
- z-score:这是一种衡量单个样本和总体均值偏离的数字
- Z-Score: Definition, Formula and Calculation
- 1.单样本的 z-score
- 单样本对应总体 z
- 单样本对应抽样 zi
- 2.抽样均值的 z-score:衡量抽样对应总体的误差
- 残差:残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。如果回归模型正确的话, 我们可以将残差看作误差的观测值。
- 残差是对观察值和估计值的度量,误差是对观察值和实际值的度量。
- 抽样平均值的标准差:
- 抽样平均值的标准误:
- 因为一般不知道总体的标准差(σ),会用抽样的标准差(s)来估计(how?)总体的标准差
- 残差:残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。如果回归模型正确的话, 我们可以将残差看作误差的观测值。
- z-score 值一般从最小-3到最大3;0 表示样本刚好等于平均值;超出这个范围的概率为 1%
- z-table: 通过查表,计算单样本位于某个样本值之下的概率。所给参数为这个参考样本的 z-score
- 集中趋势测量、变异测量
- 假设检验
- 假设:零假设H0、备选假设H1
- 假设检验的种类包括:t检验,Z检验,卡方检验,F检验等等
- 检验统计量
- 第一类错误(Type I error、阳性判断错误)、第二类错误(Type II error、阴性判断错误)
- P(Probability,Pr)值
- P值是进行检验决策的另一个依据。
- 统计学根据显著性检验方法所得到的P 值,一般以P < 0.05 为有统计学差异, P<0.01 为有显著统计学差异,P<0.001为有极其显著的统计学差异。
- P值代表零假设成立的可能性
- 如果P值小于显著性水平(0.05, 0.01)则说明零假设不可能发生,可以拒绝零假设
- P值与α值的关系? - 知乎
- t检验 udacity问答
- 分类(检验的类型 - Minitab)
- 单样本
- 双样本
- 独立样本
- 相依样本
- 选择配对t检验还是双样本t检验
- 如果分数之前和之后的示例工作表中每一行表示相同的主题,则是有意义的计算分数的区别,在这个时候选择配对t检验是适当的。 然而,如果分数在每一行都是为不同的主题,它没有意义来计算差别。 在这种情况下,您需要使用另外一个检验,如双样本t检验。
- 对单样本t检验、双样本t检验以及配对t检验的理解
- 分类(检验的类型 - Minitab)
- 自由度(degree of freedom, df)样本中能自由变化的变量的个数,称为该统计量的自由度
- 抽象概念
- 操作定义:将一些事物如变量、术语与客体等以某种操作的方式表示出来。操作定义与概念型定义相区别,强调确立事物特征时所采纳的流程、过程或测试与检验方式。
- 试验性研究、观察性研究
面试
..
接触到的相关软件和商业产品
- 产品
- 有趣的网站
- 可能的数据源