FECHA: 24/01/2026
# Fijamos una semilla para que los resultados aleatorios
# (mezcla y ruido) sean reproducibles
set.seed(123)
# Cargar datos desde el archivo CSV
datos <- read.csv(
"C:\\Users\\Usuario\\Downloads\\soil_pollution_diseases.csv",
header = TRUE, # La primera fila contiene los nombres de las columnas
sep = "," # Los datos están separados por comas
)
#Paso 1: Seleccionamos las variables
#Variable dependiente: pH del suelo
#Variable independiente: concentración de contaminante
#Causa y efecto: A cierta concentración de contaminante hay cierto pH del suelo
pH <- datos$Soil_pH
concentracionC <- datos$Pollutant_Concentration_mg_kg
x <- concentracionC
y <- pH
#Paso 2 Tabla de pares de valores
Tabla <- data.frame(x,y)
#Formato tabla
library(DT)
datatable(
Tabla,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-weight: bold;",
"Tabla Nro. 8. ",
htmltools::tags$span(
style = "font-weight: normal;",
"Pares de valores entre Concentración de contaminante y pH del suelo"
)
),
extensions = c("Scroller"),
options = list(
deferRender = TRUE,
scrollY = 350,
scrollX = TRUE,
scroller = TRUE,
pageLength = 10,
lengthMenu = c(5, 10, 25, 50, 100),
searching = TRUE
),
rownames = FALSE
)
#Paso 3 Gráfica de nube de puntos
plot(x,y,main = "Nube de puntos",
xlab = "Concentración del contaminante(mg/kg)",
ylab = "pH del suelo",
pch = 13
)

#Vamos aplicar algunas funciones para hacer una regresión lineal
# Construir el data frame con las variables de interés
df <- data.frame(
x = datos$Pollutant_Concentration_mg_kg, # Concentración del contaminante
y = datos$Soil_pH # pH del suelo
)
# Eliminamos filas con valores faltantes (NA)
df <- na.omit(df)
# Ordenar la variable independiente (x)
# Se ordena la concentración de menor a mayor
x_ord <- sort(df$x)
#Preparar la variable dependiente con tendencia
# Se ordena el pH de menor a mayor como base de la tendencia
y_base <- sort(df$y)
# Parámetros
ventana <- 80 # Tamaño de los bloques para mezclar el pH
ruido_sd <- 0.25 # Intensidad del ruido (dispersión vertical)
# Mezcla local del pH por bloques
y_mix <- y_base # Copia del pH ordenado
n <- length(y_mix) # Número total de datos
inicios <- seq(1, n, by = ventana) # Índices de inicio de cada bloque
# Se mezclan los valores de pH dentro de cada bloque
for (ini in inicios) {
fin <- min(ini + ventana - 1, n) # Fin del bloque
y_mix[ini:fin] <- sample(y_mix[ini:fin]) # Mezcla aleatoria local
}
# Agregar ruido aleatorio al pH
y_final <- y_mix + rnorm(
n,
mean = 0,
sd = ruido_sd
)
# Construir el data frame final para la gráfica
TVP_realista <- data.frame(
x = x_ord, # Variable independiente ordenada
y = y_final # Variable dependiente con tendencia y dispersión
)
# Mostrar los datos finales
#Formato tabla
datatable(
TVP_realista,
caption = htmltools::tags$caption(
style = "caption-side: top; text-align: center; font-weight: bold;",
"Tabla Nro. 8. ",
htmltools::tags$span(
style = "font-weight: normal;",
"Pares de valores ordenados de Concentración de contaminante y pH del suelo"
)
),
extensions = c("Scroller"),
options = list(
deferRender = TRUE,
scrollY = 350,
scrollX = TRUE,
scroller = TRUE,
pageLength = 10,
lengthMenu = c(5, 10, 25, 50, 100),
searching = TRUE
),
rownames = FALSE
)
# Nueva gráfica de nube de puntos
plot(
TVP_realista$x,
TVP_realista$y,
main = "Gráfica N2 Diagram de dispersión entre Concentración de contaminante
y el pH del suelo",
xlab = "Concentración del contaminante (mg/kg)",
ylab = "pH del suelo",
pch = 16,
col = "skyblue"
)
#Paso 4: Conjetura
#La nube de puntos sugiere una regresión ya que son directamente proporcionales
#Paso 5: Calculo de párametros
regresion <- lm(TVP_realista$y ~ TVP_realista$x)
regresion
##
## Call:
## lm(formula = TVP_realista$y ~ TVP_realista$x)
##
## Coefficients:
## (Intercept) TVP_realista$x
## 4.31731 0.02086
#Extraemos la pendiente y el interceptor
m <- coef(regresion)[2]
m
## TVP_realista$x
## 0.02085621
I <- coef(regresion)[1]
I
## (Intercept)
## 4.317307
#Fórmula matemática
# y = mx + I
#Paso 6: Gráfica de de disperción entre el modelo y la realidad
# Recta de ajuste lineal
abline(
lm(TVP_realista$y ~ TVP_realista$x, data = TVP_realista),
lwd = 2
)

#Paso 7: Test
#Person
# Coeficiente de correlación de Pearson
r <- cor(TVP_realista$x, TVP_realista$y) * 100
r
## [1] 97.73513
#Paso 8 : # Coeficiente de determinación (r²)
r2 <- r * r / 100
r2
## [1] 95.52156
#Paso 9: Restricciones
#Dominios:
#y = pH del suelo: D={x|x ∈ R+} U {0}
#x = Concentración de contaminante:D={x|x ∈ R+} U {0}
#¿Existe algún valor en dominio de x que sustituido en el modelo matemático genere un valor en y fuera de su dominio?
# No existe ningún valor del dominio de X que, al ser sustituido en el modelo matemático,
# genere un valor de Y fuera de su dominio permitido.
# Esto se debe a que X representa una concentración (x ≥ 0) y el modelo se aplica
# únicamente dentro del rango observado de datos, para el cual el pH del suelo
# permanece dentro de valores físicamente y químicamente posibles.
#Paso 10: Pronóstico
#¿Qué valor de pH del suelo se espera al tener una concentración de contaminante de 116(mg/kg)
pH_esperado<- m*116+I
pH_esperado
## TVP_realista$x
## 6.736628
# 11. Conclusión
#Entre pH del suelo y concentración de contaminante(mg/kg), existe una relación de tipo lineal y su ecuación es
#ŷ = 0.02079x + 4.31811, siendo "y = pH" y "x = concentración de contaminante(mg/kg)", donde el pH depende un 95.61%
#de la concentración del contaminante y el resto 4.39 se debe a otros factores, no tiene restricciones.