if (!require(moments)) install.packages("moments")
if (!require(readr)) install.packages("readr")
if (!require(sf)) install.packages("sf")
if (!require(gt)) install.packages("gt")
if (!require(dplyr)) install.packages("dplyr")
## Cargar paquetes
library(readr)
library(sf)
library(gt)
library(dplyr)
library(moments)
library(knitr)

1 Cargar los datos

## Extraer la variable
# Leer el archivo, forzando texto para evitar errores
datos <- read_delim("Conjunto.csv", delim = ";", col_types = cols(.default = "c"))
# Convertir columnas a numéricas
datos$longitude <- as.numeric(datos$longitude)
datos$latitude <- as.numeric(datos$latitude)
# Eliminar filas con valores faltantes en coordenadas
datos <- datos[!is.na(datos$longitude) & !is.na(datos$latitude), ]
# Crear objeto espacial desde coordenadas EPSG:3857
puntos_sf <- st_as_sf(datos, coords = c("longitude", "latitude"), crs = 3857)
# Transformar a WGS 84 (EPSG:4326)
puntos_wgs84 <- st_transform(puntos_sf, crs = 4326)
# Extraer coordenadas en grados decimales
coord_grados <- st_coordinates(puntos_wgs84)
# Crear nuevo data frame con solo las coordenadas convertidas
resultado <- data.frame(
  longitude_deg = coord_grados[, 1],
  latitude_deg = coord_grados[, 2]
)
# Observar resultado
print(head(resultado, 10))
##    longitude_deg latitude_deg
## 1      -95.40163    33.560946
## 2      -10.02523    34.001668
## 3       90.82797     4.280984
## 4      -99.51960    37.501294
## 5     -108.44503    32.521296
## 6     -108.40909    32.395387
## 7     -108.31004    32.417086
## 8     -108.26063    32.395387
## 9     -108.25559    32.496448
## 10     -10.82424    32.540654
# Extraer la variable
Longitud<-resultado$longitude_deg
n<-length(Longitud)
n
## [1] 304613

2 Gráfica

options(scipen = 999)  # desactiva notación científica
histograma<-hist(Longitud,freq=FALSE,
                   main= "Gráfica No. 1: Frecuencia de Longitud de 
                minerales metalicos y no metalicos del mundo",
                   xlab= "Longitud (°)", 
                   ylab= "Densidad de probabilidad", col="green",
                   las=2)

limites_barras<-histograma$breaks
limites_barras
##  [1] -180 -160 -140 -120 -100  -80  -60  -40  -20    0   20   40   60   80  100
## [16]  120  140  160  180

3 Agrupación

3.1 Agrupacion de Longitud 1

# Extraemos intervalos de -150 a -20
Long1<- Longitud[Longitud >=-160.62 & Longitud<=-20 ]

3.1.1 Conjetura del modelo

HistoLong1 <- hist(Long1,
                   breaks = seq(min(Long1), max(Long1), length.out = 9),
                   freq = F, 
                   main = "Gráfica No. 2: Modelo de probabilidad normal 
                   Longitud de minerales metalicos y no metalicos del mundo", 
                   xlab = "Longitud (°)",
                   ylab = "Densidad de probabilidad",
                   col = "grey")
h<-length(HistoLong1$counts)
u<-mean(Long1)
sigma<-sd(Long1)
x<-seq(min(Long1),max(Long1),0.01)
curve(dnorm(x,u,sigma),type="l",add=TRUE,lwd=4,col="blue4")

### Modelo de probabilidad

3.1.2 Test de Peaarson

# Frecuencia simple observada
Fo<-HistoLong1$counts
Fo
## [1]   2105   7344  36881 117788  58484  36101   2727    713
P<-c(0)
for (i in 1:h) {
  P[i] <-(pnorm(HistoLong1$breaks[i+1],u,sigma)-
            pnorm(HistoLong1$breaks[i],u,sigma))}
Fe<-P*length(Long1)
plot(Fo, Fe,
     main = "Gráfico No. 3: Correlación Frecuencias Observadas y Esperadas",
     xlab = "Frecuencia Observada",
     ylab = "Frecuencia Esperada",
     col = "blue3")
abline(lm(Fe ~ Fo), col = "red", lwd = 2)

# Coorelación
Correlación<-cor(Fo,Fe)*100
Correlación
## [1] 94.68572

3.1.3 Tests Chi-Cuadrado

