一、操作说明:
根据第一题我们在这里使用Class10中的sheet6“成绩详情”,讨论一下不同成绩之间的关系。我们首先对数据进行处理,去掉SID,五级制等级,综合成绩和证书发放四个列,这里用到了数据集成。剩下的有五个列,我们不用全部讨论,我们使用数据规约,进行主成分分析,对进行分析后的列再次处理。最后先进行k-means聚类分析,在进行根据距离函数进行的聚类分析,得到最终结果。
二、代码
# 加载所需的包略
data=read.xlsx("F:\\数据包\\Class10.xlsx",6)
#删除不需要的列
data <-data[ , !names(data) %in% c("SID","综合成绩","五级制等级(ABCDE)","证书发放")]
data=as.data.frame(lapply(data,as.numeric))#将字符串转换为数字
PCA = princomp(data,cor = TRUE)#进行主成分分析
names(PCA) #查看输出项
(PCA$sdev)^2 #主成分特征根
PCA$loadings #主成分载荷
PCA$scores #主成分得分
summary(PCA) #主成分贡献率
data=data[,-4]#去掉次要成分列
data=data[,-4]
df <- scale(data)#标准化
#判断需要分为几个聚类
fviz_nbclust(data, kmeans, method = "wss") + geom_vline(xintercept = 5, linetype = 2)
#聚类结果
km_result <- kmeans(data, 5, nstart = 24)
print(km_result)
#先求样本之间两两相似性
result <- dist(data, method = "euclidean")
#产生层次结构
result_hc <- hclust(d = result, method = "ward.D2")
#进行初步展示
fviz_dend(result_hc, k = 5,
cex = 0.5,
k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07","#229BDF"),
color_labels_by_k = TRUE,
rect = TRUE
)
#距离函数求各行之间的距离:
#欧氏距离
dist(data,p=2)
#曼哈顿距离
dist(data,"manhattan")
#切比雪夫距离
dist(data,"maximum")
#闵可夫斯基距离
dist(data,"minkowski")
#蓝氏距离
dist(data,"canberra")
#相关系数表示距离
1-cor(t(data))
#利用各种距离进行聚类
#欧氏距离
dist(data,p=2)
out.dist=dist(data,method="euclidean")
out.hclust=hclust(out.dist,method="complete")
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
#曼哈顿距离
dist(data,"manhattan")
out.dist=dist(data,method="manhattan")
out.hclust=hclust(out.dist,method="complete")
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
#切比雪夫距离
dist(data,"maximum")
out.dist=dist(data,method="maximum")
out.hclust=hclust(out.dist,method="complete")
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
#闵可夫斯基距离
dist(data,"minkowski")
out.dist=dist(data,method="minkowski")
out.hclust=hclust(out.dist,method="complete")
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
#蓝氏距离
out.dist=dist(data,method="canberra")
out.hclust=hclust(out.dist,method="complete")
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
三、程序截图与分析
① 首先载入数据进行数据集成,删除不需要的列,再进行主成分分析删除次要成分。
相关代码分析:
data=read.xlsx(“F:\数据包\Class10.xlsx”,6)
data <-data[ , !names(data) %in% c(“SID”,“综合成绩”,“五级制等级(ABCDE)”,“证书发放”)]
PCA = princomp(data,cor = TRUE)
names(PCA)
(PCA
s
d
e
v
)
2
P
C
A
sdev)^2 PCA
sdev)2PCAloadings
PCA$scores
summary(PCA)
得到数据如图:
由图可知:当有三个主成分时,数据的利用率达到了85.5%,基本符合我们的需要。所以我们只要保留三个主成分就可以了。
去掉次要成分列
data=data[,-4]
data=data[,-4]
② 接下来进行聚类分析,有原数据我们可以了解我们的数据应该是可以分为5个聚类的(参考“五级制等级”),不过我们仍然需要再次根据数据进行判断,首先将数据进行标准化,利用fviz_nbclust函数进行判断。得出聚类个数,最后显示出聚类的层次结构,我们首先用“k-means,层次聚类”进行展示。、
相关代码分析:
data=as.data.frame(lapply(data,as.numeric))#将字符串转换为数字
df <- scale(data)#标准化
#判断需要分为几个聚类
fviz_nbclust(data, kmeans, method = “wss”) + geom_vline(xintercept = 5, linetype = 2)
如图:
容易得出当数值为5 的时候曲线变得平缓,所以应该分为五个聚类。
#聚类结果
km_result <- kmeans(data, 5, nstart = 24)
print(km_result)
聚类结果:
#先求样本之间两两相似性
result <- dist(data, method = “euclidean”)
#产生层次结构
result_hc <- hclust(d = result, method = “ward.D2”)
#进行初步展示
fviz_dend(result_hc, k = 5,
cex = 0.5,
k_colors = c("#2E9FDF", “#00AFBB”, “#E7B800”, “#FC4E07”,"#229BDF"),
color_labels_by_k = TRUE,
rect = TRUE
)
层次结构:
③ 根据距离函数求各行之间的距离:
欧氏距离 dist(data,p=2)
#曼哈顿距离 dist(data,“manhattan”)
切比雪夫距离 dist(data,“maximum”)
闵可夫斯基距离 dist(data,“minkowski”)
蓝氏距离 dist(data,“canberra”)
相关系数表示距离 1-cor(t(data))
上面的截图都是简单数据我们这里只截取欧氏距离作为例子:
欧氏距离数据:
利用上述各种距离进行聚类,默认以最远距离进行聚类。
欧氏距离
out.dist=dist(data,method=“euclidean”)
out.hclust=hclust(out.dist,method=“complete”)
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
结果如图:
曼哈顿距离
out.dist=dist(data,method=“manhattan”)
out.hclust=hclust(out.dist,method=“complete”)
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
结果如图:
切比雪夫距离
dist(data,“maximum”)
out.dist=dist(data,method=“maximum”)
out.hclust=hclust(out.dist,method=“complete”)
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
结果如图:
闵可夫斯基距离
out.dist=dist(data,method=“minkowski”)
out.hclust=hclust(out.dist,method=“complete”)
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
结果如图:
蓝氏距离
out.dist=dist(data,method=“canberra”)
out.hclust=hclust(out.dist,method=“complete”)
plclust(out.hclust)
rect.hclust(out.hclust, k=5)
结果如图:
四、结果分析:
1、与原数据相似,根据数据计算后我们还是分成了5个聚类。
2、对于不同的距离函数,聚类结果不同。
3、对于曼哈顿距离进行距离,与我们使用k-means相似,存在极大可能我使用的k-means方法利用的也是曼哈顿距离。
4、相对于其他距离蓝氏距离更符合我们的需要,与原数据的分类相似。