在《Exploratory data analysis 1st》中,我描述了与“变量内的变异情况”相关的一系列问题,在此基础上,大家已经理解了什么是探索性数据分析,如何通过提问题的方式去深入了解你的数据, 并且我还介绍了如何处理数据集中的异常值和缺失值。

这节将继续探讨与“变量间的协变性”相关的一系列问题,进一步加深对数据的了解。

本节内容需要加载的R包

library(tidyverse, warn.conflicts = FALSE)
library(gridExtra) #用于合并ggplot图
#没有此包的先用install.packages()进行安装

统计术语

variation ≠ variance

variation(变异):描述的是变量内的数值变化;

Variance(方差): 衡量数据分布的离散程度。它描述的是一组数据与其平均值之间的偏离程度。

standard deviation(SD,标准差):标准差是方差的平方根,也是一种衡量数据分布离散程度的统计指标。
\[ SD = {\sqrt{Variance}} = \sigma \]

方差 vs 标准差: 两者都是非负的数值,数值越大,说明离散度越大,变量内的变异程度越高,反之越低;方差的单位是原始数据单位的平方,而标准差的单位与原始数据的相同。通常,标准差更易于与原始数据进行比较和理解(单位相同),但是方差对异常值更敏感,更能够直观地显示数据的波动情况。

standard error of mean(SEM,平均值的标准误差):或简称standard error(SE,标准误差),表示总体平均值与样本平均值的差异程度。它告诉你,如果你要使用单个总体中的新样本重复一项研究,样本均值会发生多大变化。 https://www.scribbr.com/statistics/standard-error/ \[ SE = \frac{\sigma}{\sqrt{n}} \]

Coefficient of Variation(变异系数):衡量数据相对离散程度.变异系数可以用于比较两个或多个具有不同均值和标准差的数据集的相对变异程度。需要注意的是:变异系数只对具有正值均值的数据集有意义,因此它不适用于均值为零或负数的情况。此外,变异系数只是衡量数据集的相对离散程度,并不能提供关于数据分布形状的信息。

\[ CV = \frac{\sigma}{\bar{x}} \times 100\% \]

Covariance(协方差):描述的是变量间如何一起变化。

Covariance 是用来测量两个随机变量之间关系的统计量。具体地,它用于衡量这两个变量是否同时增大或减小,即这两个变量是否是同步波动的。如果两个变量越是同步波动,则协方差的值越大;反之则越小,若完全独立则协方差为0。协方差是许多统计学方法和模型的基础,如线性回归、主成分分析等。

Correlation(相关性):衡量两个变量之间线性关系的强度和方向。协方差的标准化。

协方差 vs 相关性: 协方差是非标准化的,取值可以取“-∞ ~ ∞”间的任何数值;相关性 是标准化的,取值范围是”-1 ~ 1”。两者的区别和应用的更详细解释:https://builtin.com/data-science/covariance-vs-correlation

4 探索性数据分析

4.6 观测变量间的协变性

在上一节中,我们用以下代码删除了diamonds的异常值并保存为diamonds2:

diamonds2 <- diamonds %>% 
  filter(between(y, 3, 20))

下面的举例分析将基于diamonds2进行.

4.6.1 一个定性变量和一个连续变量的关系

通常希望按照定性变量来分解探索连续变量的分布。geom_freqpoly()的默认外观对于这种比较并不那么有用,因为高度是由计数给出的。这意味着如果其中一个组比其他组要小得多,很难看出形状上的差异。

e.g. 探索钻石的价格如何随其质量而变化:

方法一:折线图

ggplot(data = diamonds2, mapping = aes(x = price)) + 
  geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)

从上图的结果来看,很难看出Fair组分布的差异,因此该组的总计数(2000左右)远远小于Ideal组(2W左右),导致在视觉上差异被缩小,解决方法是:把Y轴的计数替换成density:
为了更容易进行比较,我们需要转变y轴上的显示内容。不再显示计数,而是显示密度(density),即把计进行标准化,使得每组质量下的数据的频率多边形下的面积为一。

ggplot(data = diamonds2, mapping = aes(x = price, y = ..density..)) + 
  geom_freqpoly(mapping = aes(colour = cut), binwidth = 500)

