ANÁLISIS ESTADÍSTICO

1. CARGA DE LIBRERÍAS Y DATOS

                    #==============================ENCABEZADO==========================
                    # TEMA: MODELOS PROBABILISTICOS- DISTANCIA ESTIMADA
                    # AUTOR: GRUPO 3
                    # FECHA: 03-2026
                    #==================================================================
library(dplyr)
library(knitr)
library(gt)

setwd("C:/Users/HP/Documents/PROYECTO ESTADISTICA/RStudio")
datos <- read.csv("tablap.csv", header = TRUE, dec = ",", sep = ";")

2. TABLA Y GRÁFICA DE DISTRIBUCIÓN DE FRECUENCIA

distance <- as.numeric(datos$Distance.estimation)
distance <- na.omit(distance)
distance <- distance[distance > 0] 

# BOXPLOT 
par(oma = c(1, 1, 1, 1))
boxplot(distance, 
        horizontal = TRUE, 
        col = "skyblue",
        main = "Gráfica Nº1: Distribución de cantidad de la Distancia Estimada",
        xlab = "Distancia Estimada")
box(which = "outer", col = "black")

# Extrae datos del Boxplot
caja <- boxplot(distance, plot = FALSE)
limite_sup <- caja$stats[5]
limite_inf <- caja$stats[1]

DATOS CON VALORES ATÍPICOS

distance_outliers <- distance[distance < limite_inf | distance > limite_sup]
length(distance)
## [1] 12561

DATOS SIN VALORES ATIPICOS

distance_sin_outliers <- distance[distance >= limite_inf & distance <= limite_sup]
length(distance_sin_outliers)
## [1] 11793
histograma_dist <- hist(distance_sin_outliers, plot = FALSE)
ni_f <- histograma_dist$counts
hi_f <- ni_f / sum(ni_f) * 100

intervalos_dist <- paste0("[", round(histograma_dist$breaks[-length(histograma_dist$breaks)], 2),
                          ", ", round(histograma_dist$breaks[-1], 2), ")")

tabla_base <- data.frame(Intervalo = intervalos_dist, ni_f = ni_f, hi_f = round(hi_f, 2))
fila_total <- data.frame(Intervalo = "TOTAL", ni_f = sum(tabla_base$ni_f), hi_f = round(sum(tabla_base$hi_f)))
TDFlat_t <- rbind(tabla_base, fila_total)
Tabla Nº1: Distribución de cantidad de la Distancia Estimada de los pozos de gas natural
Intervalo ni hi (%)
[0, 10) 307 2.60
[10, 20) 714 6.05
[20, 30) 1052 8.92
[30, 40) 1073 9.10
[40, 50) 1232 10.45
[50, 60) 1292 10.96
[60, 70) 1170 9.92
[70, 80) 1225 10.39
[80, 90) 972 8.24
[90, 100) 713 6.05
[100, 110) 571 4.84
[110, 120) 362 3.07
[120, 130) 201 1.70
[130, 140) 221 1.87
[140, 150) 214 1.81
[150, 160) 213 1.81
[160, 170) 192 1.63
[170, 180) 69 0.59
TOTAL 11793 100.00
Las unidades de medida estan en: metros
Tabla 1 de 4
par(oma = c(1, 1, 1, 1))
h_temp <- hist(distance_sin_outliers, plot = FALSE)
h_temp$counts <- (h_temp$counts / sum(h_temp$counts)) * 100

plot(h_temp, 
     main = "Gráfica Nº2. Distribución de cantidad de la Distancia\nEstimada de los pozos de gas natural",
     xlab = "Distancia Estimada", 
     ylab = "Porcentaje (%)", 
     col = "indianred1")

box(which = "outer", col = "black")

3. CONJETURA DEL MODELO 1

DEBIDO A LA SIMILITUD DE LAS BARRAS ASOCIAMOS CON EL MODELO DE PROBABILIDAD NORMAL

par(oma = c(1, 1, 1, 1))
distance_1 <- distance_sin_outliers[distance_sin_outliers <= 120]

PARÁMETRO MEDIA ARITMETICA (MU)

u_1 <- mean(distance_1)
u_1
## [1] 58.28981

PARÁMETRO DESVIACIÓN ESTÁNDAR (SIGMA)

sigma_1 <- sd(distance_1)
sigma_1
## [1] 28.31541
n1 <- length(distance_1)

# GRAFICA HISTOGRAMA
hist_conteos <- hist(distance_1, breaks = 6, plot = FALSE)

histograma_m1 <- hist(distance_1,
     freq = FALSE,
     breaks = 6,
     main = "Gráfica Nº3: Comparación de la realidad con el modelo de\nprobabilidad normal",
     xlab = "Distancia Estimada",
     ylab = "Densidad de probabilidad",
     col = "lightgray",
     border = "black")
