Conjunto de dados no The UCI Machine Learning Repository, URL https://archive.ics.uci.edu/ml/about.html.
wine=read.table(file = "http://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data", sep=",")
head(wine)
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
## 1 1 14.23 1.71 2.43 15.6 127 2.80 3.06 0.28 2.29 5.64 1.04 3.92 1065
## 2 1 13.20 1.78 2.14 11.2 100 2.65 2.76 0.26 1.28 4.38 1.05 3.40 1050
## 3 1 13.16 2.36 2.67 18.6 101 2.80 3.24 0.30 2.81 5.68 1.03 3.17 1185
## 4 1 14.37 1.95 2.50 16.8 113 3.85 3.49 0.24 2.18 7.80 0.86 3.45 1480
## 5 1 13.24 2.59 2.87 21.0 118 2.80 2.69 0.39 1.82 4.32 1.04 2.93 735
## 6 1 14.20 1.76 2.45 15.2 112 3.27 3.39 0.34 1.97 6.75 1.05 2.85 1450
Informações do conjunto de dados:
Esses dados são resultados de uma análise química de vinhos cultivados na mesma região da Itália, mas derivados de três cultivares diferentes. A análise determinou as quantidades de 13 constituintes encontrados em cada um dos três tipos de vinhos.
Os atributos foram doados por Riccardo Leardi, A primeira variável V1 indica o cultivar de codigos 1, 2 e 3, as outras variáveis são todas contínuas registrando as seguuintes informações cada:
TAREFA: fazer um estudo descritivo e utilizar às componentes principais para depois ajustar um modelo adequado.
OBSERVAÇÃO: selecionar dados para treino e teste.
Selecionando dados para treino e teste:
set.seed(2345)
indices = sample(1:nrow(wine), 0.7*nrow(wine))
wine1 = wine[indices,]
wine2 = wine[-indices,]
Mostrando as proporções nos arquivos dos diferentes cultivares:
table(wine[,1])/sum(table(wine[,1]))
##
## 1 2 3
## 0.3314607 0.3988764 0.2696629
table(wine1[,1])/sum(table(wine1[,1]))
##
## 1 2 3
## 0.3306452 0.4112903 0.2580645
table(wine2[,1])/sum(table(wine2[,1]))
##
## 1 2 3
## 0.3333333 0.3703704 0.2962963
library(corrplot)
par(cex = 0.7)
corrplot(cor(wine1[,2:14]), method = "number", type = "upper")
Observam-se claramente variáveis com correlação linear muito baixas, assim decidimos desconsiderar da construção de componentes principais as variáveis V4, V5 e V6.
pairs(wine1[,2:5])
pairs(wine1[,6:9])
pairs(wine1[,10:14])
wine1.scaled = scale(wine1[,-1])
wine1.prcomp = prcomp(wine1.scaled[,-c(3,4,5)])
summary(wine1.prcomp)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 2.1141 1.510 0.9370 0.80423 0.77127 0.61940 0.50611
## Proportion of Variance 0.4469 0.228 0.0878 0.06468 0.05949 0.03837 0.02561
## Cumulative Proportion 0.4469 0.675 0.7628 0.82744 0.88692 0.92529 0.95090
## PC8 PC9 PC10
## Standard deviation 0.49607 0.3937 0.29977
## Proportion of Variance 0.02461 0.0155 0.00899
## Cumulative Proportion 0.97551 0.9910 1.00000
library(ggfortify)
pca.plot <- autoplot(wine1.prcomp, data = wine1, colour = wine1[,1])
pca.plot
Agora podemos utilizar estas combinações lineares e as variáveis desconsideradas para estudar a influência na resposta, os cultivares. Primeiro vamos construir a base de dados na qual trabalharemos.
PC1 = wine1.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,1]
PC2 = wine1.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,2]
PC3 = wine1.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,3]
PC4 = wine1.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,4]
PC5 = wine1.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,5]
wine3 = data.frame(V1 = wine1[,1], wine1.scaled[,c(3,4,5)], PC1 = PC1,
PC2 = PC2, PC3 = PC3, PC4 = PC4, PC5 = PC5)
Construída a base de dados, ajustamos o modelo Multinomial.
library(nnet)
ajuste = multinom(factor(V1) ~ V4 + V5 + V6 + PC1, data = wine3, model = TRUE)
## # weights: 18 (10 variable)
## initial value 136.227924
## iter 10 value 22.759584
## iter 20 value 19.625076
## iter 30 value 19.568009
## iter 40 value 19.567640
## iter 40 value 19.567640
## iter 40 value 19.567640
## final value 19.567640
## converged
summary(ajuste)
## Call:
## multinom(formula = factor(V1) ~ V4 + V5 + V6 + PC1, data = wine3,
## model = TRUE)
##
## Coefficients:
## (Intercept) V4 V5 V6 PC1
## 2 4.501350 -3.1607682 4.454958 -0.2706288 -2.388591
## 3 -9.056835 -0.9596712 5.410838 0.5112688 -8.922951
##
## Std. Errors:
## (Intercept) V4 V5 V6 PC1
## 2 1.421956 0.9218499 1.388232 0.3630762 0.7719272
## 3 6.005331 1.7669300 1.885511 1.2063242 2.7555937
##
## Residual Deviance: 39.13528
## AIC: 59.13528
wine2.scaled = scale(wine2[,-1])
PC12 = wine2.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,1]
PC22= wine2.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,2]
PC32= wine2.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,3]
PC42= wine2.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,4]
PC52= wine2.scaled[,-c(3,4,5)]%*%wine1.prcomp$rotation[,5]
wine4 = data.frame(V1 = wine2[,1], wine2.scaled[,c(3,4,5)], PC1 = PC12,
PC2 = PC22, PC3 = PC32, PC4 = PC42, PC5 = PC52)
preditos = predict(ajuste, wine4)
preditos
## [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2
## [39] 2 3 3 3 3 3 3 3 3 3 3 3 2 3 3 3
## Levels: 1 2 3
table(preditos, wine4[,1])
##
## preditos 1 2 3
## 1 17 1 0
## 2 1 19 2
## 3 0 0 14
mean(preditos != wine4[,1])
## [1] 0.07407407