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

# ==========================================
# EXTRACCIÓN DE LA VARIABLE
# ==========================================

# Extraer variable
Venue <- round(df$VenueCount)

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

3. Tabla de distribución de frecuencias

3.1 Tabla de frecuencias

# ==========================================
# TABLA DE FRECUENCIAS
# ==========================================

tabla_freq <- as.data.frame(
  table(Venue)
)

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

# Renombrar columnas
colnames(tabla_freq) <- c(
  "Venue",
  "ni"
)

# Total de observaciones
N <- sum(tabla_freq$ni)

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

# Frecuencias acumuladas ascendentes
tabla_freq$Ni_asc <- cumsum(tabla_freq$ni)
tabla_freq$Hi_asc <- round(
  cumsum(tabla_freq$hi),
  2
)

# Frecuencias acumuladas descendentes
tabla_freq$Ni_dsc <- rev(
  cumsum(rev(tabla_freq$ni))
)

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

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

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

tabla_final <- rbind(
  tabla_freq,
  fila_total
)

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

tabla_final %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°1**"),
    subtitle = md(
      "**Distribución de frecuencias del conteo de lugares
      en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Venue = "Conteo de lugares",
    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 = Venue == "TOTAL"
    )
  ) %>%
  opt_row_striping()
Tabla N°1
Distribución de frecuencias del conteo de lugares en el estudio de la calidad de agua en Europa (1991-2017)
Conteo de lugares ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
0 19410 97.05 19410 97.05 20000 99.94
1 129 0.64 19539 97.69 590 2.89
2 113 0.56 19652 98.25 461 2.25
3 77 0.38 19729 98.63 348 1.69
4 114 0.57 19843 99.2 271 1.31
5 65 0.32 19908 99.52 157 0.74
6 38 0.19 19946 99.71 92 0.42
7 17 0.08 19963 99.79 54 0.23
8 5 0.03 19968 99.82 37 0.15
9 6 0.03 19974 99.85 32 0.12
11 1 0.00 19975 99.85 26 0.09
14 4 0.02 19979 99.87 25 0.09
15 1 0.00 19980 99.87 21 0.07
16 3 0.01 19983 99.88 20 0.07
18 2 0.01 19985 99.89 17 0.06
19 2 0.01 19987 99.9 15 0.05
22 1 0.00 19988 99.9 13 0.04
24 2 0.01 19990 99.91 12 0.04
31 1 0.00 19991 99.91 10 0.03
33 1 0.00 19992 99.91 9 0.03
65 2 0.01 19994 99.92 8 0.03
84 3 0.01 19997 99.93 6 0.02
100 3 0.01 20000 99.94 3 0.01
TOTAL 20000 100.00

3.2 Tabla de frecuencias simplificada

# ==========================================
# simplificacion
# ==========================================

# Eliminar valores faltantes
Venue_tratado <- na.omit(Venue)

# Eliminar los valores iguales a 0
Venue_tratado <- Venue_tratado[Venue_tratado > 0]

# Conservar únicamente 10 intervalos
Venue_tratado <- Venue_tratado[
  Venue_tratado >= 1 &
  Venue_tratado <= 9
]

# ==========================================
# TABLA DE FRECUENCIAS SIMPLIFICADA
# ==========================================

tabla_freq_tratada <- as.data.frame(
  table(Venue_tratado)
)

tabla_freq_tratada <- tabla_freq_tratada[
  order(as.numeric(as.character(tabla_freq_tratada$Venue_tratado))),
]

colnames(tabla_freq_tratada) <- c(
  "Venue",
  "ni"
)

# Total
N_tratado <- sum(tabla_freq_tratada$ni)

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

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

# Frecuencias acumuladas ascendentes
tabla_freq_tratada$Ni_asc <- cumsum(tabla_freq_tratada$ni)
tabla_freq_tratada$Hi_asc <- round(
  cumsum(tabla_freq_tratada$hi),
  2
)

# Frecuencias acumuladas descendentes
tabla_freq_tratada$Ni_dsc <- rev(cumsum(rev(tabla_freq_tratada$ni)))
tabla_freq_tratada$Hi_dsc <- round(
  rev(cumsum(rev(tabla_freq_tratada$hi))),
  2
)

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

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

tabla_final_tratada <- rbind(
  tabla_freq_tratada,
  fila_total
)

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

tabla_final_tratada %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°2**"),
    subtitle = md(
      "**Distribución de frecuencias simplificada del conteo de lugares
      en el estudio de la calidad de agua en Europa (1991-2017)**"
    )
  ) %>%
  cols_label(
    Venue = "Venue Count",
    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 = Venue == "TOTAL"
    )
  ) %>%
  opt_row_striping()
