R语言实现PCA
- 一次来自男神MR.来的作业
- PCA
- 读取数据
- PCA主体部分
- 输出PCA的主要结果,列出主成分分析分析结果
- 利用碎石图来展示PCA结果
- 对component进行一些解释
- 简略分析
- 利用PCA结果来进行一个排序
- 下面进行聚类分析
一次来自男神MR.来的作业
PCA
读取数据
#读取数据,数据名称为“PCA上机数据”,且对数据进行整理
setwd("/Users/auzzer_pang")
data_PCA = read.table("PCA上机数据.txt")
data = data_PCA[,1:7]
names(data) =
c('100','200','400','800','1500','3000','Marathon')
row.names(data) = data_PCA[,8]
PCA主体部分
#由于单位不同所以先对数据标准化
cor(data)
#利用princomp函数进行主成分分析
PCA=princomp(data, cor=T)
#cor = T这个选项可以帮助我们吧矩阵变为协方差阵
summary(PCA, loadings=T)
输出PCA的主要结果,列出主成分分析分析结果
利用碎石图来展示PCA结果
接下来我们利用碎石图来客观表现我们的主成分分析结果
screeplot (PCA, type="lines")
# 画碎石图,用直线图类型
abline (v = 2 , col = "#900021",lwd = 2,lty = 2)
#添加划分成分的参考线
结果为
对component进行一些解释
一个比较粗略的分析
其中我们可以看到的是第一第二主成分的累积方差贡献率已经高达93%,绘制碎石图也验证了我们的想法。所以我们选取前两个主成分,而loadings部分则向我们揭示了这两个主成分的意义:
首先我们定义100m,200m,400m,800,1500m,3000m,Marathon项目分别为:
x1,x2,x3,x4,x5,x6,x7
则第一主成分
y1= 0.368x1+0.365x2+0.382x3+0.385x4+0.389x5+0.389x6+0.367x7
第二主成分
y2=0.49x1+0.537x2+0.247x3-0.155x4-0.36x5-0.348x6-0.369x7
结合实际情况看主成分1基本上保留了每个项目的信息,且每个信息的变化不大,可以认定为主成分1衡量了一个国家的综合实力水平,而主成分2除了100m、200m、400m项目系数为正以外,其他系数为负,结合实际情况,主成分2在强调径赛中的短跑项目,同时削弱长跑项目带来的影响。
#由上文所述的结果,我们可以选取前两个主成分,接下来我们计算前两个主成分的得分
PCA$scores[,1:2]# 计算前两个主成分得分
结果为
load=loadings(PCA) #提取主成分载荷矩阵,以解释主成分的含义
plot(pr[,1:2],) #作散点图
#利用text()函数为每个点加上名称,但本题由于名称产生重叠就不添加了
abline(h=0); abline(v=0) #划分象限
结果为
简略分析
接下来要用上面的结果来做一点分析,其中包括粗略的聚类分析
利用PCA结果来进行一个排序
#利用预测结果来排序以及聚类分析
pr = round(predict(PCA),3)
pr = pr[,1:2]
#按第一主成分排序
pr[order(pr[,1]),]
下面进行聚类分析
#为了让结果更好看实用factoextra来进行聚类分析
library(factoextra)
#由于数据以及标准化,故只需直接导入
df = pr
#先求样本之间两两相似性
result = dist(df, method = "euclidean")
#产生层次结构
result_hc = hclust(d = result, method = "ward.D2")
#作图
fviz_dend(result_hc, k = 2, cex = 0.5, k_colors = c("#900021", "#002FA7"),color_labels_by_k = TRUE, rect = TRUE
)