1 EJERCICIO 1

El dataset “mtcars” contiene los detalles técnicos de los conches disponibles en un concesionario de automóviles. Las variables de este dataset que nos interesan son las siguientes:

Aunque en España no son habituales los conches de transmisión automática, se considera que son más cómodos y tienen una menor propensión a sufrir daños mecánicos. En este apartado analizaremos además si tienen ventaja sobre los coches de transmisión manual en los apartados consumo (mpg) y aceleración (qsec)

PREGUNTA 1. En primer lugar, carga el fichero mtcars y crea con él un objeto denominado coches.

data(mtcars)
coches <- mtcars

PREGUNTA 2. A continuación, transforma en factor la variables am.

coches$am <- factor(coches$am, 
                    levels = c(0,1),
                    labels = c("automático","manual"))

PREGUNTA 3. Elabora un gráfico de caja y bigotes que relacione las variable amy mpg. Incluye una línea que corresponda al valor mediano de mpg

boxplot(mpg ~ am,
        coches)
abline(h = median(coches$mpg), col = 2, lwd = 2)                               

PREGUNTA 4. Construye un gráfico de violín que represente el consumo en función del tipo de transmisión. Para ello, deberás crear dos subconjuntos en función del tipo de transmisión. Posteriormente, elabora el gráfico de violín. Incluye una leyenda a tu gusto.

coches.automáticos <- coches[coches$am == "automático",  ]
coches.manuales <- coches[coches$am == "manual",  ]
library("vioplot")
## Loading required package: sm
## Package 'sm', version 2.2-5.7: type help(sm) for summary information
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
vioplot(coches.automáticos$mpg,
        plotCentre = "line",                               # Mediana con una línea
        side = "right",                                    # Lado derecho
        col = "#5773CC",
        xlab = "Consumo del vehículo",  
        ylim = c(0, 50))                                  # Color del lado derecho
vioplot(coches.manuales$mpg,
        plotCentre = "line",                               # Mediana con una línea
        side = "left",                                     # Lado izquierdo
        col = "#FFB900",                                   # Color del lado izquierdo
        add = TRUE)                                        # Sobre el gráfico anterior

legend("topleft",
       legend = c("Coches.automáticos", "Coches.manuales"),
       fill = c("#5773CC", "#FFB900"))

PREGUNTA 5. Aplica la prueba de la t de Student para determinar si hay diferencias significativas en el consumo de los vehículos en función del tipo de transmisión. ¿Es estadísticamente significativo el consumo medio en función del tipo de transmisión? En consecuencia, ¿qué vehículo recomendarías?

t.test(mpg ~ am, 
       data = coches, 
       var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  mpg by am
## t = -4.1061, df = 30, p-value = 0.000285
## alternative hypothesis: true difference in means between group automático and group manual is not equal to 0
## 95 percent confidence interval:
##  -10.84837  -3.64151
## sample estimates:
## mean in group automático     mean in group manual 
##                 17.14737                 24.39231

PREGUNTA 6. Para estar seguro de los resultados, compruébalo mediante la aplicación de la prueba de Wilcoxon.

wilcox.test(mpg ~ am, 
            data = coches)
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): cannot
## compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  mpg by am
## W = 42, p-value = 0.001871
## alternative hypothesis: true location shift is not equal to 0

PREGUNTA 7. comprueba que la variable mpg sigue una distribución normal aplicando la prueba de Shapiro

shapiro.test(coches$mpg) 
## 
##  Shapiro-Wilk normality test
## 
## data:  coches$mpg
## W = 0.94756, p-value = 0.1229

Dibuja igualmente un gráfico Q-Q.

qqnorm (coches$mpg)                #create el gráfico
qqline (coches$mpg)                # añade la línea diagonal

PREGUNTA 8. Analiza igualmente si la varianza de mpg en los dos grupos creados por el factor am es similar.

var.test(mpg ~ am, 
         data = coches)
## 
##  F test to compare two variances
## 
## data:  mpg by am
## F = 0.38656, num df = 18, denom df = 12, p-value = 0.06691
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.1243721 1.0703429
## sample estimates:
## ratio of variances 
##          0.3865615

PREGUNTA 9. Repite la aplicación de la prueba t de Student para verificar si el tipo de transmisión (variable am) influye también en la aceleración del vehículo (variable qsec). A partir de los resultados de la prueba, ¿influye o no?

t.test(qsec ~ am, 
       data = coches, 
       var.equal = TRUE)
## 
##  Two Sample t-test
## 
## data:  qsec by am
## t = 1.2936, df = 30, p-value = 0.2057
## alternative hypothesis: true difference in means between group automático and group manual is not equal to 0
## 95 percent confidence interval:
##  -0.4763645  2.1226803
## sample estimates:
## mean in group automático     mean in group manual 
##                 18.18316                 17.36000

