knitr::opts_chunk$set(echo = TRUE)
setwd("C:/Users/LEO/Documents/ESTA")
Datos <- read.csv("tabela_de_pocos_janeiro_2018.csv", header = TRUE, sep = ";" , dec = ".", fileEncoding = "Latin1")
El presente informe estadístico analiza la variable Cota Altimétrica de pozos petroleros de Brasil.
library(readxl)
library(dplyr)
library(gt)
library(e1071)
# Carga de datos
Datos_Brutos <- read_xlsx("C:/Users/LEO/Documents/ESTA/tabela_de_pocos_janeiro_2018.xlsx", sheet = 1)
colnames(Datos_Brutos) <- trimws(colnames(Datos_Brutos))
# Selección y cambio de la variable LONGITUDE_BASE_DD renombrada como lon_base_gd
Datos <- Datos_Brutos %>%
select(any_of(c("POCO", "LONGITUDE_BASE_DD"))) %>%
mutate(lon_base_gd = as.numeric(gsub(",", ".", as.character(LONGITUDE_BASE_DD))))
Variable <- na.omit(Datos$lon_base_gd)
# Filtro para valores razonables de longitud en el territorio de Brasil (entre -75 y -30 grados)
Variable <- Variable[Variable >= -75 & Variable <= -30]
if(length(Variable) == 0) {
stop("ERROR: No hay datos válidos para la variable seleccionada.")
}
# 2. CÁLCULOS MATEMÁTICOS PARA LA TABLA
N <- length(Variable)
K <- floor(1 + 3.322 * log10(N))
breaks_table <- seq(min(Variable), max(Variable), length.out = K + 1)
# Cálculo de ni usando cut
ni <- as.vector(table(cut(Variable, breaks = breaks_table, include.lowest = TRUE, right = FALSE)))
# Cálculo de vectores estadísticos (Mantenemos los valores reales sin redondear para la tabla)
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)))
# Creación de la Tabla de Distribución de Frecuencias (TDF)
TDF_Longitud <- data.frame(
Li = round(breaks_table[1:K], 2),
Ls = round(breaks_table[2:(K+1)], 2),
MC = round((breaks_table[1:K] + breaks_table[2:(K+1)]) / 2, 2),
ni = ni,
hi = hi,
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc = Hi_asc,
Hi_desc = Hi_desc
)
col_gris_azulado <- "#5D6D7E"
col_ejes <- "#2E4053"
# Configuración de los breaks automáticos e histograma base
breaks_auto <- seq(min(Variable), max(Variable), length.out = K + 1)
h_base <- hist(Variable, breaks = breaks_auto, plot = FALSE)
limite_x <- c(min(breaks_auto), max(breaks_auto))
Tabla de distribución de frecuencias para la Cota Altimétrica.
TDF_Longitud %>%
gt(rowname_col = "Li") %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS: LONGITUD BASE**"),
subtitle = md("Variable: **lon_base_gd**")
) %>%
tab_source_note(source_note = "Fuente: Datos ANP 2018") %>%
grand_summary_rows(
columns = c(ni, hi),
fns = list("TOTAL" = ~sum(., na.rm = TRUE))
) %>%
# Formateamos números enteros
fmt_number(
columns = c(ni, Ni_asc, Ni_desc),
decimals = 0,
use_seps = TRUE
) %>%
# Formateamos los porcentajes a 2 decimales
fmt_number(
columns = c(hi, Hi_asc, Hi_desc),
decimals = 2
) %>%
cols_label(
Ls = "Lím. 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)"
) %>%
tab_stubhead(label = "Lím. Inf") %>%
# Alineación de datos al centro
cols_align(align = "center", columns = everything()) %>%
# Alineación del Stub (Lím. Inf y la palabra TOTAL) al centro
tab_style(
style = cell_text(align = "center"),
locations = cells_stub()
) %>%
# Estética de los encabezados (Azul oscuro / Verde petróleo con texto blanco)
tab_style(
style = list(cell_fill(color = "#1F4E5B"), cell_text(color = "white", weight = "bold")),
locations = list(cells_title(), cells_column_labels(), cells_stubhead())
) %>%
tab_options(
table.border.top.style = "none",
table.border.bottom.color = "#2E4053",
column_labels.border.bottom.color = "#2E4053",
data_row.padding = px(6)
)
| DISTRIBUCIÓN DE FRECUENCIAS: LONGITUD BASE | ||||||||
| Variable: lon_base_gd | ||||||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) | Ni (Asc) | Ni (Desc) | Hi (Asc) | Hi (Desc) |
|---|---|---|---|---|---|---|---|---|
| -73.38 | -70.81 | -72.09 | 12 | 0.04 | 12 | 29,575 | 0.04 | 100.00 |
| -70.81 | -68.24 | -69.52 | 9 | 0.03 | 21 | 29,563 | 0.07 | 99.96 |
| -68.24 | -65.67 | -66.95 | 71 | 0.24 | 92 | 29,554 | 0.31 | 99.93 |
| -65.67 | -63.10 | -64.38 | 281 | 0.95 | 373 | 29,483 | 1.26 | 99.69 |
| -63.10 | -60.53 | -61.81 | 19 | 0.06 | 392 | 29,202 | 1.33 | 98.74 |
| -60.53 | -57.96 | -59.24 | 136 | 0.46 | 528 | 29,183 | 1.79 | 98.67 |
| -57.96 | -55.39 | -56.67 | 54 | 0.18 | 582 | 29,047 | 1.97 | 98.21 |
| -55.39 | -52.82 | -54.10 | 31 | 0.10 | 613 | 28,993 | 2.07 | 98.03 |
| -52.82 | -50.25 | -51.53 | 121 | 0.41 | 734 | 28,962 | 2.48 | 97.93 |
| -50.25 | -47.68 | -48.96 | 128 | 0.43 | 862 | 28,841 | 2.91 | 97.52 |
| -47.68 | -45.11 | -46.39 | 260 | 0.88 | 1,122 | 28,713 | 3.79 | 97.09 |
| -45.11 | -42.54 | -43.82 | 704 | 2.38 | 1,826 | 28,453 | 6.17 | 96.21 |
| -42.54 | -39.97 | -41.25 | 2,812 | 9.51 | 4,638 | 27,749 | 15.68 | 93.83 |
| -39.97 | -37.40 | -38.68 | 11,902 | 40.24 | 16,540 | 24,937 | 55.93 | 84.32 |
| -37.40 | -34.83 | -36.11 | 13,035 | 44.07 | 29,575 | 13,035 | 100.00 | 44.07 |
| TOTAL | — | — | 29575 | 100 | — | — | — | — |
| Fuente: Datos ANP 2018 | ||||||||
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica No.1: Distribución de lon_base_gd de Pozos Petroleros de Brasil",
xlab = "Longitud Base - lon_base_gd (Grados)", ylab = "Frecuencia Absoluta",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1),
xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
par(mar = c(8, 5, 4, 2))
plot(h_base,
main = "Gráfica N°2: Distribución de lon_base_gd de Pozos Petroleros de Brasil",
xlab = "Longitud Base - lon_base_gd (Grados)", ylab = "Total Pozos",
col = col_gris_azulado, border = "white", axes = FALSE,
ylim = c(0, sum(h_base$counts)),
xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
axis(2)
grid(nx = NA, ny = NULL, col = "#D7DBDD", lty = "dotted")
h_porc <- h_base
h_porc$counts <- (h_porc$counts / sum(h_porc$counts)) * 100
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica N°3: Distribución Porcentual de lon_base_gd de Pozos Petroleros de Brasil",
xlab = "Longitud Base - lon_base_gd (Grados)", ylab = "Porcentaje (%)",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, max(h_porc$counts)*1.2),
xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), 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)
par(mar = c(8, 5, 4, 2))
plot(h_porc,
main = "Gráfica No.4: Distribución Porcentual de lon_base_gd de Pozos Petroleros de Brasil",
xlab = "Longitud Base - lon_base_gd (Grados)", ylab = "% del Total",
col = col_gris_azulado, border = "white", axes = FALSE, freq = TRUE,
ylim = c(0, 100),
xlim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), 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)
col_acento <- "#C0392B"
par(mar = c(8, 5, 4, 2))
boxplot(Variable, horizontal = TRUE, col = col_gris_azulado,
main = "Gráfica No.5: Diagrama de Caja (lon_base_gd)",
xlab = "Longitud Base - lon_base_gd (Grados)", outline = TRUE, outpch = 19,
outcol = col_acento, axes = FALSE, xlim = c(0.7, 1.3),
ylim = limite_x)
axis(1, at = round(seq(limite_x[1], limite_x[2], length.out = 10), 2), las = 2, cex.axis = 0.7)
box()
col_azul_oscuro <- "#2E4053"
col_rojo_fuerte <- "#C0392B"
par(mar = c(8, 5, 4, 8), xpd = TRUE)
x_vals_ojiva <- breaks_table
plot(x_vals_ojiva, c(0, Ni_asc), type = "o", col = col_azul_oscuro,
lwd=2, pch=19, axes=F,
main = "Gráfica No.6: Ojivas Ascendente y Descendente (lon_base_gd)",
xlab = "Longitud Base - lon_base_gd (Grados)", ylab = "Frecuencia acumulada")
lines(x_vals_ojiva, c(Ni_desc, 0), type = "o", col = col_rojo_fuerte,
lwd=2, pch=19)
axis(1, at = round(seq(min(breaks_table), max(breaks_table), length.out = 10), 2), las = 2, cex.axis = 0.6)
axis(2)
legend("right", legend = c("Ascendente", "Descendente"),
col = c(col_azul_oscuro, col_rojo_fuerte),
lty = 1, pch = 19, cex = 0.7, lwd=2,
inset = c(-0.15, 0), bty="n")
grid()
media_val <- mean(Variable)
mediana_val <- median(Variable)
sd_val <- sd(Variable)
status_atipicos <- if(length(boxplot.stats(Variable)$out) > 0) {
paste0(length(boxplot.stats(Variable)$out), " [", round(min(boxplot.stats(Variable)$out), 2), "; ", round(max(boxplot.stats(Variable)$out), 2), "]")
} else { "0 (Sin atípicos)" }
df_resumen <- data.frame(
Variable = "lon_base_gd",
Rango = paste0("[", round(min(Variable), 2), " ; ", round(max(Variable), 2), "]"),
Media = media_val,
Mediana = mediana_val,
Moda = paste(round(TDF_Longitud$MC[TDF_Longitud$hi == max(TDF_Longitud$hi)], 2), collapse = ", "),
Varianza = var(Variable),
Desv_Std = sd_val,
CV_Porc = (sd_val / abs(media_val)) * 100,
Asimetria = skewness(Variable, type = 2),
Curtosis = kurtosis(Variable, type = 2),
Atipicos = status_atipicos
)
df_resumen %>%
gt() %>%
tab_header(title = md("**CONCLUSIONES Y ESTADÍSTICOS**"), subtitle = "Variable: lon_base_gd") %>%
fmt_number(columns = c(Media, Mediana, Varianza, Desv_Std, CV_Porc, Curtosis), decimals = 2) %>%
fmt_number(columns = Asimetria, decimals = 4) %>%
cols_width(
Variable ~ px(140),
Rango ~ px(120),
Moda ~ px(100),
Atipicos ~ px(220),
everything() ~ px(85)
) %>%
tab_options(column_labels.background.color = "#2E4053") %>%
tab_style(style = list(cell_text(weight = "bold", color = "white")), locations = cells_column_labels())
| CONCLUSIONES Y ESTADÍSTICOS | ||||||||||
| Variable: lon_base_gd | ||||||||||
| Variable | Rango | Media | Mediana | Moda | Varianza | Desv_Std | CV_Porc | Asimetria | Curtosis | Atipicos |
|---|---|---|---|---|---|---|---|---|---|---|
| lon_base_gd | [-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] |
min_txt <- format(min(Variable), scientific = FALSE)
max_txt <- format(max(Variable), scientific = FALSE)
asimetria_val <- skewness(Variable, type = 2)
centro_valor <- format(round(if(abs(asimetria_val) > 0.5) median(Variable) else mean(Variable), 2), scientific = FALSE)
cv_calc <- (sd(Variable) / abs(mean(Variable))) * 100
tipo_homogeneidad <- if(cv_calc > 30) "heterogénea" else "homogénea"
donde_se_concentra <- if(asimetria_val > 0) "valores bajos" else "valores altos"
juicio_operativo <- if(median(Variable) > 500) "aguas profundas / ultraprofundas" else "aguas someras"
cat(paste0(
"## Análisis de lon_base_gd\n\n",
"La variable **lon_base_gd** oscila entre **", min_txt, "** y **", max_txt, "** metros. ",
"El centro de la distribución se localiza en **", centro_valor, "** metros. ",
"La muestra se define como una variable **", tipo_homogeneidad, "** (CV: ", round(cv_calc, 2), "%), ",
"presentando una mayor densidad en los **", donde_se_concentra, "** de la escala. ",
"Desde el punto de vista de ingeniería, estos valores se consideran **", juicio_operativo, "** para el diseño de los sistemas de producción submarinos."
))
La variable lon_base_gd oscila entre -73.37677 y -34.82621 metros. El centro de la distribución se localiza en -37.78 metros. La muestra se define como una variable homogénea (CV: 10.54%), presentando una mayor densidad en los valores altos de la escala. Desde el punto de vista de ingeniería, estos valores se consideran aguas someras para el diseño de los sistemas de producción submarinos.