#在ggplot2中,双点(..)被用作一种特殊的语法,用于在图形中引用计算出的变量或统计量。在这种情况下,y = ..density..表示将计算出的密度作为y轴的映射变量。

与前一个图相比,使用density 比使用count更容易观测到的变异情况。每组的变化幅度不再受到计数(count)的影响。
但是还有许多无法用该方法直观观测到的数值,比如每组的中位数、四分位距(IQR)等。

方法二:箱线图–一种更受欢迎的方法
每个箱线图包括以下内容:
1)一个从分布的第25个百分位数延伸到第75个百分位数的box,这个距离被称为四分位距(IQR)。在box中间的线显示了分布的中位数,即第50个百分位数。这三条线给出了关于分布的展开程度以及分布是否基于中位数对称或倾斜的感觉。

2)box上方的点,代表的是一些观测值与箱子边缘相距1.5倍的IQR以上。这些离群点是异常的,因此会单独绘制。

3)一条实线,从箱子的每一端延伸,并延伸到分布中最远的非异常点。

e.g. 使用geom_boxplot()来查看按质量(cut)分类的价格(price)分布:

ggplot(data = diamonds2, mapping = aes(x = cut, y = price)) +
  geom_boxplot()

尽管分布的信息少了很多,但是箱线图更紧凑,所以我们可以更轻松地进行比较(并在一个图中放置更多内容)。
该图中有个令人意外的发现:平均而言,质量更好的钻石更便宜!不符合常识的结果,我们需要找出原因,因此这就是你下一步该思考的问题。

“cut” 是一个有序因子:fair比good差,而good比very good差,以此类推。许多定性变量没有内在顺序,因此我们可能会希望重新排序它们以获得更具信息性的显示方式。一种方法是使用reorder()函数。
e.g.在mpg数据集中,取class变量。你可能会想知道各个等级间公路里程的变化,为了更容易看到趋势,我们可以根据hwy的中位数值重新排序class:

ggplot(data = mpg) +
  geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy))

如果你有很长的变量名,使用geom_boxplot()+coord_flip()函数将图形旋转90°后效果会更好,例如:

ggplot(data = mpg) +
  geom_boxplot(mapping = aes(x = reorder(class, hwy, FUN = median), y = hwy)) +
  coord_flip()

练习

1)在diamonds2数据集中,哪个变量对于预测钻石价格最重要?该变量与切割的相关性如何?为什么这两个关系的结合导致质量较低的钻石更昂贵?

2)箱线图存在一个问题,即它们是在数据集较小的时代开发的,并且往往会显示出过多的“异常值”。解决这个问题的一种方法是使用letter value plot(字母值图)。安装lvplot包,并尝试使用geom_lv()来显示价格与切割的分布。你学到了什么?你如何解释这些图形?

3)比较并对比geom_violin()与facetted geom_histogram()或coloured geom_freqpoly()。每种方法的优缺点是什么?

5) 如果你有一个小型数据集,使用geom_jitter()来查看连续和分类变量之间的关系有时是有用的。ggbeeswarm包提供了许多类似于geom_jitter()的方法。列出它们并简要描述每个方法的功能。

4.6.2 两个定性变量的关系

为了可视化两个分类变量之间的协变关系,您需要统计每个组合的观测数量。
方法一:使用内置的geom_count()函数进行统计:

ggplot(data = diamonds2) +
  geom_count(mapping = aes(x = cut, y = color))

在图中,每个圆的大小表示每个数值组合中出现的观测数量。协变关系将表现为特定x值和特定y值之间的强相关性。

方法二:使用dplyr计算计数:

diamonds2 %>% 
  count(color, cut)
## # A tibble: 35 × 3
##    color cut           n
##    <ord> <ord>     <int>
##  1 D     Fair        163
##  2 D     Good        662
##  3 D     Very Good  1513
##  4 D     Premium    1602
##  5 D     Ideal      2834
##  6 E     Fair        224
##  7 E     Good        933
##  8 E     Very Good  2400
##  9 E     Premium    2337
## 10 E     Ideal      3902
## # ℹ 25 more rows

然后使用geom_tile()和fill参数进行可视化:

