1. Configuración y Carga de Datos

En esta sección realizamos la conexión con la base de datos de pozos regulados históricos y cargamos el set de datos para su procesamiento.

datos_originales <- readr::read_csv2(
  "C:/Users/cordo/OneDrive/Desktop/ESTADISITCA/Oil__Gas____Other_Regulated_Wells__Beginning_1860.csv",
  locale = readr::locale(encoding = "Latin1")
)

head(datos_originales, 5)
## # A tibble: 5 × 55
##   `API Well Number` `County Code` `API Hole Number` Sidetrack Completion
##               <dbl>         <dbl>             <dbl>     <dbl>      <dbl>
## 1           3.10e15             3              2670         0          0
## 2           3.10e15             3              4599         0          0
## 3           3.10e15             3              4842         0          0
## 4           3.10e15             3              5419         0          0
## 5           3.11e15           101             26525         0          0
## # ℹ 50 more variables: `Well Name` <chr>, `Company Name` <chr>,
## #   `Operator Number` <dbl>, `Well Type` <chr>, `Map Symbol` <chr>,
## #   `Well Status` <chr>, `Status Date` <chr>, `Permit Application Date` <chr>,
## #   `Permit Issued Date` <chr>, `Date Spudded` <chr>,
## #   `Date of Total Depth` <chr>, `Completion Decade` <chr>,
## #   `Completion Year` <chr>, `Completion Month` <chr>, `Completion Day` <chr>,
## #   `Date Well Plugged` <chr>, `Date Well Confidentiality Ends` <chr>, …

2. Extracción y Limpieza de la Variable

Extraemos la columna Town, que representa los municipios de ubicación, y procedemos a eliminar los registros nulos (NA) o vacíos para evitar distorsiones en las frecuencias.

datos_limpios <- datos_originales %>%
  select(Town) %>%
  filter(!is.na(Town) & Town != "" & Town != " ") %>%
  mutate(Town = str_to_title(trimws(Town))) 

head(datos_limpios, 10)
## # A tibble: 10 × 1
##    Town      
##    <chr>     
##  1 Amity     
##  2 Amity     
##  3 Alma      
##  4 West Union
##  5 Middlebury
##  6 Bennington
##  7 Bennington
##  8 West Union
##  9 Greenwood 
## 10 Arcade

3. Identificación de la Variable

  • Nombre de la Variable: TOWN (Municipio de ubicación del pozo)
  • Tipo de Variable: Cualitativa Nominal (Categorías sin orden de jerarquía intrínseco).

4. Tabla de Distribución de Frecuencias (TDF)

Dado que la variable tiene una alta cantidad de categorías, agruparemos los municipios con menores frecuencias bajo la etiqueta “Otros”, manteniendo las 10 localidades más frecuentes de forma individual para optimizar la claridad analítica.

# TDF
tdf_town <- datos_limpios %>%
  group_by(Town) %>%
  summarise(Fi = n(), .groups = 'drop') %>%
  arrange(desc(Fi)) %>%
  mutate(
    hi = Fi / sum(Fi),
    Pi = hi * 100
  )

total_observaciones <- sum(tdf_town$Fi)

top_towns <- tdf_town %>% slice_max(order_by = Fi, n = 10)
otros_towns <- tdf_town %>% slice(11:n()) %>% 
  summarise(Town = "Otros", Fi = sum(Fi), hi = sum(hi), Pi = sum(Pi))

tdf_presentacion <- bind_rows(top_towns, otros_towns) %>%
  mutate(
    `Fi_ac` = cumsum(Fi),
    `hi_ac` = cumsum(hi)
  )

tdf_presentacion %>%
  rename(
    `Municipio (Town)` = Town,
    `Frec. Absoluta (Fi)` = Fi,
    `Frec. Relativa (hi)` = hi,
    `Porcentaje (%)` = Pi,
    `Frec. Abs. Acumulada (Fi_ac)` = Fi_ac,
    `Frec. Rel. Acumulada (hi_ac)` = hi_ac
  ) %>%
  kbl(
    caption = "<div style='color:#1D4E73; font-family:\"Lora\", serif; font-weight:bold; font-size:16px; text-align:center; width:100%; display:block;'>TABLA 1. Distribución de Frecuencias de Pozos por Municipio</div>",
    digits = 4, 
    align = "lccccc"
  ) %>%
  kable_styling(
    bootstrap_options = c("hover", "striped"),
    full_width = TRUE,
    position = "center"
  ) %>%
  row_spec(0, 
           background = "#1D4E73", 
           color = "white", 
           bold = TRUE, 
           align = "center",
           extra_css = "padding: 12px !important; font-family: 'Lora', serif; font-size: 14px;"
  ) %>%
  row_spec(1:nrow(tdf_presentacion), 
           extra_css = "padding: 10px !important; font-family: 'Lora', serif; font-size: 14px; border-bottom: 1px solid #7ABDEF !important;"
  ) %>%
  footnote(general = paste("Total de registros históricos válidos procesados:", comma(total_observaciones)))
