1. Carga de Librerías

library(tidyverse)
library(knitr)
library(kableExtra)
library(scales)

2. Carga de Data Set

datos_originales <- read_csv2("C:/Users/cordo/OneDrive/Desktop/ESTADISITCA/Oil__Gas____Other_Regulated_Wells__Beginning_1860.csv")

names(datos_originales) <- trimws(toupper(names(datos_originales)))

3. Extracción y Limpieza de la Variable

La variable Well Type registra la clasificación operativa o tipo de pozo dentro del registro regulado. Debido a la cantidad de categorías en la variable, aquellas que no se encuentran entre las 8 más frecuentes se agruparán en la categoría “Otros” para optimizar la representación gráfica y el análisis de tendencias principales.

# Detección flexible de la columna del dataset original
col_nombre <- grep("WELL.*TYPE", names(datos_originales), value = TRUE)[1]

df_clean <- datos_originales %>%
  select(Well_Type = all_of(col_nombre)) %>%
  filter(!is.na(Well_Type)) %>%
  mutate(Well_Type = as.character(Well_Type))

top_8 <- df_clean %>% count(Well_Type, sort = TRUE) %>% head(8) %>% pull(Well_Type)

tabla_frec <- df_clean %>%
  mutate(WELL_TYPE = ifelse(Well_Type %in% top_8, Well_Type, "Otros")) %>%
  count(WELL_TYPE, name = "Frecuencia_Absoluta") %>%
  mutate(
    Frecuencia_Relativa = Frecuencia_Absoluta / sum(Frecuencia_Absoluta),
    Porcentaje = Frecuencia_Relativa * 100,
    Frecuencia_Acumulada = cumsum(Frecuencia_Absoluta)
  ) %>%
  arrange(desc(Frecuencia_Absoluta))

4. Tabla de Distribución de Frecuencias

tabla_frec %>%
  mutate(Frecuencia_Relativa = round(Frecuencia_Relativa, 4)) %>%
  select(Tipo_Pozo = WELL_TYPE, `ni (Absoluta)` = Frecuencia_Absoluta, `hi (Relativa)` = Frecuencia_Relativa) %>%
  kable(caption = "Tabla N°1: Tabla de Distribución de Frecuencias",
        align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                full_width = FALSE, 
                position = "center") %>%
  row_spec(0, background = "#1D4E73", color = "white", bold = TRUE) %>%
  footnote(general = "Fuente: Oil, Gas & Other Regulated Wells - NY State",
           general_title = "",
           footnote_as_chunk = TRUE)
Tabla N°1: Tabla de Distribución de Frecuencias
Tipo_Pozo ni (Absoluta) hi (Relativa)
OD 17885 0.3774
GD 10047 0.2120
NL 8490 0.1792
IW 4502 0.0950
Otros 1895 0.0400
DW 1695 0.0358
DH 1136 0.0240
ST 973 0.0205
BR 765 0.0161
Fuente: Oil, Gas & Other Regulated Wells - NY State

5. Análisis Gráfico

tema_vertical <- theme_minimal() + 
  theme(
    plot.title = element_text(face = "bold", color = "#1D4E73", size = 13, hjust = 0.5),
    panel.grid.major.x = element_blank(), 
    panel.grid.minor.x = element_blank(),
    axis.text.x = element_text(angle = 45, hjust = 1, face = "bold")
  )

colores_usados <- colorRampPalette(paleta_colores)(nrow(tabla_frec))

5.1 Diagrama de Barras — Frecuencia Absoluta

ggplot(tabla_frec, aes(x = reorder(WELL_TYPE, -Frecuencia_Absoluta), y = Frecuencia_Absoluta, fill = WELL_TYPE)) +
  geom_col(show.legend = FALSE) +
  scale_fill_manual(values = colores_usados) +
  geom_text(aes(label = Frecuencia_Absoluta), vjust = -0.5, size = 3.5, fontface = "bold") +
  tema_vertical +
  labs(
    title = "Gráfica N°1: Frecuencia Absoluta por Tipo de Pozo",
    x = "Tipo de Pozo",
    y = "Frecuencia Absoluta (ni)",
    caption = "Fuente: Oil, Gas & Other Regulated Wells - NY State"
  )

