Longitud Base
Se importan las librerías necesarias y se carga la base original. Se selecciona la variable de interés y se convierte a formato numérico para su análisis.
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(gt)
library(e1071)
setwd("C:/Users/majke/Downloads/Proyecto Estadistica/RMARKDOWN")
Datos_Brutos <- read.csv("Pozos Brasil 2.csv", header = TRUE, sep = ";", dec = ".", fileEncoding = "LATIN1")
colnames(Datos_Brutos) <- trimws(colnames(Datos_Brutos))
Datos <- Datos_Brutos %>%
select(any_of(c("POCO", "LONGITUDE_BASE_DD"))) %>%
mutate(Variable_Analisis = as.numeric(gsub(",", ".", LONGITUDE_BASE_DD)))
Variable <- na.omit(Datos$Variable_Analisis)
Se determinan los parámetros estadísticos iniciales (rango, clases, amplitud) y se construyen los límites, marcas de clase y frecuencias absolutas, relativas y acumuladas.
N <- length(Variable)
min_val <- min(Variable)
max_val <- max(Variable)
Rango <- max_val - min_val
K <- floor(1 + 3.322 * log10(N))
Amplitud <- Rango / K
breaks_table <- seq(min_val, max_val, length.out = K + 1)
breaks_table[length(breaks_table)] <- max_val + 0.0001
lim_inf_table <- breaks_table[1:K]
lim_sup_table <- breaks_table[2:(K+1)]
MC <- (lim_inf_table + lim_sup_table) / 2
ni <- numeric(K)
for (i in 1:K) {
if (i < K) {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable < lim_sup_table[i]])
} else {
ni[i] <- length(Variable[Variable >= lim_inf_table[i] & Variable <= lim_sup_table[i]])
}
}
hi <- (ni / sum(ni)) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
TDF_Longitud <- data.frame(
Li = round(lim_inf_table, 4),
Ls = round(lim_sup_table, 4),
MC = round(MC, 4),
ni = ni,
hi = round(hi, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = round(Hi_asc, 2),
Hi_desc = round(Hi_desc, 2)
)
TDF_Longitud
## Li Ls MC ni hi Ni_asc Ni_desc Hi_asc Hi_desc
## 1 -73.3768 -70.8067 -72.0918 12 0.04 12 29575 0.04 100.00
## 2 -70.8067 -68.2367 -69.5217 9 0.03 21 29563 0.07 99.96
## 3 -68.2367 -65.6667 -66.9517 71 0.24 92 29554 0.31 99.93
## 4 -65.6667 -63.0966 -64.3816 281 0.95 373 29483 1.26 99.69
## 5 -63.0966 -60.5266 -61.8116 19 0.06 392 29202 1.33 98.74
## 6 -60.5266 -57.9565 -59.2416 136 0.46 528 29183 1.79 98.67
## 7 -57.9565 -55.3865 -56.6715 54 0.18 582 29047 1.97 98.21
## 8 -55.3865 -52.8165 -54.1015 31 0.10 613 28993 2.07 98.03
## 9 -52.8165 -50.2464 -51.5315 121 0.41 734 28962 2.48 97.93
## 10 -50.2464 -47.6764 -48.9614 128 0.43 862 28841 2.91 97.52
## 11 -47.6764 -45.1064 -46.3914 260 0.88 1122 28713 3.79 97.09
## 12 -45.1064 -42.5363 -43.8213 704 2.38 1826 28453 6.17 96.21
## 13 -42.5363 -39.9663 -41.2513 2812 9.51 4638 27749 15.68 93.83
## 14 -39.9663 -37.3962 -38.6813 11902 40.24 16540 24937 55.93 84.32
## 15 -37.3962 -34.8261 -36.1112 13035 44.07 29575 13035 100.00 44.07
Se organiza la tabla completa con los indicadores calculados y se presenta mediante una estructura formal en formato gt.
# Totales
totales <- c("TOTAL", "-", "-", sum(ni), round(sum(hi), 2), "-", "-", "-", "-")
TDF_Char <- TDF_Longitud %>% mutate(across(everything(), as.character))
TDF_Final <- rbind(TDF_Char, totales)
TDF_Final %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL**"),
subtitle = md("**Variable: LONGITUD BASE**")
) %>%
tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
cols_label(
Li = "Lim Inf",
Ls = "Lim Sup",
MC = "Marca Clase (Xi)",
ni = "ni",
hi = "hi (%)",
Ni_asc = "Ni (Asc)",
Ni_desc = "Ni (Desc)",
Hi_asc = "Hi (Asc)",
Hi_desc = "Hi (Desc)"
) %>%
cols_align(
align = "center",
columns = everything()
) %>%
tab_style(
style = list(
cell_fill(color = "#2E4053"),
cell_text(color = "white", weight = "bold")
),
locations = cells_title()
) %>%
tab_style(
style = list(
cell_fill(color = "#F2F3F4"),
cell_text(weight = "bold", color = "#2E4053")
),
locations = cells_column_labels()
) %>%
tab_options(
table.border.top.color = "#2E4053",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6)
)
| DISTRIBUCIÓN DE FRECUENCIAS DE POZOS PETROLEROS DE BRASIL | ||||||||
| Variable: LONGITUD BASE | ||||||||
| Lim Inf | Lim Sup | Marca Clase (Xi) | ni | hi (%) | Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) |
|---|---|---|---|---|---|---|---|---|
| -73.3768 | -70.8067 | -72.0918 | 12 | 0.04 | 12 | 29575 | 0.04 | 100 |
| -70.8067 | -68.2367 | -69.5217 | 9 | 0.03 | 21 | 29563 | 0.07 | 99.96 |
| -68.2367 | -65.6667 | -66.9517 | 71 | 0.24 | 92 | 29554 | 0.31 | 99.93 |
| -65.6667 | -63.0966 | -64.3816 | 281 | 0.95 | 373 | 29483 | 1.26 | 99.69 |
| -63.0966 | -60.5266 | -61.8116 | 19 | 0.06 | 392 | 29202 | 1.33 | 98.74 |
| -60.5266 | -57.9565 | -59.2416 | 136 | 0.46 | 528 | 29183 | 1.79 | 98.67 |
| -57.9565 | -55.3865 | -56.6715 | 54 | 0.18 | 582 | 29047 | 1.97 | 98.21 |
| -55.3865 | -52.8165 | -54.1015 | 31 | 0.1 | 613 | 28993 | 2.07 | 98.03 |
| -52.8165 | -50.2464 | -51.5315 | 121 | 0.41 | 734 | 28962 | 2.48 | 97.93 |
| -50.2464 | -47.6764 | -48.9614 | 128 | 0.43 | 862 | 28841 | 2.91 | 97.52 |
| -47.6764 | -45.1064 | -46.3914 | 260 | 0.88 | 1122 | 28713 | 3.79 | 97.09 |
| -45.1064 | -42.5363 | -43.8213 | 704 | 2.38 | 1826 | 28453 | 6.17 | 96.21 |
| -42.5363 | -39.9663 | -41.2513 | 2812 | 9.51 | 4638 | 27749 | 15.68 | 93.83 |
| -39.9663 | -37.3962 | -38.6813 | 11902 | 40.24 | 16540 | 24937 | 55.93 | 84.32 |
| -37.3962 | -34.8261 | -36.1112 | 13035 | 44.07 | 29575 | 13035 | 100 | 44.07 |
| TOTAL | - | - | 29575 | 100 | - | - | - | - |
| Fuente: Datos ANP 2018 | ||||||||
Se generan histogramas absolutos y globales para visualizar la distribución de la variable y la concentración de observaciones en cada intervalo.
col_gris_azulado <- "#5D6D7E"
col_ejes <- "#2E4053"
h_base <- hist(Variable, breaks = "Sturges", plot = FALSE)
# GRÁFICO 1: Histograma Absoluto (Local)
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica No.1: Distribución de Longitud Base",
xlab = "Longitud Base (°)",
ylab = "Frecuencia Absoluta",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
# GRÁFICO 2: Histograma Global
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica N°2: Distribución de Longitud Base",
xlab = "Longitud Base (°)",
ylab = "Total Pozos",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, sum(h_base$counts)))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
Se construyen histogramas en porcentaje para evidenciar la proporción de datos dentro de cada clase respecto al total.
h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
h_porc$density <- h_porc$counts
# GRÁFICO 3: Porcentajes (Local)
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica N°3: Distribución Porcentual de Longitud Base",
xlab = "Longitud Base (°)",
ylab = "Porcentaje (%)",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, max(h_porc$counts)*1.2))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
axis(2)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
# GRÁFICO 4: Global Porcentual
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica No.4: Distribución Porcentual de Longitud Base",
xlab = "Longitud Base (°)",
ylab = "% del Total",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, 100))
axis(1, at = round(h_base$breaks, 0), labels = format(round(h_base$breaks, 0), scientific = FALSE), las = 2, cex.axis = 0.7)
text(x = h_base$mids, y = h_porc$counts, label = paste0(round(h_porc$counts, 1), "%"), pos = 3, cex = 0.6, col = col_ejes)
axis(2)
abline(h=seq(0,100,20), col="#D7DBDD", lty="dotted")
# GRÁFICO 5: Boxplot
par(mar = c(5, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_gris_azulado,
main = "Gráfica No.5: Diagrama de Caja de Longitud Base (Boxplot)",
xlab = "Longitud Base (°)", outline = TRUE, outpch = 19, outcol = "#C0392B",
boxwex = 0.5, frame.plot = FALSE, xaxt = "n")
eje_x_detallado <- pretty(Variable, n = 20)
axis(1, at = eje_x_detallado, labels = format(eje_x_detallado, scientific = FALSE), cex.axis=0.7, las=2)
grid(nx=NULL, ny=NA, col="lightgray", lty="dotted")
Los numerosos valores atípicos observados no representan un error. La variable presenta una distribución altamente asimétrica, con la mayoría de observaciones concentradas cerca de –39 y una cola extensa hacia valores menores a –60. Este patrón genera múltiples puntos fuera del rango intercuartílico (Q1 – 1.5·IQR; Q3 + 1.5·IQR), los cuales el boxplot identifica correctamente como atípicos.
par(mar = c(5, 5, 4, 8), xpd = TRUE)
x_asc <- c(min(breaks_table), breaks_table[2:length(breaks_table)])
y_asc <- c(0, Ni_asc)
x_desc <- c(min(breaks_table), breaks_table[2:length(breaks_table)])
y_desc <- c(Ni_desc, 0)
x_range <- range(c(x_asc, x_desc))
y_range <- c(0, max(c(y_asc, y_desc)))
col_azul <- "#2E4053"
col_rojo <- "#C0392B"
plot(x_asc, y_asc, type = "o", col = col_azul, lwd=2, pch=19,
main = "Gráfica No.6: Ojivas Ascendente y Descendente de Longitud Base",
xlab = "Longitud Base (°)", ylab = "Frecuencia acumulada",
xlim = x_range, ylim = y_range, axes = FALSE, frame.plot = FALSE)
axis(1, at = round(breaks_table,0), labels = format(round(breaks_table,0), scientific = FALSE), las=2, cex.axis=0.6)
axis(2, at = pretty(y_asc), labels = format(pretty(y_asc), scientific = FALSE))
lines(x_asc, y_desc, type = "o", col = col_rojo, lwd=2, pch=19)
legend("right", legend = c("Ascendente", "Descendente"),
col = c(col_azul, col_rojo), lty = 1, pch = 19, cex = 0.7, lwd=2,
inset = c(-0.15, 0), bty="n")
grid()
Se calculan medidas de tendencia central, dispersión, forma y atipicidad, y se presentan en una tabla formal para sintetizar el comportamiento de la variable.
# CÁLCULO DE INDICADORES
media_val <- mean(Variable)
mediana_val <- median(Variable)
freq_max <- max(TDF_Longitud$ni)
modas_calc <- TDF_Longitud$MC[TDF_Longitud$ni == freq_max]
moda_txt <- paste(round(modas_calc, 2), collapse = ", ")
rango_txt <- paste0("[", round(min(Variable), 2), "; ", round(max(Variable), 2), "]")
varianza_val <- var(Variable)
sd_val <- sd(Variable)
cv_val <- (sd_val / abs(media_val)) * 100
asimetria_val <- skewness(Variable, type = 2)
curtosis_val <- kurtosis(Variable, type = 2)
vals_atipicos <- boxplot.stats(Variable)$out
num_atipicos <- length(vals_atipicos)
status_atipicos <- if(num_atipicos > 0) {
min_out <- min(vals_atipicos)
max_out <- max(vals_atipicos)
paste0(num_atipicos, " [", round(min_out, 2), "; ", round(max_out, 2), "]")
} else {
"0 (Sin atípicos)"
}
df_resumen <- data.frame(
"Variable" = "Longitud Base (°)",
"Rango" = rango_txt,
"Media" = media_val,
"Mediana" = mediana_val,
"Moda" = moda_txt,
"Varianza" = varianza_val,
"Desv_Std" = sd_val,
"CV_Porc" = cv_val,
"Asimetria" = asimetria_val,
"Curtosis" = curtosis_val,
"Atipicos" = status_atipicos
)
df_resumen %>%
gt() %>%
tab_header(
title = md("**CONCLUSIONES Y ESTADÍSTICOS**"),
subtitle = "Resumen de Indicadores de las Longitudes Base de los Pozos Petrolíferos en Brasil"
) %>%
tab_source_note(source_note = "Autor: Grupo 3") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
fmt_number(columns = c(Asimetria), decimals = 4) %>%
cols_label(
Variable = "Variable",
Rango = "Rango Total",
Media = "Media (X̄)",
Mediana = "Mediana (Me)",
Moda = "Moda (Mo)",
Varianza = "Varianza (S²)",
Desv_Std = "Desv. Est. (S)",
CV_Porc = "C.V. (%)",
Asimetria = "Asimetría (As)",
Curtosis = "Curtosis (K)",
Atipicos = "Outliers [Intervalo]"
) %>%
tab_options(
column_labels.background.color = "#2E4053",
table.border.top.color = "black",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(8)
) %>%
tab_style(
style = list(cell_text(weight = "bold", color = "white")),
locations = cells_column_labels()
)
| CONCLUSIONES Y ESTADÍSTICOS | ||||||||||
| Resumen de Indicadores de las Longitudes Base de los Pozos Petrolíferos en Brasil | ||||||||||
| Variable | Rango Total | Media (X̄) | Mediana (Me) | Moda (Mo) | Varianza (S²) | Desv. Est. (S) | C.V. (%) | Asimetría (As) | Curtosis (K) | Outliers [Intervalo] |
|---|---|---|---|---|---|---|---|---|---|---|
| Longitud Base (°) | [-73.38; -34.83] | −38.80 | −37.78 | -36.11 | 16.71 | 4.09 | 10.54 | −4.8053 | 26.63 | 1787 [-73.38; -42.67] |
| Autor: Grupo 3 | ||||||||||
La Longitud Base varía entre –73.38 y –34.83 grados, con una media de –38.80 y una desviación estándar de 4.09, lo que evidencia una variabilidad moderada y un comportamiento homogéneo (CV: 10.54%). La distribución muestra una fuerte asimetría negativa (–4.8053) y alta curtosis (26.63), junto con 1787 valores atípicos entre –73.38 y –42.67 grados. En conjunto, estos patrones indican una concentración marcada hacia los valores superiores y una cola pronunciada hacia los inferiores, lo que sugiere interpretar la variable con cautela.