ANÁLISIS ESTADÍSTICO

1. CARGA DE LIBRERÍAS Y DATOS

# 1. CARGA DE LIBRERÍA Y DATOS
library(dplyr)
library(knitr)
library(gt)

setwd("C:/Users/HP/Documents/PROYECTO ESTADISTICA/RStudio")
datos <- read.csv("tablap.csv", header = TRUE, dec = ",", sep = ";")

2. TABLA DE DISTRIBUCIÓN DE CANTIDAD

# LIMPIEZA INICIAL
distancia <- as.numeric(datos$Distance.estimation)
distancia <- na.omit(distancia)
distancia <- subset(distancia, distancia >= 0)

#FILTRADO DE OUTLIERS
caja <- boxplot(distancia, plot = FALSE)
limite_inf <- caja$stats[1]
limite_sup <- caja$stats[5]

# Selección de datos sin outliers
distancia_limpia <- distancia[distancia >= limite_inf & distancia <= limite_sup]

cat("Cantidad total de datos analizados (sin outliers):", length(distancia_limpia), "\n")
## Cantidad total de datos analizados (sin outliers): 11793
histograma <- hist(distancia_limpia, plot = FALSE)
ni <- histograma$counts
hi <- ni / sum(ni) * 100
intervalos <- paste0("[", round(histograma$breaks[-length(histograma$breaks)], 2),
                      ", ", round(histograma$breaks[-1], 2), ")")

tabla_frecuencias <- data.frame(Intervalo = intervalos, ni = ni, hi = round(hi, 2))
totales <- data.frame(Intervalo = "TOTAL", ni = sum(ni), hi = sum(round(hi, 2)))
tabla_frecuencias_final <- rbind(tabla_frecuencias, totales)

# Aplicación de gt para Tabla de Frecuencias
tabla_gt_frecuencias <- tabla_frecuencias_final %>% 
  gt() %>%
  cols_label(
    Intervalo = "Intervalo",
    ni = "ni",
    hi = "hi (%)"
  ) %>%
  tab_header(
    title = md("**Tabla Nº1. Distribución de Frecuencias de la Distancia Estimada**")
  ) %>%
  tab_style(
    style = list(
      cell_fill(color = "lightgray"),
      cell_text(weight = "bold")
    ),
    locations = cells_body(
      rows = Intervalo == "TOTAL"
    )
  ) %>%
  cols_align(
    align = "center",
    columns = c(ni, hi)
  ) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.size = px(20),
    heading.title.font.weight = "bold",
    table.font.names = "Open Sans",
    column_labels.font.weight = "bold"
  )

tabla_gt_frecuencias
Tabla Nº1. Distribución de Frecuencias de la Distancia Estimada
Intervalo ni hi (%)
[0, 10) 307 2.60
[10, 20) 714 6.05
[20, 30) 1052 8.92
[30, 40) 1073 9.10
[40, 50) 1232 10.45
[50, 60) 1292 10.96
[60, 70) 1170 9.92
[70, 80) 1225 10.39
[80, 90) 972 8.24
[90, 100) 713 6.05
[100, 110) 571 4.84
[110, 120) 362 3.07
[120, 130) 201 1.70
[130, 140) 221 1.87
[140, 150) 214 1.81
[150, 160) 213 1.81
[160, 170) 192 1.63
[170, 180) 69 0.59
TOTAL 11793 100.00

3. GRÁFICA DE DISTRIBUCIÓN DE CANTIDAD

# 3. GRÁFICA DE DISTRIBUCIÓN DE CANTIDAD
hist(distancia_limpia, freq = TRUE, col = "skyblue",
     main = "Gráfica Nº1. Distribución de Distance.estimation",
     xlab = "Distancia Estimada", ylab = "Frecuencia")

4. CONJETURA DEL MODELO

mu <- mean(distancia_limpia)
sigma <- sd(distancia_limpia)
h <- length(histograma$counts)

hist(distancia_limpia, freq = FALSE, col = "lightcyan",
     main = "Gráfica Nº2. Comparación Realidad vs Modelo Normal",
     xlab = "Distancia", ylab = "Densidad")
