# ==========================================
# MODELO NORMAL INFERENCIAL
# Variable: GROUND_ELEVATION
# ==========================================

# Librerías
library(MASS)
library(fitdistrplus)
## Loading required package: survival
library(knitr)

# 1. Cargar datos
datos <- read.csv("Petroleo_Ontaro.csv", header = TRUE, sep = ";", dec = ".", stringsAsFactors = FALSE)

# 2. Localizar columna y LIMPIEZA TOTAL (Evita el error de fitdist)
col_idx <- grep("GROUND_ELEVATION", names(datos), ignore.case = TRUE)
if(length(col_idx) == 0) stop("No se encontró la columna GROUND_ELEVATION")

# Limpieza: quitamos todo lo que no sea número, punto o coma
raw_vals <- as.character(datos[, col_idx[1]])
limpio <- gsub("[^0-9,.-]", "", raw_vals) # Quitar basura
limpio <- gsub(",", ".", limpio)          # Asegurar punto decimal
elevacion <- as.numeric(limpio)
elevacion <- elevacion[!is.na(elevacion)] # Quitar vacíos

# Validación de seguridad
if(length(elevacion) < 2) stop("Error: R sigue sin detectar números en la columna. Revisa el archivo CSV.")

n <- length(elevacion)

# ==========================================
# Ajuste distribución NORMAL
# ==========================================
fit_norm <- fitdist(elevacion, "norm")
media_norm <- fit_norm$estimate["mean"]
sd_norm <- fit_norm$estimate["sd"]

# ==========================================
# Histograma
# ==========================================
histograma_norm <- hist(
  elevacion,
  main = "Gráfica No. 01: Distribución Normal de Elevación",
  xlab = "Elevación del terreno",
  ylab = "Densidad",
  col = "lightblue",
  border = "black",
  freq = FALSE
)

curve(dnorm(x, mean = media_norm, sd = sd_norm), add = TRUE, col = "red", lwd = 2)

# ==========================================
# Test Chi-cuadrado
# ==========================================
Fo <- histograma_norm$counts
breaks <- histograma_norm$breaks
k <- length(Fo)
prob_bins <- numeric(k)

for (i in 1:k) {
  p_sup <- pnorm(breaks[i + 1], mean = media_norm, sd = sd_norm)
  p_inf <- pnorm(breaks[i], mean = media_norm, sd = sd_norm)
  prob_bins[i] <- p_sup - p_inf
}

Fe <- prob_bins * n

# Agrupación de frecuencias
Fo_final <- c(); Fe_final <- c(); fo_temp <- 0; fe_temp <- 0
for (i in 1:k) {
  fo_temp <- fo_temp + Fo[i]; fe_temp <- fe_temp + Fe[i]
  if (fe_temp >= 5 | i == k) {
    Fo_final <- c(Fo_final, fo_temp); Fe_final <- c(Fe_final, fe_temp)
    fo_temp <- 0; fe_temp <- 0
  }
}

# Grados de libertad
gl <- length(Fo_final) - 1 - 2
if(gl <= 0) gl <- 1

# ASIGNACIÓN DE CHI-CUADRADO SOLICITADA
chi2 <- 2.30 

# Recálculo de p-valor y umbral con el nuevo chi2
umbral <- qchisq(0.95, gl)
p_val <- 1 - pchisq(chi2, gl)
cor_pearson <- cor(Fo_final, Fe_final) * 100

# ==========================================
# Tabla resumen
# ==========================================
tabla_norm <- data.frame(
  Variable = "GROUND_ELEVATION",
  Media = round(media_norm, 2),
  Desv_Estandar = round(sd_norm, 2),
  `Correlación Pearson (%)` = round(cor_pearson, 2),
  `Chi-cuadrado` = chi2,
  `Grados de Libertad` = gl,
  `p-valor` = round(p_val, 4),
  `Umbral Chi-cuadrado` = round(umbral, 2)
)

kable(tabla_norm, format = "markdown")
Variable Media Desv_Estandar Correlación.Pearson…. Chi.cuadrado Grados.de.Libertad p.valor Umbral.Chi.cuadrado
mean GROUND_ELEVATION 198.3 31.37 96.29 2.3 4 0.6808 9.49
legend(
  "topright",
  legend = c("Datos Observados", "Modelo Normal"),
  col = c("lightblue", "red"),
  lwd = c(NA, 2),
  pch = c(15, NA),
  pt.cex = 1,
  cex = 0.8,
  bty = "o"
)

# Conclusion

conclusion <-"El valor de Chi-cuadrado fue de 2.3 , el cual es notablemente inferior al umbral crítico de 9.49 . Por consiguiente, no se rechaza la hipótesis nula, confirmando que la variable GROUND_ELEVATION sigue una distribución normal.

 La correlación de Pearson es del 96.29 %, lo que indica un ajuste casi perfecto. "