TABLA 1. Distribución de Frecuencias de Pozos por Municipio
Municipio (Town) Frec. Absoluta (Fi) Frec. Relativa (hi) Porcentaje (%) Frec. Abs. Acumulada (Fi_ac) Frec. Rel. Acumulada (hi_ac)
Allegany 6088 0.1302 13.0177 6088 0.1302
Bolivar 5422 0.1159 11.5936 11510 0.2461
Alma 3621 0.0774 7.7426 15131 0.3235
Carrollton 2724 0.0582 5.8246 17855 0.3818
Wirt 1537 0.0329 3.2865 19392 0.4147
Olean 1498 0.0320 3.2031 20890 0.4467
Genesee 1405 0.0300 3.0043 22295 0.4767
Scio 1341 0.0287 2.8674 23636 0.5054
Busti 966 0.0207 2.0656 24602 0.5261
West Union 926 0.0198 1.9800 25528 0.5459
Otros 21239 0.4541 45.4145 46767 1.0000
Note:
Total de registros históricos válidos procesados: 46,767

5. Representación Gráfica

# Paleta de colores
paleta_azul <- c(
  "#1D4E73", "#2870A4", "#3392D5", "#56A9E2", "#7ABDEF", 
  "#A3D2F7", "#CBE4FA", "#DCEEFC", "#EAF4FD", "#F2F7FB", "#BDC5C8"
)

fuente_unificada <- "Lora"
tamano_titulo    <- 16
tamano_ejes      <- 13
tamano_labels    <- 12

datos_ordenados <- tdf_presentacion %>%
  mutate(Town = factor(Town, levels = c(setdiff(Town, "Otros"), "Otros")))

5.1 Gráfica N°1 — Diagrama de Barras (Frecuencia Absoluta)

ggplot(datos_ordenados, aes(x = Town, y = Fi, fill = Town)) +
  geom_bar(stat = "identity", color = "#1D4E73", lwd = 0.4, width = 0.72, show.legend = FALSE) +
  geom_text(
    aes(label = comma(Fi)), 
    vjust = -0.5, 
    size = 4.5, 
    fontface = "bold", 
    family = fuente_unificada,
    color = "#1D4E73"
  ) +
  scale_fill_manual(values = paleta_azul) +
  scale_y_continuous(labels = comma, expand = expansion(mult = c(0, 0.12))) +
  labs(
    title = "Gráfica N°1: Frecuencia Absoluta de Pozos por Municipio",
    x = "Municipios",
    y = "Número Total de Pozos (Fi)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(family = fuente_unificada, size = tamano_titulo, face = "bold", color = "#1D4E73", hjust = 0.5, margin = margin(b = 20)),
    axis.title = element_text(family = fuente_unificada, size = tamano_ejes, face = "bold", color = "#2c1e21"),
    axis.text.x = element_text(family = fuente_unificada, size = tamano_labels, angle = 35, hjust = 1, face = "bold", color = "#4a3b3d"),
    axis.text.y = element_text(family = fuente_unificada, size = tamano_labels, color = "#4a3b3d"),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank()
  )

5.2 Gráfica N°2 — Diagrama de Barras (Porcentaje)

ggplot(datos_ordenados, aes(x = Town, y = Pi, fill = Town)) +
  geom_bar(stat = "identity", color = "#1D4E73", lwd = 0.4, width = 0.72, show.legend = FALSE) +
  geom_text(
    aes(label = paste0(round(Pi, 1), "%")), 
    vjust = -0.5, 
    size = 4.5, 
    fontface = "bold", 
    family = fuente_unificada,
    color = "#1D4E73"
  ) +
  scale_fill_manual(values = paleta_azul) +
  scale_y_continuous(limits = c(0, max(datos_ordenados$Pi) * 1.15), labels = function(x) paste0(x, "%")) +
  labs(
    title = "Gráfica N°2: Distribución Porcentual Relativa de Pozos",
    x = "Municipios",
    y = "Porcentaje de Participación (%)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(family = fuente_unificada, size = tamano_titulo, face = "bold", color = "#1D4E73", hjust = 0.5, margin = margin(b = 20)),
    axis.title = element_text(family = fuente_unificada, size = tamano_ejes, face = "bold", color = "#2c1e21"),
    axis.text.x = element_text(family = fuente_unificada, size = tamano_labels, angle = 35, hjust = 1, face = "bold", color = "#4a3b3d"),
    axis.text.y = element_text(family = fuente_unificada, size = tamano_labels, color = "#4a3b3d"),
    panel.grid.major.x = element_blank(),
    panel.grid.minor = element_blank()
  )

