1. Configuración y Carga de Datos

Para iniciar el procesamiento estadístico, se verifica la estructura global del conjunto de datos correspondientes a los bloques contractuales y arrendamientos de hidrocarburos en el estado de Kansas.

ruta_csv <- ("C:/Users/thann/OneDrive/Escritorio/ESTADISTICA.LOL/datos_vale.csv")
datos <- read_delim(ruta_csv, delim = ";", show_col_types = FALSE)
cat("Base de datos cargada correctamente.\n")
## Base de datos cargada correctamente.
cat("Total de registros (filas):", nrow(datos), "\n")
## Total de registros (filas): 104173

2. Extraer Variable

Se realiza el aislamiento de la variable cuantitativa continua LONGITUDE, que representa la coordenada geográfica de longitud (en grados decimales) de cada arrendamiento de hidrocarburos en Kansas. Se aplica una función de limpieza para convertir el formato almacenado (con puntos múltiples) al valor decimal correcto, y se filtran únicamente los valores válidos dentro del rango geográfico del estado de Kansas (−102.5° a −94.5° W).

parse_lon <- function(val) {
  tryCatch({
    s <- trimws(as.character(val))
    if (s %in% c("NA", "NaN", "", "None")) return(NA_real_)
    neg <- startsWith(s, "-")
    s2  <- sub("^-", "", s)
    clean <- gsub("\\.", "", s2)
    if (nchar(clean) < 3) return(NA_real_)
    f <- as.numeric(paste0(substr(clean, 1, 2), ".", substr(clean, 3, nchar(clean))))
    if (neg) -f else f
  }, error = function(e) NA_real_)
}

x_raw <- datos %>%
  mutate(LON = sapply(LONGITUDE, parse_lon)) %>%
  filter(!is.na(LON), LON >= -102.5, LON <= -94.5) %>%
  pull(LON)

n_unique <- length(unique(x_raw))
cat("Observaciones válidas:", length(x_raw), "\n")
## Observaciones válidas: 68003
cat("Valores únicos:", n_unique, "\n")
## Valores únicos: 41014
cat("Como hay", n_unique, "> 10 valores únicos, se agrupa en intervalos de clase (máx. 10).\n")
## Como hay 41014 > 10 valores únicos, se agrupa en intervalos de clase (máx. 10).

3. Determinación de los Intervalos

Se aplica el criterio de máximo 10 intervalos para variables continuas agrupadas. Los intervalos se construyen con notación \([L_i, L_s)\) —cerrado a la izquierda, abierto a la derecha—, excepto el último que se cierra en ambos extremos.

\[k = 10 \quad \text{(máximo permitido)} \qquad c = \left\lceil \frac{\max - \min}{k} \right\rceil\]

x         <- x_raw
n         <- length(x)
x_min     <- min(x)
x_max     <- max(x)
rango_val <- x_max - x_min

k      <- 10
c_amp  <- rango_val / k

cat("n =", n, "| k =", k, "| Rango =", round(rango_val, 6), "| Amplitud c =", round(c_amp, 6), "\n")
## n = 68003 | k = 10 | Rango = 5.389095 | Amplitud c = 0.538909
lim_inf    <- x_min + (0:(k - 1)) * c_amp
lim_sup    <- lim_inf + c_amp
lim_sup[k] <- x_max
mc         <- (lim_inf + lim_sup) / 2
breaks_vec <- c(lim_inf, lim_sup[k])

4. Tabla de Distribución de Frecuencias

Se calcula la distribución de frecuencias absolutas y relativas para la variable cuantitativa continua agrupada Longitud, correspondiente a los arrendamientos de hidrocarburos registrados en Kansas, EE.UU.

intervalos_cut <- cut(x, breaks = breaks_vec, right = FALSE, include.lowest = TRUE)
freq_abs       <- as.integer(table(intervalos_cut))

li <- lim_inf
ls <- lim_sup

