天天看點

一個用R語言進行聚類分析的例子

在網上(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)

繼續閱讀