Clase 11 - Estadística descriptiva
Conjunto de datos
Para esta clase se utilizará una base de datos correspondiente a los pacientes egresados de todos los hospitales públicos del país durante el año 2017. Estos datos fueron descargados desde el sitio web del Departamento de Estadísticas e Informaciones en Salud (DEIS).
Ninguna de las variables utilizadas pueden ser asociadas a información considerada privada o sensibles.
Ejemplos generales
1.1. Distribución de frecuencia
Variables cualitativa - Previsión
Para ejemplificar como efectuar una tabla de frecuencia sobre una variable cualitativa se usará el atributo previsión.
#Tabla de frecuencia variables cuanlitativas
#Frecuencia
fi=-as.numeric(sort(-table(datos$PREVI))) #Frecuencia absoluta
fac=cumsum(fi) #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100 #Frecuencia relativa
frac=cumsum(fri) #Frecuencia relativa acumulada
previ=c("FONASA","ISAPRE","SIN PREVISIÓN","OTRA","DIPRECA","CAPREDENA","IGNORADA")
#Tabla
frec_previ=data.frame(previ,fi,fac,fri=round(fri,2),frac=round(frac,2))
#Visualización
knitr::kable(frec_previ)
previ | fi | fac | fri | frac |
---|---|---|---|---|
FONASA | 707737 | 707737 | 67.50 | 67.50 |
ISAPRE | 239809 | 947546 | 22.87 | 90.37 |
SIN PREVISIÓN | 29934 | 977480 | 2.85 | 93.22 |
OTRA | 22751 | 1000231 | 2.17 | 95.39 |
DIPRECA | 22690 | 1022921 | 2.16 | 97.55 |
CAPREDENA | 22219 | 1045140 | 2.12 | 99.67 |
IGNORADA | 3435 | 1048575 | 0.33 | 100.00 |
Variables cuantitativa - Edad
Para ejemplificar como efectuar una tabla de frecuencia sobre una variable cualitativa se usará el atributo edad.
#Tabla de frecuencia variables cuantitativas
#Frecuencia
fi=as.numeric(table(datos$EDAD)) #Frecuencia absoluta
fac=cumsum(fi) #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100 #Frecuencia relativa
frac=cumsum(fri) #Frecuencia relativa acumulada
#Tabla
edad=sort(unique(datos$EDAD))
frec_edad=data.frame(edad,fi,fac,fri=round(fri,2),frac=round(frac,2))
#Visualización
knitr::kable(head(frec_edad,5))
edad | fi | fac | fri | frac |
---|---|---|---|---|
0 | 51937 | 51937 | 4.95 | 4.95 |
1 | 16025 | 67962 | 1.53 | 6.48 |
2 | 11046 | 79008 | 1.05 | 7.53 |
3 | 9804 | 88812 | 0.93 | 8.47 |
4 | 8904 | 97716 | 0.85 | 9.32 |
edad | fi | fac | fri | frac | |
---|---|---|---|---|---|
106 | 105 | 14 | 1048564 | 0 | 100 |
107 | 106 | 5 | 1048569 | 0 | 100 |
108 | 107 | 2 | 1048571 | 0 | 100 |
109 | 108 | 2 | 1048573 | 0 | 100 |
110 | 109 | 2 | 1048575 | 0 | 100 |
Pregunta
¿Qué ocurre al construir directamente una tabla de frecuencia?¿Qué conclusiones se pueden extraer?
#Tabla de frecuencia variables cuantitativas
#Frecuencia
edad=sort(unique(datos$EDAD)) # Ordenar los datos
n = length(edad) # Número de elementos de edad
k = round(1 + 3.3 * log(n)) # Aplicamos regla de Sturges
h = round((max(edad)-min(edad))/k) # Cálculo de intervalo
#Crear intervalos
intervalos=hist(datos$EDAD, plot=FALSE, breaks = k)$breaks
intervalos=paste("(",intervalos[1:(length(intervalos)-1)],"-",intervalos[2:(length(intervalos))],"]",sep="")
intervalos[1]="[0-5]"
#Cálculo de frecuencia
fi = hist(datos$EDAD, plot=FALSE, breaks = k)$counts #Frecuencia con intervalos
fac=cumsum(fi) #Frecuencia acumulada
fri=as.numeric(fi/sum(fi))*100 #Frecuencia relativa
frac=cumsum(fri) #Frecuencia relativa acumulada
frec_edad=data.frame(edad=intervalos,fi,fac,fri=round(fri,2),frac=round(frac,2))
knitr::kable(frec_edad)
edad | fi | fac | fri | frac |
---|---|---|---|---|
[0-5] | 105591 | 105591 | 10.07 | 10.07 |
(5-10] | 29897 | 135488 | 2.85 | 12.92 |
(10-15] | 28213 | 163701 | 2.69 | 15.61 |
(15-20] | 49624 | 213325 | 4.73 | 20.34 |
(20-25] | 75668 | 288993 | 7.22 | 27.56 |
(25-30] | 91775 | 380768 | 8.75 | 36.31 |
(30-35] | 87810 | 468578 | 8.37 | 44.69 |
(35-40] | 73278 | 541856 | 6.99 | 51.68 |
(40-45] | 58853 | 600709 | 5.61 | 57.29 |
(45-50] | 53750 | 654459 | 5.13 | 62.41 |
(50-55] | 59219 | 713678 | 5.65 | 68.06 |
(55-60] | 60988 | 774666 | 5.82 | 73.88 |
(60-65] | 59949 | 834615 | 5.72 | 79.60 |
(65-70] | 57143 | 891758 | 5.45 | 85.04 |
(70-75] | 51796 | 943554 | 4.94 | 89.98 |
(75-80] | 42090 | 985644 | 4.01 | 94.00 |
(80-85] | 31800 | 1017444 | 3.03 | 97.03 |
(85-90] | 21528 | 1038972 | 2.05 | 99.08 |
(90-95] | 7755 | 1046727 | 0.74 | 99.82 |
(95-100] | 1669 | 1048396 | 0.16 | 99.98 |
(100-105] | 168 | 1048564 | 0.02 | 100.00 |
(105-110] | 11 | 1048575 | 0.00 | 100.00 |
1.2. Gráficos
Variables cuantitativas- Previsión
Para ejemplificar como representar gráficamente variables cualitativas usaremos gráficos de barra, tipo pie y representación de Pareto. Sin embargo, existen múltiples alternativas de representación. Estas serán vistas en el Módulo 5 del diplomado.
Gráfico de barras
Gráfico tipo pie
p=ggplot(frec_previ, aes(x="", y=fri, fill=reorder(previ, -fri))) +
geom_bar(stat="identity", width=1) + coord_polar("y", start=0) + theme_minimal() +
labs(title="Frecuencia relativa - Previsión", x="Previsión", y = "Frecuencia relativa (%)")
p=p + scale_fill_brewer(palette="RdPu",name = "Tipo de Previsión")
plot(p)
Gráfico tipo Pareto
# Gráfico de barras
p=ggplot(data=frec_previ, aes(x=reorder(previ, -fri),y=fi)) +
geom_bar(stat="identity",fill="maroon",alpha=0.8) + theme_minimal() +
labs(title="Frecuencia absoluta y absoluta acumulada - Previsión", x="Previsión", y = "Frecuencia absoluta")
p = p + geom_point(aes(y=fac))
ggplotly(p)
Variables cuantitativas - Edad
Al igual que las variables cualitativas, existen múltiples alternativas de representación. En este caso he ejemplificado 2: diagrama de puntos e histograma.
Histograma
grafico=ggplot(datos,aes(EDAD)) # Gráfico y datos base
#Histograma (25 niveles) (colores- http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf)
grafico = grafico + geom_histogram(bins=30,fill="maroon",color="maroon",alpha=0.8)
grafico = grafico + theme_bw() # Visualización estándar en blanco y negro
grafico = grafico + ylab("Frecuencia absoluta (edad)") + xlab("Edad (años)")
grafico = grafico + ggtitle("Histograma")
ggplotly(grafico)
Pregunta
¿Qué diferencia aprecia entre ambos tipos de representaciones?
1.3. Métricas
Las métricas de posición, centralidad, dispersión y forma pueden ser calculadas rápidamente por la biblioteca psych. Por ejemplo, veamos
library(psych)
metricas=describeBy(EDAD ~ ESTAB,data =datos,mat = T,digits = 2,IQR=T,quant=c(.25,.50,.75)) #Cálculo e métricas
cv = metricas$sd/metricas$mean #Cálculo de CV
metricas=cbind(metricas,cv=round(cv,2)) #Adición
metricas=metricas[order(-metricas$mean),] #Ordenar de mayor a menor
knitr::kable(head(metricas,10))
item | group1 | vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | IQR | Q0.25 | Q0.5 | Q0.75 | cv | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1115 | 115 | 112106 | 1 | 898 | 81.93 | 8.51 | 83.0 | 82.26 | 8.90 | 60 | 103 | 43 | -0.31 | -0.39 | 0.28 | 12.0 | 76.0 | 83.0 | 88 | 0.10 |
157 | 57 | 107110 | 1 | 518 | 74.44 | 8.11 | 74.0 | 74.35 | 8.90 | 50 | 103 | 53 | 0.10 | -0.17 | 0.36 | 12.0 | 68.0 | 74.0 | 80 | 0.11 |
1108 | 108 | 111351 | 1 | 22 | 74.27 | 8.71 | 73.5 | 74.17 | 8.90 | 54 | 93 | 39 | -0.05 | -0.05 | 1.86 | 10.5 | 69.5 | 73.5 | 80 | 0.12 |
167 | 67 | 107267 | 1 | 180 | 70.73 | 17.71 | 74.0 | 72.81 | 16.31 | 17 | 96 | 79 | -1.07 | 0.77 | 1.32 | 23.0 | 61.0 | 74.0 | 84 | 0.25 |
1168 | 168 | 114206 | 1 | 90 | 70.60 | 18.02 | 75.0 | 72.99 | 14.08 | 17 | 98 | 81 | -1.18 | 0.99 | 1.90 | 21.0 | 62.0 | 75.0 | 83 | 0.26 |
1219 | 219 | 123104 | 1 | 158 | 69.81 | 16.51 | 75.5 | 71.48 | 12.60 | 16 | 100 | 84 | -1.06 | 1.13 | 1.31 | 21.0 | 60.0 | 75.5 | 81 | 0.24 |
1182 | 182 | 115111 | 1 | 141 | 68.63 | 19.19 | 73.0 | 70.71 | 16.31 | 16 | 99 | 83 | -0.88 | 0.07 | 1.62 | 26.0 | 58.0 | 73.0 | 84 | 0.28 |
1173 | 173 | 115102 | 1 | 139 | 67.78 | 15.10 | 69.0 | 68.15 | 19.27 | 22 | 99 | 77 | -0.27 | -0.61 | 1.28 | 25.5 | 55.5 | 69.0 | 81 | 0.22 |
1184 | 184 | 115113 | 1 | 91 | 67.71 | 17.07 | 70.0 | 69.95 | 14.83 | 17 | 96 | 79 | -1.08 | 0.94 | 1.79 | 19.5 | 60.5 | 70.0 | 80 | 0.25 |
1220 | 220 | 123105 | 1 | 53 | 67.68 | 20.04 | 72.0 | 70.09 | 22.24 | 16 | 94 | 78 | -0.93 | 0.40 | 2.75 | 27.0 | 57.0 | 72.0 | 84 | 0.30 |
Ejemplo aplicado
Me me gustaría conocer cuánto tiempo están los pacientes que poseen cirrosis hepáticas (K703) en los hospitales públicos de nuestro país.
Ordenamiento de datos
Procedemos a ordenar los datos.
ESTAB | Seremi | ServicioSalud | SEXO | EDAD | PREVI | BENEF | MOD | COMUNA | REGION | SERV_RES | FECHA_EGR | SERC_EGR | DIAG1 | DIAG2 | DIAS_ESTAD | COND_EGR | INTERV_Q | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
280 | 111295 | 13 | NA | 1 | 55 | 1 | B | 2 | 13402 | 13 | 13 | 14-11-2017 | 406 | K703 | 7 | 2 | 2 | |
2868 | 111295 | 13 | NA | 1 | 41 | 1 | A | 2 | 13401 | 13 | 13 | 24-03-2017 | 406 | K703 | 18 | 1 | 1 | |
2895 | 111295 | 13 | NA | 1 | 51 | 1 | B | 2 | 13101 | 13 | 11 | 27-11-2017 | 405 | K703 | 20 | 2 | 2 | |
3181 | 111295 | 13 | NA | 1 | 72 | 1 | B | 2 | 13401 | 13 | 13 | 08-10-2017 | 405 | K703 | 1 | 2 | 2 | |
13926 | 102100 | NA | 2 | 1 | 42 | 1 | B | 1 | 1405 | 1 | 2 | 03-02-2017 | 402 | K703 | 2 | 2 | 2 | |
13927 | 102100 | NA | 2 | 1 | 58 | 1 | D | 1 | 1107 | 1 | 2 | 28-02-2017 | 401 | K703 | 18 | 1 | 2 | |
16901 | 103100 | NA | 3 | 1 | 58 | 3 | NA | 2101 | 2 | 3 | 05-04-2017 | 403 | K703 | 11 | 1 | 2 | ||
18072 | 102100 | NA | 2 | 1 | 53 | 1 | A | 1 | 1101 | 1 | 2 | 30-06-2017 | 402 | K703 | 10 | 1 | 2 | |
18073 | 102100 | NA | 2 | 1 | 57 | 1 | A | 1 | 1101 | 1 | 2 | 16-02-2017 | 401 | K703 | 539 | 2 | 1 | |
25816 | 102100 | NA | 2 | 1 | 51 | 1 | A | 1 | 1101 | 1 | 2 | 21-04-2017 | 402 | K703 | 11 | 1 | 2 |
Medidas estadísticas
Podemos obtener las métricas estadísticas de la siguiente manera:
metricas=describeBy(DIAS_ESTAD ~ ESTAB,data=datos_estudio,mat = T,digits = 2,IQR=T,quant=c(.25,.50,.75)) #Cálculo e métricas
cv = metricas$sd/metricas$mean #Cálculo de CV
metricas=cbind(metricas,cv=round(cv,2)) #Adición
metricas=metricas[order(-metricas$n),] #Ordenar de mayor a menor
knitr::kable(head(metricas,5))
item | group1 | vars | n | mean | sd | median | trimmed | mad | min | max | range | skew | kurtosis | se | IQR | Q0.25 | Q0.5 | Q0.75 | cv | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
132 | 32 | 112100 | 1 | 46 | 13.72 | 12.71 | 10.0 | 11.66 | 6.67 | 1 | 67 | 66 | 2.18 | 5.65 | 1.87 | 11.75 | 6.25 | 10.0 | 18.00 | 0.93 |
127 | 27 | 111195 | 1 | 22 | 9.77 | 6.55 | 8.5 | 9.17 | 5.19 | 1 | 27 | 26 | 0.79 | 0.02 | 1.40 | 9.00 | 5.25 | 8.5 | 14.25 | 0.67 |
133 | 33 | 112101 | 1 | 13 | 14.46 | 6.32 | 14.0 | 14.00 | 4.45 | 5 | 29 | 24 | 0.57 | -0.18 | 1.75 | 6.00 | 11.00 | 14.0 | 17.00 | 0.44 |
146 | 46 | 114103 | 1 | 10 | 7.40 | 4.67 | 7.0 | 6.88 | 2.22 | 1 | 18 | 17 | 0.86 | 0.13 | 1.48 | 2.75 | 5.25 | 7.0 | 8.00 | 0.63 |
136 | 36 | 112211 | 1 | 8 | 7.50 | 6.74 | 5.5 | 7.50 | 2.97 | 2 | 23 | 21 | 1.40 | 0.59 | 2.38 | 4.00 | 3.75 | 5.5 | 7.75 | 0.90 |
#Filtramos los primeros 5 hospitales
hospitales=c("112100","111195","112101","114103","112211")
datos_estudio=datos_estudio[which(datos_estudio$ESTAB==hospitales[1] | datos_estudio$ESTAB==hospitales[2] | datos_estudio$ESTAB==hospitales[3] | datos_estudio$ESTAB==hospitales[4] | datos_estudio$ESTAB==hospitales[5]),]
Representación gráfica
grafico_caja=ggplot(datos_estudio,aes(x=as.factor(ESTAB),y=DIAS_ESTAD)) +
geom_boxplot(fill="maroon",alpha=0.8)
grafico_caja = grafico_caja + stat_summary(fun.y=mean, geom="point",
show.legend = F,color="red")
## Warning: `fun.y` is deprecated. Use `fun` instead.
grafico_caja= grafico_caja + theme_bw() + xlab("Hospitales") +
ylab("Días de estadas") + ggtitle("Dias de estadas de pacientes en hospitales - Cirrosis hepática")
grafico_caja = grafico_caja+theme(plot.title = element_text(size=10))
ggplotly(grafico_caja)
Pregunta
¿Qué conclusiones puedo hacer de este ejercicio?
Tarea
Repetir este último ejercicio con otra patología. Establezca conclusiones.