# 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'
¡Excelente! Has compartido un código R que es un equivalente
directo al análisis que haríamos en Python con
pandas, matplotlib y seaborn.
Vamos a desglosarlo línea por línea desde dos perspectivas:
# install.packages("tidyverse")
library(tidyverse)
En R: tidyverse es un meta-paquete
que incluye dplyr (manipulación de datos),
ggplot2 (visualización), tidyr, etc.
library() lo activa para usarlo. La línea comentada
install.packages() solo se ejecuta una vez para instalar el
paquete.
En estadística aplicada: Esto es equivalente a
importar pandas, numpy,
matplotlib y seaborn en Python. Es la base
para cualquier análisis exploratorio y modelado.
set.seed(42)
En R: Fija la semilla del generador de números aleatorios para que los resultados sean reproducibles. Si no se pone, cada ejecución daría datos distintos.
En estadística aplicada: Fundamental en simulación y muestreo. Permite que otro investigador obtenga exactamente los mismos datos sintéticos, facilitando la validación de métodos.
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() crea una tabla (similar a
DataFrame en pandas).ID_Parcela: secuencia del 1 al 200 (identificador
único).Zona: se asignan 4 zonas con reemplazo (puede
repetirse).Textura_Suelo: se asigna 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)
)
mutate() crea o modifica columnas.case_when() asigna humedad base según textura.rnorm() añade ruido aleatorio normal.3 + 0.15*Humedad + 2.5 si es Franco + error N(0,1.5²).select(-Humedad_base)
En R: Elimina la columna
Humedad_base (solo nos interesa la humedad con
ruido).
En estadística aplicada: Se queda con la
variable observada Humedad_ (la que realmente mediríamos en
campo), no con el valor teórico.
print(head(df_lotes_r))
En R: Muestra las primeras 6 filas para inspeccionar.
En estadística aplicada: Verificación rápida de que los datos tienen sentido (rangos, categorías, etc.).
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)
)
%>% es el pipe (pasa el dato al siguiente
paso).group_by() agrupa por textura.summarise() calcula medias por grupo.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 variables a ejes y colores.geom_boxplot() dibuja cajas y bigotes.scale_fill_viridis_d() aplica una paleta de colores
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")
geom_point(): nube de puntos con transparencia.geom_smooth(method = "lm"): recta de regresión lineal
por grupo.facet_wrap(~ Zona): crea subgráficos
separados por cada zona (Norte, Sur, Este, Oeste).| Componente R | Función técnica | Aplicación agrícola |
|---|---|---|
| Simulación de datos | Generación de escenarios controlados | Prueba de métodos sin datos reales costosos |
| Agrupación y resúmenes | Estadísticas descriptivas | Comparación de rendimientos por tipo de suelo |
| Boxplots | Visualización de distribución y outliers | Detección de lotes con comportamiento anómalo |
| Regresión + facetas | Modelado de relaciones y efectos espaciales | Identificación de zonas con respuesta diferencial al riego o fertilización |
Si deseas, puedo: - Traducir este código a su equivalente en Python (pandas + seaborn). - Agregar pruebas estadísticas (ANOVA, comparación de pendientes). - Convertir esto en un informe técnico con interpretación agronómica.
¿Te gustaría alguna de esas opciones?