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)
df <- read.csv(
"waterPollution.csv",
sep = ",",
stringsAsFactors = FALSE
)
# -------------------------
# Extraer variable
# -------------------------
Turistas <- round(
df$TouristMean_1990_2020
)
# Eliminar valores faltantes
Turistas <- na.omit(Turistas)
# -------------------------
# 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 | ||||
# -------------------------
# 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.
# =========================
# 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
)
# =========================
# 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
)
# =========================
# 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
)
# =========================
# 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
)
# =========================
# 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"
)
# ======================================
# 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
)
# ======================================
# 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
)
# =========================
# 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)
# =========================
# 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)
# =========================
# 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
}
# =========================
# 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.
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.