# 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! Vamos a desglosar línea por línea este código de R, explicando tanto su función en el lenguaje como su significado en el contexto de la ingeniería agrícola y la estadística aplicada.


📦 1. Instalación y carga de paquetes

# install.packages("tidyverse")
library(tidyverse)

🎲 2. Semilla para reproducibilidad

set.seed(42)

🌾 3. Simulación de datos agrícolas

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)

print(head(df_lotes_r))

📊 4. Resúmenes estadísticos agrupados

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

📈 5. Boxplots comparativos

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', ...) +
  theme_minimal() +
  scale_fill_viridis_d(option = "A", begin = 0.5)

🌍 6. Gráfico de facetas (multivariado)

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(...) +
  theme_minimal() +
  scale_color_viridis_d(option = "D")

Resumen conceptual para ingeniería agrícola

Elemento Significado estadístico Aplicación agrícola
Simulación de datos Generación de datos con estructura conocida Prueba de metodologías sin datos reales
Media por textura Comparación de medias Identificar suelos más productivos
Boxplot Visualización de dispersión y atípicos Detectar lotes con rendimiento anómalo
Regresión lineal Relación entre variables continuas Estimar cuánto aumenta el rendimiento por cada % de humedad
Facetas Análisis estratificado Evaluar si el efecto de la humedad depende de la zona

Si deseas, puedo: - Traducir este código a Python (pandas + seaborn) para comparar. - Explicar cómo interpretar los gráficos desde el punto de vista agronómico. - Mostrar cómo añadir intervalos de confianza o pruebas estadísticas (ANOVA, Tukey).

¿Qué te gustaría explorar a continuación?