可视化:RStudio 统计模型

185 阅读3分钟

本文已参加「新人创作礼」活动,一起开启掘金创作之路。

这次带来的是 RStudio 的统计模型。

各个知识点后面都有对应的小练习哦,大家可以利用刚刚学到的知识来试着写写看!

数据分析/统计分析的常见任务

数据分析的核心流程主要包含以下环节:

  • 读取数据, 合并数据
  • 检查数据完整性
  • 检查异常值
  • 观察数据的分布
  • 检查各变量之间是否有关系
  • 修改变量的值/创建新变量
  • 建立统计模型
  • 预测变量的值
  • 评估模型的准确率

这些环节可以概括为两大类:

  1. 数据处理
  2. 模型的建立和评估

本节将专注于第一部分, 讨论数据处理中的一些典型任务.

# 读取数据, 合并数据
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.
  • tibble is 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 variables
  • summarise() reduces multiple values down to a single summary.
  • arrange() changes the ordering of the rows.
  • pull() pull out a single variable.
  • using join to 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."