# 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.
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()
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.
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.
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.
mutate() sirve para crear nuevas variables o modificar variables existentes.
Aquí se van a crear:
Humedad_base Humedad_ Rendimiento_ton_ha
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.
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.
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.
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.
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.
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.
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?
divide conceptualmente los datos en grupos:
Arcilloso Franco Arenoso
Luego las operaciones estadísticas se realizan por separado para cada grupo.
Por ejemplo:
𝐻 ˉ 𝑎 𝑟 𝑐 𝑖 𝑙 𝑙 𝑜 𝑠 𝑜
𝐻 ˉ 𝑓 𝑟 𝑎 𝑛 𝑐 𝑜
𝐻 ˉ 𝑎 𝑟 𝑒 𝑛 𝑜 𝑠 𝑜
genera un resumen estadístico de cada grupo.
Aquí calculamos dos estadísticas.
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.
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.
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.
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.
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.
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.
aplica un diseño visual minimalista al gráfico.
No cambia los datos ni los cálculos estadísticos.
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.
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.
La humedad se coloca en el eje X.
Es una variable cuantitativa continua.
El rendimiento se coloca en el eje Y.
También es cuantitativo continuo.
Esto permite estudiar visualmente la relación:
𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 → 𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜
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
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.
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.
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.
Asigna colores a las diferentes categorías de textura.
La d indica nuevamente una variable discreta.
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
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:
𝑅 𝑒 𝑛 𝑑 𝑖 𝑚 𝑖 𝑒 𝑛 𝑡 𝑜 = 𝑓 ( 𝐻 𝑢 𝑚 𝑒 𝑑 𝑎 𝑑 , 𝑇 𝑒 𝑥 𝑡 𝑢 𝑟 𝑎 , 𝑍 𝑜 𝑛 𝑎 )
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.