En primer lugar, se utiliza el dataset con los cambios correspondientes realizados en el Jupyter Notebook.
datos <- read.csv("E:/Cosas U/minería de datos/dataset2.csv") #Ajustar a la ubicación del dataset de cada uno
reservas_medicas <- datos
head(reservas_medicas)
## X Age Scholarship Hipertension Diabetes Alcoholism Handcap SMS_received
## 1 0 62 0 1 0 0 0 0
## 2 1 56 0 0 0 0 0 0
## 3 2 62 0 0 0 0 0 0
## 4 3 8 0 0 0 0 0 0
## 5 4 56 0 1 1 0 0 0
## 6 5 76 0 1 0 0 0 0
## numero_comuna numero_genero dia_semana distancia_fechas numero_No_Show
## 1 40 1 5 0 0
## 2 40 0 5 0 0
## 3 46 1 5 0 0
## 4 55 1 5 0 0
## 5 40 1 5 0 0
## 6 59 1 5 2 0
## colaux
## 1 1
## 2 1
## 3 1
## 4 1
## 5 1
## 6 1
Se procede a estudiar la inasistencia por condición de los pacientes. Para ello, se utiliza el siguiente código:
library("reshape")
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
head(melteado)
## X numero_No_Show variable value
## 1 0 0 Age 62
## 2 1 0 Age 56
## 3 2 0 Age 62
## 4 3 0 Age 8
## 5 4 0 Age 56
## 6 5 0 Age 76
#total
total <- aggregate(as.numeric(value) ~ variable, melteado, FUN = sum)
inasistentesFiltrado <- melteado[(melteado$variable == "Scholarship" | melteado$variable == "Hipertension" | melteado$variable == "Diabetes" | melteado$variable == "Alcoholism" | melteado$variable == "Handcap") & melteado$numero_No_Show == 1,]
inasistentes_sum <- aggregate(as.numeric(value) ~ variable, inasistentesFiltrado, FUN = sum)
inasistentes_normalizado <- inasistentes_sum
#total de inasistencias
inasistentesTotal <- melt(reservas_medicas, id=c("X"))
inasistentesTotal_num <- aggregate(as.numeric(value) ~ variable, inasistentesTotal, FUN = sum)
inasistentesTotal_porcentaje <- inasistentesTotal_num[12,2]/110527*100
#inasistentes sanos
Sanos <- reservas_medicas[reservas_medicas$Hipertension == 0 & reservas_medicas$Diabetes == 0 & reservas_medicas$Alcoholism == 0 & reservas_medicas$Handcap == 0 & reservas_medicas$Scholarship == 0,]
meltSanos <- melt(Sanos, id=c("X", "numero_No_Show"))
inasistentesSanos <- meltSanos[meltSanos$numero_No_Show == 1,]
inasistentesSanos_num <- aggregate(as.numeric(value) ~ variable, inasistentesSanos, FUN = sum)
SanosTotal_num <- aggregate(as.numeric(value) ~ variable, meltSanos, FUN = sum)
porcentajeInasistentesSanos <- inasistentesSanos_num[12,2]/SanosTotal_num[12,2]*100
#normalizando:
inasistentes_normalizado[1,2] <- inasistentes_normalizado[1,2]/total[2,2]*100
inasistentes_normalizado[2,2] <- inasistentes_normalizado[2,2]/total[3,2]*100
inasistentes_normalizado[3,2] <- inasistentes_normalizado[3,2]/total[4,2]*100
inasistentes_normalizado[4,2] <- inasistentes_normalizado[4,2]/total[5,2]*100
inasistentes_normalizado[5,2] <- inasistentes_normalizado[5,2]/total[6,2]*100
head(inasistentes_normalizado)
## variable as.numeric(value)
## 1 Scholarship 23.73630
## 2 Hipertension 17.30196
## 3 Diabetes 18.00327
## 4 Alcoholism 20.14881
## 5 Handcap 18.42212
En donde la primera columna indica la condición del paciente, y la segunda el porcentaje de inasistencia de acuerdo a esa condición.
Ahora, se estudia el porcentaje de inasistencia según la edad de los pacientes.
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
edadInasistencia <- melteado[(melteado$variable == "Age" & melteado$numero_No_Show == 1),]
edadInasistencia_sum <- aggregate(numero_No_Show ~ value, edadInasistencia, FUN = sum)
melteadoTotal <- melt(reservas_medicas, id=c("X", "colaux"))
edadTotal <- melteadoTotal[melteadoTotal$variable == "Age",]
edadTotal_sum <- aggregate(colaux ~ value, edadTotal, FUN = sum)
porcentajeInasistencia <- edadInasistencia_sum
for (i in c(1:100)){
for (j in c(1:104)){
if (edadInasistencia_sum[i,1] == edadTotal_sum[j,1]){
porcentajeInasistencia[i,2] <- edadInasistencia_sum[i,2]/edadTotal_sum[j,2]*100
}
}
}
head(porcentajeInasistencia)
## value numero_No_Show
## 1 0 18.05595
## 2 1 18.25781
## 3 2 15.57478
## 4 3 18.30800
## 5 4 21.70901
## 6 5 21.49093
Se observa en la primera columna la edad de los pacientes, y en la segunda el porcentaje de inasistencia.
Se estudia ahora cuál es el porcentaje de inasistencia según género de los pacientes.
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
generoInasistencia <- melteado[(melteado$variable == "numero_genero" & melteado$numero_No_Show == 1),]
generoInasistencia_sum <- aggregate(numero_No_Show ~ value, generoInasistencia, FUN = sum)
melteadoTotal <- melt(reservas_medicas, id=c("X", "colaux"))
generoTotal <- melteadoTotal[melteadoTotal$variable == "numero_genero",]
generoTotal_sum <- aggregate(colaux ~ value, generoTotal, FUN = sum)
porcentajeInasistencia <- generoInasistencia_sum
porcentajeInasistencia[1,2] <- generoInasistencia_sum[1,2]/generoTotal_sum[1,2]*100
porcentajeInasistencia[2,2] <- generoInasistencia_sum[2,2]/generoTotal_sum[2,2]*100
head(porcentajeInasistencia)
## value numero_No_Show
## 1 0 19.96795
## 2 1 20.31459
La primera columna corresponde al género del paciente, un “1” para femenino y un “0” para masculino. La segunda columna corresponde al porcentaje de inasistencia.
Se estudia ahora cuál es el porcentaje de inasistencia según la distancia entre la fecha en la cual el paciente solicitó la cita al médico, con la fecha de la cita en sí.
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
distanciaInasistencia <- melteado[(melteado$variable == "distancia_fechas" & melteado$numero_No_Show == 1),]
distanciaInasistencia_sum <- aggregate(numero_No_Show ~ value, distanciaInasistencia, FUN = sum)
melteadoTotal <- melt(reservas_medicas, id=c("X", "colaux"))
distanciaTotal <- melteadoTotal[melteadoTotal$variable == "distancia_fechas",]
distanciaTotal_sum <- aggregate(colaux ~ value, distanciaTotal, FUN = sum)
porcentajeInasistencia <- distanciaInasistencia_sum
for (i in c(1:111)){
for (j in c(1:129)){
if (distanciaInasistencia_sum[i,1] == distanciaTotal_sum[j,1]){
porcentajeInasistencia[i,2] <- distanciaInasistencia_sum[i,2]/distanciaTotal_sum[j,2]*100
}
}
}
head(porcentajeInasistencia)
## value numero_No_Show
## 1 0 4.646941
## 2 1 21.410772
## 3 2 23.821561
## 4 3 23.529412
## 5 4 23.270321
## 6 5 26.609704
La primera columna corresponde a la distancia, en días, entre las fechas, y la segunda al porcentaje de inasistencia.
Se estudia ahora cuál es el porcentaje de inasistencia según el día de la semana en el cual se agendó la hora.
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
diasemanainasistencia <- melteado[(melteado$variable == "dia_semana" & melteado$numero_No_Show == 1),]
diasemanainasistencia_sum <- aggregate(numero_No_Show ~ value, diasemanainasistencia, FUN = sum)
melteadoTotal <- melt(reservas_medicas, id=c("X", "colaux"))
diasemanatotal <- melteadoTotal[melteadoTotal$variable == "dia_semana",]
diasemanatotal_sum <- aggregate(colaux ~ value, diasemanatotal, FUN = sum)
porcentajeInasistencia <- diasemanainasistencia_sum
porcentajeInasistencia[1,2] <- diasemanainasistencia_sum[1,2]/diasemanatotal_sum[1,2]*100
porcentajeInasistencia[2,2] <- diasemanainasistencia_sum[2,2]/diasemanatotal_sum[2,2]*100
porcentajeInasistencia[3,2] <- diasemanainasistencia_sum[3,2]/diasemanatotal_sum[3,2]*100
porcentajeInasistencia[4,2] <- diasemanainasistencia_sum[4,2]/diasemanatotal_sum[4,2]*100
porcentajeInasistencia[5,2] <- diasemanainasistencia_sum[5,2]/diasemanatotal_sum[5,2]*100
porcentajeInasistencia[6,2] <- diasemanainasistencia_sum[6,2]/diasemanatotal_sum[6,2]*100
head(porcentajeInasistencia)
## value numero_No_Show
## 1 1 20.64715
## 2 2 20.09360
## 3 3 19.68918
## 4 4 19.35409
## 5 5 21.22614
## 6 6 23.07692
La primera columna indica el día de la semana (Lunes es “1”“, martes”2“, y así sucesivamente). La segunda columna el porcentaje de inasistencia.
Se estudia ahora cuál es el porcentaje de inasistencia según el barrio al cual partenece el hospital.
melteado <- melt(reservas_medicas, id=c("X", "numero_No_Show"))
comunaInasistencia <- melteado[(melteado$variable == "numero_comuna" & melteado$numero_No_Show == 1),]
comunaInasistencia_sum <- aggregate(numero_No_Show ~ value, comunaInasistencia, FUN = sum)
melteadoTotal <- melt(reservas_medicas, id=c("X", "colaux"))
comunaTotal <- melteadoTotal[melteadoTotal$variable == "numero_comuna",]
comunaTotal_sum <- aggregate(colaux ~ value, comunaTotal, FUN = sum)
porcentajeInasistencia <- comunaInasistencia_sum
for (i in c(1:80)){
for (j in c(1:81)){
if (comunaInasistencia_sum[i,1] == comunaTotal_sum[j,1]){
porcentajeInasistencia[i,2] <- comunaInasistencia_sum[i,2]/comunaTotal_sum[j,2]*100
}
}
}
head(porcentajeInasistencia)
## value numero_No_Show
## 1 0 16.56874
## 2 1 12.50000
## 3 2 23.03271
## 4 3 18.45018
## 5 4 21.98582
## 6 5 21.51300
La primera columna indica el barrio del hospital, los cuales están enumerados del 0 al 80, y la segunda columna indica el porcentaje de inasistencia.
A partir de los porcentajes de inasistencia obtenidos, se generaron los siguientes gráficos en Excel:
A partir de los gráficos, se concluye lo siguiente:
- En cuanto a condición de los pacientes, los pacientes becados son los que tienden más a no asistir que el resto, esto puede ser debido a la obligaciones académicas que poseen. También, se observa que los pacientes sanos faltan más que los pacientes que presentan algún tipo de enfermedad, siendo el alcoholismo la enfermedad que presenta mayor porcentaje de inasistencia.
- En cuanto a inasistencia por barrio del hospital, se observa, en primer lugar, un outlier que corresponde al barrio 35, en donde hay un 100% de inasistencia, esto es debido a que la cantidad de muestras de esta localidad es bajísima (2 muestras). También se observan algunos barrios que presentan bajo porcentaje de inasistencia, como el 32 y el 1.
- En cuanto a día de la semana, se observa que el viernes es el día con mayor porcentaje de inasistencia, seguido del lunes. El jueves es el día con menor inasistencia.
- En cuanto a edad, se observa un outlier alrededor de los 115 años de edad, esto también se debe a la poca cantidad de pacientes de esta edad (solo uno). A partir de los 80 años la inasistencia se vuelve impredecible, y es también porque hay muchos menos pacientes mayores a 80 años. Se observa que la edad con mayor porcentaje de inasistencia, sin considerar los pacientes mayores a 80, es alrededor de los 15 años. Luego, el porcentaje va decayendo.
- En cuanto a inasistencia por distancia entre fechas, se observa que, cuando la distancia es mayor a 100 días, se vuelve muy difícil predecir la inasistencia, pues hay pocos datos con esta distancia, y además no siguen ninguna tendencia. Se observa también que cuando la cita se agenda el mismo día, el porcentaje de inasistencia es muy bajo, cercano al 5%.
- En cuanto a género, se observa que el género femenino tiene un porcentaje de inasistencia insignificantemente mayor a que el género masculino. Esto se puede deber a que la mayor cantidad de pacientes del dataset son mujeres.
Considerando todos estos factores, podemos esperar que, si el predictor entrena con este dataset, siga las tendencias ya mencionadas. Por ejemplo, es muy probable que si se le entrega un dato que corresponde a una mujer, de 14 años de edad, becada, sana, con alrededor de un mes de distancia entre fechas, se prediga que no asistirá.