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,
sep = ","
)
# =========================
# 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)
# =========================
# Paso 1: Ordenar la variable independiente (x)
# =========================
x_ord <- sort(df$x)
# =========================
# Paso 2: Preparar la variable dependiente con tendencia
# =========================
y_base <- sort(df$y)
# =========================
# Parámetros para evitar una relación perfecta
# =========================
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
n <- length(y_mix)
inicios <- seq(1, n, by = ventana)
for (ini in inicios) {
fin <- min(ini + ventana - 1, n)
y_mix[ini:fin] <- sample(y_mix[ini:fin])
}
# =========================
# 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,
y = y_final
)
# =========================
# Gráfica de nube de puntos
# =========================
plot(
TVP_realista$x,
TVP_realista$y,
main = "Nube de puntos con tendencia (realista)",
xlab = "Concentración del contaminante (mg/kg)",
ylab = "pH del suelo",
pch = 16,
col = "skyblue"
)
# =========================
# Recta de ajuste lineal (visual)
# =========================
abline(lm(y ~ x, data = TVP_realista), lwd = 2)

# =========================
# Coeficiente de correlación de Pearson
# =========================
r <- cor(TVP_realista$x, TVP_realista$y) * 100
r
## [1] 97.73513
# =========================
# Coeficiente de determinación (R²)
# =========================
r2 <- r * r / 100
r2
## [1] 95.52156