0. Librerías

library(dplyr)
## 
## 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(gt)

1. Leer datos

df <- read.csv(
  "waterPollution.csv",
  sep = ",",
  stringsAsFactors = FALSE
)

2. Extracción y depuración de la variable

# -------------------------
# Extraer variable
# -------------------------

Turistas <- round(
  df$TouristMean_1990_2020 
)

# Eliminar valores faltantes
Turistas <- na.omit(Turistas)

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

# -------------------------
# Tabla de frecuencias
# -------------------------

tabla_freq_original <- as.data.frame(
  table(Turistas)
)

# Ordenar de menor a mayor
tabla_freq_original <- tabla_freq_original[
  order(as.numeric(as.character(tabla_freq_original$Turistas))),
]

# Renombrar columnas
colnames(tabla_freq_original) <- c(
  "Turistas",
  "ni"
)

# Mostrar los valores completos (sin notación científica)
tabla_freq_original$Turistas <- format(
  as.numeric(as.character(tabla_freq_original$Turistas)),
  scientific = FALSE,
  big.mark = " ",
  trim = TRUE
)

# -------------------------
# Total
# -------------------------

N <- sum(tabla_freq_original$ni)

# Frecuencia relativa
tabla_freq_original$hi <- round(
  tabla_freq_original$ni / N * 100,
  2
)

# Ajustar para que hi sume exactamente 100
tabla_freq_original$hi[nrow(tabla_freq_original)] <-
  tabla_freq_original$hi[nrow(tabla_freq_original)] +
  (100 - sum(tabla_freq_original$hi))

# Frecuencias acumuladas
tabla_freq_original$Ni_asc <- cumsum(tabla_freq_original$ni)

tabla_freq_original$Hi_asc <- round(
  cumsum(tabla_freq_original$hi),
  2
)

tabla_freq_original$Ni_dsc <- rev(
  cumsum(rev(tabla_freq_original$ni))
)

tabla_freq_original$Hi_dsc <- round(
  rev(cumsum(rev(tabla_freq_original$hi))),
  2
)

# -------------------------
# TOTAL
# -------------------------

fila_total <- data.frame(
  Turistas = "TOTAL",
  ni = N,
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final <- rbind(
  tabla_freq_original,
  fila_total
)

# -------------------------
# Tabla GT
# -------------------------

tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1**"),
    subtitle = md(
      "**Distribución de frecuencias de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Turistas = "Turistas promedio",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Turistas == "TOTAL"
    )
  ) %>%
  opt_row_striping()
Tabla N°1
Distribución de frecuencias de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)
Turistas promedio ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
530 038 129 0.65 129 0.65 19893 100
827 653 15 0.08 144 0.73 19764 99.35
1 136 923 82 0.41 226 1.14 19749 99.27
1 538 269 228 1.15 454 2.29 19667 98.86
2 147 000 355 1.78 809 4.07 19439 97.71
2 220 315 5 0.03 814 4.1 19084 95.93
3 812 230 27 0.14 841 4.24 19079 95.9
4 303 307 171 0.86 1012 5.1 19052 95.76
4 836 884 322 1.62 1334 6.72 18881 94.9
6 063 076 479 2.41 1813 9.13 18559 93.28
6 398 076 82 0.41 1895 9.54 18080 90.87
6 496 961 261 1.31 2156 10.85 17998 90.46
6 568 730 117 0.59 2273 11.44 17737 89.15
6 942 807 44 0.22 2317 11.66 17620 88.56
7 024 884 35 0.18 2352 11.84 17576 88.34
7 184 000 22 0.11 2374 11.95 17541 88.16
7 841 461 19 0.10 2393 12.05 17519 88.05
10 307 692 4 0.02 2397 12.07 17500 87.95
13 187 615 3 0.02 2400 12.09 17496 87.93
14 788 423 1 0.01 2401 12.1 17493 87.91
19 909 000 91 0.46 2492 12.56 17492 87.9
22 635 423 541 2.72 3033 15.28 17401 87.44
25 867 961 3957 19.89 6990 35.17 16860 84.72
39 653 776 101 0.51 7091 35.68 12903 64.83
50 941 692 3141 15.79 10232 51.47 12802 64.32
71 176 346 9661 48.53 19893 100 9661 48.53
TOTAL 19893 100.00

3.2 Tabla simplificada de frecuencias

# -------------------------
# Crear 10 intervalos
# -------------------------

cortes <- seq(
  min(Turistas),
  max(Turistas),
  length.out = 11
)

Turistas_intervalos <- cut(
  Turistas,
  breaks = cortes,
  include.lowest = TRUE
)

# -----------------------------------------
# Cambiar etiquetas a millones (×10⁶)
# -----------------------------------------

etiquetas <- character(length(cortes) - 1)

