CARGA DE LIBRERÍAS
library(readxl)
library(gt)
library(dplyr)
CARGA DE DATOS
datos <- read_excel(
"C:/Users/klaus/Downloads/CONCENTRACION_TOTAL_METALES_PPM_modelo_lognormal_2500.xlsx",
sheet = "Datos_LOGNORMAL"
)
# Selección de variable
concentracion_metales <- datos$CONCENTRACION_TOTAL_METALES_PPM
# Conversión a numérico
concentracion_metales <- as.numeric(concentracion_metales)
# Eliminación de datos faltantes y valores no positivos
# El modelo log-normal solo trabaja con valores mayores que cero
concentracion_metales <- concentracion_metales[
!is.na(concentracion_metales) & concentracion_metales > 0
]
# FRECUENCIA
# 1. Calculamos el rango y definimos la amplitud necesaria para 10 intervalos
min_met <- floor(min(concentracion_metales, na.rm = TRUE))
max_met <- ceiling(max(concentracion_metales, na.rm = TRUE))
# Redondeamos la amplitud hacia arriba para asegurar que cubra el rango en 10 pasos
A_ajustada <- ceiling((max_met - min_met) / 10)
# 2. Definimos los cortes para 10 intervalos
mis_breaks <- seq(from = min_met, by = A_ajustada, length.out = 11)
# 3. Generamos el histograma con esos breaks
histo_metales <- hist(
concentracion_metales,
breaks = mis_breaks,
plot = FALSE,
right = FALSE
)
# 4. Extraemos límites y calculamos estadísticas
Li2 <- histo_metales$breaks[1:(length(histo_metales$breaks) - 1)]
Ls2 <- histo_metales$breaks[2:length(histo_metales$breaks)]
MC2 <- (Li2 + Ls2) / 2
ni2 <- histo_metales$counts
hi2 <- (ni2 / sum(ni2)) * 100
Ni2_asc <- cumsum(ni2)
Hi2_asc <- cumsum(hi2)
Ni2_desc <- rev(cumsum(rev(ni2)))
Hi2_desc <- rev(cumsum(rev(hi2)))
# 5. Creamos los intervalos como texto
Intervalo2 <- paste0("[", Li2, " - ", Ls2, ")")
Intervalo2[length(Intervalo2)] <- paste0(
"[",
Li2[length(Li2)],
" - ",
Ls2[length(Ls2)],
"]"
)
# CONSTRUCCIÓN DE LA TABLA
TDF_metales_final <- data.frame(
Intervalo = Intervalo2,
MC = MC2,
ni = ni2,
hi = round(hi2, 2),
Ni_asc = Ni2_asc,
Hi_asc = round(Hi2_asc, 2),
Ni_desc = Ni2_desc,
Hi_desc = round(Hi2_desc, 2)
)
# Totales
totaless <- data.frame(
Intervalo = "Totales",
MC = "-",
ni = sum(ni2),
hi = round(sum(hi2), 2),
Ni_asc = "-",
Hi_asc = "-",
Ni_desc = "-",
Hi_desc = "-"
)
TDF_metales_final <- rbind(TDF_metales_final, totaless)
# Tabla con gt()
TDF_metales_final %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 1*"),
subtitle = md("*Distribución de frecuencia simplificada de la concentración total de metales en muestras geoquímicas de depósitos minerales en Estados Unidos*")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 2")
) %>%
tab_style(
style = cell_borders(sides = c("left", "right"), color = "black", weight = px(2)),
locations = cells_body()
) %>%
tab_style(
style = cell_borders(sides = c("left", "right"), color = "black", weight = px(2)),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE,
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray",
table_body.border.bottom.color = "black"
)
| Tabla Nro. 1 | |||||||
| Distribución de frecuencia simplificada de la concentración total de metales en muestras geoquímicas de depósitos minerales en Estados Unidos | |||||||
| Intervalo | MC | ni | hi | Ni_asc | Hi_asc | Ni_desc | Hi_desc |
|---|---|---|---|---|---|---|---|
| [12 - 861) | 436.5 | 1932 | 77.28 | 1932 | 77.28 | 2500 | 100 |
| [861 - 1710) | 1285.5 | 397 | 15.88 | 2329 | 93.16 | 568 | 22.72 |
| [1710 - 2559) | 2134.5 | 97 | 3.88 | 2426 | 97.04 | 171 | 6.84 |
| [2559 - 3408) | 2983.5 | 38 | 1.52 | 2464 | 98.56 | 74 | 2.96 |
| [3408 - 4257) | 3832.5 | 13 | 0.52 | 2477 | 99.08 | 36 | 1.44 |
| [4257 - 5106) | 4681.5 | 14 | 0.56 | 2491 | 99.64 | 23 | 0.92 |
| [5106 - 5955) | 5530.5 | 5 | 0.20 | 2496 | 99.84 | 9 | 0.36 |
| [5955 - 6804) | 6379.5 | 1 | 0.04 | 2497 | 99.88 | 4 | 0.16 |
| [6804 - 7653) | 7228.5 | 0 | 0.00 | 2497 | 99.88 | 3 | 0.12 |
| [7653 - 8502] | 8077.5 | 3 | 0.12 | 2500 | 100 | 3 | 0.12 |
| Totales | - | 2500 | 100.00 | - | - | - | - |
| Autor: Grupo 2 | |||||||
GRÁFICA DE DISTRIBUCIÓN DE FRECUENCIA
# Histograma porcentual de la concentración total de metales
plot(
histo_metales,
freq = FALSE,
main = "Gráfica Nro. 1
Distribución porcentual de la concentración total de metales
en muestras geoquímicas de depósitos minerales en Estados Unidos",
xlab = "Concentración total de metales (ppm)",
ylab = "Porcentaje (%)",
xaxt = "n",
cex.main = 1,
ylim = c(0, max(hi2))
)
# Cuadrícula
abline(
v = mis_breaks,
col = "gray70",
lty = 2,
lwd = 0.8
)
abline(
h = axTicks(2),
col = "gray70",
lty = 2,
lwd = 0.8
)
# Barras porcentuales
rect(
histo_metales$breaks[-length(histo_metales$breaks)],
0,
histo_metales$breaks[-1],
hi2,
col = "gray",
border = "black"
)
# Eje X personalizado
axis(
1,
at = mis_breaks,
labels = round(mis_breaks, 0),
las = 1,
cex.axis = 0.9
)
box()
Se conjetura que la variable CONCENTRACION_TOTAL_METALES_PPM sigue un modelo de probabilidad log-normal, debido a que representa una variable cuantitativa continua, positiva y asociada a concentraciones geoquímicas.
Esta variable puede presentar una mayor concentración de observaciones en valores bajos o moderados, mientras que pocos registros alcanzan valores muy altos, formando una cola larga hacia la derecha. Por esta razón, su comportamiento es compatible con una distribución asimétrica positiva, característica de los modelos log-normales.
PARÁMETROS
# PARÁMETROS LOG-NORMALES
# Media de los logaritmos
mu <- mean(log(concentracion_metales))
# Desviación estándar de los logaritmos
sigma_log <- sd(log(concentracion_metales))
cat("Media de los logaritmos (mu) =", round(mu, 4), "\n")
## Media de los logaritmos (mu) = 6.1145
cat("Desviación estándar de los logaritmos (sigma) =", round(sigma_log, 4), "\n")
## Desviación estándar de los logaritmos (sigma) = 0.8781
SOBREPOSICIÓN DE LA REALIDAD CON EL MODELO LOG-NORMAL
# MODELO LOG-NORMAL
# Histograma porcentual
hist(
concentracion_metales,
breaks = mis_breaks,
freq = FALSE,
col = NA,
border = NA,
main = "Gráfica Nro 3
Comparación de la realidad y el modelo log-normal
de la concentración total de metales en muestras geoquímicas",
xlab = "Concentración total de metales (ppm)",
ylab = "Densidad de probabilidad",
xaxt = "n",
yaxt = "n",
ylim = c(0, max(hi2) * 1.25)
)
# Cuadrícula
abline(v = mis_breaks, col = "gray80", lty = 2)
abline(h = pretty(c(0, max(hi2))), col = "gray80", lty = 2)
# Barras reales
rect(
histo_metales$breaks[-length(histo_metales$breaks)],
0,
histo_metales$breaks[-1],
hi2,
col = "gray",
border = "black"
)
# Curva log-normal convertida a porcentaje
x <- seq(
min(concentracion_metales),
max(concentracion_metales),
length = 1000
)
y <- dlnorm(
x,
meanlog = mu,
sdlog = sigma_log
) * A_ajustada * 100
lines(
x,
y,
col = "blue",
lwd = 2
)
# Ejes
axis(
1,
at = mis_breaks,
labels = mis_breaks,
las = 1,
cex.axis = 0.8
)
axis(
2,
at = pretty(c(0, max(hi2))),
las = 1
)
# Leyenda
legend(
"topright",
legend = c("Datos reales (FO)", "Modelo log-normal (FE)"),
col = c("gray", "blue"),
lty = c(NA, 1),
pch = c(22, NA),
pt.bg = c("gray", NA),
pt.cex = 2,
lwd = c(1, 3),
bty = "n"
)
box()
TEST DE PEARSON
fo <- ni2
N <- length(concentracion_metales)
fe <- N * (
plnorm(Ls2, meanlog = mu, sdlog = sigma_log) -
plnorm(Li2, meanlog = mu, sdlog = sigma_log)
)
Coef_Pearson <- cor(fo, fe) * 100
Coef_Pearson
## [1] 99.99088
TEST DE CHI-CUADRADO
# Total de datos
N <- sum(ni2)
# Frecuencia relativa observada
fo <- ni2 / N
# Número de intervalos
k <- length(fo)
# Probabilidades teóricas por intervalo log-normal
P <- c(0)
for (i in 1:k) {
P[i] <- plnorm(Ls2[i], meanlog = mu, sdlog = sigma_log) -
plnorm(Li2[i], meanlog = mu, sdlog = sigma_log)
}
fe <- P
# Chi-cuadrado
Chi_Calculado <- sum((fo - fe)^2 / fe)
# Grados de libertad
gl <- k - 1
# Valor crítico
Chi_Critico <- qchisq(0.95, df = gl)
# Resultados
Chi_Calculado
## [1] 0.01007294
Chi_Critico
## [1] 16.91898
# Decisión
if (Chi_Calculado < Chi_Critico) {
print("Evaluado: El modelo log-normal es adecuado.")
} else {
print("Se rechaza: El modelo log-normal no es adecuado.")
}
## [1] "Evaluado: El modelo log-normal es adecuado."
# PREGUNTA DE PORCENTAJE
# ¿Cuál es la probabilidad de que la concentración total de metales
# no supere los 500 ppm en una muestra geoquímica?
# PROBABILIDAD: P(Concentración total de metales ≤ 500)
prob_500 <- plnorm(500, meanlog = mu, sdlog = sigma_log)
prob_500_porcentaje <- prob_500 * 100
prob_500_porcentaje
## [1] 54.53831
# PREGUNTA DE CANTIDAD
# ¿Cuántas muestras de 300 futuras se espera que no superen los 500 ppm?
muestras_300 <- prob_500 * 300
muestras_300
## [1] 163.6149
# PREGUNTA DE INTERVALO
# ¿Cuál es la probabilidad de que la concentración total de metales
# se encuentre entre 500 y 1000 ppm?
# PROBABILIDAD: P(500 ≤ X ≤ 1000)
prob_500_1000 <- (
plnorm(1000, meanlog = mu, sdlog = sigma_log) -
plnorm(500, meanlog = mu, sdlog = sigma_log)
) * 100
prob_500_1000
## [1] 27.14438
# DEMOSTRACIÓN GRÁFICA
x <- seq(
min(concentracion_metales, na.rm = TRUE),
max(concentracion_metales, na.rm = TRUE),
by = 0.01
)
y <- dlnorm(x, meanlog = mu, sdlog = sigma_log)
y <- y * 100 * A_ajustada
plot(
x,
y,
col = "skyblue3",
lwd = 2,
type = "l",
xlim = c(min(concentracion_metales), max(concentracion_metales)),
ylim = c(0, max(y)),
main = "Gráfica Nro 4: Demostración de cálculo de probabilidades
en la concentración total de metales en muestras geoquímicas",
ylab = "Densidad de probabilidad",
xlab = "Concentración total de metales (ppm)",
xaxt = "n"
)
# Eje X
axis(
1,
at = mis_breaks,
labels = mis_breaks,
las = 1,
cex.axis = 0.8
)
# ÁREA DE PROBABILIDAD P(X ≤ 500)
x_section <- seq(
min(concentracion_metales, na.rm = TRUE),
500,
by = 0.01
)
y_section <- dlnorm(x_section, meanlog = mu, sdlog = sigma_log)
y_section <- y_section * 100 * A_ajustada
lines(
x_section,
y_section,
col = "darkgreen",
lwd = 2
)
polygon(
c(x_section, rev(x_section)),
c(y_section, rep(0, length(y_section))),
col = rgb(0, 0.6, 0, 0.35),
border = NA
)
# ÁREA DE PROBABILIDAD P(500 ≤ X ≤ 1000)
x_section2 <- seq(500, 1000, by = 0.01)
y_section2 <- dlnorm(x_section2, meanlog = mu, sdlog = sigma_log)
y_section2 <- y_section2 * 100 * A_ajustada
lines(
x_section2,
y_section2,
col = "orange",
lwd = 2
)
polygon(
c(x_section2, rev(x_section2)),
c(y_section2, rep(0, length(y_section2))),
col = rgb(1, 0.5, 0, 0.4),
border = NA
)
legend(
"topright",
legend = c(
"Modelo log-normal",
"Área Probabilidad ≤ 500",
"Área Probabilidad entre 500 y 1000"
),
col = c(
"skyblue3",
"darkgreen",
"orange"
),
lwd = 2,
bty = "o",
bg = "white"
)
grid()
# Media, desviación y tamaño
media <- mean(concentracion_metales, na.rm = TRUE)
desviacion <- sd(concentracion_metales, na.rm = TRUE)
n <- length(concentracion_metales)
# Valor crítico t
t_critico <- qt(0.975, df = n - 1)
# Error estándar
error <- t_critico * (desviacion / sqrt(n))
# Límites del intervalo
limite_inferior <- round(media - error, 2)
limite_superior <- round(media + error, 2)
# Tabla final
tabla_intervalo <- data.frame(
Intervalo = paste0(
"P [",
limite_inferior,
" < μ < ",
limite_superior,
"] = 95%"
)
)
tabla_intervalo %>%
gt() %>%
tab_header(
title = md("*Tabla Nro. 3*"),
subtitle = md("Intervalo de confianza de la concentración total de metales en muestras geoquímicas")
) %>%
tab_source_note(
source_note = md("Autor: Grupo 2")
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
table.border.top.style = "solid",
table.border.bottom.style = "solid",
column_labels.border.top.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
row.striping.include_table_body = TRUE,
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray",
table_body.border.bottom.color = "black"
)
| Tabla Nro. 3 |
| Intervalo de confianza de la concentración total de metales en muestras geoquímicas |
| Intervalo |
|---|
| P [643.43 < μ < 702.58] = 95% |
| Autor: Grupo 2 |
La variable CONCENTRACION_TOTAL_METALES_PPM se puede explicar mediante un modelo log-normal con parámetros μ = 6.11 y σ = 0.88. Podemos afirmar con un 95% de confianza que la media poblacional de esta variable se encuentra aproximadamente entre 643.43 y 702.58 ppm, con una media observada de 673 ppm y una desviación estándar de 754.13 ppm. Además, se evidencia una distribución asimétrica positiva, ya que la mayor parte de las muestras presenta concentraciones bajas o moderadas, mientras que pocos registros alcanzan concentraciones muy elevadas.