#Carga de datos
tablap <- read.csv("C:/Users/HP/Documents/PROYECTO ESTADISTICA/RStudio/tablap.csv",
header=TRUE,
sep=";",
dec=".")
# =================================================================
# PASO 10.1: C??LCULO DE PAR??METROS Y CREACI??N DE RANGOS
# =================================================================
# Parametros de la variable
datos_vida_util <- tablap$Estimated.lifetime # La variable de inter??s
N <- length(datos_vida_util) # N = Total de observaciones
Max_Dato <- max(datos_vida_util, na.rm = TRUE)
Min_Dato <- min(datos_vida_util, na.rm = TRUE)
Rango_Dato <- Max_Dato - Min_Dato
# F??rmula de Sturges
k_sturges <- 1 + 3.322 * log10(N)
k <- ceiling(k_sturges)
# L??mite m??ximo de 10 filas
if (k > 10) {
k <- 10
}
A <- ceiling(Rango_Dato / k)
# Agrupar los datos
Limites <- seq(from = Min_Dato, by = A, length.out = k + 1)
Vida_Util_Agrupada <- cut(
datos_vida_util,
breaks = Limites,
right = TRUE,
include.lowest = TRUE
)
# =================================================================
# PASO 10.2: C??LCULO DE FRECUENCIAS
# =================================================================
# 1. Frecuencias Simples (ni y hi)
ni <- table(Vida_Util_Agrupada)
total_n <- sum(ni)
hi <- (ni / total_n) * 100
# 2. Frecuencias Acumuladas
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_dsc <- rev(cumsum(rev(hi)))
# =================================================================
# PASO 10.3: CREACI??N DE TABLA FINAL
# =================================================================
Anios_Rangos <- names(ni)
Anios_Rangos_Limpio <- gsub("\\[|\\]|\\(|\\)", "", Anios_Rangos)
Anios_Rangos_Limpio <- gsub(",", " - ", Anios_Rangos_Limpio)
# 2. Creaci??n de la TDF
TDF_Vida_Util_COMPLETA <- data.frame(
Anios = Anios_Rangos_Limpio,
ni = as.numeric(ni),
hi = round(as.numeric(hi), 2),
Ni_asc = as.numeric(Ni_asc),
Ni_dsc = as.numeric(Ni_dsc),
Hi_asc = round(as.numeric(Hi_asc), 2),
Hi_dsc = round(as.numeric(Hi_dsc), 2)
)
# 3. Agregamos la fila de Totales
Fila_Total_Vida_Util <- data.frame(
Anios = "Total",
ni = total_n,
hi = sum(hi),
Ni_asc = "-",
Ni_dsc = "-",
Hi_asc = "-",
Hi_dsc = "-"
)
# 4. Combinamos la tabla de frecuencias con los totales
TDF_Vida_Util_FINAL <- rbind(TDF_Vida_Util_COMPLETA, Fila_Total_Vida_Util)
# Imprimimos la tabla final
print(TDF_Vida_Util_FINAL)
## Anios ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
## 1 25 - 30 178 1.42 178 12561 1.42 100
## 2 30 - 35 0 0.00 178 12383 1.42 98.58
## 3 35 - 40 0 0.00 178 12383 1.42 98.58
## 4 40 - 45 0 0.00 178 12383 1.42 98.58
## 5 45 - 50 10209 81.28 10387 12383 82.69 98.58
## 6 50 - 55 311 2.48 10698 2174 85.17 17.31
## 7 55 - 60 395 3.14 11093 1863 88.31 14.83
## 8 60 - 65 628 5.00 11721 1468 93.31 11.69
## 9 65 - 70 666 5.30 12387 840 98.61 6.69
## 10 70 - 75 174 1.39 12561 174 100 1.39
## 11 Total 12561 100.00 - - - -
#===================== TABLA NRO. 3 (FORMATO GT) =======================
library(gt)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
cols_a_limpiar <- c("ni", "hi", "Ni_asc", "Ni_dsc", "Hi_asc", "Hi_dsc")
TDF_GT_Final <- TDF_Vida_Util_FINAL %>%
mutate(across(all_of(cols_a_limpiar), as.character)) %>%
mutate(across(all_of(cols_a_limpiar), ~na_if(., "-"))) %>%
mutate(across(c(ni, Ni_asc, Ni_dsc), as.numeric),
across(c(hi, Hi_asc, Hi_dsc), as.numeric)) %>%
select(Anios, ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)
Tabla_Nro_3 <- TDF_GT_Final %>%
gt() %>%
cols_label(
Anios = md("A??os"),
ni = md("ni"),
Ni_asc = md("Ni_asc"),
Ni_dsc = md("Ni_dsc"),
hi = md("hi"),
Hi_asc = md("Hi_asc"),
Hi_dsc = md("Hi_dsc")
) %>%
fmt_number(
columns = c(hi, Hi_asc, Hi_dsc),
decimals = 2,
sep_mark = ".",
dec_mark = ","
) %>%
fmt_number(
columns = c(ni, Ni_asc, Ni_dsc),
decimals = 0,
sep_mark = ".",
dec_mark = ","
) %>%
#T??tulos
tab_header(
title = md("**Tabla Nro. 3: Distribuci??n de Frecuencias de la Estimaci??n de Vida ??til**"),
subtitle = md("Variable Cuantitativa Discreta Agrupada (A??os)")
) %>%
# Notas al Pie
tab_footnote(
footnote = "Valores de la frecuencia absoluta (ni), relativa (hi), y sus correspondientes acumuladas.",
locations = cells_column_labels(columns = everything())
) %>%
# Estilos
tab_style(
style = cell_fill(color = "#F0F0F0"),
locations = cells_body(rows = Anios == "Total")
) %>%
sub_missing(
columns = everything(),
missing_text = "-"
) %>%
tab_style(
style = cell_borders(sides = "top", color = "#000000", weight = px(3)),
locations = cells_body(rows = Anios == "Total")
)
# Imprimir la tabla GT
Tabla_Nro_3
| Tabla Nro. 3: Distribuci??n de Frecuencias de la Estimaci??n de Vida ??til |
| Variable Cuantitativa Discreta Agrupada (A??os) |
| A??os |
ni |
hi |
Ni_asc |
Ni_dsc |
Hi_asc |
Hi_dsc |
| 25 - 30 |
178 |
1,42 |
178 |
12.561 |
1,42 |
100,00 |
| 30 - 35 |
0 |
0,00 |
178 |
12.383 |
1,42 |
98,58 |
| 35 - 40 |
0 |
0,00 |
178 |
12.383 |
1,42 |
98,58 |
| 40 - 45 |
0 |
0,00 |
178 |
12.383 |
1,42 |
98,58 |
| 45 - 50 |
10.209 |
81,28 |
10.387 |
12.383 |
82,69 |
98,58 |
| 50 - 55 |
311 |
2,48 |
10.698 |
2.174 |
85,17 |
17,31 |
| 55 - 60 |
395 |
3,14 |
11.093 |
1.863 |
88,31 |
14,83 |
| 60 - 65 |
628 |
5,00 |
11.721 |
1.468 |
93,31 |
11,69 |
| 65 - 70 |
666 |
5,30 |
12.387 |
840 |
98,61 |
6,69 |
| 70 - 75 |
174 |
1,39 |
12.561 |
174 |
100,00 |
1,39 |
| Total |
12.561 |
100,00 |
- |
- |
- |
- |
#========================= HISTOGRAMA NRO. 1 ===============================
library(ggplot2)
library(dplyr)
# CARGA DE DATOS (xi)
Datos_Histograma <- TDF_Vida_Util_FINAL %>%
filter(Anios != "Total")
# Convertimos los rangos de 'A??os' a l??mites num??ricos para calcular xi
Datos_Histograma <- Datos_Histograma %>%
mutate(
LI = as.numeric(gsub(" - .*$", "", Anios)),
LS = as.numeric(gsub(".* - ", "", Anios)),
xi = (LI + LS) / 2
)
Datos_Histograma$ni <- as.numeric(Datos_Histograma$ni)
# GENERACI??N DEL HISTOGRAMA
Ac <- Datos_Histograma$LS[1] - Datos_Histograma$LI[1]
Histograma_Nro_1_Gris <- ggplot(Datos_Histograma, aes(x = xi, y = ni)) +
geom_col(
width = Ac,
color = "black",
fill = "#595959"
) +
# Etiquetas de Ejes y T??tulo
labs(
title = "Gr??fico Nro. 1: Histograma de la Estimaci??n de Vida ??til",
subtitle = "Distribuci??n de Frecuencias de la Vida ??til (A??os)",
x = "Vida ??til Estimada (A??os)",
y = "Frecuencia Absoluta (ni)"
) +
scale_x_continuous(
breaks = unique(c(Datos_Histograma$LI, Datos_Histograma$LS))
) +
# Tema y Estilos
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1)
)
# Imprimir el Histograma
Histograma_Nro_1_Gris

