Análisis 1.1:

La base covit_data está compuesta por 82.101 registros y 31 variables, que recogen información de casos confirmados de COVID-19 entre 2019 y 2021. Los datos incluyen variables demográficas, clínicas, hospitalarias y geográficas, lo que permite un análisis integral del comportamiento de la pandemia.

Entre las principales variables se destacan: edad, género, raza, etnia, presencia de síntomas (fiebre, tos, dolor muscular, pérdida del gusto y olfato), hospitalización, fallecimientos y coordenadas geográficas. Los tipos de datos son principalmente numéricos, categóricos y de fecha (POSIXct).

Se identifican valores faltantes significativos en variables relacionadas con síntomas y hospitalización, como sym_resolveddt_FALSE, hosp_admidt_FALSE y died_dt_FALSE, lo que refleja limitaciones en el registro clínico de algunos casos.

En conjunto, esta base es relevante para el análisis descriptivo porque permite observar la distribución de los contagios, los perfiles demográficos más afectados y los síntomas más frecuentes. Además, ofrece una base sólida para estudios sobre la evolución temporal y espacial de la pandemia, aunque requiere depuración previa para asegurar la calidad de los resultados.

# 1. Distribución por case_gender, case_race, case_eth (n y %)
tab_genero <- covit_data %>%
  count(case_gender) %>%
  mutate(porc = round(100 * n / sum(n), 1))

tab_race <- covit_data %>%
  count(case_race) %>%
  mutate(porc = round(100 * n / sum(n), 1))

tab_eth <- covit_data %>%
  count(case_eth) %>%
  mutate(porc = round(100 * n / sum(n), 1))

# Mostrar tablas
kable(tab_genero, caption = "Distribución por género", col.names = c("Género", "Frecuencia", "%")) %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Distribución por género
Género Frecuencia %
Female 43299 52.7
Male 38393 46.8
Unknown 346 0.4
NA 63 0.1
kable(tab_race, caption = "Distribución por raza", col.names = c("Raza", "Frecuencia", "%")) %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Distribución por raza
Raza Frecuencia %
AMERICAN INDIAN/ALASKA NATIVE 84 0.1
ASIAN 3075 3.7
BLACK 35048 42.7
NATIVE HAWAIIAN/PACIFIC ISLANDER 79 0.1
OTHER 5863 7.1
UNKNOWN 3723 4.5
WHITE 31599 38.5
NA 2630 3.2
kable(tab_eth, caption = "Distribución por etnicidad", col.names = c("Etnicidad", "Frecuencia", "%")) %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Distribución por etnicidad
Etnicidad Frecuencia %
HISPANIC/LATINO 8625 10.5
NON-HISPANIC/LATINO 62677 76.3
NOT SPECIFIED 8225 10.0
NA 2574 3.1
# 2. Crear variable age_group
covit_data <- covit_data %>%
  mutate(age_group = cut(case_age,
                         breaks = c(0, 17, 29, 44, 64, Inf),
                         labels = c("0-17", "18-29", "30-44", "45-64", "65+"),
                         right = TRUE))

# 3. Tabla cruzada age_group × case_gender
tabla_edad_genero <- covit_data %>%
  count(age_group, case_gender) %>%
  group_by(age_group) %>%
  mutate(porc = round(100 * n / sum(n), 1))

kable(tabla_edad_genero, caption = "Distribución cruzada edad × género", col.names = c("Grupo de edad", "Género", "Frecuencia", "%")) %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Distribución cruzada edad × género
Grupo de edad Género Frecuencia %
0-17 Female 3946 50.1
0-17 Male 3879 49.3
0-17 Unknown 37 0.5
0-17 NA 9 0.1
18-29 Female 11227 54.4
18-29 Male 9333 45.2
18-29 Unknown 84 0.4
18-29 NA 12 0.1
30-44 Female 11935 52.6
30-44 Male 10639 46.9
30-44 Unknown 96 0.4
30-44 NA 15 0.1
45-64 Female 10969 51.0
45-64 Male 10432 48.5
45-64 Unknown 79 0.4
45-64 NA 15 0.1
65+ Female 5132 55.7
65+ Male 4026 43.7
65+ Unknown 38 0.4
65+ NA 11 0.1
NA Female 90 48.1
NA Male 84 44.9
NA Unknown 12 6.4
NA NA 1 0.5

