审稿人:你才三个变量有必要做PCA吗?

文摘   2024-10-10 09:01   爱尔兰  

在数据科学的世界里,主成分分析(Principal Component Analysis, PCA)是一项强大的工具,广泛应用于数据降维、特征提取和模式识别。无论你是数据分析新手还是资深专家,掌握PCA都能显著提升你的数据处理能力。今天,我们将通过R语言,使用内置的iris数据集,详细讲解如何进行PCA分析,并生成高质量的可视化图表。

三个变量能不能做PCA?

虽然PCA通常用于高维数据分析,但即使在仅有三个变量的情况下,进行PCA分析仍然是有意义的。通过PCA,可以识别这三个变量之间的主要变异方向和潜在的线性关系,有助于简化数据结构和揭示数据的潜在模式。然而,在进行PCA时需要注意以下几点:

  1. 相关性检查:确保三个变量之间存在一定的相关性,只有在相关性较强时,PCA的效果才会显著。

  2. 标准化处理:由于PCA对变量的尺度敏感,确保在进行分析前对数据进行标准化处理,使得每个变量的均值为0,标准差为1。

  3. 解释主成分:在只有三个变量的情况下,通常只有一个或两个主成分能解释大部分变异,因此解释主成分的意义需要结合领域知识,以便更好地理解数据的结构。

  4. 可视化结果:使用得分图和双标图等可视化工具,帮助更直观地理解分析结果,确保数据分析的结果易于解释和展示。

总之,即使只有三个变量,PCA依然可以提供有价值的见解,但在应用时需谨慎考虑上述注意事项,以确保分析结果的可靠性和有效性。

接下来,我们将一步步深入PCA的实际操作,帮助你全面理解并应用这一技术。

步骤一:检查相关性

PCA的核心在于发现数据中的主要变异方向,而这些方向往往与变量之间的相关性密切相关。因此,第一步是检查变量之间的相关性,判断是否适合进行PCA分析。

# 加载必要的库
library(ggplot2)
library(GGally)
library(corrplot)

# 使用内置的iris数据集
data(iris)

# 选择前三个数值变量
iris_pca_data <- iris[, 1:3]

# 计算相关性矩阵
cor_matrix <- cor(iris_pca_data)

# 打印相关性矩阵
print(cor_matrix)

## Sepal.Length Sepal.Width Petal.Length
## Sepal.Length 1.0000000 -0.1175698 0.8717538
## Sepal.Width -0.1175698 1.0000000 -0.4284401
## Petal.Length 0.8717538 -0.4284401 1.0000000

# 可视化相关性矩阵
corrplot(cor_matrix, method = "color", addCoef.col = "black",
tl.col = "black", tl.srt = 45, title = "相关性矩阵",
mar = c(0,0,1,0))

从相关性矩阵中,我们可以观察到变量之间是否存在较强的相关性,这将决定是否适合进行PCA分析。

步骤二:标准化数据

PCA对变量的尺度敏感,因此在进行PCA之前,需要对数据进行标准化处理,确保每个变量在相同的尺度上进行分析。

# 标准化数据
iris_scaled <- scale(iris_pca_data)

# 检查标准化后的数据
head(iris_scaled)

## Sepal.Length Sepal.Width Petal.Length
## [1,] -0.8976739 1.01560199 -1.335752
## [2,] -1.1392005 -0.13153881 -1.335752
## [3,] -1.3807271 0.32731751 -1.392399
## [4,] -1.5014904 0.09788935 -1.279104
## [5,] -1.0184372 1.24503015 -1.335752
## [6,] -0.5353840 1.93331463 -1.165809

步骤三:选择主成分数量

确定保留多少主成分是PCA分析中的关键步骤。我们可以通过查看方差解释比例和绘制碎石图(Scree Plot)来做出决策。

# 进行PCA分析
pca_result <- prcomp(iris_scaled, center = TRUE, scale. = TRUE)

# 查看PCA结果摘要
summary(pca_result)

## Importance of components:
## PC1 PC2 PC3
## Standard deviation 1.4218 0.9526 0.26671
## Proportion of Variance 0.6738 0.3025 0.02371
## Cumulative Proportion 0.6738 0.9763 1.00000

# 提取方差比例
var_explained <- pca_result$sdev^2 / sum(pca_result$sdev^2)

# 绘制碎石图
library(ggplot2)

# 创建数据框用于绘图
scree_data <- data.frame(
Principal_Component = paste0("PC", 1:length(var_explained)),
Variance_Explained = var_explained,
Cumulative_Variance = cumsum(var_explained)
)

# 绘制碎石图
ggplot(scree_data, aes(x = Principal_Component, y = Variance_Explained)) +
geom_bar(stat = "identity", fill = "steelblue") +
geom_line(aes(y = Cumulative_Variance), group = 1, color = "red", size = 1) +
geom_point(aes(y = Cumulative_Variance), color = "red", size = 2) +
scale_y_continuous(labels = scales::percent_format()) +
labs(title = "碎石图",
y = "解释方差比例",
x = "主成分") +
theme_minimal()

