# Variable Discreta
#Fecha
#Autor: Ariana Viteri
#Fecha:04/087/2026

0.- Carga de Librerías

library(gt)
## Warning: package 'gt' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## 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
library(e1071)
## Warning: package 'e1071' was built under R version 4.5.3

1.- Carga de Datos

# 1. CARGA DE DATOS
TDFDate <-read.csv("~/semestre 3 y 4/Estadistica/Datos Cambiados.csv",
                     header = TRUE, dec = ".", sep = ",")

2.- Seleccionar variable

# 2. SELECCIONAR LA VARIABLE
# Preparación de Datos: Convertir a formato de fecha R
TDFDate$Date_Convertida <- as.Date(TDFDate$Date, format = "%d/%m/%Y")

# Agrupación por Año:
grupos_Anio <- format(TDFDate$Date_Convertida, format = "%Y")
grupos_Anio_limpio <- grupos_Anio[!is.na(grupos_Anio)]

3.- Frecuencias

# 3. FRECUENCIAS
tabla_frecuencia <- as.data.frame(table(grupos_Anio_limpio))

# AQUI AÑADIMOS LA JERARQUÍA DESCENDENTE (2020 → 2015)
tabla_frecuencia <- tabla_frecuencia[order(-as.numeric(as.character(tabla_frecuencia$grupos_Anio_limpio))), ]

# Asignación de Variables
Anio <- tabla_frecuencia$grupos_Anio_limpio
ni <- tabla_frecuencia$Freq            

# Cálculos Derivados (Frecuencias relativas y acumuladas)
hi <- ni / sum(ni) * 100

# 4. TABLA DE DISTRIBUCIÓN DE FRECUENCIAS
TDFAnioFin <- data.frame(Anio, ni, hi)

# --- INCLUSIÓN DE LA FILA TOTAL ---
total_ni <- sum(ni)
total_hi <- sum(hi) 

# CREACIÓN DE TDFAnioCompleto (La variable que gt necesita)
TDFAnioCompleto <- rbind(TDFAnioFin, 
                         data.frame(Anio = "Total",
                                    ni = total_ni, 
                                    hi = total_hi))


# Limpiar nombres de columnas (esto suele causar problemas con GT/Markdown)
colnames(TDFAnioCompleto) <- c("Anio", "ni ", "hi (%)")

# Asegurar que las columnas sean de tipo character/numeric para gt
TDFAnioCompleto$Anio <- as.character(TDFAnioCompleto$Anio)
TDFAnioCompleto$`hi (%)` <- round(TDFAnioCompleto$`hi (%)`, 2) # Redondear porcentajes

4.- Tabla distribución de frecuencia

