1 Carga de Librerías

# Si no las tienes instaladas: install.packages(c("dplyr","gt"))
library(dplyr)
library(gt)

2 Carga de Datos

Datos <- read.csv("produccin-de-pozos-de-gas-y-petrleo-no-convencional.csv",
                   sep = ";", fileEncoding = "UTF-8", stringsAsFactors = FALSE)
str(Datos)
## 'data.frame':    400759 obs. of  40 variables:
##  $ idempresa             : chr  "YSUR" "YSUR" "YSUR" "YSUR" ...
##  $ anio                  : int  2018 2015 2017 2018 2015 2017 2018 2016 2017 2018 ...
##  $ mes                   : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ idpozo                : int  132771 131719 145330 132770 136137 131430 132769 135206 131429 132738 ...
##  $ prod_pet              : chr  "7.212" "5.240" "0.00" "3.322" ...
##  $ prod_gas              : chr  "510.173" "1.879.820" "0.00" "101.733" ...
##  $ prod_agua             : chr  "0.34" "1.590" "0.00" "14.2" ...
##  $ iny_agua              : chr  "0" "0.000" "0.00" "0" ...
##  $ iny_gas               : chr  "0" "0.000" "0.00" "0" ...
##  $ iny_co2               : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ iny_otro              : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ tef                   : chr  "30.15" "31.000" "0.00" "31" ...
##  $ vida_util             : chr  "" "" "" "" ...
##  $ tipoextraccion        : chr  "Surgencia Natural" "Surgencia Natural" "Sin Sistema de Extracción" "Surgencia Natural" ...
##  $ tipoestado            : chr  "Extracción Efectiva" "Extracción Efectiva" "En Estudio" "Extracción Efectiva" ...
##  $ tipopozo              : chr  "Gasífero" "Gasífero" "Otro tipo" "Gasífero" ...
##  $ observaciones         : chr  "" "" "" "" ...
##  $ fechaingreso          : chr  "2018-02-10 08:37:14.717426" "2015-02-26 13:35:35.533458" "2017-02-16 13:45:37.233373" "2018-02-10 08:37:14.717426" ...
##  $ rectificado           : chr  "f" "f" "f" "f" ...
##  $ habilitado            : chr  "t" "t" "t" "t" ...
##  $ idusuario             : int  444 5 444 444 5 444 444 5 444 444 ...
##  $ empresa               : chr  "YSUR ENERGÍA ARGENTINA S.R.L." "YSUR ENERGÍA ARGENTINA S.R.L." "YSUR ENERGÍA ARGENTINA S.R.L." "YSUR ENERGÍA ARGENTINA S.R.L." ...
##  $ sigla                 : chr  "APA.RN.EFO-126(d)" "AEA.NQ.Gu-1176d" "APA.Nq.Hua.x-1" "APA.RN.EFO-122(d)" ...
##  $ formprod              : chr  "LAJA" "PREC" "VMUT" "LAJA" ...
##  $ profundidad           : chr  "3820" "2592" "4100" "3814" ...
##  $ formacion             : chr  "lajas" "precuyo" "vaca muerta" "lajas" ...
##  $ idareapermisoconcesion: chr  "FEO" "NDD" "X009" "FEO" ...
##  $ areapermisoconcesion  : chr  "ESTACION FERNANDEZ ORO" "AL NORTE DE LA DORSAL" "HUACALERA" "ESTACION FERNANDEZ ORO" ...
##  $ idareayacimiento      : chr  "Z155" "GUA" "Y325" "Z155" ...
##  $ areayacimiento        : chr  "ESTACION FERNANDEZ ORO" "GUANACO" "HUACALERA" "ESTACION FERNANDEZ ORO" ...
##  $ cuenca                : chr  "NEUQUINA" "NEUQUINA" "NEUQUINA" "NEUQUINA" ...
##  $ provincia             : chr  "Rio Negro" "Neuquén" "Neuquén" "Rio Negro" ...
##  $ coordenadax           : chr  "-6.783.808.193" "-6.924.999.839" "-6.979.045.203" "-6.786.739.055" ...
##  $ coordenaday           : chr  "-3.901.910.996" "-3.886.503.323" "-3.820.704.866" "-3.900.716.726" ...
##  $ tipo_de_recurso       : chr  "NO CONVENCIONAL" "NO CONVENCIONAL" "NO CONVENCIONAL" "NO CONVENCIONAL" ...
##  $ proyecto              : chr  "GAS PLUS" "GAS PLUS" "Sin Proyecto" "GAS PLUS" ...
##  $ clasificacion         : chr  "EXPLOTACION" "EXPLOTACION" "EXPLORACION" "EXPLOTACION" ...
##  $ subclasificacion      : chr  "DESARROLLO" "DESARROLLO" "EXPLORACION" "DESARROLLO" ...
##  $ sub_tipo_recurso      : chr  "TIGHT" "TIGHT" "SHALE" "TIGHT" ...
##  $ fecha_data            : chr  "31/1/2018" "31/1/2015" "31/1/2017" "31/1/2018" ...

