# 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
# Establecer semilla para reproducibilidad
set.seed(42)
# 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 Norte Arenoso 6.00 5.90
## 2 2 Norte Arcilloso 31.0 6.35
## 3 3 Norte Arenoso 15.5 5.41
## 4 4 Norte Franco 28.2 9.80
## 5 5 Sur Franco 17.9 7.31
## 6 6 Oeste Franco 18.5 6.78
# 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 30.2 7.35
## 2 Arenoso 11.4 4.78
## 3 Franco 22.2 8.72
# 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'
# Instalar y cargar paquetes si es necesario
# install.packages("tidyverse")
library(tidyverse)
# indica comentario.
install.packages() instalaría el metapaquete
tidyverse (colección de paquetes para ciencia de datos).
library(tidyverse) carga los paquetes
(ggplot2, dplyr, tidyr, etc.) en
la sesión.tidyverse
es la navaja suiza para manipular datos y graficar. En ingeniería
agrícola, se usa para limpiar datos de campo (humedad, rendimiento,
textura) y generar visualizaciones que apoyen la toma de decisiones
(riego, selección de cultivos).set.seed(42)
tibble y simulación de
datos)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 (versión moderna
de data.frame) con 200 filas.
ID_Parcela: número secuencial del 1 al 200.Zona: muestrea aleatoriamente con reemplazo
(replace=TRUE) entre 4 zonas, cada una con igual
probabilidad (por defecto).Textura_Suelo: muestrea con reemplazo y con
probabilidades específicas (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)
)
%>% (pipe)
encadena operaciones. mutate() crea nuevas columnas.
case_when() asigna Humedad_base según la
textura (30% para arcilloso, 22% para franco, 12% para arenoso).Humedad_ = humedad base + ruido normal con desviación 3
(simula variación natural).Rendimiento_ton_ha = 3 + 0.15*humedad + 2.5 si es
franco + ruido normal sd=1.5. select(-Humedad_base)
Humedad_base
del tibble (ya no la necesitamos, porque
Humedad_ ya la incorpora).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)
)
group_by() agrupa filas por
textura; summarise() calcula la media de humedad y
rendimiento para cada grupo. na.rm=TRUE ignora valores
faltantes (por si los hubiera).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)
ggplot() inicia el gráfico. aes() mapea:
eje X = textura, eje Y = rendimiento, color de relleno = textura.geom_boxplot() dibuja cajas y bigotes (mediana,
cuartiles, valores atípicos).labs() y theme_minimal() dan títulos y
estilo.scale_fill_viridis_d() asigna colores con paleta
amigable para daltónicos.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")
aes() con x=humedad, y=rendimiento,
color=textura.geom_point(alpha=0.7) dibuja puntos semitransparentes
(para ver solapamientos).geom_smooth(method="lm", se=FALSE) ajusta una recta de
regresión lineal por cada grupo de color, sin mostrar la banda de
confianza.facet_wrap(~ Zona, ncol=2) divide el gráfico en 4
paneles (uno por cada zona) ordenados en 2 columnas.facet_wrap por zona, estamos controlando el
efecto de bloque (zona). En agricultura, la zona puede
incluir diferencias en temperatura, radiación o viento.El script simula un experimento factorial (textura × zona) con una covariable (humedad). Aplica: - Estadística descriptiva (medias y boxplots) para comparar texturas. - Regresión lineal para cuantificar la influencia de la humedad. - Estratificación (facetas) para evaluar si el efecto es homogéneo entre zonas.
En la práctica, un ingeniero agrícola usaría este flujo para: - Identificar suelos con mejor rendimiento potencial. - Detectar umbrales de humedad óptimos. - Planificar riego diferenciado por zona y tipo de suelo. - Comunicar resultados a agricultores con gráficos claros.