在網上(http://www.rdatamining.com/ )找到了一個用r語言進行聚類分析的例子, 在整個例子中做了一些中文解釋說明. 資料集用的是iris。
第一步:對資料集進行初步統計分析
檢查資料的次元
> dim(iris)
[1] 150 5
顯示資料集中的列名
> names(iris)
[1] “sepal.length” “sepal.width” “petal.length” “petal.width” “species”
顯示資料集的内部結構
> str(iris)
‘data.frame': 150 obs. of 5 variables:
$ sepal.length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 …
$ sepal.width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 …
$ petal.length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 …
$ petal.width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 …
$ species : factor w/ 3 levels “setosa”,”versicolor”,..: 1 1 1 1 1 1 1 1 1 1 …
顯示資料集的屬性
> attributes(iris)
$names –就是資料集的列名
$row.names –個人了解就是每行資料的标号
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[21] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
[41] 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
[61] 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
[81] 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
[101] 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
[121] 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
[141] 141 142 143 144 145 146 147 148 149 150
$class –表示類别
[1] “data.frame”
檢視資料集的前五項資料情況
> iris[1:5,]
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
檢視資料集中屬性sepal.length前10行資料
> iris[1:10, "sepal.length"]
[1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
同上
> iris$sepal.length[1:10]
顯示資料集中每個變量的分布情況
> summary(iris)
sepal.length sepal.width petal.length petal.width species
min. :4.300 min. :2.000 min. :1.000 min. :0.100 setosa :50
1st qu.:5.100 1st qu.:2.800 1st qu.:1.600 1st qu.:0.300 versicolor:50
median :5.800 median :3.000 median :4.350 median :1.300 virginica :50
mean :5.843 mean :3.057 mean :3.758 mean :1.199
3rd qu.:6.400 3rd qu.:3.300 3rd qu.:5.100 3rd qu.:1.800
max. :7.900 max. :4.400 max. :6.900 max. :2.500
顯示iris資料集列species中各個值出現頻次
> table(iris$species)
setosa versicolor virginica
50 50 50
根據列species畫出餅圖
> pie(table(iris$species))
算出列sepal.length的所有值的方差
> var(iris$sepal.length)
[1] 0.6856935
算出列iris$sepal.length和iris$petal.length的協方差
> cov(iris$sepal.length, iris$petal.length)
[1] 1.274315
算出列iris$sepal.length和iris$petal.length的相關系數, 從結果看這兩個值是強相關。
> cor(iris$sepal.length, iris$petal.length)
[1] 0.8717538
畫出列iris$sepal.length分布柱狀圖
> hist(iris$sepal.length)
畫出列iris$sepal.length的密度函數圖
> plot(density(iris$sepal.length))
畫出列iris$sepal.length和iris$sepal.width的散點圖
> plot(iris$sepal.length, iris$sepal.width)
繪出矩陣各列的散布圖
> plot(iris)
or
> pairs(iris)
第二步:使用knn包進行kmean聚類分析
将資料集進行備份,将列newiris$species置為空,将此資料集作為測試資料集
> newiris <- iris
> newiris$species <- null
在資料集newiris上運作kmean聚類分析, 将聚類結果儲存在kc中。在kmean函數中,将需要生成聚類數設定為3
> (kc <- kmeans(newiris, 3))
k-means clustering with 3 clusters of sizes 38, 50, 62: k-means算法産生了3個聚類,大小分别為38,50,62.
cluster means: 每個聚類中各個列值生成的最終平均值
sepal.length sepal.width petal.length petal.width
1 5.006000 3.428000 1.462000 0.246000
2 5.901613 2.748387 4.393548 1.433871
3 6.850000 3.073684 5.742105 2.071053
clustering vector: 每行記錄所屬的聚類(2代表屬于第二個聚類,1代表屬于第一個聚類,3代表屬于第三個聚類)
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[37] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[73] 2 2 2 2 2 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 3 3 3 3 2 3
[109] 3 3 3 3 3 2 2 3 3 3 3 2 3 2 3 2 3 3 2 2 3 3 3 3 3 2 3 3 3 3 2 3 3 3 2 3
[145] 3 3 2 3 3 2
within cluster sum of squares by cluster: 每個聚類内部的距離平方和
[1] 15.15100 39.82097 23.87947
(between_ss / total_ss = 88.4 %) 組間的距離平方和占了整體距離平方和的的88.4%,也就是說各個聚類間的距離做到了最大
available components: 運作kmeans函數傳回的對象所包含的各個組成部分
[1] “cluster” “centers” “totss” “withinss”
[5] “tot.withinss” “betweenss” “size”
(“cluster”是一個整數向量,用于表示記錄所屬的聚類
“centers”是一個矩陣,表示每聚類中各個變量的中心點
“totss”表示所生成聚類的總體距離平方和
“withinss”表示各個聚類組内的距離平方和
“tot.withinss”表示聚類組内的距離平方和總量
“betweenss”表示聚類組間的聚類平方和總量
“size”表示每個聚類組中成員的數量)
建立一個連續表,在三個聚類中分别統計各種花出現的次數
> table(iris$species, kc$cluster)
1 2 3
setosa 0 50 0
versicolor 2 0 48
virginica 36 0 14
根據最後的聚類結果畫出散點圖,資料為結果集中的列”sepal.length”和”sepal.width”,顔色為用1,2,3表示的預設顔色
> plot(newiris[c("sepal.length", "sepal.width")], col = kc$cluster)
在圖上标出每個聚類的中心點
〉points(kc$centers[,c("sepal.length", "sepal.width")], col = 1:3, pch = 8, cex=2)