box(which = "outer", col = "black")

x_seq <- seq(min(distance_1), max(distance_1), 0.01)

lines(x_seq, dnorm(x_seq, u_1, sigma_1), col = "blue", lwd = 2)

# GRAFICA FO Y FE (MODELO 1)
Fo_1 <- hist_conteos$counts  
P1 <- numeric(length(Fo_1))
for (i in 1:length(Fo_1)) {
  P1[i] <- pnorm(hist_conteos$breaks[i+1], u_1, sigma_1) -
           pnorm(hist_conteos$breaks[i], u_1, sigma_1)
}

# Transformación a porcentajes
Fo_1 <- (Fo_1 / n1) * 100
Fo_1  
## [1]  9.557240 19.891416 23.626322 22.418796 15.772723  8.733502
Fe_1 <- P1 * 100
Fe_1  
## [1]  6.837924 17.101593 26.491868 25.429744 15.125396  5.571642
plot(Fo_1, Fe_1,
     xlim = c(0, max(Fo_1)),
     ylim = c(0, max(Fo_1)),
     main = "Gráfica Nº4: Correlación de frecuencias en el modelo normal\nde la Distancia Estimada",
     xlab = "Frecuencia observada (%)",
     ylab = "Frecuencia esperada (%)",
     col = "blue3", pch = 19)
lines(c(0, max(Fo_1)), c(0, max(Fo_1)), col = "red", lwd = 2)
box(which = "outer", col = "black")

4. TESTS DE APROBACIÓN

TEST DE PEARSON

Correlacion_1 <- cor(Fo_1, Fe_1) * 100
Correlacion_1
## [1] 98.09319

TEST DE CHI-CUADRADO

x2_1 <- sum((Fe_1 - Fo_1)^2 / Fe_1)
x2_1
## [1] 4.025027

UMBRAL DE ACEPTACION

grados_libertad_1 <- length(Fo_1) - 1

umbral_aceptacion_1 <- qchisq(0.9999, grados_libertad_1)
umbral_aceptacion_1
## [1] 25.74483
tabla_resumen_1 <- data.frame(
  Variable = "Distancia T1 (Normal)",
  Pearson = round(Correlacion_1, 2),
  Chi = round(x2_1, 2),
  Umbral = round(umbral_aceptacion_1, 2)
)
Tabla Nº2: Resumen del test de bondad de ajuste al modelo normal
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptacion
Distancia T1 (Normal) 98.09 4.03 25.74
Tabla 2 de 4

5. CÁLCULO DE PROBABILIDADES

# Aquí ya trabajamos con todo nuestro dataset para el cálculo de los parámetros
distance_completo <- as.numeric(datos$Distance.estimation)
distance_completo <- na.omit(distance_completo)
distance_completo <- distance_completo[distance_completo > 0]

RECALCULAMOS VALORES

#Aqui ya trabajamos con todo nuestro dataset para el calculo de los parámetros
n_completo <- length(distance_completo)
n_completo
## [1] 12561

PARÁMETRO MEDIA ARITMETICA (MU)

# Calculamos mu con todos los datos
u_1 <- mean(distance_completo)
u_1
## [1] 74.86054

PARÁMETRO DESVIACIÓN ESTÁNDAR (SIGMA)

sigma_1 <- sd(distance_completo)
sigma_1
## [1] 48.80406
par(oma = c(1, 1, 1, 1))
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

# Tarjeta de presentación de la pregunta
rect(2, 20, 98, 80, border = "#2A9D8F", col = "#F0F9F8", lwd = 3)

text(52, 55, "¿Cuál es la probabilidad de que la Distancia\nEstimada se encuentre entre 10 y 50\nmetros?", cex = 1.2, font = 2, col = "#1D3557")
box(which = "outer", col = "black")

# USAMOS LOS PARÁMETROS COMPLETOS RECALCULADOS (Distribución Normal)
probabilidad_Gas <- pnorm(50, mean = u_1, sd = sigma_1) - 
                    pnorm(10, mean = u_1, sd = sigma_1)

PROBABILIDAD:

probabilidad_Gas * 100
## [1] 21.33135
# Rango para la curva usando el dataset completo
x <- seq(min(distance_completo), max(distance_completo), length.out = 1000)

# Curva normal con parámetros del dataset completo
plot(x, dnorm(x, mean = u_1, sd = sigma_1),
     col = "skyblue3", lwd = 2, type = "l",
     main = "Gráfica Nº5: Cálculo de probabilidades de la\nDistancia Estimada en los pozos de gas natural", 
     ylab = "Densidad de probabilidad",
     xlab = "Distancia Estimada")
box(which = "outer", col = "black")

x_area <- seq(10, 50, length.out = 500)
y_area <- dnorm(x_area, mean = u_1, sd = sigma_1)

