#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