Lectura de librerías y procesamiento de los datos
# Cargamos las librerias
library(ggplot2)
library(forcats)
library(dplyr)
library(DT)
library(qcc)
library(SixSigma)
# Cargamos los datos
datos <- read.csv("datos.csv", header=T)
# View(datos) # Para visualizar los datos
names(datos)
# Seleccionamos aquellas variables que necesitamos
datos <- datos[,c("dias.resol", "titulacion", "tipo.titulacion", "curso", "centro", "tipo.actividad", "dia.lab.solic.cod", "dia.solicitud", "semana.solic", "mes.solic")]
# Vemos tipo de datos
str(datos)
# Pasamos a factor las variables categóricas, en el orden correcto
datos$tipo.titulacion <- factor(datos$tipo.titulacion, levels=c("Extinto","Grado","Master"))
datos$centro <- factor(datos$centro, levels=c("CEXP","CSJE","CSSA","EPSE"))
datos$tipo.actividad <- factor(datos$tipo.actividad, levels=c("deporte","estudiosnouni","idiomas","laboral","movilidad","otros","practicas","universidad"))
datos$dia.lab.solic.cod <- factor(datos$dia.lab.solic.cod, levels=c("L","M","X","J","V"))
datos$dia.solicitud <- factor(datos$dia.solicitud, levels=c("1","2", "3", "4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31"))
datos$semana.solic <- factor(datos$semana.solic, levels=c("2", "3", "4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52"))
datos$mes.solic <- factor(datos$mes.solic, levels=c("1","2", "3", "4","5","6","7","9","10","11","12"))
datos$curso <- factor(datos$curso, levels=c("2015","2016"))
summary(datos) # Visualizamos la información más relevante de los datos
## OUTLIERS
# Observamos que la variable dias.resol su min es 0
# y su max es 321,
# su media es 18.59
# Por tanto buscamos outliers
boxplot(datos$dias.resol)
abline(h=120)
limite = 120
# Vemos graficamente que hay 4 valores excesivamente grandes
# Eliminamos los outliers
datos[which(datos$dias.resol > limite),"dias.resol"] # outliers
datos <- datos[-which(datos$dias.resol > limite),]
# Vemos si hay nulos
sapply(datos, function(x) sum(is.na(x)))
# La variable dia.lab.solic.cod tiene un nulo, procedemos a eliminar dicho registro
datos <- datos[!is.na(datos$dia.lab.solic.cod),]
summary(datos)
# Los datos ya están listos
Descriptivos univariantes
## Dias de resolucion
ggplot(datos, aes(x=datos$dias.resol)) +
geom_histogram(color="black", fill="white", bins=30) +
ggtitle("Distribución de los días de resolución") +
labs(x="Días de resolución", y="Distribución") +
geom_vline(xintercept = 30, linetype="dotted",
color = "blue", size=1.5)
# Calculo porcentaje que se encuentra por debajo de los 30 dias
datos30 <- datos[datos$dias.resol<=30,]
porc <- nrow(datos30)/nrow(datos)*100; porc
## Titulacion
levels(datos$titulacion) <- c("G. Admin. y direccion emp.",
"G. Biotecnologia",
"G. Ciencias Ambientales",
"G. Ciencias Ambientales (Plan2016)",
"G. CAFD",
"G. Comunicación Audiovis.",
"G. Derecho",
"G. Est. Emp.",
"G. Ing. Telecomunicaciones",
"G. Ing. Electrica",
"G. Ing. Electronica y Aut. Ind.",
"G. Ing. Informatica",
"G. Ing. Mecanica",
"G. Periodismo",
"G. Psicologia",
"G. RRLL y RRHH",
"Ing. Materiales (P98)",
"Ing. Teleco 2ºCiclo (P99)",
"Ing. Teleco (P99)",
"Ing. Industrial 2ºCiclo (P97)",
"Ing. Industrial (P97)",
"Lic. Antrop. Social y Cultural",
"Lic. Bioquimica (P97)",
"Lic. Ciencias Actuariales y Finan. (P98)",
"Lic. Ciencias Ambientales (P04)",
"Lic. CAFD 2ºCiclo (P05)",
"Lic. CAFD (P05)",
"Lic. Ciencias y Tec. Estad. (P97)",
"Lic. Comunicacion Audiovis.",
"Lic. Derecho (P97)",
"Lic. Investig. y Tec. Mercados (P97)",
"Lic. Periodismo 2ºCiclo (P05)",
"Lic. Periodismo (P05)",
"Lic. Psicologia (P99)",
"M. Abogacia",
"M. MBA",
"M. Asesoria Fiscal",
"M. Biotecno. y Bioing.",
"M. Energia Solar y Ren.",
"M. Gerontologia y Salud",
"M. Gestion de RRHH, Trabajo y Org.",
"M. Ing. Industrial",
"M. Innovacion en Period.",
"M. Instal. Termicas y Electricas",
"M. Intervencion Crimin. y Victim.",
"M. Pscio. General Sanit.",
"M. Terapia Psico. con Niños y Adoles.")
ggplot(datos, aes(x=datos$titulacion, fill=datos$tipo.titulacion)) +
geom_bar()+
ggtitle("Frecuencia según la titulación") +
labs(x="",y= "Totales") +
scale_fill_discrete(name="Tipo titulación") +
coord_flip()
## Tipo de titulacion
tab.tipo.tit <- as.data.frame(prop.table(table(datos$tipo.titulacion))*100)
ggplot(tab.tipo.tit, aes(x=tab.tipo.tit$Var1, y=tab.tipo.tit$Freq)) +
geom_bar(stat="identity")+
ggtitle("Frecuencia según el tipo de titulación") +
labs(x="Tipo Titulación",y= "Porcentajes" )
## Curso
Porcentcurso <- data.frame(prop.table(table(datos$curso))*100)
names(Porcentcurso) <- c("Curso","Porcentaje")
Porcentcurso
## Centro
tab.centros <- as.data.frame(prop.table(table(datos$centro))*100)
names(tab.centros) <- c("Centro","Porcentaje")
tab.centros
## Tipo de actividad
Porcentact <- data.frame(prop.table(table(datos$tipo.actividad))*100)
names(Porcentact) <- c("Tipo_Actividad","Porcentaje")
Porcentact
ggplot(data=Porcentact, aes(x=Porcentact$Tipo_Actividad, y=Porcentact$Porcentaje)) +
geom_bar(stat="identity", position="stack") +
labs(x="Tipo Actividad",y="Porcentaje",title="Frecuencia por tipo de actividad")
## Dia laboral solicitud
Porcentdialab <- data.frame(prop.table(table(datos$dia.lab.solic.cod))*100)
names(Porcentdialab) <- c("Día","Porcentaje")
Porcentdialab
## Dia solicitud
Porcentdia <- data.frame(prop.table(table(datos$dia.solicitud))*100)
names(Porcentdia) <- c("Día","Porcentaje")
Porcentdia
## Semana solicitud
Porcentsemana <- data.frame(prop.table(table(datos$semana.solic))*100)
names(Porcentsemana) <- c("Semana","Porcentaje")
Porcentsemana
## Mes solicitud
datos$mes.solic<-fct_relevel(datos$mes.solic,c("9","10","11","12","1","2", "3", "4","5","6","7"))
freqmes <- data.frame(table(datos$mes.solic,datos$curso))
names(freqmes) <- c("Mes","Curso","Frecuencia"); freqmes
Porcentmes<-data.frame(prop.table(table(datos$mes.solic,datos$curso))*100)
names(Porcentmes)<-c("Mes","Curso","Porcentaje"); Porcentmes
ggplot(data=Porcentmes, aes(x=Porcentmes$Mes, y=Porcentmes$Porcentaje)) + facet_grid(.~Porcentmes$Curso)+
geom_bar(stat="identity", position="stack") +
labs(x="Mes",y="Porcentaje",title="Frecuencia segun el mes")
## PreBolonia/Bolonia
# Tabla de frecuencias por prebolonia y bolonia
datos$bolonia <- fct_collapse(datos$tipo.titulacion,
PreBolonia=c("Extinto"),
Bolonia=c("Grado","Master"))
freq_bolonia <- prop.table(table(datos$bolonia))*100; freq_bolonia
Graficos exploratorios
## Tipo actividad ~ Dias resolucion
media_dep <- mean(datos$dias.resol[datos$tipo.actividad=="deporte"])
media_est <- mean(datos$dias.resol[datos$tipo.actividad=="estudiosnouni"])
media_idi <- mean(datos$dias.resol[datos$tipo.actividad=="idiomas"])
media_lab <- mean(datos$dias.resol[datos$tipo.actividad=="laboral"])
media_mov <- mean(datos$dias.resol[datos$tipo.actividad=="movilidad"])
media_otr <- mean(datos$dias.resol[datos$tipo.actividad=="otros"])
media_pra <- mean(datos$dias.resol[datos$tipo.actividad=="practicas"])
media_uni <- mean(datos$dias.resol[datos$tipo.actividad=="universidad"])
mediasAct <- data.frame(TipoActividad=levels(datos$tipo.actividad), MediasAct=c(media_dep,media_est,media_idi,media_lab,media_mov,media_otr,media_pra,media_uni))
ggplot(data=mediasAct, aes(x=TipoActividad, y=MediasAct)) +
geom_bar(stat="identity", position="stack") +
labs(x="Tipo de Actividad",y="Medias",title="Media de dias de resolucion en funcion del tipo de actividad")
## Curso ~ Dias resolucion
media_2015 <- mean(datos$dias.resol[datos$curso=="2015"])
media_2016 <- mean(datos$dias.resol[datos$curso=="2016"])
mediasCurso <- data.frame(TipoCurso=levels(datos$curso), MediasCurso=c(media_2015,media_2016))
ggplot(data=mediasCurso, aes(x=TipoCurso, y=MediasCurso)) +
geom_bar(stat="identity", position="stack") +
labs(x="Curso",y="Medias",title="Media de dias de resolucion en funcion del curso")
## Centro ~ Dias resolucion
media_CEXP <- mean(datos$dias.resol[datos$centro=="CEXP"])
media_CSJE <- mean(datos$dias.resol[datos$centro=="CSJE"])
media_CSSA <- mean(datos$dias.resol[datos$centro=="CSSA"])
media_EPSE <- mean(datos$dias.resol[datos$centro=="EPSE"])
mediasCentro <- data.frame(TipoCentro=levels(datos$centro), MediasCentro=c(media_CEXP,media_CSJE,media_CSSA,media_EPSE))
ggplot(data=mediasCentro, aes(x=TipoCentro, y=MediasCentro)) +
geom_bar(stat="identity", position="stack") +
labs(x="Centro",y="Medias",title="Media de dias de resolucion en funcion del tipo de centro")
## Tipo titulacion ~ Dias resolucion
media_extinto <- mean(datos$dias.resol[datos$tipo.titulacion=="Extinto"])
media_grado <- mean(datos$dias.resol[datos$tipo.titulacion=="Grado"])
media_master <- mean(datos$dias.resol[datos$tipo.titulacion=="Master"])
mediasTitu <- data.frame(TipoTitulacion=levels(datos$tipo.titulacion), MediasTitu=c(media_extinto,media_grado,media_master))
ggplot(data=mediasTitu, aes(x=TipoTitulacion, y=MediasTitu)) +
geom_bar(stat="identity", position="stack") +
labs(x="Tipo de Titulacion",y="Medias",title="Media de dias de resolucion en funcion del tipo de titulacion")
## Curso ~ Mes solicitud
freq1 <- data.frame(table(datos$curso,datos$mes.solic))
names(freq1)<-c("Curso","Mes","Frecuencia");freq1
ggplot(data=freq1, aes(x=Mes, y=Frecuencia, fill=Curso)) +
geom_bar(stat="identity", position="dodge") +
labs(x="Mes",y="Frecuencia",title="Frecuencia según mes de solicitud por curso")
## Centro ~ Tipo actividad
freq2 <- data.frame(table(datos$centro,datos$tipo.actividad))
names(freq2)<-c("Centro","Actividad","Frecuencia");freq2
ggplot(data=freq2, aes(x=Centro, y=Frecuencia, fill=Actividad)) +
geom_bar(stat="identity", position="stack") +
labs(x="Centro",y="Frecuencia",title="Frecuencia según centro por actividad")
## Centro ~ Mes solicitud
freq3 <- data.frame(table(datos$centro,datos$mes.solic))
names(freq3)<-c("Centro","Mes","Frecuencia");freq3
ggplot(data=freq3, aes(x=Mes, y=Frecuencia, fill=Centro)) +
geom_bar(stat="identity", position="dodge") +
labs(x="Mes",y="Frecuencia",title="Frecuencia según mes de solicitud por centro")
## Curso ~ Tipo titulación
Porcentitcur <- data.frame(prop.table(table(datos$tipo.titulacion,datos$curso))*100)
names(Porcentitcur) <- c("Tipo titulacion","Curso","Porcentaje")
Porcentitcur
ggplot(data=Porcentitcur, aes(x=`Tipo titulacion`, y=Porcentaje, fill=Curso)) +
geom_bar(stat="identity", position="dodge") +
labs(x="Tipo titulacion",y="Porcentaje",title="Frecuencia de tipo de titulación según el curso")
## Curso ~ Centro
Porcentcur <- data.frame(prop.table(table(datos$centro,datos$curso))*100)
names(Porcentcur) <- c("Centro","Curso","Porcentaje")
Porcentcur
ggplot(data=Porcentcur, aes(x=Centro, y=Porcentaje, fill=Curso)) +
geom_bar(stat="identity", position="dodge") +
labs(x="Centro",y="Porcentaje",title="Frecuencia de centro según el curso")
## Curso ~ Tipo actividad
Porcenactcur <- data.frame(prop.table(table(datos$tipo.actividad,datos$curso))*100)
names(Porcenactcur) <- c("Tipo actividad","Curso","Porcentaje")
Porcenactcur
ggplot(data=Porcenactcur, aes(x=`Tipo actividad`, y=Porcentaje, fill=Curso)) +
geom_bar(stat="identity", position="dodge") +
labs(x="Tipo actividad",y="Porcentaje",title="Frecuencia de tipo de actividad según el curso")
## Pre-Bolonia/Bolonia ~ Dias resolucion
media_pre <- mean(datos$dias.resol[datos$bolonia=="PreBolonia"])
media_bol <- mean(datos$dias.resol[datos$bolonia=="Bolonia"])
medias <- data.frame(PlanEstudios=levels(datos$bolonia), Medias=c(media_pre,media_bol));medias
ggplot(data=medias, aes(x=PlanEstudios, y=Medias)) +
geom_bar(stat="identity", position="stack") +
labs(x="Plan de Estudios",y="Medias",title="Media de días de resolución en función del Plan de Estudios")
## Pre-Bolonia/Bolonia ~ Tipo de actividad
# Tabla de contingencias
act_bol <- table(datos$tipo.actividad,datos$bolonia,
dnn=c("Tipo Reconocimiento","Plan de Estudios")); act_bol
Modelización
# Asignamos "1" a los "0"
datos_mod <- datos
sel <- which(datos_mod$dias.resol == 0)
datos_mod$dias.resol[sel] <- 1
# Genero el modelo
modelo <- dias.resol~tipo.titulacion + tipo.titulacion:curso + curso + curso:centro + curso:tipo.actividad + curso:mes.solic + centro + centro:tipo.actividad + centro:mes.solic + centro:mes.solic:curso + tipo.actividad + mes.solic
glm_gamma <- glm(formula = modelo,
family = Gamma(link = "log"),
data = datos_mod)
# summary(glm_gamma)
anova(glm_gamma,test="F")
# Todas las posibles combinaciones entre las variables
m <- expand.grid(tipo.titulacion=factor(levels(datos$tipo.titulacion)),
tipo.actividad=factor(levels(datos$tipo.actividad)),
curso=factor(levels(datos$curso)),
centro=factor(levels(datos$centro)),
mes.solic=factor(levels(datos$mes.solic)))
# Predicción con los errores
m.pred <- cbind(m,pred=predict(glm_gamma,m,type="response",se.fit = TRUE))
# Redondeo a un decimal
m.pred[6] <- round(m.pred[6],1)
m.pred[7] <- round(m.pred[7],1)
m.pred[8] <- round(m.pred[8],1)
names(m.pred) <- c("Tipo titulación","Tipo actividad","Curso","Centro","Mes solicitud","Predicción","Error","Residuo")
m.pred <- m.pred[-8] # elimino los residuos
# Creo la tabla dinámica
datatable(m.pred, filter="top")
Gráfico de Pareto
# Creamos nueva columna de defectos
defecto <- vector(mode="numeric",length=length(datos$dias.resol))
DatosNuevos <- data.frame(datos,defecto)
# Marcamos los defectos
DatosNuevos$defecto <- ifelse(DatosNuevos$dias.resol>30,1, DatosNuevos$defecto)
table(DatosNuevos$defecto)
## Tipo de actividad
TipoAct <- data.frame(table(DatosNuevos$tipo.actividad,DatosNuevos$defecto))
names(TipoAct) <- c("TipoActividad","Defecto","Cantidad")
TipoAct[which(TipoAct$Defecto == 0),"defecto"] # eliminamos los que no son defectos
TipoAct <- TipoAct[-which(TipoAct$Defecto == 0),];TipoAct
attach(TipoAct)
borrar <- c("Defecto") #ultimamos la tabla
TipoAct[ , !(names(TipoAct) %in% borrar)]
#Se debe generar una variable etiquetada
TipoAct2 <- Cantidad
names(TipoAct2) <- TipoActividad
TipoAct2
ParetoTipoAct<-pareto.chart(TipoAct2)
## Curso
TipoCur <- data.frame(table(DatosNuevos$curso,DatosNuevos$defecto))
names(TipoCur) <- c("TipoCurso","Defecto","Cantidad")
TipoCur[which(TipoCur$Defecto == 0),"defecto"] # eliminamos los que no son defectos
TipoCur <- TipoCur[-which(TipoCur$Defecto == 0),];TipoCur
attach(TipoCur)
borrar <- c("Defecto") #ultimamos la tabla
TipoCur[ , !(names(TipoCur) %in% borrar)]
#Se debe generar una variable etiquetada
TipoCurs<-Cantidad
names(TipoCurs)<-TipoCurso
TipoCurs
ParetoTipoCurso<-pareto.chart(TipoCurs)
## Centro
TipoCent <- data.frame(table(DatosNuevos$centro,DatosNuevos$defecto))
names(TipoCent) <- c("TipoCentro","Defecto","Cantidad")
TipoCent[which(TipoCent$Defecto == 0),"defecto"] # eliminamos los que no son defectos
TipoCent <- TipoCent[-which(TipoCent$Defecto == 0),];TipoCent
attach(TipoCent)
borrar <- c("Defecto") #ultimamos la tabla
TipoCent[ , !(names(TipoCent) %in% borrar)]
#Se debe generar una variable etiquetada
TipoCentr<-Cantidad
names(TipoCentr)<-TipoCentro
TipoCentr
ParetoTipoCentro<-pareto.chart(TipoCentr)
Estabilidad de la serie “Días de resolución”
# La estudiamos en conjunto a los meses que es un buen diferenciador
# Medias de resolucion por mes
media_enero <- mean(datos$dias.resol[datos$mes.solic=="1"])
media_febrero <- mean(datos$dias.resol[datos$mes.solic=="2"])
media_marzo <- mean(datos$dias.resol[datos$mes.solic=="3"])
media_abril <- mean(datos$dias.resol[datos$mes.solic=="4"])
media_mayo <- mean(datos$dias.resol[datos$mes.solic=="5"])
media_junio <- mean(datos$dias.resol[datos$mes.solic=="6"])
media_julio <- mean(datos$dias.resol[datos$mes.solic=="7"])
media_septiembre <- mean(datos$dias.resol[datos$mes.solic=="9"])
media_octubre <- mean(datos$dias.resol[datos$mes.solic=="10"])
media_noviembre <- mean(datos$dias.resol[datos$mes.solic=="11"])
media_diciembre <- mean(datos$dias.resol[datos$mes.solic=="12"])
mediasmes <- data.frame(Mes=levels(datos$mes.solic),
MediasMes=c(media_enero,media_febrero,media_marzo,media_abril,media_mayo,media_junio,media_julio,media_septiembre,media_octubre,media_noviembre,media_diciembre))
# Anyo natural (Ambos cursos)
ggplot(data=datos,aes(x=mes.solic,y=dias.resol))+geom_boxplot()+
ggtitle ("Tiempos de resolución según el mes solicitado") +
labs(x = "Mes solicitud",y = "Días de Resolución")
#Anyo curso(Cursos por separado y distinta ordenación)
#Reordenamos
datos$mes.solic <- fct_relevel(datos$mes.solic,c("9","10","11","12","1","2", "3", "4","5","6","7"))
ggplot(data=datos,aes(x=mes.solic,y=dias.resol))+geom_boxplot()+facet_grid(.~curso)+
ggtitle ("Tiempos de resolución según el mes solicitado por curso") +
labs(x = "Mes solicitud",y = "Días de Resolución")
Análisis de capacidad
#Separamos los datos en años
datos2015 <- datos[datos$curso=="2015",]
datos2016 <- datos[datos$curso=="2016",]
#Límites de especificación
USL=30
LSL=0
target=15.1
#Capacidad para el año 2015
ss.ca.cp(datos2015$dias.resol, USL=USL, LSL=LSL)
# Representación (2015)
CAP15 <- qcc.groups(datos2015$dias.resol,1:length(datos2015$dias.resol))
q15 <- qcc(CAP15, type="xbar.one", plot=FALSE)
process.capability(q15,spec.limits = c(LSL,USL),target=target)
#Capacidad para el año 2016
ss.ca.cp(datos2016$dias.resol, USL=USL, LSL=LSL)
# Representación (2016)
CAP16 <- qcc.groups(datos2016$dias.resol,1:length(datos2016$dias.resol))
q16 <- qcc(CAP16, type="xbar.one", plot=FALSE)
process.capability(q16,spec.limits = c(LSL,USL),target=target)
Diferencias entre los meses con efecto del curso
table(datos$mes.solic,datos$dias.resol)
datos$mes.solic<-fct_relevel(datos$mes.solic,c("9","10","11","12","1","2", "3", "4","5","6","7"))
ggplot(data=datos, aes(x=datos$mes.solic, y=datos$dias.resol)) + facet_grid(.~datos$curso)+
geom_bar(stat="identity", position="stack") +
labs(x="Mes",y="Frecuencia",title="Frecuencia segun el mes por curso")