3 Extracción de la Variable

# Variable cuantitativa CONTINUA: producción de petróleo (m3)
# La columna viene como texto con formato numérico irregular (usa "." como
# separador de miles y también como decimal). Se limpia así: el último bloque
# tras el punto se toma como parte decimal, y todo lo anterior se concatena
# como parte entera.
limpiar_numero <- function(x) {
  x <- as.character(x)
  sapply(x, function(v) {
    if (is.na(v) || v == "") return(NA)
    partes <- strsplit(v, "\\.")[[1]]
    if (length(partes) == 1) return(as.numeric(partes[1]))
    entero  <- paste(partes[1:(length(partes) - 1)], collapse = "")
    decimal <- partes[length(partes)]
    as.numeric(paste0(entero, ".", decimal))
  }, USE.NAMES = FALSE)
}

ProdPet <- limpiar_numero(Datos$prod_pet)
ProdPet <- ProdPet[!is.na(ProdPet) & ProdPet > 0]

# Se filtran errores de carga extremos (mismo criterio que en el proyecto de
# regresión): se conservan los valores positivos hasta el percentil 99
p99 <- quantile(ProdPet, 0.99)
ProdPet <- ProdPet[ProdPet <= p99]

4 Conteo

n <- length(ProdPet)
n
## [1] 255679
summary(ProdPet)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   14.16   85.69  957.20 1179.14 9406.38
# --- Regla de Sturges ---
k_sturges <- 1 + 3.322 * log10(n)
k <- round(k_sturges)
amplitud <- (max(ProdPet) - min(ProdPet)) / k
cat("Numero de clases (Sturges): k =", round(k_sturges, 2), "-> se usan", k, "clases\n")
## Numero de clases (Sturges): k = 18.96 -> se usan 19 clases
cat("Amplitud de clase:", round(amplitud, 2), "\n")
## Amplitud de clase: 495.07

5 Tabla de Frecuencia

# Tabla de clases simplificada, generada directamente en R con cut()
# Se definen los cortes manualmente (redondeados, sin notación científica)
minv <- floor(min(ProdPet))
maxv <- ceiling(max(ProdPet))
cortes <- round(seq(minv, maxv, length.out = k + 1), 1)
cortes[1] <- minv          # se evita cualquier extensión negativa
cortes[length(cortes)] <- maxv

Clases <- cut(ProdPet, breaks = cortes, include.lowest = TRUE, right = FALSE, dig.lab = 10)
TDF_pet <- table(Clases)

# Punto medio de cada clase (para usar como etiqueta simple y derecha en las gráficas)
limites <- gsub("\\[|\\]|\\(|\\)", "", names(TDF_pet))
limites <- strsplit(limites, ",")
puntos_medios <- sapply(limites, function(x) round(mean(as.numeric(x)), 1))

tabla_pet <- as.data.frame(TDF_pet)
colnames(tabla_pet)[1] <- "Clase"

tabla_resumen <- tabla_pet %>%
  rename(ni = Freq) %>%
  mutate(`hi (%)` = round(ni / sum(ni) * 100, 2))

#### Fila de totales ####
totales <- data.frame(Clase = "TOTAL",
                       ni = sum(tabla_resumen$ni),
                       `hi (%)` = sum(tabla_resumen$`hi (%)`),
                       check.names = FALSE)
tabla_final <- rbind(data.frame(lapply(tabla_resumen, as.character), check.names = FALSE), totales)