Tabla N°2
Distribución de frecuencias simplificada del conteo de lugares en el estudio de la calidad de agua en Europa (1991-2017)
Venue Count ni hi (%) Ni ↑ Hi ↑ (%) Ni ↓ Hi ↓ (%)
1 129 22.87 129 22.87 564 100
2 113 20.04 242 42.91 435 77.13
3 77 13.65 319 56.56 322 57.09
4 114 20.21 433 76.77 245 43.44
5 65 11.52 498 88.29 131 23.23
6 38 6.74 536 95.03 66 11.71
7 17 3.01 553 98.04 28 4.97
8 5 0.89 558 98.93 11 1.96
9 6 1.07 564 100 6 1.07
TOTAL 564 100.00
tabla_freq_resumida <- tabla_freq_tratada

4. Graficas

4.1 Histograma (ni)

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

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

4.2 Histograma General (ni)

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

barplot(
  tabla_freq_resumida$ni,
  main = "Gráfica N°2: Distribución general del conteo de lugares
  en el estudio de la calidad de agua en Europa (1991-2017)",
  xlab = "Venue Count",
  ylab = "Cantidad",
  col = "lightgreen",
  ylim = c(0, 250),
  names.arg = tabla_freq_resumida$Venue,
  las = 2,
  cex.names = 0.8
)

4.3 Histograma (hi)

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

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

4.4 Histograma General (hi)

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

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

4.5 Diagrama de Caja

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

boxplot(
  Venue,
  horizontal = TRUE,
  col = "orange",
  main = "Gráfica N°5: Distribución del conteo de lugares en el estudio
  de la calidad de agua en Europa (1991-2017)",
  xlab = "Venue Count"
)

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

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

#**Nota:** La caja del diagrama se observa muy próxima al valor 0 debido a que la mayor parte de las observaciones del conjunto de datos corresponde a este valor. En consecuencia, la distribución presenta una fuerte asimetría positiva y numerosos valores atípicos, los cuales se representan como puntos alejados de la caja.

4.6 Ojivas ascendentes y descendentes (Ni)

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

# Posiciones en el eje X
x_pos <- 1:nrow(tabla_freq_resumida)

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

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

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Venue,
  las = 2,
  cex.axis = 0.8
)

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

4.7 Ojivas ascendentes y descendentes (Hi)

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

# Posiciones en el eje X
x_pos <- 1:nrow(tabla_freq_resumida)

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

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

# Etiquetas del eje X
axis(
  side = 1,
  at = x_pos,
  labels = tabla_freq_resumida$Venue,
  las = 2,
  cex.axis = 0.8
)

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

5. Indicadores Estadísticos

5.1 Indicadores de Tendencia Central

# =========================
# INDICADORES ESTADÍSTICOS
# Variable: Conteo de lugares
# =========================

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

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

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

# Mediana
mediana <- median(Venue)

5.2 Dispersión

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

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

# Varianza
varianza <- var(Venue)

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

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

5.3 Asimetría

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

n <- length(Venue)

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

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

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

Q1 <- quantile(Venue, 0.25)

Q3 <- quantile(Venue, 0.75)

RIQ <- Q3 - Q1

LI <- Q1 - 1.5 * RIQ

LS <- Q3 + 1.5 * RIQ

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

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

5.4 Tabla de indicadores

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

tabla_indicadores <- data.frame(
  Variable = "Conteo de lugares",
  Rango = paste0("[", min(Venue), " ; ", max(Venue), "]"),
  X = media,
  Me = mediana,
  Mo = paste(moda, collapse = ", "),
  V = round(varianza, 2),
  Sd = round(desviacion, 2),
  Cv = cv,
  As = round(asimetria, 2),
  K = round(curtosis, 2),
  Valores_Atipicos = mensaje_atipicos,
  stringsAsFactors = FALSE
)

fila <- which(
  tabla_indicadores$Variable ==
    "Conteo de lugares"
)

tabla_indicadores_gt <- tabla_indicadores %>%
  gt() %>%
  tab_header(
    title = md("**Tabla N°3**"),
    subtitle = md(
      "**Indicadores estadísticos del conteo de lugares 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 del conteo de lugares en el estudio de la calidad de agua en Europa (1991-2017)
Variable Rango X Me Mo V Sd Cv As K Valores_Atipicos
Conteo de lugares [0 ; 100] 0.14 0 0 3.7 1.92 1373.08 38.67 1777 590
Autor: Grupo 3

6. Conclusión

# La variable conteo de lugares presenta valores entre 0 y 100, con una media de 0.14 y una mediana y moda iguales a 0, lo que evidencia que la mayoría de las observaciones se concentra en valores bajos. Además, muestra una alta variabilidad (Cv = 1373.08 %), una marcada asimetría positiva y 590 valores atípicos, indicando una distribución no homogénea influenciada por pocos valores elevados.