grados_libertad <- length(Fo)-1
grados_libertad
## [1] 7
# Nivel de significancia 5%
alpha <- 0.05
# Frecuencia observada porcentual
Fo<-(HistoLong1$counts/n)*100
Fo
## [1]  0.6910408  2.4109280 12.1074938 38.6680805 19.1994432 11.8514312  0.8952343
## [8]  0.2340675
# Frecuencia esperada
Fe<-P*100
Fe
## [1]  0.2627861  3.3379744 17.1395757 35.9072244 30.8453894 10.8532840  1.5537286
## [8]  0.0895849
x2<-sum((Fe-Fo)^2/Fe)
x2
## [1] 7.645976
# Valor crítico
valor_critico <- qchisq(1 - alpha, grados_libertad)
valor_critico
## [1] 14.06714
# Commprobación 
x2<valor_critico
## [1] TRUE

3.1.4 Tabla resumen

Variable<-c("Longitud")
tabla_resumen<-data.frame(Variable,round(Correlación,2),round(x2,2),round(valor_critico,2))
colnames(tabla_resumen)<-c("Variable","Test Pearson (%)","Chi Cuadrado","Umbral de aceptación")
tabla_resumen
##   Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
## 1 Longitud            94.69         7.65                14.07
kable(tabla_resumen, format = "markdown", caption = 
        "Tabla No 1: Resumen de test de bondad al modelo de probabilidad")
Tabla No 1: Resumen de test de bondad al modelo de probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
Longitud 94.69 7.65 14.07

3.2 Agrupación de Longitud 2

# Extraemos intervalos de -20 a 160.8
Long2 <- Longitud[Longitud >= -20 & Longitud <= 160.8 ]

3.2.1 Conjetura del modelo

# Para usar log normal deben ser positivos
Long2<-Long2+19.39
HistoLong2 <- hist(Long2,
                   breaks = seq(min(Long2), max(Long2), length.out = 9),
                   freq = F, 
                   main = "Gráfica No. 3: Modelo de probabilidad log-normal 
                   Longitud de minerales metálicos y no metálicos del mundo", 
                   xlab = "Longitud",
                   ylab = "Densidad de probabilidad",
                   col = "grey")

h <- length(HistoLong2$counts)
LogLong2 <- log(Long2)
ulog <- mean(LogLong2)
ulog<-ulog
sigmalog <- sd(LogLong2)
x <- seq(min(Long2), max(Long2), 0.01)
curve(dlnorm(x, ulog, sigmalog), type = "l", add = TRUE, lwd = 4, col = "black")

# Frecuencia simple observada
Fo<-HistoLong2$counts
Fo
## [1] 31200  2861  1934  1293  1464  2052  1312   353
# Frecuencia simple esperada
P <- c(0)
for (i in 1:h) {
  P[i] <- plnorm(HistoLong2$breaks[i+1], ulog, sigmalog) - 
    plnorm(HistoLong2$breaks[i], ulog, sigmalog)
}
Fe <- P * length(Long2)

# Comparación de tamaños
sum(Fe)
## [1] 42192.11
n <- length(Long2)
n
## [1] 42469

3.2.2 Test de Pearson

# Probabilidades log-normal por intervalo
# Gráfico de correlación
plot(Fo, Fe,
     main = "Gráfica No. 4 :Correlación Frecuencias Observadas vs Esperadas",
     xlab = "Frecuencia Observada",
     ylab = "Frecuencia Esperada",
     col = "blue3")
abline(lm(Fe ~ Fo), col = "red", lwd = 2)

### Correlación
Correlación <- cor(Fo, Fe) * 100
Correlación
## [1] 94.12637

3.2.3 Test Chi-Cuadrado

# Grados de libertad: k - 1 
grados_libertad <-length(Fo) - 1 
grados_libertad
## [1] 7
# Nivel de significancia
alpha <- 0.05
## Chi-cuadrado con frecuencias absolutas( no relativa )
Fo<-(HistoLong2$counts/n)*100
Fo
## [1] 73.4653512  6.7366785  4.5539099  3.0445737  3.4472203  4.8317596  3.0893122
## [8]  0.8311945
sum(Fo)
## [1] 100
Fe<-P*100
Fe
## [1] 59.8071919 24.1589139  8.3798399  3.5422340  1.7133162  0.9115539  0.5206835
## [8]  0.3142853
sum(Fe)
## [1] 99.34802
x2 <- sum((Fe- Fo)^2 / Fe)
x2
## [1] 49.63545
# Valor crítico
valor_critico <- qchisq(1 - alpha, grados_libertad)
valor_critico
## [1] 14.06714
# Comprobación
x2 < valor_critico
## [1] FALSE

3.2.4 Tabla resumen

