本文已参加「新人创作礼」活动,一起开启掘金创作之路。
这次带来的是 RStudio 的统计模型。
各个知识点后面都有对应的小练习哦,大家可以利用刚刚学到的知识来试着写写看!
数据分析/统计分析的常见任务
数据分析的核心流程主要包含以下环节:
- 读取数据, 合并数据
- 检查数据完整性
- 检查异常值
- 观察数据的分布
- 检查各变量之间是否有关系
- 修改变量的值/创建新变量
- 建立统计模型
- 预测变量的值
- 评估模型的准确率
这些环节可以概括为两大类:
- 数据处理
- 模型的建立和评估
本节将专注于第一部分, 讨论数据处理中的一些典型任务.
# 读取数据, 合并数据
dia_a = read.csv("./data/R0_data_dia_a.csv")
# 检查数据完整性 # 缺失值
summary(dia_a)
is.na(dia_a)
table(is.na(dia_a))
# 检查异常值
boxplot(dia_a[,2]) # boxplot检查的其实是离群点
# 观察数据的分布
hist(dia_a[,2])
# 检查各变量之间是否有关系
plot(price ~ carat, data=dia_a)
plot(price ~ carat, data=dia_a, cex=0.1)
# 创建新变量
ppc = dia_a$price / dia_a$carat
# 想一想这个新变量代表的实际意义是?
# 修改已有变量的值
# 处理缺失值
# 重新编码
# cut的各个值并不是单纯的用于区分, 而是有程度大小关系的
# "Fair" < "Good" < "Very Good" < "Premium" < "Ideal"
# 需要修改这个变量
# 建立统计模型
mod = lm(price ~ carat, data=dia_a)
# 预测变量的值
predict(mod, newdata=data.frame(carat=1))
# 评价模型的准确率
# 拟合的准确率, 预测的准确率
# 具体范例见 linear regression
练习
# Q1
# 数据集 dia_a中的carat包含缺失值, 一种简单的处理方法是直接忽略包含缺失值的样本, 得到一个不含缺失值的数据子集, 将这个子集保存为dc.
# Q2
# 对于 dia_a中carat的缺失值, 如果不想删除这些样本, 就需要想一个办法来填充这些缺失值, 试完成这个任务.
# --- 下面的题目将基于Q1得出的数据子集 dc ---
# Q3
# 将 cut 转换为能体现出 "切割工艺好坏"的格式
# Q4
# 按照经验, "切割工艺"更好的钻石, 同等条件下应该会更贵一些, 试求出各种cut水平下的平均价格,平均重量,单位重量的平均价格, 保存在一个数据框中.
# Q5
# 色泽(color) 也是一个有序的分类变量, 其品质从低到高的分类为:
# "D" < "E" < "F" < "G" < "H" < "I" < "J"
# 将 color 转换成合适的格式
# Q6
# 除了重量和切割工艺, 色泽(color)也可能会影响钻石的价格. 试求各种color水平下的平均价格,平均重量,单位重量的平均价格, 保存在一个数据框中.
# Q7
# 如果考虑cut和color的共同影响, 那么一共有35种组合, 试求各种组合下的平均价格,平均重量,单位重量的平均价格, 保存在一个数据框中.
# 注意: 以上code只能用到目前已经学过的函数, 不能使用下一节dplyr的函数
习题
# Q1
# clarity 也是一个有序的分类变量, 其品质从低到高的分类为:
# "I1" < "SI2" < "SI1" < "VS2" < "VS1" < "VVS2" < "VVS1" < "IF"
# 将 clarity 转换成合适的格式
# Q2
# clarity 也可能会影响钻石的价格. 试求各种 clarity 水平下的平均价格,平均重量,单位重量的平均价格, 保存在一个数据框中.
# Q3
# 如果考虑cut,color,clarity的共同影响, 那么一共有280种组合, 试求各种组合下的平均价格,平均重量,单位重量的平均价格, 保存在一个数据框中.
# Q4
# 按照平均价格排序, 列出最高的10种组合和最低的10种组合, 以及它们的平均价格,平均重量,单位重量的平均价格.
# Q5
# 按照平均重量排序, 列出最高的10种组合和最低的10种组合, 以及它们的平均价格,平均重量,单位重量的平均价格.
# Q6
# 按照单位重量的平均价格排序, 列出最高的10种组合和最低的10种组合, 以及它们的平均价格,平均重量,单位重量的平均价格.
# 注意: 以上code只能用到目前已经学过的函数, 不能使用下一节dplyr的函数
数据处理包: dplyr
dplyr提供了一种处理数据的语法, 它包含了一组格式统一的动词(函数)可以方便的完成多种非常常见的数据处理任务:
%>%pipes an object forward into a function or call expression.tibbleis a modern take on data frames.filter()picks cases based on their values.arrange()arranges the cases in ascending or descending orders.select()picks variables based on their names.mutate()adds new variables that are functions of existing variablessummarise()reduces multiple values down to a single summary.arrange()changes the ordering of the rows.pull()pull out a single variable.- using
jointo join datasets.
# install.packages("magrittr")
# install.packages("dplyr")
# install.packages("tidyverse") # install the whole tidyverse
library(magrittr)
# %>% pipe operator 管道操作符 # 来自magrittr这个包
# pipe (管道) 的基本使用格式
# x %>% f is equivalent to f(x)
# x %>% f(y) is equivalent to f(x, y)
# x %>% f %>% g %>% h is equivalent to h(g(f(x)))
sum(1:10)
1:10 %>% sum
x1 = c(1:10, NA)
sum(x1)
sum(x1, na.rm=T)
x1 %>% sum
x1 %>% sum()
x1 %>% sum(na.rm=T)
# 求一个向量中各个元素的平方根的均值
# 算法顺序: 向量 ---> 计算平方根 ---> 求均值
# coding顺序: 均值 ( 平方根 ( 向量 ) )
mean( sqrt(x1), na.rm=T )
# 管道操作的写法
x1 %>% sqrt %>% mean(na.rm=T)
# 管道的优势?
# 1. 代码写法跟算法的顺序一致
# 2. 减少多次嵌套带来的括号, 让代码更易读
# tibble
View(mtcars)
mtcars
as_tibble(mtcars)
tb1 = tibble(x=1:50, y=runif(50))
tb1
as.data.frame(tb1)
# ---- dplyr -----
library(dplyr)
# select 选择变量 # 选择部分列
mtcars[, c("mpg", "cyl", "wt")]
select(mtcars, mpg, cyl, wt)
mtcars %>% select(mpg, cyl, wt)
# mutate 创建新变量
mpgwt = mtcars$mpg/mtcars$wt
mtcars %>%
mutate(mpgwt = mpg/wt)
# transmute 创建新变量
mtcars %>%
transmute(mpgwt = mpg/wt)
# filter 选择样本 # 选择部分行
mtcars[mtcars$mpg > 20, ]
mtcars[mtcars$mpg > 20 & mtcars$cyl == 6, ]
filter(mtcars, mpg > 20)
filter(mtcars, mpg > 20, cyl == 6)
mtcars %>% filter(mpg > 20)
mtcars %>% filter(mpg > 20, cyl == 6)
mtcars %>% filter(mpg > 20) %>% filter(cyl == 6)
mtcars %>% select(mpg, cyl, wt) %>% filter(mpg > 20, cyl == 6)
mtcars %>%
select(mpg, cyl, wt) %>%
filter(mpg > 20, cyl == 6)
# arrange 排序
mtcars %>%
select(mpg, cyl, wt) %>%
arrange(mpg)
mtcars %>%
select(mpg, cyl, wt) %>%
arrange(desc(mpg))
mtcars %>%
select(mpg, cyl, wt) %>%
arrange(-mpg)
# group_by 分组
mtcars %>% group_by(cyl)
# summarise 合并计算结果, 通常与group_by配合使用
tapply(mtcars$mpg, mtcars$cyl, mean)
mtcars %>%
group_by(cyl) %>%
summarise( mean_mpg = mean(mpg) )
# pull 抽取出某一列变成向量
mtcars %>% pull(wt)
mtcars %>% pull(1)
# join(x, y, by=NULL, ...): inner_join, left_join, right_join, ...
dia_b = read.csv("./data/R0_data_dia_b.csv")
inner_join(dia_a, dia_b, by="id")
dia_a %>%
inner_join(dia_b, by="id") -> dia
dia_a %>%
left_join(dia_b, by="id") -> dia_left
习题
# 使用 dplyr 的函数, 重做上一节的练习与习题
拓展阅读
阅读材料:Tidyverse
magrittr, dplyr, ggplot2 都是 tidyverse 的一部分. tidyverse 是一个面向数据科学的R包集合, 由Hadley Wickham主导.
tidyverse 让全世界众多统计学家/数据科学家在使用R语言进行研究时能更加轻松,快捷和有趣.
关于 Hadley Wickham
Wickham was awarded the international COPSS Presidents' Award in 2019
"for influential work in statistical computing, visualization, graphics, and data analysis;
for developing and implementing an impressively comprehensive computational infrastructure for data analysis through R software;
for making statistical thinking and computing accessible to large audience;
and for enhancing an appreciation for the important role of statistics among data scientists."