5.2 Diagrama de Barras — Frecuencia Relativa / Porcentajes

ggplot(tabla_frec, aes(x = reorder(WELL_TYPE, -Porcentaje), y = Porcentaje, fill = WELL_TYPE)) +
  geom_col(show.legend = FALSE) +
  scale_fill_manual(values = colores_usados) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")), vjust = -0.5, size = 3.5, fontface = "bold") +
  tema_vertical +
  labs(
    title = "Gráfica N°2: Frecuencia Relativa por Tipo de Pozo",
    x = "Tipo de Pozo",
    y = "Porcentaje (%)",
    caption = "Fuente: Oil, Gas & Other Regulated Wells - NY State"
  )

6. Conjetura de Modelo Geométrico

conteo_modelo <- tabla_frec %>%
  mutate(WELL_TYPE = as.character(WELL_TYPE)) %>%
  arrange(desc(Frecuencia_Absoluta))

conteo_modelo$ID <- 1:nrow(conteo_modelo)

# Estimación del parámetro p por método de momentos
media_observada <- sum(conteo_modelo$ID * conteo_modelo$Frecuencia_Relativa)
p_estimado <- 1 / media_observada

cat("Parámetro estimado p =", round(p_estimado, 4), "\n")
## Parámetro estimado p = 0.383
# Probabilidades del modelo geométrico
prob_geom <- p_estimado * (1 - p_estimado)^(conteo_modelo$ID - 1)
prob_geom <- prob_geom / sum(prob_geom)

conteo_modelo$hi_modelo     <- round(prob_geom, 4)
conteo_modelo$hi_modelo_pct <- round(prob_geom * 100, 2)
conteo_modelo$hi_pct        <- round(conteo_modelo$Frecuencia_Relativa * 100, 2)

Gráfica comparativa de los valores observados y estimados

df_comparativo <- conteo_modelo %>%
  select(WELL_TYPE, hi_pct, hi_modelo_pct) %>%
  pivot_longer(cols = c(hi_pct, hi_modelo_pct),
               names_to = "Origen", values_to = "Valor") %>%
  mutate(Origen = ifelse(Origen == "hi_pct", "Realidad", "Modelo"))

df_comparativo$WELL_TYPE <- factor(df_comparativo$WELL_TYPE, levels = conteo_modelo$WELL_TYPE)

ggplot(df_comparativo, aes(x = WELL_TYPE, y = Valor, fill = Origen)) +
  geom_bar(stat = "identity", position = "dodge", color = "white") +
  scale_fill_manual(values = c("Modelo" = "skyblue", "Realidad" = "#1D4E73")) +
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", color = "#1D4E73", size = 13, hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1, face = "bold")
  ) +
  labs(
    title    = "Gráfica N°3: Modelo Geométrico comparado con la Realidad",
    x        = "Tipo de Pozo",
    y        = "Probabilidad (%)",
    fill     = "Origen"
  )

7. Test de Bondad

7.1 Test de Pearson

cat("Correlación de Pearson (%):", round(r_pearson, 4), "\n")
## Correlación de Pearson (%): 99.1931
plot(Fo, Fe,
     main = "Gráfica N°4: Correlación Modelo Observado y Esperado",
     sub = paste0("r = ", round(r_pearson, 2), "%"),
     xlab = "Frecuencia Observada (hi %)",
     ylab = "Frecuencia Esperada (hi modelo %)",
     pch  = 19,
     col  = "#1D4E73",
     cex.main = 1.1,
     font.main = 2,
     col.main = "#1D4E73")
abline(lm(Fe ~ 0 + Fo), col = "red", lwd = 2)
legend("topleft",
       legend = paste0("r = ", round(r_pearson, 2), "%"),
       bty    = "n")

