# Instalar y cargar paquetes si es necesario
# install.packages("tidyverse")
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
# Simular datos similares a los de Python
df_lotes_r <- tibble(
ID_Parcela = 1:200,
Zona = sample(c('Norte', 'Sur', 'Este', 'Oeste'), 200, replace = TRUE),
Textura_Suelo = sample(c('Arcilloso', 'Franco', 'Arenoso'), 200, replace = TRUE, prob = c(0.3, 0.5, 0.2))
) %>%
mutate(
Humedad_base = case_when(
Textura_Suelo == 'Arcilloso' ~ 30,
Textura_Suelo == 'Franco' ~ 22,
TRUE ~ 12
),
Humedad_ = Humedad_base + rnorm(200, mean = 0, sd = 3),
Rendimiento_ton_ha = 3 + (Humedad_ * 0.15) +
if_else(Textura_Suelo == 'Franco', 2.5, 0) +
rnorm(200, mean = 0, sd = 1.5)
) %>%
select(-Humedad_base)
# Mostrar las primeras filas
print(head(df_lotes_r))
## # A tibble: 6 × 5
## ID_Parcela Zona Textura_Suelo Humedad_ Rendimiento_ton_ha
## <int> <chr> <chr> <dbl> <dbl>
## 1 1 Oeste Franco 19.6 6.48
## 2 2 Oeste Franco 25.4 8.84
## 3 3 Sur Franco 25.6 11.5
## 4 4 Norte Franco 26.7 9.10
## 5 5 Norte Franco 20.6 7.48
## 6 6 Sur Franco 20.8 10.6
# 1. Resúmenes Estadísticos Agrupados con dplyr
resumen_suelos_r <- df_lotes_r %>%
group_by(Textura_Suelo) %>%
summarise(
Humedad_media = mean(Humedad_, na.rm = TRUE),
Rendimiento_medio = mean(Rendimiento_ton_ha, na.rm = TRUE)
)
print(resumen_suelos_r)
## # A tibble: 3 × 3
## Textura_Suelo Humedad_media Rendimiento_medio
## <chr> <dbl> <dbl>
## 1 Arcilloso 29.6 7.42
## 2 Arenoso 12.3 4.80
## 3 Franco 22.2 8.83
# 2. Comparación Visual de Grupos (Boxplots Categóricos)
df_lotes_r %>%
ggplot(aes(x = Textura_Suelo, y = Rendimiento_ton_ha, fill = Textura_Suelo)) +
geom_boxplot() +
labs(title = 'Variabilidad del Rendimiento según el Tipo de Suelo',
x = 'Textura del Suelo',
y = 'Rendimiento (ton/ha)') +
theme_minimal() +
scale_fill_viridis_d(option = "A", begin = 0.5)
# 3. Análisis Multivariado con Facetas (ggplot2)
df_lotes_r %>%
ggplot(aes(x = Humedad_, y = Rendimiento_ton_ha, color = Textura_Suelo)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~ Zona, ncol = 2) + # Facetas por Zona, 2 columnas
labs(title = 'Relación Humedad-Rendimiento por Zona y Tipo de Suelo',
x = 'Humedad (%)',
y = 'Rendimiento (ton/ha)',
color = 'Textura del Suelo') +
theme_minimal() +
scale_color_viridis_d(option = "D")
## `geom_smooth()` using formula = 'y ~ x'
¡Excelente! Vamos a desglosar este código línea por línea, explicando qué hace en R y qué significado estadístico/agronómico tiene en el contexto de la ingeniería agrícola.
# install.packages("tidyverse")
library(tidyverse)
install.packages() instala el
paquete (está comentado para que no se ejecute cada vez).
library(tidyverse) carga el ecosistema de paquetes para
manipulación y visualización de datos.tidyverse nos
permite hacer limpieza, transformación, resúmenes y
gráficos de manera eficiente, algo esencial cuando trabajamos
con datos de campo (parcelas, suelos, rendimientos).set.seed(42)
df_lotes_r)df_lotes_r <- tibble(
ID_Parcela = 1:200,
Zona = sample(c('Norte', 'Sur', 'Este', 'Oeste'), 200, replace = TRUE),
Textura_Suelo = sample(c('Arcilloso', 'Franco', 'Arenoso'), 200, replace = TRUE, prob = c(0.3, 0.5, 0.2))
)
tibble) con 200
parcelas. Asigna aleatoriamente zona y textura de suelo con
probabilidades (30% arcilloso, 50% franco, 20% arenoso).mutate(
Humedad_base = case_when(
Textura_Suelo == 'Arcilloso' ~ 30,
Textura_Suelo == 'Franco' ~ 22,
TRUE ~ 12
),
Humedad_ = Humedad_base + rnorm(200, mean = 0, sd = 3),
Rendimiento_ton_ha = 3 + (Humedad_ * 0.15) +
if_else(Textura_Suelo == 'Franco', 2.5, 0) +
rnorm(200, mean = 0, sd = 1.5)
)
Humedad_base asigna un valor teórico de humedad según
textura.Humedad_ agrega ruido aleatorio normal (media 0,
desviación 3).Rendimiento_ton_ha se modela como:3 + 0.15*Humedad + 2.5 (si es Franco) + error normal(0,1.5).select(-Humedad_base)
Humedad_base
(solo para simplificar).print(head(df_lotes_r))
resumen_suelos_r <- df_lotes_r %>%
group_by(Textura_Suelo) %>%
summarise(
Humedad_media = mean(Humedad_, na.rm = TRUE),
Rendimiento_medio = mean(Rendimiento_ton_ha, na.rm = TRUE)
)
print(resumen_suelos_r)
df_lotes_r %>%
ggplot(aes(x = Textura_Suelo, y = Rendimiento_ton_ha, fill = Textura_Suelo)) +
geom_boxplot() +
labs(title = 'Variabilidad del Rendimiento según el Tipo de Suelo',
x = 'Textura del Suelo', y = 'Rendimiento (ton/ha)') +
theme_minimal() +
scale_fill_viridis_d(option = "A", begin = 0.5)
df_lotes_r %>%
ggplot(aes(x = Humedad_, y = Rendimiento_ton_ha, color = Textura_Suelo)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE) +
facet_wrap(~ Zona, ncol = 2) +
labs(title = 'Relación Humedad-Rendimiento por Zona y Tipo de Suelo',
x = 'Humedad (%)', y = 'Rendimiento (ton/ha)',
color = 'Textura del Suelo') +
theme_minimal() +
scale_color_viridis_d(option = "D")
facet_wrap crea subgráficos separados por zona.| Componente | Función estadística | Aplicación agronómica |
|---|---|---|
| Simulación | Generación de datos con estructura conocida | Permite probar métodos sin datos reales |
| Agrupación y promedios | Estadística descriptiva | Identificar texturas más productivas |
| Boxplots | Visualización de distribuciones | Detectar heterogeneidad y outliers |
| Regresión + facetas | Modelo lineal y análisis de interacciones | Entender cómo zona y suelo afectan la respuesta a la humedad |
| Reproducibilidad | Semilla fija | Asegurar que los resultados sean consistentes |
Si quieres, puedo ampliar con: - Pruebas de hipótesis (ANOVA, comparaciones múltiples) - Interpretación de coeficientes de regresión - Cómo llevar esto a un diseño experimental real (DBCA, etc.)
¿Te gustaría que profundice en alguna parte?