for(i in seq_along(etiquetas)){

  li <- round(cortes[i] / 1e6)
  ls <- round(cortes[i + 1] / 1e6)

  if(i == 1){

    etiquetas[i] <- paste0(
      "[",
      li,
      " × 10⁶ ; ",
      ls,
      " × 10⁶]"
    )

  }else{

    etiquetas[i] <- paste0(
      "(",
      li,
      " × 10⁶ ; ",
      ls,
      " × 10⁶]"
    )

  }

}

levels(Turistas_intervalos) <- etiquetas

# -------------------------
# Tabla de frecuencias
# -------------------------

tabla_freq_resumida <- as.data.frame(
  table(Turistas_intervalos)
)

colnames(tabla_freq_resumida) <- c(
  "Turistas",
  "ni"
)

# Total

N <- sum(tabla_freq_resumida$ni)

# Frecuencia relativa

tabla_freq_resumida$hi <- round(
  tabla_freq_resumida$ni / N * 100,
  2
)

# Ajustar para que hi sume exactamente 100

tabla_freq_resumida$hi[nrow(tabla_freq_resumida)] <-
  tabla_freq_resumida$hi[nrow(tabla_freq_resumida)] +
  (100 - sum(tabla_freq_resumida$hi))

# Frecuencias acumuladas

tabla_freq_resumida$Ni_asc <- cumsum(
  tabla_freq_resumida$ni
)

tabla_freq_resumida$Hi_asc <- round(
  cumsum(tabla_freq_resumida$hi),
  2
)

tabla_freq_resumida$Ni_dsc <- rev(
  cumsum(rev(tabla_freq_resumida$ni))
)

tabla_freq_resumida$Hi_dsc <- round(
  rev(cumsum(rev(tabla_freq_resumida$hi))),
  2
)

# -------------------------
# Fila TOTAL
# -------------------------

fila_total <- data.frame(
  Turistas = "TOTAL",
  ni = N,
  hi = 100,
  Ni_asc = "",
  Hi_asc = "",
  Ni_dsc = "",
  Hi_dsc = ""
)

tabla_final <- rbind(
  tabla_freq_resumida,
  fila_total
)

# -------------------------
# Tabla GT
# -------------------------

tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md(
      "**Distribución de frecuencias simplificada de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Turistas = "Turistas promedio",
    ni = "ni",
    hi = "hi (%)",
    Ni_asc = "Ni ↑",
    Hi_asc = "Hi ↑ (%)",
    Ni_dsc = "Ni ↓",
    Hi_dsc = "Hi ↓ (%)"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Turistas == "TOTAL"
    )
  ) %>%
  opt_row_striping()
Tabla N°2
Distribución de frecuencias simplificada de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)
Turistas promedio ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
[1 × 10⁶ ; 8 × 10⁶] 2374 11.93 2374 11.93 19893 100
(8 × 10⁶ ; 15 × 10⁶] 26 0.13 2400 12.06 17519 88.07
(15 × 10⁶ ; 22 × 10⁶] 92 0.46 2492 12.52 17493 87.94
(22 × 10⁶ ; 29 × 10⁶] 4498 22.61 6990 35.13 17401 87.48
(29 × 10⁶ ; 36 × 10⁶] 0 0.00 6990 35.13 12903 64.87
(36 × 10⁶ ; 43 × 10⁶] 101 0.51 7091 35.64 12903 64.87
(43 × 10⁶ ; 50 × 10⁶] 0 0.00 7091 35.64 12802 64.36
(50 × 10⁶ ; 57 × 10⁶] 3141 15.79 10232 51.43 12802 64.36
(57 × 10⁶ ; 64 × 10⁶] 0 0.00 10232 51.43 9661 48.57
(64 × 10⁶ ; 71 × 10⁶] 9661 48.57 19893 100 9661 48.57
TOTAL 19893 100.00

(8 × 10⁶ ; 15 × 10⁶]: promedio de más de 8 y hasta 15 millones de turistas.

(15 × 10⁶ ; 22 × 10⁶]: promedio de más de 15 y hasta 22 millones de turistas.

(22 × 10⁶ ; 29 × 10⁶]:promedio de más de 22 y hasta 29 millones de turistas.

(29 × 10⁶ ; 36 × 10⁶]: promedio de más de 29 y hasta 36 millones de turistas.

(36 × 10⁶ ; 43 × 10⁶]:promedio de más de 36 y hasta 43 millones de turistas.

(43 × 10⁶ ; 50 × 10⁶]: promedio de más de 43 y hasta 50 millones de turistas.

(50 × 10⁶ ; 57 × 10⁶]: promedio de más de 50 y hasta 57 millones de turistas.

(57 × 10⁶ ; 64 × 10⁶]: promedio de más de 57 y hasta 64 millones de turistas.

(64 × 10⁶ ; 71 × 10⁶]: promedio de más de 64 y hasta 71 millones de turistas.