5.3 Gráfica N°3 — Diagrama Circular Estructurado

datos_pie <- datos_ordenados %>%
  arrange(Town) %>%
  mutate(
    Town_Etiqueta = paste0(Town, " (", round(Pi, 1), "%)"),
    Town_Etiqueta = factor(Town_Etiqueta, levels = Town_Etiqueta),
    label_text = paste0(round(Pi, 1), "%")
  )

ggplot(datos_pie, aes(x = "", y = Pi, fill = Town_Etiqueta)) +
  geom_bar(stat = "identity", width = 1, color = "#ffffff", size = 0.5) +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = paleta_azul, name = "Municipios (Town)") +
  
  geom_text(
    aes(label = ifelse(Pi >= 5, label_text, "")),
    position = position_stack(vjust = 0.5), 
    color = "white", 
    fontface = "bold", 
    family = fuente_unificada, 
    size = 4.5
  ) +
  
  labs(
    title = "Gráfica N°3: Distribución Porcentual Estructurada de Pozos por Municipio"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(family = fuente_unificada, size = tamano_titulo, face = "bold", color = "#1D4E73", hjust = 0.5, margin = margin(b = 15)),
    legend.title = element_text(family = fuente_unificada, size = tamano_ejes, face = "bold", color = "#1D4E73"),
    legend.text = element_text(family = fuente_unificada, size = tamano_labels, color = "#2c1e21"),
    legend.position = "right"
  )


6. Tabla de Indicadores

Debido a la naturaleza nominal de la variable TOWN, se calculan indicadores estadísticos de categorización y concentración en lugar de promedios o desviaciones estándar.

moda_municipio <- tdf_town$Town[1]
moda_frecuencia <- tdf_town$Fi[1]
moda_porcentaje <- tdf_town$Pi[1]
top3_porcentaje <- sum(tdf_town$Pi[1:3])

indicadores <- data.frame(
  Indicador = c(
    "Total de Pozos Válidos Registrados (N)",
    "Número Total de Municipios Registrados (Categorías)",
    "Localidad de Máxima Concentración (Moda)",
    "Frecuencia Absoluta de la Moda (Pozos)",
    "Porcentaje de Representación de la Moda (%)",
    "Tasa de Concentración Acumulada Top 3 (%)"
  ),
  Valor = c(
    comma(total_observaciones),
    comma(nrow(tdf_town)),
    moda_municipio,
    comma(moda_frecuencia),
    paste0(round(moda_porcentaje, 2), "%"),
    paste0(round(top3_porcentaje, 2), "%")
  )
)

indicadores %>%
  kbl(
    caption = "<div style='color:#1D4E73; font-family:\"Lora\", serif; font-weight:bold; font-size:16px; text-align:center; width:100%; display:block;'>TABLA 2. Indicadores Estadísticos de la Variable TOWN</div>",
    align = "lc"
  ) %>%
  kable_styling(
    bootstrap_options = c("hover", "striped"),
    full_width = TRUE,
    position = "center"
  ) %>%
  row_spec(0, 
           background = "#2870A4", 
           color = "white", 
           bold = TRUE, 
           align = "center",
           extra_css = "padding: 12px !important; font-family: 'Lora', serif; font-size: 14px;"
  ) %>%
  row_spec(1:nrow(indicadores), 
           extra_css = "padding: 12px !important; font-family: 'Lora', serif; font-size: 14px; border-bottom: 1px solid #56A9E2 !important;"
  )
TABLA 2. Indicadores Estadísticos de la Variable TOWN
Indicador Valor
Total de Pozos Válidos Registrados (N) 46,767
Número Total de Municipios Registrados (Categorías) 523
Localidad de Máxima Concentración (Moda) Allegany
Frecuencia Absoluta de la Moda (Pozos) 6,088
Porcentaje de Representación de la Moda (%) 13.02%
Tasa de Concentración Acumulada Top 3 (%) 32.35%

7. Conclusión

Los resultados muestran que la gran mayoría de los pozos se concentran en muy pocos lugares:

  • Municipio con mayor cantidad de pozos: La mayor parte de la actividad ocurre en Allegany, que por sí solo representa el 13% de todos los registros.
  • Zona central: Si sumamos las 3 localidades con más registros, se acumula el 32.4% del total, lo que confirma que el trabajo fuerte se agrupa en un sector muy pequeño.
  • Resto del territorio: El porcentaje restante está repartido en pequeñas cantidades por muchos otros municipios, agrupados aquí bajo la etiqueta “Otros”.