#Ejercicio 1. Modelos supervisados. Análisis de regresión múltiple A partir del conjunto de datos swiss del paquete datasets, calculad la matriz de correlación y, a partir de esta, realizad un análisis de regresión múltiple. Razonad los resultados.
#Cargamos los datos
library(datasets)
data("swiss")
head(swiss)
## Fertility Agriculture Examination Education Catholic
## Courtelary 80.2 17.0 15 12 9.96
## Delemont 83.1 45.1 6 9 84.84
## Franches-Mnt 92.5 39.7 5 5 93.40
## Moutier 85.8 36.5 12 7 33.77
## Neuveville 76.9 43.5 17 15 5.16
## Porrentruy 76.1 35.3 9 7 90.57
## Infant.Mortality
## Courtelary 22.2
## Delemont 22.2
## Franches-Mnt 20.2
## Moutier 20.3
## Neuveville 20.6
## Porrentruy 26.6
summary(swiss)
## Fertility Agriculture Examination Education
## Min. :35.00 Min. : 1.20 Min. : 3.00 Min. : 1.00
## 1st Qu.:64.70 1st Qu.:35.90 1st Qu.:12.00 1st Qu.: 6.00
## Median :70.40 Median :54.10 Median :16.00 Median : 8.00
## Mean :70.14 Mean :50.66 Mean :16.49 Mean :10.98
## 3rd Qu.:78.45 3rd Qu.:67.65 3rd Qu.:22.00 3rd Qu.:12.00
## Max. :92.50 Max. :89.70 Max. :37.00 Max. :53.00
## Catholic Infant.Mortality
## Min. : 2.150 Min. :10.80
## 1st Qu.: 5.195 1st Qu.:18.15
## Median : 15.140 Median :20.00
## Mean : 41.144 Mean :19.94
## 3rd Qu.: 93.125 3rd Qu.:21.70
## Max. :100.000 Max. :26.60
#Realizamos la matriz de correlación
cor(x=swiss, method="pearson")
## Fertility Agriculture Examination Education Catholic
## Fertility 1.0000000 0.35307918 -0.6458827 -0.66378886 0.4636847
## Agriculture 0.3530792 1.00000000 -0.6865422 -0.63952252 0.4010951
## Examination -0.6458827 -0.68654221 1.0000000 0.69841530 -0.5727418
## Education -0.6637889 -0.63952252 0.6984153 1.00000000 -0.1538589
## Catholic 0.4636847 0.40109505 -0.5727418 -0.15385892 1.0000000
## Infant.Mortality 0.4165560 -0.06085861 -0.1140216 -0.09932185 0.1754959
## Infant.Mortality
## Fertility 0.41655603
## Agriculture -0.06085861
## Examination -0.11402160
## Education -0.09932185
## Catholic 0.17549591
## Infant.Mortality 1.00000000
#Generamos el modelo de regresión múltiple
mrm_swiss<-lm(swiss$Fertility~swiss$Agriculture+swiss$Examination+swiss$Education+swiss$Catholic+swiss$Infant.Mortality, data=swiss)
summary(mrm_swiss)
##
## Call:
## lm(formula = swiss$Fertility ~ swiss$Agriculture + swiss$Examination +
## swiss$Education + swiss$Catholic + swiss$Infant.Mortality,
## data = swiss)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15.2743 -5.2617 0.5032 4.1198 15.3213
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 66.91518 10.70604 6.250 1.91e-07 ***
## swiss$Agriculture -0.17211 0.07030 -2.448 0.01873 *
## swiss$Examination -0.25801 0.25388 -1.016 0.31546
## swiss$Education -0.87094 0.18303 -4.758 2.43e-05 ***
## swiss$Catholic 0.10412 0.03526 2.953 0.00519 **
## swiss$Infant.Mortality 1.07705 0.38172 2.822 0.00734 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.165 on 41 degrees of freedom
## Multiple R-squared: 0.7067, Adjusted R-squared: 0.671
## F-statistic: 19.76 on 5 and 41 DF, p-value: 5.594e-10
#Seleccionamos los mejores predictores posibles
step(object=mrm_swiss, direction="both",trace=1)
## Start: AIC=190.69
## swiss$Fertility ~ swiss$Agriculture + swiss$Examination + swiss$Education +
## swiss$Catholic + swiss$Infant.Mortality
##
## Df Sum of Sq RSS AIC
## - swiss$Examination 1 53.03 2158.1 189.86
## <none> 2105.0 190.69
## - swiss$Agriculture 1 307.72 2412.8 195.10
## - swiss$Infant.Mortality 1 408.75 2513.8 197.03
## - swiss$Catholic 1 447.71 2552.8 197.75
## - swiss$Education 1 1162.56 3267.6 209.36
##
## Step: AIC=189.86
## swiss$Fertility ~ swiss$Agriculture + swiss$Education + swiss$Catholic +
## swiss$Infant.Mortality
##
## Df Sum of Sq RSS AIC
## <none> 2158.1 189.86
## + swiss$Examination 1 53.03 2105.0 190.69
## - swiss$Agriculture 1 264.18 2422.2 193.29
## - swiss$Infant.Mortality 1 409.81 2567.9 196.03
## - swiss$Catholic 1 956.57 3114.6 205.10
## - swiss$Education 1 2249.97 4408.0 221.43
##
## Call:
## lm(formula = swiss$Fertility ~ swiss$Agriculture + swiss$Education +
## swiss$Catholic + swiss$Infant.Mortality, data = swiss)
##
## Coefficients:
## (Intercept) swiss$Agriculture swiss$Education
## 62.1013 -0.1546 -0.9803
## swiss$Catholic swiss$Infant.Mortality
## 0.1247 1.0784
#Ejecutamos de nuevo el modelo con los predictores más significativos
mrm_swiss_predictores<-(lm(formula =swiss$Fertility~swiss$Agriculture+swiss$Education+swiss$Catholic+swiss$Infant.Mortality, data=swiss))
summary(mrm_swiss_predictores)
##
## Call:
## lm(formula = swiss$Fertility ~ swiss$Agriculture + swiss$Education +
## swiss$Catholic + swiss$Infant.Mortality, data = swiss)
##
## Residuals:
## Min 1Q Median 3Q Max
## -14.6765 -6.0522 0.7514 3.1664 16.1422
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 62.10131 9.60489 6.466 8.49e-08 ***
## swiss$Agriculture -0.15462 0.06819 -2.267 0.02857 *
## swiss$Education -0.98026 0.14814 -6.617 5.14e-08 ***
## swiss$Catholic 0.12467 0.02889 4.315 9.50e-05 ***
## swiss$Infant.Mortality 1.07844 0.38187 2.824 0.00722 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.168 on 42 degrees of freedom
## Multiple R-squared: 0.6993, Adjusted R-squared: 0.6707
## F-statistic: 24.42 on 4 and 42 DF, p-value: 1.717e-10
Con esto vemos que hemos sido capaces de generar un modelo de
regresión lineal múltiples para predecir el parámetro fertilidad. Para
esto, se ha hecho la matriz de correlación, de la cuál vemos la
correlación entre las diferentes variables 2 a 2, siendo el valor más
alto para la variable Fertility (aunque en negativo) la
relación entre esta variable y Education.
Posteriormente hacemos un modelo usando todas las variables. A
cotinuación se eligen los mejores predcitores de los 5 posibles y se
observa que estos son: Agriculture, Education,
Catholic y Infant.Mortality, mientras que
Examination no. Finalmente hacemos de nuevo el modelo con los
predictores seleccionados y vemos que el valor de Adjusted
R-squared es 0.6707 y el p-valor es significativo
(1.717e-10<0.05). Esto significa que significa que, como vemos en el
resumen estadístico, todas las variables independientes sincluidas en el
modelo tiene un efecto significativo en la variable dependiente, es
decir, hay evidencia estadística suficiente para afirmar que la relación
entre las variables independientes y la variable dependiente no es
casualidad y que realmente existe una asociación entre ellas.
#Ejercicio 2. Modelos supervisados. Modelo de clasificación SVM A partir del conjunto de datos Pima.tr del paquete MASS que hace referencia a datos de diabetes de pacientes indias, realizad un modelo de clasificación SVM y realizad una clasificación de pacientes para predecir si están en riesgo de padecer diabetes. Para realizar este ejercicio utilizad el paquete kernlab para entrenar el modelo SVM.
#Cargamos los datos
library(MASS)
data(Pima.tr)
head(Pima.tr)
## npreg glu bp skin bmi ped age type
## 1 5 86 68 28 30.2 0.364 24 No
## 2 7 195 70 33 25.1 0.163 55 Yes
## 3 5 77 82 41 35.8 0.156 35 No
## 4 0 165 76 43 47.9 0.259 26 No
## 5 0 107 60 25 26.4 0.133 23 No
## 6 5 97 76 27 35.6 0.378 52 Yes
#Dividmos los dato en conjunto de entrenamiento y prueba
set.seed(999)
library(caTools)
split <- sample.split(Pima.tr$type, SplitRatio = 0.7)
data_train <- Pima.tr[split, ] #conjunto de datos de entrenamiento
data_test <- Pima.tr[!split, ] #conjunto de datos de prueba
#CArgamos el paquete "kernlab" para para hacer el SVM
library(kernlab)
#Entrenamos un modelo y hacemos la predicciones
model<-ksvm(type ~ ., data=data_train)
predictions<-predict(model, newdata=data_test)
#Cargamos el paquete "caret" para poder hacer la matriz de confusión, que también nos dará la precisión del modelo, entre otros parámetros
library(caret)
## Loading required package: ggplot2
##
## Attaching package: 'ggplot2'
## The following object is masked from 'package:kernlab':
##
## alpha
## Loading required package: lattice
confusion_matrix <- confusionMatrix(predictions, data_test$type)
confusion_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction No Yes
## No 37 12
## Yes 3 8
##
## Accuracy : 0.75
## 95% CI : (0.6214, 0.8528)
## No Information Rate : 0.6667
## P-Value [Acc > NIR] : 0.10711
##
## Kappa : 0.3662
##
## Mcnemar's Test P-Value : 0.03887
##
## Sensitivity : 0.9250
## Specificity : 0.4000
## Pos Pred Value : 0.7551
## Neg Pred Value : 0.7273
## Prevalence : 0.6667
## Detection Rate : 0.6167
## Detection Prevalence : 0.8167
## Balanced Accuracy : 0.6625
##
## 'Positive' Class : No
##
print("La precisión (o Accuracy) es del 75%")
## [1] "La precisión (o Accuracy) es del 75%"
#Ejercicio 3. Modelos no supervisados. PCA A partir del conjunto de datos Iris, se pide realizar un análisis de componentes centrado, por ejemplo, en las medidas de longitud y ancho del sépalo y el pétalo.
#Cargamos los datos
data("iris")
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
#Consideramos solo las 4 que nos pide el ejercicio, y no incluimos la información de la especie
selecc_datos<-iris[, c("Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width")]
estand_data_iris<-scale(selecc_datos)
head(estand_data_iris)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## [1,] -0.8976739 1.01560199 -1.335752 -1.311052
## [2,] -1.1392005 -0.13153881 -1.335752 -1.311052
## [3,] -1.3807271 0.32731751 -1.392399 -1.311052
## [4,] -1.5014904 0.09788935 -1.279104 -1.311052
## [5,] -1.0184372 1.24503015 -1.335752 -1.311052
## [6,] -0.5353840 1.93331463 -1.165809 -1.048667
#Aplicamos el PCA
pca_resultado<-prcomp(estand_data_iris, center = TRUE, scale =TRUE)
#Hacemos un resumen de la varianza explicada por cada variable
summary(pca_resultado)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion 0.7296 0.9581 0.99482 1.00000
#Representamos la varianza explicada por cada componente
plot(pca_resultado)
#Finalmente generemos una matriz con los cargos de las variables para cada componente principal
cargos <- pca_resultado$rotation
cargos
## PC1 PC2 PC3 PC4
## Sepal.Length 0.5210659 -0.37741762 0.7195664 0.2612863
## Sepal.Width -0.2693474 -0.92329566 -0.2443818 -0.1235096
## Petal.Length 0.5804131 -0.02449161 -0.1421264 -0.8014492
## Petal.Width 0.5648565 -0.06694199 -0.6342727 0.5235971
#Ejercicio 4. Agrupamiento jerárquico. Agrupamiento jerárquico aglomerativo Realizad un agrupamiento jerárquico aglomerativo con el paquete de datos birthwt del paquete MASS.
#Cargamos los datos
library(MASS)
data("birthwt")
head(birthwt)
## low age lwt race smoke ptl ht ui ftv bwt
## 85 0 19 182 2 0 0 0 1 0 2523
## 86 0 33 155 3 0 0 0 0 3 2551
## 87 0 20 105 1 1 0 0 0 1 2557
## 88 0 21 108 1 1 0 0 1 2 2594
## 89 0 18 107 1 1 0 0 1 0 2600
## 91 0 21 124 3 0 0 0 0 0 2622
#Realizamos agrupamiento jerárquico aglomerativo. Primero calculamos la matriz de distancias
dist_matrix<-dist(birthwt)
#Alpicamos la función hclust() para usar el método de agrupamiento aglomerativo
hc_aglomerativo<-hclust(dist_matrix, method = "ward.D2")
#Reprsentamos el dendrograma resultante
plot(hc_aglomerativo, main = "Dendrograma de Agrupamiento Jerárquico Aglomerativo", xlab = "birthwt")
#Elegimos un nivel de corte del dendograma, por ejemplo, dividir en 5 clústeres
nivel_corte<-5
cluster_asignado<-cutree(hc_aglomerativo, k = nivel_corte)
#Mostramos los resultados
resultado<-data.frame(Cluster = cluster_asignado)
print(resultado)
## Cluster
## 85 1
## 86 1
## 87 2
## 88 2
## 89 2
## 91 2
## 92 2
## 93 2
## 94 2
## 95 2
## 96 2
## 97 2
## 98 2
## 99 2
## 100 2
## 101 2
## 102 2
## 103 2
## 104 2
## 105 2
## 106 2
## 107 2
## 108 2
## 109 2
## 111 2
## 112 2
## 113 2
## 114 2
## 115 2
## 116 2
## 117 2
## 118 2
## 119 2
## 120 2
## 121 2
## 123 2
## 124 2
## 125 2
## 126 3
## 127 3
## 128 3
## 129 3
## 130 3
## 131 3
## 132 3
## 133 3
## 134 3
## 135 3
## 136 3
## 137 3
## 138 3
## 139 3
## 140 3
## 141 3
## 142 3
## 143 3
## 144 3
## 145 3
## 146 3
## 147 3
## 148 3
## 149 3
## 150 3
## 151 3
## 154 3
## 155 3
## 156 3
## 159 3
## 160 3
## 161 3
## 162 3
## 163 3
## 164 3
## 166 3
## 167 3
## 168 3
## 169 3
## 170 3
## 172 3
## 173 3
## 174 3
## 175 3
## 176 4
## 177 3
## 179 4
## 180 4
## 181 4
## 182 4
## 183 4
## 184 4
## 185 4
## 186 4
## 187 4
## 188 4
## 189 4
## 190 4
## 191 4
## 192 4
## 193 4
## 195 4
## 196 4
## 197 4
## 199 4
## 200 4
## 201 4
## 202 4
## 203 4
## 204 4
## 205 4
## 206 4
## 207 4
## 208 4
## 209 4
## 210 4
## 211 4
## 212 4
## 213 4
## 214 4
## 215 4
## 216 4
## 217 4
## 218 4
## 219 4
## 220 4
## 221 4
## 222 4
## 223 4
## 224 4
## 225 4
## 226 4
## 4 5
## 10 5
## 11 5
## 13 5
## 15 5
## 16 5
## 17 5
## 18 5
## 19 5
## 20 5
## 22 5
## 23 5
## 24 5
## 25 5
## 26 5
## 27 5
## 28 5
## 29 5
## 30 5
## 31 1
## 32 1
## 33 1
## 34 1
## 35 1
## 36 1
## 37 1
## 40 1
## 42 1
## 43 1
## 44 1
## 45 1
## 46 1
## 47 1
## 49 1
## 50 1
## 51 1
## 52 1
## 54 1
## 56 1
## 57 1
## 59 1
## 60 1
## 61 1
## 62 1
## 63 1
## 65 1
## 67 1
## 68 1
## 69 1
## 71 1
## 75 1
## 76 1
## 77 1
## 78 1
## 79 1
## 81 1
## 82 1
## 83 1
## 84 1
#Ejercicio 5. Agrupamiento jerárquico. Agrupamiento jerárquico divisivo Realizad un agrupamiento jerárquico divisivo con el paquete de datos birthwt del paquete MASS.
#Cargamos los datos
data("birthwt")
head(birthwt)
## low age lwt race smoke ptl ht ui ftv bwt
## 85 0 19 182 2 0 0 0 1 0 2523
## 86 0 33 155 3 0 0 0 0 3 2551
## 87 0 20 105 1 1 0 0 0 1 2557
## 88 0 21 108 1 1 0 0 1 2 2594
## 89 0 18 107 1 1 0 0 1 0 2600
## 91 0 21 124 3 0 0 0 0 0 2622
#Realizamos agrupamiento jerárquico aglomerativo. Primero calculamos la matriz de distancias
dist_matrix2<-dist(birthwt)
#Cargamos el paquete "cluster" u usamos la función diana() para usar el método de agrupamiento divisivo
library(cluster)
hc_divisivo<-diana(dist_matrix2) # Método de agrupamiento divisivo
# Representación del dendrograma
plot(hc_divisivo, main = "Dendrograma de Agrupamiento Jerárquico Divisivo", xlab = "birthwt")
#Elegimos un nivel de corte del dendograma, por ejemplo, dividir en 5 clústeres, como antes
nivel_corte2<-5
cluster_asignado2<-cutree(hc_divisivo, k = nivel_corte2)
#Mostramos los resultados
resultado2<-data.frame(Cluster = cluster_asignado2)
print(resultado2)
## Cluster
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 1
## 8 1
## 9 1
## 10 1
## 11 1
## 12 1
## 13 1
## 14 1
## 15 1
## 16 1
## 17 1
## 18 1
## 19 1
## 20 1
## 21 1
## 22 1
## 23 1
## 24 1
## 25 2
## 26 2
## 27 2
## 28 2
## 29 2
## 30 2
## 31 2
## 32 2
## 33 2
## 34 2
## 35 2
## 36 2
## 37 2
## 38 2
## 39 2
## 40 2
## 41 2
## 42 2
## 43 2
## 44 2
## 45 2
## 46 2
## 47 2
## 48 2
## 49 2
## 50 2
## 51 2
## 52 2
## 53 2
## 54 2
## 55 2
## 56 2
## 57 2
## 58 2
## 59 2
## 60 2
## 61 2
## 62 2
## 63 2
## 64 2
## 65 2
## 66 2
## 67 2
## 68 2
## 69 2
## 70 2
## 71 2
## 72 2
## 73 2
## 74 2
## 75 2
## 76 2
## 77 2
## 78 2
## 79 2
## 80 2
## 81 2
## 82 2
## 83 3
## 84 2
## 85 3
## 86 3
## 87 3
## 88 3
## 89 3
## 90 3
## 91 3
## 92 3
## 93 3
## 94 3
## 95 3
## 96 3
## 97 3
## 98 3
## 99 3
## 100 3
## 101 3
## 102 3
## 103 3
## 104 3
## 105 3
## 106 3
## 107 3
## 108 3
## 109 3
## 110 3
## 111 3
## 112 3
## 113 3
## 114 3
## 115 3
## 116 3
## 117 3
## 118 3
## 119 3
## 120 3
## 121 3
## 122 3
## 123 3
## 124 3
## 125 3
## 126 3
## 127 3
## 128 3
## 129 4
## 130 4
## 131 5
## 132 5
## 133 5
## 134 5
## 135 5
## 136 5
## 137 5
## 138 5
## 139 5
## 140 5
## 141 5
## 142 5
## 143 5
## 144 5
## 145 5
## 146 5
## 147 5
## 148 5
## 149 5
## 150 5
## 151 5
## 152 5
## 153 5
## 154 5
## 155 5
## 156 5
## 157 5
## 158 1
## 159 1
## 160 1
## 161 1
## 162 1
## 163 1
## 164 1
## 165 1
## 166 1
## 167 1
## 168 1
## 169 1
## 170 1
## 171 1
## 172 1
## 173 1
## 174 1
## 175 1
## 176 1
## 177 1
## 178 1
## 179 1
## 180 1
## 181 1
## 182 1
## 183 1
## 184 1
## 185 1
## 186 1
## 187 1
## 188 1
## 189 1
#Finalmente podemos añadir una representación gráfica de los diferentes clústers
pltree(hc_divisivo,hang=-1,cex=0.6)
rect.hclust(hc_divisivo,k=10,border=2:10)
#Ejercicio 6. Agrupamiento jerárquico. Agrupamiento jerárquico aglomerativo Realizad un agrupamiento jerárquico de tipo aglomerativo para el conjunto de datos Melanoma del paquete MASS.
#Seguimos el mismo procedimiento que en el ejercicio 4
#Cargamos los datos
data("Melanoma")
head(Melanoma)
## time status sex age year thickness ulcer
## 1 10 3 1 76 1972 6.76 1
## 2 30 3 1 56 1968 0.65 0
## 3 35 2 1 41 1977 1.34 0
## 4 99 3 0 71 1968 2.90 0
## 5 185 1 1 52 1965 12.08 1
## 6 204 1 1 28 1971 4.84 1
#Realizamos agrupamiento jerárquico aglomerativo. Primero calculamos la matriz de distancias
dist_matrix3<-dist(Melanoma)
#Alpicamos la función hclust() para usar el método de agrupamiento aglomerativo
hc_aglomerativo2<-hclust(dist_matrix3, method = "ward.D2")
#Reprsentamos el dendrograma resultante
plot(hc_aglomerativo2, main = "Dendrograma de Agrupamiento Jerárquico Aglomerativo", xlab = "melanoma")
#Elegimos un nivel de corte del dendograma, por ejemplo, dividir en 4 clústeres
nivel_corte3<-4
cluster_asignado3<-cutree(hc_aglomerativo2, k = nivel_corte3)
#Mostramos los resultados
resultado3<-data.frame(Cluster = cluster_asignado3)
print(resultado3)
## Cluster
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 1
## 8 1
## 9 1
## 10 1
## 11 1
## 12 1
## 13 1
## 14 1
## 15 1
## 16 1
## 17 1
## 18 1
## 19 1
## 20 1
## 21 1
## 22 1
## 23 1
## 24 1
## 25 1
## 26 1
## 27 1
## 28 1
## 29 1
## 30 1
## 31 1
## 32 1
## 33 1
## 34 1
## 35 1
## 36 1
## 37 1
## 38 1
## 39 1
## 40 1
## 41 1
## 42 1
## 43 1
## 44 2
## 45 2
## 46 2
## 47 2
## 48 2
## 49 2
## 50 2
## 51 2
## 52 2
## 53 2
## 54 2
## 55 2
## 56 2
## 57 2
## 58 2
## 59 2
## 60 2
## 61 2
## 62 2
## 63 2
## 64 2
## 65 2
## 66 2
## 67 2
## 68 2
## 69 2
## 70 2
## 71 2
## 72 2
## 73 2
## 74 2
## 75 2
## 76 2
## 77 2
## 78 2
## 79 2
## 80 2
## 81 2
## 82 2
## 83 2
## 84 2
## 85 2
## 86 2
## 87 2
## 88 2
## 89 2
## 90 2
## 91 2
## 92 2
## 93 2
## 94 2
## 95 2
## 96 2
## 97 2
## 98 2
## 99 2
## 100 2
## 101 2
## 102 2
## 103 2
## 104 2
## 105 2
## 106 2
## 107 2
## 108 2
## 109 2
## 110 2
## 111 2
## 112 2
## 113 2
## 114 2
## 115 2
## 116 2
## 117 2
## 118 2
## 119 2
## 120 2
## 121 2
## 122 2
## 123 2
## 124 2
## 125 2
## 126 2
## 127 2
## 128 3
## 129 3
## 130 3
## 131 3
## 132 3
## 133 3
## 134 3
## 135 3
## 136 3
## 137 3
## 138 3
## 139 3
## 140 3
## 141 3
## 142 3
## 143 3
## 144 3
## 145 3
## 146 3
## 147 3
## 148 3
## 149 3
## 150 3
## 151 3
## 152 3
## 153 3
## 154 3
## 155 3
## 156 3
## 157 3
## 158 3
## 159 3
## 160 3
## 161 3
## 162 3
## 163 3
## 164 3
## 165 3
## 166 3
## 167 3
## 168 3
## 169 3
## 170 3
## 171 3
## 172 3
## 173 3
## 174 3
## 175 3
## 176 3
## 177 3
## 178 3
## 179 3
## 180 3
## 181 3
## 182 3
## 183 4
## 184 4
## 185 4
## 186 4
## 187 4
## 188 4
## 189 4
## 190 4
## 191 4
## 192 4
## 193 4
## 194 4
## 195 4
## 196 4
## 197 4
## 198 4
## 199 4
## 200 4
## 201 4
## 202 4
## 203 4
## 204 4
## 205 4
#Ejercicio 7. Agrupamiento jerárquico. Agrupamiento jerárquico divisivo Realizad un agrupamiento jerárquico de tipo divisivo para el conjunto de datos Melanoma del paquete MASS.
#Seguimos el mismo procedimiento que en el ejercicio 5
#Cargamos los datos
data("Melanoma")
head(Melanoma)
## time status sex age year thickness ulcer
## 1 10 3 1 76 1972 6.76 1
## 2 30 3 1 56 1968 0.65 0
## 3 35 2 1 41 1977 1.34 0
## 4 99 3 0 71 1968 2.90 0
## 5 185 1 1 52 1965 12.08 1
## 6 204 1 1 28 1971 4.84 1
#Realizamos agrupamiento jerárquico aglomerativo. Primero calculamos la matriz de distancias
dist_matrix4<-dist(Melanoma)
#Cargamos el paquete "cluster" u usamos la función diana() para usar el método de agrupamiento divisivo
library(cluster)
hc_divisivo2<-diana(dist_matrix4) # Método de agrupamiento divisivo
# Representación del dendrograma
plot(hc_divisivo2, main = "Dendrograma de Agrupamiento Jerárquico Divisivo", xlab = "melanoma")
#Elegimos un nivel de corte del dendograma, por ejemplo, dividir en 4 clústeres, como antes
nivel_corte4<-4
cluster_asignado4<-cutree(hc_divisivo2, k = nivel_corte4)
#Mostramos los resultados
resultado4<-data.frame(Cluster = cluster_asignado4)
print(resultado4)
## Cluster
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
## 7 1
## 8 1
## 9 1
## 10 1
## 11 1
## 12 1
## 13 1
## 14 1
## 15 1
## 16 1
## 17 1
## 18 1
## 19 1
## 20 1
## 21 1
## 22 1
## 23 1
## 24 1
## 25 1
## 26 1
## 27 1
## 28 1
## 29 1
## 30 1
## 31 1
## 32 1
## 33 1
## 34 1
## 35 1
## 36 1
## 37 1
## 38 1
## 39 1
## 40 1
## 41 1
## 42 2
## 43 2
## 44 2
## 45 2
## 46 2
## 47 2
## 48 2
## 49 2
## 50 2
## 51 2
## 52 2
## 53 2
## 54 2
## 55 2
## 56 2
## 57 2
## 58 2
## 59 2
## 60 2
## 61 2
## 62 2
## 63 2
## 64 2
## 65 2
## 66 2
## 67 2
## 68 2
## 69 2
## 70 2
## 71 2
## 72 2
## 73 2
## 74 2
## 75 2
## 76 2
## 77 2
## 78 2
## 79 2
## 80 2
## 81 2
## 82 2
## 83 2
## 84 2
## 85 2
## 86 2
## 87 2
## 88 2
## 89 2
## 90 2
## 91 2
## 92 2
## 93 2
## 94 2
## 95 2
## 96 2
## 97 2
## 98 2
## 99 2
## 100 2
## 101 2
## 102 2
## 103 2
## 104 2
## 105 2
## 106 2
## 107 2
## 108 2
## 109 2
## 110 2
## 111 2
## 112 2
## 113 2
## 114 2
## 115 2
## 116 2
## 117 2
## 118 2
## 119 2
## 120 2
## 121 2
## 122 2
## 123 2
## 124 2
## 125 2
## 126 2
## 127 2
## 128 2
## 129 2
## 130 2
## 131 2
## 132 2
## 133 2
## 134 2
## 135 2
## 136 2
## 137 2
## 138 2
## 139 2
## 140 3
## 141 3
## 142 3
## 143 3
## 144 3
## 145 3
## 146 3
## 147 3
## 148 3
## 149 3
## 150 3
## 151 3
## 152 3
## 153 3
## 154 3
## 155 3
## 156 3
## 157 3
## 158 3
## 159 3
## 160 3
## 161 3
## 162 3
## 163 3
## 164 3
## 165 3
## 166 3
## 167 3
## 168 3
## 169 3
## 170 3
## 171 3
## 172 3
## 173 3
## 174 3
## 175 3
## 176 3
## 177 3
## 178 3
## 179 3
## 180 3
## 181 3
## 182 3
## 183 4
## 184 4
## 185 4
## 186 4
## 187 4
## 188 4
## 189 4
## 190 4
## 191 4
## 192 4
## 193 4
## 194 4
## 195 4
## 196 4
## 197 4
## 198 4
## 199 4
## 200 4
## 201 4
## 202 4
## 203 4
## 204 4
## 205 4
#Finalmente podemos añadir una representación gráfica de los diferentes clústers
pltree(hc_divisivo2,hang=-1,cex=0.6, main = "Dendrograma de Agrupamiento Jerárquico Divisivo", xlab = "melanoma")
rect.hclust(hc_divisivo2,k=10,border=2:10, )
#Ejercicio 8. Agrupamiento no jerárquico Realizad un agrupamiento no jerárquico utilizando el conjunto de datos birthwt del paquete MASS.
#Cargamos los datos
data("birthwt")
head(birthwt)
## low age lwt race smoke ptl ht ui ftv bwt
## 85 0 19 182 2 0 0 0 1 0 2523
## 86 0 33 155 3 0 0 0 0 3 2551
## 87 0 20 105 1 1 0 0 0 1 2557
## 88 0 21 108 1 1 0 0 1 2 2594
## 89 0 18 107 1 1 0 0 1 0 2600
## 91 0 21 124 3 0 0 0 0 0 2622
#Comprobamos el grado de correlación entre las diferentes variables
corr=cor(birthwt)
corr
## low age lwt race smoke ptl
## low 1.00000000 -0.11893928 -0.16962694 0.137792751 0.16140431 0.196087267
## age -0.11893928 1.00000000 0.18007315 -0.172817953 -0.04434618 0.071606386
## lwt -0.16962694 0.18007315 1.00000000 -0.165048544 -0.04417908 -0.140029003
## race 0.13779275 -0.17281795 -0.16504854 1.000000000 -0.33903074 0.007951293
## smoke 0.16140431 -0.04434618 -0.04417908 -0.339030745 1.00000000 0.187557063
## ptl 0.19608727 0.07160639 -0.14002900 0.007951293 0.18755706 1.000000000
## ht 0.15237025 -0.01583700 0.23636040 0.019929917 0.01340704 -0.015399579
## ui 0.16904283 -0.07515558 -0.15276317 0.053602088 0.06215900 0.227585340
## ftv -0.06296026 0.21539394 0.14052746 -0.098336254 -0.02801314 -0.044429660
## bwt -0.78480516 0.09031781 0.18573328 -0.194713487 -0.19044806 -0.154653390
## ht ui ftv bwt
## low 0.15237025 0.16904283 -0.06296026 -0.78480516
## age -0.01583700 -0.07515558 0.21539394 0.09031781
## lwt 0.23636040 -0.15276317 0.14052746 0.18573328
## race 0.01992992 0.05360209 -0.09833625 -0.19471349
## smoke 0.01340704 0.06215900 -0.02801314 -0.19044806
## ptl -0.01539958 0.22758534 -0.04442966 -0.15465339
## ht 1.00000000 -0.10858506 -0.07237255 -0.14598189
## ui -0.10858506 1.00000000 -0.05952341 -0.28392741
## ftv -0.07237255 -0.05952341 1.00000000 0.05831777
## bwt -0.14598189 -0.28392741 0.05831777 1.00000000
#Aplicamos k-means con k=3 (3 clústeres)
k<-3
kmeans_resultado2<-kmeans(birthwt, centers = k)
#Visualizamos los resultados
library(ggplot2)
asignaciones<- kmeans_resultado2$cluster
centros<-kmeans_resultado2$centers
#Convertimos los centros calculados en un data frame
centros_df<-as.data.frame(centros)
#Representamos un gráfico de dispersión de los datos con colores para los clústeres
ggplot(birthwt, aes(x = bwt, y = age, color=factor(asignaciones))) +
geom_point() +
geom_point(data = centros_df, aes(x = bwt, y = age),color = "black", size = 3, shape = 4) +
labs(title = "Segmentación de Pacientes por K-Means")
#Ejercicio 9. Agrupamiento no jerárquico Realizad un agrupamiento no jerárquico utilizando la técnica k-means() para el conjunto de datos Melanoma del paquete MASS. Valorad los resultados para distintos números de clústeres y definiendo una determinada variable objetivo. Podéis transformar alguna variable entera de modo categórico, por ejemplo, la referente al estatus.
#Cargamos los datos
data("Melanoma")
head(Melanoma)
## time status sex age year thickness ulcer
## 1 10 3 1 76 1972 6.76 1
## 2 30 3 1 56 1968 0.65 0
## 3 35 2 1 41 1977 1.34 0
## 4 99 3 0 71 1968 2.90 0
## 5 185 1 1 52 1965 12.08 1
## 6 204 1 1 28 1971 4.84 1
#Comprobamos el grado de correlación entre las diferentes variables
corr2=cor(Melanoma)
corr2
## time status sex age year
## time 1.0000000 0.31614601 -0.146499215 -0.30151794 -0.485504359
## status 0.3161460 1.00000000 -0.098967345 0.01596386 0.138166927
## sex -0.1464992 -0.09896735 1.000000000 0.06833741 -0.002645159
## age -0.3015179 0.01596386 0.068337413 1.00000000 0.188229089
## year -0.4855044 0.13816693 -0.002645159 0.18822909 1.000000000
## thickness -0.2354087 -0.20472162 0.185412563 0.21247979 -0.133345424
## ulcer -0.2647575 -0.27032555 0.167979154 0.12606294 -0.033125618
## thickness ulcer
## time -0.2354087 -0.26475748
## status -0.2047216 -0.27032555
## sex 0.1854126 0.16797915
## age 0.2124798 0.12606294
## year -0.1333454 -0.03312562
## thickness 1.0000000 0.42445931
## ulcer 0.4244593 1.00000000
#Aplicamos k-means con k=3 (3 clústeres)
k<-3
kmeans_resultado2<-kmeans(Melanoma, centers = k)
#Visualizamos los resultados
library(ggplot2)
asignaciones2<- kmeans_resultado2$cluster
centros2<-kmeans_resultado2$centers
#Convertimos los centros calculados en un data frame
centros_df2<-as.data.frame(centros2)
#Representamos un gráfico de dispersión de los datos con colores para los clústeres
ggplot(Melanoma, aes(x = age, y = thickness, color=factor(asignaciones2))) +
geom_point() +
geom_point(data = centros_df2, aes(x = age, y = thickness),color = "black", size = 3, shape = 4) +
labs(title = "Segmentación de Pacientes por K-Means (3 clústers)")
#Repetimos pero aplicamos k-means con k=4 (2 clústeres)
k2<-2
kmeans_resultado3<-kmeans(Melanoma, centers = k2)
asignaciones3<- kmeans_resultado3$cluster
centros3<-kmeans_resultado3$centers
centros_df3<-as.data.frame(centros3)
ggplot(Melanoma, aes(x = age, y = thickness, color=factor(asignaciones3))) +
geom_point() +
geom_point(data = centros_df3, aes(x = age, y = thickness),color = "black", size = 3, shape = 4) +
labs(title = "Segmentación de Pacientes por K-Means (2 clústers)")
#Repetimos pero aplicamos k-means con k=4 ( clústeres)
k4<-4
kmeans_resultado4<-kmeans(Melanoma, centers = k4)
asignaciones4<- kmeans_resultado4$cluster
centros4<-kmeans_resultado4$centers
centros_df4<-as.data.frame(centros4)
ggplot(Melanoma, aes(x = age, y = thickness, color=factor(asignaciones4))) +
geom_point() +
geom_point(data = centros_df4, aes(x = age, y = thickness),color = "black", size = 3, shape = 4) +
labs(title = "Segmentación de Pacientes por K-Means (4 clústers)")
Al hacer diferentes k (o clusters) para le agrupamiento vamos como un
mismo paciente se clasifica en diferentes clústers. Además no vemos una
separación clara de los clústers, cosa que nos dice que las variables
age y thickness no separan bien esta población.
#Ejercicio 10. ANOVA A partir del conjunto de datos Iris, aplicad la función ANOVA y razonad los resultados obtenidos.
#Cargamos los datos
data("iris")
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
#Realizamos un ANOVA
resultado_anova<-aov(Sepal.Length ~ Species, data = iris)
#Resumen del ANOVA
summary(resultado_anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## Species 2 63.21 31.606 119.3 <2e-16 ***
## Residuals 147 38.96 0.265
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Realizamos un test de significancia
TukeyHSD(resultado_anova)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = Sepal.Length ~ Species, data = iris)
##
## $Species
## diff lwr upr p adj
## versicolor-setosa 0.930 0.6862273 1.1737727 0
## virginica-setosa 1.582 1.3382273 1.8257727 0
## virginica-versicolor 0.652 0.4082273 0.8957727 0