tabla_final_gt <- tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1 de Distribución de Frecuencias de Producción de Petróleo**")
  ) %>%
  tab_source_note(source_note = "Autor: Mayerli Nazareno") %>%
  cols_label(
    Clase = "Clase (m3)",
    ni = "Frecuencia (ni)",
    `hi (%)` = "Porcentaje (hi%)"
  ) %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )

tabla_final_gt
Tabla N°1 de Distribución de Frecuencias de Producción de Petróleo
Clase (m3) Frecuencia (ni) Porcentaje (hi%)
[0,495.1) 167483 65.51
[495.1,990.2) 17058 6.67
[990.2,1485.3) 16948 6.63
[1485.3,1980.4) 11878 4.65
[1980.4,2475.5) 8514 3.33
[2475.5,2970.6) 6446 2.52
[2970.6,3465.7) 4824 1.89
[3465.7,3960.8) 3762 1.47
[3960.8,4455.9) 3108 1.22
[4455.9,4951.1) 2660 1.04
[4951.1,5446.2) 2329 0.91
[5446.2,5941.3) 2020 0.79
[5941.3,6436.4) 1751 0.68
[6436.4,6931.5) 1421 0.56
[6931.5,7426.6) 1335 0.52
[7426.6,7921.7) 1141 0.45
[7921.7,8416.8) 1023 0.4
[8416.8,8911.9) 1012 0.4
[8911.9,9407] 966 0.38
TOTAL 255679 100.02
Autor: Mayerli Nazareno

6 Gráficas

6.1 Diagramas de Barras de Cantidad

par(mar = c(7, 6, 4, 2))
barplot(TDF_pet,
        main = "", xlab = "", ylab = "",
        col = "darkorange", las = 1, cex.names = 0.7,
        names.arg = puntos_medios)
