# ==========================================
# 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. "