library(dplyr)
library(ggplot2)
library(tidyr)
library(infer)
library(broom)
library(readxl)
citric <- read_excel("citricos.xlsx")
# Mostrar cantidad de variables y observaciones
cat("• Cantidad de Variables:", ncol(citric), "\n")
## • Cantidad de Variables: 17
cat("• Cantidad de Observaciones:", nrow(citric), "\n")
## • Cantidad de Observaciones: 750
Categóricas: variedad, color_nivel; color_desc; madurez; danio_nivel; danio_desc; fertilizante; insecticida; plaga.
Numéricas: peso_antes; diametro_antes; peso_despues; diametro_despues; humedad_suelo; acidez; contenido_brix.
summary(citric[, c("peso_antes", "peso_despues", "diametro_antes", "diametro_despues", "acidez", "contenido_brix")])
## peso_antes peso_despues diametro_antes diametro_despues
## Min. :105.0 Min. :113.2 Min. :46.10 Min. :51.20
## 1st Qu.:140.7 1st Qu.:143.3 1st Qu.:54.00 1st Qu.:60.60
## Median :158.9 Median :156.1 Median :56.30 Median :63.80
## Mean :156.6 Mean :157.2 Mean :57.50 Mean :64.46
## 3rd Qu.:172.0 3rd Qu.:171.6 3rd Qu.:59.88 3rd Qu.:68.08
## Max. :201.4 Max. :210.3 Max. :73.50 Max. :77.90
## acidez contenido_brix
## Min. :0.6000 Min. : 8.02
## 1st Qu.:0.9025 1st Qu.: 9.82
## Median :1.0500 Median :10.69
## Mean :1.0362 Mean :10.61
## 3rd Qu.:1.1700 3rd Qu.:11.53
## Max. :1.4000 Max. :13.00
citric %>%
summarise(
media_peso_antes = mean(peso_antes, na.rm = TRUE),
sd_peso_antes = sd(peso_antes, na.rm = TRUE),
media_peso_despues = mean(peso_despues, na.rm = TRUE),
sd_peso_despues = sd(peso_despues, na.rm = TRUE),
media_diametro_antes = mean(diametro_antes, na.rm = TRUE),
sd_diametro_antes = sd(diametro_antes, na.rm = TRUE),
media_diametro_despues = mean(diametro_despues, na.rm = TRUE),
sd_diametro_despues = sd(diametro_despues, na.rm = TRUE),
media_acidez = mean(acidez, na.rm = TRUE),
sd_acidez = sd(acidez, na.rm = TRUE),
media_brix = mean(contenido_brix, na.rm = TRUE),
sd_brix = sd(contenido_brix, na.rm = TRUE)
)
## # A tibble: 1 × 12
## media_peso_antes sd_peso_antes media_peso_despues sd_peso_despues
## <dbl> <dbl> <dbl> <dbl>
## 1 157. 19.1 157. 18.0
## # ℹ 8 more variables: media_diametro_antes <dbl>, sd_diametro_antes <dbl>,
## # media_diametro_despues <dbl>, sd_diametro_despues <dbl>,
## # media_acidez <dbl>, sd_acidez <dbl>, media_brix <dbl>, sd_brix <dbl>
# Convertir datos a formato largo con nombres exactos de las variables
peso_largo <- citric %>%
select(peso_antes, peso_despues) %>%
pivot_longer(cols = everything(), names_to = "momento", values_to = "peso")
# Boxplot comparativo
ggplot(peso_largo, aes(x = momento, y = peso)) +
geom_boxplot(fill = "gray", color = "black") +
labs(title = "Comparación de peso antes y después",
x = "Momento de medición",
y = "Peso (g)") +
theme_minimal() +
theme(
axis.text.x = element_text(color = "black"),
axis.text.y = element_text(color = "black"),
axis.title.x = element_text(color = "black", face = "bold"),
axis.title.y = element_text(color = "black", face = "bold"),
plot.title = element_text(color = "black", face = "bold", hjust = 0.5),
axis.line = element_line(color = "orange"),
axis.ticks = element_line(color = "orange")
)
# Convertir datos a formato largo con nombres exactos de las variables
diametros_largo <- citric %>%
select(diametro_antes, diametro_despues) %>%
pivot_longer(cols = everything(), names_to = "momento", values_to = "diametro")
# Boxplot comparativo
ggplot(diametros_largo, aes(x = momento, y = diametro)) +
geom_boxplot(fill = "gray", color = "black") +
labs(title = "Comparación de diámetro antes y después",
x = "Momento de medición",
y = "Diámetro (mm)") +
theme_minimal() +
theme(
axis.text.x = element_text(color = "black"),
axis.text.y = element_text(color = "black"),
axis.title.x = element_text(color = "black", face = "bold"),
axis.title.y = element_text(color = "black", face = "bold"),
plot.title = element_text(color = "black", face = "bold", hjust = 0.5),
axis.line = element_line(color = "orange"),
axis.ticks = element_line(color = "orange")
)
ggplot(citric, aes(y = acidez)) +
geom_boxplot(fill = "gray", color = "black") +
labs(title = "Acidez", y = "Acidez (%)", x = "") +
theme_minimal() +
theme(
axis.text.y = element_text(color = "black"),
axis.title.y = element_text(color = "black", face = "bold"),
axis.title.x = element_text(color = "black", face = "bold"),
plot.title = element_text(color = "black", face = "bold", hjust = 0.5),
axis.line = element_line(color = "orange"),
axis.ticks = element_line(color = "orange")
)
ggplot(citric, aes(y = contenido_brix)) +
geom_boxplot(fill = "gray", color = "black") +
labs(title = "Contenido brix de los citricos", y = "°Brix", x = "") +
theme_minimal() +
theme(
axis.text.y = element_text(color = "black"),
axis.title.y = element_text(color = "black", face = "bold"),
axis.title.x = element_text(color = "black", face = "bold"),
plot.title = element_text(color = "black", face = "bold", hjust = 0.5),
axis.line = element_line(color = "orange"),
axis.ticks = element_line(color = "orange")
)
install.packages("ggpubr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(ggpubr) # Para test de normalidad visual y más
library(stats) # Fun
Queremos probar si el contenido de azúcar (grados Brix) supera los 10° Brix, por lo tanto:
Hipótesis nula (H₀): μ ≤ 10
Hipótesis alternativa (H₁): μ > 10
Es una prueba unilateral a la derecha.
# Extraer los valores de contenido Brix
brix <- citric$contenido_brix %>% na.omit()
# Calcular media observada
media_brix <- mean(brix)
cat("Media observada del contenido Brix:", round(media_brix, 2), "\n")
## Media observada del contenido Brix: 10.61
# Realizar prueba t de una muestra (unilateral: H1 -> media > 10)
prueba_t <- t.test(brix, mu = 10, alternative = "greater")
# Mostrar resultados
print(prueba_t)
##
## One Sample t-test
##
## data: brix
## t = 14.026, df = 749, p-value < 2.2e-16
## alternative hypothesis: true mean is greater than 10
## 95 percent confidence interval:
## 10.5353 Inf
## sample estimates:
## mean of x
## 10.60652
# Interpretación
if (prueba_t$p.value < 0.05) {
cat("Conclusión: Se rechaza H0. El contenido Brix es significativamente mayor a 10.\n")
} else {
cat("Conclusión: No se rechaza H0. No hay evidencia suficiente para afirmar que el contenido Brix supere los 10 grados.\n")
}
## Conclusión: Se rechaza H0. El contenido Brix es significativamente mayor a 10.
`
ggdensity(citric$contenido_brix,
main = "Densidad de grados Brix",
xlab = "Brix")
Interpretación: La curva presenta una forma asimétrica a la derecha (sesgo negativo leve): hay una ligera inclinación hacia valores más bajos de Brix. No se observan picos marcadamente separados (no es multimodal), pero la distribución no es perfectamente simétrica.Esto sugiere una distribución levemente sesgada, posiblemente no normal.
ggqqplot(citric$contenido_brix,
title = "QQ plot de grados Brix")
Interpretación: La mayoría de los puntos sigue la
línea diagonal, lo que indica que la distribución es aproximadamente
normal en el centro. Sin embargo, en los extremos (colas) hay
desviaciones: En la cola inferior (izquierda), los puntos caen por
debajo de la línea → posible presencia de valores bajos más extremos que
los esperados bajo normalidad. En la cola superior (derecha), los puntos
se sitúan por encima de la línea → indica valores altos levemente
extremos también. Este patrón es típico de una distribución ligeramente
leptocúrtica (colas más pesadas que una normal).
shapiro.test(citric$contenido_brix)
##
## Shapiro-Wilk normality test
##
## data: citric$contenido_brix
## W = 0.98193, p-value = 5.368e-08
Si p > 0.05, los datos son normales → podés usar t-test.
Si p ≤ 0.05, los datos no son normales → usá prueba de Wilcoxon.
En este caso se debe usar la prueba de Wilcoxon, que es no paramétrica y adecuada para muestras que no siguen distribución normal.
wilcox.test(citric$contenido_brix, mu = 10, alternative = "greater")
##
## Wilcoxon signed rank test with continuity correction
##
## data: citric$contenido_brix
## V = 210672, p-value < 2.2e-16
## alternative hypothesis: true location is greater than 10
#### prueba de Wilcoxon
prueba <- wilcox.test(citric$contenido_brix, mu = 10, alternative = "greater")
metodo <- prueba$method
#### Mostrar resultados
cat("Método usado:", metodo, "\n")
## Método usado: Wilcoxon signed rank test with continuity correction
print(prueba)
##
## Wilcoxon signed rank test with continuity correction
##
## data: citric$contenido_brix
## V = 210672, p-value < 2.2e-16
## alternative hypothesis: true location is greater than 10
#### Interpretación
if (prueba$p.value < 0.05) {
cat("Conclusión: Se rechaza H0. La media de grados Brix es significativamente mayor a 10.\n")
} else {
cat("Conclusión: No se rechaza H0. No hay evidencia suficiente para afirmar que la media supere los 10 grados Brix.\n")
}
## Conclusión: Se rechaza H0. La media de grados Brix es significativamente mayor a 10.
# Eliminar NAs
brix <- citric %>% filter(!is.na(variedad), !is.na(contenido_brix))
# Aplicar prueba de Wilcoxon para cada variedad
resultados <- citric %>%
group_by(variedad) %>%
summarise(
n = n(),
media_brix = mean(contenido_brix),
p_value = wilcox.test(contenido_brix, mu = 10, alternative = "greater")$p.value,
supera_10 = ifelse(p_value < 0.05, "Sí", "No")
)
# Mostrar tabla con los resultados
print(resultados)
## # A tibble: 5 × 5
## variedad n media_brix p_value supera_10
## <chr> <int> <dbl> <dbl> <chr>
## 1 Clemenules 150 11.0 2.47e-26 Sí
## 2 Criolla 150 11.0 1.69e-26 Sí
## 3 Marisol 150 10.1 8.61e- 2 No
## 4 Nova 150 12.0 1.16e-26 Sí
## 5 Okitsu 150 8.96 1 e+ 0 No
Interpretación: Si, las variedades que no superan el umbral minimo de 10° brix son ‘Marisol’ y ‘Okitsu’.
resumen_grupo <- citric %>%
group_by(insecticida) %>%
summarise(Media_acidez = mean(acidez, na.rm = TRUE),
SD = sd(acidez, na.rm = TRUE),
N = n())
print(resumen_grupo)
## # A tibble: 2 × 4
## insecticida Media_acidez SD N
## <chr> <dbl> <dbl> <int>
## 1 No 1.03 0.185 279
## 2 Si 1.04 0.182 471
# Verificar número de observaciones válidas por grupo
n_si <- sum(!is.na(citric$acidez[citric$insecticida == "SI"]))
n_no <- sum(!is.na(citric$acidez[citric$insecticida == "NO"]))
cat("Observaciones válidas con insecticida: ", n_si, "\n")
## Observaciones válidas con insecticida: 0
cat("Observaciones válidas sin insecticida: ", n_no, "\n")
## Observaciones válidas sin insecticida: 0
# Solo realizar Shapiro si hay al menos 3 datos
if (n_si >= 3 & n_no >= 3) {
cat("\nTest de normalidad Shapiro-Wilk:\n")
print(shapiro.test(citric$acidez[citric$insecticida == "SI"]))
print(shapiro.test(citric$acidez[citric$insecticida == "NO"]))
} else {
cat("\nNo se puede aplicar Shapiro-Wilk: menos de 3 datos en al menos uno de los grupos.\n")
}
##
## No se puede aplicar Shapiro-Wilk: menos de 3 datos en al menos uno de los grupos.
# Comparación de medias
if (n_si >= 3 & n_no >= 3) {
cat("\nTest t para muestras independientes:\n")
print(t.test(acidez ~ insecticida, data = citric))
} else {
cat("\nAplicando prueba de Wilcoxon (por tamaño de muestra pequeño):\n")
print(wilcox.test(acidez ~ insecticida, data = citric))
}
##
## Aplicando prueba de Wilcoxon (por tamaño de muestra pequeño):
##
## Wilcoxon rank sum test with continuity correction
##
## data: acidez by insecticida
## W = 62670, p-value = 0.2901
## alternative hypothesis: true location shift is not equal to 0
Interpretación: Valor p = 0.2901: Esto indica que no hay evidencia estadística suficiente para afirmar que hay una diferencia significativa en el nivel de acidez entre los grupos con y sin insecticida.
Conclusión: Con los datos disponibles, no es posible concluir si el uso de insecticida afecta o no la acidez del fruto.
install.packages("car")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("agricolae")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
install.packages("multcompView")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(agricolae)
library(multcompView)
datos_anova <- citric %>%
filter(!is.na(peso_despues), !is.na(fertilizante))
shapiro_resultado <- by(datos_anova$peso_despues, datos_anova$fertilizante, shapiro.test)
print(shapiro_resultado)
## datos_anova$fertilizante: Mixto
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.97667, p-value = 0.0004086
##
## ------------------------------------------------------------
## datos_anova$fertilizante: Organico
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.9854, p-value = 0.01002
##
## ------------------------------------------------------------
## datos_anova$fertilizante: Quimico
##
## Shapiro-Wilk normality test
##
## data: dd[x, ]
## W = 0.98268, p-value = 0.004533
Interpretación: Todos los p-valores son menores a 0.05 → Se rechaza la hipótesis nula de normalidad en los tres grupos.
leveneTest(peso_despues ~ fertilizante, data = datos_anova)
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 2 0.8213 0.4402
## 747
Interpretación:
Hipótesis nula (H₀): Las varianzas entre los grupos son iguales (homocedasticidad). Hipótesis alternativa (H₁): Al menos una varianza de grupo es diferente. Como F value = 0.8213 Pr(>F) = 0.4402 El p-valor = 0.4402, es mayor a 0.05, por lo tanto, no se rechaza la hipótesis nula y se asume que las varianzas son homogéneas.Esto implica que sí podés aplicar el ANOVA (al menos respecto a este supuesto).
Como no se cumple el supuesto de normalidad (según la prueba de Shapiro-Wilk), pero sí se cumple la homogeneidad de varianzas (según Levene), no es válido aplicar ANOVA clásico, ya que la normalidad de los residuos es un requisito fundamental. Por ello se a usar la Prueba de Kruskal-Wallis. Es la alternativa no paramétrica al ANOVA cuando no se cumple la normalidad. Compara la mediana entre más de dos grupos.
kruskal.test(peso_despues ~ fertilizante, data = citric)
##
## Kruskal-Wallis rank sum test
##
## data: peso_despues by fertilizante
## Kruskal-Wallis chi-squared = 0.41185, df = 2, p-value = 0.8139
# Ver frecuencia por categoría (asumimos valores "SI"/"NO")
table(citric$plaga)
##
## No Si
## 407 343
# Calcular proporción observada
n_total <- nrow(citric)
n_con_plaga <- sum(citric$plaga == "SI")
prop_observada <- n_con_plaga / n_total
prop_observada # Mostrar proporción observada
## [1] 0
H0: p >= 0.30 (la proporción de frutos con plaga es 30% o más) H1: p < 0.30 (la proporción es menor al 30%)
prop.test(x = n_con_plaga, n = n_total, p = 0.30, alternative = "less", correct = FALSE)
##
## 1-sample proportions test without continuity correction
##
## data: n_con_plaga out of n_total, null probability 0.3
## X-squared = 321.43, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is less than 0.3
## 95 percent confidence interval:
## 0.000000000 0.003594425
## sample estimates:
## p
## 0
Dado que el valor p fue menor a 0,05, se concluye que sí hay] evidencia estadística suficiente para afirmar que la proporción de frutos con plaga es menor al 30%. En consecuencia, se cumple con el estándar de calidad definido por la empresa.
Analice si hubo un cambio significativo en el diámetro tras los tratamientos aplicados. a. Realice una prueba t para muestras relacionadas diametro_antes y diametro_despues (o su equivalente no paramétrico si no se cumplen supuestos). b. Comente si los tratamientos fueron efectivos en modificar estas variables.
# Crear la diferencia
citric$dif_diametro <- citric$diametro_despues - citric$diametro_antes
shapiro_test <- shapiro.test(citric$dif_diametro)
print(shapiro_test)
##
## Shapiro-Wilk normality test
##
## data: citric$dif_diametro
## W = 0.99327, p-value = 0.001873
if (shapiro_test$p.value > 0.05) {
cat("Se asume normalidad. Se aplica prueba t para muestras relacionadas:\n")
prueba <- t.test(citric$diametro_antes, citric$diametro_despues, paired = TRUE)
} else {
cat("No se asume normalidad. Se aplica prueba de Wilcoxon para muestras relacionadas:\n")
prueba <- wilcox.test(citric$diametro_antes, citric$diametro_despues, paired = TRUE)
}
## No se asume normalidad. Se aplica prueba de Wilcoxon para muestras relacionadas:
print(prueba)
##
## Wilcoxon signed rank test with continuity correction
##
## data: citric$diametro_antes and citric$diametro_despues
## V = 31712, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
Interpretación El resultado de la prueba fue un valor p de 2.2e-16, lo cual indica que existe un cambio significativo en el diámetro del fruto luego del tratamiento.
if (prueba$p.value < 0.05) {
cat("\nConclusión: Existe un cambio significativo en el diámetro tras el tratamiento (p <", round(prueba$p.value, 4), ").\n")
} else {
cat("\nConclusión: No se detecta un cambio significativo en el diámetro tras el tratamiento (p =", round(prueba$p.value, 4), ").\n")
}
##
## Conclusión: Existe un cambio significativo en el diámetro tras el tratamiento (p < 0 ).
Conclusión: Existe un cambio significativo en el diámetro del fruto tras la aplicación del tratamiento, con un valor p menor a 0.05. Esto indica que el tratamiento tuvo un efecto medible sobre el desarrollo del fruto, aumentando o modificando su diámetro de manera estadísticamente significativa. Por lo tanto, se puede considerar que el tratamiento fue efectivo en influir sobre esta variable de interés.
.
tabla_chi <- table(citric$variedad, citric$color_desc)
print(tabla_chi)
##
## Amarillo pálido Naranja claro Naranja intenso Verde amarillento
## Clemenules 47 40 20 32
## Criolla 45 37 29 22
## Marisol 44 35 22 34
## Nova 43 38 17 37
## Okitsu 46 42 24 25
##
## Verde completo
## Clemenules 11
## Criolla 17
## Marisol 15
## Nova 15
## Okitsu 13
chi_result <- chisq.test(tabla_chi)
print(chi_result)
##
## Pearson's Chi-squared test
##
## data: tabla_chi
## X-squared = 11.339, df = 16, p-value = 0.7881
Interpretación: La prueba de chi-cuadrado no mostró una asociación significativa entre la variedad de mandarina y el color del fruto (p ≥ 0.05). Por lo tanto, no se puede afirmar que el color del fruto dependa del tipo de variedad, y ambos factores pueden considerarse independientes en este contexto.