1 Overview

This dataset contains the measurements of the variables sepal width and length, petal width and length for 50 flowers from 3 species of iris.

Necessary packages:

require(ggplot2)
Loading required package: ggplot2
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 ...
head(iris)

2 Variables

2.1 Sepal.Length

summary(iris$Sepal.Length)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  4.300   5.100   5.800   5.843   6.400   7.900 

Histogram of sepal length

qplot(Sepal.Length, data=iris, geom='histogram', fill=Species, alpha=I(1/2))

2.2 Sepal.Width

summary(iris$Sepal.Width)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.800   3.000   3.057   3.300   4.400 

2.3 Petal.Length

summary(iris$Petal.Length)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.600   4.350   3.758   5.100   6.900 

Histogram of petal length

qplot(Petal.Length, data=iris, geom='histogram')

Estimating a kernel denstiy for the distribution of petal length:

qplot(Petal.Length, data=iris, geom='density')

Separating the petal length histogram on the basis of species:

qplot(Petal.Length, data=iris, geom='histogram', fill=Species, alpha=I(0.5))

Densities on the basis of species

qplot(Petal.Length, data=iris, geom='density', color=Species, fill=Species)

2.4 Petal.Width

summary(iris$Petal.Width)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.100   0.300   1.300   1.199   1.800   2.500 

3 Correlations

3.1 With Species

cor(iris$Sepal.Length, as.numeric(iris$Species), method='spearman')
[1] 0.7980781
cor(iris$Sepal.Width, as.numeric(iris$Species), method='spearman')
[1] -0.4402896
cor(iris$Petal.Length, as.numeric(iris$Species), method='spearman')
[1] 0.9354305
cor(iris$Petal.Length, as.numeric(iris$Species), method='spearman')
[1] 0.9354305

4 Clustering

4.1 K-means

We note that petal length and width are very strongly correlated with species. Are these two numbers enough to correctly predict the species?

Let us prepare a data frame with only these two columns:

iris2 <- iris[, c("Petal.Length", "Petal.Width")]

Let us perform k-means clustering on this data set

num_clusters <- 3
set.seed(1111)
result <- kmeans(iris2, num_clusters, nstart=20)

The k-means algorithm has identified 3 centers:

result$centers
  Petal.Length Petal.Width
1     5.595833    2.037500
2     1.462000    0.246000
3     4.269231    1.342308

The cluster assignments are as follows:

