library(moments)
library(MASS)
library(gt)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:MASS':
##
## select
## 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("~/UNI/estadistica/2026/dataset_geologico_limpio_80.csv")
cat("Dimensiones:", nrow(datos), "observaciones,", ncol(datos), "variables\n\n")
## Dimensiones: 27784 observaciones, 58 variables
#Limpiar la variable
med_raw <- datos$MEDIAN
med <- as.numeric(as.character(med_raw))
cat("Primeros valores de MEDIANA:\n")
## Primeros valores de MEDIANA:
print(head(med))
## [1] -0.29 0.43 1.75 1.70 0.97 3.27
# Limpiar datos
med <- na.omit(med)
med <- med[med > 0]
n <- length(med)
cat("Número de datos válidos:", length(med), "\n\n")
## Número de datos válidos: 25955
# Parámetros
minimo <- min(med)
maximo <- max(med)
R <- maximo - minimo
k <- floor(1 + 3.3 * log10(n))
A <- R / k
cat("Número de intervalos:", k, "\n")
## Número de intervalos: 15
cat("Amplitud:", A, "\n\n")
## Amplitud: 0.8816506
# Intervalos
li <- seq(minimo, maximo - A, by = A)
ls <- seq(minimo + A, maximo, by = A)
MC <- (li + ls) / 2
# Frecuencias absolutas
ni <- numeric(length(li))
for (i in 1:length(li)) {
ni[i] <- sum(med >= li[i] & med < ls[i])
}
# Último intervalo incluye extremo superior
ni[length(li)] <- sum(med >= li[length(li)] & med <= maximo)
# Frecuencia relativa
hi <- (ni / sum(ni)) * 100
# Tabla final
tabla_MEDIAN <- data.frame(
Li = round(li, 2),
Ls= round(ls, 2),
MC = round(MC, 2),
Ni = ni,
Hi = round(hi, 2)
)
# Agregar TOTAL
tabla_MEDIAN[nrow(tabla_MEDIAN) + 1, ] <-
c(NA, NA, "TOTAL", sum(ni), sum(hi))
tabla_MEDIAN
## Li Ls MC Ni Hi
## 1 0 0.88 0.44 2500 9.63
## 2 0.88 1.76 1.32 3938 15.17
## 3 1.76 2.65 2.21 4498 17.33
## 4 2.65 3.53 3.09 4040 15.57
## 5 3.53 4.41 3.97 2119 8.16
## 6 4.41 5.29 4.85 1526 5.88
## 7 5.29 6.17 5.73 1509 5.81
## 8 6.17 7.05 6.61 2042 7.87
## 9 7.05 7.94 7.5 2188 8.43
## 10 7.94 8.82 8.38 1099 4.23
## 11 8.82 9.7 9.26 443 1.71
## 12 9.7 10.58 10.14 45 0.17
## 13 10.58 11.46 11.02 4 0.02
## 14 11.46 12.34 11.9 3 0.01
## 15 12.34 13.23 12.79 1 0
## 16 <NA> <NA> TOTAL 25955 100
tabla_MEDIAN %>%
gt() %>%
tab_header(
title = md("**Tabla Nº: Distribución de frecuencias de la variable MEDIAN**"),
subtitle = md("**Tamaño de grano en depósitos marinos**")
) %>%
tab_source_note(
source_note = md("**Autor: Grupo 3**")
) %>%
cols_label(
Li = "Límite inferior",
Ls = "Límite superior",
MC = "Marca de clase",
Ni = "Frecuencia (ni)",
Hi = "Frecuencia relativa (%)"
) %>%
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"
) %>%
tab_style(
style = cell_text(weight = "bold"),
locations = cells_body(
rows = MC == "TOTAL"
)
)
| Tabla Nº: Distribución de frecuencias de la variable MEDIAN | ||||
| Tamaño de grano en depósitos marinos | ||||
| Límite inferior | Límite superior | Marca de clase | Frecuencia (ni) | Frecuencia relativa (%) |
|---|---|---|---|---|
| 0 | 0.88 | 0.44 | 2500 | 9.63 |
| 0.88 | 1.76 | 1.32 | 3938 | 15.17 |
| 1.76 | 2.65 | 2.21 | 4498 | 17.33 |
| 2.65 | 3.53 | 3.09 | 4040 | 15.57 |
| 3.53 | 4.41 | 3.97 | 2119 | 8.16 |
| 4.41 | 5.29 | 4.85 | 1526 | 5.88 |
| 5.29 | 6.17 | 5.73 | 1509 | 5.81 |
| 6.17 | 7.05 | 6.61 | 2042 | 7.87 |
| 7.05 | 7.94 | 7.5 | 2188 | 8.43 |
| 7.94 | 8.82 | 8.38 | 1099 | 4.23 |
| 8.82 | 9.7 | 9.26 | 443 | 1.71 |
| 9.7 | 10.58 | 10.14 | 45 | 0.17 |
| 10.58 | 11.46 | 11.02 | 4 | 0.02 |
| 11.46 | 12.34 | 11.9 | 3 | 0.01 |
| 12.34 | 13.23 | 12.79 | 1 | 0 |
| NA | NA | TOTAL | 25955 | 100 |
| Autor: Grupo 3 | ||||
# Cortes exactos de Sturges
cortes <- c(li, maximo)
par(mfrow = c(1,1))
hist(med,
probability = TRUE,
breaks = cortes,
col = "lightblue",
border = "white",
main = "Distribución original del tamaño de grano",
xlab = "MEDIAN",
ylab = "Densidad",
xlim = range(cortes),
ylim = c(0, 0.30))
Debido a la similitud de las barras asociamos con el modelo de probabilidad normal al tramo 1
par(mar = c(5,5,5,2))
# Punto de corte en la barra 6
corte_6 <- ls[6]
# Datos de las primeras 6 clases
med_normal <- med[med <= corte_6]
# Cortes de las primeras 6 barras
cortes_6 <- c(li[1:6], ls[6])
# Parámetros de la normal
media_n <- mean(med_normal)
sd_n <- sd(med_normal)
hist(med_normal,
probability = TRUE,
breaks = cortes_6,
col = "lightgreen",
border = "white",
main = "Primeras 6 barras con ajuste Normal",
xlab = "MEDIAN",
ylab = "Densidad",
xlim = range(cortes_6),
ylim = c(0, 0.35))
axis(1,
at = seq(floor(min(med_normal)),
ceiling(max(med_normal)),
by = 1))
curve(dnorm(x,
mean = media_n,
sd = sd_n),
add = TRUE,
col = "blue",
lwd = 2)
legend("topright",
legend = c("Normal"),
col = c("blue"),
lwd = 2,
bty = "n")
# Histograma sin graficar
Histograma_1 <- hist(med_normal,
breaks = cortes_6,
plot = FALSE)
# Frecuencias observadas
Fo_1 <- Histograma_1$counts
n1 <- sum(Fo_1)
# Frecuencias esperadas (modelo normal)
Fe_1 <- numeric(length(Fo_1))
for (i in 1:length(Fo_1)) {
Fe_1[i] <- n1 * (pnorm(ls[i], mean = media_n, sd = sd_n) -
pnorm(li[i], mean = media_n, sd = sd_n))
}
# ================================
# TEST DE PEARSON
# ================================
# Convertir a porcentaje
Fo_1 <- (Fo_1 / n1) * 100
Fe_1 <- (Fe_1 / n1) * 100
# Gráfico correlación
plot(Fo_1, Fe_1,
main = "Gráfica Nº: Correlación de frecuencias - Modelo Normal",
xlab = "Frecuencia Observada (%)",
ylab = "Frecuencia Esperada (%)",
col = "blue3")
abline(a = 0, b = 1, col = "red", lwd = 2)
# Correlación
Correlacion_1 <- cor(Fo_1, Fe_1) * 100
Correlacion_1
## [1] 94.87911
cat("APRUEBA TEST DE PEARSON\n\n")
## APRUEBA TEST DE PEARSON
# ================================
# TEST CHI-CUADRADO
# ================================
grados_libertad_1 <- length(Fo_1) - 1
nivel_significancia <- 0.95
x2_1 <- sum((Fe_1 - Fo_1)^2 / Fe_1)
umbral_aceptacion_1 <- qchisq(nivel_significancia, grados_libertad_1)
cat("Chi-cuadrado:", x2_1, "\n")
## Chi-cuadrado: 6.500696
cat("Umbral:", umbral_aceptacion_1, "\n")
## Umbral: 11.0705
if(x2_1 < umbral_aceptacion_1){
cat("APRUEBA TEST DE CHI-CUADRADO\n")
} else {
cat("NO APRUEBA TEST DE CHI-CUADRADO\n")
}
## APRUEBA TEST DE CHI-CUADRADO
# ================================
# TABLA RESUMEN
# ================================
Variable <- c("MEDIAN (Normal)")
tabla_resumen <- data.frame(
Variable,
round(Correlacion_1, 2),
round(x2_1, 2),
round(umbral_aceptacion_1, 2)
)
colnames(tabla_resumen) <- c(
"Variable",
"Test Pearson (%)",
"Chi Cuadrado",
"Umbral"
)
tabla_resumen
## Variable Test Pearson (%) Chi Cuadrado Umbral
## 1 MEDIAN (Normal) 94.88 6.5 11.07
tabla_resumen %>%
gt() %>%
tab_header(
title = md("**Tabla Nº: Test de bondad de ajuste (Modelo Normal)**"),
subtitle = md("**Variable MEDIAN**")
) %>%
tab_source_note(
source_note = md("**Autor: Grupo 3**")
) %>%
cols_label(
Variable = "Variable",
`Test Pearson (%)` = "Test Pearson (%)",
`Chi Cuadrado` = "Chi Cuadrado",
Umbral = "Umbral de aceptación"
) %>%
fmt_number(
columns = c(`Test Pearson (%)`, `Chi Cuadrado`, Umbral),
decimals = 2
) %>%
cols_align(
align = "center",
everything()
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray"
)
| Tabla Nº: Test de bondad de ajuste (Modelo Normal) | |||
| Variable MEDIAN | |||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de aceptación |
|---|---|---|---|
| MEDIAN (Normal) | 94.88 | 6.50 | 11.07 |
| Autor: Grupo 3 | |||
¿Cuál es la probabilidad de que MEDIAN esté entre 2 y 4?
# Parámetros del modelo normal ya calculados antes
u_1 <- media_n
sigma_1 <- sd_n
med_1 <- med_normal
# Cálculo
Probabilidad_1 <- (pnorm(4, u_1, sigma_1) - pnorm(2, u_1, sigma_1)) * 100
Probabilidad_1
## [1] 52.22483
# Rango para la curva
x <- seq(min(med_1), max(med_1), 0.01)
plot(x, dnorm(x, u_1, sigma_1),
col = "skyblue3",
lwd = 2,
main = "Gráfica N°: Cálculo de probabilidades del modelo normal",
ylab = "Densidad de probabilidad",
xlab = "MEDIAN")
# Definir el rango de la sección que quieres pintar
x_section <- seq(2, 4, 0.001)
y_section <- dnorm(x_section, u_1, sigma_1)
# Pintar la sección de la curva
lines(x_section, y_section, col = "red", lwd = 2)
# Pintar el área debajo de la línea roja
polygon(c(x_section, rev(x_section)),
c(y_section, rep(0, length(y_section))),
col = rgb(1, 0, 0, 0.6),
border = NA)
¿De 300 observaciones, cuántas tendrían MEDIAN entre 2 y 4?
cantidad_1 <- (pnorm(4, u_1, sigma_1) - pnorm(2, u_1, sigma_1)) * 300
cantidad_1
## [1] 156.6745
Debido a la similitud de las barras asociamos con el modelo de probabilidad lognormal al tramo 2
par(mar = c(5,5,5,2))
# Datos de las barras restantes
med_lognorm <- med[med > corte_6]
# Cortes de las barras restantes
li_ln <- li[7:length(li)]
ls_ln <- ls[7:length(ls)]
cortes_ln <- c(li_ln, maximo)
# Ajuste log-normal
fit_ln <- fitdistr(med_lognorm, "lognormal")
meanlog_ln <- fit_ln$estimate["meanlog"]
sdlog_ln <- fit_ln$estimate["sdlog"]
# Histograma
hist(med_lognorm,
probability = TRUE,
breaks = cortes_ln,
col = "plum",
border = "white",
main = "Barras restantes con ajuste Log-normal",
xlab = "MEDIAN",
ylab = "Densidad",
xlim = range(cortes_ln),
ylim = c(0, 0.4),
xaxt = "n")
axis(1,
at = seq(floor(min(med_lognorm)),
ceiling(max(med_lognorm)),
by = 1))
curve(dlnorm(x,
meanlog = meanlog_ln,
sdlog = sdlog_ln),
add = TRUE,
col = "red",
lwd = 2)
legend("topright",
legend = c("Log-normal"),
col = c("red"),
lwd = 2,
bty = "n")
# Histograma sin graficar
Histograma_2 <- hist(med_lognorm,
breaks = cortes_ln,
plot = FALSE)
# Frecuencias observadas
Fo_2 <- Histograma_2$counts
n2 <- sum(Fo_2)
# Frecuencias esperadas (modelo log-normal)
Fe_2 <- numeric(length(Fo_2))
for (i in 1:length(Fo_2)) {
Fe_2[i] <- n2 * (plnorm(ls_ln[i],
meanlog = meanlog_ln,
sdlog = sdlog_ln) -
plnorm(li_ln[i],
meanlog = meanlog_ln,
sdlog = sdlog_ln))
}
# ================================
# TEST DE PEARSON
# ================================
# Convertir a porcentaje
Fo_2 <- (Fo_2 / n2) * 100
Fe_2 <- (Fe_2 / n2) * 100
plot(Fo_2, Fe_2,
main = "Gráfica Nº: Correlación de frecuencias - Modelo Log-normal",
xlab = "Frecuencia Observada (%)",
ylab = "Frecuencia Esperada (%)",
col = "purple3")
abline(a = 0, b = 1, col = "red", lwd = 2)
Correlacion_2 <- cor(Fo_2, Fe_2) * 100
Correlacion_2
## [1] 98.25249
cat("APRUEBA TEST DE PEARSON\n\n")
## APRUEBA TEST DE PEARSON
# ================================
# TEST CHI-CUADRADO
# ================================
grados_libertad_2 <- length(Fo_2) - 1
nivel_significancia <- 0.95
x2_2 <- sum((Fe_2 - Fo_2)^2 / Fe_2)
umbral_aceptacion_2 <- qchisq(nivel_significancia, grados_libertad_2)
cat("Chi-cuadrado:", x2_2, "\n")
## Chi-cuadrado: 2.910801
cat("Umbral:", umbral_aceptacion_2, "\n")
## Umbral: 15.50731
if(x2_2 < umbral_aceptacion_2){
cat("APRUEBA TEST DE CHI-CUADRADO\n")
} else {
cat("NO APRUEBA TEST DE CHI-CUADRADO\n")
}
## APRUEBA TEST DE CHI-CUADRADO
# ================================
# TABLA RESUMEN
# ================================
Variable <- c("MEDIAN (Log-normal)")
tabla_resumen_2 <- data.frame(
Variable,
round(Correlacion_2, 2),
round(x2_2, 2),
round(umbral_aceptacion_2, 2)
)
colnames(tabla_resumen_2) <- c(
"Variable",
"Test Pearson (%)",
"Chi Cuadrado",
"Umbral"
)
tabla_resumen_2
## Variable Test Pearson (%) Chi Cuadrado Umbral
## 1 MEDIAN (Log-normal) 98.25 2.91 15.51
tabla_resumen_2 %>%
gt() %>%
tab_header(
title = md("**Tabla Nº: Test de bondad de ajuste (Modelo Log-normal)**"),
subtitle = md("**Variable MEDIAN**")
) %>%
tab_source_note(
source_note = md("**Autor: Grupo 3**")
) %>%
cols_label(
Variable = "Variable",
`Test Pearson (%)` = "Test Pearson (%)",
`Chi Cuadrado` = "Chi Cuadrado",
Umbral = "Umbral de aceptación"
) %>%
fmt_number(
columns = c(`Test Pearson (%)`, `Chi Cuadrado`, Umbral),
decimals = 2
) %>%
cols_align(
align = "center",
everything()
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray"
)
| Tabla Nº: Test de bondad de ajuste (Modelo Log-normal) | |||
| Variable MEDIAN | |||
| Variable | Test Pearson (%) | Chi Cuadrado | Umbral de aceptación |
|---|---|---|---|
| MEDIAN (Log-normal) | 98.25 | 2.91 | 15.51 |
| Autor: Grupo 3 | |||
¿Cuál es la probabilidad de que MEDIAN esté entre 6 y 9?
# Parámetros del modelo log-normal ya calculados antes
med_2 <- med_lognorm
meanlog_2 <- meanlog_ln
sdlog_2 <- sdlog_ln
# Cálculos
Probabilidad_2 <- (plnorm(9, meanlog_2, sdlog_2) - plnorm(6, meanlog_2, sdlog_2)) * 100
Probabilidad_2
## [1] 81.99887
# Rango para la curva
x <- seq(min(med_2), max(med_2), 0.01)
plot(x, dlnorm(x, meanlog_2, sdlog_2),
col = "darkorchid3",
lwd = 2,
main = "Gráfica N°: Cálculo de probabilidades del modelo log-normal",
ylab = "Densidad de probabilidad",
xlab = "MEDIAN")
# Definir el rango de la sección que quieres pintar
x_section <- seq(6, 9, 0.001)
y_section <- dlnorm(x_section, meanlog_2, sdlog_2)
# Pintar la sección de la curva
lines(x_section, y_section, col = "red", lwd = 2)
# Pintar el área debajo de la línea roja
polygon(c(x_section, rev(x_section)),
c(y_section, rep(0, length(y_section))),
col = rgb(1, 0, 0, 0.6),
border = NA)
¿De 300 observaciones, cuántas tendrían MEDIAN entre 6 y 9?
# Cálculos
cantidad_2 <- (plnorm(9, meanlog_2, sdlog_2) - plnorm(6, meanlog_2, sdlog_2)) * 300
cantidad_2
## [1] 245.9966
# Media aritmética
x_barra <- mean(med)
x_barra
## [1] 3.746772
# Desviación estándar
sigma <- sd(med)
sigma
## [1] 2.442155
# Tamaño muestral
n <- length(med)
n
## [1] 25955
# Error estándar
e <- sigma / sqrt(n)
e
## [1] 0.01515873
# Intervalo de confianza aproximado al 95%
li_ic <- x_barra - 2 * e
li_ic
## [1] 3.716454
ls_ic <- x_barra + 2 * e
ls_ic
## [1] 3.777089
# Tabla resumen
tabla_media <- data.frame(
Variable = "MEDIAN",
Limite_inferior = round(li_ic, 2),
Limite_superior = round(ls_ic, 2),
Desviación_estandar_poblacional = round(e, 6)
)
tabla_media
## Variable Limite_inferior Limite_superior Desviación_estandar_poblacional
## 1 MEDIAN 3.72 3.78 0.015159
tabla_media %>%
gt() %>%
tab_header(
title = md("**Tabla Nº: Intervalo de confianza de la media**"),
subtitle = md("**Variable MEDIAN (95% de confianza)**")
) %>%
tab_source_note(
source_note = md("**Autor: Grupo 3**")
) %>%
cols_label(
Variable = "Variable",
Limite_inferior = "Límite inferior",
Limite_superior = "Límite superior",
Desviación_estandar_poblacional = "Desviación estándar poblacional"
) %>%
fmt_number(
columns = c(Limite_inferior, Limite_superior, Desviación_estandar_poblacional),
decimals = 2
) %>%
cols_align(
align = "center",
everything()
) %>%
tab_options(
table.border.top.color = "black",
table.border.bottom.color = "black",
column_labels.border.bottom.color = "black",
column_labels.border.bottom.width = px(2),
heading.border.bottom.color = "black",
heading.border.bottom.width = px(2),
table_body.hlines.color = "gray"
)
| Tabla Nº: Intervalo de confianza de la media | |||
| Variable MEDIAN (95% de confianza) | |||
| Variable | Límite inferior | Límite superior | Desviación estándar poblacional |
|---|---|---|---|
| MEDIAN | 3.72 | 3.78 | 0.02 |
| Autor: Grupo 3 | |||
La variable MEDIAN se explica mediante un modelo mixto en dos grupos: un modelo normal en las primeras 6 barras y un modelo log-normal en las barras restantes. La media aritmética de la variable es 3.75 y su desviación estándar es 2.44
De esta manera, se lograron calcular probabilidades. Por ejemplo, bajo el modelo normal, la probabilidad de que la variable MEDIAN se ubique entre 2 y 4 es de “52.22%”; mientras que, bajo el modelo log-normal, la probabilidad de que MEDIAN se encuentre entre 6 y 9 es de 82%.
Mediante el teorema del límite central, se establece que la media poblacional de la variable MEDIAN se encuentra entre 3.72 y 3.78 con un 95% de confianza.**