ANÁLISIS ESTADÍSTICO DEL IMPACTO DE ACERO

1. CARGA DE DATOS Y LIBRERÍAS

#==============================ENCABEZADO================================
# TEMA: ESTADISTICA DESCRIPTIVA- IMPACTO DE ACERO
# AUTOR: GRUPO 2
# FECHA: 03-2026
#========================================================================
library(dplyr)
library(gt)
library(e1071)

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

2. TABLA DE DISTRIBUCION CON STURGES

acero <- as.numeric(datos$Impact.steel.production..pad.)
acero <- na.omit(acero)
acero <- subset(acero, acero >= 0)
# Calculamos el número de datos
n <- length(acero)

# Número de clases con Sturges
k <- floor(1 + 3.3 * log10(n))

# Min, Max 
minimo <- min(acero)
maximo <- max(acero)

# Rango
R <- maximo - minimo

# Amplitud
A <- R / k

# Límites inferior (Li) y superior (Ls)
Li <- round(seq(from = minimo, to = maximo - A, by = A), 2)
Ls <- round(seq(from = minimo + A, to = maximo, by = A), 2)

# Sincronización de longitudes 
if(length(Ls) > length(Li)) Ls <- Ls[1:length(Li)]
if(length(Li) > length(Ls)) Li <- Li[1:length(Ls)]

# Marca de clase
MC <- round((Li + Ls) / 2, 2)

# Frecuencia Absoluta (ni)
ni <- numeric(length(Li))
for (i in 1:length(Li)) {
  ni[i] <- sum(acero >= Li[i] & acero < Ls[i])
}
# Ajuste para el último intervalo
ni[length(Li)] <- sum(acero >= Li[length(Li)] & acero <= maximo)

# Frecuencia Relativa (hi)
hi <- (ni / sum(ni)) * 100

# Frecuencias Acumuladas
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi), 2)
Hidsc <- round(rev(cumsum(rev(hi))), 2)

# TABLA FINAL
TDF_acero <- round(data.frame(
  Li, Ls, MC, ni, hi, Niasc, Nidsc, Hiasc, Hidsc
), 2)

# Visualizar Tabla
TDF_acero
##           Li        Ls        MC   ni    hi Niasc Nidsc  Hiasc  Hidsc
## 1   79121.28  95664.74  87393.01   26  0.21    26 12561   0.21 100.00
## 2   95664.74 112208.19 103936.46  437  3.48   463 12535   3.69  99.79
## 3  112208.19 128751.64 120479.92 1574 12.53  2037 12098  16.22  96.31
## 4  128751.64 145295.09 137023.36 2542 20.24  4579 10524  36.45  83.78
## 5  145295.09 161838.55 153566.82 3018 24.03  7597  7982  60.48  63.55
## 6  161838.55 178382.00 170110.28 2580 20.54 10177  4964  81.02  39.52
## 7  178382.00 194925.45 186653.72 1387 11.04 11564  2384  92.06  18.98
## 8  194925.45 211468.90 203197.17  613  4.88 12177   997  96.94   7.94
## 9  211468.90 228012.36 219740.63  237  1.89 12414   384  98.83   3.06
## 10 228012.36 244555.81 236284.08  103  0.82 12517   147  99.65   1.17
## 11 244555.81 261099.26 252827.54   28  0.22 12545    44  99.87   0.35
## 12 261099.26 277642.71 269370.98   10  0.08 12555    16  99.95   0.13
## 13 277642.71 294186.17 285914.44    3  0.02 12558     6  99.98   0.05
## 14 294186.17 310729.62 302457.90    3  0.02 12561     3 100.00   0.02
#Fila total de las sumas de ni y hi
fila_total_acero <- data.frame(
  Li = "TOTAL",
  Ls = "",
  MC = "",
  ni = sum(TDF_acero$ni),
  hi = round(sum(TDF_acero$hi),),
  Niasc = "",
  Nidsc = "",
  Hiasc = "",
  Hidsc = ""
)