curve(dnorm(x, mean = mu, sd = sigma), add = TRUE, col = "blue3", lwd = 3)

5. TESTS DE APROBACIÓN

# 5. TEST DE APROBACIÓN
Fo <- histograma$counts
P <- c()
for (i in 1:h) {
  P[i] <- pnorm(histograma$breaks[i+1], mu, sigma) - pnorm(histograma$breaks[i], mu, sigma)
}

n <- length(distancia_limpia)
Fo_perc <- (Fo / n) * 100
Fe_perc <- P * 100
Fo_perc
##  [1]  2.6032392  6.0544391  8.9205461  9.0986178 10.4468753 10.9556517
##  [7]  9.9211397 10.3875180  8.2421776  6.0459595  4.8418553  3.0696176
## [13]  1.7044009  1.8739930  1.8146358  1.8061562  1.6280845  0.5850929
Fe_perc
##  [1]  2.7853383  4.1475728  5.7565173  7.4469039  8.9792934 10.0915826
##  [7] 10.5712724 10.3215795  9.3932515  7.9677648  6.2995224  4.6422550
## [13]  3.1886015  2.0413660  1.2181208  0.6774980  0.3512150  0.1697012
# Gráfica de Correlación
plot(Fo_perc, Fe_perc, 
     main="Gráfica Nº3: Correlación de frecuencias en el modelo normal
     de la Distancia Estimada de los pozos de gas natural",
     xlab="Frecuencia Observada (%)",
     ylab="Frecuencia esperada (%)",
     col="blue3",
     pch=19)

abline(a = 0, b = 1, col = "red", lwd = 2)

# Cálculos estadísticos
Correlacion <- cor(Fo_perc, Fe_perc) * 100
grados_libertad <- h - 1
nivel_significancia <- 0.95
x2 <- sum((Fe_perc - Fo_perc)^2 / Fe_perc)
vc <- qchisq(nivel_significancia, grados_libertad)

# Aplicación de gt para Resultados de los Tests
tabla_resumen_tests <- data.frame(
  Prueba = c("Correlación Pearson (%)", "Chi-cuadrado"),
  Valor_Obtenido = c(round(Correlacion, 2), round(x2, 2)),
  Criterio_Aceptación = c("> 80%", paste("<", round(vc, 2))),
  Resultado = c(ifelse(Correlacion > 80, "APROBADO", "RECHAZADO"), 
                ifelse(x2 < vc, "APROBADO", "RECHAZADO"))
)

tabla_gt_tests <- tabla_resumen_tests %>%
  gt() %>%
  cols_label(
    Prueba = "Prueba Estadística",
    Valor_Obtenido = "Valor Obtenido",
    Criterio_Aceptación = "Criterio",
    Resultado = "Resultado"
  ) %>%
  tab_header(
    title = md("**Tabla Nº2. Resumen de Tests de Bondad de Ajuste (Modelo Normal)**")
  ) %>%
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  tab_options(
    table.width = pct(80),
    heading.title.font.weight = "bold",
    column_labels.font.weight = "bold"
  )

tabla_gt_tests
Tabla Nº2. Resumen de Tests de Bondad de Ajuste (Modelo Normal)
Prueba Estadística Valor Obtenido Criterio Resultado
Correlación Pearson (%) 92.75 > 80% APROBADO
Chi-cuadrado 13.36 < 27.59 APROBADO

6. CÁLCULO DE PROBABILIDADES

## **6. CÁLCULO DE PROBABILIDADES**

# 6. CÁLCULO DE PROBABILIDADES (Rango 100 a 150)
prob <- (pnorm(150, mean = mu, sd = sigma) - 
           pnorm(100, mean = mu, sd = sigma)) * 100

# Rango para la curva
x <- seq(min(distancia_limpia), max(distancia_limpia), 0.01)

# Gráfica de densidad
plot(x, dnorm(x, mu, sigma), 
     col = "skyblue3",
     lwd = 1,
     main = "Gráfica Nº 4: Cálculo de probabilidades",
     ylab = "Densidad de probabilidad",
     xlab = "Distancia Estimada")