Variable<-c("Longitud")
tabla_resumen<-data.frame(Variable,round(Correlación,2),round(x2,2),round(valor_critico,2))
colnames(tabla_resumen)<-c("Variable","Test Pearson (%)","Chi Cuadrado","Umbral de aceptación")
tabla_resumen
##   Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
## 1 Longitud            94.13        49.64                14.07
kable(tabla_resumen, format = "markdown", caption = 
        "Tabla No 2: Resumen de test de bondad al modelo de probabilidad")
Tabla No 2: Resumen de test de bondad al modelo de probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
Longitud 94.13 49.64 14.07

4 Calculo de probabilidades

¿Cuál es la probabilidad de que, al seleccionar cualquier registro de mineral metalico y nometalico en el mundo, este tenga una Longitud entre -100° y -95.5°?

probabilidad <- pnorm(-95.5, u, sigma) - pnorm(-100, u, sigma)
probabilidad*100
## [1] 9.877173
# Calcular probabilidad entre -100 y -95.5
probabilidad <- pnorm(-95.5, u, sigma) - pnorm(-100, u, sigma)
cat("Probabilidad (%) entre -100 y -95.5:", probabilidad * 100, "\n")
## Probabilidad (%) entre -100 y -95.5: 9.877173
# Definir rango para graficar (elige un rango amplio para la curva)
x <- seq(-120, 80, by = 0.1)
# Graficar curva normal
max_val <- max(dnorm(x, u, sigma))
plot(x, dnorm(x, u, sigma), type = "l", col = "skyblue3", lwd = 2,
     xlim = c(-120, 80), ylim = c(0, max_val * 1.2),
     main = "Gráfica Nº 6: Cálculo de probabilidades",
     ylab = "Densidad de probabilidad", xlab = "Longitud (°)", xaxt = "n")
# Definir el rango para sombrear el área de interés
x_section <- seq(-100, -95.5, 0.001)
y_section <- dnorm(x_section, u, sigma)
# Pintar área bajo la curva en rojo semitransparente
polygon(c(x_section, rev(x_section)), c(y_section, rep(0, length(y_section))),
        col = rgb(1, 0, 0, 0.5), border = NA)
# Pintar línea roja sobre el área sombreada
lines(x_section, y_section, col = "red", lwd = 2)
# Añadir leyenda
legend("topright", cex = 0.7,
       legend = c("Modelo", "Área de Probabilidad"),
       col = c("skyblue3", "red"), lwd = c(2, 2), pch = c(NA, 15))
# Ajustar la escala del eje x a intervalos de 10 grados desde -120 a 80
axis(1, at = seq(-120, 80, by = 10), labels = seq(-120, 80, by = 10), las = 2)

# El area bajo la curva indica la probabilidad

5 Teorema de limite central

El teorema nos indica que, aunque las variables individuales no sigan una distribución normal, la distribución de las medias aritméticas de n conjuntos muestrales, es normal, y por lo tanto, podemos obtener la media poblacional mediante intervalos de confianza, con tres postulados principales: (x-e<u<x+e)=68% (x-2e<u<x+2e)=95% (x-3e<u<x+3e)=99% Donde, x es la media aritmética muestral y es el margen de error (desviación estándar poblacional)

# Intervalos de confianza
x<-mean(Longitud)
x
## [1] -79.2449
sigma<-sd(Longitud)
sigma
## [1] 42.69078
#P(x-2e<u<x+2e)=95%
e<-sigma/sqrt(n)
e
## [1] 0.2071563
li<-x-2*e
li
## [1] -79.65921
ls<-x+2*e
ls
## [1] -78.83059
tabla_media<-data.frame(round(li,2),Variable,round(ls,2),e)
colnames(tabla_media)<-c("Limite Inferiror","Media poblacional","Límite superior", "Desviación estándar poblacional")
library(knitr)
kable(tabla_media, format = "markdown", caption = "Tabla No 3: Media poblacional")
Tabla No 3: Media poblacional
Limite Inferiror Media poblacional Límite superior Desviación estándar poblacional
-79.66 Longitud -78.83 0.2071563

6 Conclusiones

La variable longitud, medida en grados, se explica a través de un modelo normal, agrupado en dos grupos. Para uno de los grupos, se obtuvo una media poblacional de -79.24° (intervalo de confianza del 95% entre -79.66° y -78.83°) y una desviación estándar poblacional de 0.2072. Esto permite calcular probabilidades, como por ejemplo que, al seleccionar aleatoriamente cualquier valor de longitud entre -160° y -40, la probabilidad de que dicho valor se encuentre entre -95° y -100° es del 9.87%. Este resultado se apoya en el Teorema del Límite Central, que garantiza que la media muestral tiende a la media poblacional conforme aumenta el tamaño de muestra.