diamonds2 %>% 
  count(color, cut) %>%  
  ggplot(mapping = aes(x = color, y = cut)) +
    geom_tile(mapping = aes(fill = n))

练习

1)您如何重新缩放上面的计数数据集以更清楚地显示颜色内部或切割内部的分布?

4.6.3 两个连续变量的关系

使用geom_point()绘制散点图。您可以通过点分布的模式看到协变关系。
e.g.您可以看到钻石的克拉大小与价格之间的指数关系。

ggplot(data = diamonds2) +
  geom_point(mapping = aes(x = carat, y = price))

随着数据集大小的增长,散点图的有用性会降低,因为数据点开始重叠,堆积成均匀黑色的区域(如上所示)。解决这一问题:
方法一:使用透明度

ggplot(data = diamonds2) + 
  geom_point(mapping = aes(x = carat, y = price), alpha = 1 / 100)

但是对于非常大的数据集使用透明度可能会有挑战。

方法二:使用bin(分箱)
之前,我们使用geom_histogram()和geom_freqpoly()在一维上进行了分箱。现在,你将学习如何使用geom_bin2d()和geom_hex()在二维上进行分箱。geom_bin2d()创建矩形箱,而geom_hex()创建六边形箱。填充颜色显示落入每个箱中的样本数量。您需要安装hexbin包才能使用geom_hex()。

install.packages("hexbin")
ggplot(data = diamonds2) +
  geom_bin2d(mapping = aes(x = carat, y = price))

ggplot(data = diamonds2) +
  geom_hex(mapping = aes(x = carat, y = price))

方法三:将一个连续变量进行分箱处理,使其像一个定性变量。 然后,可以使用之前学到的一种将分类变量和连续变量组合可视化的技巧。

例如,您可以对克拉进行分箱,然后对每个组别显示一个箱线图:

ggplot(data = diamonds2, mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_width(carat, 0.1))) # 0.1代表你设置的分箱大小,可根据需求更改。

如上所示,cut_width(x, width)将x分割为宽度为width的箱子。默认情况下,很难看出每个箱线图概括了不同数量的数据点。

一种显示方法是使用varwidth = TRUE使箱线图的宽度与数据点的数量成比例。

ggplot(data = diamonds2, mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_width(carat, 0.1)),varwidth = TRUE)

另一种方法是在每个箱子中显示大致相同数量的数据点。这就是cut_number()的作用:

ggplot(data = diamonds2, mapping = aes(x = carat, y = price)) + 
  geom_boxplot(mapping = aes(group = cut_number(carat, 20)))

#数据集为diamonds2,将克拉数(carat)作为x轴变量,价格(price)作为y轴变量。geom_boxplot()函数用于创建箱线图,通过mapping参数将分组变量设置为切割数量(cut_number)函数对克拉数(carat)进行分组。在这里,切割数量将克拉数分成了10个等宽的组。箱线图显示了数据的分布情况,包括最小值、第一四分位数、中位数、第三四分位数和最大值。因为设置了分组变量,每个组将有一个箱线图,并且各组之间可以进行比较。
练习

1)与使用箱线图概括条件分布不同,你可以使用频率多边形来展示。在使用cut_width()与cut_number()时,您需要考虑什么?这会如何影响carat和price的二维分布的可视化呢?

2)可视化按价格划分的carat分布。

3)非常大的钻石与小型钻石的价格分布有何区别?是否符合您的预期,还是让您感到惊讶?

4)结合您学到的两种技巧,将cut、carat和price的联合分布进行可视化。

5)二维图形显示了一维图形无法看到的异常值。

例如,下图中的一些点在x和y值的组合上具有异常值,使得这些点成为异常值,尽管它们的x和y值在单独检查时似乎是正常的。

ggplot(data = diamonds2) +
  geom_point(mapping = aes(x = x, y = y)) +
  coord_cartesian(xlim = c(4, 11), ylim = c(4, 11))

检测异常值时,为什么散点图(scatterplot)比分箱绘图(binned plot)更适合?

ggplot(data = diamonds2, mapping = aes(x = x, y = y)) + 
  geom_boxplot(mapping = aes(group = cut_width(carat, 0.1))) # 0.1代表你设置的分箱大小,可根据需求更改。