Análisis 2.1 Perfil Demográfico

  1. Distribución por género: La base muestra una ligera mayoría de mujeres (52,7%) frente a hombres (46,8%), mientras que los casos con género desconocido o no especificado apenas representan el 0,5% del total. Esta proporción indica una buena calidad en el registro de esta variable y sugiere que las mujeres fueron ligeramente más diagnosticadas o reportadas durante el periodo analizado.

  2. Distribución por raza: En la distribución por raza, predominan las personas negras (42,7%) y blancas (38,5%), seguidas por los grupos clasificados como Other (7,1%) y Asian (3,7%). Los valores desconocidos o no especificados suman alrededor del 7,7%, lo que refleja algunas limitaciones en la captura de esta información. Esta variable resulta relevante para analizar posibles desigualdades en el impacto del COVID-19 según características raciales.

  3. Distribución por etnicidad: La mayoría de los registros corresponden a personas no hispanas/latinas (76,3%), seguidas por hispanas/latinas (10,5%), mientras que el 13,1% restante no especifica esta información. La variable permite observar diferencias culturales o sociales que podrían influir en los niveles de exposición o atención médica durante la pandemia.

  4. Distribución cruzada por edad y género: El análisis cruzado muestra una distribución equilibrada entre hombres y mujeres en todos los grupos de edad, con una leve mayoría femenina en la mayoría de los rangos, especialmente en mayores de 65 años (55,7%). Este patrón puede estar asociado con una mayor esperanza de vida en mujeres o una mayor disposición a acudir a servicios de salud.

# Identificar columnas de síntomas válidas (tipo texto/factor con Yes/No)
cols_sintomas <- covit_data %>%
  select(starts_with("sym_")) %>%
  select(where(~is.character(.x) | is.factor(.x))) %>%
  select(-any_of(c("sym_startdt_FALSE", "sym_resolveddt_FALSE", "sym_resolved"))) %>%
  names()

# Calcular proporción de respuestas "Yes" por síntoma (%)
proporcion_sintomas <- covit_data %>%
  summarise(across(all_of(cols_sintomas), ~mean(.x == "Yes", na.rm = TRUE))) %>%
  pivot_longer(everything(), names_to = "sintoma", values_to = "proporcion") %>%
  mutate(
    proporcion = round(proporcion * 100, 1),
    sintoma = gsub("^sym_", "", sintoma)  # quitar el prefijo "sym_"
  ) %>%
  arrange(desc(proporcion))

# Mostrar los 7 síntomas más frecuentes
top_sintomas <- head(proporcion_sintomas, 7)

# Tabla
kable(top_sintomas, 
      caption = "Proporción de respuestas 'Yes' por síntoma (Top 7)", 
      col.names = c("Síntoma", "Proporción (%)")) %>%
  kable_styling(full_width = FALSE, 
                position = "center", 
                bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  column_spec(2, width = "8em", bold = TRUE) %>%
  add_header_above(c(" " = 1, "Frecuencia de Síntomas" = 1))
Proporción de respuestas ‘Yes’ por síntoma (Top 7)
Frecuencia de Síntomas
Síntoma Proporción (%)
cough 43.5
headache 43.3
losstastesmell 40.6
myalgia 39.1
fever 29.9
subjfever 28.8
sorethroat 25.1

Análisis 2.2 Sintomas

La tabla presenta la proporción de respuestas afirmativas (“Yes”) por síntoma en los casos registrados. Los resultados evidencian que los síntomas más comunes fueron tos (43,5%) y dolor de cabeza (43,3%), seguidos por la pérdida del gusto y del olfato (40,6%) y el dolor muscular o corporal (39,1%).

En menor medida se reportaron síntomas como fiebre (29,9%), sensación de fiebre sin confirmación (28,8%) y dolor de garganta (25,1%).

Esto refleja que la mayoría de los casos presentaron síntomas respiratorios y neurosensoriales característicos del COVID-19, información clave para e la identificación de patrones clínicos predominantes en la población afectada.

# Tasa de hospitalización total (%)
tasa_hosp <- covit_data %>%
  filter(!is.na(hospitalized)) %>%
  summarise(Tasa_Hospitalización = round(mean(hospitalized == "Yes") * 100, 2))

# Tasa de letalidad total (%)
tasa_letal <- covit_data %>%
  filter(confirmed_case == "Yes" & !is.na(died)) %>%
  summarise(Tasa_Letalidad = round(mean(died == "Yes") * 100, 2))

# Hospitalización y letalidad por grupo de edad
resumen_edad <- covit_data %>%
  group_by(age_group) %>%
  summarise(
    Tasa_Hospitalización = round(mean(hospitalized == "Yes", na.rm = TRUE) * 100, 2),
    Tasa_Letalidad = round(mean(died == "Yes" & confirmed_case == "Yes", na.rm = TRUE) * 100, 2)
  )

# Mostrar tablas
kable(tasa_hosp, caption = "Tasa global de hospitalización (%)") %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("hover", "condensed"))
Tasa global de hospitalización (%)
Tasa_Hospitalización
10.68
kable(tasa_letal, caption = "Tasa global de letalidad (CFR, %)") %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("hover", "condensed"))
Tasa global de letalidad (CFR, %)
Tasa_Letalidad
3.76
kable(resumen_edad, caption = "Tasa de hospitalización y letalidad por grupo de edad (%)") %>%
  kable_styling(full_width = FALSE, position = "center", bootstrap_options = c("striped", "hover", "condensed", "responsive"))
