# 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
# 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'

¡Claro! A continuación te explico línea por línea el código R, primero su significado en R (sintaxis y función) y luego su significado en estadística aplicada a la Ingeniería Agrícola (contexto agronómico y análisis de datos).


📦 Instalación y carga de paquetes

# Instalar y cargar paquetes si es necesario
# install.packages("tidyverse")
library(tidyverse)

En R:
- # es un comentario (no se ejecuta).
- library(tidyverse) carga el conjunto de paquetes tidyverse (dplyr, ggplot2, tibble, etc.) para manipulación y visualización de datos.

En Estadística aplicada a Ingeniería Agrícola:
- Se prepara el entorno de trabajo para manejar datos agrícolas (rendimientos, humedad, textura de suelo). Tidyverse facilita el análisis exploratorio y la visualización de datos experimentales.


🎲 Semilla para reproducibilidad

set.seed(42)

En R:
- Fija la semilla del generador de números aleatorios para que los resultados sean reproducibles.

En Estadística:
- Garantiza que cualquier simulación o muestreo aleatorio (como la asignación de tipos de suelo) pueda repetirse exactamente, crucial en investigación agrícola para validar resultados.


📊 Creación del data frame simulado

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

En R:
- tibble() crea una tabla de datos (versión moderna de data.frame).
- 1:200 genera una secuencia del 1 al 200 (identificadores de parcela).
- sample() asigna aleatoriamente una zona entre 4 posibles y una textura de suelo con probabilidades 30%, 50% y 20% respectivamente.

En Ingeniería Agrícola:
- Simula 200 parcelas agrícolas con información espacial (zona geográfica) y edáfica (textura del suelo). Las probabilidades reflejan distribuciones típicas: suelos francos son más comunes.


➕ Creación de variables derivadas con mutate

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

En R:
- %>% es el operador pipe que pasa el resultado al siguiente paso.
- mutate() agrega nuevas columnas.
- case_when() asigna valores según condiciones (similar a if-else múltiple).
- rnorm() genera valores aleatorios con distribución normal (media 0, desviación 3 para humedad; media 0, sd 1.5 para rendimiento).
- if_else() añade un efecto fijo de 2.5 ton/ha solo para suelos francos.

En Ingeniería Agrícola:
- Humedad base: refleja la capacidad de retención de agua típica de cada textura (arcilloso retiene más que arenoso).
- Humedad medida: incluye variabilidad natural (mediciones con error).
- Rendimiento: se modela como una función lineal de la humedad (pendiente 0.15 ton/ha por % de humedad), más un bonus para suelos francos (los mejores para cultivos), más error aleatorio. Esto simula un experimento real con confusores.


🧹 Eliminación de columna auxiliar

%>%
  select(-Humedad_base)

En R:
- select(-columna) elimina la columna Humedad_base (ya no necesaria).

En Estadística:
- Se elimina la variable intermedia para quedarse solo con las observaciones finales (limpieza de datos).


👁️ Vista previa

print(head(df_lotes_r))

En R:
- head() muestra las primeras 6 filas.
- print() las imprime en consola.

En Estadística:
- Primer contacto con los datos: verificar estructura y valores plausibles.


📈 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)
  )
print(resumen_suelos_r)

En R:
- group_by() agrupa por textura de suelo.
- summarise() calcula la media de humedad y rendimiento para cada grupo.
- na.rm = TRUE ignora valores faltantes.

En Estadística aplicada:
- Análisis descriptivo por grupos: compara humedad y rendimiento promedio entre suelos arcillosos, francos y arenosos.
- En agricultura, esto permite identificar qué tipo de suelo tiene mayor productividad media y si la humedad varía significativamente.


📊 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',
       x = 'Textura del Suelo',
       y = 'Rendimiento (ton/ha)') +
  theme_minimal() +
  scale_fill_viridis_d(option = "A", begin = 0.5)

En R:
- ggplot() inicia el gráfico con ejes x (textura) e y (rendimiento).
- geom_boxplot() dibuja diagramas de caja.
- labs() añade títulos y etiquetas.
- theme_minimal() aplica un tema limpio.
- scale_fill_viridis_d() usa colores accesibles para daltonismo.

En Estadística para Ingeniería Agrícola:
- Boxplot muestra mediana, cuartiles y valores atípicos del rendimiento para cada textura.
- Permite comparar visualmente la distribución del rendimiento: suelos francos deberían tener mediana más alta (por el bonus de 2.5).
- Detecta posibles outliers (parcelas con rendimiento anómalo).


🔬 Análisis multivariado con facetas

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

En R:
- geom_point() dibuja puntos con transparencia 0.7.
- geom_smooth(method = "lm", se = FALSE) añade rectas de regresión lineal sin intervalo de confianza.
- facet_wrap(~ Zona, ncol = 2) crea 4 paneles (uno por zona Norte, Sur, Este, Oeste).
- Resto igual que anterior.

En Estadística aplicada:
- Análisis de regresión múltiple visual: muestra cómo la relación humedad-rendimiento cambia según la textura y la zona geográfica.
- Las pendientes de las rectas indican el efecto marginal de la humedad sobre el rendimiento.
- Las facetas permiten detectar interacciones (ej: en zona Norte el efecto de la humedad puede ser diferente que en Sur).
- Útil para **agricultura de precisión ```