4.1-k值聚类

options(repos = c(CRAN = "https://cloud.r-project.org/"))
setwd("D:/桌面/多元统计分析数据data") #设定工作路径
ex4.1<-read.csv("ex4.1.csv",header=T) #将ex4.1.csv数据读入
d4.1=ex4.1[,-1]#去掉第1列指标名称,数据集取名为d4.1
d4.1[is.na(d4.1)] <- sapply(d4.1, function(x) mean(x, na.rm = TRUE))
rownames(d4.1)=ex4.1[,1]#用ex4.1的第一列为d4.1的行重新命名
KM<-kmeans(d4.1, 4, nstart=20,algorithm="Hartigan-Wong")#聚类的个数为4#初始随机集合的个数为20,算法为"Hartigan-Wong"(默认)
sort(KM$cluster) 
##     Budweiser     Ionenbrau      Heineken Old-milnaukee Strchs-bohemi 
##             1             1             1             1             1 
##         Coors Michelos-lich         Secrs        Kkirin         Hamms 
##             1             1             1             1             1 
## Heilemans-old                     Schlitz   Kronensourc    Aucsberger 
##             1             1             2             2             2 
##  Pabst-extral  Olympia-gold   Miller-lite Sudeiser-lich    Coorslicht 
##             3             3             4             4             4 
## Schlite-light 
##             4
KM<-kmeans(d4.1, 5, nstart=15); sort(KM$cluster) #聚类的个数 k=5
##       Schlitz   Kronensourc    Aucsberger     Ionenbrau      Heineken 
##             1             1             1             2             2 
##         Secrs        Kkirin     Budweiser Old-milnaukee Strchs-bohemi 
##             2             2             3             3             3 
##         Coors Michelos-lich         Hamms Heilemans-old               
##             3             3             3             3             3 
##  Pabst-extral  Olympia-gold   Miller-lite Sudeiser-lich    Coorslicht 
##             4             4             5             5             5 
## Schlite-light 
##             5

分析比较:稳定聚类的品牌:两种情形下,Schlitz, Kronensourc,Aucsberger都聚为一类;Pabst-extral, Olympia-gold也都聚为一类;只是在其余地区的分类上有一定变化,即k=4时的第4类中有4个地区划分出来单独聚为k=5时的第5类.

4.1-最小距离法

install.packages("Cairo")
## 将程序包安装入'C:/Users/33880/AppData/Local/R/win-library/4.4'
## (因为'lib'没有被指定)
## 程序包'Cairo'打开成功,MD5和检查也通过
## Warning: 无法删除软件包 'Cairo' 的先前安装
## Warning in file.copy(savedcopy, lib, recursive = TRUE):
## 拷贝C:\Users\33880\AppData\Local\R\win-library\4.4\00LOCK\Cairo\libs\x64\Cairo.dll到C:\Users\33880\AppData\Local\R\win-library\4.4\Cairo\libs\x64\Cairo.dll时出了问题:Permission
## denied
## Warning: 回复了'Cairo'
## 
## 下载的二进制程序包在
##  C:\Users\33880\AppData\Local\Temp\RtmpOipmfa\downloaded_packages里
library(Cairo)
setwd("D:/桌面/多元统计分析数据data") # 设定工作路径
d4.1 <- read.csv("ex4.1.csv", header=T) # 将ex4.1.csv数据读入到d4.1中

# 检查数据中是否有NA值
sum(is.na(d4.1))
## [1] 4
# 如果有NA值,可以选择删除这些行
d4.1 <- na.omit(d4.1)

# 检查每列是否包含NaN值
nan_counts <- sapply(d4.1, function(x) sum(is.nan(x)))
if (any(nan_counts > 0)) {
  # 如果有NaN值,可以选择删除这些行或用其他值填充
  d4.1 <- d4.1[!rowSums(sapply(d4.1, function(x) is.nan(x))), ]
}

# 检查每列是否包含Inf值
inf_counts <- sapply(d4.1, function(x) sum(is.infinite(x)))
if (any(inf_counts > 0)) {
  # 如果有Inf值,可以选择删除这些行或用其他值填充
  d4.1 <- d4.1[!rowSums(sapply(d4.1, function(x) is.infinite(x))), ]
}

# 重新计算距离矩阵
d <- dist(d4.1, method="euclidean", diag=TRUE, upper=FALSE)
## Warning in dist(d4.1, method = "euclidean", diag = TRUE, upper = FALSE):
## 强制改变过程中产生了NA
HC <- hclust(d, method="single")
plot(HC, hang=-1) 

# 用红色矩形框出3个分类
rect.hclust(HC, k=3, border="red")