2 EJERCICIO 2

El conjunto de datos airqulity muestra los valores diarios de ozono y de diferentes variables meteorológicas en Nueva York, entre mayo y septiembre de 1973. El objetivo de esta práctica es comprobar si existen diferencias significativas entre esas variables en función del mes en el que se obtuvieron.

PREGUNTA 1. Para ello, comenzamos cargando el dataset y creando un objeto denominado aq.

data(airquality)
aq <- airquality

PREGUNTA 2. Transforma en factor la variables Month.

aq$Month <- as.factor(aq$Month)

PREGUNTA 3. Calcula el valor de cada una de las variables cuantitativas en función del mes y crea con todos los resultados un dataframe denomando tabla.resumen. Transforma los registros de temperatura de ºF a ºC y procura que este dataframe no repita varias columnas idénticas con los meses.

ozono.mes <- aggregate(Ozone ~ Month, data = aq, mean)
solar.r.mes <- aggregate(Solar.R ~ Month, data = aq, mean)
viento.mes <- aggregate(Wind ~ Month, data = aq, mean)
tem.mes <- aggregate(Temp ~ Month, data = aq, mean)
tabla.resumen <- cbind(ozono.mes, solar.r.mes, viento.mes, tem.mes)
tabla.resumen <- tabla.resumen[ , -c(3, 5, 7)]
tabla.resumen$Temp <- (5/9)*(tabla.resumen$Temp - 32)

PREGUNTA 4. Dibuja un gráfico de caja y bigotes que muestre los valores mensuales de la variable Ozone y su valor medio durante el periodo de análisis.

boxplot(Ozone ~ Month,
        data = aq)
abline(h = mean(aq$Ozone), col = 2, lwd = 2)                               

PREGUNTA 5. Para comprobar si existe alguna diferencia significativa entre el valor promedio de ozono en cada mes se debe aplicar un análisis ANOVA. Realiza este análisis e interpreta su resultado.

resultados.anova.ozono <- aov(Ozone ~ Month, data = aq)                 
summary(resultados.anova.ozono)                                               
##              Df Sum Sq Mean Sq F value   Pr(>F)    
## Month         4  29438    7359   8.536 4.83e-06 ***
## Residuals   111  95705     862                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 37 observations deleted due to missingness

¿Qué meses muestran una diferencia significativa con los restantes?

TukeyHSD(resultados.anova.ozono)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Ozone ~ Month, data = aq)
## 
## $Month
##            diff         lwr       upr     p adj
## 6-5   5.8290598 -25.6630930 37.321213 0.9858842
## 7-5  35.5000000  12.9158068 58.084193 0.0002795
## 8-5  36.3461538  13.7619606 58.930347 0.0001869
## 9-5   7.8328912 -14.1594735 29.825256 0.8603562
## 7-6  29.6709402  -1.8212127 61.163093 0.0749128
## 8-6  30.5170940  -0.9750588 62.009247 0.0622826
## 9-6   2.0038314 -29.0666371 33.074300 0.9997676
## 8-7   0.8461538 -21.7380394 23.430347 0.9999733
## 9-7 -27.6671088 -49.6594735 -5.674744 0.0061535
## 9-8 -28.5132626 -50.5056273 -6.520898 0.0043387

PREGUNTA 6. Comprueba si los residuos del model ANOVA se distribuyen según una curva normal.

plot(resultados.anova.ozono, 2)

PREGUNTA 7. Esa conclusión puede reforzarse aplicando la prueba de Shapiro-Wilk test a esos mismos resíduos. ¿Qué criterio sirve para establecer la significación estadística de esta prueba?

residuals.anova.ozono <- residuals(resultados.anova.ozono)
shapiro.test(residuals.anova.ozono)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuals.anova.ozono
## W = 0.93213, p-value = 1.793e-05
kruskal.test(Ozone ~ Month,
        data = aq)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Ozone by Month
## Kruskal-Wallis chi-squared = 29.267, df = 4, p-value = 6.901e-06

EJERCICIO 3. El dataset “Ozone”, incluido en el paquete mlbench, consiste en un dataframe con 366 observaciones de 13 variables realizadas en la ciudad de Los Ángeles, en el año 1976, correspondiendo cada observación a un día. Se puede acceder al mismo desde R con los siguientes comandos:

