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)
<- mtcars coches
PREGUNTA 2. A continuación, transforma en factor la variables
am
.
$am <- factor(coches$am,
cocheslevels = c(0,1),
labels = c("automático","manual"))
PREGUNTA 3. Elabora un gráfico de caja y bigotes que relacione las
variable am
y 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[coches$am == "automático", ]
coches.automáticos <- coches[coches$am == "manual", ] coches.manuales
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
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)
<- airquality aq
PREGUNTA 2. Transforma en factor la variables Month
.
$Month <- as.factor(aq$Month) aq
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.
<- aggregate(Ozone ~ Month, data = aq, mean)
ozono.mes <- aggregate(Solar.R ~ Month, data = aq, mean)
solar.r.mes <- aggregate(Wind ~ Month, data = aq, mean)
viento.mes <- aggregate(Temp ~ Month, data = aq, mean)
tem.mes <- 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) tabla.resumen
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.
<- aov(Ozone ~ Month, data = aq)
resultados.anova.ozono 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(resultados.anova.ozono)
residuals.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[ , c(4:6, 8, 10:13)] Ozone
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.
<- median(Ozone$V4,
mediana_V4 na.rm = TRUE)
<- within(Ozone,{
Ozone <- NA
categorias_ozono < mediana_V4] <- "Menor"
categorias_ozono[V4 >= mediana_V4]<- "Mayor o igual"}) categorias_ozono[V4
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(V5 ~ categorias_ozono,
aov_z500 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(V10 ~ categorias_ozono,
aov_inversion 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(V13 ~ categorias_ozono,
aov_visib 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:
<- quantile(Ozone$V5,
cuartiles_V5 probs = c(0,0.25,0.50,0.75,1),
na.rm=TRUE)
$categorias_z500 <- cut(Ozone$V5,
Ozonebreaks = cuartiles_V5,
include.lowest = TRUE,
labels = c("q1","q2","q3","q4"))
• [6] Wind speed (mph) at Los Angeles International Airport (LAX).
<- aov(V6 ~ categorias_z500,
aov_viento 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
<- leveneTest(V6 ~ categorias_z500,
levene_V6 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(V8 ~ categorias_z500,
aov_tem 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
<- leveneTest(V8 ~ categorias_z500,
levene_V8 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(V8 ~ categorias_z500,
aov_inversion 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
<- leveneTest(V8 ~ categorias_z500,
levene_V8 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