# Tema: Estadística Descriptiva
# Autor: Camila Zambrano
# Fecha: 30/05/2026

0.- Carga de librerías

library(knitr)
library(kableExtra)
library(readr)
library(gt)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

1.- Leer datos

setwd("~/CAMILA")
datos <- read.csv("city_day.csv",
                  header = TRUE, 
                  sep = ",", dec = "." )

2.- Selección de la variable

habitantes <- unique(na.omit(datos$Número.de.habitantes))

3.- Conteo frecuencias

# Definición de 10 intervalos
min_h <- min(habitantes)
max_h <- max(habitantes)
breaks <- seq(min_h, max_h, length.out = 11)

# Usamos cut pero especificamos que NO queremos las etiquetas por defecto
habitantes_cut <- cut(datos$Número.de.habitantes, breaks = breaks, include.lowest = TRUE)

# CREACIÓN MANUAL DE ETIQUETAS ENTERAS
# Extraemos los puntos de corte y los formateamos como texto simple
breaks_round <- round(breaks)
etiquetas <- paste0(format(breaks_round[-length(breaks_round)], scientific = FALSE), 
                    " - ", 
                    format(breaks_round[-1], scientific = FALSE))

TDF <- as.data.frame(table(habitantes_cut))
TDF$Intervalo <- etiquetas

ni <- TDF$Freq
sum(ni)
## [1] 29531
hi <- ni / sum(ni)
sum(hi)
## [1] 1
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- round(cumsum(hi) * 100, 2)
Hi_dsc <- round(rev(cumsum(rev(hi))) * 100, 2)

4.- Tabla de distribución de frecuencia

# Crear data frame para la tabla

TDF_final <- data.frame(
  "Intervalos" = TDF$Intervalo,
  "ni" = ni,
  "hi(%)" = round(hi * 100, 2),
  "Ni asc" = Ni_asc,
  "Ni dsc" = Ni_dsc,
  "Hi asc(%)" = Hi_asc,
  "Hi dsc(%)" = Hi_dsc
)

colnames(TDF_final) <- c("Intervalos de número de habitantes","ni","hi(%)",
                         "Ni asc","Ni dsc","Hi asc","Hi dsc")

totales <- data.frame( TDF_final =" TOTAL ",
                       ni= sum(ni),
                       hi= sum(hi*100),
                       Ni_asc= "-",
                       Ni_dsc= "-",
                       Hi_asc= "-",
                       Hi_dsc= "-")

colnames(totales) <- c("Intervalos de número de habitantes","ni","hi(%)",
                       "Ni asc","Hi asc","Ni dsc","Hi dsc")

TDF_numerohabitantes <- rbind(TDF_final,totales)

