# Cargar librerías
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.2.1 ✔ readr 2.2.0
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.3 ✔ tibble 3.3.1
## ✔ lubridate 1.9.5 ✔ tidyr 1.3.2
## ✔ purrr 1.2.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# 1. Recrear los datos del campo
set.seed(42)
datos <- data.frame(
Parcela = 1:16,
Tratamiento = rep(c("Riego_50%", "Riego_75%", "Riego_100%", "Riego_125%"), each = 4),
Eficiencia_Agua = c(rnorm(4, 1.2, 0.15), rnorm(4, 1.8, 0.12),
rnorm(4, 1.7, 0.18), rnorm(4, 1.3, 0.14))
)
# Convertir tratamiento a Factor (CRUCIAL para el ANOVA de la próxima semana)
datos$Tratamiento <- as.factor(datos$Tratamiento)
# Verificación rápida para la bitácora
str(datos)
## 'data.frame': 16 obs. of 3 variables:
## $ Parcela : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Tratamiento : Factor w/ 4 levels "Riego_100%","Riego_125%",..: 3 3 3 3 4 4 4 4 1 1 ...
## $ Eficiencia_Agua: num 1.41 1.12 1.25 1.29 1.85 ...
# 2. Resumen estadístico usando dplyr
resumen <- datos %>%
group_by(Tratamiento) %>%
summarise(
Media = mean(Eficiencia_Agua),
Desviacion = sd(Eficiencia_Agua)
)
print(resumen)
## # A tibble: 4 × 3
## Tratamiento Media Desviacion
## <fct> <dbl> <dbl>
## 1 Riego_100% 1.95 0.189
## 2 Riego_125% 1.26 0.117
## 3 Riego_50% 1.27 0.120
## 4 Riego_75% 1.85 0.0912
# 3. Gráfico exploratorio con ggplot2
# Calcular la media global (ahora en su propia línea, sin el ">" que causaba error)
media_global <- mean(datos$Eficiencia_Agua)
# Generar el gráfico correctamente estructurado
ggplot(datos, aes(x = Tratamiento, y = Eficiencia_Agua)) +
geom_boxplot(fill = "lightgray", alpha = 0.5) +
geom_jitter(aes(color = Tratamiento), width = 0.1, size = 3) +
geom_hline(yintercept = media_global, linetype = "dashed", color = "red") +
theme_minimal() +
labs(title = "Exploración Visual: Eficiencia de Agua por Tratamiento",
x = "Lámina de Riego",
y = "Eficiencia del Agua (kg/m³)") +
theme(legend.position = "none")

