#==============================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 = ";")
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")
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")
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 |
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")
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")
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 |
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
# ---- 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 |
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.