#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??os1 ni1 hi1 Ni_asc1 Ni_dsc1 Hi_asc1 Hi_dsc1
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 - - - -
1 Valores de la frecuencia absoluta (ni), relativa (hi), y sus correspondientes acumuladas.
#========================= 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)