TDF_acero_p <- rbind(TDF_acero, fila_total_acero)
print(TDF_acero_p)
##           Li        Ls        MC    ni     hi Niasc Nidsc Hiasc Hidsc
## 1   79121.28  95664.74  87393.01    26   0.21    26 12561  0.21   100
## 2   95664.74 112208.19 103936.46   437   3.48   463 12535  3.69 99.79
## 3  112208.19 128751.64 120479.92  1574  12.53  2037 12098 16.22 96.31
## 4  128751.64 145295.09 137023.36  2542  20.24  4579 10524 36.45 83.78
## 5  145295.09 161838.55 153566.82  3018  24.03  7597  7982 60.48 63.55
## 6  161838.55    178382 170110.28  2580  20.54 10177  4964 81.02 39.52
## 7     178382 194925.45 186653.72  1387  11.04 11564  2384 92.06 18.98
## 8  194925.45  211468.9 203197.17   613   4.88 12177   997 96.94  7.94
## 9   211468.9 228012.36 219740.63   237   1.89 12414   384 98.83  3.06
## 10 228012.36 244555.81 236284.08   103   0.82 12517   147 99.65  1.17
## 11 244555.81 261099.26 252827.54    28   0.22 12545    44 99.87  0.35
## 12 261099.26 277642.71 269370.98    10   0.08 12555    16 99.95  0.13
## 13 277642.71 294186.17 285914.44     3   0.02 12558     6 99.98  0.05
## 14 294186.17 310729.62  302457.9     3   0.02 12561     3   100  0.02
## 15     TOTAL                     12561 100.00
#TABLA DE DISTRIBUCIÓN DE CANTIDAD POR STURGES FINAL

tabla_acero_p <- TDF_acero_p %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº: 1*"),
    subtitle = md("Tabla de distribución del impacto de la producción de acero 
                  para la plataforma (Steel production pad)")
  ) %>%
  tab_source_note(
    source_note = md("Autor: GRUPO 4")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )


tabla_acero_p <- TDF_acero_p %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº: 1*"),
    subtitle = md("Tabla de distribución del impacto de la producción de acero")
  ) %>%
  tab_source_note(source_note = md("Autor: GRUPO 2"))

2. TABLA DE DISTRIBUCION AGRUPADA

histograma_acero <- hist(acero, plot = FALSE)

# 1. Detectar la longitud real del histograma para evitar errores de filas
k_real <- length(histograma_acero$counts)

# LIMITE INFERIOR SIMPLIFICADA
# Extraemos desde el primer corte hasta el penúltimo
lis <- histograma_acero$breaks[1:k_real]

# LIMITE SUPERIOR SIMPLIFICADA
# Extraemos desde el segundo corte hasta el último
lss <- histograma_acero$breaks[2:(k_real + 1)]

# MARCA DE CLASE
MC_f <- histograma_acero$mids

# Frecuencia absoluta (ni)
ni_f <- histograma_acero$counts

# Frecuencia relativa (hi)
hi_f <- (ni_f / sum(ni_f)) * 100

# Frecuencias Acumuladas
Niasc_f <- cumsum(ni_f)
Nidsc_f <- rev(cumsum(rev(ni_f)))
Hiasc_f <- round(cumsum(hi_f), 2)
Hidsc_f <- round(rev(cumsum(rev(hi_f))), 2)

# TABLA FINAL SIMPLIFICADA
TDF_acero_f <- round(data.frame(
  lis, lss, MC_f, ni_f, hi_f, Niasc_f, Nidsc_f, Hiasc_f, Hidsc_f
), 2)

