# Variable Discreta
#Fecha
#Autor: Ariana Viteri
#Fecha:04/087/2026
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
TDFDate <-read.csv("~/semestre 3 y 4/Estadistica/Datos Cambiados.csv",
header = TRUE, dec = ".", sep = ",")
# 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
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
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. 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")
# 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)
# 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)
)
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))
# ===========================
#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
)
# =====================================================
# 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 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 |
|
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.