#Importar bibliotecas
library(GGally)
## Loading required package: ggplot2
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
library(corrplot)
## corrplot 0.84 loaded
library(faraway)
##
## Attaching package: 'faraway'
## The following object is masked from 'package:GGally':
##
## happy
library(ggplot2)
##1. INTRODUÇÃO
O conjunto de dados escolhido pelo grupo é constituído pelos valores nutricionais genéricos, para a mesma porporção, em barras de chocolates. O objetivo é saber quais os nutrientes que mais contribuem para o aumento/diminuição das calorias nessas mesmas barras. O “data frame” contém 31 observações e 11 variáveis, sendo duas do tipo qualitativo nominal e as restantes do tipo quantitativo contínua. A variável Calories é uma variável aleatória dependente quantitativa contínua e as restantes variáveis são classificadas como independentes. Relativamente às variáveis independentes, as variáveis Candybarname e Nuts são qualitativas nominais e as variáveis FatCal, TotalCal, Cholesterol, Sodium, Fiber, Sugar, Protein e Calcium são variáveis quantitativas contínuas. Note-se que a variável nominal Candybarname representa o nome dos chocolates e, portanto, cada registo tem um “valor”, neste caso, um nome diferente. Por esta razão, o grupo não considerou esta variável na construção do modelo de Regressão Linear. A variável Nuts representa a existência ou não de nozes na respetiva barra de chocolate, ou seja, toma o valor 1 caso exista e o valor 0 caso não 0.
##2. IMPORTAÇÃO E TRATAMENTO DE DADOS
Após a escolha da a base de dados para o trabalho, esta é importada para o R e procede-se ao tratamento dos dados. Este processo é importante para garantir a disponibilidade e integridade das informações que serão geradas. Neste caso, e após a análise dos dados disponibilizados, é utilizado o comando “as.factor” para garantir que a variável Nuts mantém o tipo “factor”. A título de exemplo, são apresentadas, na tabela a baixo, as 6 primeiras linhas de cada coluna:
#df=df[,-1]
dim(df)
## [1] 30 11
df[,11]=as.factor(df$Nuts)
head(df)
## Candybarname Calories FatCal TotalCal Cholesterol
## 1 AlmondJoy 4.795918 2.428571 0.2653061 0.04081633
## 2 5thAvenue 4.821429 2.160714 0.2321429 0.05357143
## 3 Cadbury'sCaramello 4.628571 1.914286 0.2000000 0.25714286
## 4 Hershey'sMilkChocolatewithAlmond 5.512821 3.205128 0.3589744 0.17948718
## 5 HersheyKitKat,BigKitKatBar 5.200000 2.509091 0.2727273 0.09090909
## 6 HersheyReesticks 5.214286 2.809524 0.3095238 0.07142857
## Sodium Fiber Sugar Protein Calcium Nuts
## 1 1.4285714 0.04081633 0.4897959 0.04081633 0.06122449 1
## 2 2.2500000 0.03571429 0.4642857 0.08928571 0.07142857 0
## 3 1.2285714 0.00000000 0.5714286 0.05714286 0.20000000 0
## 4 0.7435897 0.02564103 0.4358974 0.10256410 0.23076923 1
## 5 0.6363636 0.01818182 0.5454545 0.05454545 0.14545455 0
## 6 2.6428571 0.02380952 0.4047619 0.09523810 0.07142857 0
##3. ANALISE EXPLORATORIA
##3.1 HISTOGRAMAS DAS VARIAVÉIS
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
O histograma permite ver a distribuição de frequência dos dados.
No histograma relativo à variável Calories verifica-se que, com maior frequência, as calorias variam entre as 4.5 e as 5 unidades e, de seguida, entre as 5 e as 5.5 unidades. As restantes classes têm uma frequência igual ou inferior a 5.
hist(df$Calories, main="Histograma das calorias", xlim = range(3,6.5), ylim = range (0,15), col = "gray")
No histograma da variável FatCal observa-se que, com maior frequência, as calorias gordas estão num intervalo de 2 a 2.5 unidades. As restantes classes da variável FatCal estão distribuídas de forma mais ou menos uniforme, com frequência igual ou inferior a 6.
hist(df$FatCal, main="Histograma do fatcal",xlim = range(0,4), ylim = range(0,12), col = "red")
No histograma da variável TotalCal, é possível perceber que a classe cujo intervalo varia entre as 0.25 e as 0.3 unidades é a que tem maior frequência e, de seguida, as classes que têm maior frequência são aquelas cujos intervalos variam entre as 0.15 e as 0.2 unidades e entre as 0.2 e as 0.25 unidades. As restantes classes têm uma frequência igual ou inferior a 4.
hist(df$TotalCal, main="Histograma do totalcal",xlim = range(0,0.5), ylim = range(0,11), col = "blue")
No histograma relativo ao Cholesterol, observa-se uma barra isolada na extremidade e o pico de densidade de dados ocorre no intervalo [0,0.5].
hist(df$Cholesterol, main="Histograma do colesterol",xlim = range(0,2.5),ylim = range(0,32), col = "pink")
No histograma do Sódio, entre as 0 e as 2.5 unidades, a frequência distribui-se de forma mais ou menos uniforme, com frequência igual ou inferior a 7 e, nos restantes intervalos, a frequência é igual ou inferior a 2.
hist(df$Sodium, main="Histograma do sódio",xlim = range(0,4),ylim = range(0,10), col = "orange")
No histograma relativo à Fibra, há um pico de densidade no intervalo [0,0.05] e dois intervalos com uma frequência muito baixa, os intervalos [0.05,0.1] e [0.15,0.2].
hist(df$Fiber, main="Histograma da fibra",xlim = range(0,0.3),ylim = range(0,30), col = "yellow")
No histograma da variável Sugar, observa-se que com maior frequência a variável Sugar está entre as 0.5 e as 0.55 unidades e, de seguida, entre as 0.45 e as 0.5 unidades. A frequência distribui-se de forma mais ou menos uniforme pelas restantes classes da variável Sugar, com frequência igual ou inferior a 3.
hist(df$Sugar, main="Histograma do açúcar",xlim = range(0.3,0.8),ylim = range(0,10), col = "green")
No histograma relativo à variável Protein, existe um pico de densidade na classe cujo intervalo é [0.04,0.06]. A frequência distribui-se mais ou menos uniforme nas restantes classes.
hist(df$Protein, main="Histograma da proteina",xlim = range(0,0.14),ylim = range(0,14), col = "pink")
No histograma da variável Calcium, o pico de densidade de dados ocorre entre as 0.05 e as 0.1 unidades. Depois deste, as classes com maior frequência são as classes cujos intervalos são [0,0.05] e [0.1,0.15]. Os restantes intervalos têm uma frequência igual ou inferior a 3.
hist(df$Calcium, main="Histograma do cálcio",xlim = range(0,0.3),ylim = range(0,12), col = "brown")
De seguida, pode-se recolher informação sobre o valor mínimo, os quadrantes, a mediana, a média e o máximo de cada variavél.
summary(df);
## Calories FatCal TotalCal Cholesterol
## Min. :3.837 Min. :0.6512 Min. :0.06977 Min. :0.000000
## 1st Qu.:4.636 1st Qu.:1.8848 1st Qu.:0.20208 1st Qu.:0.008929
## Median :4.809 Median :2.3575 Median :0.26265 Median :0.106430
## Mean :4.847 Mean :2.2577 Mean :0.25150 Mean :0.146871
## 3rd Qu.:5.172 3rd Qu.:2.7069 3rd Qu.:0.29667 3rd Qu.:0.140263
## Max. :5.700 Max. :3.2500 Max. :0.36000 Max. :1.700000
##
## Sodium Fiber Sugar Protein
## Min. :0.0000 Min. :0.000000 Min. :0.4048 Min. :0.02000
## 1st Qu.:0.8583 1st Qu.:0.002222 1st Qu.:0.4796 1st Qu.:0.04451
## Median :1.9024 Median :0.020000 Median :0.5341 Median :0.05857
## Mean :1.6566 Mean :0.025350 Mean :0.5271 Mean :0.06461
## 3rd Qu.:2.2232 3rd Qu.:0.025481 3rd Qu.:0.5661 3rd Qu.:0.08860
## Max. :3.7500 Max. :0.200000 Max. :0.6522 Max. :0.11765
## NA's :4
## Calcium Nuts
## Min. :0.00000 0:19
## 1st Qu.:0.05357 1:11
## Median :0.07143
## Mean :0.09376
## 3rd Qu.:0.13043
## Max. :0.23077
## NA's :1
33.2 CAIXAS DE BIGODES
No diagrama da caixa com bigodes, a informação mais relevante a retirar são os 5 seguintes pontos: máximo, terceiro quartil, média, mediana, primeiro quarti e mínimo, respetivamente. Para além dos mencionados, por vezes pode aparecer neste diagrama, pontos que se encontram fora deste esquema- os outliers, que correspondem a valores invulgares à amostra. Pela seguintes demonstrações, elaborou-se boxplots para cada uma das variáveis. Atente-se que tanto a variável Fibra como a variável Colesterol, apresentam outliers de valores 0,2 e 1,7 respetivamente.
boxplot(df$Calories, df$FatCal, df$Sodium, xlab="Calories FatCal Sódio")
boxplot(df$TotalCal, df$Protein, df$Sugar, xlab="TotalCal Proteína Açúcares")
boxplot(df$Calcium, df$Fiber, xlab="Cálcio Fibra")
boxplot.stats(df$Fiber, coef = 3, do.conf= TRUE, do.out=TRUE)
## $stats
## [1] 0.00000000 0.00000000 0.02000000 0.02564103 0.05500000
##
## $n
## [1] 30
##
## $conf
## [1] 0.0126034 0.0273966
##
## $out
## [1] 0.2
boxplot(df$Cholesterol, xlab= "Colesterol")
boxplot.stats(df$Cholesterol, coef = 3, do.conf = TRUE, do.out= TRUE)
## $stats
## [1] 0.0000000 0.0000000 0.1064302 0.1403509 0.2571429
##
## $n
## [1] 30
##
## $conf
## [1] 0.06594353 0.14691678
##
## $out
## [1] 1.7
Por fim, elaborou-se um gráfico circular de forma a demonstrar a percentagem de chocolates que têm nozes ou não. Como é possível perceber, 60% dos chocolates não têm nozes, pelo que, 40% têm.
#pie
a <- table(df$Nuts)
a
##
## 0 1
## 19 11
x <- c(19, 11)
labels <- c("Com Nozes", "Sem Nozes")
pierpercent <- round(100*x/sum(x), -1)
pie(x, labels=pierpercent, main = "Chocolates", col = rainbow(length(x)))
legend("topright", c("Sem Nozes", "Com Nozes"), cex = 0.8 , fill = rainbow(length (x)))
##3.3 GRÁFICOS DE DISPERSÃO
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
x=length(df$Sugar )
for (i in 1:x) {
if (is.na(df$Sugar[i])) {
df=df[-c(i),]
}
if (is.na(df$Calcium[i])) {
df=df[-c(i),]
}
if (is.na(df$Nuts[i])) {
df=df[-c(i),]
}
}
x=0
i=0
df=df[-c(22),]
Uma vez feito o tratamento de dados, recorre-se a gráficos de dispersão para se perceber quais são as variáveis que podem estar mais correlacionadas com a variável resposta, Calories.
Segundo os gráficos de dispersão em baixo conseguimos perceber que existem fortes indícios de uma correlação entre as variáveis Calories e FatCal, assim como entre as variáveis Calories e TotalCal.
panel.hist <- function(x, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5) )
h <- hist(x, plot = F)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col = "grey", ...)
}
pairs(df[c(1,2,3)],diag.panel=panel.hist,lower.panel = panel.smooth, upper.panel = panel.smooth)
Os gráficos de dispersão em baixo mostram que existe um fraco indíce de correlação entre as variáveis Calories e Cholesterol, assim como entre as variáveis Calories e Sodium.
pairs(df[c(1,4,5)],diag.panel=panel.hist,lower.panel = panel.smooth, upper.panel = panel.smooth)
Nos seguintes gráficos pode-se verificar um forte indício de que a variável Calories está relacionada com a variável Sugar.
pairs(df[c(1,6,7)],diag.panel=panel.hist,lower.panel = panel.smooth, upper.panel = panel.smooth)
Nos gráficos apresentados a seguir pode-se constar que existe um forte indício de que as variáveis Calories e Protein têm uma boa correlação, assim como as variavés Calories e Calcium.
pairs(df[c(1,8,9)],diag.panel=panel.hist,lower.panel = panel.smooth, upper.panel = panel.smooth)
##3.4 CORRELAÇÃO ENTRE VARIÁVEIS
Em baixo é apresentado a matriz de correlação entre variáveis. A variável Nuts não é considerada uma vez que é do tipo factor. Pode-se concluir que a variável Calories está totalmente correlacionada com as variáveis FatCal e TotalCal. A variável Calories também apresenta uma correlação potencialmente forte com as variáveis Sugar e Protein.
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
x=length(df$Sugar )
for (i in 1:x) {
if (is.na(df$Sugar[i])) {
df=df[-c(i),]
}
if (is.na(df$Calcium[i])) {
df=df[-c(i),]
}
if (is.na(df$Nuts[i])) {
df=df[-c(i),]
}
}
x=0
i=0
df=df[-c(22),]
ggcorr(df, label=T)
## Warning in ggcorr(df, label = T): data in column(s) 'Nuts' are not numeric
## and were ignored
Em baixo pode ver-se o agrupamento das variáveis mais correlacionadas e perceber que podem existir problemas de multicolineariadade no modelo, devido à forte correlação entre variáveis explicativas como a FatCal, Protein e TotalCal, por exemplo.
M <- cor(df[,-c(10)])
corrplot(M, order = "hclust", addrect = 3, tl.pos="d") #agrupara variaveis
Como a variável Nuts é do tipo factor é dificil perceber o comportamento que vai ter no modelo. Segundo os gráficos em baixo pode-se verificar que os valores das correlações não sofrem grandes alterações quando a variável Nuts é 1 ou 0.
ggpairs(df, columns = 1:4, ggplot2::aes(colour=df$Nuts))
ggpairs(df, columns = c(1,5,6), ggplot2::aes(colour=df$Nuts))
ggpairs(df, columns = c(1,7,8), ggplot2::aes(colour=df$Nuts))
##4. Regressão Linear (Otimização do Modelo)
Iniciou-se a construção do modelo linear utilizando todas as variáveis explicativas para que, numa fase seguinte, seja possível encontrar o melhor modelo através do comando step. Com todas as variáveis explicativas num modelo inicial podemos verificar, através dos resultados, que nenhuma das variáveis.
#Regressao linear
#http://www.est.ufmg.br/portal/arquivos/rts/RT-SE-2009.pdf
#http://rpubs.com/andrehofreire/LinearRegressionR tambem tem analise exploratoria
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
print("REGRESSÃO LINEAR - OTIMIZAÇÃO DO MODELO")
## [1] "REGRESSÃO LINEAR - OTIMIZAÇÃO DO MODELO"
x=length(df$Sugar)
for (i in 1:x) {
if (is.na(df$Sugar[i])) {
df=df[-c(i),]
}
if (is.na(df$Calcium[i])) {
df=df[-c(i),]
}
if (is.na(df$Nuts[i])) {
df=df[-c(i),]
}
}
x=0
i=0
df=df[-c(22),]
print("--------------------------------------------------------------------------------------------------modelo1" )
## [1] "--------------------------------------------------------------------------------------------------modelo1"
ajuste = lm(df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber + df$Sugar+df$Protein+ df$Calcium + df$Nuts)
summary(ajuste)
##
## Call:
## lm(formula = df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol +
## df$Sodium + df$Fiber + df$Sugar + df$Protein + df$Calcium +
## df$Nuts)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.23059 -0.08825 -0.00624 0.08635 0.24494
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.8807142 0.6669725 4.319 0.000529 ***
## df$FatCal -0.0003591 0.5653491 -0.001 0.999501
## df$TotalCal 6.3535730 5.0452681 1.259 0.225979
## df$Cholesterol -0.1156621 0.1327320 -0.871 0.396425
## df$Sodium -0.0463238 0.0455910 -1.016 0.324714
## df$Fiber 1.3838638 2.9774200 0.465 0.648347
## df$Sugar 0.8876057 0.8987289 0.988 0.338038
## df$Protein 1.2204854 2.0112315 0.607 0.552475
## df$Calcium -0.0359198 0.6689241 -0.054 0.957841
## df$Nuts1 -0.0776461 0.0881406 -0.881 0.391395
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1544 on 16 degrees of freedom
## Multiple R-squared: 0.9161, Adjusted R-squared: 0.8689
## F-statistic: 19.41 on 9 and 16 DF, p-value: 5.459e-07
Método BackWard Utilizando o comando step com o método Backward para otimizar o modelo é recomendada a escolha de um modelo em que as variáveis explicativas consideradas são TotalCal, Cholesterol e Sodium.
step(lm(df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber + df$Sugar+df$Protein+ df$Calcium + df$Nuts),direction="backward")
## Start: AIC=-89.77
## df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium +
## df$Fiber + df$Sugar + df$Protein + df$Calcium + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$FatCal 1 0.000000 0.38141 -91.771
## - df$Calcium 1 0.000069 0.38148 -91.767
## - df$Fiber 1 0.005150 0.38656 -91.423
## - df$Protein 1 0.008778 0.39019 -91.180
## - df$Cholesterol 1 0.018101 0.39951 -90.566
## - df$Nuts 1 0.018499 0.39991 -90.540
## - df$Sugar 1 0.023252 0.40466 -90.233
## - df$Sodium 1 0.024611 0.40602 -90.146
## <none> 0.38141 -89.771
## - df$TotalCal 1 0.037804 0.41921 -89.314
##
## Step: AIC=-91.77
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber +
## df$Sugar + df$Protein + df$Calcium + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Calcium 1 0.00007 0.38148 -93.767
## - df$Fiber 1 0.00520 0.38661 -93.419
## - df$Protein 1 0.00887 0.39028 -93.174
## - df$Nuts 1 0.01874 0.40015 -92.524
## - df$Cholesterol 1 0.02285 0.40426 -92.259
## - df$Sugar 1 0.02577 0.40718 -92.072
## - df$Sodium 1 0.02600 0.40741 -92.057
## <none> 0.38141 -91.771
## - df$TotalCal 1 1.30477 1.68618 -55.126
##
## Step: AIC=-93.77
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber +
## df$Sugar + df$Protein + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Fiber 1 0.00559 0.38706 -95.389
## - df$Protein 1 0.00882 0.39030 -95.173
## - df$Nuts 1 0.01878 0.40026 -94.517
## - df$Sugar 1 0.02614 0.40762 -94.043
## - df$Sodium 1 0.02665 0.40813 -94.011
## - df$Cholesterol 1 0.02723 0.40871 -93.974
## <none> 0.38148 -93.767
## - df$TotalCal 1 1.45973 1.84121 -54.840
##
## Step: AIC=-95.39
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar +
## df$Protein + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Protein 1 0.00749 0.39455 -96.891
## - df$Nuts 1 0.01344 0.40051 -96.501
## - df$Sugar 1 0.02102 0.40809 -96.014
## - df$Sodium 1 0.02604 0.41310 -95.696
## <none> 0.38706 -95.389
## - df$Cholesterol 1 0.03477 0.42184 -95.152
## - df$TotalCal 1 1.45480 1.84186 -56.830
##
## Step: AIC=-96.89
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar +
## df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Nuts 1 0.00962 0.40417 -98.265
## - df$Sugar 1 0.01662 0.41117 -97.818
## - df$Sodium 1 0.02007 0.41462 -97.600
## - df$Cholesterol 1 0.02973 0.42428 -97.002
## <none> 0.39455 -96.891
## - df$TotalCal 1 1.99703 2.39158 -52.040
##
## Step: AIC=-98.26
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar
##
## Df Sum of Sq RSS AIC
## - df$Sugar 1 0.02588 0.43005 -98.651
## - df$Sodium 1 0.02772 0.43189 -98.540
## <none> 0.40417 -98.265
## - df$Cholesterol 1 0.04377 0.44794 -97.591
## - df$TotalCal 1 1.98785 2.39202 -54.035
##
## Step: AIC=-98.65
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium
##
## Df Sum of Sq RSS AIC
## <none> 0.4300 -98.651
## - df$Cholesterol 1 0.0513 0.4814 -97.719
## - df$Sodium 1 0.0633 0.4933 -97.082
## - df$TotalCal 1 4.0038 4.4338 -39.990
##
## Call:
## lm(formula = df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium)
##
## Coefficients:
## (Intercept) df$TotalCal df$Cholesterol df$Sodium
## 3.5570 5.9113 -0.1472 -0.0612
Método Forward Com o método forward o modelo recomendado contém as variáveis Totalcal e Sugar.
step(lm(df$Calories ~ 1),direction="forward",scope= ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber + df$Sugar+df$Protein+ df$Calcium + df$Nuts)
## Start: AIC=-43.34
## df$Calories ~ 1
##
## Df Sum of Sq RSS AIC
## + df$TotalCal 1 4.0266 0.5200 -97.714
## + df$FatCal 1 4.0114 0.5352 -96.965
## + df$Protein 1 1.7642 2.7824 -54.105
## + df$Sugar 1 1.7018 2.8447 -53.529
## <none> 4.5465 -43.337
## + df$Nuts 1 0.2855 4.2611 -43.023
## + df$Calcium 1 0.2584 4.2882 -42.858
## + df$Fiber 1 0.2549 4.2916 -42.837
## + df$Sodium 1 0.0859 4.4606 -41.833
## + df$Cholesterol 1 0.0057 4.5409 -41.370
##
## Step: AIC=-97.71
## df$Calories ~ df$TotalCal
##
## Df Sum of Sq RSS AIC
## + df$Sugar 1 0.059917 0.46005 -98.898
## + df$Nuts 1 0.058485 0.46148 -98.817
## + df$Sodium 1 0.038591 0.48137 -97.719
## <none> 0.51996 -97.714
## + df$Cholesterol 1 0.026648 0.49332 -97.082
## + df$Protein 1 0.016046 0.50392 -96.529
## + df$Fiber 1 0.007912 0.51205 -96.113
## + df$FatCal 1 0.006185 0.51378 -96.026
## + df$Calcium 1 0.000020 0.51994 -95.715
##
## Step: AIC=-98.9
## df$Calories ~ df$TotalCal + df$Sugar
##
## Df Sum of Sq RSS AIC
## <none> 0.46005 -98.898
## + df$Cholesterol 1 0.0281613 0.43189 -98.540
## + df$Nuts 1 0.0278427 0.43220 -98.521
## + df$FatCal 1 0.0179377 0.44211 -97.932
## + df$Sodium 1 0.0121044 0.44794 -97.591
## + df$Calcium 1 0.0044108 0.45564 -97.148
## + df$Protein 1 0.0008720 0.45917 -96.947
## + df$Fiber 1 0.0006407 0.45941 -96.934
##
## Call:
## lm(formula = df$Calories ~ df$TotalCal + df$Sugar)
##
## Coefficients:
## (Intercept) df$TotalCal df$Sugar
## 2.671 6.696 1.080
Método Both Utilizando o último método da função step, percebe-se que as variáveis explicativas recomendadas são a Totalcal, Cholesterol e Sodium, como acontece no metodo backward.
step(lm(df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber + df$Sugar+df$Protein+ df$Calcium + df$Nuts),direction="both")
## Start: AIC=-89.77
## df$Calories ~ df$FatCal + df$TotalCal + df$Cholesterol + df$Sodium +
## df$Fiber + df$Sugar + df$Protein + df$Calcium + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$FatCal 1 0.000000 0.38141 -91.771
## - df$Calcium 1 0.000069 0.38148 -91.767
## - df$Fiber 1 0.005150 0.38656 -91.423
## - df$Protein 1 0.008778 0.39019 -91.180
## - df$Cholesterol 1 0.018101 0.39951 -90.566
## - df$Nuts 1 0.018499 0.39991 -90.540
## - df$Sugar 1 0.023252 0.40466 -90.233
## - df$Sodium 1 0.024611 0.40602 -90.146
## <none> 0.38141 -89.771
## - df$TotalCal 1 0.037804 0.41921 -89.314
##
## Step: AIC=-91.77
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber +
## df$Sugar + df$Protein + df$Calcium + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Calcium 1 0.00007 0.38148 -93.767
## - df$Fiber 1 0.00520 0.38661 -93.419
## - df$Protein 1 0.00887 0.39028 -93.174
## - df$Nuts 1 0.01874 0.40015 -92.524
## - df$Cholesterol 1 0.02285 0.40426 -92.259
## - df$Sugar 1 0.02577 0.40718 -92.072
## - df$Sodium 1 0.02600 0.40741 -92.057
## <none> 0.38141 -91.771
## + df$FatCal 1 0.00000 0.38141 -89.771
## - df$TotalCal 1 1.30477 1.68618 -55.126
##
## Step: AIC=-93.77
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Fiber +
## df$Sugar + df$Protein + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Fiber 1 0.00559 0.38706 -95.389
## - df$Protein 1 0.00882 0.39030 -95.173
## - df$Nuts 1 0.01878 0.40026 -94.517
## - df$Sugar 1 0.02614 0.40762 -94.043
## - df$Sodium 1 0.02665 0.40813 -94.011
## - df$Cholesterol 1 0.02723 0.40871 -93.974
## <none> 0.38148 -93.767
## + df$Calcium 1 0.00007 0.38141 -91.771
## + df$FatCal 1 0.00000 0.38148 -91.767
## - df$TotalCal 1 1.45973 1.84121 -54.840
##
## Step: AIC=-95.39
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar +
## df$Protein + df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Protein 1 0.00749 0.39455 -96.891
## - df$Nuts 1 0.01344 0.40051 -96.501
## - df$Sugar 1 0.02102 0.40809 -96.014
## - df$Sodium 1 0.02604 0.41310 -95.696
## <none> 0.38706 -95.389
## - df$Cholesterol 1 0.03477 0.42184 -95.152
## + df$Fiber 1 0.00559 0.38148 -93.767
## + df$Calcium 1 0.00045 0.38661 -93.419
## + df$FatCal 1 0.00006 0.38701 -93.393
## - df$TotalCal 1 1.45480 1.84186 -56.830
##
## Step: AIC=-96.89
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar +
## df$Nuts
##
## Df Sum of Sq RSS AIC
## - df$Nuts 1 0.00962 0.40417 -98.265
## - df$Sugar 1 0.01662 0.41117 -97.818
## - df$Sodium 1 0.02007 0.41462 -97.600
## - df$Cholesterol 1 0.02973 0.42428 -97.002
## <none> 0.39455 -96.891
## + df$Protein 1 0.00749 0.38706 -95.389
## + df$Fiber 1 0.00425 0.39030 -95.173
## + df$Calcium 1 0.00026 0.39429 -94.908
## + df$FatCal 1 0.00000 0.39455 -94.891
## - df$TotalCal 1 1.99703 2.39158 -52.040
##
## Step: AIC=-98.26
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium + df$Sugar
##
## Df Sum of Sq RSS AIC
## - df$Sugar 1 0.02588 0.43005 -98.651
## - df$Sodium 1 0.02772 0.43189 -98.540
## <none> 0.40417 -98.265
## - df$Cholesterol 1 0.04377 0.44794 -97.591
## + df$Nuts 1 0.00962 0.39455 -96.891
## + df$Protein 1 0.00366 0.40051 -96.501
## + df$Fiber 1 0.00027 0.40390 -96.282
## + df$FatCal 1 0.00007 0.40410 -96.269
## + df$Calcium 1 0.00004 0.40413 -96.267
## - df$TotalCal 1 1.98785 2.39202 -54.035
##
## Step: AIC=-98.65
## df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium
##
## Df Sum of Sq RSS AIC
## <none> 0.4300 -98.651
## + df$Sugar 1 0.0259 0.4042 -98.265
## + df$Nuts 1 0.0189 0.4112 -97.818
## - df$Cholesterol 1 0.0513 0.4814 -97.719
## - df$Sodium 1 0.0633 0.4933 -97.082
## + df$Calcium 1 0.0029 0.4271 -96.828
## + df$Fiber 1 0.0025 0.4276 -96.800
## + df$FatCal 1 0.0021 0.4279 -96.780
## + df$Protein 1 0.0001 0.4299 -96.660
## - df$TotalCal 1 4.0038 4.4338 -39.990
##
## Call:
## lm(formula = df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium)
##
## Coefficients:
## (Intercept) df$TotalCal df$Cholesterol df$Sodium
## 3.5570 5.9113 -0.1472 -0.0612
##4.1 REGRESSÃO LINEAR- 1º MODELO
Os 3 métodos do stepwise recomendam 2 modelos distintos. Em baixo é apresentada a avaliação do modelo recomendado nos métodos de backward e both. Pode verificar-se que, segundo o teste T-STUDENT, as variáveis Cholestrol e Sodium não são significativas para o modelo. Porém, as 3 variáveis juntas podem trazer significância para o modelo e, como se pode observar pelo valor de p-value do F-statistic-que é menor que 0.05-, o modelo é significativo. Em relação ao valor do R-Squared, conseguimos perceber que o modelo explica 70,5% dos dados.
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
ajuste=lm( df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium)
summary(ajuste)
##
## Call:
## lm(formula = df$Calories ~ df$TotalCal + df$Cholesterol + df$Sodium)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.58032 -0.13932 0.05357 0.12380 0.40641
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.69173 0.18268 20.209 < 2e-16 ***
## df$TotalCal 4.83532 0.61681 7.839 2.58e-08 ***
## df$Cholesterol -0.01584 0.14498 -0.109 0.914
## df$Sodium -0.03543 0.04621 -0.767 0.450
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2309 on 26 degrees of freedom
## Multiple R-squared: 0.7053, Adjusted R-squared: 0.6713
## F-statistic: 20.74 on 3 and 26 DF, p-value: 4.511e-07
#https://blog.minitab.com/blog/adventures-in-statistics-2/regression-analysis-how-do-i-interpret-r-squared-and-assess-the-goodness-of-fit explica o r squadred
#https://www.investopedia.com/terms/r/r-squared.asp explica o adjusted r squared
Em relação à análise dos resíduos, pode verificar-se no gráfico em baixo que os resíduos passam no critério de homocedisticidade porque estão distribuidos de forma aleatória ao redor dos valores previstos.
plot(ajuste,which=1)
Em relação ao teste de shapiro pode verificar-se que o valor do p-value é maior que 0.05, ou seja, os resíduos seguem uma distribuição normal. O gráfico em baixo também prova a normalidade dos residuos.
plot(ajuste,which=2)
shapiro.test(ajuste$residuals)
##
## Shapiro-Wilk normality test
##
## data: ajuste$residuals
## W = 0.95597, p-value = 0.2436
hist(x = ajuste$residuals, col = 'grey', xlab = 'Resíduos', ylab = 'Densidade de Probabilidade',
probability = TRUE)
lines(density(ajuste$residuals))
Como se pode verificar nos gráficos em baixo, os resíduos apresentam uma observação que não corresponde ao modelo linear, ou seja, um outlier, o que mostra um mau indício para a escolha do modelo.
plot(ajuste,which=4)
plot(ajuste,which=5)
As variáveis explicativas passam no teste de independência ou seja, o modelo não apresenta problemas de multicolineariadade.
df1=data.frame(df$TotalCal,df$Cholesterol,df$Sodium)
require(faraway)
vif(df1)
## df.TotalCal df.Cholesterol df.Sodium
## 1.001282 1.052914 1.051703
##4.2 REGRESSÃO LINEAR- 2º MODELO
O Modelo recomendado pelo método de Forward considera como variáveis independentes as variáveis TotalCal e Sugar. Podemos ver no summary do modelo que, segundo o teste T-STUDENT, a variável TotalCal é uma variavel significativa e a variável Sugar não é significativa num intervalo de confiança de 95%. Segundo o F-statistic, o modelo é significativo e o R-Squared diz-nos que o modelo explica cerca de 90% dos dados.
setwd("C:/Users/Luis/Desktop/trabalho analise cluster")
df <- read.csv2( "candy-bars.csv",header=TRUE, sep=";", dec="." )
df=df[,-1]
df[,10]=as.factor(df$Nuts)
ajuste=lm( df$Calories ~ df$TotalCal + df$Sugar)
summary(ajuste)
##
## Call:
## lm(formula = df$Calories ~ df$TotalCal + df$Sugar)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.275595 -0.095791 -0.006219 0.108838 0.212234
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.6710 0.4498 5.939 4.70e-06 ***
## df$TotalCal 6.6963 0.6133 10.919 1.42e-10 ***
## df$Sugar 1.0800 0.6240 1.731 0.0969 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1414 on 23 degrees of freedom
## (4 observations deleted due to missingness)
## Multiple R-squared: 0.8988, Adjusted R-squared: 0.89
## F-statistic: 102.2 on 2 and 23 DF, p-value: 3.622e-12
#https://blog.minitab.com/blog/adventures-in-statistics-2/regression-analysis-how-do-i-interpret-r-squared-and-assess-the-goodness-of-fit explica o r squadred
#https://www.investopedia.com/terms/r/r-squared.asp explica o adjusted r squared
Em relação à análise de resíduos, pode verificar-se no gráfico em baixo que os resíduos passam no teste de homocedisticiedade porque estão distribuidos de forma aleatória ao redor dos valores previstos.
plot(ajuste,which=1)
Relativamente ao teste de shapiro pode verificar-se que o valor do p-value é maior que 0.05, ou seja, os resíduos seguem uma distribuição normal. O gráfico em baixo prova, ainda, a normalidade dos resíduos.
shapiro.test(ajuste$residuals)
##
## Shapiro-Wilk normality test
##
## data: ajuste$residuals
## W = 0.96654, p-value = 0.536
plot(ajuste,which=2)
hist(x = ajuste$residuals, col = 'grey', xlab = 'Resíduos', ylab = 'Densidade de Probabilidade',
probability = TRUE)
lines(density(ajuste$residuals))
Neste modelo não existem de outliers, ou seja, todos os valores são considerados.
plot(ajuste,which=4)
plot(ajuste,which=5)
As variáveis explicativas passam no teste de independência, ou seja, o modelo não apresenta problemas de multicolineariadade.
df1=data.frame(df$TotalCal,df$Sugar)
require(faraway)
vif(df1)
## df.TotalCal df.Sugar
## 2.161745 2.161745
##5 ESCOLHA E TESTES DE PREDIÇÃO
Depois da análise dos dois modelos, conclui-se que ambos são adequados, mas que o Modelo 2 é o mais favorável para a representação dos dados. Os fatores que contribuem para esta escolha são o valor do AIC ser mais pequeno, a não existência de outliers e o facto de o R-SQUARED ser superior. Em baixo são apresentados os coeficientes do modelo de regressão escolhido.
ajuste$coefficients
## (Intercept) df$TotalCal df$Sugar
## 2.670988 6.696344 1.080041
A coluna fit mostra a previsão realizada pelo modelo e pode-se comparar à coluna Calories que tem os valores reais.
pred <- data.frame(TotalCal=df$TotalCal,Sugar=df$Sugar)
ypred <- predict(ajuste, newdata = pred, interval = "confidence")
pred <- cbind(pred,Calories=df$Calories, fit=ypred[1,],dif=abs(df$Calories-ypred[1,]))
## Warning in data.frame(..., check.names = FALSE): row names were found from
## a short variable and have been discarded
pred
## TotalCal Sugar Calories fit dif
## 1 0.26530612 0.4897959 4.795918 4.976569 0.18065078
## 2 0.23214286 0.4642857 4.821429 4.910300 0.08887168
## 3 0.20000000 0.5714286 4.628571 5.042838 0.41426668
## 4 0.35897436 0.4358974 5.512821 4.976569 0.53625132
## 5 0.27272727 0.5454545 5.200000 4.910300 0.28969972
## 6 0.30952381 0.4047619 5.214286 5.042838 0.17144762
## 7 0.13043478 0.6521739 4.173913 4.976569 0.80265618
## 8 0.17391304 0.6086957 4.217391 4.910300 0.69290898
## 9 0.16000000 0.6000000 4.480000 5.042838 0.56283808
## 10 0.19298246 0.4912281 4.666667 4.976569 0.30990248
## 11 0.24561404 0.4736842 4.982456 4.910300 0.07215582
## 12 0.24000000 0.5200000 4.660000 5.042838 0.38283808
## 13 0.18604651 0.5348837 4.465116 4.976569 0.51145288
## 14 0.23809524 0.4761905 4.619048 4.910300 0.29125268
## 15 0.20000000 0.5333333 4.755556 5.042838 0.28728248
## 16 0.27500000 0.5500000 5.225000 4.976569 0.24843082
## 17 0.31111111 0.4666667 5.155556 4.910300 0.24525532
## 18 0.20833333 0.6458333 4.750000 5.042838 0.29283808
## 19 0.23214286 0.5357143 4.732143 4.976569 0.24442628
## 20 0.06976744 0.6279070 3.837209 4.910300 1.07309098
## 21 0.26829268 0.5365854 5.121951 5.042838 0.07911312
## 22 0.34250000 NA 4.875000 4.976569 0.10156918
## 23 0.36000000 NA 5.000000 4.910300 0.08969972
## 24 0.26571429 0.5114286 4.885714 5.042838 0.15712378
## 25 0.35294118 0.4117647 5.294118 4.976569 0.31754842
## 26 0.28666667 0.5777778 5.177778 4.910300 0.26747752
## 27 0.26666667 NA 4.755556 5.042838 0.28728248
## 28 0.34000000 0.5000000 5.700000 4.976569 0.72343082
## 29 0.26000000 0.5400000 5.200000 4.910300 0.28969972
## 30 0.30000000 NA 4.500000 5.042838 0.54283808