library(mlbench)
## Warning: package 'mlbench' was built under R version 4.3.2
data(Ozone)
str(Ozone)
## 'data.frame':    366 obs. of  13 variables:
##  $ V1 : Factor w/ 12 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ V2 : Factor w/ 31 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
##  $ V3 : Factor w/ 7 levels "1","2","3","4",..: 4 5 6 7 1 2 3 4 5 6 ...
##  $ V4 : num  3 3 3 5 5 6 4 4 6 7 ...
##  $ V5 : num  5480 5660 5710 5700 5760 5720 5790 5790 5700 5700 ...
##  $ V6 : num  8 6 4 3 3 4 6 3 3 3 ...
##  $ V7 : num  20 NA 28 37 51 69 19 25 73 59 ...
##  $ V8 : num  NA 38 40 45 54 35 45 55 41 44 ...
##  $ V9 : num  NA NA NA NA 45.3 ...
##  $ V10: num  5000 NA 2693 590 1450 ...
##  $ V11: num  -15 -14 -25 -24 25 15 -33 -28 23 -2 ...
##  $ V12: num  30.6 NA 47.7 55 57 ...
##  $ V13: num  200 300 250 100 60 60 100 250 120 120 ...

PREGUNTA 1. De ese dataframe extrae un subconjunto con las variables • [4] Daily maximum one-hour-average ozone reading. • [5] 500 millibar pressure height (m) measured at Vandenberg AFB. • [6] Wind speed (mph) at Los Angeles International Airport (LAX). • [8] Temperature (degrees F) measured at Sandburg, CA. • [10] Inversion base height (feet) at LAX. • [11] Pressure gradient (mm Hg) from LAX to Daggett, CA. • [12] Inversion base temperature (degrees F) at LAX. • [13] Visibility (miles) measured at LAX.

Ozone <- Ozone[ , c(4:6, 8, 10:13)]

PREGUNTA 2. Calcula el valor de la mediana de la variable Daily maximum one-hour-average ozone reading y crea una nueva variable en la que el valor 1 corresponda a registros inferiores a la mediana, y el valor 2 consista en los registros iguales o superiores a la mediana.

mediana_V4 <- median(Ozone$V4,
       na.rm = TRUE)

Ozone <- within(Ozone,{
  categorias_ozono <- NA  
  categorias_ozono[V4 < mediana_V4] <- "Menor"         
  categorias_ozono[V4 >= mediana_V4]<- "Mayor o igual"})

PREGUNTA 3: Calcula si existen diferencias significativas, en función de las categorías de esa nueva variable, en los valores medios de las siguientes variables:

• [5] 500 millibar pressure height (m) measured at Vandenberg AFB.

aov_z500 <- aov(V5 ~ categorias_ozono, 
               data = Ozone)
summary(aov_z500) 
##                   Df  Sum Sq Mean Sq F value Pr(>F)    
## categorias_ozono   1  884967  884967   103.2 <2e-16 ***
## Residuals        347 2976399    8578                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 17 observations deleted due to missingness
TukeyHSD(aov_z500)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V5 ~ categorias_ozono, data = Ozone)
## 
## $categorias_ozono
##                          diff       lwr       upr p adj
## Menor-Mayor o igual -101.2827 -120.8945 -81.67089     0

• [10] Inversion base height (feet) at LAX.

aov_inversion <- aov(V10 ~ categorias_ozono, 
               data = Ozone)
summary(aov_inversion) 
##                   Df    Sum Sq   Mean Sq F value Pr(>F)    
## categorias_ozono   1 338104104 338104104   148.3 <2e-16 ***
## Residuals        344 784165425   2279551                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 20 observations deleted due to missingness
TukeyHSD(aov_inversion)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V10 ~ categorias_ozono, data = Ozone)
## 
## $categorias_ozono
##                         diff      lwr      upr p adj
## Menor-Mayor o igual 1987.837 1666.797 2308.877     0

• [13] Visibility (miles) measured at LAX.

aov_visib <- aov(V13 ~ categorias_ozono, 
               data = Ozone)
summary(aov_visib) 
##                   Df  Sum Sq Mean Sq F value   Pr(>F)    
## categorias_ozono   1  319339  319339   56.94 3.73e-13 ***
## Residuals        359 2013268    5608                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 5 observations deleted due to missingness
TukeyHSD(aov_visib)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V13 ~ categorias_ozono, data = Ozone)
## 
## $categorias_ozono
##                         diff      lwr      upr p adj
## Menor-Mayor o igual 59.76582 44.19019 75.34144     0

PREGUNTA 4. Representa gráficamente esas diferencias mediante gráficos de caja y bigotes.

par(mfrow=c(2, 2))
boxplot(V5 ~ categorias_ozono,
        data = Ozone,
        main = "z500 vs ozono",
        xlab = "Categorías",
        ylab = "hPa")

