setwd("/cloud/project/PROYECTO/DATOS")
datos<-read.csv("petro.csv",
                header= TRUE, sep= ",", dec=".")
setwd("/cloud/project/PROYECTO/DATOS/")
datos2<-read.csv("DISCRETAS.csv",
                header= TRUE, sep= ",", dec=".", check.names = TRUE)

library(knitr)
library(kableExtra)

## Estadística Inferencial: Variables Nominales y Ordinales
# Tipo de Pozo

well_type <- c(
  "Oil Well", "Natural Gas Well", "Oil and Gas Well", "Private Gas          Well", "Historical Oil Well",
  "Brine Well", "Brine Well Oil Well", "Brine Well Natural Gas      Well", "Solution Mining Well", "Source Well",
  "Injection Well", "Historical Injection Well", "Natural Gas       Storage Well", "Cavern Storage Well",
  "Compressed Air Energy Storage Well", "Disposal Well",
  "Dry Hole", "Gas Show", "Oil Show", "Oil and Gas Show", "Stratigraphic Test",
  "Observation", "Test", "Unknown", "Abandoned", "Shut-in", "Other")
TablaTipo <- data.frame(
  well_type = well_type,
  ni = sample(1:100, length(well_type)),
  hi = round(runif(length(well_type), 0.01, 1), 2))
datos$Fluido <- NA  
for (i in 1:nrow(datos)) {
  tipo <- as.character(datos$WELL_TYPE[i])
  if (tipo %in% c("Oil Well", "Historical Oil Well")) {
    datos$Fluido[i] <- "Petróleo"
  } else if (tipo %in% c("Natural Gas Well", "Private Gas          Well")) {
    datos$Fluido[i] <- "Gas Natural"
  } else if (tipo %in% c("Oil and Gas Well", "Oil and Gas Show")) {
    datos$Fluido[i] <- "Petróleo y Gas"
  } else if (tipo %in% c("Brine Well", "Brine Well Oil Well", "Brine Well Natural Gas      Well", "Solution Mining Well", "Source Well")) {
    datos$Fluido[i] <- "Salmuera/Solución"
  } else if (tipo %in% c("Compressed Air Energy Storage Well")) {
    datos$Fluido[i] <- "Aire Comprimido"
  } else if (tipo %in% c("Injection Well", "Disposal Well", "Historical Injection Well")) {
    datos$Fluido[i] <- "Agua/Residuos"
  } else if (tipo %in% c("Dry Hole", "Gas Show", "Oil Show", "Stratigraphic Test")) {
    datos$Fluido[i] <- "Exploración (Show)"
  } else {
    datos$Fluido[i] <- "Otro/No definido"
  }
}

TDFfluido <- table(datos$Fluido)
Tabla <- data.frame(Tipo_de_Fluido = names(TDFfluido),
                    Frecuencia_Absoluta = as.vector(TDFfluido))
Tabla$Frecuencia_Relativa <- round(
  Tabla$Frecuencia_Absoluta / sum(Tabla$Frecuencia_Absoluta) * 100, 
  2)
fila_total <- data.frame(
  Tipo_de_Fluido = "Total",
  Frecuencia_Absoluta = sum(Tabla$Frecuencia_Absoluta),
  Frecuencia_Relativa = round(sum(Tabla$Frecuencia_Relativa), 2))
Tabla <- rbind(Tabla, fila_total)
tipo_pozo <- datos$WELL_TYPE
Tabla <- as.data.frame(table(datos$WELL_TYPE))
colnames(Tabla) <- c("Tipo_de_Fluido", "Frecuencia_Absoluta")
print(Tabla)
##                        Tipo_de_Fluido Frecuencia_Absoluta
## 1                          Brine Well                  34
## 2         Brine Well Natural Gas Well                   4
## 3                 Brine Well Oil Well                   5
## 4                 Cavern Storage Well                 124
## 5  Compressed Air Energy Storage Well                   2
## 6                       Disposal Well                 129
## 7                            Dry Hole                4546
## 8                            Gas Show                2728
## 9                   Gas Well Oil Show                  56
## 10          Historical Injection Well                  49
## 11                Historical Oil Well                1210
## 12                     Injection Well                 235
## 13                           Licensed                   2
## 14                           Location                 936
## 15           Natural Gas Storage Well                 333
## 16                   Natural Gas Well                9355
## 17                   Observation Well                 176
## 18                   Oil and Gas Show                 795
## 19                   Oil and Gas Well                 253
## 20                           Oil Show                 977
## 21                           Oil Well                2102
## 22                  Oil Well Gas Show                  53
## 23                              Other                  19
## 24                   Private Gas Well                1057
## 25               Solution Mining Well                 204
## 26                        Source Well                  10
## 27                 Stratigraphic Test                1272
TDFfluido <- table(datos$Fluido)
Tabla <- data.frame(Tipo_de_Fluido = names(TDFfluido),
                    Frecuencia_Absoluta = as.vector(TDFfluido))