¡Excelente! Este código es una práctica introductoria perfecta para
un Diseño Completamente al Azar (DCA) con un solo
factor (lámina de riego). Vamos a desglosar cada línea
explicando su sintaxis en R y su significado en el
Diseño Experimental en Ingeniería Agrícola.
1. Preparación del entorno y Librerías
library(tidyverse)
- En R: Carga el ecosistema de paquetes
tidyverse (que incluye dplyr para manipular
datos y ggplot2 para gráficos).
- En el Diseño Experimental: Es como preparar la mesa
de trabajo y los instrumentos de medición antes de empezar el ensayo.
Necesitamos estas herramientas para procesar los datos que
recolectaremos en el campo.
2. Creación de los datos simulados (la “recolección de campo”)
set.seed(42)
- En R: Fija la semilla del generador de números
aleatorios. Si ejecutas el código varias veces, siempre obtendrás los
mismos números “aleatorios”.
- En el Diseño Experimental: En la vida real no
controlamos el error experimental, pero aquí lo simulamos. Esto asegura
que todos los estudiantes obtengan los mismos resultados para poder
comparar sus bitácoras y gráficos.
datos <- data.frame(...)
- En R: Crea una tabla (dataframe) con 16 filas y 3
columnas.
- En el Diseño Experimental: Representa nuestra
bitácora de campo. Tenemos 16 parcelas experimentales
(unidades experimentales).
Parcela = 1:16
- En R: Crea un vector numérico del 1 al 16.
- En el Diseño Experimental: Identificación física de
cada parcela en el terreno. Es crucial para llevar un registro y evitar
confusiones al momento de medir.
Tratamiento = rep(c("Riego_50%", "Riego_75%", "Riego_100%", "Riego_125%"), each = 4)
- En R:
rep repite 4 veces cada uno de
los 4 niveles de riego, resultando en 16 etiquetas.
- En el Diseño Experimental: Aquí definimos los
4 tratamientos (láminas de riego). Al repetir cada uno
4 veces, estamos estableciendo 4 repeticiones
(réplicas) por tratamiento. En agricultura, tener réplicas nos
permite estimar el error experimental (variabilidad natural del suelo,
microclima, etc.) y aumentar la precisión del ensayo.
Eficiencia_Agua = c(rnorm(4, 1.2, 0.15), rnorm(4, 1.8, 0.12), ...)
- En R:
rnorm(n, mean, sd) genera 4
números aleatorios con distribución normal para cada grupo. Por ejemplo,
el riego al 75% tiene una media de 1.8 y desviación de 0.12.
- En el Diseño Experimental: Esta es nuestra
variable respuesta (Eficiencia del Uso del Agua - EUA,
en kg/m³). En un experimento real, estos números saldrían de pesar la
biomasa cosechada y medir el agua consumida. Las medias simuladas (1.2,
1.8, 1.7, 1.3) reflejan una hipótesis agronómica común: el exceso (125%)
y el déficit (50%) de agua reducen la eficiencia, mientras que el 75% o
100% son óptimos.
3. Preparación de los datos para el análisis estadístico
datos$Tratamiento <- as.factor(datos$Tratamiento)
- En R: Convierte la columna de texto en un
factor (variable categórica). Es
CRUCIAL porque el ANOVA trata a los factores como
grupos discretos, no como números continuos. Si no lo haces, R podría
interpretar “50%, 75%…” como una regresión lineal.
- En el Diseño Experimental: Le decimos al software
que los riegos son categorías fijas (no hay un orden matemático
intrínseco, aunque en la práctica tengan un orden lógico). Esto define
nuestro factor de estudio.
str(datos)
- En R: Muestra la estructura interna del dataframe
(tipos de datos, primeras filas).
- En el Diseño Experimental: Es el “chequeo de
integridad” de la bitácora. Verificamos que tenemos 16 observaciones,
que los tratamientos están etiquetados correctamente y que la variable
respuesta es numérica.
4. Estadística descriptiva (Resumen numérico)
resumen <- datos %>% group_by(Tratamiento) %>% summarise(...)
- En R: El operador
%>% (pipe)
encadena funciones. group_by agrupa por tratamiento y
summarise calcula la media y desviación estándar de cada
grupo.
- En el Diseño Experimental: Calculamos las
medidas de tendencia central y dispersión para cada
lámina de riego. La media nos da el rendimiento promedio esperado; la
desviación estándar nos indica la variabilidad dentro de cada
tratamiento (debida a la heterogeneidad del suelo o errores de
medición). Si una desviación es muy alta, ese tratamiento es menos
predecible o estable.
print(resumen)
- En R: Imprime la tabla en la consola.
- En el Diseño Experimental: Documentamos los
resultados preliminares en la bitácora. Aquí ya podemos ver que el riego
al 75% tiene la media más alta (1.8).
5. Cálculo de la referencia global
media_global <- mean(datos$Eficiencia_Agua)
- En R: Calcula el promedio de todas las 16
observaciones, sin importar el tratamiento.
- En el Diseño Experimental: Esta es la media
general del experimento. En el ANOVA de la próxima semana, esta
media se usará para calcular la Suma de Cuadrados Total
(SCT), que mide la variación total de todos los datos respecto al
promedio general. Sirve como referencia para ver si los tratamientos se
desvían hacia arriba o abajo.
6. Gráfico exploratorio (Análisis visual)
ggplot(datos, aes(x = Tratamiento, y = Eficiencia_Agua))
- En R: Inicializa el gráfico, mapeando el eje X a
los tratamientos y el eje Y a la eficiencia.
- En el Diseño Experimental: Elegimos un gráfico de
cajas (boxplots) porque es excelente para comparar la
distribución de varios grupos a la vez.
geom_boxplot(fill = "lightgray", alpha = 0.5)
- En R: Añade las cajas (medianas, cuartiles y
bigotes).
- En el Diseño Experimental: La caja muestra dónde
está el 50% central de los datos de cada riego. La mediana (línea
interna) es más robusta que la media ante outliers. Visualmente
comparamos la magnitud del efecto del riego.
geom_jitter(aes(color = Tratamiento), width = 0.1, size = 3)
- En R: Superpone todos los puntos crudos (valores
reales) con un pequeño desplazamiento horizontal (
width)
para que no se superpongan.
- En el Diseño Experimental: Muestra cada una
de las 4 parcelas réplica de manera individual. Esto es vital
para detectar:
- Outliers (datos atípicos, quizás por un error en la
medición o un suelo muy heterogéneo).
- Homogeneidad de varianzas: si las dispersiones de
los puntos entre tratamientos son similares (supuesto del ANOVA). Si un
grupo tiene puntos mucho más dispersos que otro, podríamos necesitar
transformar los datos.
geom_hline(yintercept = media_global, linetype = "dashed", color = "red")
- En R: Dibuja una línea horizontal roja discontinua
en el valor de la media global.
- En el Diseño Experimental: Es un ancla visual. Nos
permite ver rápidamente qué tratamientos están por encima (75% y 100%) y
cuáles por debajo (50% y 125%) del rendimiento promedio del ensayo.
theme_minimal() + labs(...) + theme(legend.position = "none")
- En R: Mejora la estética, agrega títulos y
etiquetas claras, y oculta la leyenda de colores (pues ya están en el
eje X).
- En el Diseño Experimental: Preparamos el gráfico
para presentarlo en informes técnicos o artículos. Una buena
visualización es clave para comunicar hallazgos a otros ingenieros o
productores.
7. La pregunta final (Reflexión sobre la Hipótesis Nula)
- Nota del código: “Visualmente, ¿crees que la
distancia entre las cajas es lo suficientemente grande respecto a la
dispersión de los puntos como para rechazar la Hipótesis Nula
(H0)?”
- En R: Es solo un comentario, no ejecuta nada.
- En el Diseño Experimental: Aquí está el corazón del
método científico.
- H₀ (Hipótesis Nula): Todas las láminas de riego
producen la misma Eficiencia de Agua (μ₁ = μ₂ = μ₃ = μ₄).
- Análisis visual: Observamos que el 75% (media 1.8)
y el 50% (media 1.2) están bastante separados. Sin embargo, dentro de
cada grupo, los puntos (jitter) tienen una dispersión de ±0.15
aproximadamente. La “señal” (diferencia entre medias) es de ~0.6,
mientras que el “ruido” (desviación estándar) es de ~0.15. La señal es
unas 4 veces mayor que el ruido. Visualmente, es muy probable
que rechacemos H₀ (es decir, que al menos un tratamiento es
significativamente diferente).
- ¿Y entre el 75% y el 100%? Sus medias (1.8 vs 1.7)
están más cerca y sus cajas se superponen bastante. Probablemente no
haya diferencia significativa entre esos dos.
- Nota para el ingeniero: Este análisis visual previo
es exactamente lo que debe hacer un investigador antes de aplicar el
ANOVA. La próxima semana, la prueba F nos dirá con certeza matemática
(p-valor) si esa diferencia observada es estadísticamente significativa
o podría deberse únicamente al azar (error experimental).
Resumen para tu bitácora: Este script no solo genera
números, sino que simula todo el flujo de trabajo de un
experimento agrícola: diseño (réplicas y tratamientos), toma de
datos (simulada), depuración (factores), estadística descriptiva y
análisis exploratorio visual. La gráfica final es tu principal
herramienta para intuir si el riego afecta la eficiencia, antes de
recurrir a la prueba formal de hipótesis. ¡Anota tu predicción (rechazar
o no H₀) y compárala con el resultado del ANOVA la próxima clase!