# Visualizar la tabla simplificada
print(TDF_acero_f)
##       lis    lss   MC_f ni_f  hi_f Niasc_f Nidsc_f Hiasc_f Hidsc_f
## 1   60000  80000  70000    1  0.01       1   12561    0.01  100.00
## 2   80000 100000  90000   68  0.54      69   12560    0.55   99.99
## 3  100000 120000 110000  997  7.94    1066   12492    8.49   99.45
## 4  120000 140000 130000 2636 20.99    3702   11495   29.47   91.51
## 5  140000 160000 150000 3572 28.44    7274    8859   57.91   70.53
## 6  160000 180000 170000 3089 24.59   10363    5287   82.50   42.09
## 7  180000 200000 190000 1442 11.48   11805    2198   93.98   17.50
## 8  200000 220000 210000  511  4.07   12316     756   98.05    6.02
## 9  220000 240000 230000  184  1.46   12500     245   99.51    1.95
## 10 240000 260000 250000   45  0.36   12545      61   99.87    0.49
## 11 260000 280000 270000   11  0.09   12556      16   99.96    0.13
## 12 280000 300000 290000    3  0.02   12559       5   99.98    0.04
## 13 300000 320000 310000    2  0.02   12561       2  100.00    0.02
# --- FILA TOTAL DE LAS SUMAS DE ni Y hi (SIMPLIFICADA) ---

# FILA TOTAL
fila_total_acero_f <- data.frame(
  lis = "TOTAL",
  lss = "",
  MC_f = "",
  ni_f = sum(TDF_acero_f$ni_f),
  hi_f = round(sum(TDF_acero_f$hi_f),),
  Niasc_f = "",
  Nidsc_f = "",
  Hiasc_f = "",
  Hidsc_f = ""
)

# UNIÓN DE LA TABLA SIMPLIFICADA CON SU FILA TOTAL
TDF_acero_t <- rbind(TDF_acero_f, fila_total_acero_f)

# --- TABLA DE DISTRIBUCION DE CANTIDAD SIMPLIFICADA FINAL (GT) ---

tabla_acero_f <- TDF_acero_t %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº: 2*"),
    subtitle = md("Tabla de distribución simplificada del impacto de la producción de acero para la plataforma")
  ) %>%
  tab_source_note(
    source_note = md("Autor: GRUPO 4")
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE,
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  )

# Visualizar la tabla simplificada final
tabla_acero_f
Tabla Nº: 2
Tabla de distribución simplificada del impacto de la producción de acero para la plataforma
lis lss MC_f ni_f hi_f Niasc_f Nidsc_f Hiasc_f Hidsc_f
60000 80000 70000 1 0.01 1 12561 0.01 100
80000 1e+05 90000 68 0.54 69 12560 0.55 99.99
1e+05 120000 110000 997 7.94 1066 12492 8.49 99.45
120000 140000 130000 2636 20.99 3702 11495 29.47 91.51
140000 160000 150000 3572 28.44 7274 8859 57.91 70.53
160000 180000 170000 3089 24.59 10363 5287 82.5 42.09
180000 2e+05 190000 1442 11.48 11805 2198 93.98 17.5
2e+05 220000 210000 511 4.07 12316 756 98.05 6.02
220000 240000 230000 184 1.46 12500 245 99.51 1.95
240000 260000 250000 45 0.36 12545 61 99.87 0.49
260000 280000 270000 11 0.09 12556 16 99.96 0.13
280000 3e+05 290000 3 0.02 12559 5 99.98 0.04
3e+05 320000 310000 2 0.02 12561 2 100 0.02
TOTAL 12561 100.00
Autor: GRUPO 4

3. GRAFICAS DE DISTRIBUCION

# Definir colores de las barras basándonos en la cantidad de intervalos (ni_f)
colores <- gray.colors(length(ni_f), start = 0.3, end = 0.9)

# 2. Histograma de cantidad (Gráfica Nº2)
hist(
  acero,
  main = "Gráfica Nº2: Distribución del impacto de la producción de acero 
  para la plataforma (Steel production pad)",
  xlab = "Impacto del Acero (unidades de impacto)",
  ylab = "Cantidad de Pozos",
  col = colores
)

#  HISTOGRAMA CON LÍMITE AJUSTADO 

# Calculamos un límite superior dinámico basado en tus datos reales
max_frecuencia <- max(ni_f) + (max(ni_f) * 0.1) 