7.2 Test Chi-Cuadrado (\(\chi^2\))

cat("Chi-Cuadrado:", round(chi2_calc, 4), "\n")
## Chi-Cuadrado: 2.7269
cat("Valor Crítico:", round(chi2_crit, 4), "\n")
## Valor Crítico: 14.0671
cat("¿El modelo geométrico es aceptado?:", chi2_calc < chi2_crit, "\n")
## ¿El modelo geométrico es aceptado?: TRUE

Tabla Resumen del Test

tabla_test <- data.frame(
  Variable          = "Tipo de Pozo (Well Type)",
  `Test Pearson (%)`= round(r_pearson, 2),
  `Chi Cuadrado`    = round(chi2_calc, 2),
  `Umbral de Aceptación` = round(chi2_crit, 2),
  Resultado         = ifelse(chi2_calc < chi2_crit, "Modelo Aceptado", "Modelo Rechazado"),
  check.names = FALSE
)

tabla_test %>%
  kable(caption = "Tabla N°2: Resumen del Test de Bondad al Modelo de Probabilidad",
        align = c("c", "c", "c", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), 
                full_width = FALSE, 
                position = "center") %>%
  row_spec(0, background = "#1D4E73", color = "white", bold = TRUE) %>%
  footnote(general = "Autor: Jennifer Cordones",
           general_title = "",
           footnote_as_chunk = TRUE)
Tabla N°2: Resumen del Test de Bondad al Modelo de Probabilidad
Variable Test Pearson (%) Chi Cuadrado Umbral de Aceptación Resultado
Tipo de Pozo (Well Type) 99.19 2.73 14.07 Modelo Aceptado
Autor: Jennifer Cordones

8. Cálculo de Probabilidades

prob_principal <- tabla_frec$Frecuencia_Relativa[1] * 100
tipo_principal <- as.character(tabla_frec$WELL_TYPE[1])

cat("Probabilidad de estar en el tipo de pozo más frecuente (", tipo_principal, "):",
    round(prob_principal, 2), "%\n")
## Probabilidad de estar en el tipo de pozo más frecuente ( OD ): 37.74 %
pozos_top2 <- sum(tabla_frec$Frecuencia_Absoluta[1:min(2, nrow(tabla_frec))])
tipos_top2 <- paste(tabla_frec$WELL_TYPE[1:min(2, nrow(tabla_frec))], collapse = " y ")

cat("Pozos en las principales concentraciones operativas (", tipos_top2, "):", pozos_top2, "\n")
## Pozos en las principales concentraciones operativas ( OD y GD ): 27932

¿Cuál es la probabilidad de que un pozo seleccionado al azar se encuentre en el tipo de pozo con mayor concentración (OD)? La probabilidad estimada indica que aproximadamente el 37.74% de los pozos regulados corresponden al tipo OD, siendo la clasificación operativa más frecuente en el registro.

¿Cuántos pozos se encuentran ubicados entre las principales tipologías (OD y GD)? En la base de datos analizada, un total de 27932 pozos se agrupan en estas tipologías principales, lo que representa una porción sumamente relevante del inventario total evaluado.

9. Conclusión

Tras filtrar los registros nulos de la variable Well Type y agrupar las categorías menores fuera del Top 8 en la categoría “Otros”, se determinó que la clasificación operativa OD concentra el 37.74% de los pozos registrados en el estado de Nueva York.

Al ordenar las categorías por frecuencia descendente para evaluar el comportamiento estocástico, el Modelo Geométrico obtuvo un estadístico Chi-Cuadrado de 2.7269 frente a un valor crítico de 14.0671, por lo que el modelo es aceptado (\(\chi^2_{calc} < \chi^2_{crit}\)), respaldado por una fuerte correlación de Pearson del 99.19%.


Autor: Jennifer Cordones | Análisis Estadístico — Oil, Gas & Other Regulated Wells - NY State