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

Explicación línea a línea del código R y su significado estadístico para ingeniería agrícola

Configuración del documento

---
title: "Untitled"
author: "Cristian Javier Ricardo julio"
date: "2026-09-03"
output: html_document
---

En R: Esto es el frontmatter YAML de R Markdown. Define el título, autor, fecha (generada automáticamente con Sys.Date()) y formato de salida (HTML).

En estadística aplicada: El documento generará un informe reproducible, fundamental en investigación agrícola para documentar análisis de datos de campo.


Carga de paquetes


``` r
# Instalar y cargar paquetes si es necesario
# install.packages("tidyverse")
library(tidyverse)
**En R**: 
- La línea comentada `install.packages()` instalaría el paquete `tidyverse` (colección de paquetes para ciencia de datos).
- `library(tidyverse)` carga el ecosistema de paquetes que incluye `ggplot2` (gráficos), `dplyr` (manipulación de datos), `tidyr` (limpieza), etc.

**En estadística aplicada**: `tidyverse` es el estándar moderno para análisis de datos agrícolas, permitiendo manipulación eficiente y visualización de grandes conjuntos de datos de campo.

---

## **Generación de datos simulados**

```r

``` r
# Establecer semilla para reproducibilidad
set.seed(42)
**En R**: `set.seed(42)` fija el generador de números aleatorios. Con el mismo número (42), siempre se generarán los mismos datos "aleatorios".

**En estadística aplicada**: La **reproducibilidad** es crucial en investigación agrícola: si otro investigador ejecuta el mismo código, obtendrá exactamente los mismos resultados para validar el estudio.

---

```r
# 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))
)

En R: - tibble() crea una tabla de datos moderna (similar a data.frame pero más amigable). - ID_Parcela = 1:200 crea un identificador único para 200 parcelas. - sample(... 200, replace = TRUE) asigna aleatoriamente Zona y Textura, permitiendo repeticiones. - prob = c(0.3, 0.5, 0.2) asigna probabilidades: 30% arcilloso, 50% franco, 20% arenoso.

En estadística aplicada: - Diseño experimental: Las parcelas (unidades experimentales) se distribuyen en zonas geográficas y tipos de suelo. - Muestreo estratificado: Las probabilidades reflejan la proporción real de tipos de suelo en una región agrícola típica (el suelo franco es el más común y fértil). - Identificador único es esencial para trazabilidad de datos de campo.


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

En R: - %>% es el pipe de R: pasa el resultado de la izquierda al primer argumento de la función de la derecha (como un flujo de datos). - mutate() crea nuevas columnas: - Humedad_base: valor base según textura (30% arcilloso, 22% franco, 12% arenoso). - case_when(): estructura condicional similar a if-else múltiple. - rnorm(200, mean = 0, sd = 3): añade ruido aleatorio con distribución normal (media 0, desviación 3). - Humedad_: humedad final = base + error aleatorio (variabilidad natural). - Rendimiento_ton_ha: modelo de rendimiento: - 3: intercepto (rendimiento base). - + (Humedad_ * 0.15): relación positiva: +0.15 ton/ha por cada 1% de humedad. - + if_else(… 2.5, 0): bonificación de 2.5 ton/ha para suelo franco. - + rnorm(… sd = 1.5): error aleatorio (variabilidad no explicada). - select(-Humedad_base): elimina la columna temporal Humedad_base (solo se usa para calcular Humedad_).

En estadística aplicada: - Relación humedad-rendimiento: Se modela una relación positiva, realista en agricultura (más humedad → mayor rendimiento hasta cierto punto). - Efecto del tipo de suelo: El suelo franco recibe una bonificación, reflejando su fertilidad superior. - Ruido aleatorio: Representa la variabilidad natural en el campo (microclima, nutrientes, plagas, errores de medición). - Distribución normal: Asume que los errores de medición y factores no controlados siguen una distribución normal (supuesto común en modelos lineales).


# Mostrar las primeras filas
print(head(df_lotes_r))

En R: head() muestra las primeras 6 filas de la tabla; print() las imprime en la consola.

En estadística aplicada: Inspección visual de los datos: verificar que las columnas se crearon correctamente, ver rangos y valores atípicos antes de analizar.