Tabla$Frecuencia_Relativa <- round(
  Tabla$Frecuencia_Absoluta / sum(Tabla$Frecuencia_Absoluta) * 100, 
  2)
fila_total <- data.frame(
  Tipo_de_Fluido = "Total",
  Frecuencia_Absoluta = sum(Tabla$Frecuencia_Absoluta),
  Frecuencia_Relativa = round(sum(Tabla$Frecuencia_Relativa), 2))
Tabla <- rbind(Tabla, fila_total)

if (knitr::is_latex_output()) {
  kable(Tabla, format = "latex", caption = "Tabla Nº1: Distribución de Tipos de Fluido", booktabs = TRUE)
} else {
  kable(Tabla, format = "html", caption = "Tabla Nº1: Distribución de Tipos de Fluido") %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
                  full_width = FALSE, position = "center") %>%
    column_spec(1, bold = TRUE)
}
Tabla Nº1: Distribución de Tipos de Fluido
Tipo_de_Fluido Frecuencia_Absoluta Frecuencia_Relativa
Agua/Residuos 413 1.55
Aire Comprimido 2 0.01
Exploración (Show) 9523 35.71
Gas Natural 9355 35.08
Otro/No definido 2760 10.35
Petróleo 3312 12.42
Petróleo y Gas 1048 3.93
Salmuera/Solución 253 0.95
Total 26666 100.00
# Probabilidades 
Tabla_sin_total <- Tabla[Tabla$Tipo_de_Fluido != "Total", ]
P_TipoFluido <- Tabla_sin_total$Frecuencia_Absoluta / sum(Tabla_sin_total$Frecuencia_Absoluta)
nombres_fluido <- Tabla_sin_total$Tipo_de_Fluido

barplot(P_TipoFluido,
        main = "Gráfica: \nDistribución de Probabilidad del Tipo de Fluido",
        xlab = "Tipo de Fluido", ylab = "Probabilidad",
        col = "darkgreen",
        names.arg = nombres_fluido,
        las = 3,
        cex.names = 0.8)

# Modo del Pozo
Modo <- datos$WELL_MODE
Modo <- na.omit(Modo)
TDFModo <- table(Modo)
TablaModo_EI <- as.data.frame(TDFModo)
fe_Modo <- TablaModo_EI$Freq / sum(TablaModo_EI$Freq)
fe_Modo <- fe_Modo * 100
TablaModo_EI <- data.frame(TablaModo_EI, fe_Modo)
colnames(TablaModo_EI)[colnames(TablaModo_EI) == "fe_Modo"] <- "Frecuencia observada"
TablaModo_final <- TablaModo_EI[, c("Modo", "Frecuencia observada")]
nombres_modo <- TablaModo_final$Modo
P_Modo <- TablaModo_final$`Frecuencia observada`
barplot(P_Modo,
        main = "Gráfica: \nDistribución de Probabilidad del Modo de Pozo",
        xlab = "Modo de Pozo", ylab = "Probabilidad (%)",
        col = "steelblue",
        names.arg = nombres_modo,
        las = 3,
        cex.names = 0.8)

# Concesión

concesiones <- trimws(na.omit(datos$CONCESSION))
es_romano <- function(x) {
  grepl("^M{0,4}(CM)?(CD)?(D)?(XC)?(XL)?(L)?(IX)?(IV)?(V)?I{0,3}$", x)
}

tipo_concesion <- ifelse(es_romano(concesiones), 
                         "Numérica (Romana)", 
                         "Alfabética")
