# 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 <- datos$Número.de.habitantes

3. Conteo (frecuencia)

# Valores mínimos y máximos
min <- min(habitantes)
max <- max(habitantes)

cortes <- c(0, 8000000, 16000000, 24000000, 32000000, 34000000)

intervalos_legibles <- paste(
  format(head(cortes, -1), big.mark = ",", scientific = FALSE, trim = TRUE),
  format(tail(cortes, -1), big.mark = ",", scientific = FALSE, trim = TRUE),
  sep = " - "
)

habitantes_cut <- cut(
  datos$Número.de.habitantes,
  breaks = cortes,
  right = TRUE,
  labels = intervalos_legibles
)

TDF_habitantes <- data.frame(table(habitantes_cut))

ni <- TDF_habitantes$Freq
sum(ni)
## [1] 29531
hi <- (ni/sum(ni))
sum(hi)
## [1] 1
# Frecuencias accumuladas
Ni_asc <- cumsum(ni)
Hi_asc <- cumsum(hi)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_dsc <- rev(cumsum(rev(hi)))

4. Tabla de distribución de frecuencia

TDF_habitantes <- data.frame(
  as.character(levels(habitantes_cut)),
  ni,
  "hi(%)" = round(hi * 100, 2),
  "Ni asc" = Ni_asc,
  "Ni dsc" = Ni_dsc,
  "Hi asc(%)" = round(Hi_asc * 100, 2),
  "Hi dsc(%)" = round(Hi_dsc * 100, 2)
)
colnames(TDF_habitantes) <- c("Intervalos de número de habitantes","ni","hi(%)",
                              "Ni asc","Ni dsc","Hi asc","Hi dsc")
totales <- data.frame( TDF_habitantes=" 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_habitantes,totales)


#Creación tabla
tabla_habitantes <- TDF_numerohabitantes %>%
  gt() %>%
  tab_header(
    title = md("*Tabla N°1*"),
    subtitle = md("**Distribucion 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_habitantes
Tabla N°1
Distribucion 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
0 - 8,000,000 16666 56.44 16666 29531 56.44 100
8,000,000 - 16,000,000 8847 29.96 25513 12865 86.39 43.56
16,000,000 - 24,000,000 2009 6.80 27522 4018 93.2 13.61
24,000,000 - 32,000,000 0 0.00 27522 2009 93.2 6.8
32,000,000 - 34,000,000 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

par(mar = c(8, 6, 4, 2))
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_habitantes$`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,29531),
        names.arg=TDF_habitantes$`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_habitantes$`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_habitantes$`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_habitantes$`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_habitantes$`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)

7. Ojivas

7.1 Ojivas Ascendentes y Descendentes (ni)

par(mar = c(9, 6, 4, 2))
x_pos <- 1:length(TDF_habitantes$`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_habitantes$`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_por <- 1:length(TDF_habitantes$`Intervalos de número de habitantes`)
plot(x_pos, Hi_dsc * 100,
     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",
     mgp = c(5, 1, 0),
     lwd = 2,
     xaxt="n")
lines(x_pos, Hi_asc * 100,
      col = "blue",
      type = "o",
      lwd = 3)
axis(side = 1, at = x_pos, labels =  TDF_habitantes$`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] 8512278
# Mediana
mediana <- median(habitantes)
mediana
## [1] 3900000
# Moda
Mo <- "[0 -  8,000,000]"

8.2 Inidicadores de Dispersión

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

8.3 Indicadores de Forma

# Asimetría 
library(e1071)
asimetria <- skewness(habitantes, type = 2)
asimetria
## [1] 1.370879
# Curtosis
curtosis <- kurtosis(habitantes)
curtosis
## [1] 1.180503
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" = "[10230,12238]"
)

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] 8512278 3900000 [0 - 8,000,000] 86969315752243 9325734 109.56 1.37 1.18 [10230,12238]

9. Conclusiones

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