Análisis descriptivo


``` r
# 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
**En R**:
- `group_by(Textura_Suelo)`: agrupa los datos por tipo de suelo.
- `summarise()`: calcula estadísticos para cada grupo:
  - `Humedad_media`: media de humedad.
  - `Rendimiento_medio`: media de rendimiento.
- `na.rm = TRUE`: elimina valores faltantes si existen.

**En estadística aplicada**: 
- **Estadística descriptiva por grupos**: Permite comparar el rendimiento promedio entre tipos de suelo.
- **Interpretación esperada**: Suelo franco debería tener mayor rendimiento medio por la bonificación de 2.5 ton/ha del modelo.
- Es el primer paso de **análisis exploratorio de datos (EDA)** para identificar patrones y diferencias significativas.

---

## **Visualización: Boxplots categóricos**

```r
# 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)

En R: - ggplot(aes(...)): inicia el gráfico con estética: - x = Textura_Suelo: eje x categórico. - y = Rendimiento_ton_ha: eje y continuo. - fill = Textura_Suelo: colores según tipo de suelo. - geom_boxplot(): dibuja diagramas de caja (boxplots). - labs(): asigna títulos y etiquetas. - theme_minimal(): estilo visual limpio. - scale_fill_viridis_d(): paleta de colores accesible (para daltónicos).

En estadística aplicada: - Diagrama de caja: Muestra: - Mediana (línea central): rendimiento típico. - Cuartiles (caja): 50% de los datos. - Bigotes: rango hasta 1.5× el rango intercuartílico. - Puntos: valores atípicos (posibles parcelas con problemas o excelente productividad). - Interpretación: Si el suelo franco tiene mediana más alta y menor variabilidad, es el más estable productivamente. - Útil para comparar distribuciones entre tratamientos o condiciones.


Análisis multivariado con facetas

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

En R: - aes(x = Humedad_, y = Rendimiento_ton_ha, color = Textura_Suelo): - Eje x: humedad (%). - Eje y: rendimiento (ton/ha). - Color: distingue tipos de suelo. - geom_point(alpha = 0.7): puntos con 70% de transparencia (evita sobrescritura). - geom_smooth(method = "lm", se = FALSE): añade línea de regresión lineal (sin intervalo de confianza). - facet_wrap(~ Zona, ncol = 2): crea subgráficos (facetas) separados por Zona, en 2 columnas. - scale_color_viridis_d(option = "D"): paleta de colores diferente (opción D).

En estadística aplicada: - Regresión lineal: La pendiente de la línea muestra cuánto aumenta el rendimiento por cada unidad de humedad. Se espera pendiente ≈ 0.15 (coeficiente del modelo). - Facetas por zona: Permite ver si la relación humedad-rendimiento es consistente en todas las zonas geográficas o si hay interacciones. - Análisis de interacción: Si las pendientes varían entre zonas, podría haber un efecto de interacción (ej. zona Norte responde más a la humedad que zona Sur). - Multivariado: Integra 3 variables (humedad, zona, tipo de suelo) en una visualización, capturando relaciones complejas del sistema agrícola.


Significado integrado para ingeniería agrícola

Este código simula y analiza un experimento agrícola donde:

  1. Factores controlados: Tipo de suelo, zona geográfica.
  2. Variable respuesta: Rendimiento (ton/ha).
  3. Covariable: Humedad del suelo.

Aplicaciones prácticas: - Manejo de riego: Entender la relación humedad-rendimiento para optimizar programación de riego. - Recomendación de cultivos: Saber qué suelos son más productivos para diferentes cultivos. - Zonificación agrícola: Identificar zonas que responden mejor a la humedad para inversiones en riego. - Diseño de experimentos: El código muestra cómo simular datos antes de implementar un experimento real (para estimar poder estadístico y tamaño de muestra).

Conceptos estadísticos clave: - Muestreo aleatorio (sample): Representatividad. - Modelo lineal (Rendimiento = β₀ + β₁·Humedad + efectos de suelo + error). - ANOVA implícito: comparación de grupos (suelos). - Regresión y correlación: relación humedad-rendimiento. - Análisis de residuos (aunque no se muestra): verificar supuestos del modelo.