tabla_concesion <- table(tipo_concesion)
df_tabla <- as.data.frame(tabla_concesion)
print(colnames(df_tabla))  
## [1] "tipo_concesion" "Freq"
print(df_tabla)
##      tipo_concesion  Freq
## 1        Alfabética 11154
## 2 Numérica (Romana) 15512
colnames(df_tabla) <- c("Tipo_de_Concesion", "Frecuencia_Absoluta")
df_tabla$Frecuencia_Relativa <- round(df_tabla$Frecuencia_Absoluta / sum(df_tabla$Frecuencia_Absoluta) * 100, 2)
print(df_tabla)
##   Tipo_de_Concesion Frecuencia_Absoluta Frecuencia_Relativa
## 1        Alfabética               11154               41.83
## 2 Numérica (Romana)               15512               58.17
# ====================
# GRÁFICA FRECUENCIA ABSOLUTA
# ====================
par(mar = c(5, 5, 4, 2))
barplot(df_tabla$Frecuencia_Absoluta,
        names.arg = df_tabla$Tipo_de_Concesion,
        col = "skyblue",
        main = "Frecuencia Absoluta por Tipo de Concesión",
        ylab = "Frecuencia",
        cex.names = 0.9,
        cex.axis = 0.9,
        cex.main = 1.2,
        ylim = c(0, max(df_tabla$Frecuencia_Absoluta) * 1.2),
        border = "black")

# ====================
# GRÁFICA FRECUENCIA RELATIVA
# ====================
par(mar = c(5, 5, 4, 2))
barplot(df_tabla$Frecuencia_Relativa,
        names.arg = df_tabla$Tipo_de_Concesion,
        col = "lightgreen",
        main = "Frecuencia Relativa (%) por Tipo de Concesión",
        ylab = "Porcentaje",
        cex.names = 0.9,
        cex.axis = 0.9,
        cex.main = 1.2,
        ylim = c(0, 100),
        border = "black")

# Tabla de frecuencias absolutas
tabla_concesion <- table(tipo_concesion)
frecuencia <- prop.table(tabla_concesion)
labels <- names(frecuencia)
expected_counts <- rep(1 / length(frecuencia), length(frecuencia))

# Gráfico Observado vs Modelo Uniforme
pos <- barplot(rbind(frecuencia, expected_counts),
               beside = TRUE,
               col = c("skyblue4", "skyblue"),
               names.arg = labels,
               ylim = c(0, max(c(frecuencia, expected_counts)) + 0.05),
               main = "Comparación Observado vs Modelo Uniforme por Tipo de Concesión",
               xlab = "Tipo de Concesión",
               ylab = "Frecuencia Relativa (Probabilidad)",
               cex.names = 0.9,
               las = 1)

legend("topright",
       legend = c("Modelo Observado", "Modelo Uniforme"),
       fill = c("skyblue4", "skyblue"),
       bty = "n",
       cex = 0.8)

# Frecuencias absolutas observadas y esperadas
Fo2 <- as.numeric(tabla_concesion)
n_total <- sum(Fo2)
Fe2 <- rep(n_total / length(Fo2), length(Fo2))

# Estadístico Chi-cuadrado
x2_2 <- sum(((Fo2 - Fe2)^2) / Fe2)
k <- length(Fo2)
gl_2 <- k - 1
vc_2 <- qchisq(0.95, df = gl_2)

# Resultados
cat("Chi-cuadrado calculado (x2_2):", x2_2, "\n")
## Chi-cuadrado calculado (x2_2): 712.224
cat("Valor crítico (vc_2):", vc_2, "\n")
## Valor crítico (vc_2): 3.841459
if (x2_2 < vc_2) {
  cat("Resultado: No se rechaza H0 (la distribución uniforme se ajusta bien)\n")
} else {
  cat("Resultado: Se rechaza H0 (la distribución uniforme no se ajusta bien)\n")
}
## Resultado: Se rechaza H0 (la distribución uniforme no se ajusta bien)
## ESTADÍSTICA INFERENCIAL CONTINUAS

# Variable: Elevación del terreno

elevacion_terreno<-datos$GROUND_ELEVATION
elevacion_terreno<-na.omit(elevacion_terreno)

# Histograma

Histog_elevacion<-hist(elevacion_terreno, freq = FALSE,
                       main = "Gráfica No.1: Histograma de Elevación del terreno con Curva LogNormal",
                       xlab = "Elevación del terreno (m))",
                       ylab = "Densidad de Probabilidad",
                       col = "darkblue")

# LogNormal

