En el análisis descriptivo previo de la variable Valor Medio (resultMeanValue) se determinó que, debido a la marcada asimetría positiva de los datos, era conveniente aplicar una transformación logarítmica mediante la expresión log10(x + 1). Por tal motivo, en el presente modelo de distribución Normal se trabajará con la variable transformada, ya que esta permite una mejor representación de la distribución de los datos y facilita el ajuste del modelo.

Nota: El modelo de distribución Normal se ajustó utilizando la variable transformada mediante log10(x + 1). Cuando corresponda, los resultados se interpretarán en la escala original de la variable con el fin de facilitar su comprensión.

0. CARGA DE LIBRERÍAS

library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

1. CARGA DE DATOS

datos <- read.csv(
  "waterPollution.csv",
  header = TRUE,
  sep = ",",
  dec = "."
)

2. SELECCIÓN DE LA VARIABLE ALEATORIA

RMV <- na.omit(datos$resultMeanValue)

# Transformación logarítmica
RMV <- log10(RMV + 1)

3. TABLA DE DISTRIBUCIÓN DE FRECUENCIAS

# Tamaño de muestra
n <- length(RMV)

# Histograma para obtener los intervalos
histoP <- hist(
  RMV,
  breaks = 8,
  plot = FALSE
)

# Límites
Li <- histoP$breaks[-length(histoP$breaks)]
Ls <- histoP$breaks[-1]

# Marcas de clase
MC <- histoP$mids

# Frecuencias absolutas
ni <- histoP$counts

# Frecuencias relativas
hi <- (ni / n) * 100

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))

# Intervalos
Intervalo <- paste0(
  "[",
  round(Li,1),
  " - ",
  round(Ls,1),
  ")"
)

Intervalo[length(Intervalo)] <- paste0(
  "[",
  round(Li[length(Li)],1),
  " - ",
  round(Ls[length(Ls)],1),
  "]"
)

# Tabla
TDF_RMV <- data.frame(
  Intervalo,
  MC = round(MC,2),
  ni,
  hi = round(hi,2),
  Ni_ascendente = Ni_asc,
  Ni_descendente = Ni_desc,
  Hi_ascendente = round(Hi_asc,2),
  Hi_descendente = round(Hi_desc,2)
)

# Totales
totales <- data.frame(
  Intervalo = "Totales",
  MC = "-",
  ni = sum(ni),
  hi = round(sum(hi),2),
  Ni_ascendente = "-",
  Ni_descendente = "-",
  Hi_ascendente = "-",
  Hi_descendente = "-"
)

TDF_RMV_Completa <- rbind(TDF_RMV, totales)

Tabla N°1