Tasa de hospitalización y letalidad por grupo de edad (%)
age_group Tasa_Hospitalización Tasa_Letalidad
0-17 1.76 0.04
18-29 3.08 0.12
30-44 6.30 0.43
45-64 13.66 2.58
65+ 38.47 25.23
NA 12.73 0.00

Análisis 2.3 Resultados Clinicos

  1. Tasa global de hospitalización: La tasa global de hospitalización es del 10,68%, lo que indica que una de cada diez personas diagnosticadas con COVID-19 requirió atención hospitalaria. Este valor refleja una afectación clínica moderada dentro de la población estudiada y sugiere que la mayoría de los casos no presentó complicaciones graves.

  2. Tasa global de letalidad (CFR): La tasa de letalidad global registrada es del 3,76%, lo que representa la proporción de personas fallecidas entre los casos confirmados. Este indicador es clave para evaluar la gravedad y el impacto sanitario del virus durante el periodo analizado.

  3. Tasa de hospitalización y letalidad por grupo de edad: El análisis por grupo de edad evidencia una relación directa entre la edad y la severidad de los casos. Las tasas de hospitalización y letalidad aumentan progresivamente con la edad, alcanzando sus niveles más altos en el grupo de 65 años o más, con 38,47% de hospitalización y 25,23% de letalidad. En contraste, los menores de 30 años presentan cifras muy bajas, con menos del 3% de hospitalización y una letalidad inferior al 0,2%.

# Asegurar formato de fecha correcto
covit_data <- covit_data %>%
  mutate(reprt_creationdt_FALSE = as.Date(reprt_creationdt_FALSE))

# Agrupar por fecha de reporte
casos_diarios <- covit_data %>%
  group_by(reprt_creationdt_FALSE) %>%
  summarise(Casos = n()) %>%
  arrange(reprt_creationdt_FALSE) %>%
  mutate(MediaMovil7d = zoo::rollmean(Casos, 7, fill = NA, align = "right"))

# Gráfico de barras con línea de media móvil
ggplot(casos_diarios, aes(x = reprt_creationdt_FALSE, y = Casos)) +
  geom_col(fill = "#0073C2FF", alpha = 0.7) +
  geom_line(aes(y = MediaMovil7d), color = "purple", linewidth = 1) +
  labs(
    title = "Casos diarios de COVID-19 y media móvil de 7 días",
    x = "Fecha de reporte",
    y = "Número de casos"
  ) +
  theme_minimal()
## Warning: Removed 6 rows containing missing values or values outside the scale range
## (`geom_line()`).

Análisis 3.1

El gráfico evidencia la evolución de los casos diarios de COVID-19, donde se identifican dos picos principales de contagio. El primero se presenta hacia mediados de 2020, mientras que el segundo, más pronunciado, ocurre entre finales de 2020 e inicios de 2021. Este último pico refleja un mayor número de casos y personas afectadas, posiblemente como consecuencia de una disminución en la aplicación de las medidas de bioseguridad debido a la estacionalidad y al aumento de la interacción social.

Posteriormente, se observa una reducción progresiva en los contagios, resultado de la implementación de estrategias de control sanitario y del avance de la vacunación, lo que permitió mitigar la propagación del virus y estabilizar la situación epidemiológica.

# Gráfico de barras apiladas por grupo de edad y género

ggplot(covit_data, aes(x = age_group, fill = case_gender)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent_format()) +
scale_fill_brewer(palette = "Set2", name = "Género") +
labs(
title = "Distribución demográfica por grupo etario y género",
x = "Grupo de edad",
y = "Proporción dentro del grupo"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom"
)

Análisis 3.2 :

El gráfico evidencia cómo se distribuyen los casos de COVID-19 según la edad y el género. En general, se observa una proporción bastante equilibrada entre hombres y mujeres en la mayoría de los grupos etarios. Los grupos de 18 a 29 años y de 30 a 44 años presentan una mayor participación dentro de los casos reportados, lo que puede relacionarse con su alta actividad laboral y social durante el periodo de pandemia.

