0. Librerías

# -------------------------
# Cargar librerías
# -------------------------

library(gt)
library(dplyr)

1. Leer datos

# -------------------------
# Cargar datos
# -------------------------

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

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

# ================================
# VARIABLE CUANTITATIVA CONTINUA
# ================================

TST <- na.omit(datos$TouristMean_1990_2020)

# Datos para gráficos
TST_graf <- TST[TST >= 0]

3. Frecuencia

3.1 Rango

# Valores mínimo y máximo
minimo <- min(TST)
maximo <- max(TST)

3.2 Uso de la Regla de Sturges

# Regla de Sturges
k <- 1 + (3.3 * log10(length(TST)))
k <- floor(k)

# Rango y amplitud
R <- maximo - minimo
A <- R / k

3.3 Límites de clase

# Límites de clase
Li <- round(seq(from = minimo, to = maximo - A, by = A), 4)
Ls <- round(seq(from = minimo + A, to = maximo, by = A), 4)

# Marca de clase
MC <- round((Li + Ls) / 2, 2)

3.4 Creación de columnas

# Frecuencia absoluta
ni <- numeric(length(Li))

for (i in 1:length(Li)) {
  ni[i] <- sum(TST >= Li[i] & TST < Ls[i])
}

# Incluir el valor máximo en el último intervalo
ni[length(Li)] <- sum(TST >= Li[length(Li)] & TST <= maximo)

# Frecuencia relativa
hi <- round((ni / sum(ni)) * 100, 2)

# Crear tabla
TDF_TST <- data.frame(
  Li, Ls, MC, ni, hi
)

# ================================
# ELIMINAR INTERVALOS CON ni = 0
# ================================

TDF_TST <- TDF_TST[TDF_TST$ni > 0, ]

# Recalcular acumuladas
TDF_TST$Niasc <- cumsum(TDF_TST$ni)
TDF_TST$Nidsc <- rev(cumsum(rev(TDF_TST$ni)))
TDF_TST$Hiasc <- round(cumsum(TDF_TST$hi))
TDF_TST$Hidsc <- round(rev(cumsum(rev(TDF_TST$hi))))

4. Tabla de distribución de frecuencia

4.1 Tabla general con Sturges

TDF_TST_Completo <- rbind(
  TDF_TST,
  data.frame(
    Li = "Total",
    Ls = " ",
    MC = " ",
    ni = sum(TDF_TST$ni),
    hi = 100,
    Niasc = " ",
    Nidsc = " ",
    Hiasc = " ",
    Hidsc = " "
  )
)

# ================================
# TABLA GT
# ================================

tabla_TST <- TDF_TST_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº1*"),
    subtitle = md("**Distribución de frecuencias de 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.color = "black",
    row.striping.include_table_body = TRUE
  )

tabla_TST
Tabla Nº1
Distribución de frecuencias de Turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)
Li Ls MC ni hi Niasc Nidsc Hiasc Hidsc
530038 5239791.8667 2884914.93 1334 6.71 1334 19893 7 100
5239791.8667 9949545.7333 7594668.8 1059 5.32 2393 18559 12 93
9949545.7333 14659299.6 12304422.67 7 0.04 2400 17500 12 88
14659299.6 19369053.4667 17014176.53 1 0.01 2401 17493 12 88
19369053.4667 24078807.3333 21723930.4 632 3.18 3033 17492 15 88
24078807.3333 28788561.2 26433684.27 3957 19.89 6990 16860 35 85
38208068.9333 42917822.8 40562945.87 101 0.51 7091 12903 36 65
47627576.6667 52337330.5333 49982453.6 3141 15.79 10232 12802 51 64
66466592.1333 71176346 68821469.07 9661 48.56 19893 9661 100 49
Total 19893 100.00
Autor: Grupo 3

4.2 Tabla Simplificada

# =============================================
# TABLA SIMPLIFICADA (BASADA EN EL HISTOGRAMA)
# =============================================

# 1. Calcular el histograma
histoP <- hist(
  log10(TST_graf + 1),
  breaks = 8,
  plot = FALSE
)

# 2. Extraer datos del histograma para la tabla
Limites <- histoP$breaks
LimInf <- Limites[1:(length(Limites) - 1)]
LimSup <- Limites[2:length(Limites)]
Mc <- histoP$mids
ni <- histoP$counts
hi <- round((ni / sum(ni)) * 100, 2)

# 3. Crear el DataFrame base
TDF_Histo_TST <- data.frame(
  LimInf,
  LimSup,
  Mc,
  ni,
  hi
)

# Eliminar intervalos vacíos
TDF_Histo_TST <- TDF_Histo_TST[TDF_Histo_TST$ni > 0, ]

# Recalcular frecuencias acumuladas
TDF_Histo_TST$Ni_asc <- cumsum(TDF_Histo_TST$ni)
TDF_Histo_TST$Ni_dsc <- rev(cumsum(rev(TDF_Histo_TST$ni)))
TDF_Histo_TST$Hi_asc <- round(cumsum(TDF_Histo_TST$hi))
TDF_Histo_TST$Hi_dsc <- round(rev(cumsum(rev(TDF_Histo_TST$hi))))