#====================HOJIVAS NRO. 2 ======================
library(ggplot2)
library(dplyr)
# PASO 13.1: CREACI??N DE DATOS PARA OJIVAS (FINALMENTE CORREGIDO)
# 1. Creamos un data frame auxiliar con los l??mites y las Ni acumuladas
Datos_Ojiva <- TDF_Vida_Util_FINAL %>%
filter(Anios != "Total") %>%
mutate(
LI = as.numeric(gsub(" - .*$", "", Anios)),
LS = as.numeric(gsub(".* - ", "", Anios)),
Ni_asc = as.numeric(Ni_asc),
Ni_dsc = as.numeric(Ni_dsc)
) %>%
select(LI, LS, Ni_asc, Ni_dsc)
# 2. Preparamos el punto de inicio de la Ojiva Ascendente (LI del 1er intervalo, Acumulado 0)
Inicio_Ascendente <- data.frame(
Limite = Datos_Ojiva$LI[1],
Acumulado = 0,
Tipo = "Ojiva Ascendente"
)
# 3. Preparamos el punto de inicio de la Ojiva Descendente (LI del 1er intervalo, Acumulado = N)
Inicio_Descendente <- data.frame(
Limite = Datos_Ojiva$LI[1],
Acumulado = N, # <-- Usa la variable N del inicio del script
Tipo = "Ojiva Descendente"
)
# 4. Preparamos los datos intermedios para la Ascendente (Usa L??mite Superior)
Ascendente <- Datos_Ojiva %>%
mutate(
Limite = LS,
Acumulado = Ni_asc,
Tipo = "Ojiva Ascendente"
) %>%
select(Limite, Acumulado, Tipo)
# 5. Preparamos los datos intermedios para la Descendente (Usa L??mite Inferior)
Descendente <- Datos_Ojiva %>%
mutate(
Limite = LI,
Acumulado = Ni_dsc,
Tipo = "Ojiva Descendente"
) %>%
select(Limite, Acumulado, Tipo)
# 6. Agregamos el punto final para la Ojiva Descendente (LS del ??ltimo intervalo, Acumulado 0)
Fin_Descendente <- data.frame(
Limite = Datos_Ojiva$LS[nrow(Datos_Ojiva)],
Acumulado = 0,
Tipo = "Ojiva Descendente"
)
# 7. Combinamos todos los datos necesarios en el objeto requerido: Datos_Combinados_Ojiva
Datos_Combinados_Ojiva <- bind_rows(
Inicio_Ascendente,
Inicio_Descendente,
Ascendente,
Descendente,
Fin_Descendente
) %>%
arrange(Tipo, Limite)
# GENERAMOS GR??FICO (OJIVAS)
Ojivas_Superpuestas_Nro_2 <- ggplot(Datos_Combinados_Ojiva, aes(x = Limite, y = Acumulado, color = Tipo)) +
geom_line(linewidth = 0.8) +
geom_point(shape = 1, size = 3, stroke = 0.5) + # Borde delgado para los puntos
# Etiquetas y T??tulo
labs(
title = "Gr??fico Nro. 2: Ojivas Superpuestas (Frecuencia Absoluta Acumulada)",
subtitle = "Frecuencia Absoluta Acumulada (Ni)",
x = "Vida ??til Estimada (A??os)",
y = "Frecuencia Absoluta Acumulada (Ni)",
color = "Tipo de Ojiva"
) +
scale_x_continuous(
breaks = unique(c(Datos_Ojiva$LI, Datos_Ojiva$LS))
) +
# Tema y Estilos
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 45, hjust = 1)
)
# Imprimir el Gr??fico
Ojivas_Superpuestas_Nro_2

#========================== BOXPLOT NRO. 3 =========================
library(ggplot2)
library(dplyr)
n_total <- length(datos_vida_util)
Datos_Para_Boxplot <- data.frame(
Vida_Util = datos_vida_util
)
# GENERACI??N DEL BOXPLOT
Boxplot_Horizontal_Personalizado_Nro_3 <- ggplot(Datos_Para_Boxplot, aes(y = Vida_Util)) +
# Dibujamos el Boxplot
geom_boxplot(
fill = "#D3D3D3",
color = "black",
linewidth = 0.5,
# Estilo de los OUTLIERS
outlier.color = "red",
outlier.fill = "white",
outlier.shape = 21,
outlier.size = 2.5,
outlier.stroke = 1.0
) +
coord_flip() +
labs(
title = "Gr??fico Nro. 3: Boxplot de la Estimaci??n de Vida ??til (Formato Personalizado)",
subtitle = paste("Basado en", n_total, "observaciones originales"),
x = "Vida ??til Estimada (A??os)",
y = ""
) +
theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5),
axis.title.x = element_text(vjust = -0.5)
)
# Imprimir el Gr??fico
print(Boxplot_Horizontal_Personalizado_Nro_3)