4.7 观测变量间的相关性(Correlation)

安装和加载本节内容绘图所需的R包ggpubr

install.packages("ggpubr")
library("ggpubr")

4.7.1 计算模型介绍

1)皮尔逊相关系数(Pearson correlation ,r)衡量了两个变量(x和y)之间的线性相关性。它也被称为参数相关性检验,因为它依赖于数据的分布。只有当x和y都来自正态分布时才能使用。而y = f(x)的图形被称为线性回归曲线。

2)肯德尔(Kendall tau)斯皮尔曼(Spearman rho)是基于排名的相关系数(非参数相关性检验)。

4.7.2 分析方法介绍

基本代码公式如下:

cor(x, y, method = c("pearson", "kendall", "spearman"))
cor.test(x, y, method=c("pearson", "kendall", "spearman"))
#method 三选一

加载示例数据,iris是tidyverse包内置的数据集,因此可以直接使用data()。

data("iris")
head(iris, 3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa

方法一:使用cor.test()函数计算两个变量间的相关系数和P值

t是t检验的统计值,df是自由度,p-value是t检验的显著性水平)。conf.int是相关系数在95%置信区间内;sample estimates是相关系数(Cor.coeff)。

res.pearson <- cor.test(iris$Petal.Length, iris$Petal.Width, 
                    method = "pearson")
res.pearson
## 
##  Pearson's product-moment correlation
## 
## data:  iris$Petal.Length and iris$Petal.Width
## t = 43.387, df = 148, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.9490525 0.9729853
## sample estimates:
##       cor 
## 0.9628654
#该检验的p值为2.2e-16,小于显著性水平alpha = 0.05。我们可以得出结论,Petal.Length和Petal.Width之间存在显著的相关性,相关系数为0.9628654,p值为2.2e-16。

z是z检验的统计值

res.kendall <- cor.test(iris$Petal.Length, iris$Petal.Width, 
                    method = "kendall")
res.kendall
## 
##  Kendall's rank correlation tau
## 
## data:  iris$Petal.Length and iris$Petal.Width
## z = 13.968, p-value < 2.2e-16
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
##       tau 
## 0.8068907
#该检验的p值为2.2e-16,小于显著性水平alpha = 0.05。我们可以得出结论,Petal.Length和Petal.Width之间存在显著的相关性,相关系数为0.8068907,p值为2.2e-16。

s是s检验的统计值

res.spearman <- cor.test(iris$Petal.Length, iris$Petal.Width, 
                    method = "spearman")
res.spearman
## 
##  Spearman's rank correlation rho
## 
## data:  iris$Petal.Length and iris$Petal.Width
## S = 35061, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.9376668
#该检验的p值为2.2e-16,小于显著性水平alpha = 0.05。我们可以得出结论,Petal.Length和Petal.Width之间存在显著的相关性,相关系数为0.9376668,p值为2.2e-16。

方法二:用散点图可视化数据 使用三种不同的计算方法,用散点图可视化数据

#pearson方法
plot1 <- ggscatter(iris, x = "Petal.Length", y = "Petal.Width", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "pearson",
          xlab = "Petal Length", ylab = "Petal Width",  color = "black")
#kendall方法
plot2 <- ggscatter(iris, x = "Petal.Length", y = "Petal.Width", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "kendall",
          xlab = "Petal Length", ylab = "Petal Width",  color = "red")
#spearman方法
plot3 <- ggscatter(iris, x = "Petal.Length", y = "Petal.Width", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "spearman",
          xlab = "Petal Length", ylab = "Petal Width",  color = "blue")
# 合并图形
combined_plot <- grid.arrange(plot1, plot2, plot3, nrow = 1)

从上面的图形可以看出,Petal.Length和Petal.Width关系是线性的,且呈现正相关。如果散点图显示出曲线模式,我们就在处理两个变量之间的非线性关联。
对于这种类型结果的数据,如果你只是简单看以下两个变量之间的线性关系,那么在计算方法的选择上,并不是很重要。 但是我们如果要把分析结果的r和P值写作论文里,就必须得考虑如何选择计算模型?

4.7.3 解释相关系数

相关系数介于 -1 和 1 之间。