# 4. Crear fila de totales
TDF_Histo_TST_Completo <- rbind(
  TDF_Histo_TST,
  data.frame(
    LimInf = "Total",
    LimSup = " ",
    Mc = " ",
    ni = sum(TDF_Histo_TST$ni),
    hi = 100,
    Ni_asc = " ",
    Ni_dsc = " ",
    Hi_asc = " ",
    Hi_dsc = " "
  )
)

# 5. Generar y mostrar la Tabla con 'gt'
tabla_Histo_TST <- TDF_Histo_TST_Completo %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº2*"),
    subtitle = md("**Distribución de frecuencias de 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.color = "black",
    row.striping.include_table_body = TRUE
  )

tabla_Histo_TST
Tabla Nº2
Distribución de frecuencias de Turistas promedio en el estudio de la calidad de agua en Europa (1991-2017)
LimInf LimSup Mc ni hi Ni_asc Ni_dsc Hi_asc Hi_dsc
5.6 5.8 5.7 129 0.65 129 19893 1 100
5.8 6 5.9 15 0.08 144 19764 1 99
6 6.2 6.1 310 1.56 454 19749 2 99
6.2 6.4 6.3 360 1.81 814 19439 4 98
6.4 6.6 6.5 27 0.14 841 19079 4 96
6.6 6.8 6.7 972 4.89 1813 19052 9 96
6.8 7 6.9 580 2.92 2393 18080 12 91
7 7.2 7.1 8 0.04 2401 17500 12 88
7.2 7.4 7.3 632 3.18 3033 17492 15 88
7.4 7.6 7.5 4058 20.40 7091 16860 36 85
7.6 7.8 7.7 3141 15.79 10232 12802 51 64
7.8 8 7.9 9661 48.56 19893 9661 100 49
Total 19893 100.00
Autor: Grupo 3

5. Gráficas

5.1 Histograma (ni)

hist(
  log10(TST_graf + 1),
  breaks = histoP$breaks,
  xaxt = "n",
  col = "deepskyblue",
  border = "black",
  main = "Gráfica Nº1: Distribución de frecuencias de turistas promedio
  en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Cantidad"
)

axis(
  1,
  at = histoP$breaks,
  labels = round(histoP$breaks, 1),
  las = 1
)

5.2 Histograma General (ni)

# ===========================================================
# Histograma con relación a la totalidad de los datos
# ===========================================================

barplot(
  TDF_Histo_TST$ni,
  col = "lightskyblue1",
  main = "Gráfica Nº2: Distribución de frecuencias de Turistas
  promedio en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Cantidad",
  space = 0,
  names.arg = round(TDF_Histo_TST$Mc, 2)
)

5.3 Histograma Porcentual (hi)

# ======================================
# Histograma porcentual que genera RStudio
# ======================================

bp <- barplot(
  TDF_Histo_TST$hi,
  col = "deepskyblue",
  main = "Gráfica Nº3: Distribución porcentual de frecuencias de
  Turistas promedio en el estudio de la calidad de agua en 
  Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_TST$Mc, 2)
)

5.4 Histograma Porcentual General (hi)

# ===========================================================
# Histograma porcentual con relación a la totalidad
# ===========================================================

barplot(
  TDF_Histo_TST$hi,
  space = 0,
  col = "lightskyblue1",
  main = "Gráfica Nº4: Distribución porcentual de frecuencias de
  turistas promedio en el estudio de la calidad de agua en Europa
  (1991-2017)",
  xlab = "Media de turistas",
  ylab = "Porcentaje (%)",
  names.arg = round(TDF_Histo_TST$Mc, 2),
  ylim = c(0, 100)
)

5.5 Polígono de frecuencias (hi)

bp <- barplot(
  TDF_Histo_TST$hi,
  col = "royalblue",
  main = "Gráfica Nº5: Polígono de frecuencia de la distribución
  porcentual de Turistas promedio, en el estudio de la calidad
  de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Porcentaje (%)",
  space = 0,
  names.arg = round(TDF_Histo_TST$Mc, 2),
  ylim = c(0, max(TDF_Histo_TST$hi) * 1.2)
)

lines(
  bp,
  TDF_Histo_TST$hi,
  type = "o",
  pch = 16,
  lwd = 2,
  col = "darkred"
)

text(
  bp,
  TDF_Histo_TST$hi,
  labels = round(TDF_Histo_TST$hi, 2),
  pos = 3,
  cex = 0.8,
  col = "black"
)

5.6 Diagrama de caja

# =============================
# BOXPLOT
# =============================

boxplot(
  TST,
  horizontal = TRUE,
  col = "forestgreen",
  main = "Gráfica Nº7: Diagrama de caja de turistas promedio 
  en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  xaxt = "n"
)

# Media
points(
  mean(TST),
  1,
  pch = 19,
  col = "red"
)