Log_elevacion<-log(elevacion_terreno)
ulog_elevacion<-mean(Log_elevacion)
ulog_elevacion
## [1] 5.275776
sigmalog_elevacion<-sd(Log_elevacion)
sigmalog_elevacion
## [1] 0.1861014
x<-seq(min(elevacion_terreno),max(elevacion_terreno), 0.01)
curve((dlnorm(x, ulog_elevacion,sigmalog_elevacion)),col="red", add=TRUE)

# Área 
Altura <- Histog_elevacion$density
Area <- sum(Altura * diff(Histog_elevacion$breaks))
Area
## [1] 1
# Frecuencias observadas y esperadas

FO <- Histog_elevacion$counts
FO
##  [1]    50   242    68 14608  8792   544   235    39    27    18     5     0
## [13]     1     1
FOr <- (FO / length(elevacion_terreno)) * 100
sum(FOr)
## [1] 100
Plog<-c()
liminf_elevacion <- Histog_elevacion$breaks[-length(Histog_elevacion$breaks)]
liminf_elevacion
##  [1]   0  50 100 150 200 250 300 350 400 450 500 550 600 650
limsup_elevacion <- Histog_elevacion$breaks[-1]
limsup_elevacion
##  [1]  50 100 150 200 250 300 350 400 450 500 550 600 650 700
Plog <- plnorm(limsup_elevacion, ulog_elevacion, sigmalog_elevacion) -
  plnorm(liminf_elevacion, ulog_elevacion, sigmalog_elevacion)

FE <- Plog*length(elevacion_terreno)
FE
##  [1] 2.876750e-09 3.867291e+00 1.895612e+03 1.160279e+04 8.827552e+03
##  [6] 2.035949e+03 2.425729e+02 2.018128e+01 1.387887e+00 8.693960e-02
## [11] 5.254642e-03 3.173263e-04 1.956326e-05 1.247666e-06
cor(FO,FE)
## [1] 0.9791728
X2<- sum(((FO - FE)^2)/FE)
X2
## [1] 869037252565
Vc<- qchisq(0.95, df = length(FO) - 1 - 2)
Vc
## [1] 19.67514
cat("¿Acepta H₀ (lognormal)?", X2 < Vc, "\n")
## ¿Acepta H₀ (lognormal)? FALSE
# PROFUNDIDAD ALCANZADA

prof_alcanzada<-datos$TOTAL_DEPTH
prof_alcanzada<-na.omit(prof_alcanzada)
prof_alcanzada<-as.numeric(prof_alcanzada)
Histog_profundidad<-hist(prof_alcanzada, freq = FALSE,
                         main = "Gráfica No.1: Histograma de Profundidad Alcanzada con Curva Exponencial",
                         xlab = "Elevación del terreno (m)",
                         ylab = "Densidad de Probabilidad",
                         col = "darkblue")
lambda<-1/mean(prof_alcanzada)
x<-seq(min(prof_alcanzada),max(prof_alcanzada),0.01)
curve(dexp(x,rate=lambda),col="red",lwd=2,add=TRUE)

# SUBCONJUNTOS
caja_profundidad<-boxplot(prof_alcanzada, horizontal=T,
                          main="Diagrama de caja de la profundidad alcanzada",
                          xlab = "Profundidad Alcanzada")

prof_outliers<-subset(prof_alcanzada,prof_alcanzada>=min(caja_profundidad$out))
profcomunes<-subset(prof_alcanzada,prof_alcanzada<min(caja_profundidad$out))

# Profundidad alcanzada: valores comunes-modelo Lognormal
log_profcomunes <- log(profcomunes)
ulog_profcomunes <- mean(log_profcomunes)
ulog_profcomunes
## [1] 5.580225
sigmalog_profcomunes <- sd(log_profcomunes)
sigmalog_profcomunes
## [1] 0.6883495
Histog_profcomunes<-hist(profcomunes,
     main = "Gráfica No.2: Histograma de Profundidad Alcanzada con Curva Lognormal",
     xlab = "Profundidad Alcanzada: valores comunes (m)",
     col = "darkblue",
     ylab = "Densidad de Probabilidad",
     freq = FALSE)

x_log <- seq(min(log_profcomunes, na.rm = TRUE), max(log_profcomunes, na.rm = TRUE), length.out = 100)
curve(dlnorm(x, meanlog = ulog_profcomunes, sdlog = sigmalog_profcomunes),
      col = "red",
      add = TRUE, 
      lwd = 2)