-1 表示强烈的负相关:这意味着每当 x 增加时,y 减少(左侧图表)。

0 表示两个变量(x 和 y)之间没有关联(中间图表)。

1 表示强烈的正相关:这意味着 y 随着 x 的增加而增加(右侧图表)。

4.7.4 如何选择计算模型?

模型的选择关键是看数据是否属于正太分布,即:Pearson方法用于正太分布的数据,而”kendall”, “spearman”用于非正太分布。因此,我们因该先检验数据是否属于正太分布,再进行相关性分析方法的选择。

e.g. 以下示例用来说明正太分布检验的方法。

方法1:直方图查看分布

#Petal.Length的分布图
plot4 <- ggplot(data = iris) +
  geom_histogram(mapping = aes(x = Petal.Length), binwidth = 0.2,color = "green") 

#生成一个均值为0、标准差为1的正态分布
x <- seq(-4, 4, length.out = 100)
y <- dnorm(x, mean = 0, sd = 1)

plot5 <- ggplot(data.frame(x = x , y = y), aes(x, y)) + 
  geom_line() +
  xlim(-4, 4) +
  ylim(0, 0.45) +
  ggtitle("标准正态分布")

# 合并图形
combined_plot <- grid.arrange(plot4, plot5, nrow = 1)

图中有两个不连续的聚类数据,分别由各自的峰值,很明显与正太分布的图完全不同,仅从直方图中,我们也能判断该数据不属于正太分布。

方法2:使用Shapiro-Wilk正态性检验 Shapiro-Wilk检验可以按如下方式进行:
零假设:数据服从正态分布。
备择假设:数据不服从正态分布。

# Shapiro-Wilk normality test for Petal.Length
shapiro.test(iris$Petal.Length) 
## 
##  Shapiro-Wilk normality test
## 
## data:  iris$Petal.Length
## W = 0.87627, p-value = 7.412e-10
# Shapiro-Wilk normality test for Petal.Width
shapiro.test(iris$Petal.Width) 
## 
##  Shapiro-Wilk normality test
## 
## data:  iris$Petal.Width
## W = 0.90183, p-value = 1.68e-08

从输出结果来看,两个P值都小于显著性水平0.05,这意味着数据的分布与正态分布具有显著差异。换句话说,我们无法假设数据服从正态分布。

方法3:使用 Q-Q 图(分位数-分位数图)可视化检查数据正态性。

Q-Q 图绘制了给定样本与正态分布之间的相关性:

ggqqplot(iris$Petal.Length, ylab = "PL")

# wt
ggqqplot(iris$Petal.Width, ylab = "PW")

全部的散点越接近回归线,表明数据越接近正太分布,反之越偏离正太分布,从图中可以看出,qqplot的结果也支持Petal.Length和Petal.Width的两份数据属于非正太分布。

因此,我们可以得出结论,即:iris的Petal.Length和Petal.Width变量均属于非正太分布,在查看两者变量间的关系时,应该选择kendall或spearman模型。

值得注意的一点:我们从直方图和散点图中都可以观察到两组聚类的数据,为什么数据不是连续的?是什么原因造成的?这种现象一般是需要解释的。

很显然,从我们的原始数据来看,影响Petal.Length和Petal.Width数值大小的因子只有Species。因此,我们不妨尝试对不同的Species分别进行相关性分析和可视化,可以用color = “Species”的方法进行可视化。

ggplot(data = iris, mapping = aes(x = Petal.Length, colour = Species)) +
  geom_histogram(binwidth = 0.1)

ggplot(data = iris, mapping = aes(x = Petal.Length, colour = Species)) +
  geom_freqpoly(binwidth = 0.1)

ggscatter(iris, x = "Petal.Length", y = "Petal.Width", 
          add = "reg.line", conf.int = TRUE, 
          cor.coef = TRUE, cor.method = "kendall",
          xlab = "Petal Length", ylab = "Petal Width",  color =  "Species")

从直方图来看,每个种(Species)的Petal.Length和Petal.Width类似于正太分布的样子,这个时候,我们无法仅用肉眼的方式去判断它们各自是否属于正太分布,这时候,就必须要做Shapiro-Wilk检验和qqplot。

4.7.5 多重共线性

方法1: 相关系数&散点图法

