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

Claro. Voy a explicar línea por línea, pero además de decir qué hace R, voy a conectar cada instrucción con su significado en estadística aplicada a la ingeniería agrícola.

  1. Instalación y carga de paquetes # Instalar y cargar paquetes si es necesario # install.packages(“tidyverse”) library(tidyverse)

Instalar y cargar paquetes si es necesario

El símbolo # indica un comentario en R. Todo lo que aparece después de # en esa línea no se ejecuta.

El comentario sirve para documentar el código y explicar qué estamos haciendo.

install.packages(“tidyverse”)

Esta línea está comentada porque tiene #, por lo tanto no se ejecuta.

Si se ejecutara:

install.packages(“tidyverse”)

R descargaría e instalaría el paquete tidyverse, que contiene herramientas muy utilizadas para manipulación, análisis y visualización de datos.

Por ejemplo, tidyverse incluye:

dplyr → manipulación y resumen de datos. ggplot2 → gráficos. tibble → tablas de datos. tidyr → organización de datos.

En ingeniería agrícola: permite trabajar con datos provenientes de parcelas, cultivos, sensores de humedad, rendimiento, textura del suelo, zonas de manejo, etc.

Normalmente install.packages() se ejecuta solo una vez. Después basta con utilizar library() cada vez que se inicia una sesión de R.

library(tidyverse)

Carga el paquete tidyverse en la sesión actual.

Esto permite utilizar funciones como:

tibble() mutate() case_when() group_by() summarise() select() ggplot() geom_boxplot() geom_point()

  1. Establecer una semilla # Establecer semilla para reproducibilidad set.seed(42)

set.seed(42)

Esta instrucción establece una semilla para la generación de números aleatorios.

En tu código posteriormente aparecen:

sample() rnorm()

que generan valores aleatorios.

Al utilizar:

set.seed(42)

R generará siempre la misma secuencia de números aleatorios cuando ejecutes nuevamente el código.

¿Por qué es importante estadísticamente?

Imagina que estás simulando 200 parcelas agrícolas.

Sin una semilla, cada ejecución podría producir:

diferentes texturas de suelo, diferentes humedades, diferentes rendimientos.

Con set.seed(42), todos los investigadores que ejecuten exactamente el mismo código obtendrán los mismos datos simulados.

Esto se llama reproducibilidad.

Aplicación agrícola

Es muy útil cuando estás desarrollando o probando un modelo antes de utilizar datos reales de:

rendimiento de maíz, humedad del suelo, propiedades físicas del suelo, producción de arroz, experimentos de fertilización, agricultura de precisión. 3. Creación de los 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)) )

Aquí se crea una tabla llamada:

df_lotes_r

El operador:

<-

significa asignar.

Es decir:

“Crea el objeto que está a la derecha y guárdalo con el nombre que está a la izquierda.”

tibble() tibble(…)

crea una tabla de datos.

Es similar a un data.frame, pero es una estructura especialmente utilizada dentro de tidyverse.

En este caso tendremos 200 filas, donde cada fila representa una parcela agrícola.

Podemos pensar:

ID_Parcela Zona Textura_Suelo 1 Norte Franco 2 Sur Arcilloso 3 Este Arenoso … … … 200 Oeste Franco ID_Parcela = 1:200 ID_Parcela = 1:200

El operador : genera una secuencia.

Por lo tanto:

1:200

produce:

1, 2, 3, 4, …, 199, 200

Cada parcela recibe un identificador único.

Estadística agrícola

ID_Parcela es una variable identificadora, no una variable cuantitativa que debamos promediar.

Por ejemplo:

Parcela 1, parcela 2, parcela 3…

El número 150 no significa que la parcela tenga “150 unidades” de alguna propiedad.

  1. Generación de la zona Zona = sample( c(‘Norte’, ‘Sur’, ‘Este’, ‘Oeste’), 200, replace = TRUE )

Aquí estamos simulando la ubicación de cada parcela.

c() c(‘Norte’, ‘Sur’, ‘Este’, ‘Oeste’)

c() significa combine y crea un vector.

Tenemos cuatro categorías:

Norte Sur Este Oeste sample() sample(…)

selecciona elementos aleatoriamente.

El número:

200

significa que queremos generar 200 observaciones.