从碎石图中,我们可以看到前两个主成分已经解释了大部分的方差,通常情况下,保留前两个主成分已经足够。

步骤四:解释主成分

理解每个主成分的含义,有助于我们更好地解释数据中的主要变化方向。

# 查看主成分载荷
pca_loadings <- pca_result$rotation
print(pca_loadings)

## PC1 PC2 PC3
## Sepal.Length 0.6290662 -0.43339843 -0.6453228
## Sepal.Width -0.3611443 -0.89806788 0.2510953
## Petal.Length 0.6883680 -0.07509912 0.7214636

# 可视化主成分载荷
library(reshape2)

# 转换数据格式
loadings_melt <- melt(pca_loadings)

# 绘制热图
ggplot(loadings_melt, aes(Var2, Var1, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "blue", high = "red", mid = "white",
midpoint = 0, limit = c(min(loadings_melt$value), max(loadings_melt$value)),
name="载荷") +
theme_minimal() +
labs(title = "PCA载荷热图",
x = "主成分",
y = "变量") +
theme(axis.text.x = element_text(angle = 45, vjust = 1,
size = 12, hjust = 1))

通过热图,我们可以识别哪些变量在各主成分中起主要作用,从而理解主成分所代表的含义。

步骤五:可视化

高质量的可视化图表不仅能帮助我们更好地理解数据,还能在报告和演示中直观展示分析结果。我们将生成两种常见的PCA可视化图表:得分图和双标图(Biplot)。

5.1 得分图

得分图展示了样本在前两个主成分上的分布,常用于观察样本间的聚类和分离情况。

# 提取得分
scores <- as.data.frame(pca_result$x)

# 添加物种信息
scores$Species <- iris$Species

# 绘制得分图
ggplot(scores, aes(x = PC1, y = PC2, color = Species)) +
geom_point(size = 3, alpha = 0.8) +
labs(title = "PCA得分图",
x = "主成分1",
y = "主成分2") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) +
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

5.2 双标图(Biplot)

双标图结合了得分和载荷信息,展示了样本和变量在同一图中的关系,是理解PCA结果的强大工具。

# 绘制双标图
library(ggrepel)

# 获取载荷
loadings <- pca_result$rotation[, 1:2]

# 乘以一个常数以调整箭头长度
loadings_scaled <- loadings * max(abs(scores$PC1), abs(scores$PC2)) * 0.7

# 创建数据框
loadings_df <- as.data.frame(loadings_scaled)
loadings_df$Variable <- rownames(loadings_df)

# 绘制双标图
ggplot(scores, aes(x = PC1, y = PC2, color = Species)) +
geom_point(size = 3, alpha = 0.8) +
geom_segment(data = loadings_df, aes(x = 0, y = 0, xend = PC1, yend = PC2),
arrow = arrow(length = unit(0.3, "cm")), color = "gray50") +
geom_text_repel(data = loadings_df, aes(x = PC1, y = PC2, label = Variable),
size = 5, color = "black") +
labs(title = "PCA双标图",
x = "主成分1",
y = "主成分2") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5)) +
scale_color_manual(values = c("#00AFBB", "#E7B800", "#FC4E07"))

总结

通过今天的更新,你已经掌握了在R语言中进行PCA分析的完整流程。从检查变量相关性、标准化数据,到选择合适的主成分数量、解释主成分,再到生成高质量的可视化图表,每一步都至关重要。PCA不仅帮助你降维,还能揭示数据中的潜在结构和模式,为后续的机器学习建模和数据分析奠定坚实基础。


(请点击标题查看)

科研代码 | 机器学习

ANOVA 描述性统计分析   主成分分析PCA 判别分析 PLSDA LDA KNN 

异常值 贝叶斯统计 调用数据集 模型评价之准确率 Scikit-learn 数据预处理 API 

无监督机器学习 SVM 监督式机器学习  特征选择 ANN SQL 数据转换  特征选择  冗余分析  数据导入   限制性立方样条时间序列分析 数据预处理  随机森林(RF)  

正态分布检测 傅里叶变换 重塑(Reshape)

科研代码 | 数据可视化

散点图  相关性热    柱状图    盒须图 小提琴图 R画地图 ggplot2 雷达 圆形柱状图 

文氏图 显著性差异 条形图 R配色 热图显著性标记 箱线图  XGBoost建模  3D散点图 

图片合并  桑葚图  坐标轴文字排序          

科研代码 | 生产力工具

Pycharm    Rstudio   Dataspell  VScode 四大数据分析软  Copilot R语言教材  基础统计学  R语言入门  SPSS Python编辑器全比较   大名鼎鼎的文献管理软件

科研代码 | 世间万物

Peer pressure  走出舒适区  小老板保命守则 缺的是数据科学家 卷王之王 开放获取   

创新性  不能“卷”的海外博士  英语不好 放弃统计显著性  

谁在用盗版软件 读博心态别崩

感谢关注!

科研代码
专注R和Python的数据分析。
 最新文章