hi_dec  <- freq_abs / n
Ni_asc  <- cumsum(freq_abs)
Hi_asc  <- cumsum(hi_dec)
Ni_desc <- n - c(0, head(Ni_asc, -1))
Hi_desc <- 1 - c(0, head(Hi_asc, -1))

etiq_intervalo    <- paste0("[", round(li, 4), " – ", round(ls, 4), ")")
etiq_intervalo[k] <- paste0("[", round(li[k], 4), " – ", round(ls[k], 4), "]")

tabla_df <- data.frame(
  Intervalo = etiq_intervalo,
  MC        = round(mc, 4),
  ni        = freq_abs,
  hi_pct    = round(hi_dec * 100, 2),
  hi_real   = round(hi_dec, 4),
  Ni_a      = Ni_asc,
  Hi_a      = round(Hi_asc, 4),
  Ni_d      = Ni_desc,
  Hi_d      = round(Hi_desc, 4),
  stringsAsFactors = FALSE
)

total_row <- data.frame(
  Intervalo = "TOTAL",
  MC        = NA_real_,
  ni        = sum(freq_abs),
  hi_pct    = round(sum(hi_dec) * 100, 2),
  hi_real   = round(sum(hi_dec), 4),
  Ni_a      = max(Ni_asc),
  Hi_a      = round(max(Hi_asc), 4),
  Ni_d      = max(Ni_desc),
  Hi_d      = round(max(Hi_desc), 4),
  stringsAsFactors = FALSE
)

tabla_final_freq <- bind_rows(tabla_df, total_row)

tabla_final_freq %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°1: Distribución de Frecuencias**"),
    subtitle = md(paste0(
      "*Variable Cuantitativa Continua Agrupada: Longitud, ",
      "arrendamientos de hidrocarburos, Kansas, EE.UU. (n = ",
      format(n, big.mark = ","), " registros válidos)*"
    ))
  ) %>%
  cols_label(
    Intervalo = md("**Intervalo [Li – Ls)**"),
    MC        = md("**Marca de Clase**"),
    ni        = md("**ni (FA)**"),
    hi_pct    = md("**hi %**"),
    hi_real   = md("**hi (decimal)**"),
    Ni_a      = md("**Ni ↑ (FAAa)**"),
    Hi_a      = md("**Hi ↑ (FRAa)**"),
    Ni_d      = md("**Ni ↓ (FAAd)**"),
    Hi_d      = md("**Hi ↓ (FRAd)**")
  ) %>%
  tab_spanner(label = md("**Frecuencia Relativa**"), columns = c(hi_pct, hi_real)) %>%
  tab_spanner(label = md("**Acumulada ↑**"),         columns = c(Ni_a, Hi_a)) %>%
  tab_spanner(label = md("**Acumulada ↓**"),         columns = c(Ni_d, Hi_d)) %>%
  tab_style(
    style = list(
      cell_fill(color = "#2C2C2C"),
      cell_text(color = "white", weight = "bold")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#2C2C2C"),
      cell_text(color = "white", weight = "bold")
    ),
    locations = cells_column_spanners()
  ) %>%
  tab_style(
    style = cell_fill(color = "#F5F5F5"),
    locations = cells_body(rows = seq(1, nrow(tabla_final_freq), by = 2))
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#D6D6D6"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows    = Intervalo == "TOTAL",
      columns = everything()
    )
  ) %>%
  fmt_missing(columns = everything(), missing_text = "—") %>%
  tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
  tab_options(
    table.width                = pct(100),
    heading.title.font.size    = px(16),
    heading.subtitle.font.size = px(12),
    table.font.size            = px(13),
    data_row.padding           = px(6)
  )