result$cluster
  [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [42] 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 3 3 3 3
 [83] 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1
[124] 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1

Mapping between cluster assignment and original species labels:

table(result$cluster, iris$Species)
   
    setosa versicolor virginica
  1      0          2        46
  2     50          0         0
  3      0         48         4

Only 6 measurements have been misclassified.

qplot(Petal.Width, Petal.Length, data=iris, color=Species)

qplot(Petal.Width, Petal.Length, data=iris, color=factor(result$cluster))

LS0tDQp0aXRsZTogIkV4cGxvcmF0aW9uIG9mIElSSVMgRGF0YXNldCINCmF1dGhvcjogIlNoYWlsZXNoIEt1bWFyIg0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCi0tLQ0KIyBPdmVydmlldw0KDQpUaGlzIGRhdGFzZXQgY29udGFpbnMgdGhlIG1lYXN1cmVtZW50cyBvZiB0aGUgdmFyaWFibGVzIA0Kc2VwYWwgd2lkdGggYW5kIGxlbmd0aCwgcGV0YWwgd2lkdGggYW5kIGxlbmd0aCBmb3IgNTAgZmxvd2Vycw0KZnJvbSAzIHNwZWNpZXMgb2YgaXJpcy4NCg0KTmVjZXNzYXJ5IHBhY2thZ2VzOg0KDQpgYGB7cn0NCnJlcXVpcmUoZ2dwbG90MikNCmBgYA0KDQpgYGB7cn0NCnN0cihpcmlzKQ0KYGBgDQoNCg0KYGBge3J9DQpoZWFkKGlyaXMpDQpgYGANCg0KIyBWYXJpYWJsZXMNCg0KIyMgU2VwYWwuTGVuZ3RoDQoNCmBgYHtyfQ0Kc3VtbWFyeShpcmlzJFNlcGFsLkxlbmd0aCkNCmBgYA0KDQpIaXN0b2dyYW0gb2Ygc2VwYWwgbGVuZ3RoDQpgYGB7cn0NCnFwbG90KFNlcGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBnZW9tPSdoaXN0b2dyYW0nLCBmaWxsPVNwZWNpZXMsIGFscGhhPUkoMS8yKSkNCmBgYA0KDQoNCiMjIFNlcGFsLldpZHRoDQoNCmBgYHtyfQ0Kc3VtbWFyeShpcmlzJFNlcGFsLldpZHRoKQ0KYGBgDQoNCiMjIFBldGFsLkxlbmd0aA0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShpcmlzJFBldGFsLkxlbmd0aCkNCmBgYA0KDQpIaXN0b2dyYW0gb2YgcGV0YWwgbGVuZ3RoDQpgYGB7cn0NCnFwbG90KFBldGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBnZW9tPSdoaXN0b2dyYW0nKQ0KYGBgDQoNCkVzdGltYXRpbmcgYSBrZXJuZWwgZGVuc3RpeSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiBwZXRhbCBsZW5ndGg6DQpgYGB7cn0NCnFwbG90KFBldGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBnZW9tPSdkZW5zaXR5JykNCmBgYA0KDQpTZXBhcmF0aW5nIHRoZSBwZXRhbCBsZW5ndGggaGlzdG9ncmFtIG9uIHRoZSBiYXNpcyBvZiBzcGVjaWVzOg0KDQpgYGB7cn0NCnFwbG90KFBldGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBnZW9tPSdoaXN0b2dyYW0nLCBmaWxsPVNwZWNpZXMsIGFscGhhPUkoMC41KSkNCmBgYA0KDQpEZW5zaXRpZXMgb24gdGhlIGJhc2lzIG9mIHNwZWNpZXMNCmBgYHtyfQ0KcXBsb3QoUGV0YWwuTGVuZ3RoLCBkYXRhPWlyaXMsIGdlb209J2RlbnNpdHknLCBjb2xvcj1TcGVjaWVzLCBmaWxsPVNwZWNpZXMpDQpgYGANCg0KDQojIyBQZXRhbC5XaWR0aA0KDQpgYGB7cn0NCnN1bW1hcnkoaXJpcyRQZXRhbC5XaWR0aCkNCmBgYA0KDQoNCg0KIyBDb3JyZWxhdGlvbnMNCg0KIyMgV2l0aCBTcGVjaWVzDQoNCmBgYHtyfQ0KY29yKGlyaXMkU2VwYWwuTGVuZ3RoLCBhcy5udW1lcmljKGlyaXMkU3BlY2llcyksIG1ldGhvZD0nc3BlYXJtYW4nKQ0KYGBgDQoNCmBgYHtyfQ0KY29yKGlyaXMkU2VwYWwuV2lkdGgsIGFzLm51bWVyaWMoaXJpcyRTcGVjaWVzKSwgbWV0aG9kPSdzcGVhcm1hbicpDQpgYGANCg0KYGBge3J9DQpjb3IoaXJpcyRQZXRhbC5MZW5ndGgsIGFzLm51bWVyaWMoaXJpcyRTcGVjaWVzKSwgbWV0aG9kPSdzcGVhcm1hbicpDQpgYGANCmBgYHtyfQ0KY29yKGlyaXMkUGV0YWwuTGVuZ3RoLCBhcy5udW1lcmljKGlyaXMkU3BlY2llcyksIG1ldGhvZD0nc3BlYXJtYW4nKQ0KYGBgDQoNCg0KIyBDbHVzdGVyaW5nDQoNCiMjIEstbWVhbnMgDQoNCldlIG5vdGUgdGhhdCBwZXRhbCBsZW5ndGggYW5kIHdpZHRoIGFyZSB2ZXJ5IHN0cm9uZ2x5IGNvcnJlbGF0ZWQgd2l0aCBzcGVjaWVzLg0KQXJlIHRoZXNlIHR3byBudW1iZXJzIGVub3VnaCB0byBjb3JyZWN0bHkgcHJlZGljdCB0aGUgc3BlY2llcz8gDQoNCkxldCB1cyBwcmVwYXJlIGEgZGF0YSBmcmFtZSB3aXRoIG9ubHkgdGhlc2UgdHdvIGNvbHVtbnM6DQpgYGB7cn0NCmlyaXMyIDwtIGlyaXNbLCBjKCJQZXRhbC5MZW5ndGgiLCAiUGV0YWwuV2lkdGgiKV0NCmBgYA0KDQpMZXQgdXMgcGVyZm9ybSBrLW1lYW5zIGNsdXN0ZXJpbmcgb24gdGhpcyBkYXRhIHNldA0KYGBge3J9DQpudW1fY2x1c3RlcnMgPC0gMw0Kc2V0LnNlZWQoMTExMSkNCnJlc3VsdCA8LSBrbWVhbnMoaXJpczIsIG51bV9jbHVzdGVycywgbnN0YXJ0PTIwKQ0KYGBgDQoNClRoZSBrLW1lYW5zIGFsZ29yaXRobSBoYXMgaWRlbnRpZmllZCAzIGNlbnRlcnM6DQpgYGB7cn0NCnJlc3VsdCRjZW50ZXJzDQpgYGANCg0KVGhlIGNsdXN0ZXIgYXNzaWdubWVudHMgYXJlIGFzIGZvbGxvd3M6DQpgYGB7cn0NCnJlc3VsdCRjbHVzdGVyDQpgYGANCg0KTWFwcGluZyBiZXR3ZWVuIGNsdXN0ZXIgYXNzaWdubWVudCBhbmQgb3JpZ2luYWwgc3BlY2llcyBsYWJlbHM6DQpgYGB7cn0NCnRhYmxlKHJlc3VsdCRjbHVzdGVyLCBpcmlzJFNwZWNpZXMpDQpgYGANCk9ubHkgNiBtZWFzdXJlbWVudHMgaGF2ZSBiZWVuIG1pc2NsYXNzaWZpZWQuDQoNCmBgYHtyfQ0KcXBsb3QoUGV0YWwuV2lkdGgsIFBldGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBjb2xvcj1TcGVjaWVzKQ0KYGBgDQoNCmBgYHtyfQ0KcXBsb3QoUGV0YWwuV2lkdGgsIFBldGFsLkxlbmd0aCwgZGF0YT1pcmlzLCBjb2xvcj1mYWN0b3IocmVzdWx0JGNsdXN0ZXIpKQ0KYGBg