hist(
  acero,
  main = "Gráfica Nº3: Distribución del impacto de la producción de acero 
  para la plataforma (Steel production pad)",
  xlab = "Impacto del Acero (unidades de impacto)",
  ylab = "Cantidad de Pozos",
  col = colores,
  ylim = c(0, max_frecuencia)
)

# --- HISTOGRAMA DE CANTIDAD EN PORCENTAJE ---

# Usamos los límites superiores (lss) de nuestra tabla simplificada como etiquetas
etiquetas_x <- lss

# Distribución en porcentaje (Escala ajustada al máximo)
max_porcentaje <- max(hi_f) + 10

barplot(
  hi_f,
  names.arg = etiquetas_x,
  col = colores,
  ylim = c(0, 40),
  space = 0,
  cex.names = 0.6,
  ylab = "Porcentaje (%)",
  xlab = "Impacto del Acero (Límites Superiores)",
  main = "Gráfica Nº4: Distribución de cantidad en porcentaje del 
  impacto de acero en las plataformas de los pozos",
  las = 1
)

# Distribución en porcentaje (Escala completa 100%)
barplot(
  hi_f,
  names.arg = etiquetas_x,
  col = colores,
  ylim = c(0, 100),
  cex.names = 0.6,
  space = 0,
  ylab = "Porcentaje (%)",
  xlab = "Impacto del Acero (Límites Superiores)",
  main = "Gráfica Nº5: Distribución de cantidad en porcentaje del 
  impacto de acero en las plataformas de los pozos",
  las = 1
)

# DIAGRAMA DE CAJA 
boxplot(
  acero,
  horizontal = TRUE,
  main = "Gráfica Nº6: Distribución del impacto de la producción de acero 
  para la plataforma (Steel production pad)",
  xlab = "Impacto del Acero (unidades de impacto)",
  col = "gray" # Usamos un solo color para el boxplot por estética
)

#  PREPARACIÓN PARA OJIVAS 
# Convertir columnas a numéricas (asegurando que provengan de nuestra tabla TDF_acero_f)
Niasc_f <- as.numeric(TDF_acero_f$Niasc_f)
Nidsc_f <- as.numeric(TDF_acero_f$Nidsc_f)
Hiasc_f <- as.numeric(TDF_acero_f$Hiasc_f)
Hidsc_f <- as.numeric(TDF_acero_f$Hidsc_f)

#  GRÁFICA Nº7: OJIVAS COMBINADAS Ni (FRECUENCIA ABSOLUTA) 
plot(lss, Nidsc_f, type="o",
     main="Gráfica Nº7: Ojiva combinada del impacto del acero\n(Ni)",
     ylab="Cantidad Acumulada", 
     col="blue", 
     xlab="Impacto del Acero",
     pch=16)

# Añadimos la ojiva ascendente
lines(lis, Niasc_f, col="black", type="o", pch=16)

# --- GRÁFICA Nº8: OJIVAS COMBINADAS Hi (FRECUENCIA RELATIVA) ---
plot(lss, Hidsc_f, type="o",
     main="Gráfica Nº8: Ojiva combinada del impacto del acero\n(Hi)",
     ylab="Porcentaje Acumulado", 
     col="blue", 
     xlab="Impacto del Acero",
     ylim=c(0, 100),
     pch=16)

# Añadimos la ojiva ascendente en porcentaje
lines(lis, Hiasc_f, col="black", type="o", pch=16)

4. INDICADORES ESTADISTICOS

# Ver los cuartiles y resumen general
summary(acero)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   79121  136521  154798  156013  173025  310730
# --- INDICADORES ESTADÍSTICOS ---

# 1. POSICIÓN
# MEDIA ARITMÉTICA
x_acero <- mean(acero)

# MEDIANA Y RANGOS
ri_acero <- min(acero)
rs_acero <- max(acero)
Me_acero <- median(acero)