Tabla N°1: Distribución de Frecuencias
Variable Cuantitativa Continua Agrupada: Longitud, arrendamientos de hidrocarburos, Kansas, EE.UU. (n = 68,003 registros válidos)
Intervalo [Li – Ls) Marca de Clase ni (FA)
Frecuencia Relativa
Acumulada ↑
Acumulada ↓
hi % hi (decimal) Ni ↑ (FAAa) Hi ↑ (FRAa) Ni ↓ (FAAd) Hi ↓ (FRAd)
[-99.9999 – -99.461) -99.7305 7612 11.19 0.1119 7612 0.1119 68003 1.0000
[-99.461 – -98.9221) -99.1916 12247 18.01 0.1801 19859 0.2920 60391 0.8881
[-98.9221 – -98.3832) -98.6526 14348 21.10 0.2110 34207 0.5030 48144 0.7080
[-98.3832 – -97.8443) -98.1137 7284 10.71 0.1071 41491 0.6101 33796 0.4970
[-97.8443 – -97.3054) -97.5748 3421 5.03 0.0503 44912 0.6604 26512 0.3899
[-97.3054 – -96.7665) -97.0359 4469 6.57 0.0657 49381 0.7262 23091 0.3396
[-96.7665 – -96.2276) -96.4970 2185 3.21 0.0321 51566 0.7583 18622 0.2738
[-96.2276 – -95.6886) -95.9581 5572 8.19 0.0819 57138 0.8402 16437 0.2417
[-95.6886 – -95.1497) -95.4192 7726 11.36 0.1136 64864 0.9538 10865 0.1598
[-95.1497 – -94.6108] -94.8803 3139 4.62 0.0462 68003 1.0000 3139 0.0462
TOTAL 68003 100.00 1.0000 68003 1.0000 68003 1.0000
Autor: Leslye Quinchiguango

5. Representación Gráfica

Se presentan cuatro gráficas en escala de grises que permiten analizar visualmente la distribución de la variable cuantitativa continua agrupada Longitud.

5.1 Gráfica N°1 — Histograma de Frecuencias Absolutas

grises <- gray(seq(0.25, 0.80, length.out = k))
h_obj  <- hist(x, breaks = breaks_vec, plot = FALSE)

par(mar = c(5, 6, 6, 2))
plot(h_obj,
     col    = grises,
     border = "black",
     freq   = TRUE,
     main   = "",
     xlab   = "",
     ylab   = "",
     las    = 1,
     xaxt   = "n")