# Área 
Altura <- Histog_profcomunes$density
Area <- sum(Altura * diff(Histog_profcomunes$breaks))
Area
## [1] 1
# Frecuencias observadas y esperadas de profundidad alcanzada: valores comunes
FO_profcomunes <- Histog_profcomunes$counts
Plog_profcomunes<-c()
liminf_profcomunes <- Histog_profcomunes$breaks[-length(Histog_profcomunes$breaks)]
limsup_profcomunes <- Histog_profcomunes$breaks[-1]
Plog_profcomunes <- plnorm(limsup_profcomunes, ulog_profcomunes, sigmalog_profcomunes) -
  plnorm(liminf_profcomunes, ulog_profcomunes, sigmalog_profcomunes)
FE_profcomunes<- Plog_profcomunes*length(profcomunes)

cor(FO_profcomunes,FE_profcomunes)
## [1] 0.8863325
X2<- sum(((FO_profcomunes - FE_profcomunes)^2)/FE_profcomunes)
X2
## [1] 3539.131
Vc<- qchisq(0.95, df = length(FO_profcomunes) - 1 - 2)
Vc
## [1] 26.29623
cat("¿Acepta H₀ (lognormal)?", X2 < Vc, "\n")
## ¿Acepta H₀ (lognormal)? FALSE
# Profundidad alcanzada: valores outliers-modelo Lognormal
log_profoutliers <- log(prof_outliers)
ulog_profoutliers <- mean(log_profoutliers)
ulog_profoutliers
## [1] 7.063837
sigmalog_profoutliers <- sd(log_profoutliers)
sigmalog_profoutliers
## [1] 0.2106759
Histog_profoutliers<-hist(prof_outliers)

y_values_for_curve_outliers <- dlnorm(x, meanlog = ulog_profoutliers, sdlog = sigmalog_profoutliers)
max_y_hist_outliers <- max(Histog_profoutliers$density, na.rm = TRUE)
max_y_curve_outliers <- max(y_values_for_curve_outliers, na.rm = TRUE)
ylim_max_outliers <- max(max_y_hist_outliers, max_y_curve_outliers) * 1.05
par(mar = c(7, 6, 5, 4) + 0.1)
Histog_profoutliers<-hist(prof_outliers,
                         main = "Gráfica No.2: 
                         Histograma de Profundidad Alcanzada con Curva Lognormal",
                         xlab = "Profundidad Alcanzada: valores comunes (m)",
                         col = "darkblue",
                         ylab = "Densidad de Probabilidad",
                         freq = FALSE,
                         ylim = c(0, ylim_max_outliers))
x_outliers <- seq(min(log_profoutliers, na.rm = TRUE), max(log_profoutliers, na.rm = TRUE), length.out = 500)
curve(dlnorm(x, meanlog = ulog_profoutliers, sdlog = sigmalog_profoutliers),
      col = "red",
      add = TRUE,
      lwd = 2)

# Área 
Altura <- Histog_profoutliers$density
Area <- sum(Altura * diff(Histog_profoutliers$breaks))
Area
## [1] 1
# Frecuencias observadas y esperadas
FO_profoutliers<- Histog_profoutliers$counts
FO_profoutliers <- (Histog_profoutliers$counts/length(prof_outliers))*100
Plog_profoutliers<-c()

liminf_profoutliers <- Histog_profoutliers$breaks[-length(Histog_profoutliers$breaks)]
limsup_profoutliers <- Histog_profoutliers$breaks[-1]
Plog_profoutliers <- plnorm(limsup_profoutliers, ulog_profoutliers, sigmalog_profoutliers) -
  plnorm(liminf_profoutliers, ulog_profoutliers, sigmalog_profoutliers)
FE_profoutliers<- Plog_profoutliers*length(prof_outliers)
FE_profoutliers[FE_profoutliers == 0] <- 1e-6 

cor(FO_profoutliers,FE_profoutliers)
## [1] 0.9854689
X2_profoutliers<- sum(((FO_profoutliers - FE_profoutliers)^2)/FE_profoutliers)
X2_profoutliers
## [1] 478828.9
Vc_profoutliers<- qchisq(0.95, df = length(FO_profoutliers) - 1 - 2)
Vc_profoutliers
## [1] 12.59159
cat("¿Acepta H₀ (lognormal)?", X2_profoutliers < Vc_profoutliers, "\n")
## ¿Acepta H₀ (lognormal)? FALSE