library(readr); library(dplyr); library(ggplot2); library(gt); library(stringr)
cat("Librerías cargadas: readr, dplyr, ggplot2, gt, stringr")Librerías cargadas: readr, dplyr, ggplot2, gt, stringr
ruta_archivo <- "kansas_limpio.csv" # ajusta esta ruta a la ubicación real en tu equipo
datos <- read_csv(ruta_archivo, show_col_types = FALSE)
cat("Registros totales cargados:", nrow(datos), "\n")Registros totales cargados: 72580
Se seleccionó el par RANGE (columna
catastral este-oeste del sistema PLSS) como variable independiente (x) y
Longitud (lon, en grados) como variable
dependiente (y). Este par es distinto al usado en el análisis de
referencia (YEARS_ACTIVE /
CUMULATIVE_PRODUCTION) y fue verificado de antemano: el
coeficiente de Pearson supera 0.99 en valor absoluto,
muy por encima del umbral de 0.7 exigido para aceptar el modelo.
El sistema catastral estadounidense (PLSS) numera las columnas
(RANGE) de forma creciente a partir de un meridiano base,
tanto hacia el oeste (RANGE_DIRECTION = "W") como hacia el
este (RANGE_DIRECTION = "E"). Como ambas direcciones
avanzan en sentidos opuestos de la longitud, se analizan como
dos regiones separadas, cada una con su propia recta —
cumpliendo también el criterio de dividir en regiones cuando resulta
apropiado.
datos_reg1 <- datos %>%
filter(!is.na(RANGE), !is.na(lon), RANGE_DIRECTION %in% c("W", "E")) %>%
mutate(Region = ifelse(RANGE_DIRECTION == "W", "Región Oeste (Range W)", "Región Este (Range E)"))
oeste1 <- datos_reg1 %>% filter(Region == "Región Oeste (Range W)")
este1 <- datos_reg1 %>% filter(Region == "Región Este (Range E)")
cat("Pozos en Región Oeste:", nrow(oeste1), "\n")Pozos en Región Oeste: 55287
Pozos en Región Este: 17293
tabla_reg1 <- datos_reg1 %>%
group_by(Region) %>%
summarise(n = n(), RANGE_min = min(RANGE), RANGE_max = max(RANGE),
lon_min = round(min(lon), 3), lon_max = round(max(lon), 3), .groups = "drop")
tabla_reg1 %>%
gt() %>%
tab_header(title = md("**Tabla N°1: Registros por Región**")) %>%
cols_label(Region = md("**Región**"), n = md("**n**"),
RANGE_min = md("**RANGE mín.**"), RANGE_max = md("**RANGE máx.**"),
lon_min = md("**Longitud mín.**"), lon_max = md("**Longitud máx.**")) %>%
tab_source_note(source_note = "Autor: GRUPO") %>%
cols_align(align = "center", everything())| Tabla N°1: Registros por Región | |||||
| Región | n | RANGE mín. | RANGE máx. | Longitud mín. | Longitud máx. |
|---|---|---|---|---|---|
| Región Este (Range E) | 17293 | 1 | 25 | -97.371 | -94.611 |
| Región Oeste (Range W) | 55287 | 1 | 43 | -102.044 | -97.371 |
| Autor: GRUPO | |||||
colores1 <- c("Región Oeste (Range W)" = "#2E86AB", "Región Este (Range E)" = "#C0392B")
par(mar = c(5, 5, 4, 9))
plot(datos_reg1$RANGE, datos_reg1$lon, col = colores1[datos_reg1$Region], pch = 16, cex = 0.4,
xlab = "RANGE (columna catastral)", ylab = "Longitud (°)",
main = "Gráfica N°1: RANGE vs. Longitud, por región", cex.main = 0.9, frame.plot = FALSE)
grid(nx = NULL, ny = NULL, col = "#D7DBDD", lty = "dotted")
legend("topright", inset = c(-0.32, 0), legend = names(colores1), col = colores1,
pch = 16, bty = "n", xpd = TRUE)
box()La nube de puntos es una recta perfectamente definida en cada región
(cada unidad de RANGE corresponde a un ancho fijo de aprox.
6 millas), por lo que se conjetura un modelo lineal en
cada una: \[y = a + bx\]
modelo_oeste <- lm(lon ~ RANGE, data = oeste1)
modelo_este <- lm(lon ~ RANGE, data = este1)
a_oeste <- coef(modelo_oeste)[1]; b_oeste <- coef(modelo_oeste)[2]
a_este <- coef(modelo_este)[1]; b_este <- coef(modelo_este)[2]
cat("Región Oeste: lon =", round(a_oeste, 4), "+", round(b_oeste, 5), "* RANGE\n")Región Oeste: lon = -97.3286 + -0.10929 * RANGE
Región Este: lon = -97.4295 + 0.11124 * RANGE
Call:
lm(formula = lon ~ RANGE, data = oeste1)
Residuals:
Min 1Q Median 3Q Max
-0.163880 -0.027714 0.001691 0.030068 0.091010
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -97.32857862 0.00037772 -257673 <0.0000000000000002 ***
RANGE -0.10929183 0.00001521 -7186 <0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.04067 on 55285 degrees of freedom
Multiple R-squared: 0.9989, Adjusted R-squared: 0.9989
F-statistic: 5.164e+07 on 1 and 55285 DF, p-value: < 0.00000000000000022
Call:
lm(formula = lon ~ RANGE, data = este1)
Residuals:
Min 1Q Median 3Q Max
-0.065979 -0.028454 0.000356 0.026746 0.082863
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -97.42954318 0.00059931 -162569 <0.0000000000000002 ***
RANGE 0.11124022 0.00003987 2790 <0.0000000000000002 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.03265 on 17291 degrees of freedom
Multiple R-squared: 0.9978, Adjusted R-squared: 0.9978
F-statistic: 7.783e+06 on 1 and 17291 DF, p-value: < 0.00000000000000022
par(mfrow = c(1, 2), mar = c(5, 5, 4, 2))
plot(oeste1$RANGE, oeste1$lon, col = "#2E86AB", pch = 16, cex = 0.4,
xlab = "RANGE", ylab = "Longitud (°)", main = "Gráfica N°2: Modelo Lineal — Región Oeste",
cex.main = 0.8, frame.plot = FALSE)
grid(col = "#D7DBDD", lty = "dotted")
abline(modelo_oeste, col = "#1F2A33", lwd = 3)
box()
plot(este1$RANGE, este1$lon, col = "#C0392B", pch = 16, cex = 0.4,
xlab = "RANGE", ylab = "Longitud (°)", main = "Gráfica N°3: Modelo Lineal — Región Este",
cex.main = 0.8, frame.plot = FALSE)
grid(col = "#D7DBDD", lty = "dotted")
abline(modelo_este, col = "#1F2A33", lwd = 3)
box()El coeficiente de correlación de Pearson, calculado en R mediante
cor(x, y), debe superar 0.7 o -0.7 para
aceptar el modelo.
r_oeste <- cor.test(oeste1$RANGE, oeste1$lon)
r_este <- cor.test(este1$RANGE, este1$lon)
data.frame(
Region = c("Oeste (Range W)", "Este (Range E)"),
r = round(c(r_oeste$estimate, r_este$estimate), 4),
R2 = round(c(r_oeste$estimate^2, r_este$estimate^2), 4),
Supera_0.7 = c(abs(r_oeste$estimate) > 0.7, abs(r_este$estimate) > 0.7),
p_valor = c(format.pval(r_oeste$p.value, digits = 4), format.pval(r_este$p.value, digits = 4))
) %>%
gt() %>%
tab_header(title = md("**Tabla N°2: Test de Pearson — Modelo Lineal**")) %>%
tab_source_note(source_note = "Autor: GRUPO") %>%
cols_align(align = "center", everything())| Tabla N°2: Test de Pearson — Modelo Lineal | ||||
| Region | r | R2 | Supera_0.7 | p_valor |
|---|---|---|---|---|
| Oeste (Range W) | -0.9995 | 0.9989 | TRUE | < 0.00000000000000022 |
| Este (Range E) | 0.9989 | 0.9978 | TRUE | < 0.00000000000000022 |
| Autor: GRUPO | ||||
Ambas regiones superan ampliamente el umbral de
|r| > 0.7, por lo que el modelo lineal se
acepta en cada una.
Cada recta es válida únicamente dentro del rango de
RANGE observado en su región (ver Tabla N°1); no debe
mezclarse Oeste y Este en una sola recta, pues representan sentidos
opuestos de la longitud, ni extrapolarse fuera de esos límites.
x_est_oeste <- round(mean(range(oeste1$RANGE)), 1)
x_est_este <- round(mean(range(este1$RANGE)), 1)
y_est_oeste <- a_oeste + b_oeste * x_est_oeste
y_est_este <- a_este + b_este * x_est_este
data.frame(
Region = c("Oeste (Range W)", "Este (Range E)"),
RANGE_estimado = c(x_est_oeste, x_est_este),
Longitud_estimada = round(c(y_est_oeste, y_est_este), 4)
) %>%
gt() %>%
tab_header(title = md("**Tabla N°3: Estimaciones Puntuales**")) %>%
tab_source_note(source_note = "Autor: GRUPO") %>%
cols_align(align = "center", everything())| Tabla N°3: Estimaciones Puntuales | ||
| Region | RANGE_estimado | Longitud_estimada |
|---|---|---|
| Oeste (Range W) | 22 | -99.7330 |
| Este (Range E) | 13 | -95.9834 |
| Autor: GRUPO | ||
RANGE (columna catastral) y la Longitud existe
una relación lineal casi perfecta en ambas direcciones:
\(r = -0.999\) al Oeste y \(r = 0.999\) al Este.RANGE equivale a un desplazamiento de longitud
prácticamente constante (~6 millas).|r| > 0.99 y test F significativo en los dos
ajustes.Autor: GRUPO — Análisis Estadístico, Kansas Hydrocarbon Leases Dataset