可视化:RStudio 统计模型 - 变量关联性

195 阅读3分钟

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

这次带来的是 RStudio 的统计模型 - 变量关联性。

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

两个变量之间的关系

两个变量之间如果具有明确的数学表达式, 那我们就可以用函数/数学模型来描述它们.

而现实中的大多数情况是: 我们并不知道这个函数是什么, 甚至也不确定它们之间是否存在明确的关系

这时我们对这两个变量之间的关系的研究经常是基于相关性分析的.

两个变量是否相关, 是数据分析中经常考虑的问题, 其结论(相关/不相关)将为如何建立数学/统计模型提供依据.

  • 两个随机事件的相关与独立

image.png

  • 两个类别型随机变量之间的独立性

  • 两个连续型随机变量之间的相关性

  • linear correlation 线性相关性

image.png

  • linear correlation coefficient 线性相关系数:

image.png

  • linear correlation coefficient of samples 样本的线性相关系数:

image.png

  • sample variance 样本方差:

image.png

  • sample covariance 样本协方差:

image.png

  • 线性相关系数的假设检验

  • 检验结果怎么看

  • 如何抽取结果中的重要信息

# --- 两个类别型随机变量之间的独立性 ---

# 钻石的cut 和 color 
 
table(dia_a$cut, dia_a$color)

cc = dia_a %>%
  filter(cut %in% c("Ideal","Premium"), color %in% c("D","J")) %>%
  mutate(cut = as.character(cut), color = as.character(color))

table(cc$cut, cc$color)
table(cc$cut, cc$color) %>% chisq.test()


# --- 两个连续型随机变量之间的相关性 --- 

# sample variance

# sample covariance

# 编写一个函数 svar(x), 用于计算 sample variance

# 编写一个函数 scvar(x, y), 用于计算 sample covariance

plot(dist ~ speed, data=cars)
# 用 R自带的函数 var, sd, cov 计算数据集cars中speed和dist之间的线性相关系数

var(cars$speed)
sd(cars$speed)

var(cars$dist)
sd(cars$dist)

cov(cars$speed, cars$dist)
cov(cars$speed, cars$dist) / (sd(cars$speed) * sd(cars$dist))

# R自带的函数 cor
cor(cars$speed, cars$dist)

# 协方差矩阵 和 相关系数矩阵
cov(cars)
cor(cars)

# cor(x, y = NULL, use = "everything",
#    method = c("pearson", "kendall", "spearman"))

# x, y 必须是同样长度的一维向量
# 或者 x 必须是一个二维矩阵/数据框



# Pearson's product moment correlation coefficient
# The coefficient follows a t distribution with length(x)-2 degrees of freedom if the samples follow independent normal distributions

# cor.test(x, y,
#          alternative = c("two.sided", "less", "greater"),
#          method = c("pearson", "kendall", "spearman"),
#          exact = NULL, conf.level = 0.95, continuity = FALSE, ...)

# cor.test(formula, data, subset, na.action, ...)

# 原假设   Null hypothesis : 相关系数为0
# 备择假设 Alternative hypothesis : 相关系数不为0

cor.test(cars$speed, cars$dist)
cor.test(~ speed+dist, data=cars)


# 输出结果怎么看?
# 最简单的看法:  alternative  +  p-value

# 如何抽取检验结果中的重要信息?

ct = cor.test(cars$speed, cars$dist)
str(ct)
ct$statistic

练习

# Q1
# 编写两个函数 pvar(x), svar(x), 用于计算 population variance 和 sample variance

# Q2
# 编写两个函数 pcov(x, y), scov(x, y), 用于计算 population covariance 和 sample covariance

习题

# Q1
# dia_a 数据集中, 钻石的price跟carat是正相关的吗?

# Q2
# dia_a 数据集中, 每个color分组中, 钻石的price跟carat都是正相关的吗?
# 思考如何用dplyr配合cor.test 来得到答案

Hypothesis test 假设检验

在上一节中, 我们使用了 cor.test 来检验两个变量之间的线性相关性是否显著. 这里体现了一种现代统计中非常重要的思想: 假设检验

假设检验的思想与步骤:

  1. 收集相关数据(一次实验)
  2. 建立两个假设: 原假设(Null Hypothesis) 和 备择假设(Alternative Hypothesis), 两者是互斥的
  3. 基于“原假设是正确的”这一前提, 计算出现“目前的数据”的概率
  4. 评估这个概率是否足够小, 足够小就否定原假设(意味着接受备择假设)

理解这个思想

  1. 本质是根据“观察到的现象”反推“其前提是否合理”;
  2. 计算出的p-value足够小, 到底意味着什么?
  3. 计算出的p-value比较大, 到底意味着什么?

常见的假设检验

  • 单总体的均值检验
  • 两总体的均值检验
  • 相关性检验
  • 两总体的方差检验
  • 多总体的方差检验
# 均值的假设检验

# t.test(x, y = NULL,
#        alternative = c("two.sided", "less", "greater"),
#        mu = 0, paired = FALSE, var.equal = FALSE,
#        conf.level = 0.95, ...)

# t.test(formula, data, subset, na.action, ...)

# 单总体的均值检验

# 根据样本数据, 检验总体的均值是否等于mu /大于mu / 小于mu
t.test(mtcars$mpg, mu=20)
t.test(mtcars$mpg, mu=25)
t.test(mtcars$mpg, mu=15)

t.test(mtcars$mpg, mu=20, alternative="greater")
t.test(mtcars$mpg, mu=25, alternative="greater")
t.test(mtcars$mpg, mu=15, alternative="greater")

t.test(mtcars$mpg, mu=20, alternative="less")
t.test(mtcars$mpg, mu=25, alternative="less")
t.test(mtcars$mpg, mu=15, alternative="less")

# 两总体的均值检验
# 四缸车的mpg和六缸车的mpg是否相等
t.test(mtcars$mpg[mtcars$cyl==4], mtcars$mpg[mtcars$cyl==6])

# 相关性检验

# 分类型变量
M = as.table(rbind(c(762, 327, 468), c(484, 239, 477)))
dimnames(M) = list(gender = c("F","M"),
                   party = c("Democrat","Independent","Republican"))
chisq.test(M)

# 连续型变量
cor.test(~ dist+speed, data=cars)

练习

# Q1
# 检验: 六缸车的mpg是否大于16 ?

# Q2
# 检验: 八缸车的mpg是否小于六缸车的mpg ?

习题

# Q1
# 计算出的p-value足够小, 到底意味着什么?

# Q2
# 计算出的p-value比较大, 到底意味着什么?

# Q3
# 编程练习
# 凯撒密码是一种古老的加密系统,它通过将字母按照固定的间隔移动变成密文来加密,现在要求写一个函数 caesar = function(text, k) 可返回密文
# 其中 text是明文, k是指定的间隔
# 并要求可以用同一个函数来解密