Cargar paquetes necesarios

library(dplyr)
library(ggplot2)
library(tidyr)
library(infer)
library(broom)

Cargar la librería

library(readxl)

Carga del archivo

citric <- read_excel("citricos.xlsx")

1. Análisis exploratorio inicial

a. Cargue la base de datos en R Studio. ¿Cuántas observaciones y variables contiene?

• Cantidad de Variables:

• Cantidad de Observaciones:

# 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

b. Clasifique las variables en categóricas y numéricas.

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.

c. Realice un resumen estadístico de las variables numéricas: peso_antes, peso_después, diametro_antes, diametro_despues, acidez y contenido_brix.

Resumen estadístico de las variables numéricas solicitadas

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

Calculó de media y desviación estándar

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>

d. Elabore gráficos adecuados (boxplots, histogramas) para visualizar la distribución de estas variables.

Boxplot comparativo para Peso antes y despues

# 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")
  )

Boxplot comparativo para Diametro antes y despues

# 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")
  )

Boxplot para acidez

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")
  )

Boxplot para contenido_brix

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")
  )

2. Prueba de hipótesis para una media

install.packages("ggpubr")
## Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.4'
## (as 'lib' is unspecified)

Cargar las librerías

library(ggpubr)  # Para test de normalidad visual y más
library(stats)   # Fun

a. Formulación de hipótesis

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.

b. ¿La media observada del contenido Brix es significativamente mayor a 10?

# 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.

c. Compruebe la Normalidad de los datos

Prueba de normalidad de contenido_brix

Gráfico de densidad para la variable contenido_brix

`

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.

QQ plot para evaluar normalidad

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).

Prueba de normalidad de Shapiro-Wilk

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.

d. Realice una prueba t o de Wilcoxon para una muestra y justifique el uso de esta prueba.

Prueba de Wilcoxon para contenido_brix

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

e. Interprete el valor p y la conclusión.

#### 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.

Opcional: ¿Existe alguna variedad que no supere este umbral mínimo?

# 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’.

3. Comparación de medias entre dos grupos

a. Hipótesis

H0: El uso de insecticida no afecta el nivel medio de acidez (medias iguales)

H1: El uso de insecticida sí afecta el nivel medio de acidez (medias distintas)

b. Comparación de medias por grupo

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

c. Verificar normalidad en cada grupo

# 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

d. Interprete los resultados.

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.

4. Comparación de medias entre más de dos grupos (ANOVA)

Se sospecha que el tipo de fertilizante podría tener efecto en el peso final de los frutos.

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)

Filtrar datos válidos

datos_anova <- citric %>%
  filter(!is.na(peso_despues), !is.na(fertilizante))

a. Hipótesis:

H0: No hay diferencia en el peso final entre grupos de fertilizante

H1: Al menos un grupo de fertilizante produce un peso final diferente

b.1. Verificar normalidad por grupo

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.

b.2. Verificar homogeneidad de varianzas

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).

b.3. Elegir prueba según supuestos

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.

Prueba de Kruskal-Wallis

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

c. No se encontraron diferencias estadísticamente significativas en el peso final de los frutos (peso_despues) entre los distintos tipos de fertilizante aplicados (Orgánico, Químico, Mixto).

d. Esto indica que, según los datos analizados, el tipo de fertilizante no tuvo un efecto detectable sobre el peso final del fruto. Dado que no se observaron diferencias significativas, la elección del fertilizante puede basarse en otros criterios, como costo, disponibilidad, impacto ambiental o preferencia del productor.

5. Prueba para proporciones

La empresa estima que menos del 30% de los frutos deberían tener plagas para mantener estándares de calidad.

a. Estimar la proporción observada de frutos con plaga

# 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

b. Prueba de hipótesis

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

c. Conclusión según valor p

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.

6. Efecto del tratamiento en el fruto (antes vs después)

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

a. Verificar normalidad de la diferencia

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

b. Selección de la prueba según normalidad

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.

Interpretación básica

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.

7. Asociación entre variables categóricas (chi-cuadrado)

.

a. Tabla de contingencia

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

b. Prueba de Chi-cuadrado

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.