Por otro lado, en el grupo de mayores de 65 años se nota una menor proporción, posiblemente como resultado de las medidas de cuidado especial y la priorización en la vacunación, lo que ayudó a reducir el riesgo de contagio en esta población.

# Calcular tasas por grupo de edad

tasa_grupo <- covit_data %>%
group_by(age_group) %>%
summarise(
Tasa_Hospitalización = mean(hospitalized == "Yes", na.rm = TRUE) * 100,
Tasa_Letalidad = mean(died == "Yes" & confirmed_case == "Yes", na.rm = TRUE) * 100
) %>%
pivot_longer(cols = c(Tasa_Hospitalización, Tasa_Letalidad),
names_to = "Indicador", values_to = "Porcentaje")

# Gráfico comparativo

ggplot(tasa_grupo, aes(x = age_group, y = Porcentaje, fill = Indicador)) +
geom_col(position = "dodge", width = 0.7) +
scale_fill_brewer(palette = "Set1", name = "Indicador") +
labs(
title = "Tasas de hospitalización y letalidad por grupo etario",
x = "Grupo de edad",
y = "Porcentaje (%)"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom"
)

Análisis 3.3 :

El gráfico evidencia cómo el riesgo frente al COVID-19 aumenta de manera notable con la edad. Los grupos más jóvenes, especialmente entre los 0 y 44 años, presentan porcentajes bajos tanto de hospitalización como de letalidad, lo que refleja una mayor resistencia o una respuesta más favorable ante la enfermedad.

Por otro lado, se observa un incremento considerable en los grupos de edad avanzada, especialmente en las personas mayores de 65 años, quienes registran los niveles más altos en ambos indicadores. Esto demuestra que la población adulta mayor fue la más afectada por el virus, probablemente debido a condiciones de salud preexistentes y una menor respuesta inmunológica. En general, este comportamiento resalta la importancia de las estrategias de prevención, vacunación y atención prioritaria para los grupos más vulnerables, buscando reducir las complicaciones y la mortalidad asociada al COVID-19.

# Seleccionar solo las columnas de síntomas válidas (excluyendo fechas y estado)

cols_sintomas <- covit_data %>%
select(starts_with("sym_")) %>%
select(-any_of(c("sym_startdt_FALSE", "sym_resolveddt_FALSE", "sym_resolved"))) %>%
select(where(~is.character(.x) | is.factor(.x))) %>%
names()

# Calcular proporción promedio de síntomas por grupo etario

sintomas_por_edad <- covit_data %>%
select(age_group, all_of(cols_sintomas)) %>%
pivot_longer(-age_group, names_to = "Sintoma", values_to = "Presente") %>%
mutate(Presente = ifelse(Presente == "Yes", 1, 0)) %>%
group_by(age_group, Sintoma) %>%
summarise(Proporcion = mean(Presente, na.rm = TRUE) * 100, .groups = "drop") %>%
mutate(Sintoma = gsub("^sym_", "", Sintoma))  # quitar prefijo para mostrar más limpio

# Crear heatmap de síntomas por grupo etario

ggplot(sintomas_por_edad, aes(x = Sintoma, y = age_group, fill = Proporcion)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "#e0f3f8", high = "#08306b", name = "Frecuencia (%)") +
labs(
title = "Frecuencia de síntomas por grupo etario",
x = "Síntoma",
y = "Grupo de edad"
) +
theme_minimal(base_size = 12) +
theme(
axis.text.x = element_text(angle = 45, hjust = 1),
plot.title = element_text(face = "bold", hjust = 0.5)
)

Análisis 3.4 :

El gráfico muestra la frecuencia con la que se presentaron distintos síntomas de COVID-19 según los grupos de edad. Se evidencia que los síntomas más comunes, como la tos, la pérdida del gusto y el dolor de cabeza, aparecen en todos los grupos etarios con una alta prevalencia. Sin embargo, la intensidad varía levemente entre edades, siendo más notoria en los adultos jóvenes y en los grupos de mediana edad, donde los síntomas como la anosmia y la mialgia presentan mayor frecuencia.

En los adultos mayores, los síntomas respiratorios como la tos y la fiebre se destacan con más presencia, lo que podría estar relacionado con una respuesta más fuerte del sistema inmunológico o con condiciones de salud preexistentes. En general, el gráfico permite identificar cómo ciertos síntomas se mantienen constantes a través de las edades, mientras otros pueden variar según las características fisiológicas y la vulnerabilidad del grupo etario.