mtext("Cantidad de Pozos", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Producción de Petróleo (m3) - punto medio de clase", side = 1, line = 5)
mtext("Gráfica N°1: Cantidad de Pozos por Clase de Producción de Petróleo",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

6.2 Diagramas de Barras Porcentual

hi_valores <- as.numeric(tabla_resumen$`hi (%)`)
par(mar = c(7, 6, 4, 2))
bp <- barplot(hi_valores,
              main = "", xlab = "", ylab = "",
              col = "darkorange",
              ylim = c(0, max(hi_valores) * 1.3),
              names.arg = puntos_medios,
              las = 1, cex.names = 0.7)
mtext("Porcentaje %", side = 2, line = 4.5, cex = 1, font = 1)
mtext("Producción de Petróleo (m3) - punto medio de clase", side = 1, line = 5)
mtext("Gráfica N°2: Distribución Porcentual por Clase de Producción de Petróleo",
      side = 3, line = 2, adj = 0.5, cex = 0.85, font = 2)

6.3 Diagrama de Cajas (Boxplot)

par(mar = c(4, 6, 4, 2))
boxplot(ProdPet,
        main = "", ylab = "Producción de Petróleo (m3)",
        col = "lightgreen")
mtext("Gráfica N°3: Diagrama de Caja de Producción de Petróleo",
      side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)

6.4 Ojiva

Fi <- cumsum(as.numeric(TDF_pet))
limites_sup <- sapply(limites, function(x) as.numeric(x[2]))
par(mar = c(5, 6, 4, 2))
plot(limites_sup, Fi, type = "o", pch = 19, col = "purple",
     main = "", xlab = "Producción de Petróleo (m3)", ylab = "Frecuencia Acumulada (Fi)")
mtext("Gráfica N°4: Ojiva - Frecuencia Acumulada de Producción de Petróleo",
      side = 3, line = 2, adj = 0.5, cex = 0.9, font = 2)

7 Indicadores Estadísticos

media_pet   <- mean(ProdPet)
mediana_pet <- median(ProdPet)
sd_pet      <- sd(ProdPet)
min_pet     <- min(ProdPet)
max_pet     <- max(ProdPet)
cv_pet      <- sd_pet / media_pet * 100

# Para una variable continua agrupada, la "moda" se reporta como la clase modal
clase_modal <- names(TDF_pet)[which.max(TDF_pet)]

skewness <- function(x) {
  n <- length(x)
  (sum((x - mean(x))^3) / n) / (sd(x)^3)
}
kurtosis <- function(x) {
  n <- length(x)
  m4 <- sum((x - mean(x))^4) / n
  m2 <- sum((x - mean(x))^2) / n
  m4 / m2^2 - 3
}
as_pet <- skewness(ProdPet)
k_pet  <- kurtosis(ProdPet)

bp_stats   <- boxplot.stats(ProdPet)
atipicos   <- bp_stats$out
n_atipicos <- length(atipicos)

tabla_indicadores <- data.frame(
  "Variable"        = "Producción de Petróleo",
  "Rango"           = paste(round(min_pet, 2), "-", round(max_pet, 2), "m3"),
  "Media (Mx)"      = round(media_pet, 2),
  "Mediana (Me)"    = round(mediana_pet, 2),
  "Moda (Mo)"       = clase_modal,
  "Varianza (V)"    = round(sd_pet^2, 2),
  "Desv. Est. (Sd)" = round(sd_pet, 2),
  "C.V. (%)"        = round(cv_pet, 2),
  "Asimetria (As)"  = round(as_pet, 3),
  "Curtosis (K)"    = round(k_pet, 3),
  check.names = FALSE
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2 de Indicadores de Producción de Petróleo**")
  ) %>%
  tab_source_note(source_note = "Autor: Mayerli Nazareno") %>%
  tab_options(
    heading.title.font.size = px(16),
    column_labels.background.color = "#F0F0F0"
  )

tabla_indicadores_gt
Tabla N°2 de Indicadores de Producción de Petróleo
Variable Rango Media (Mx) Mediana (Me) Moda (Mo) Varianza (V) Desv. Est. (Sd) C.V. (%) Asimetria (As) Curtosis (K)
Producción de Petróleo 0 - 9406.38 m3 957.2 85.69 [0,495.1) 2982913 1727.11 180.43 2.486 6.265
Autor: Mayerli Nazareno

8 Conclusiones

tendencia    <- if (abs(media_pet - mediana_pet) / mediana_pet > 0.05) "mediana" else "media"
valor_tend   <- if (tendencia == "media") round(media_pet, 2) else round(mediana_pet, 2)
homogeneidad <- if (cv_pet <= 33) "homogéneo" else "heterogéneo"
agrupamiento <- if (abs(as_pet) < 0.5) "débilmente" else if (abs(as_pet) < 1) "medianamente" else "fuertemente"
zona         <- if (as_pet > 0.5) "baja" else if (as_pet < -0.5) "alta" else "media"
atipicos_txt <- if (n_atipicos == 0) "sin valores atípicos" else
  paste0("con ", n_atipicos, " valores atípicos (por ejemplo: ",
         paste(round(head(sort(atipicos, decreasing = TRUE), 3), 1), collapse = ", "), " ...)")

cat(paste0(
  "Los valores de producción de petróleo fluctúan entre ", round(min_pet, 2), " y ", round(max_pet, 2),
  " m3 y giran en torno a la ", tendencia, " (", valor_tend, " m3), ",
  "con una desviación estándar de ", round(sd_pet, 2), " m3, ",
  atipicos_txt, ", siendo un conjunto de datos **", homogeneidad, "**, ",
  "cuyos valores se agrupan ", agrupamiento, " en la parte ", zona, " de producción de petróleo. ",
  "Por lo anterior, el comportamiento es *[defina 'beneficioso' o 'perjudicial' según el ",
  "contexto: una alta producción de petróleo suele interpretarse como beneficiosa para ",
  "la rentabilidad del yacimiento]*."
))

Los valores de producción de petróleo fluctúan entre 0 y 9406.38 m3 y giran en torno a la mediana (85.69 m3), con una desviación estándar de 1727.11 m3, con 27840 valores atípicos (por ejemplo: 9406.4, 9404.6, 9404.4 …), siendo un conjunto de datos heterogéneo, cuyos valores se agrupan fuertemente en la parte baja de producción de petróleo. Por lo anterior, el comportamiento es [defina ‘beneficioso’ o ‘perjudicial’ según el contexto: una alta producción de petróleo suele interpretarse como beneficiosa para la rentabilidad del yacimiento].