axis(1, at = round(breaks_vec, 4), labels = round(breaks_vec, 4), las = 2, cex.axis = 0.85)
mtext("Frecuencia Absoluta (ni)",      side = 2, line = 4.5, cex = 1)
mtext("Longitud (grados decimales)",   side = 1, line = 4.2, cex = 1)
mtext(
  "Gráfica N°1: Histograma de Frecuencias Absolutas — Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

5.2 Gráfica N°2 — Polígono de Frecuencias

mc_ext <- c(mc[1] - c_amp, mc, mc[k] + c_amp)
ni_ext <- c(0, freq_abs, 0)

grises <- gray(seq(0.25, 0.80, length.out = k))
h_obj  <- hist(x, breaks = breaks_vec, plot = FALSE)

par(mar = c(5, 6, 6, 2))

plot(h_obj,
     col    = grises,
     border = "black",
     freq   = TRUE,
     main   = "",
     xlab   = "",
     ylab   = "",
     las    = 1,
     xaxt   = "n",
     ylim   = c(0, max(freq_abs) * 1.20))

axis(1, at = round(breaks_vec, 4), labels = round(breaks_vec, 4), las = 2, cex.axis = 0.85)

lines(mc_ext, ni_ext, col = "black", lwd = 2, lty = 1)
points(mc_ext, ni_ext, pch = 16, col = "black", cex = 0.9)

mtext("Frecuencia Absoluta (ni)",      side = 2, line = 4.5, cex = 1)
mtext("Longitud (grados decimales)",   side = 1, line = 4.2, cex = 1)
mtext(
  "Gráfica N°2: Polígono de Frecuencias — Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
legend("topright",
       legend = c("Histograma", "Polígono de frecuencias"),
       fill   = c("gray60", NA), border = c("black", NA),
       lty    = c(NA, 1),        pch    = c(NA, 16),
       lwd    = c(NA, 2),        col    = c(NA, "black"),
       bty = "n", cex = 0.85)

5.3 Gráfica N°3 — Boxplot

media    <- mean(x)
mediana  <- median(x)
desv_std <- sd(x)
q1       <- as.numeric(quantile(x, 0.25))
q3       <- as.numeric(quantile(x, 0.75))

par(mar = c(5, 4, 6, 2))
boxplot(x,
        col = "gray75", border = "black",
        horizontal = TRUE, outline = TRUE, pch = 16, cex = 0.5,
        main = "", xlab = "", ylab = "")
mtext("Longitud (grados decimales)", side = 1, line = 3.5, cex = 1)
mtext(
  "Gráfica N°3: Boxplot — Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)
text(q1,      1.38, labels = paste0("Q1=", round(q1, 4)), cex = 0.8)
text(mediana, 0.62, labels = paste0("Me=", round(mediana, 4)), cex = 0.8)
text(q3,      1.38, labels = paste0("Q3=", round(q3, 4)), cex = 0.8)

5.4 Gráfica N°4 — Ojivas Creciente y Decreciente

x_asc  <- c(li[1], ls)
y_asc  <- c(0, Ni_asc)
x_desc <- c(li[1], ls)
y_desc <- c(n, Ni_desc)

par(mar = c(5, 7, 6, 2))

plot(x_asc, y_asc,
     type = "b", pch = 16, lwd = 2, col = "black",
     ylim = c(0, n * 1.10),
     xlim = c(min(x_asc) - 0.01, max(x_asc) + 0.01),
     xlab = "", ylab = "", main = "",
     las  = 1, xaxt = "n")

axis(1, at = round(breaks_vec, 4), labels = round(breaks_vec, 4), las = 2, cex.axis = 0.85)

lines(x_desc, y_desc,
      type = "b", pch = 17, lwd = 2, col = "gray40", lty = 2)

grid(col = "gray85", lty = "dotted")

y_cruce <- n / 2
abline(h = y_cruce, col = "gray50", lty = 3, lwd = 1.2)
abline(v = mediana,  col = "gray50", lty = 3, lwd = 1.2)
text(mediana + 0.05, y_cruce + (n * 0.04),
     labels = paste0("Cruce \u2248 Me = ", round(mediana, 4)),
     cex = 0.82, col = "black", font = 3)

legend("right",
       legend = c("Ojiva Creciente (Ni \u2191)", "Ojiva Decreciente (Ni \u2193)"),
       col = c("black", "gray40"), lty = c(1, 2), pch = c(16, 17),
       lwd = 2, bty = "n", cex = 0.9)

mtext("Frecuencia Absoluta Acumulada (Ni)", side = 2, line = 5,   cex = 1)
mtext("Longitud (grados decimales)",         side = 1, line = 4.2, cex = 1)
mtext(
  "Gráfica N°4: Ojivas Creciente y Decreciente — Longitud,\narrendamientos de hidrocarburos, Kansas, EE.UU.",
  side = 3, line = 3, cex = 0.9, font = 2
)

6. Indicadores Estadísticos

Para la variable cuantitativa continua agrupada Longitud, se calculan todos los indicadores de tendencia central, dispersión y forma.

moda_idx     <- which.max(freq_abs)
moda_val     <- round(mc[moda_idx], 4)
cv           <- (desv_std / abs(media)) * 100
iqr_val      <- IQR(x)
asimetria    <- (3 * (media - mediana)) / desv_std
curtosis_val <- (sum((x - media)^4) / length(x)) / (desv_std^4)
lim_inf_out  <- q1 - 1.5 * iqr_val
lim_sup_out  <- q3 + 1.5 * iqr_val
outliers     <- sort(unique(round(x[x < lim_inf_out | x > lim_sup_out], 4)))
outliers_str <- if (length(outliers) == 0) "Sin valores atípicos" else paste(outliers, collapse = ", ")

indicadores <- data.frame(
  Indicador = c(
    "Tamaño muestral (n)",
    "Mínimo",
    "Máximo",
    "Rango",
    "Media",
    "Mediana",
    "Moda",
    "Varianza (s²)",
    "Desviación estándar (s)",
    "Coef. de variación (CV%)",
    "Cuartil 1 (Q1)",
    "Cuartil 3 (Q3)",
    "Rango intercuartílico (IQR)",
    "Asimetría de Pearson",
    "Curtosis"
  ),
  Valor = c(
    format(n, big.mark = ","),
    as.character(round(x_min, 4)),
    as.character(round(x_max, 4)),
    as.character(round(rango_val, 4)),
    as.character(round(media, 4)),
    as.character(round(mediana, 4)),
    as.character(moda_val),
    as.character(round(desv_std^2, 4)),
    as.character(round(desv_std, 4)),
    paste0(round(cv, 2), "%"),
    as.character(round(q1, 4)),
    as.character(round(q3, 4)),
    as.character(round(iqr_val, 4)),
    as.character(round(asimetria, 4)),
    as.character(round(curtosis_val, 4))
  ),
  stringsAsFactors = FALSE
)

indicadores %>%
  t() %>%
  as.data.frame() %>%
  setNames(indicadores$Indicador) %>%
  slice(-1) %>%
  gt() %>%
  tab_header(
    title    = md("**Tabla N°2: Indicadores Estadísticos**"),
    subtitle = md("*Variable Cuantitativa Continua Agrupada: Longitud*")
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "#2C2C2C"),
      cell_text(color = "white", weight = "bold")
    ),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", color = "#E0E0E0", weight = px(1)),
    locations = cells_body(rows = everything())
  ) %>%
  tab_source_note(source_note = md("*Autor: Leslye Quinchiguango*")) %>%
  tab_options(
    table.width                       = pct(100),
    heading.title.font.size           = px(15),
    heading.subtitle.font.size        = px(11),
    table.font.size                   = px(12),
    data_row.padding                  = px(4),
    column_labels.border.top.width    = px(2),
    column_labels.border.bottom.width = px(2),
    table_body.border.bottom.width    = px(2),
    table.border.top.style            = "hidden",
    table.border.bottom.style         = "hidden"
  )
Tabla N°2: Indicadores Estadísticos
Variable Cuantitativa Continua Agrupada: Longitud
Tamaño muestral (n) Mínimo Máximo Rango Media Mediana Moda Varianza (s²) Desviación estándar (s) Coef. de variación (CV%) Cuartil 1 (Q1) Cuartil 3 (Q3) Rango intercuartílico (IQR) Asimetría de Pearson Curtosis
68,003 -99.9999 -94.6108 5.3891 -97.825 -98.3966 -98.6526 2.3171 1.5222 1.56% -99.0392 -96.3175 2.7217 1.1266 1.8839
Autor: Leslye Quinchiguango

7. Conclusiones

El comportamiento y situación actual del análisis estadístico de los arrendamientos de petróleo y gas en Kansas, se explica a través de la variable Longitud. La variable fluctúa entre -99.9999° y -94.6108° (rango = 5.3891°) y sus valores varían en torno a -98.3966°, con una desviación estándar de 1.5222°, siendo un grupo de valores homogéneo (CV = 1.56%), sin presencia de valores atípicos. El conjunto de valores se concentra a la derecha (As = 1.13), con mayor concentración de arrendamientos en longitudes del sector oriental del estado. Por lo tanto, el comportamiento es favorable, ya que los arrendamientos presentan una distribución geográfica longitudinal consistente, lo que sugiere una ocupación uniforme del territorio en sentido este-oeste en el estado de Kansas.


Autor: Ariel Baldeon — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset