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)

histograma_dist <- hist(distance, plot = FALSE)

lis <- histograma_dist$breaks[-length(histograma_dist$breaks)]
lss <- histograma_dist$breaks[-1]
MC_f <- histograma_dist$mids
ni_f <- histograma_dist$counts
hi_f <- (ni_f / sum(ni_f)) * 100
TDFlat_f <- round(data.frame(lis, lss, MC_f, ni_f, hi_f), 2)

fila_total_f <- data.frame(
  lis = "TOTAL",
  lss = " ",
  MC_f = " ",
  ni_f = sum(ni_f),
  hi_f = round(sum(hi_f), 2)
)

TDFlat_t <- rbind(TDFlat_f, fila_total_f)
tabla_dist <- TDFlat_t %>%
  gt() %>%
  cols_label(
    lis = "Limite inferior",
    lss = "Limite superior",
    MC_f = "Marca de Clase",
    ni_f = "ni",
    hi_f = "hi (%)"
  ) %>%
  tab_header(
    title = md("Tabla Nº1: Distribución de cantidad de la Distancia Estimada de los pozos de gas natural")
  ) %>%
  tab_source_note(
    source_note = md("Las unidades de medida estan en: metros")
  ) %>%
  tab_style(
    style = list(cell_fill(color = "lightgray"), cell_text(weight = "bold")),
    locations = cells_body(rows = lis == "TOTAL")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.size = px(20),
    heading.title.font.weight = "bold",
    table.font.names = "Open Sans",
    column_labels.font.weight = "bold"
  )
# Primero se muestra la tabla
tabla_dist
Tabla Nº1: Distribución de cantidad de la Distancia Estimada de los pozos de gas natural
Limite inferior Limite superior Marca de Clase ni hi (%)
0 20 10 1021 8.13
20 40 30 2125 16.92
40 60 50 2524 20.09
60 80 70 2395 19.07
80 100 90 1685 13.41
100 120 110 933 7.43
120 140 130 422 3.36
140 160 150 427 3.40
160 180 170 268 2.13
180 200 190 365 2.91
200 220 210 386 3.07
220 240 230 10 0.08
TOTAL 12561 100.00
Las unidades de medida estan en: metros
# Después se muestra la gráfica original
histograma_dist <- hist(distance,
                        main = "Gráfica Nº1: Distribución de la Distancia\nEstimada de los pozos de gas natural",
                        xlab = "Distancia Estimada",
                        ylab = "Cantidad",
                        col = "gray")

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))
# Filtrado exclusivo para el tramo 1
distance_1 <- distance[distance <= 120]

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

# Histograma auxiliar para obtener los conteos reales (absolutos)
hist_conteos <- hist(distance_1, breaks = 6, plot = FALSE)

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

# Definimos la secuencia para los puntos del eje X
x_seq <- seq(min(distance_1), max(distance_1), 0.01)

# CORRECCIÓN AQUÍ: Cambiamos x1 por x dentro de dnorm()
curve(dnorm(x, u_1, sigma_1), col = "blue", lwd = 2, add = TRUE)

# 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,
     main = "Grafica Nro.3: Correlacion de frecuencias en el modelo normal\nde la Distancia Estimada (Tramo 1)",
     xlab = "Frecuencia observada (%)",
     ylab = "Frecuencia esperada (%)",
     col = "blue3")
abline(lm(Fe_1 ~ Fo_1), col = "red", lwd = 2)
box(which = "outer", col = "black")

4. TESTS DE APROBACIÓN

Correlacion_1 <- cor(Fo_1, Fe_1) * 100
Correlacion_1
## [1] 98.09319
x2_1 <- sum((Fe_1 - Fo_1)^2 / Fe_1)
x2_1
## [1] 4.025027
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_resumen_1 %>%
  gt() %>%
  cols_label(
    Variable = "Variable",
    Pearson = "Test Pearson (%)",
    Chi = "Chi Cuadrado",
    Umbral = "Umbral de aceptacion"
  ) %>%
  tab_header(title = md("Tabla Nº2: Resumen del test de bondad de ajuste al modelo normal (Tramo 1)")) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.size = px(20),
    heading.title.font.weight = "bold",
    table.font.names = "Open Sans",
    column_labels.font.weight = "bold"
  )
Tabla Nº2: Resumen del test de bondad de ajuste al modelo normal (Tramo 1)
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptacion
Distancia T1 (Normal) 98.09 4.03 25.74

5. CÁLCULO DE PROBABILIDADES

par(oma = c(1, 1, 1, 1))
#GENERAMOS LA PREGUNTA DE PROBABILIDAD MODELO 1
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

text(50, 55, "¿Cuál es la probabilidad de que la Distancia\nEstimada se encuentre entre 10 y 50 unidades?", cex = 1.25, font = 2) 
rect(0, 25, 103, 85, border = "#2A9D8F", lwd = 3)
box(which = "outer", col = "black")

Probabilidad_1 <- (pnorm(50, u_1, sigma_1) - pnorm(10, u_1, sigma_1)) * 100
Probabilidad_1
## [1] 34.07927
# SOLUCIÓN: Definimos x1 explícitamente para que el plot no falle
x1 <- seq(min(distance_1), max(distance_1), 0.01)

#GRAFICA NORMAL TRAMO 1
plot(x1, dnorm(x1, u_1, sigma_1),
     col = "skyblue3",
     lwd = 2,
     type = "l", # Forzamos a que sea una línea continua
     main = "Gráfica Nº4: Cálculo de probabilidades (Modelo Normal)",
     ylab = "Densidad de probabilidad",
     xlab = "Distancia Estimada")

x_section_1 <- seq(10, 50, 0.01)
y_section_1 <- dnorm(x_section_1, u_1, sigma_1)

lines(x_section_1, y_section_1, col = "red", lwd = 2)
polygon(c(x_section_1, rev(x_section_1)),
        c(y_section_1, rep(0, length(y_section_1))),
        col = rgb(1, 0, 0, 0.6))

legend("topright",
       legend = c("Modelo Normal", "Area de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       cex = 0.9)

text(min(x1)+15,
     max(dnorm(x1, u_1, sigma_1)) * 0.9,
     paste0("Prob.= ", round(Probabilidad_1, 2), "%"),
     cex = 0.8,
     font = 2)

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

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")

6. CONJETURA DE MODELO 2

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

par(oma = c(1, 1, 1, 1))

# SOLUCIÓN: Definimos y filtramos los datos para el Tramo 2 (> 120)
distance_2 <- distance[distance > 120]

# Parámetros del Modelo Uniforme Continua
a_val <- min(distance_2)
b_val <- max(distance_2)
a_val
## [1] 120.0614
b_val
## [1] 221.6074
n2 <- length(distance_2)

# Gráfica del subconjunto 2 (Uniforme)
histograma_m2 <- hist(distance_2,
     freq = FALSE,
     breaks = 5,
     main = "Gráfica Nº5: Comparación de la realidad con el modelo de\nprobabilidad uniforme en el Tramo 2",
     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)
# Histograma auxiliar para obtener conteos absolutos correctos
hist_conteos_m2 <- hist(distance_2, breaks = 5, plot = FALSE)

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)
}

# Transformación a porcentajes reales
Fo_2 <- (Fo_2 / n2) * 100
Fo_2
## [1] 22.4707135 22.7369542 14.2705005 19.4355698 20.5537806  0.5324814
Fe_2 <- P2 * 100
Fe_2
## [1] 19.635049 19.695501 19.695501 19.695501 19.695501  1.582947
# Gráfica de correlación para el Tramo 2
plot(Fo_2, Fe_2,
     main = "Grafica Nro.6: Correlacion de frecuencias en el modelo uniforme\nde la Distancia Estimada (Tramo 2)",
     xlab = "Frecuencia observada (%)",
     ylab = "Frecuencia esperada (%)",
     col = "blue3")
abline(lm(Fe_2 ~ Fo_2), col = "red", lwd = 2)
box(which = "outer", col = "black")

7. TEST DE APROBACIÓN

Correlacion_2 <- cor(Fo_2, Fe_2) * 100
Correlacion_2
## [1] 93.18274
x2_2 <- sum((Fe_2 - Fo_2)^2 / Fe_2)
x2_2
## [1] 3.111413
grados_libertad_2 <- length(Fo_2) - 1
umbral_aceptacion_2 <- qchisq(0.9999, grados_libertad_2)
umbral_aceptacion_2
## [1] 25.74483
# 1. Creamos el data.frame con tus cálculos
tabla_resumen_2 <- data.frame(
  Variable = "Distancia T2 (Uniforme)",
  Pearson = round(Correlacion_2, 2),
  Chi = round(x2_2, 2),
  Umbral = round(umbral_aceptacion_2, 2)
)

# 2. CORRECCIÓN: Usamos la estructura de gt() para que se imprima de forma elegante
library(gt) # Aseguramos que la librería esté activa en este bloque por si acaso

tabla_resumen_2 %>%
  gt() %>%
  cols_label(
    Variable = "Variable",
    Pearson = "Test Pearson (%)",
    Chi = "Chi Cuadrado",
    Umbral = "Umbral de aceptación"
  ) %>%
  tab_header(
    title = md("Tabla Nº4: Resumen del test de bondad de ajuste al modelo uniforme (Tramo 2)")
  ) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.size = px(20),
    heading.title.font.weight = "bold",
    table.font.names = "Open Sans",
    column_labels.font.weight = "bold"
  )
Tabla Nº4: Resumen del test de bondad de ajuste al modelo uniforme (Tramo 2)
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
Distancia T2 (Uniforme) 93.18 3.11 25.74

8. CÁLCULO DE PROBABILIDADES

par(oma = c(1, 1, 1, 1))
#GENERAMOS LA PREGUNTA DE PROBABILIDAD MODELO 2
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 100))

text(50, 55, "¿Cuál es la probabilidad de que la Distancia\nEstimada se encuentre entre 140 y 180 unidades?", cex = 1.25, font = 2) 
rect(0, 25, 103, 85, border = "#2A9D8F", lwd = 3)
box(which = "outer", col = "black")

Probabilidad_2 <- (punif(180, a_val, b_val) - punif(140, a_val, b_val)) * 100
Probabilidad_2
## [1] 39.391
#GRAFICA UNIFORME TRAMO 2
plot(x2, dunif(x2, a_val, b_val),
     col = "skyblue3",
     lwd = 2,
     main = "Gráfica Nº7: Cálculo de probabilidades (Modelo Uniforme)",
     ylab = "Densidad de probabilidad",
     xlab = "Distancia Estimada",
     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)

lines(x_section_2, y_section_2, col = "red", lwd = 2)
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.6))

