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)
| 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.
| 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.