# Eje X en millones
marcas <- seq(0, 70000000, by = 10000000)

axis(
  1,
  at = marcas,
  labels = paste0(marcas/1000000, " M")
)

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

5.7 Ojiva ascendente y descendente (Ni)

# =========================
# OJIVAS Ni
# =========================

plot(
  TDF_Histo_TST$LimInf,
  TDF_Histo_TST$Ni_dsc,
  main = "Gráfica Nº8: Ojiva ascendente y descendente de Turistas
  promedio en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Cantidad",
  col = "red",
  type = "o",
  lwd = 2
)

lines(
  TDF_Histo_TST$LimSup,
  TDF_Histo_TST$Ni_asc,
  col = "forestgreen",
  type = "o",
  lwd = 2
)

legend(
  "right",
  legend = c(
    "Ojiva descendente",
    "Ojiva ascendente"
  ),
  col = c("red", "forestgreen"),
  pch = c(16, 16),
  lty = 1,
  bty = "n"
)

5.8 Ojiva ascendente y descendente (Hi)

# =========================
# OJIVAS PORCENTUALES
# =========================

plot(
  TDF_Histo_TST$LimSup,
  TDF_Histo_TST$Hi_asc,
  type = "o",
  col = "deepskyblue",
  pch = 16,
  lwd = 2,
  main = "Gráfica Nº9: Ojiva ascendente y descendente de Turistas
  promedio en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Turistas promedio",
  ylab = "Porcentaje acumulado (%)",
  ylim = c(0, 100)
)

# Ojiva Descendente
lines(
  TDF_Histo_TST$LimInf,
  TDF_Histo_TST$Hi_dsc,
  type = "o",
  col = "red",
  pch = 17,
  lwd = 2
)

grid()

legend(
  "right",
  legend = c(
    "Ojiva Ascendente (%)",
    "Ojiva Descendente (%)"
  ),
  col = c("deepskyblue", "red"),
  pch = c(16, 17),
  lty = 1,
  bty = "n"
)

6 Indicadores Estadísticos

# =========================
# INDICADORES ESTADÍSTICOS
# =========================

# Obtener valores atípicos según el criterio del boxplot
atipicos <- boxplot.stats(TST)$out

# Cantidad de valores atípicos
n_atipicos <- length(atipicos)

TST <- na.omit(datos$TouristMean_1990_2020)
TST <- as.numeric(TST)

# Media y mediana
media <- mean(TST)
mediana <- median(TST)

# =========================
# MODA (INTERVALO MODAL)
# =========================

fila_modal <- which.max(TDF_Histo_TST$ni)

moda_intervalar <- paste0(
  "[",
  round(TDF_Histo_TST$LimInf[fila_modal], 2),
  " ; ",
  round(TDF_Histo_TST$LimSup[fila_modal], 2),
  "]"
)

# =========================
# DISPERSIÓN
# =========================

varianza <- var(TST)
desv_est <- sd(TST)
cv <- round((desv_est / media) * 100, 2)

# =========================
# ASIMETRÍA Y CURTOSIS
# =========================

n <- length(TST)

asimetria <- (n / ((n - 1) * (n - 2))) *
  sum(((TST - mean(TST)) / sd(TST))^3)

curtosis <- (
  (n * (n + 1)) / ((n - 1) * (n - 2) * (n - 3))
) *
sum(((TST - mean(TST)) / sd(TST))^4) -
(
  (3 * (n - 1)^2) /
  ((n - 2) * (n - 3))
)

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

tabla_indicadores <- data.frame(

  Variable = "Media de turistas",

  Rango = paste0(
    "[",
    round(min(TST)/1000000, 2),
    " ; ",
    round(max(TST)/1000000, 2),
    "] M"
  ),

  X = paste0(round(media/1000000, 2), " M"),

  Me = paste0(round(mediana/1000000, 2), " M"),

  Mo = moda_intervalar,

  V = paste0(round(varianza/1e12, 2), " ×10¹²"),

  Sd = paste0(round(desv_est/1000000, 2), " M"),

  Cv = round(cv, 2),

  As = round(asimetria, 2),

  K = round(curtosis, 2),

  Valores_Atipicos = n_atipicos
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("*Tabla Nº3*"),
    subtitle = md("**Indicadores estadísticos de turistas promedio
                  en el estudio de la calidad de agua en Europa
                  (1991-2017)**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 3")
  )

tabla_indicadores_gt
Tabla Nº3
Indicadores estadísticos de 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
Media de turistas [0.53 ; 71.18] M 49.19 M 50.94 M [7.8 ; 8] 609.85 ×10¹² 24.7 M 50.2 -0.59 -1.16 0
Autor: Grupo 3

7. Conclusión

#La media de turistas presenta una media de 49.19 millones y una variabilidad moderada (CV = 50.20%). La asimetría negativa (As = -0.59) indica una ligera concentración de valores superiores a la media, mientras que la curtosis negativa (K = -1.16) refleja una distribución platicúrtica. Además, no se identificaron valores atípicos.