library(gt)
library(dplyr)
TDFAnioCompleto %>%
  gt() %>%
  cols_label(
    Anio = "Año",
    `ni ` = "ni",
    `hi (%)` = "hi (%)"
  ) %>%
  tab_header(
    title = md("Tabla Nro. 1"),
    subtitle = md("Distribución de registros por año en el estudio de calidad del aire en India (2015-2020)")
  ) %>%
  tab_source_note(
    source_note = md("Fuente: Datos procesados por el autor a partir de archivo city.day.csv")
  ) %>%
  tab_style(
    style = cell_borders(sides = "left", color = "black", weight = px(2)),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_borders(sides = "right", color = "black", weight = px(2)),
    locations = cells_body()
  ) %>%
  tab_style(
    style = cell_borders(sides = "left", color = "black", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "right", color = "black", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  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 Nro. 1
Distribución de registros por año en el estudio de calidad del aire en India (2015-2020)
Año ni hi (%)
2020 4646 15.73
2019 7446 25.21
2018 6471 21.91
2017 4689 15.88
2016 3478 11.78
2015 2801 9.48
Total 29531 100.00
Fuente: Datos procesados por el autor a partir de archivo city.day.csv

5.- Gráfica distribución de frecuencia

5.1 Diagrama generado por Rstudio

# 5. GRAFICA DE DISTRIBUCIÓN DE FRECUENCIA
## 5.1 DIAGRAMAS DE CANTIDAD LOCAL
barplot(TDFAnioFin$ni, 
        main = "Gráfico Nº1: Frecuencia de la muestra distribuida por año en la India 2015-2020",
        xlab = "Año ", 
        ylab = "Cantidad ",
        cex.main = 1,
        names.arg = TDFAnioFin$Anio,
        las = 1,
        col = "skyblue3")

5.2 Diagrama generado por Rstudio con respecto al total

# Calcular el límite Y
limite_y <- sum(TDFAnioFin$ni)

barplot(TDFAnioFin$ni,
        main = "Gráfico Nº2: Frecuencia de la muestra distribuida por año en la India 2015-2020",
        xlab = "",
        ylab = "", 
        cex.names = 0.9,
        cex.main = 1,
        names.arg = TDFAnioFin$Anio,
        las = 0.9,
        col = "skyblue3",
        ylim = c(0, limite_y))
mtext(text = "Cantidad",
      side = 2,
      line = 2.2) 
mtext(text = "Año",
      side = 1,
      line = 2)

5.3 Diagrama porcentual generado por R studio

# Histograma de barras de porcentaje
library(RColorBrewer)

# Número de barras
n <- length(TDFAnioFin$Anio)

# Color celeste medio oscuro
color_barra <- "steelblue3"

# Porcentaje local (frecuencia relativa)
hi_local <- TDFAnioFin$hi

# Límite Y automático
ylim_local <- c(0, max(hi_local) * 1.1)

# Gráfico de barras
barplot(
  height = hi_local,
  names.arg = TDFAnioFin$Anio,
  main = "Gráfica Nro 3: Distribución porcentual de la muestra por año en India (2015-2020)",
  xlab = "Año",
  ylab = "Porcentaje",
  col = color_barra,
  ylim = ylim_local,
  las = 1,
  cex.names = 0.8,
  cex.main = 1,
  mgp = c(3, 1, 0)
)

5.4 Diagrama porcentual generado por R studio con respecto al todo

barplot(TDFAnioFin$hi, 
        main = "Gráfico Nº4: Frecuencia de la muestra distribuida
        por año en la India 2015-2020",
        xlab = "Año",   
        ylab = "Porcentaje", 
        names.arg = TDFAnioFin$Anio, 
        las = 1, 
        col = "steelblue3",
        mgp = c(3.1, 1, 0),
        ylim = c(0, 100))

6.- Diagrama de caja

# ===========================
#DIAGRAMA DE CAJA
# ===========================

# Ajustar márgenes
par(mar = c(4, 6, 4, 2))

# Diagrama de caja de las frecuencias por año
boxplot(
  TDFAnioFin$ni,
  
  horizontal = TRUE,
  
  main = "Gráfica Nro. 5\nDistribución de la frecuencia por año en India (2015-2020)",
  
  xlab = "Año",
  
  col = "#76D7C4",
  
  border = "black",
  
  pch = 1,
  
  cex.main = 1,
  cex.lab = 1,
  
  las = 1
)

# Cuadrícula
grid(
  nx = NULL,
  ny = NA,
  col = "gray85",
  lty = 1
)

7.- Diagrama de ojivas

# =====================================================
# PREPARACIÓN DE DATOS PARA LAS OJIVAS
# =====================================================

# Años en orden ascendente
Anio_Asc <- rev(as.numeric(as.character(TDFAnioFin$Anio)))

# Frecuencias en orden ascendente
ni_Asc <- rev(TDFAnioFin$ni)

# Frecuencia acumulada ascendente (Menor que)
Ni_Asc <- cumsum(ni_Asc)

# Frecuencia acumulada descendente (Mayor que)
Ni_Desc <- rev(cumsum(rev(ni_Asc)))

# Total de registros
N <- sum(ni_Asc)


# GRÁFICA: OJIVAS DEL AÑO
# =====================================================

par(mar = c(5, 6, 4, 2) + 0.1)

# Ojiva ascendente
plot(
  Anio_Asc, Ni_Asc,
  
  type = "b",
  col = "orange",
  pch = 19,
  lwd = 2,
  
  main = "Gráfica Nro. 6: Distribución Acumulada (Ojivas)\nde los registros por año en India (2015-2020)",
  
  xlab = "Año",
  ylab = "",
  
  ylim = c(0, N),
  
  xaxt = "n",
  yaxt = "n",
  
  las = 1
)

# Etiqueta del eje Y (se puede mover con line)
mtext(
  text = "Cantidad",
  side = 2,
  line = 4
)

# Ojiva descendente
lines(
  Anio_Asc, Ni_Desc,
  
  type = "b",
  col = "blue",
  pch = 19,
  lwd = 2
)

# Eje X
axis(
  1,
  at = Anio_Asc,
  labels = Anio_Asc,
  las = 1,
  cex.axis = 0.9
)

# Eje Y
marcas_y <- pretty(c(0, N))

axis(
  2,
  at = marcas_y,
  labels = marcas_y,
  las = 1,
  cex.axis = 0.9
)

# Cuadrícula
grid(
  nx = NULL,
  ny = NA,
  col = "gray85",
  lty = 1
)

# Leyenda
legend(
  "topright",
  
  legend = c(
    "Ascendente (Menor que)",
    "Descendente (Mayor que)"
  ),
  
  col = c("orange", "blue"),
  pch = 19,
  lty = 1,
  lwd = 2,
  
  inset = c(0.06, 0.80),
  
  bty = "o",
  bg = "white",
  cex = 0.9
)

# =====================================================
# PREPARACIÓN DE DATOS PARA LA OJIVA PORCENTUAL
# =====================================================

Hi_Asc <- Ni_Asc / N * 100
Hi_Desc <- Ni_Desc / N * 100

# =====================================================
# GRÁFICA Nro. 7: OJIVAS PORCENTUALES DEL AÑO
# =====================================================

par(mar = c(5, 6, 4, 2) + 0.1)

# Ojiva porcentual ascendente
plot(
  Anio_Asc, Hi_Asc,
  
  type = "b",
  col = "orange",
  pch = 19,
  lwd = 2,
  
  main = "Gráfica Nro. 7: Distribución Acumulada Porcentual de Ojivas\nde los registros por año en India (2015-2020)",
  
  xlab = "Año",
  ylab = "",
  
  ylim = c(0, 100),
  
  xaxt = "n",
  yaxt = "n",
  
  las = 1
)

# Etiqueta del eje Y
mtext(
  text = "Porcentaje ",
  side = 2,
  line = 4
)

# Ojiva porcentual descendente
lines(
  Anio_Asc, Hi_Desc,
  
  type = "b",
  col = "blue",
  pch = 19,
  lwd = 2
)

# Eje X
axis(
  1,
  at = Anio_Asc,
  labels = Anio_Asc,
  las = 1,
  cex.axis = 0.9
)

# Eje Y
marcas_y <- seq(0, 100, by = 20)

axis(
  2,
  at = marcas_y,
  labels = paste0(marcas_y, ""),
  las = 1,
  cex.axis = 0.9
)

# Cuadrícula
grid(
  nx = NULL,
  ny = NA,
  col = "gray85",
  lty = 1
)

# Leyenda
legend(
  "topright",
  
  legend = c(
    "Ascendente (Menor que)",
    "Descendente (Mayor que)"
  ),
  
  col = c("orange", "blue"),
  pch = 19,
  lty = 1,
  lwd = 2,
  inset = c(0.06, 0.80),
  bty = "o",
  bg = "white",
  
  cex = 0.9
)

8.- Indicadores

# =====================================================
# 8. INDICADORES ESTADÍSTICOS
# =====================================================

# Convertir la variable Año a numérica
Anio <- as.numeric(grupos_Anio_limpio)

# ===========================
# 8.1 TENDENCIA CENTRAL
# ===========================

# Media
media <- mean(Anio)

# Mediana
mediana <- median(Anio)

# Moda
tabla_moda <- table(Anio)
moda <- names(tabla_moda)[tabla_moda == max(tabla_moda)]
moda <- paste(moda, collapse = ", ")

# ===========================
# 8.2 DISPERSIÓN
# ===========================

# Rango
rango <- paste(min(Anio), "-", max(Anio))

# Varianza
varianza <- var(Anio)

# Desviación estándar
desviacion <- sd(Anio)

# Coeficiente de variación
cv <- round((desviacion / media) * 100, 2)

# ===========================
# 8.3 FORMA
# ===========================

# Asimetría
asimetria <- skewness(Anio, type = 2)

# Curtosis
curtosis <- kurtosis(Anio)

# ===========================
# VALORES ATÍPICOS
# ===========================

Q1 <- quantile(Anio, 0.25)
Q3 <- quantile(Anio, 0.75)

RIC <- IQR(Anio)

LI <- Q1 - 1.5 * RIC
LS <- Q3 + 1.5 * RIC

atipicos <- Anio[Anio < LI | Anio > LS]

if(length(atipicos) == 0){
  atipicos <- "No existen"
}else{
  atipicos <- paste(atipicos, collapse = ", ")
}

# =====================================================
# TABLA Nro. 2: INDICADORES ESTADÍSTICOS
# =====================================================

library(gt)
Tabla_indicadores <- data.frame(
  Medida = c("Media", "Mediana", "Moda",
             "Rango", "Varianza", "Desviación estándar",
             "Coeficiente de variación (%)",
             "Asimetría", "Curtosis",
             "Valores atípicos"),
  
  Valor = c(
    round(media, 0),
    round(mediana, 2),
    moda,
    rango,
    round(varianza, 2),
    round(desviacion, 2),
    round(cv, 2),
    round(asimetria, 2),
    round(curtosis, 2),
    atipicos
  )
)
Tabla_indicadores %>%
  gt() %>%
  
  tab_header(
    title = md("**Tabla Nro. 2**"),
    subtitle = md("Indicadores estadísticos de la variable Año en India de 2015-2020")
  ) %>%
  
  cols_align(
    align = "center",
    columns = everything()
  ) %>%
  
  tab_style(
    style = list(
      cell_text(weight = "bold"),
      cell_borders(sides = "all", color = "black", weight = px(1.2))
    ),
    locations = cells_column_labels()
  ) %>%
  
  tab_style(
    style = cell_borders(
      sides = "all",
      color = "black",
      weight = px(1)
    ),
    locations = cells_body()
  ) %>%
  
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.left.color = "black",
    table.border.right.color = "black",
    
    table.border.top.width = px(2),
    table.border.bottom.width = px(2),
    table.border.left.width = px(2),
    table.border.right.width = px(2),
    
    heading.align = "center",
    
    column_labels.font.weight = "bold",
    
    table_body.hlines.color = "black",
    table_body.vlines.color = "black",
    
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(1.5)
  ) %>%
  
  tab_source_note(
    source_note = md("Autor: Grupo 1 <br> Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india")
  )
Tabla Nro. 2
Indicadores estadísticos de la variable Año en India de 2015-2020
Medida Valor
Media 2018
Mediana 2018
Moda 2019
Rango 2015 - 2020
Varianza 2.35
Desviación estándar 1.53
Coeficiente de variación (%) 0.08
Asimetría -0.38
Curtosis -0.88
Valores atípicos No existen
Autor: Grupo 1
Fuente: https://www.kaggle.com/datasets/rohanrao/air-quality-data-in-india

9.-Conclusión

En conclusión:

La variable Año fluctúa entre 2015 y 2020, y sus valores giran en torno a 2018 con una variabilidad prácticamente nula debido a la naturaleza discreta de la variable, siendo un conjunto de datos temporalmente acotado. El conjunto de valores se concentra principalmente en la parte media-alta del periodo. No se evidencian valores atípicos al tratarse de una variable limitada dentro del intervalo 2015 a 2020.