boxplot(V10 ~ categorias_ozono,
        data = Ozone,
        main = "Inversion vs ozono",
        xlab = "Categorías",
        ylab = "Metros")

boxplot(V13 ~ categorias_ozono,
        data = Ozone,
        main = "Visibilidad vs ozono",
        xlab = "Categorías",
        ylab = "Km")

dev.off()
## null device 
##           1

PREGUNTA 5. Repite el procedimiento anterior con la variable [V5], pero en vez de usar la mediana, utiliza los cuartiles, de tal manera que la nueva variable tendrá 4 niveles (1, 2, 3, 4). Calcula existen diferencias significativas, en función de las categorías de esa nueva variable, en los valores medios y en la varianza de:

cuartiles_V5 <- quantile(Ozone$V5,                    
                      probs = c(0,0.25,0.50,0.75,1),  
                      na.rm=TRUE)                      

Ozone$categorias_z500 <- cut(Ozone$V5,
                             breaks = cuartiles_V5, 
                             include.lowest = TRUE,
                             labels = c("q1","q2","q3","q4"))

• [6] Wind speed (mph) at Los Angeles International Airport (LAX).

aov_viento <- aov(V6 ~ categorias_z500, 
               data = Ozone)
summary(aov_viento) 
##                  Df Sum Sq Mean Sq F value  Pr(>F)   
## categorias_z500   3   54.3  18.093   4.166 0.00643 **
## Residuals       350 1520.2   4.343                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 12 observations deleted due to missingness
TukeyHSD(aov_viento)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V6 ~ categorias_z500, data = Ozone)
## 
## $categorias_z500
##             diff        lwr         upr     p adj
## q2-q1 -1.0033256 -1.7840994 -0.22255179 0.0055234
## q3-q1 -0.6087269 -1.4055579  0.18810406 0.2005854
## q4-q1 -0.8329368 -1.6511409 -0.01473279 0.0442276
## q3-q2  0.3945986 -0.4102451  1.19944240 0.5854744
## q4-q2  0.1703888 -0.6556207  0.99639825 0.9511174
## q4-q3 -0.2242099 -1.0654136  0.61699377 0.9016326
library(car)
## Loading required package: carData
levene_V6 <- leveneTest(V6 ~ categorias_z500, 
                  data = Ozone)

levene_V6
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   3  1.5989 0.1894
##       350

• [8] Temperature (degrees F) measured at Sandburg, CA.

aov_tem <- aov(V8 ~ categorias_z500, 
               data = Ozone)
summary(aov_tem) 
##                  Df Sum Sq Mean Sq F value Pr(>F)    
## categorias_z500   3  43463   14488   179.7 <2e-16 ***
## Residuals       348  28050      81                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 14 observations deleted due to missingness
TukeyHSD(aov_tem)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V8 ~ categorias_z500, data = Ozone)
## 
## $categorias_z500
##            diff       lwr      upr   p adj
## q2-q1 11.682971  8.301572 15.06437 0.0e+00
## q3-q1 18.541667 15.100562 21.98277 0.0e+00
## q4-q1 30.964744 27.431783 34.49770 0.0e+00
## q3-q2  6.858696  3.382422 10.33497 3.4e-06
## q4-q2 19.281773 15.714549 22.84900 0.0e+00
## q4-q3 12.423077  8.799208 16.04695 0.0e+00
levene_V8 <- leveneTest(V8 ~ categorias_z500, 
                  data = Ozone)

levene_V8
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   3  0.0938 0.9634
##       348

• [12] Inversion base temperature (degrees F) at LAX.

aov_inversion <- aov(V8 ~ categorias_z500, 
               data = Ozone)
summary(aov_inversion) 
##                  Df Sum Sq Mean Sq F value Pr(>F)    
## categorias_z500   3  43463   14488   179.7 <2e-16 ***
## Residuals       348  28050      81                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 14 observations deleted due to missingness
TukeyHSD(aov_inversion)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = V8 ~ categorias_z500, data = Ozone)
## 
## $categorias_z500
##            diff       lwr      upr   p adj
## q2-q1 11.682971  8.301572 15.06437 0.0e+00
## q3-q1 18.541667 15.100562 21.98277 0.0e+00
## q4-q1 30.964744 27.431783 34.49770 0.0e+00
## q3-q2  6.858696  3.382422 10.33497 3.4e-06
## q4-q2 19.281773 15.714549 22.84900 0.0e+00
## q4-q3 12.423077  8.799208 16.04695 0.0e+00
levene_V8 <- leveneTest(V8 ~ categorias_z500, 
                  data = Ozone)

levene_V8
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   3  0.0938 0.9634
##       348