# Generar tabla con gt
tabla_final <- TDF_numerohabitantes %>%
  gt() %>%
  tab_header(
    title = md("*Tabla N°1*"),
    subtitle = md("**Distribución de frecuencia del número de habitantes
                  en el estudio de la calidad del aire en India 2015-2020**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1")
  ) %>%
  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_final
Tabla N°1
Distribución de frecuencia del número de habitantes en el estudio de la calidad del aire en India 2015-2020
Intervalos de número de habitantes ni hi(%) Ni asc Ni dsc Hi asc Hi dsc
8000 - 3387200 13543 45.86 13543 29531 45.86 100
3387200 - 6766400 3123 10.58 16666 15988 56.44 54.14
6766400 - 10145600 2009 6.80 18675 12865 63.24 43.56
10145600 - 13524800 4015 13.60 22690 10856 76.83 36.76
13524800 - 16904000 2823 9.56 25513 6841 86.39 23.17
16904000 - 20283200 0 0.00 25513 4018 86.39 13.61
20283200 - 23662400 2009 6.80 27522 4018 93.2 13.61
23662400 - 27041600 0 0.00 27522 2009 93.2 6.8
27041600 - 30420800 0 0.00 27522 2009 93.2 6.8
30420800 - 33800000 2009 6.80 29531 2009 100 6.8
TOTAL 29531 100.00 - - - -
Autor: Grupo 1

5.- Gráficas de distribución de frecuencia

5.1.- Diagrama de barras

Diagrama general

barplot(ni,
        main="Gráfica N°1: Distribución de habitantes por intervalos
        en el estudio de la calidad del aire en India 2015-2020",
        xlab = "Número de habitantes",
        ylab = "Cantidad",
        col = "blue",
        ylim = c(0,max(ni)),
        names.arg=TDF_final$`Intervalos de número de habitantes`,
        las=2,
        cex.names=0.4,
        cex.axis = 0.7,
        cex.main = 0.9,
        mgp = c(5, 1 , 0))

Diagrama con relación al todo

barplot(ni,
        main="Gráfica N°2: Distribución de habitantes por intervalos
        en el estudio de la calidad del aire en India 2015-2020",
        xlab = "Número de habitantes",
        ylab = "Cantidad",
        col = "lightgreen",
        ylim = c(0,30000),
        names.arg=TDF_final$`Intervalos de número de habitantes`,
        las=2,
        cex.names=0.4,
        cex.axis = 0.9,
        cex.main = 0.9,
        mgp = c(5, 1, 0))

5.2.- Diagrama porcentual

Diagrama porcentual general

barplot(TDF_final$`hi(%)`,
        main="Gráfica N°3: Distribución de habitantes por intervalos
        en el estudio de la calidad del aire en India 2015-2020",
        xlab = "Número de habitantes",
        ylab = "Porcentaje",
        col = "lightblue",
        names.arg=TDF_final$`Intervalos de número de habitantes`,
        las=2,
        cex.names=0.4,
        cex.axis = 0.9,
        cex.main = 0.9,
        mgp = c(5, 1, 0))

Diagrama porcentual con relación al todo

barplot(TDF_final$`hi(%)`,
        main="Gráfica N°4: Distribución de habitantes por intervalos
        en el estudio de la calidad del aire en India 2015-2020", 
        xlab = "Número de habitantes",
        ylab = "Porcentaje",
        col = "green",
        ylim = c(0,100),
        names.arg=TDF_final$`Intervalos de número de habitantes`,
        las=2,
        cex.names=0.4,
        cex.axis = 0.9,
        cex.main = 0.9,
        mgp = c(5, 1, 0))

6.- Diagrama de cajas

options(scipen = 999)

boxplot(habitantes,
        horizontal = TRUE,
        main = "Gráfica N°5: Distribución del número de habitantes en las 
        en el estudio de la calidad del aire en India 2015-2020",
        xlab = " Número de habitantes",
        col = "turquoise",
        pch = 1)

summary(habitantes)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     8000   870000  2690000  5924240  9060000 33800000

7.- Ojivas

7.1 Ojivas Ascendentes y Descendentes (ni)

par(mar = c(11, 7, 4, 2) + 0.1)

x_pos <- 1:length(TDF_final$`Intervalos de número de habitantes`)

plot(
  x_pos, Ni_dsc,
  type = "b",
  col = "orange",
  pch = 19,
  lwd = 3,
  main = "Gráfica N°6: Distribución de número de habitantes en el estudio de la 
  calidad del aire en India 2015-2020",
  xlab = "Número de habitantes",
  ylab = "",
  ylim = c(0, max(c(Ni_asc, Ni_dsc))),
  xaxt = "n",
  yaxt = "s",
  las = 1,
  mgp = c(7, 1, 0)
)

title(ylab = "Cantidad", mgp = c(4, 1, 0))

lines(
  x_pos, Ni_asc,
  col = "green",
  type = "b",
  pch = 19,
  lwd = 3
)

axis(
  side = 1,
  at = x_pos,
  labels = TDF_final$`Intervalos de número de habitantes`,
  las = 2,
  cex.axis = 0.7
)

grid(
  nx = NA,
  ny = NULL,
  col = "gray85",
  lty = 1
)

legend(
  "topright",
  legend = c(
    "Ascendente",
    "Descendente"
  ),
  col = c("green", "orange"),
  pch = 19,
  lty = 1,
  lwd = 3,
  bty = "n",
  cex = 0.8
)

7.2.- Ojivas Ascendentes y Descendentes (hi)

par(mar = c(11, 7, 4, 2) + 0.1)

x_pos <- 1:length(TDF_final$`Intervalos de número de habitantes`)

plot(
  x_pos, Hi_dsc,
  type = "b",
  col = "red",
  pch = 19,
  lwd = 2,
  main = "Gráfica N°7: Distribución de número de habitantes en el estudio 
  de la calidad del aire en India 2015-2020",
  xlab = "Número de habitantes",
  ylab = "",
  ylim = c(0, 100),
  xaxt = "n",
  yaxt = "s",
  las = 1,
  mgp = c(7, 1, 0)
)

title(ylab = "Porcentaje", mgp = c(4, 1, 0))

lines(
  x_pos, Hi_asc,
  col = "blue",
  type = "b",
  pch = 19,
  lwd = 3
)

axis(
  side = 1,
  at = x_pos,
  labels = TDF_final$`Intervalos de número de habitantes`,
  las = 2,
  cex.axis = 0.7
)

grid(
  nx = NA,
  ny = NULL,
  col = "gray85",
  lty = 1
)

legend(
  "topright",
  legend = c(
    "Ascendente",
    "Descendente"
  ),
  col = c("blue", "red"),
  pch = 19,
  lty = 1,
  lwd = 3,
  bty = "n",
  cex = 0.8
)

8.- Indicadores Estadísticos

8.1.- Indicadores de Tendencia Central

# Media aritmética
media <- mean(habitantes)
media
## [1] 5924240
# Mediana
mediana <- median(habitantes)
mediana
## [1] 2690000
# Moda
Mo <- "[0 -  8,000,000]"

8.2.- Inidicadores de Dispersión

# Varianza
varianza <- var(habitantes)
varianza
## [1] 68712236023333
# Desviación estándar
sd <- sd(habitantes)
sd
## [1] 8289284
# Coeficiente de variación
cv <- round((sd / media)*100, 2)
cv
## [1] 139.92

8.3.- Indicadores de Forma

# Asimetría 
library(e1071)
asimetria <- skewness(habitantes, type = 2)
asimetria
## [1] 2.067584
# Curtosis
curtosis <- kurtosis(habitantes)
curtosis
## [1] 2.908326
Tabla_indicadores <- data.frame(
  "Variable" = c("Número de habitantes"),
  "Rango" = "[8000,33800000]",
  "X" = media,
  "Me" = round(mediana, 2),
  "Mo" = "[0 -  8,000,000]",
  "V" = round(varianza, 2),
  "Sd" = round(sd, 2),
  "Cv" = cv,
  "As" = round(asimetria, 2),
  "K" = round(curtosis, 2),
  "Valores Atípicos" = "[8000,33800000]"
)

library(knitr)

kable(
  Tabla_indicadores,
  align = "c",
  caption = "Conclusiones de la variable Número de habitantes"
)
Conclusiones de la variable Número de habitantes
Variable Rango X Me Mo V Sd Cv As K Valores.Atípicos
Número de habitantes [8000,33800000] 5924240 2690000 [0 - 8,000,000] 68712236023333 8289284 139.92 2.07 2.91 [8000,33800000]

9.- Conclusiones

La variable número de habitantes fluctúa entre 8000 y 33800000, y sus valores giran entorno a 2690000 con una desviación estándar de 8289284, siendo un conjunto de datos muy heterogéneo. El conjunto de valores se concentra fuertemente en la parte baja de la variable. Con la presencia de valores atípicos del intervalo 8000 a 33800000.