replace = TRUE

Significa que el muestreo se hace con reemplazo.

Por eso una zona puede aparecer muchas veces.

Por ejemplo:

Norte Sur Norte Norte Este Oeste …

Interpretación estadística

Zona es una variable categórica nominal.

No podemos decir que:

Norte > Sur > Este

porque no existe un orden numérico natural entre esas categorías.

Ingeniería agrícola

La zona podría representar diferentes sectores de una finca:

Norte Sur Este Oeste

Esto permite posteriormente estudiar si existen diferencias espaciales en el rendimiento.

  1. Simulación de la textura del suelo Textura_Suelo = sample( c(‘Arcilloso’, ‘Franco’, ‘Arenoso’), 200, replace = TRUE, prob = c(0.3, 0.5, 0.2) )

Aquí se generan aleatoriamente las texturas del suelo.

Las categorías son:

Arcilloso Franco Arenoso

Pero ahora aparece algo importante:

prob = c(0.3, 0.5, 0.2)

Esto establece las probabilidades de selección.

Textura Probabilidad Arcilloso 30 % Franco 50 % Arenoso 20 %

Por tanto, esperamos aproximadamente:

60 parcelas arcillosas, 100 parcelas francas, 40 parcelas arenosas.

Pero no necesariamente exactamente esas cantidades, porque se trata de una simulación aleatoria.

Estadística

Estamos simulando una variable categórica con una distribución de probabilidad discreta.

Ingeniería agrícola

Tiene sentido porque en una finca real no necesariamente todas las parcelas tienen la misma textura.

La textura influye en propiedades como:

retención de agua, infiltración, drenaje, disponibilidad de agua, aireación, capacidad de almacenamiento de humedad. 6. %>%

