# 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 (frecuencia)

# 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
                  por ciudad en el análisis sobre la calidad del aire en India**")
  ) %>%
  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 por ciudad en el análisis sobre la calidad del aire en India
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 Histograma

Diagrama de barras general

barplot(ni,
        main="Gráfica N°1: Distribución de habitantes por intervalos
        en las ciudades sobre el análisis sobre la calidad del aire en India",
        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 de barras con relación al todo

barplot(ni,
        main="Gráfica N°2: Distribución de habitantes por intervalos
        en las ciudades sobre el análisis de la calidad del aire en India",
        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 Histograma porcentual

Histograma porcentual general

barplot(TDF_final$`hi(%)`,
        main="Gráfica N°3: Distribución de habitantes por intervalos
        en las ciudades sobre el análisis de la calidad del aire en India",
        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))

Histograma porcentual con relación al todo

barplot(TDF_final$`hi(%)`,
        main="Gráfica N°4: Distribución de habitantes por intervalos
        en las ciudades sobre el análisis de la calidad del aire en India", 
        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 
        ciudades sobre el análisis de la calidad del aire en India",
        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(9, 6, 4, 2))
x_pos <- 1:length(TDF_final$`Intervalos de número de habitantes`)
plot(x_pos ,Ni_dsc,
     main = "Gráfica N°6: Distribución de Número de habitantes por ciudades
  sobre el análisis de la calidad del aire en India",
     xlab = " Número de habitantes",
     ylab = "Cantidad",
     col = "orange",
     type = "o",
     lwd = 3,
     xaxt="n",
     mgp = c(5, 1, 0),
     ylim = c(0, max(c(Ni_asc, Ni_dsc))))

lines(x_pos,Ni_asc,
      col = "green",
      type = "o",
      lwd = 3)
axis(side = 1, at = x_pos, labels = TDF_final$`Intervalos de número de 
     habitantes`,
     las = 2, cex.axis = 0.4)

7.2 Ojivas Ascendentes y Descendentes (hi)

par(mar = c(9, 6, 4, 2))
x_pos <- 1:length(TDF_final$`Intervalos de número de habitantes`)
plot(x_pos, Hi_dsc,
     main = "Gráfica N°7: Distribución de Número de havitantes por ciudad sobre 
     el análisis de la calidad del aire en India",
     xlab = " Número de habitantes",
     ylab = "Porcentaje",
     col = "red",
     type = "o",
     ylim = c(0, 100),
     mgp = c(5, 1, 0),
     lwd = 2,
     xaxt="n")
lines(x_pos, Hi_asc,
      col = "blue",
      type = "o",
      lwd = 3)
axis(side = 1, at = x_pos, labels =  TDF_final$`Intervalos de número de 
     habitantes`, 
     las = 2, cex.axis = 0.4)

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.