# Línea del área
lines(x_area, y_area, col = "red", lwd = 2)


# Área sombreada
polygon(c(x_area, rev(x_area)),
        c(y_area, rep(0, length(y_area))),
        col = rgb(1, 0, 0, 0.5),
        border = NA)

# Leyenda
legend("topright",
       legend = c("Modelo Normal", "Área de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       cex = 0.9)

texto_prob <- paste0("Probabilidad = ", round(probabilidad_Gas * 100, 2), " %")

text(x = max(x) * 0.7,
     y = max(dnorm(x, u_1, sigma_1)) * 0.7,
     labels = texto_prob,
     col = "black",
     cex = 0.9,
     font = 2)

par(oma = c(1, 1, 1, 1))
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

# Tarjeta de presentación de la segunda pregunta
rect(2, 20, 98, 80, border = "#2A9D8F", col = "#F0F9F8", lwd = 3)
text(52, 55, "¿De 30 nuevas mediciones cuántas tendrían\nuna Distancia de entre 10 y 50 metros?", cex = 1.2, font = 2, col = "#1D3557")
box(which = "outer", col = "black")

Cantidad esperada en una muestra de 30:

valor_esperado_dist <- 30 * probabilidad_Gas
valor_esperado_dist
## [1] 6.399406

6. CONJETURA DE MODELO 2

Debido a la similitud de las barras asociamos con el modelo de probabilidad Uniforme

par(oma = c(1, 1, 1, 1))
distance_2 <- distance_sin_outliers[distance_sin_outliers > 120]

PARÁMETRO LÍMITE INFERIOR

a_val <- min(distance_2)
a_val
## [1] 120.0614

PARÁMETRO LÍMITE SUPERIOR

b_val <- max(distance_2)
b_val
## [1] 177.8611
n2 <- length(distance_2)

# GRAFICA HISTOGRAMA (Numeración correlativa: Gráfica Nº6)
hist_conteos_m2 <- hist(distance_2, breaks = 5, plot = FALSE)

histograma_m2 <- hist(distance_2,
     freq = FALSE,
     breaks = 5,
     main = "Gráfica Nº6: Comparación de la realidad con el modelo de\nprobabilidad uniforme",
     xlab = "Distancia Estimada",
     ylab = "Densidad de probabilidad",
     col = "lightgray",
     border = "black")
box(which = "outer", col = "black")

# Línea de la densidad uniforme teórica f(x) = 1 / (b - a)
x2 <- seq(min(distance_2), max(distance_2), 0.01)
curve(dunif(x, a_val, b_val), col = "blue", lwd = 2, add = TRUE)

# GRAFICA FO Y FE (MODELO 2)
Fo_2 <- hist_conteos_m2$counts
P2 <- numeric(length(Fo_2))
for (i in 1:length(Fo_2)) {
  P2[i] <- punif(hist_conteos_m2$breaks[i+1], a_val, b_val) -
           punif(hist_conteos_m2$breaks[i], a_val, b_val)
}

Fo_2 <- (Fo_2 / n2) * 100
Fo_2
## [1] 18.108108 19.909910 19.279279 19.189189 17.297297  6.216216
Fe_2 <- P2 * 100
Fe_2
## [1] 17.19491 17.30111 17.30111 17.30111 17.30111 13.60064
plot(Fo_2, Fe_2,
     xlim = c(0, max(Fo_2) + 5),
     ylim = c(0, max(Fe_2) + 5),
     main = "Gráfica Nº7: Correlación de frecuencias en el modelo uniforme\nde la Distancia Estimada",
     xlab = "Frecuencia observada (%)",
     ylab = "Frecuencia esperada (%)",
     col = "blue3", 
     pch = 19)
abline(h = 17.30111, col = "red", lwd = 2, lty = 2) 

box(which = "outer", col = "black")

7. TEST DE APROBACIÓN

TEST DE PEARSON

Correlacion_2 <- cor(Fo_2, Fe_2) * 100
Correlacion_2
## [1] 98.5209

TEST DE CHI-CUADRADO

x2_2 <- sum((Fe_2 - Fo_2)^2 / Fe_2)
x2_2
## [1] 4.883444

UMBRAL DE ACEPTACION

grados_libertad_2 <- length(Fo_2) - 1

umbral_aceptacion_2 <- qchisq(0.9999, grados_libertad_2)
umbral_aceptacion_2
## [1] 25.74483
# TABLA RESUMEN
tabla_resumen_2 <- data.frame(
  Variable = "Distancia Estimada",
  Pearson = round(Correlacion_2, 2),
  Chi = round(x2_2, 2),
  Umbral = round(umbral_aceptacion_2, 2)
)
Tabla Nº3: Resumen del test de bondad de ajuste al modelo uniforme
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
Distancia Estimada 98.52 4.88 25.74
Tabla 3 de 4

8. CÁLCULO DE PROBABILIDADES

RECALCULAMOS VALORES

# Mantenemos el tamaño de muestra (> 120 metros)
n2 <- length(distance_2)
n2
## [1] 1110

PARÁMETRO LIMITE INFERIOR

a_val
## [1] 120.0614

PARÁMETRO LIMITE SUPERIOR

# Usamos el parámetro del tramo específico
b_val
## [1] 177.8611
par(oma = c(1, 1, 1, 1))
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

# Tarjeta de presentación de la pregunta (Tramo 2)
rect(2, 20, 98, 80, border = "#2A9D8F", col = "#F0F9F8", lwd = 3)

text(52, 55, "¿Cuál es la probabilidad de que la Distancia\nEstimada se encuentre entre 140 y 180\nmetros?", cex = 1.2, font = 2, col = "#1D3557")
box(which = "outer", col = "black")

# CÁLCULO USANDO LA DISTRIBUCIÓN UNIFORME
Probabilidad_2 <- (punif(180, a_val, b_val) - punif(140, a_val, b_val)) * 100

PROBABILIDAD:

Probabilidad_2
## [1] 65.50398
# GRAFICA UNIFORME TRAMO 2
plot(x2, dunif(x2, a_val, b_val),
     col = "skyblue3",
     lwd = 2,
     type = "l",
     main = "Gráfica Nº8: Cálculo de probabilidades de la\nDistancia Estimada en el Modelo Uniforme", 
     ylab = "Densidad de probabilidad",
     xlab = "Distancia Estimada (metros)",
     ylim = c(0, max(dunif(x2, a_val, b_val)) * 2))

x_section_2 <- seq(140, 180, 0.01)
y_section_2 <- dunif(x_section_2, a_val, b_val)

# Línea del área
lines(x_section_2, y_section_2, col = "red", lwd = 2)

# Área sombreada
polygon(c(x_section_2, rev(x_section_2)),
        c(y_section_2, rep(0, length(y_section_2))),
        col = rgb(1, 0, 0, 0.5),
        border = NA)

# Leyenda
legend("topright",
       legend = c("Modelo Uniforme", "Área de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       cex = 0.9)

texto_prob2 <- paste0("Probabilidad = ", round(Probabilidad_2, 2), " %")

text(x = max(x2) * 0.8,
     y = max(dunif(x2, a_val, b_val)) * 1.5,
     labels = texto_prob2,
     col = "black",
     cex = 0.9,
     font = 2)

par(oma = c(1, 1, 1, 1))
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

# Tarjeta de presentación de la segunda pregunta
rect(2, 20, 98, 80, border = "#2A9D8F", col = "#F0F9F8", lwd = 3)
text(52, 55, "¿De 30 nuevas mediciones cuántas tendrían\nuna Distancia de entre 140 y 180 metros?", cex = 1.2, font = 2, col = "#1D3557")
box(which = "outer", col = "black")

Cantidad esperada en una muestra de 30:

valor_esperado_dist2 <- (Probabilidad_2 / 100) * 30
valor_esperado_dist2
## [1] 19.65119

9. INTERVALOS DE CONFIANZA

Media Aritmética Muestral

media_original <- mean(distance_completo)
media_original
## [1] 74.86054

Desviación Estándar

sigma_original <- sd(distance_completo)
sigma_original
## [1] 48.80406

Error Estándar

e <- sigma_original / sqrt(length(distance_completo))
e
## [1] 0.4354556

Limites del Intervalo Limite Inferior

li <- media_original - 2 * e
li
## [1] 73.98963

Limite Superior

ls <- media_original + 2 * e
ls
## [1] 75.73145
Tabla Nº4. Media Poblacional mediante Intervalos de Confianza
Variable Intervalo de Confianza (95%) Error Estándar de la Media (e)
Distancia Estimada 73.99<μ<75.7373.99 < \mu < 75.73 0.4355
Tabla 4 de 4

10. CONCLUSIÓN

La variable Distancia Estimada se explica a través de dos modelos siendo el modelo normal (Modelo 1) con una media aritmética de 58.29 y una desviación estandar de 28.32, mientras que el (Modelo 2)se rige bajo un modelo uniforme con un límite inferior de 120.06 y un límite superior de 177.86.

De esta manera logramos calcular probabilidades como por ejemplo, que al seleccionar aleatoriamente cualquier distancia, la probabilidad de encontrarse entre 10 y 50 metros es de 21.33 %, y la probabilidad de situarse entre 140 metros y 180 metros es de 65.50%.

Mediante el teorema de limite central, sabemos que la media aritmética poblacional de la distancia estimada se encuentran entre 74 y 75.7 con un 95% de confianza.