legend("topright",
       legend = c("Modelo Uniforme", "Area de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       cex = 0.9)

text(min(x2)+15,
     max(dunif(x2, a_val, b_val)) * 1.5,
     paste0("Prob.= ", round(Probabilidad_2, 2), "%"),
     cex = 0.8,
     font = 2)

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

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:
(Probabilidad_2 / 100) * 30
## [1] 11.8173

9. INTERVALOS DE CONFIANZA

# ---- CÁLCULO PARA EL TRAMO 1 (NORMAL) ----
x_m1 <- mean(distance_1)
sigma_c1 <- sd(distance_1)
e_1 <- sigma_c1 / sqrt(n1)
li_1 <- x_m1 - 2 * e_1
ls_1 <- x_m1 + 2 * e_1

# ---- CÁLCULO PARA EL TRAMO 2 (UNIFORME) ----
x_m2 <- mean(distance_2)
sigma_c2 <- sd(distance_2)
e_2 <- sigma_c2 / sqrt(n2)
li_2 <- x_m2 - 2 * e_2
ls_2 <- x_m2 + 2 * e_2

tabla_media_compuesta <- data.frame(
  Tramo = c("Tramo 1 (0-120m)", "Tramo 2 (>120m)"),
  Limite_Inferior = round(c(li_1, li_2), 2),
  Media_Poblacional = c("Distancia E. Corta", "Distancia E. Larga"),
  Limite_Superior = round(c(ls_1, ls_2), 2),
  Error_Estandar = round(c(e_1, e_2), 4)
)

tabla_media_compuesta %>%
  gt() %>%
  cols_label(
    Tramo = "Tramo",
    Limite_Inferior = "Límite inferior",
    Media_Poblacional = "Media poblacional",
    Limite_Superior = "Límite superior",
    Error_Estandar = "Error estándar poblacional"
  ) %>%
  tab_header(title = md("Tabla Nº5: Intervalos de confianza para las medias poblacionales por tramos")) %>%
  cols_align(align = "center", columns = everything()) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.size = px(20),
    heading.title.font.weight = "bold",
    table.font.names = "Open Sans",
    column_labels.font.weight = "bold"
  )
Tabla Nº5: Intervalos de confianza para las medias poblacionales por tramos
Tramo Límite inferior Media poblacional Límite superior Error estándar poblacional
Tramo 1 (0-120m) 57.74 Distancia E. Corta 58.84 0.2740
Tramo 2 (>120m) 167.72 Distancia E. Larga 170.52 0.7008

10. CONCLUSIÓN

La variable Distancia estimada de los pozos de gas natural posee un comportamiento compuesto que requirió una segmentación matemática en dos tramos independientes.

El primer tramo, correspondiente a distancias menores o iguales a 120 metros, se ajusta adecuadamente a un modelo de distribución Normal con una media aritmética recalculada de r round(x_m1, 2) metros y una desviación estándar de r round(sigma_m1, 2) metros.

Por su parte, el segundo tramo enfocado en distancias mayores a 120 metros exhibe un patrón aplanado que se acopla a un modelo de distribución Uniforme Continua delimitado entre los valores críticos de r round(a_param, 2) y r round(b_param, 2) metros.

A partir de la separación de ambos modelos, se determinó que la probabilidad específica de que un pozo perteneciente al sector central (Modelo 1) registre una distancia entre 10 y 50 metros es de r round(Probabilidad_1, 2)%.

En contraposición, la probabilidad de que un pozo ubicado en la zona exterior (Modelo 2) se halle en el rango de 140 a 180 metros se estableció en un r round(Probabilidad_2, 2)%, demostrando la homogeneidad propia del tramo uniforme.Finalmente, mediante la aplicación del Teorema del Límite Central de manera diferenciada para cada tamaño muestral (\(n_1 = 10683\) y \(n_2 = 1878\)), se estimó con un 95% de confianza que la verdadera media poblacional para los pozos de corto alcance se encuentra estrictamente entre r round(li_m1, 2) y r round(ls_m1, 2) metros, mientras que la media de la población de pozos de largo alcance se localiza entre r round(li_m2, 2) y r round(ls_m2, 2) metros. Esta modelación dual optimiza significativamente la precisión y validez del análisis inferencial respecto a los supuestos globales iniciales.

========================================

La variable Distancia estimada se ajusta adecuadamente a un modelo de distribucion normal, con una media aritmetica de 74.86 puntos y una desviacion estandar de 48.86 puntos, lo que indica una concentracion de los valores en torno a este nivel.

A partir del modelo normal, se determino que la probabilidad de que la Distancia estimada se encuentre entre 10 y 50 es de aproximadamente 21.33 %, lo que refleja la frecuencia de estos valores. Finalmente, mediante la aplicacion del Teorema del Limite Central y considerando un tamano muestral de 12561 observaciones, se estimo que la media poblacional de la Distancia estimada se encuentra entre 73.99 y 75.73 puntos, con un 95 % de confianza, lo que respalda la validez de las inferencias realizadas bajo el modelo normal.