# 1. CARGA DE LIBRERÍAS Y DATOS
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.6.0
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.2.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Cargar la base de datos.
datos <- read.csv("establecimientos_20251014.csv",
sep = ";",
encoding = "latin1", # Ayuda con tildes y ñ
stringsAsFactors = FALSE)
# 2. LIMPIEZA Y PREPARACIÓN DE VARIABLES
# creacion de un subconjunto de datos limpio para responder la pregunta.
# pregunta compara "Dependencia Administrativa" (Público vs Privado)
# contra "Nivel de Complejidad" y "Servicio de Urgencia".
datos_analisis <- datos %>%
# 1. Crear la variable "Sector" agrupando las dependencias
mutate(Sector = case_when(
DependenciaAdministrativa %in% c("Servicio de Salud", "Municipal",
"Corporación Municipal", "SEREMI de Salud",
"Público", "Delegado", "Delegados",
"Gendamería") ~ "Público",
DependenciaAdministrativa %in% c("Privado", "Otra Institución") ~ "Privado",
TRUE ~ "Otros" # Para FFAA u otros que quieras excluir
)) %>%
# 2. Estandarizar la variable Urgencia (hay "NO" y "No" mezclados)
mutate(TieneUrgencia = case_when(
toupper(TieneServicioUrgencia) == "SI" ~ "Sí",
toupper(TieneServicioUrgencia) == "NO" ~ "No",
TRUE ~ NA_character_ # Marcar "No Aplica" como NA para filtrar después
)) %>%
# 3. Filtrar datos que no nos sirven (Nulos, "No Aplica", o "Otros" sectores)
filter(Sector %in% c("Público", "Privado"),
!is.na(TieneUrgencia),
NivelComplejidadEstabGlosa %in% c("Alta Complejidad", "Mediana Complejidad", "Baja Complejidad"))
# Verificcion de datos limpios
table(datos_analisis$Sector)
##
## Privado Público
## 1073 3008
table(datos_analisis$NivelComplejidadEstabGlosa)
##
## Alta Complejidad Baja Complejidad Mediana Complejidad
## 118 3149 814
# 3. ESTADÍSTICA DESCRIPTIVA (Tablas)
print("--- Tabla Cruzada: Sector vs. Nivel de Complejidad ---")
## [1] "--- Tabla Cruzada: Sector vs. Nivel de Complejidad ---"
tabla_complejidad <- table(datos_analisis$Sector, datos_analisis$NivelComplejidadEstabGlosa)
print(tabla_complejidad)
##
## Alta Complejidad Baja Complejidad Mediana Complejidad
## Privado 47 376 650
## Público 71 2773 164
# Porcentajes (prop.table con margin=1 para ver % dentro de cada sector)
print(round(prop.table(tabla_complejidad, margin = 1) * 100, 2))
##
## Alta Complejidad Baja Complejidad Mediana Complejidad
## Privado 4.38 35.04 60.58
## Público 2.36 92.19 5.45
print("--- Tabla Cruzada: Sector vs. Disponibilidad de Urgencia ---")
## [1] "--- Tabla Cruzada: Sector vs. Disponibilidad de Urgencia ---"
tabla_urgencia <- table(datos_analisis$Sector, datos_analisis$TieneUrgencia)
print(tabla_urgencia)
##
## No Sí
## Privado 1017 56
## Público 2324 684
# Porcentajes
print(round(prop.table(tabla_urgencia, margin = 1) * 100, 2))
##
## No Sí
## Privado 94.78 5.22
## Público 77.26 22.74
# 4. VISUALIZACIÓN (Para el Póster)
# Gráfico 1: Nivel de Complejidad según Sector
g1 <- ggplot(datos_analisis, aes(x = Sector, fill = NivelComplejidadEstabGlosa)) +
geom_bar(position = "fill") + # "fill" crea barras al 100% para comparar proporciones
labs(title = "Figura 1: Distribución de Complejidad según Sector",
y = "Proporción",
x = "Sector Administrativo",
fill = "Nivel de Complejidad") +
theme_minimal() +
scale_fill_brewer(palette = "Blues")
print(g1)

# Gráfico 2: Disponibilidad de Urgencia según Sector
g2 <- ggplot(datos_analisis, aes(x = Sector, fill = TieneUrgencia)) +
geom_bar(position = "fill") +
labs(title = "Figura 2: Disponibilidad de Servicios de Urgencia",
y = "Proporción",
x = "Sector Administrativo",
fill = "Tiene Urgencia") +
theme_minimal() +
scale_fill_manual(values = c("No" = "#FF9999", "Sí" = "#66CC99")) # Colores personalizados
print(g2)

# 5. ESTADÍSTICA INFERENCIAL (Prueba de Hipótesis)
# Usamos Chi-Cuadrado porque comparamos variables categóricas.
# H0: Las variables son independientes (No hay diferencia entre sectores).
# H1: Las variables están relacionadas (Hay diferencias significativas).
print("--- Resultado Test Chi-Cuadrado: Complejidad ---")
## [1] "--- Resultado Test Chi-Cuadrado: Complejidad ---"
test_complejidad <- chisq.test(tabla_complejidad)
print(test_complejidad)
##
## Pearson's Chi-squared test
##
## data: tabla_complejidad
## X-squared = 1550.8, df = 2, p-value < 2.2e-16
print("--- Resultado Test Chi-Cuadrado: Urgencia ---")
## [1] "--- Resultado Test Chi-Cuadrado: Urgencia ---"
test_urgencia <- chisq.test(tabla_urgencia)
print(test_urgencia)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_urgencia
## X-squared = 162.36, df = 1, p-value < 2.2e-16
# ANEXO: Detección de la MODA (La única medida de tendencia central válida aquí)
# 1. Moda de la Dependencia (¿Hay más públicos o privados?)
moda_sector <- names(sort(table(datos_analisis$Sector), decreasing = TRUE)[1])
cat("La Moda del Sector es:", moda_sector, "\n")
## La Moda del Sector es: Público
# 2. Moda de la Complejidad
moda_complejidad <- names(sort(table(datos_analisis$NivelComplejidadEstabGlosa), decreasing = TRUE)[1])
cat("La Moda de la Complejidad es:", moda_complejidad, "\n")
## La Moda de la Complejidad es: Baja Complejidad
# 3. Moda de Urgencia
moda_urgencia <- names(sort(table(datos_analisis$TieneUrgencia), decreasing = TRUE)[1])
cat("La Moda de Disponibilidad de Urgencia es:", moda_urgencia, "\n")
## La Moda de Disponibilidad de Urgencia es: No