##============================================================== ###
## UNIVERSIDAD CENTRAL DEL ECUADOR ###
##Facultad de Ingeniería en Geología,Minas, Petróleos y Ambiental ##
##===============================================================###
##Materia:Estadistica ======== Docente:Ing.Christian Mejía .E MSc.##
##===============================================================###
## Utilización del Programa R-Studio en Estadistica ##
###=============================================================####
##Expuesto- Proyecto Semestral ##
##===============================================================###
#Tema: Proyecto de Estadística en R ##
##===============================================================###
#Elaborado por: Jim Acuña ##
##===============================================================###
########################
###### Librerias #######
########################
library(dplyr)
library(ggplot2)
library(ggfortify)
library(tidyverse)
library(fdth)
library(lattice)
library(MASS)
library(PASWR)
library(magick)
library(readxl)
library(plotly)
library(psych)
library(car)
library(ggpmisc)
library(scatterplot3d)
library(corrplot)
library(GGally)
library(RSNNS)
#############################
#### Directorio de trabajo ##
#############################
setwd("D:/Personal/Escritorio/ESTADISTICA JIM/Kaggle")
Datos<-read.csv("market_pipe_thickness_loss_dataset_LIMPIO.csv", header = T, sep=";",dec =".", fileEncoding = "ISO-8859-1")
Datos <- na.omit(Datos)
str(Datos)
## 'data.frame': 1000 obs. of 11 variables:
## $ Pipe_Size : int 800 800 400 1500 1500 600 200 300 150 800 ...
## $ Thickness : num 15.5 22 12.1 38.7 24.3 ...
## $ Material : chr "Carbon Steel" "PVC" "Carbon Steel" "Carbon Steel" ...
## $ Grade : chr "ASTM A333 Grade 6" "ASTM A106 Grade B" "API 5L X52" "API 5L X42" ...
## $ Max_Pressure : int 300 150 2500 1500 1500 600 1500 900 300 150 ...
## $ Temperature : num 84.9 14.1 0.6 52.7 11.7 67.3 89.6 40.8 3.2 11.6 ...
## $ Corrosion_Impact: num 16.04 7.38 2.12 5.58 12.29 ...
## $ Thickness_Loss : num 4.91 7.32 6.32 6.2 8.58 5.21 5.86 3.02 2.47 0.53 ...
## $ Material_Loss : num 31.7 33.3 52.5 16 35.3 ...
## $ Time : int 2 4 7 19 20 11 6 21 19 1 ...
## $ Condition : chr "Moderate" "Critical" "Critical" "Critical" ...
names(Datos)
## [1] "Pipe_Size" "Thickness" "Material" "Grade"
## [5] "Max_Pressure" "Temperature" "Corrosion_Impact" "Thickness_Loss"
## [9] "Material_Loss" "Time" "Condition"
#View(Datos)
#Normalizacion de Variable Material Loss#
normalizacion<-normalizeData(Datos$Material_Loss,type ="0_1")
Datos$Material_Loss_norm<-as.data.frame(normalizacion)
summary(Datos$Material_Loss)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.08 15.66 31.66 46.75 61.03 318.75
summary(Datos$Material_Loss_norm)
## V1
## Min. :0.00000
## 1st Qu.:0.04891
## Median :0.09910
## Mean :0.14644
## 3rd Qu.:0.19128
## Max. :1.00000
#view(Datos)
######################################################################
#### Tablas de distribución de frecuencias (variables cualitativas) ##
######################################################################
# Material
TDF_Material <- Datos %>% count(Material) %>% mutate(hi = round(n / sum(n), 4),Porcentaje = round(hi * 100, 2))
TDF_Material
# Grade
TDF_Grade <- Datos %>% count(Grade) %>% mutate(hi = round(n / sum(n), 4), Porcentaje = round(hi * 100, 2))
TDF_Grade
# Condition
TDF_Condition <- Datos %>% count(Condition) %>% mutate(hi = round(n / sum(n), 4),Porcentaje = round(hi * 100, 2))
TDF_Condition
######################################################################
#### Graficas (variables cualitativas) ##
######################################################################
# Barras: Material (frecuencia absoluta)
ggplot(TDF_Material, aes(x = reorder(Material, -n), y = n)) +
geom_bar(stat = "identity", color = "black", fill=(c("red", "blue", "green", "yellow","orange"))) +
labs(title = "Distribución de Material (Frecuencia Absoluta)",
x = "Material", y = "Frecuencia")
# Circular: Material (Porcentual)
ggplot(TDF_Material, aes(x = "", y = Porcentaje, fill = Material)) +
geom_bar(stat = "identity", color = "black", width = 1) +
coord_polar(theta = "y") +
theme_void() +
geom_text(aes(label = paste(Porcentaje, "%")),
position = position_stack(vjust = 0.5), color = "black")+
labs(title = "Distribución de Material (Porcentaje)")
# Barras: Condition (frecuencia absoluta)
ggplot(TDF_Condition, aes(x = reorder(Condition, -n), y = n)) +
geom_bar(stat = "identity", color = "black", fill=(c("red", "blue", "green"))) +
labs(title = "Distribución de Condition (Frecuencia Absoluta)",
x = "Condition", y = "Frecuencia")
# Circular: Condition (Porcentual)
ggplot(TDF_Condition, aes(x = "", y = Porcentaje, fill = Condition)) +
geom_bar(stat = "identity", color = "black", width = 1) +
coord_polar(theta = "y") +
theme_void() +
geom_text(aes(label = paste0(Porcentaje, "%")),
position = position_stack(vjust = 0.5), color = "black") +
labs(title = "Distribución de Condition (Porcentaje)")
# Barras: Grade (frecuencia absoluta)
ggplot(TDF_Grade, aes(x = reorder(Grade, -n), y = n)) +
geom_bar(stat = "identity", color = "black", fill=(c("red", "blue", "green", "yellow","orange"))) +
labs(title = "Distribución de Grade (Frecuencia Absoluta)",
x = "Grade", y = "Frecuencia")
# Circular: Grade (Porcentual)
ggplot(TDF_Grade, aes(x = "", y = Porcentaje, fill = Grade)) +
geom_bar(stat = "identity", color = "black", width = 1) +
coord_polar(theta = "y") +
theme_void() +
geom_text(aes(label = paste(Porcentaje, "%")),
position = position_stack(vjust = 0.5), color = "black") +
labs(title = "Distribución de Grade (Porcentaje)")
####################################################################################
#1) Material
#La variable Material está bastante equilibrada: Fiberglass (21.9%), Carbon Steel (21.0%), Stainless Steel (20.1%), PVC (18.6%) y #HDPE (18.4%). Esto sugiere que el dataset no está dominado por un solo material, lo cual es positivo para comparaciones y para #evitar sesgos fuertes por represetación significativa de una categoría.
#2) Grade
#Grade también presenta una distribución relativamente balanceada, con un leve predominio de ASTM A333 Grade 6 (22.8%) y ASTM A106 #Grade B (21.2%), mientras que API 5L X52 (19.1%), API 5L X42 (18.6%) y API 5L X65 (18.3%) quedan cerca. En términos descriptivos, #esto permite evaluar comportamiento del deterioro sin que un grado reduzca la fiabilidad del análisis.
#3) Condition
#En Condition sí hay un desbalance claro: Critical representa 48.7%, Moderate 29.9% y Normal 21.4%. Esto indica que el dataset está orientado hacia condiciones más severas, por lo que los promedios globales de deterioro tenderán a reflejar un entorno de mayor riesgo.
#### Tablas de distribución de frecuencias y graficas (variables cuantitativas)##
####################################################################################
##Thickness Loss#####
#####################
x <- Datos$Thickness_Loss
x <- x[!is.na(x)]
n <- length(x)
# Número de clases (Sturges)
k <- ceiling(1 + 3.322 * log10(n))
# Intervalos
breaks <- pretty(range(x), n = k)
# Tabla de frecuencias por intervalos
clase <- cut(x, breaks = breaks, include.lowest = TRUE, right = TRUE)
tabla <- as.data.frame(table(clase))
names(tabla) <- c("Intervalo", "fi")
# Frecuencias relativas y acumuladas
tabla$hi <- round(tabla$fi / n, 4)
tabla$Fi <- cumsum(tabla$fi)
tabla$Hi <- round(cumsum(tabla$hi), 4)
# Marca de clase (xi)
tabla$xi <- (head(breaks, -1) + tail(breaks, -1)) / 2
# Tabla final
TDF_Thickness_Loss <- tabla[, c("Intervalo", "xi", "fi", "hi", "Fi", "Hi")]
TDF_Thickness_Loss
##Histograma: Thickness_Loss
Histo_Thickness_loss <- ggplot(Datos, aes(x = Thickness_Loss)) +
geom_histogram(breaks = breaks, color = "black", fill = "orange") +
geom_freqpoly(breaks = breaks, color = "black", linewidth = 1) +
labs(
title = "Histograma de Thickness Loss",
x = "Thickness Loss",
y = "Frecuencia",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.2), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Histo_Thickness_loss
#############################
## OJIVAS: Thickness_loss ###
#############################
ojiva_TL <- TDF_Thickness_Loss
# Frecuencia acumulada descendente (absoluta)
ojiva_TL$F_desc <- rev(cumsum(rev(ojiva_TL$fi)))
# Frecuencia acumulada descendente (relativa)
ojiva_TL$H_desc <- round(ojiva_TL$F_desc / sum(ojiva_TL$fi), 4)
############################################################
####### Ojiva ABSOLUTA (Fi ascendente y descendente) #######
############################################################
Ojiva_TL_abs <- ggplot(ojiva_TL) +
geom_line(aes(x = xi, y = Fi), color = "blue", linewidth = 1) +
geom_point(aes(x = xi, y = Fi), color = "blue", size = 2.5) +
geom_line(aes(x = xi, y = F_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = F_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada absoluta) de Thickness loss",
x = "Thickness loss",
y = "Frecuencia acumulada (Ni)",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, sum(ojiva_TL$fi)))
Ojiva_TL_abs
############################################################
####### Ojiva RELATIVA (Hi ascendente y descendente) #######
############################################################
Ojiva_TL_rel <- ggplot(ojiva_TL) +
geom_line(aes(x = xi, y = Hi), color = "green3", linewidth = 1) +
geom_point(aes(x = xi, y = Hi), color = "green3", size = 2.5) +
geom_line(aes(x = xi, y = H_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = H_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada relativa) de Thickness loss",
x = "Thickness loss",
y = "Frecuencia acumulada (Hi)",
caption = "Jim Acuña"
) +
scale_y_continuous(labels = function(z) paste0(round(z * 100, 0), "%")) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, 1))
Ojiva_TL_rel
############################################################
####### Diagrama de caja y bigotes para Thickness loss ###
############################################################
Caja_Thickness_loss <- ggplot(Datos, aes(x =Thickness_Loss, y = "" )) +
stat_boxplot(geom = "errorbar", width = 0.3) +
geom_boxplot(color = "black", fill = "pink",
outlier.colour = "black", outlier.shape = 1) +
labs(
title = "Diagrama de caja y bigotes de Thickness loss",
x = "",
y = "Thickness loss",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Caja_Thickness_loss
####################
#Thickness_Loss se distribuye en todo su rango (0.01 a 9.99) con tendencia casi simétrica: media ≈ 4.89 y mediana ≈ 4.92. En el boxplot se esperaría poca presencia de outliers, lo que sugiere variación amplia pero controlada dentro del rango típico del dataset.
##Material_Loss_norm#
#####################
x <- Datos$Material_Loss_norm
x <- x[!is.na(x)]
n <- length(x)
# Intervalos
breaks <- seq(0, 1, by = 0.1) #10 clases
# Tabla de frecuencias por intervalos
clase <- cut(x, breaks = breaks, include.lowest = TRUE, right = TRUE)
tabla <- as.data.frame(table(clase))
names(tabla) <- c("Intervalo", "fi")
# Frecuencias relativas y acumuladas
tabla$hi <- round(tabla$fi / n, 4)
tabla$Fi <- cumsum(tabla$fi)
tabla$Hi <- round(cumsum(tabla$hi), 4)
# Marca de clase (xi)
tabla$xi <- (head(breaks, -1) + tail(breaks, -1)) / 2
# Tabla final
TDF_Material_Loss_norm <- tabla[, c("Intervalo", "xi", "fi", "hi", "Fi", "Hi")]
TDF_Material_Loss_norm
##Histograma: Material_Loss_norm
Histo_Material_Loss_norm <- ggplot(data.frame(Material_Loss_norm=x), aes(x = Material_Loss_norm)) +
geom_histogram(breaks = breaks, color = "black", fill = "red") +
geom_freqpoly(breaks = breaks, color = "black", linewidth = 1) +
labs(
title = "Histograma de Material_Loss_norm",
x = "Material Loss norm",
y = "Frecuencia",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.2), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Histo_Material_Loss_norm
################################
## OJIVAS: Material_Loss_norm ##
################################
ojiva_MLn <- TDF_Material_Loss_norm
# Frecuencia acumulada descendente (absoluta)
ojiva_MLn$F_desc <- rev(cumsum(rev(ojiva_MLn$fi)))
# Frecuencia acumulada descendente (relativa)
ojiva_MLn$H_desc <- round(ojiva_MLn$F_desc / sum(ojiva_MLn$fi), 4)
############################################################
####### Ojiva ABSOLUTA (Fi ascendente y descendente) #######
############################################################
Ojiva_MLn_abs <- ggplot(ojiva_MLn) +
geom_line(aes(x = xi, y = Fi), color = "blue", linewidth = 1) +
geom_point(aes(x = xi, y = Fi), color = "blue", size = 2.5) +
geom_line(aes(x = xi, y = F_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = F_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada absoluta) de Material Loss norm",
x = "Material Loss norm",
y = "Frecuencia acumulada (Ni)",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, sum(ojiva_MLn$fi)))
Ojiva_MLn_abs
############################################################
####### Ojiva RELATIVA (Hi ascendente y descendente) #######
############################################################
Ojiva_MLn_rel <- ggplot(ojiva_MLn) +
geom_line(aes(x = xi, y = Hi), color = "green3", linewidth = 1) +
geom_point(aes(x = xi, y = Hi), color = "green3", size = 2.5) +
geom_line(aes(x = xi, y = H_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = H_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada relativa) de Material Loss norm",
x = "Material Loss norm",
y = "Frecuencia acumulada (Hi)",
caption = "Jim Acuña"
) +
scale_y_continuous(labels = function(z) paste0(round(z * 100, 0), "%")) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, 1))
Ojiva_MLn_rel
############################################################
####### Diagrama de caja y bigotes para Corrosion Impact ###
############################################################
Caja_Material_Loss_norm <- ggplot(data.frame(Material_Loss_norm=x), aes(x =Material_Loss_norm)) +
stat_boxplot(geom = "errorbar", width = 0.3) +
geom_boxplot(color = "black", fill = "pink",
outlier.colour = "black", outlier.shape = 1) +
labs(
title = "Diagrama de caja y bigotes de Material Loss norm",
x = "Material Loss norm",
y = "",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Caja_Material_Loss_norm
#####################
#La variable Material Loss es la que muestra el patrón estadístico más “crítico”: presenta un sesgo fuerte a la derecha y cola pesada (curtosis alta), lo cual se evidencia en la diferencia entre media (46.75) y mediana (31.66). Se identifican outliers altos, indicando un subconjunto de casos severos que inflan la media. Por lo tanto, la interpretación descriptiva para esta variable debe basarse en mediana, y percentiles, porque el promedio queda fuertemente afectado por pérdidas extremas. La versión normalizada Material Loss norm conserva exactamente la forma estadística de Material_Loss (misma asimetría y cola), pero en escala 0–1, lo cual facilita comparación e interpretación visual.
##Corrosion_Impact###
#####################
x <- Datos$Corrosion_Impact
x <- x[!is.na(x)]
n <- length(x)
# Número de clases (Sturges)
k <- ceiling(1 + 3.322 * log10(n))
# Intervalos
breaks <- pretty(range(x), n = k)
# Tabla de frecuencias por intervalos
clase <- cut(x, breaks = breaks, include.lowest = TRUE, right = TRUE)
tabla <- as.data.frame(table(clase))
names(tabla) <- c("Intervalo", "fi")
# Frecuencias relativas y acumuladas
tabla$hi <- round(tabla$fi / n, 4)
tabla$Fi <- cumsum(tabla$fi)
tabla$Hi <- round(cumsum(tabla$hi), 4)
# Marca de clase (xi)
tabla$xi <- (head(breaks, -1) + tail(breaks, -1)) / 2
# Tabla final
TDF_Corrosion_Impact <- tabla[, c("Intervalo", "xi", "fi", "hi", "Fi", "Hi")]
TDF_Corrosion_Impact
##Histograma: Corrosion_Impact
Histo_Corrosion_Impact <- ggplot(Datos, aes(x = Corrosion_Impact)) +
geom_histogram(breaks = breaks, color = "black", fill = "purple") +
geom_freqpoly(breaks = breaks, color = "black", linewidth = 1) +
labs(
title = "Histograma de Corrosion_Impact",
x = "Corrosion Impact",
y = "Frecuencia",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.2), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Histo_Corrosion_Impact
#############################
## OJIVAS: Corrosion_Impact ##
#############################
ojiva_CI <- TDF_Corrosion_Impact
# Frecuencia acumulada descendente (absoluta)
ojiva_CI$F_desc <- rev(cumsum(rev(ojiva_CI$fi)))
# Frecuencia acumulada descendente (relativa)
ojiva_CI$H_desc <- round(ojiva_CI$F_desc / sum(ojiva_CI$fi), 4)
############################################################
####### Ojiva ABSOLUTA (Fi ascendente y descendente) #######
############################################################
Ojiva_CI_abs <- ggplot(ojiva_CI) +
geom_line(aes(x = xi, y = Fi), color = "blue", linewidth = 1) +
geom_point(aes(x = xi, y = Fi), color = "blue", size = 2.5) +
geom_line(aes(x = xi, y = F_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = F_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada absoluta) de Corrosion Impact",
x = "Corrosion Impact",
y = "Frecuencia acumulada (Ni)",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, sum(ojiva_CI$fi)))
Ojiva_CI_abs
############################################################
####### Ojiva RELATIVA (Hi ascendente y descendente) #######
############################################################
Ojiva_CI_rel <- ggplot(ojiva_CI) +
geom_line(aes(x = xi, y = Hi), color = "green3", linewidth = 1) +
geom_point(aes(x = xi, y = Hi), color = "green3", size = 2.5) +
geom_line(aes(x = xi, y = H_desc), color = "red", linewidth = 1) +
geom_point(aes(x = xi, y = H_desc), color = "red", size = 2.5) +
labs(
title = "Ojiva (Frecuencia acumulada relativa) de Corrosion Impact",
x = "Corrosion Impact",
y = "Frecuencia acumulada (Hi)",
caption = "Jim Acuña"
) +
scale_y_continuous(labels = function(z) paste0(round(z * 100, 0), "%")) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
) +
expand_limits(y = c(0, 1))
Ojiva_CI_rel
############################################################
####### Diagrama de caja y bigotes para Corrosion Impact ###
############################################################
Caja_Corrosion_Impact <- ggplot(Datos, aes(x = Corrosion_Impact, y = "")) +
stat_boxplot(geom = "errorbar", width = 0.3) +
geom_boxplot(color = "black", fill = "pink",
outlier.colour = "black", outlier.shape = 1) +
labs(
title = "Diagrama de caja y bigotes de Corrosion Impact",
x = "Corrosion Impact",
y = "",
caption = "Jim Acuña"
) +
theme(
plot.title = element_text(size = rel(1.1), hjust = 0.5, face = "bold"),
plot.caption = element_text(hjust = 0.5, face = "italic")
)
Caja_Corrosion_Impact
#Corrosion_Impact presenta un comportamiento prácticamente simétrico: media 9.75 y mediana 9.72, no aparecen outliers. Esto sugiere que el impacto de corrosión está distribuido de forma extendida a lo largo de su dominio, sin valores atípicos que distorsionen el resumen central.
##Max_Pressure
#####################
#### Max_Pressure ###
#####################
TDF_Max_Pressure <- Datos %>% count(Max_Pressure) %>% mutate(hi = round(n / sum(n), 4),Porcentaje = round(hi * 100, 2))
TDF_Max_Pressure
# Barras: Max_Pressure (frecuencia absoluta)
ggplot(TDF_Max_Pressure, aes(x = reorder(Max_Pressure, -n), y = n)) +
geom_bar(stat = "identity", color = "black", fill=(c("red", "blue", "green", "yellow","orange","purple"))) +
labs(title = "Distribución de Max Pressure (Frecuencia Absoluta)",
x = "Max_Pressure", y = "Frecuencia")
# Circular: Max_Pressure (Porcentual)
ggplot(TDF_Max_Pressure, aes(x = "", y = Porcentaje, fill = Max_Pressure)) +
geom_bar(stat = "identity", color = "black", width = 1) +
coord_polar(theta = "y") +
theme_void() +
geom_text(aes(label = paste(Porcentaje, "%")),
position = position_stack(vjust = 0.5), color = "black") +
labs(title = "Distribución de Max Pressure (Porcentaje)")
### Conclusion Max_Pressure
#Max_Pressure aparece muy uniforme: cada nivel está alrededor del 16–17% (150, 300, 600, 900, 1500, 2500). Esta uniformidad sugiere que el dataset está diseñado o muestreado para cubrir rangos de presión de forma homogénea, lo que ayuda a comparar el deterioro sin concentrarse solo en una presión.