Después aparece:

) %>% mutate(

El operador:

%>%

es el llamado pipe.

Permite pasar el resultado de una operación a la siguiente.

Conceptualmente:

crear tabla ↓ modificar tabla ↓ seleccionar columnas

Es decir, en vez de escribir muchas operaciones separadas, podemos construir un flujo de procesamiento.

  1. mutate() mutate(

mutate() sirve para crear nuevas variables o modificar variables existentes.

Aquí se van a crear:

Humedad_base Humedad_ Rendimiento_ton_ha

  1. case_when() Humedad_base = case_when( Textura_Suelo == ‘Arcilloso’ ~ 30, Textura_Suelo == ‘Franco’ ~ 22, TRUE ~ 12 ),

Esta parte establece una humedad base dependiendo de la textura.

Primera condición Textura_Suelo == ‘Arcilloso’ ~ 30

Si la textura es:

Arcilloso

entonces:

Humedad_base = 30

Segunda condición Textura_Suelo == ‘Franco’ ~ 22

Si el suelo es franco:

Humedad_base = 22

Tercera condición TRUE ~ 12

TRUE funciona aquí como “si ninguna de las condiciones anteriores se cumple”.

Por tanto, para suelo arenoso:

Humedad_base = 12

Tenemos entonces:

Textura Humedad base Arcilloso 30 Franco 22 Arenoso 12 Interpretación agrícola

Esto representa una hipótesis agronómica simplificada:

Los suelos arcillosos retienen más humedad, los francos una cantidad intermedia y los arenosos una cantidad menor.

No significa que estos valores sean universalmente correctos. Son valores simulados para construir un ejemplo estadístico.

  1. Generación de humedad Humedad_ = Humedad_base + rnorm(200, mean = 0, sd = 3),

Esta es una de las líneas estadísticamente más importantes.

Estamos creando una variable de humedad a partir de:

Humedad observada = Humedad base + variabilidad aleatoria

rnorm() rnorm(200, mean = 0, sd = 3)

genera 200 números aleatorios provenientes de una distribución normal.

Sus parámetros son:

mean = 0

media igual a 0.

sd = 3

desviación estándar igual a 3.

Por lo tanto:

𝜀 ∼ 𝑁 ( 0 , 3 2 )

La humedad simulada puede expresarse como:

𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 𝑖 = 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 𝐵 𝑎 𝑠 𝑒 𝑖 + 𝜀 𝑖

donde:

𝜀 𝑖 ∼ 𝑁 ( 0 , 3 2 )

¿Qué significa esto en agricultura?

Dos parcelas con la misma textura no necesariamente tendrán exactamente la misma humedad.

Por ejemplo, dos suelos francos podrían tener:

Parcela A → 20.5 % Parcela B → 23.7 % Parcela C → 18.9 %

Esto representa variabilidad natural o no explicada.

Puede deberse, por ejemplo, a diferencias en:

lluvia, riego, drenaje, posición topográfica, compactación, materia orgánica, cobertura vegetal. 10. Cálculo del rendimiento Rendimiento_ton_ha = 3 + (Humedad_ * 0.15) + if_else(Textura_Suelo == ‘Franco’, 2.5, 0) + rnorm(200, mean = 0, sd = 1.5)

Esta ecuación simula el rendimiento agrícola.

Podemos escribirla matemáticamente como:

𝑌 𝑖 = 3 + 0.15 𝐻 𝑖 + 2.5 𝐼 ( Franco ) + 𝜀 𝑖

donde:

𝑌 𝑖 = rendimiento de la parcela 𝑖 , 𝐻 𝑖 = humedad, 𝐼 ( Franco ) = indicador que vale 1 si el suelo es franco y 0 en caso contrario, 𝜀 𝑖 = error aleatorio. 3 3

Es el rendimiento base.

En este modelo:

𝑌

3 + . . .

se parte de aproximadamente 3 ton/ha.

Es un valor de referencia simulado.

(Humedad_ * 0.15) Humedad_ * 0.15

Establece una relación positiva entre humedad y rendimiento.

Por cada incremento de una unidad porcentual de humedad, el modelo aumenta el rendimiento esperado en:

0.15  ton/ha

Por ejemplo, si la humedad aumenta 10 puntos porcentuales:

10 ( 0.15 ) = 1.5

ton/ha adicionales en el rendimiento esperado.

Importante

Esto no demuestra causalidad. En este caso nosotros construimos artificialmente los datos con esa relación.

En datos agrícolas reales, necesitaríamos analizar si realmente existe evidencia estadística de una relación entre humedad y rendimiento.

  1. if_else() if_else(Textura_Suelo == ‘Franco’, 2.5, 0)

Significa:

Si el suelo es franco, agrega 2.5; de lo contrario, agrega 0.

Por ejemplo:

Textura Efecto Arcilloso 0 Franco +2.5 Arenoso 0 Interpretación estadística

Esto representa un efecto de una variable categórica sobre la variable respuesta.

Es parecido a introducir una variable indicadora:

𝐼 ( Franco ) = { 1

si es franco

0

si no

y multiplicarla por 2.5.

En un análisis real

Esto se relaciona con los modelos lineales y regresión con variables categóricas.

  1. Error aleatorio del rendimiento rnorm(200, mean = 0, sd = 1.5)

Nuevamente se genera un error aleatorio.

Ahora:

𝜀 𝑖 ∼ 𝑁 ( 0 , 1.5 2 )

Esto significa que aunque dos parcelas tengan exactamente la misma humedad y textura, pueden tener rendimientos diferentes.

En agricultura

El rendimiento depende de muchísimas variables que no están incluidas en el modelo:

fertilización, variedad cultivada, plagas, enfermedades, radiación solar, temperatura, precipitación, manejo del cultivo, pendiente, calidad del suelo, disponibilidad de nutrientes.

Ese término aleatorio representa, de manera simplificada, parte de esa variabilidad no explicada.

  1. select(-Humedad_base) select(-Humedad_base)

select() permite elegir columnas.

El signo:

significa eliminar esa columna.

Por tanto:

select(-Humedad_base)

elimina Humedad_base.

¿Por qué?

Porque la humedad base fue una variable intermedia utilizada para construir Humedad_, pero probablemente no necesitamos conservarla en la tabla final.

  1. Mostrar las primeras filas print(head(df_lotes_r))

head() head(df_lotes_r)

muestra las primeras filas de la tabla.

Por defecto, normalmente muestra las primeras 6 filas.

print() print(…)

muestra el resultado en la consola.

Aplicación

Es una primera revisión de los datos para comprobar:

que las columnas existen, que los valores parecen razonables, que no hubo errores durante la simulación.

Esto forma parte de la exploración inicial de datos.

  1. Resumen estadístico agrupado

Ahora comienza el primer análisis estadístico:

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

Aquí estamos preguntando:

¿Cuál es la humedad promedio y cuál es el rendimiento promedio para cada tipo de suelo?

  1. group_by() group_by(Textura_Suelo)

divide conceptualmente los datos en grupos:

Arcilloso Franco Arenoso

Luego las operaciones estadísticas se realizan por separado para cada grupo.

Por ejemplo:

𝐻 ˉ 𝑎 𝑟 𝑐 𝑖 𝑙 𝑙 𝑜 𝑠 𝑜

𝐻 ˉ 𝑓 𝑟 𝑎 𝑛 𝑐 𝑜

𝐻 ˉ 𝑎 𝑟 𝑒 𝑛 𝑜 𝑠 𝑜

  1. summarise() summarise(

genera un resumen estadístico de cada grupo.

Aquí calculamos dos estadísticas.

  1. Media de humedad Humedad_media = mean(Humedad_, na.rm = TRUE)

Calcula la media aritmética:

𝑥 ˉ = 1 𝑛 ∑ 𝑖 = 1 𝑛 𝑥 𝑖

En este caso:

𝐻 ˉ = 𝐻 1 + 𝐻 2 + ⋯ + 𝐻 𝑛 𝑛

na.rm = TRUE

Significa:

Ignorar valores faltantes (NA) al calcular la media.

Esto es importante porque si hubiera valores NA, sin na.rm = TRUE, la media podría resultar en NA.

  1. Rendimiento medio Rendimiento_medio = mean(Rendimiento_ton_ha, na.rm = TRUE)

Calcula:

𝑌 ˉ = 1 𝑛 ∑ 𝑖 = 1 𝑛 𝑌 𝑖

para cada textura.

El resultado podría tener una estructura como:

Textura Humedad_media Rendimiento_medio Arcilloso … … Arenoso … … Franco … … Interpretación agrícola

Esta tabla permite responder preguntas como:

¿Qué tipo de suelo presenta mayor humedad promedio?

y:

¿Qué tipo de suelo presenta mayor rendimiento promedio?

Pero cuidado: una diferencia de medias no necesariamente significa que exista una diferencia estadísticamente significativa.

Para demostrarlo formalmente podríamos utilizar, dependiendo del diseño experimental:

ANOVA, prueba t, modelos lineales, modelos mixtos, pruebas post-hoc. 20. Imprimir el resumen print(resumen_suelos_r)

Muestra en la consola la tabla resumen.

  1. Boxplot del rendimiento

Ahora comienza la parte gráfica:

df_lotes_r %>% ggplot(aes(x = Textura_Suelo, y = Rendimiento_ton_ha, fill = Textura_Suelo)) + geom_boxplot() +

El objetivo es comparar visualmente el rendimiento entre los tres tipos de suelo.

  1. ggplot() ggplot(aes( x = Textura_Suelo, y = Rendimiento_ton_ha, fill = Textura_Suelo ))

ggplot2 utiliza una filosofía llamada Grammar of Graphics.

Aquí estamos indicando qué variable corresponde a cada elemento visual.

x = Textura_Suelo

La textura del suelo se coloca en el eje X.

Tenemos:

Arcilloso | Franco | Arenoso

Es una variable categórica.

y = Rendimiento_ton_ha

El rendimiento se coloca en el eje Y.

Es una variable cuantitativa continua.

fill = Textura_Suelo

Cada categoría tendrá un color diferente.

  1. geom_boxplot() geom_boxplot()

crea un diagrama de cajas y bigotes.

Este gráfico permite estudiar la distribución del rendimiento dentro de cada tipo de suelo.

El boxplot permite visualizar aproximadamente:

mediana, primer cuartil, tercer cuartil, rango intercuartílico, posibles valores atípicos. Estadística

La caja representa:

𝐼 𝑄 𝑅 = 𝑄 3 − 𝑄 1

donde:

𝑄 1 = primer cuartil, 𝑄 3 = tercer cuartil.

La línea central normalmente representa la mediana.

Aplicación agrícola

Podemos observar no solamente cuál suelo tiene mayor rendimiento, sino también:

¿Qué suelo presenta mayor variabilidad en el rendimiento?

Por ejemplo, un suelo podría tener una media alta pero una enorme variabilidad entre parcelas.

Eso es importante para la toma de decisiones agrícolas.

  1. labs() labs( title = ‘Variabilidad del Rendimiento según el Tipo de Suelo’, x = ‘Textura del Suelo’, y = ‘Rendimiento (ton/ha)’ )

Sirve para colocar etiquetas.

title

Título del gráfico.

x

Nombre del eje X.

y

Nombre del eje Y.

No modifica el análisis estadístico; mejora la comunicación de los resultados.

  1. theme_minimal() theme_minimal()

aplica un diseño visual minimalista al gráfico.

No cambia los datos ni los cálculos estadísticos.

  1. scale_fill_viridis_d() scale_fill_viridis_d( option = “A”, begin = 0.5 )

cambia los colores utilizados para las categorías.

La d significa que estamos trabajando con una escala discreta, porque Textura_Suelo es categórica.

Es principalmente una cuestión de visualización.

  1. Análisis multivariado

Ahora tenemos:

df_lotes_r %>% ggplot(aes( x = Humedad_, y = Rendimiento_ton_ha, color = Textura_Suelo )) +

Este gráfico estudia simultáneamente:

humedad, rendimiento, textura del suelo, zona.

Por eso podemos considerarlo una visualización multivariada.

  1. Eje X: humedad x = Humedad_

La humedad se coloca en el eje X.

Es una variable cuantitativa continua.

  1. Eje Y: rendimiento y = Rendimiento_ton_ha

El rendimiento se coloca en el eje Y.

También es cuantitativo continuo.

Esto permite estudiar visualmente la relación:

𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 → 𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜

  1. Color según textura color = Textura_Suelo

Cada tipo de suelo recibe un color.

Así podemos estudiar si la relación entre humedad y rendimiento parece diferente dependiendo de la textura.

Por ejemplo:

    Rendimiento
         ↑
         |
   • • • | Franco
 • •     |

• | ————-|———-→ Humedad

  1. geom_point() geom_point(alpha = 0.7)

crea un diagrama de dispersión.

Cada punto representa una parcela.

Por ejemplo:

( 𝑥 𝑖 , 𝑦 𝑖 ) = ( 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 𝑖 , 𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 𝑖 )

alpha = 0.7

Controla la transparencia de los puntos.

Un valor de 0.7 significa que los puntos son parcialmente transparentes.

Estadística agrícola

El gráfico permite identificar visualmente:

asociación entre humedad y rendimiento, tendencia positiva o negativa, dispersión, posibles valores atípicos, diferencias entre tipos de suelo. 32. geom_smooth() geom_smooth(method = “lm”, se = FALSE)

Esta línea agrega una línea de regresión lineal.

method = “lm”

lm significa linear model.

R ajusta un modelo lineal de la forma:

𝑌

𝛽 0 + 𝛽 1 𝑋 + 𝜀

En este caso:

𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 = 𝛽 0 + 𝛽 1 ( 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 ) + 𝜀

se = FALSE

No muestra la banda correspondiente al error estándar/confianza alrededor de la línea.

Si fuera:

se = TRUE

se mostraría una banda de incertidumbre.

Interpretación

Si la línea tiene pendiente positiva:

Existe una asociación lineal positiva entre humedad y rendimiento en los datos.

Pero nuevamente:

correlación o asociación no implica necesariamente causalidad.

  1. Facetas por zona facet_wrap(~ Zona, ncol = 2)

Esta es una herramienta muy interesante.

Divide el gráfico en diferentes paneles según:

Zona

Como tenemos:

Norte Sur Este Oeste

obtendremos cuatro gráficos.

ncol = 2

Indica que los paneles se organizarán en 2 columnas.

Conceptualmente:

Norte Sur

Este Oeste

Aplicación agrícola

Esto permite preguntarnos:

¿La relación entre humedad y rendimiento es similar en todas las zonas de la finca?

Por ejemplo, quizá:

en el Norte la humedad esté fuertemente asociada al rendimiento, en el Sur exista una relación débil, en el Este exista mayor dispersión.

Eso podría sugerir que existen efectos espaciales.

  1. Etiquetas del gráfico labs( title = ‘Relación Humedad-Rendimiento por Zona y Tipo de Suelo’, x = ‘Humedad (%)’, y = ‘Rendimiento (ton/ha)’, color = ‘Textura del Suelo’ )

Define:

título, nombre del eje X, nombre del eje Y, nombre de la leyenda. 35. Tema visual theme_minimal()

Aplica nuevamente un estilo minimalista.

No afecta los resultados estadísticos.

  1. Colores scale_color_viridis_d(option = “D”)

Asigna colores a las diferentes categorías de textura.

La d indica nuevamente una variable discreta.

  1. ¿Qué está haciendo estadísticamente todo el código?

Podemos resumir el flujo completo así:

          SIMULACIÓN
              ↓
   200 parcelas agrícolas
              ↓
    ┌─────────┴─────────┐
    ↓                   ↓

Zona agrícola Textura del suelo ↓ ↓ Norte/Sur/etc. Arcilloso/Franco/Arenoso ↓ Humedad del suelo ↓ Rendimiento agrícola ↓ ┌─────────────┴──────────────┐ ↓ ↓ Estadística descriptiva Visualización ↓ ↓ Medias por textura Boxplot + dispersión ↓ Regresión lineal ↓ Facetas por zona

  1. ¿Qué variables tenemos?

Desde el punto de vista estadístico:

Variable Tipo estadístico Papel ID_Parcela Identificadora Identifica cada parcela Zona Categórica nominal Factor espacial Textura_Suelo Categórica nominal Factor del suelo Humedad_ Cuantitativa continua Variable explicativa Rendimiento_ton_ha Cuantitativa continua Variable respuesta 39. ¿Cuál es la pregunta agrícola central?

El código está construido alrededor de una pregunta como:

¿Cómo se relacionan la humedad y la textura del suelo con el rendimiento agrícola y cómo cambia esa relación entre diferentes zonas de una finca?

Esto es muy típico de la estadística aplicada a la ingeniería agrícola y agricultura de precisión.

Se puede pensar en:

𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 = 𝑓 ( 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 ,   𝑇 𝑒 𝑥 𝑡 𝑢 𝑟 𝑎 ,   𝑍 𝑜 𝑛 𝑎 )

  1. Una observación estadística importante

Tu código realiza principalmente estadística descriptiva y exploratoria:

medias, agrupaciones, boxplots, gráficos de dispersión, líneas de regresión.

Pero todavía no está realizando una prueba estadística formal para determinar si las diferencias observadas son estadísticamente significativas.

Por ejemplo, si obtenemos:

Arcilloso → 9.0 ton/ha Franco → 11.5 ton/ha Arenoso → 7.2 ton/ha

no podemos concluir automáticamente:

“El suelo franco produce significativamente más”.

Para afirmarlo estadísticamente podríamos plantear, por ejemplo:

𝐻 0 : 𝜇 𝐴 𝑟 𝑐 𝑖 𝑙 𝑙 𝑜 𝑠 𝑜 = 𝜇 𝐹 𝑟 𝑎 𝑛 𝑐 𝑜 = 𝜇 𝐴 𝑟 𝑒 𝑛 𝑜 𝑠 𝑜

frente a:

𝐻 1 : al menos una media es diferente

y utilizar un ANOVA.

También podríamos construir un modelo de regresión más completo, por ejemplo:

𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 = 𝛽 0 + 𝛽 1 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 + 𝛽 2 𝑇 𝑒 𝑥 𝑡 𝑢 𝑟 𝑎 + 𝛽 3 𝑍 𝑜 𝑛 𝑎 + 𝜀

e incluso estudiar interacciones:

𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 = 𝛽 0 + 𝛽 1 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 + 𝛽 2 𝑇 𝑒 𝑥 𝑡 𝑢 𝑟 𝑎 + 𝛽 3 𝑍 𝑜 𝑛 𝑎 + 𝛽 4 ( 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 × 𝑇 𝑒 𝑥 𝑡 𝑢 𝑟 𝑎 ) + 𝜀

Esto permitiría determinar si el efecto de la humedad sobre el rendimiento depende de la textura del suelo, que es una pregunta mucho más interesante desde el punto de vista agronómico.

En otras palabras, tu código es un muy buen punto de partida para un análisis estadístico agrícola, porque primero explora los datos y después permite avanzar hacia ANOVA, regresión múltiple e interacciones.