4 Gráficas

4.1 Diagrama de barras de cantidad

# =========================
# HISTOGRAMA (ni)
# =========================

par(mar = c(10, 4, 4, 2))

barplot(
  tabla_freq_resumida$ni,
  main = "Gráfica N°1: Distribución de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  ylab = "Cantidad",
  col = "skyblue",
  ylim = c(0, max(tabla_freq_resumida$ni) * 1.1),
  names.arg = tabla_freq_resumida$Turistas,
  las = 2,
  cex.names = 0.8
)

title(
  xlab = "Turistas promedio (miles)",
  line = 6
)

4.2 Diagrama de barras de cantidad general

# =========================
# HISTOGRAMA GENERAL (ni)
# =========================

par(mar = c(10,4,4,2))

barplot(
  tabla_freq_resumida$ni,
  main = "Gráfica N°2: Distribución general de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  ylab = "Cantidad",
  col = "lightgreen",
  ylim = c(0,20000),
  names.arg = tabla_freq_resumida$Turistas,
  las = 2,
  cex.names = 0.8
)

title(
  xlab = "Turistas promedio (miles)",
  line = 6
)

4.3 Diagrama de barras porcentual

# =========================
# HISTOGRAMA (hi)
# =========================

par(mar = c(10,4,4,2))

barplot(
  tabla_freq_resumida$hi,
  main = "Gráfica N°3: Distribución porcentual de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  ylab = "Porcentaje",
  col = "skyblue",
  ylim = c(0,max(tabla_freq_resumida$hi)*1.1),
  names.arg = tabla_freq_resumida$Turistas,
  las = 2,
  cex.names = 0.8
)

title(
  xlab = "Turistas promedio (miles)",
  line = 6
)

4.4 Diagrama de barras porcentual general

# =========================
# HISTOGRAMA GENERAL (hi)
# =========================

par(mar = c(10,4,4,2))

barplot(
  tabla_freq_resumida$hi,
  main = "Gráfica N°4: Distribución porcentual general de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  ylab = "Porcentaje",
  col = "lightgreen",
  ylim = c(0,100),
  names.arg = tabla_freq_resumida$Turistas,
  las = 2,
  cex.names = 0.8
)

title(
  xlab = "Turistas promedio (miles)",
  line = 6
)

4.5 Diagrama de Caja

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

par(mar = c(10, 4, 4, 2))

boxplot(
  Turistas,
  horizontal = TRUE,
  xaxt = "n",
  xlab = "",
  col = "orange",
  main = "Gráfica N°5: Distribución de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)"
)

axis(
  side = 1,
  at = seq(min(Turistas), max(Turistas), length.out = 10),
  labels = levels(Turistas_intervalos),
  las = 2,
  cex.axis = 0.8
)

title(
  xlab = "Turistas promedio (miles)",
  line = 7
)

points(
  mean(Turistas),
  1,
  pch = 19,
  col = "red"
)

legend(
  "topright",
  legend = "Media",
  pch = 19,
  col = "red"
)

4.6 Ojivas ascendentes y descendentes (Ni)

# ======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Ni)
# ======================================

par(mar = c(12,4,4,2))

x_pos <- 1:nrow(tabla_freq_resumida)

plot(
  x_pos,
  tabla_freq_resumida$Ni_dsc,
  main = "Gráfica N°6: Ojiva ascendente y descendente de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "",
  ylab = "Cantidad",
  type = "b",
  pch = 19,
  col = "orange",
  lwd = 2,
  xaxt = "n",
  ylim = c(0,max(tabla_freq_resumida$Ni_dsc)*1.05)
)

lines(
  x_pos,
  tabla_freq_resumida$Ni_asc,
  type = "b",
  pch = 19,
  col = "green",
  lwd = 2
)

axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Turistas,
  las = 2,
  cex.axis = 0.8
)

legend(
  "topright",
  legend = c("Descendente","Ascendente"),
  col = c("orange","green"),
  lwd = 2,
  pch = 19
)

title(
  xlab = "Turistas promedio (miles)",
  line = 8
)

4.7 Ojivas ascendentes y descendentes (Hi)

# ======================================
# OJIVAS ASCENDENTES Y DESCENDENTES (Hi)
# ======================================

par(mar = c(12,4,4,2))

x_pos <- 1:nrow(tabla_freq_resumida)

plot(
  x_pos,
  tabla_freq_resumida$Hi_dsc,
  main = "Gráfica N°7: Ojiva ascendente y descendente de los turistas promedio
en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "",
  ylab = "Porcentaje",
  type = "b",
  pch = 19,
  col = "red",
  lwd = 2,
  xaxt = "n",
  ylim = c(0,100)
)

lines(
  x_pos,
  tabla_freq_resumida$Hi_asc,
  type = "b",
  pch = 19,
  col = "blue",
  lwd = 2
)

axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Turistas,
  las = 2,
  cex.axis = 0.8
)

legend(
  "topright",
  legend = c("Descendente","Ascendente"),
  col = c("red","blue"),
  lwd = 2,
  pch = 19
)

title(
  xlab = "Turistas promedio (miles)",
  line = 8
)

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADÍSTICOS
# Variable: Turistas promedio
# =========================

# =========================
# MEDIDAS DE TENDENCIA CENTRAL
# =========================

# Media
media <- round(mean(Turistas), 2)

# Moda
tabla_moda <- table(Turistas)
max_frecuencia <- max(tabla_moda)
moda <- names(tabla_moda)[tabla_moda == max_frecuencia]

# Mediana
mediana <- median(Turistas)

5.2 Dispersión

# =========================
# MEDIDAS DE DISPERSIÓN
# =========================

# Rango
rango <- max(Turistas) - min(Turistas)

# Varianza
varianza <- var(Turistas)

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

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

5.3 Asimetría

# =========================
# MEDIDAS DE FORMA
# =========================

n <- length(Turistas)

# Asimetría
asimetria <- sum((Turistas - media)^3) /
  ((n - 1) * desviacion^3)

# Curtosis
curtosis <- sum((Turistas - media)^4) /
  ((n - 1) * desviacion^4) - 3

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

Q1 <- quantile(Turistas, 0.25)

Q3 <- quantile(Turistas, 0.75)

RIQ <- Q3 - Q1

LI <- Q1 - 1.5 * RIQ

LS <- Q3 + 1.5 * RIQ

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

if(length(atipicos) > 0){
  mensaje_atipicos <- length(atipicos)
}else{
  mensaje_atipicos <- 0
}

5.4 Tabla de indicadores

# =========================
# FUNCIÓN PARA EXPRESAR NÚMEROS EN POTENCIAS
# =========================

formato_potencia <- function(x){

  if(is.na(x)) return(NA)

  if(x == 0) return("0")

  expo <- floor(log10(abs(x)))

  mantisa <- round(x / (10^expo), 2)

  super <- c(
    "⁰","¹","²","³","⁴",
    "⁵","⁶","⁷","⁸","⁹"
  )

  expo_txt <- unlist(
    strsplit(as.character(expo),"")
  )

  expo_txt <- paste0(
    super[as.numeric(expo_txt)+1],
    collapse=""
  )

  paste0(
    mantisa,
    " × 10",
    expo_txt
  )

}

# =========================
# TABLA RESUMEN
# =========================

tabla_indicadores <- data.frame(

  Variable = "Turistas promedio",

  Rango = paste0(
    "[",
    formato_potencia(min(Turistas)),
    " ; ",
    formato_potencia(max(Turistas)),
    "]"
  ),

  X = formato_potencia(media),

  Me = formato_potencia(mediana),

  Mo = formato_potencia(as.numeric(moda[1])),

  V = formato_potencia(varianza),

  Sd = formato_potencia(desviacion),

  Cv = paste0(cv,"%"),

  As = round(asimetria,2),

  K = round(curtosis,2),

  Valores_Atipicos = mensaje_atipicos,

  stringsAsFactors = FALSE

)

fila <- which(
  tabla_indicadores$Variable ==
    "Turistas promedio"
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3**"),
    subtitle = md(
      "**Indicadores estadísticos de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  tab_source_note(
    source_note = md(
      "Autor: Grupo 3"
    )
  ) %>%
  tab_options(
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),
    row.striping.include_table_body = TRUE
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = fila
    )
  )

tabla_indicadores_gt
Tabla N°3
Indicadores estadísticos de los turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Turistas promedio [5.3 × 10⁵ ; 7.12 × 10⁷] 4.92 × 10⁷ 5.09 × 10⁷ 7.12 × 10⁷ 6.1 × 10¹⁴ 2.47 × 10⁷ 50.2% -0.59 -1.16 0
Autor: Grupo 3
# La variable turistas promedio no presenta valores atípicos, ya que todas las observaciones se encuentran dentro de los límites establecidos por el criterio del rango intercuartílico. Esto indica que, aunque existe una alta concentración de datos en valores elevados, ninguno se aleja lo suficiente del comportamiento general como para ser considerado una observación atípica.

6. Conclusión

La variable turistas promedio fluctúa entre \(5.3 \times 10^{5}\) y \(7.12 \times 10^{7}\) turistas, con una mediana de \(5.09 \times 10^{7}\) y una desviación estándar de \(2.47 \times 10^{7}\). El coeficiente de variación (50.2 %) evidencia una distribución extremadamente heterogénea, mientras que la asimetría negativa indica una mayor concentración de observaciones en los valores altos de la variable. Además, no se identifican valores atípicos.