可以通过观察变量之间的相关系数、散点图等方式来初步判断是否存在多重共线性。

library(psych)
pairs.panels(iris[,-5], 
             gap = 0,
             bg = c("#00AFBB", "#E7B800", "#FC4E07")[iris$Species],
             pch=21)

代码解读

iris[,-5]:表示选择iris数据集的除了第5列(Species列)以外的所有列作为要绘制散点图的变量,因为该列为factor,不能参与分析。

gap = 0:表示散点图之间的间隔为0,即各个散点图紧密相连。

bg = c(“#00AFBB”, “#E7B800”, “#FC4E07”)[iris$Species]:根据iris数据集中Species列(不同种),为每个散点指定背景颜色。

pch = 21:表示使用填充的点绘制散点图,点的形状为圆圈。

结果图解读

1)图中下三角矩阵提供散点图,上三角矩阵提供相关系数值。

2)花瓣长度和花瓣宽度高度相关(r=0.97)。同样,花萼长度和花萼宽度(r=0.86)、花萼长度和花瓣长度(r=0.82)也高度相关。这导致了多重共线性问题。

方法2: 方差膨胀因子(VIF)方法
install.packages("car")
library(car)
sepal.model <- lm(Sepal.Length ~ ., data = iris)
vif(sepal.model)
##                   GVIF Df GVIF^(1/(2*Df))
## Sepal.Width   2.227466  1        1.492470
## Petal.Length 23.161648  1        4.812655
## Petal.Width  21.021401  1        4.584910
## Species      40.039177  2        2.515482

结果解读

1)Sepal.Width 的 VIF 值为 2.227466,这表示 Sepal.Width 与其他自变量之间存在一定的共线性,但并未达到严重程度。

2)Petal.Length 的 VIF 值为 23.161648,这表明 Petal.Length 与其他自变量之间存在较高的共线性。VIF 值大于 10 表示存在多重共线性的风险。

3)Petal.Width 的 VIF 值为 21.021401,与 Petal.Length 类似,Petal.Width 也与其他自变量之间存在较高的共线性。

4)Species 的 VIF 值为 40.039177,这表示 Species 自身和其他两个自变量之间存在较强的相关性。VIF 值较高可能说明在此模型中存在较为严重的多重共线性。

需要注意的是,VIF 的阈值值通常为 10(严格是5)。当某个自变量的 VIF 值超过该阈值时,通常被认为存在严重的共线性问题。在这种情况下,可能需要考虑去除具有高 VIF 值的自变量或采取其他方法来解决多重共线性。

sqrt(vif(sepal.model)) > 2
##               GVIF    Df GVIF^(1/(2*Df))
## Sepal.Width  FALSE FALSE           FALSE
## Petal.Length  TRUE FALSE            TRUE
## Petal.Width   TRUE FALSE            TRUE
## Species       TRUE FALSE           FALSE

sqrt(vif(sepal.model)) > 2 是一个逻辑表达式,用于判断在自变量之间是否存在严重的多重共线性问题。

vif(sepal.model) 返回了每个自变量的方差膨胀因子(VIF)值。通过对 VIF 值进行开方(即取平方根),我们可以得到标准化后的 VIF 值。

而 sqrt(vif(sepal.model)) > 2 则是判断每个标准化后的 VIF 值是否大于 2。如果某个自变量的标准化后的 VIF 值大于 2,则表示该自变量与其他自变量之间存在较大的共线性,认为存在多重共线性问题。

基于以上逻辑,在结果中用TURE和FALSE分别表示某变量是否存在共线性问题。

待续

对于变量间有多重共线性问题的数据集,进行模型预测时可能导致错误和不稳定。
处理这些问题的一种方法是基于主成分分析(PCA),那么如何使用PCA解决这一问题,将在《Exploratory data analysis 3st》中介绍。

练习

1)分布提取Species下每个种的所有数据。
2)根据每个种的数据,分别做直方图和散点图,相同连续变量不同种的图合并到一个大图上。
3)根据每个种的数据,分别做Shapiro-Wilk检验和qqplot,相同连续变量不同种的qqplot图合并到一个大图上。
4)利用内置数据集data(“CO2”)做相关性分析的练习。