# 2. DISPERSIÓN
# DESVIACIÓN ESTÁNDAR
sd_acero <- sd(acero)

# COEFICIENTE DE VARIACIÓN
CV_acero <- ((sd_acero / x_acero) * 100)

# 3. FORMA
# Asegúrate de tener cargada la librería moments


# COEFICIENTE DE ASIMETRÍA
As_acero <- skewness(acero)

# COEFICIENTE DE CURTOSIS
K_acero <- kurtosis(acero)

# --- TABLA DE INDICADORES ESTADÍSTICOS ---



Variable_nombre <- c("Impacto prod. acero plataforma")
TablaIndicadores_acero <- data.frame(
  Variable_nombre, 
  ri_acero, 
  rs_acero, 
  round(x_acero, 2), 
  Me_acero, 
  round(sd_acero, 2), 
  round(CV_acero, 2), 
  round(As_acero, 2), 
  round(K_acero, 2)
)

colnames(TablaIndicadores_acero) <- c("Variable","mínimo","máximo","x","Me","sd","Cv (%)","As","K")

# Aseguramos que la librería esté activa
library(knitr)

# Creamos el data frame de indicadores (asegúrate de que los cálculos previos se hayan ejecutado)
Variable_nombre <- c("Impacto prod. acero plataforma")
TablaIndicadores_acero <- data.frame(
  Variable_nombre, 
  ri_acero, 
  rs_acero, 
  round(x_acero, 2), 
  Me_acero, 
  round(sd_acero, 2), 
  round(CV_acero, 2), 
  round(As_acero, 2), 
  round(K_acero, 2)
)

colnames(TablaIndicadores_acero) <- c("Variable","mínimo","máximo","x","Me","sd","Cv (%)","As","K")

# Ahora la función kable ya debería funcionar
kable(TablaIndicadores_acero, 
      format = "markdown", 
      caption = "Tabla N°3. Indicadores estadísticos de la variable impacto de la producción de acero para la plataforma (Steel production pad)")
Tabla N°3. Indicadores estadísticos de la variable impacto de la producción de acero para la plataforma (Steel production pad)
Variable mínimo máximo x Me sd Cv (%) As K
Impacto prod. acero plataforma 79121.28 310729.6 156012.9 154798.2 27225.15 17.45 0.5 0.56
# TABLA DE OUTLIERS CORREGIDA 

outliers_acero <- boxplot.stats(acero)$out 
num_outliers_acero <- length(outliers_acero) 

# Validamos si existen o no outliers antes de calcular min y max
if (num_outliers_acero > 0) {
  minoutliers_acero <- min(outliers_acero)
  maxoutliers_acero <- max(outliers_acero)
} else {
  # Si no hay, ponemos 0 para que la tabla sea legible
  minoutliers_acero <- 0
  maxoutliers_acero <- 0
}

# Crear la tabla de Outliers
TablaOutliers_acero <- data.frame(num_outliers_acero, minoutliers_acero, maxoutliers_acero)
colnames(TablaOutliers_acero) <- c("Outliers", "Mínimo", "Máximo")

# Mostrar tabla
kable(TablaOutliers_acero, format = "markdown", 
      caption = "Tabla N°4: Outliers de la variable impacto de la producción de acero.")
Tabla N°4: Outliers de la variable impacto de la producción de acero.
Outliers Mínimo Máximo
150 79121.28 310729.6

5. CONCLUSIÓN

## La variable impacto de la producción de acero para la plataforma presenta 
##     un comportamiento sumamente estable en los pozos de Nuevo México. 
##     A diferencia de otras variables mineras, esta no presenta valores 
##     atípicos (0 outliers), lo que indica que los procesos de construcción 
##     y uso de materiales están estandarizados. Con una acumulación de datos 
##     concentrada en los rangos bajos y medios, se concluye que el impacto 
##     ambiental derivado del acero es predecible y controlado, representando 
##     un riesgo bajo de desviaciones imprevistas en la planificación de la 
##     eficiencia operativa del proyecto.