TDF_RMV_Completa %>%
  gt() %>%
  tab_header(
    title = "Tabla N°1",
    subtitle = "Distribución de frecuencias de la variable Valor Medio para el análisis de la calidad del agua en Europa."
  ) %>%
  tab_source_note(
    source_note = md("Fuente: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    column_labels.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  )
Tabla N°1
Distribución de frecuencias de la variable Valor Medio para el análisis de la calidad del agua en Europa.
Intervalo MC ni hi Ni_ascendente Ni_descendente Hi_ascendente Hi_descendente
[0 - 0.5) 0.25 10211 51.05 10211 20000 51.05 100
[0.5 - 1) 0.75 4222 21.11 14433 9789 72.16 48.94
[1 - 1.5) 1.25 2341 11.70 16774 5567 83.87 27.84
[1.5 - 2) 1.75 1700 8.50 18474 3226 92.37 16.13
[2 - 2.5) 2.25 980 4.90 19454 1526 97.27 7.63
[2.5 - 3) 2.75 497 2.48 19951 546 99.75 2.73
[3 - 3.5) 3.25 45 0.22 19996 49 99.98 0.24
[3.5 - 4) 3.75 2 0.01 19998 4 99.99 0.02
[4 - 4.5] 4.25 2 0.01 20000 2 100 0.01
Totales - 20000 100.00 - - - -
Fuente: Grupo 3

4. GRÁFICA DE DISTRIBUCIÓN DE FRECUENCIAS

bp <- barplot(
  hi,
  space = 0,
  names.arg = FALSE,
  xaxt = "n",
  yaxt = "n",
  main = "Gráfica N°1 Distribución del Valor Medio\nCalidad del agua en Europa",
  xlab = "Valor Medio (log10)",
  ylab = "Porcentaje",
  col = "steelblue2",
  border = "black",
  ylim = c(0,55),
  cex.main = 0.8
)

axis(
  1,
  at = bp,
  labels = Intervalo,
  las = 2,
  cex.axis = 0.8
)

axis(
  2,
  at = seq(0,55,5),
  labels = seq(0,55,5),
  las = 1
)

grid()

5. CONJETURA

La distribución de la variable transformada presenta una mayor concentración de observaciones en los intervalos centrales y un comportamiento aproximadamente simétrico. Por esta razón, para el ajuste del modelo de distribución Normal se seleccionan únicamente los intervalos 3, 4 y 5, ya que representan la parte de la distribución que mejor se aproxima a la forma característica de una distribución Normal. En consecuencia, el modelo se ajustará únicamente sobre dicho subconjunto de datos.

6. PARÁMETROS

# Selección únicamente de los intervalos 3, 4 y 5

RMV1 <- RMV[
  RMV >= 1 &
  RMV < 2.5
]

# Parámetros del modelo Normal

mu <- mean(RMV1)
mu
## [1] 1.595336
sigma <- sd(RMV1)
sigma
## [1] 0.4228124

7. SOBREPOSICIÓN DE LA REALIDAD CON EL MODELO

# Cortes correspondientes a los intervalos 3, 4 y 5

cortes_limpios <- c(1, 1.5, 2, 2.5)

hist(
  RMV1,
  breaks = cortes_limpios,
  freq = FALSE,
  main = "Gráfica N°2: Comparación de la realidad con el modelo Normal",
  xlab = "Valor Medio (log10)",
  ylab = "Densidad de probabilidad",
  col = "grey85",
  border = "black",
  ylim = c(0,1.2),
  xaxt = "n"
)

axis(
  1,
  at = cortes_limpios,
  labels = cortes_limpios
)

x <- seq(
  min(RMV1),
  max(RMV1),
  by = 0.01
)

curve(
  dnorm(x, mu, sigma),
  add = TRUE,
  lwd = 3,
  col = "steelblue"
)

8. TEST DE BONDAD

8.1. Test de Pearson

# Frecuencias observadas

Fo <- as.numeric(
  table(
    cut(
      RMV1,
      breaks = cortes_limpios,
      include.lowest = TRUE
    )
  )
)

Fo
## [1] 2346 1700  980
# Tamaño de muestra

n <- length(RMV1)

# Probabilidades teóricas

p <- diff(
  pnorm(
    cortes_limpios,
    mean = mu,
    sd = sigma
  )
)

# Frecuencias esperadas

Fe <- p * n

Fe
## [1] 1664.8265 2110.5838  769.3401
# Coeficiente de Pearson

Correlacion <- cor(Fo, Fe) * 100

Correlacion
## [1] 67.87724

8.2. Test de Chi-cuadrado

# Frecuencias relativas observadas

Fo_fraccion <- Fo / n

Fo_fraccion
## [1] 0.4667728 0.3382411 0.1949861
# Frecuencias relativas esperadas

Fe_fraccion <- p

Fe_fraccion
## [1] 0.3312428 0.4199331 0.1530720
# Estadístico Chi-cuadrado

x2 <- sum(
  (Fo_fraccion - Fe_fraccion)^2 /
    Fe_fraccion
)

x2
## [1] 0.08282173
# Grados de libertad

k <- length(Fo)

grados_libertad <- k - 1

grados_libertad
## [1] 2
# Valor crítico

chi_critico <- qchisq(
  0.95,
  df = grados_libertad
)

chi_critico
## [1] 5.991465
# Decisión

x2 < chi_critico
## [1] TRUE

9. CÁLCULO DE PROBABILIDADES

9.1. Pregunta de porcentaje

¿Cuál es la probabilidad de que el valor medio se encuentre entre 30.62 y 99.00 en el estudio de la calidad del agua en Europa?

# Límites en escala logarítmica
a_log <- 1.5
b_log <- 2

# Límites en escala original
a_real <- round(10^a_log - 1, 2)
b_real <- round(10^b_log - 1, 2)

# Probabilidad
Probabilidad <- (pnorm(b_log, mu, sigma) -
                   pnorm(a_log, mu, sigma)) * 100

Probabilidad
## [1] 41.99331

DEMOSTRACIÓN GRÁFICA

x <- seq(
  min(RMV1),
  max(RMV1),
  by = 0.01
)

plot(
  x,
  dnorm(x, mu, sigma),
  type = "l",
  lwd = 2,
  col = "steelblue",
  main = "Gráfica N°3: Cálculo de probabilidades",
  xlab = "Valor Medio (Escala log10)",
  ylab = "Densidad de probabilidad"
)

x_section <- seq(1.5, 2, by = 0.001)

y_section <- dnorm(
  x_section,
  mu,
  sigma
)

lines(
  x_section,
  y_section,
  col = "red",
  lwd = 2
)

polygon(
  c(x_section, rev(x_section)),
  c(y_section, rep(0, length(y_section))),
  col = rgb(1,0,0,0.5),
  border = NA
)

legend(
  "topright",
  legend = c(
    "Modelo Normal",
    "Área de Probabilidad"
  ),
  col = c(
    "steelblue",
    "red"
  ),
  lwd = 2,
  cex = 0.8
)

text(
  x = 2.15,
  y = max(dnorm(x, mu, sigma))*0.9,
  labels = paste0(
    "P(",
    a_real,
    " - ",
    b_real,
    ") = ",
    round(Probabilidad,2),
    "%"
  ),
  cex = 0.8
)

9.2. Pregunta de cantidad

¿Cuántas observaciones se espera que presenten un valor medio comprendido entre 9.00 y 30.62, de acuerdo con el modelo Normal ajustado?

# Límites en escala logarítmica
a_log <- 1
b_log <- 1.5

# Límites en escala original
a_real <- round(10^a_log - 1, 2)
b_real <- round(10^b_log - 1, 2)

# Cantidad esperada de observaciones
Cantidad <- (
  pnorm(b_log, mu, sigma) -
  pnorm(a_log, mu, sigma)
) * n

Cantidad <- round(Cantidad)

Cantidad
## [1] 1665

Interpretación: De acuerdo con el modelo Normal ajustado, se espera que aproximadamente 1665 observaciones presenten un valor medio comprendido entre 9 y 30.62 en la escala original de la variable.

10. INTERVALO DE CONFIANZA

media <- mean(RMV)

sigma_total <- sd(RMV)

n_total <- length(RMV)

error <- 2 * (sigma_total / sqrt(n_total))

limite_inferior <- media - error
limite_superior <- media + error

# Transformación a escala original

limite_inferior_real <- round(10^(limite_inferior) - 1,2)
limite_superior_real <- round(10^(limite_superior) - 1,2)

tabla_intervalo <- data.frame(
  Intervalo = paste0(
    "P [",
    limite_inferior_real,
    " < μ < ",
    limite_superior_real,
    "] = 95%"
  )
)

tabla_intervalo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla N°2*"),
    subtitle = md("**Intervalo de confianza del Valor Medio**")
  ) %>%
  tab_source_note(
    source_note = md("Fuente: Grupo 3")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    column_labels.border.bottom.color = "black",
    row.striping.include_table_body = TRUE
  )
Tabla N°2
Intervalo de confianza del Valor Medio
Intervalo
P [4.05 < μ < 4.3] = 95%
Fuente: Grupo 3

11. CONCLUSIÓN

La variable Valor Medio (resultMeanValue) presentó un comportamiento que, tras aplicar la transformación logarítmica log10(x + 1), fue modelado satisfactoriamente mediante una distribución Normal. El modelo quedó definido por una media poblacional de μ = 1.5953 y una desviación estándar de σ = 0.4228.

Mediante el intervalo de confianza del 95 %, se estimó que la media poblacional se encuentra dentro del intervalo calculado, proporcionando una estimación confiable del comportamiento de la variable. Además, la prueba de bondad de ajuste produjo un estadístico Chi-cuadrado de 0.0828, inferior al valor crítico de 5.9915, por lo que se concluye que el modelo Normal es adecuado para representar la distribución de los datos analizados.