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.
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
datos <- read.csv(
"waterPollution.csv",
header = TRUE,
sep = ",",
dec = "."
)
RMV <- na.omit(datos$resultMeanValue)
# Transformación logarítmica
RMV <- log10(RMV + 1)
# 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)
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 | |||||||
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()
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.
# 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
# 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"
)
# 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
# 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
¿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
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
)
¿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.
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 |
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.