x_section <- seq(100, 150, 0.01)
y_section <- dnorm(x_section, mu, sigma)

# Pintar la sección de la curva
lines(x_section, y_section, col = "red", lwd = 2)

# Pintar el área debajo de la línea roja
polygon(c(x_section, rev(x_section)), 
        c(y_section, rep(0, length(y_section))),
        col = rgb(1, 0, 0, 0.6))

# Leyenda
legend("topright",
       legend = c("Modelo Normal", "Área de Probabilidad"),
       col = c("skyblue3", "red"),
       lwd = 2,
       cex = 0.6)

# Texto de la probabilidad en la gráfica
texto_prob <- paste0("Probabilidad = ", round(prob, 2), " %")

# Posicionamiento automático del texto
text(x = (max(x) * 0.8), 
     y = max(dnorm(x, mu, sigma)) * 0.8, 
     labels = texto_prob, 
     col = "black", 
     cex = 0.8, 
     font = 2)

# CÁLCULO DE CANTIDAD ESPERADA
cantidad_esperada <- (pnorm(150, mu, sigma) - pnorm(100, mu, sigma)) * 500

# GENERACIÓN DEL PLOT
plot.new()
plot.window(xlim = c(0, 100), ylim = c(0, 1))
rect(5, 0.2, 95, 0.8, col = "#F4F6F7", border = "#2A9D8F", lwd = 2)
text(50, 0.70, "¿De 500 nuevos pozos de gas natural cuántos", cex = 1, font = 3)
text(50, 0.63, "estarán en una distancia de 100 a 150?", cex = 1, font = 3)
text(50, 0.45, paste(round(cantidad_esperada, 0), "Pozos"), cex = 2.5, font = 2, col = "#E67E22")
rect(45, 0.35, 55, 0.37, col = "#2A9D8F", border = NA)

7. INTERVALOS DE CONFIANZA

# Usamos 'n' que fue definida en la sección 5
e <- sigma / sqrt(n) 
li <- mu - 2*e
ls <- mu + 2*e

# Variable para la tabla
Variable_IC <- "Distancia Estimada"

tabla_media <- data.frame(round(li, 2), Variable_IC, round(ls, 2), round(e, 4))
colnames(tabla_media) <- c("Límite Inferior", "Media Poblacional", "Límite Superior", "Error Estándar")

library(knitr)
kable(tabla_media, format = "markdown", caption = "Tabla Nº3: Media poblacional")
Tabla Nº3: Media poblacional
Límite Inferior Media Poblacional Límite Superior Error Estándar
65.91 Distancia Estimada 67.29 0.3462

8. CONCLUSIÓN

cat("La Distancia Estimada se ajusta a una distribución normal, con una media de", round(mu, 2), 
    "y una desviación estándar de", round(sigma, 2), "en la escala original. El intervalo de confianza del 95% para la media poblacional se encuentra entre", round(li, 2), 
    "y", round(ls, 2), ".\n\nEl modelo fue aceptado con un 95% de confianza, ya que el estadístico Chi-cuadrado de", round(x2, 3), 
    "fue inferior al valor crítico de", round(vc, 3), ". Además, la alta correlación del", round(Correlacion, 2), 
    "% entre las frecuencias observadas y teóricas respalda la calidad del ajuste.\nLa probabilidad de que la Distancia Estimada esté entre 100 y 150 unidades es del", 
    round(prob, 2), "%.")
## La Distancia Estimada se ajusta a una distribución normal, con una media de 66.6 y una desviación estándar de 37.59 en la escala original. El intervalo de confianza del 95% para la media poblacional se encuentra entre 65.91 y 67.29 .
## 
## El modelo fue aceptado con un 95% de confianza, ya que el estadístico Chi-cuadrado de 13.359 fue inferior al valor crítico de 27.587 . Además, la alta correlación del 92.75 % entre las frecuencias observadas y teóricas respalda la calidad del ajuste.
## La probabilidad de que la Distancia Estimada esté entre 100 y 150 unidades es del 17.39 %.