### 在这张树状图中,数据点在较低的高度就被合并,这表明使用最小距离法时,数据点之间的相似性较高,或者数据点之间的差异较小。树状图的高度轴显示了聚类之间的距离,这里的范围是0到20。较低的合并高度表明聚类之间的差异较小,这可能意味着数据集中的个体在特征空间中相对接近。这种聚类结果可能适合于那些需要识别紧密相关小组的场景。

4.5-K-means聚类

setwd("D:/桌面/多元统计分析数据data") #设定工作路径
ex4.5<-read.csv("ex4.5.csv", header=T) #将ex4.5.csv数据读入到d4.1中
d4.5=ex4.5[,-1] #ex4.5的第一列为地名,不是数值先去掉
rownames(d4.5)=ex4.5[,1] #用ex4.2的第一列为d4.2的行重新命名
KM<-kmeans(d4.5, 4, nstart=20, algorithm="Hartigan-Wong") #聚类的个数为4#初始随机集合的个数为20, 算法为"Hartigan-Wong"(默认)
sort(KM$cluster) #对分类结果进行排序并查看
##   河北   山西 内蒙古   吉林 黑龙江   安徽   江西   贵州   云南   陕西   甘肃 
##      1      1      1      1      1      1      1      1      1      1      1 
##   青海   宁夏   新疆   北京   上海   天津   浙江   福建   广东   海南   辽宁 
##      1      1      1      2      2      3      3      3      3      3      4 
##   江苏   山东   河南   湖北   湖南   广西   重庆   四川 
##      4      4      4      4      4      4      4      4
KM<-kmeans(d4.5, 5, nstart=15);sort(KM$cluster) #聚类的个数 k=5
##   天津   浙江   福建   海南   北京   上海   辽宁   江苏   山东   河南   湖北 
##      1      1      1      1      2      2      3      3      3      3      3 
##   湖南   广西   重庆   四川   河北   山西 内蒙古   吉林 黑龙江   安徽   江西 
##      3      3      3      3      4      4      4      4      4      4      4 
##   贵州   云南   陕西   甘肃   青海   宁夏   新疆   广东 
##      4      4      4      4      4      4      4      5

在k=4中第一类的天津、浙江、福建被并入第三类;剩余第一类的广东、海南被并入第四类。其余省份未发现明显变化。这些地区的房地产市场特征在不同的聚类数目下有所变化。不同的聚类数目可以为决策提供不同的视角。k=4可能更适合于寻找较大的市场细分,而k=5可能更适合于识别更具体的市场特征。

附加题

install.packages("ggplot2")
## 将程序包安装入'C:/Users/33880/AppData/Local/R/win-library/4.4'
## (因为'lib'没有被指定)
## 程序包'ggplot2'打开成功,MD5和检查也通过
## 
## 下载的二进制程序包在
##  C:\Users\33880\AppData\Local\Temp\RtmpOipmfa\downloaded_packages里
install.packages("ggfortify")
## 将程序包安装入'C:/Users/33880/AppData/Local/R/win-library/4.4'
## (因为'lib'没有被指定)
## 程序包'ggfortify'打开成功,MD5和检查也通过
## 
## 下载的二进制程序包在
##  C:\Users\33880\AppData\Local\Temp\RtmpOipmfa\downloaded_packages里
install.packages("cluster")
## 将程序包安装入'C:/Users/33880/AppData/Local/R/win-library/4.4'
## (因为'lib'没有被指定)
## 
##   有二进制版本,但源代码版本更新:
##         binary source needs_compilation
## cluster  2.1.6  2.1.7              TRUE
## 
##   Binaries will be installed
## 程序包'cluster'打开成功,MD5和检查也通过
## Warning: 无法删除软件包 'cluster' 的先前安装
## Warning in file.copy(savedcopy, lib, recursive = TRUE):
## 拷贝C:\Users\33880\AppData\Local\R\win-library\4.4\00LOCK\cluster\libs\x64\cluster.dll到C:\Users\33880\AppData\Local\R\win-library\4.4\cluster\libs\x64\cluster.dll时出了问题:Permission
## denied
## Warning: 回复了'cluster'
## 
## 下载的二进制程序包在
##  C:\Users\33880\AppData\Local\Temp\RtmpOipmfa\downloaded_packages里
#加载安装包
library(ggplot2)
library(ggfortify)
library(cluster)
head(iris)# 聚类分析的可视化
##   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
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
#k-means聚类
autoplot(kmeans(USArrests, 3), data = USArrests, label = TRUE, label.size = 3)

library(cluster)
autoplot(pam(iris[-5], 3), frame = TRUE, frame.type = 'norm')