This is an R Markdown format used for publishing markdown documents to GitHub. When you click the Knit button all R code chunks are run and a markdown file (.md) suitable for publishing to GitHub is generated.
Para empezar vamos a trabajar con el documento txt para dejarlo ok.
# Levantamos el archico como un documento de texto
txtdata <- readLines(FILE_ENCUESTAS)
# Quitamos todas las lineas en blanco, no tienen razon de ser en el archivo.
empty_lines = grepl('^\\s*$', txtdata)
txtdata = txtdata[! empty_lines]
# Quitamos los saltos de linea dentro de los comentarios
txtdata <- quitarSaltosLineaComentarios(txtdata)
# Quitamos los ", ," por ",,"
txtdata <- gsub(", ,", ",,", txtdata)
# y los ", ," por ",,"
txtdata <- gsub(", ,", ",,", txtdata)
# y los ", \r\n" por ","
txtdata <- gsub(", \r\n", ",\r\n", txtdata)
# y los ", \r\n" por ","
txtdata <- gsub(", \r\n", ",\r\n", txtdata)
# Quitamos los ",False, " y lo reemplazamos por ",False," (3 veces por si hay varios espacios)
txtdata <- gsub(",False, ", ",False,", txtdata)
txtdata <- gsub(",False, ", ",False,", txtdata)
txtdata <- gsub(",False, ", ",False,", txtdata)
# Quitamos los ",True, " y lo reemplazamos por ",True," (3 veces por si hay varios espacios)
txtdata <- gsub(",True, ", ",True,", txtdata)
txtdata <- gsub(",True, ", ",True,", txtdata)
txtdata <- gsub(",True, ", ",True,", txtdata)
# Quitamos los ", " y lo reemplazamos por " "
txtdata <- gsub(", ", " ", txtdata)
# Veamos cuantas lineas no tienen la cantidad de "," que esperamos que tengan
cantComasEsperadas <- cantidadComas(txtdata[1])
dataCantComas <- lapply(txtdata, cantidadComas)
# Buscamos los renglones que tienen más o menos comas de las esperadas
renglonesInconsistentes <- txtdata[dataCantComas != cantComasEsperadas]
renglonesConsistentes <- txtdata[dataCantComas == cantComasEsperadas]
# Cantidad de renglones inconsistentes:
sprintf("Cantidad de renglones inconsistentes: %d", length(renglonesInconsistentes)) ## [1] "Cantidad de renglones inconsistentes: 4016"
# Cantidad de renglones consistentes:
sprintf("Cantidad de renglones consistentes: %d", length(renglonesConsistentes)) ## [1] "Cantidad de renglones consistentes: 22666"
# Cantidad de renglones total:
sprintf("Cantidad de renglones total: %d", length(txtdata)) ## [1] "Cantidad de renglones total: 26682"
# Grabamos el procesado que hicimos hasta ahora
write(renglonesInconsistentes, "./datos/encuestas_unclear.txt")
write(renglonesConsistentes, "./datos/encuestas_clear.txt")# ---------------------- Levantar DataFrame ----------------------
# Levantamos el archivo ya formateado,
encuestas <- read.csv("./datos/encuestas_clear.txt")## Warning in scan(file = file, what = what, sep = sep, quote = quote, dec =
## dec, : EOF within quoted string
# ---------------------- Tratamiento Valores Faltantes ----------------------
# Analisamos valores faltantes
na_count <-sapply(encuestas, function(y) sum(length(which(is.na(y)))))
na_count <- data.frame(na_count)
plot(na_count$na_count)# Quitamos las columnas que tienen todos NA
encuestas$SalarioActualBruto <- NULL
encuestas$IdArea <- NULL
encuestas$puestoGenerico <- NULL
encuestas$especialidadGenerico <- NULL
# La mayoria de los datos de la columna NivelRemunerativo son NA, y sumado a que tampoco hay
# referencias sobre ese campo, lo mejor parece ser que es quitarla
# antes veamos si existe alguna correlaciòn entre el nivelRemunerativo y el salario
boxplot(SalarioActualNeto ~ NivelRemunerativo, data = encuestas)# No se ve ninguna relación clara, quitamos entonces nivelRemunerativo
encuestas$NivelRemunerativo <- NULL
# Vemos que hay un registro con IdPais en NA, lo eliminamos
encuestas <- encuestas[complete.cases(encuestas[,"IdPais"]),]
# Nos quedamos solo con los de Argentina, ya que para este estudio no nos interesa el resto.
# Ademas sus salarios están expresados en moneda local de cada país, lo que requeriria una conversión
# Por el momento el estudio se basará en los datos de Argentina
encuestas <- subset(encuestas, IdPais == 1)
encuestas$IdPais <- NULL
# Esto último tambien eliminó el unico registro que tenia un NA en NivelDeDesconfianza, genial!
# Analisamos valores faltantes nuevamente
na_count <-sapply(encuestas, function(y) sum(length(which(is.na(y)))))
na_count <- data.frame(na_count)
plot(na_count$na_count)# Parece estar suficientemente limpio el dataset de valores vacios.
# ---------------------- Ajuste de tipos de datos ----------------------
# Pasamos la fecha al formato correcto
encuestas$Fecha <- as.character(encuestas$Fecha)
encuestas$Fecha <- as.POSIXlt(encuestas$Fecha)
# Levantamos las tablas auxiliares
tabla_sexo <- read.table(FILE_TABLAS, header = TRUE, sep=",", nrows =3, comment.char = "-")
tabla_nivel_educativo <- read.table(FILE_TABLAS, header = TRUE, sep="\t", nrows = 10, skip=7, comment.char = "-")
tabla_tipo_empresa <- read.table(FILE_TABLAS, header = TRUE, sep="\t", nrows = 7, skip=20, comment.char = "-")
tabla_provincia <- read.table(FILE_TABLAS, header = TRUE, sep="\t", nrows = 413, skip=30)
tabla_puesto <- read.table(FILE_TABLAS, header = TRUE, sep="\t", nrows = 95, skip=446)
tabla_tecnologia <- read.table(FILE_TABLAS, header = TRUE, sep="\t", nrows = 72, skip=544)
# Quitamos las provincias que no sean de argentina
tabla_provincia <- tabla_provincia[tabla_provincia$IdPais == 1, ]
# Seteamos los factors
table(encuestas$IdSexo)##
## 0 1 2
## 558 12533 1618
encuestas$IdSexo <- factor(encuestas$IdSexo, levels = tabla_sexo$IdSexo, labels = tabla_sexo$Nombre)
table(encuestas$IdSexo)##
## No informa Masculino Femenino
## 558 12533 1618
table(encuestas$IdNivelEducativo)##
## 0 1 2 3 4 5 6 7 8 9
## 252 27 140 854 1107 2502 5035 3456 717 619
encuestas$IdNivelEducativo <- factor(encuestas$IdNivelEducativo, levels = tabla_nivel_educativo$IdNivelEducativo, labels = tabla_nivel_educativo$Nombre)
table(encuestas$IdNivelEducativo)##
## No informa
## 252
## Primario
## 27
## Secundario en curso o incompleto
## 140
## Secundario completo
## 854
## Terciario en curso o incompleto
## 1107
## Terciario completo
## 2502
## Universitario en curso o incompleto
## 5035
## Universitario completo
## 3456
## Master o postgrado en curso o incompleto
## 717
## Master o postgrado completo
## 619
table(encuestas$IdTipoDeEmpresa)##
## 0 1 2 3 4 5
## 382 12774 868 63 400 222
encuestas$IdTipoDeEmpresa <- factor(encuestas$IdTipoDeEmpresa, levels = tabla_tipo_empresa$IdTipoDeEmpresa, labels = tabla_tipo_empresa$Nombre)
table(encuestas$IdTipoDeEmpresa)##
## No informa Una empresa privada
## 382 12774
## Un organismo estatal Una ONG
## 868 63
## Otro Mi propia empresa
## 400 222
## Soy independiente / freelance
## 0
table(encuestas$IdProvincia)##
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
## 4702 169 35 30 7 6587 13 1404 57 40 88 87 18 23 11
## 16 17 18 19 20 21 22 23 24 25 26 27 28
## 7 75 259 134 57 35 15 17 599 42 41 10 147
encuestas$IdProvincia <- factor(encuestas$IdProvincia, levels = tabla_provincia$IdProvincia, labels = tabla_provincia$Nombre)
table(encuestas$IdProvincia)##
## Capital Federal GBA Zona Norte GBA Zona Oeste
## 4702 169 35
## GBA Zona Sur Costa Atlántica Buenos Aires
## 30 7 6587
## Catamarca Córdoba Chaco
## 13 1404 57
## Chubut Corrientes Entre RÃos
## 40 88 87
## Formosa Jujuy La Pampa
## 18 23 11
## La Rioja Misiones Mendoza
## 7 75 259
## Neuquén RÃo Negro Salta
## 134 57 35
## Santa Cruz Santiago del Estero Sante Fe
## 15 17 599
## San Juan San Luis Tierra del Fuego
## 42 41 10
## Tucumán
## 147
table(encuestas$IdPuesto)##
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
## 3900 320 1061 1026 96 188 39 766 285 267 315 145 84 132 160
## 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
## 2 458 210 24 8 34 255 137 63 541 279 41 58 143 659
## 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
## 85 469 38 15 352 589 408 128 357 10 21 74 14 32 41
## 46 47 48 49 50 51 52 53 54 55 56 58 60
## 16 41 85 39 85 8 25 35 38 3 1 2 2
encuestas$IdPuesto <- factor(encuestas$IdPuesto, levels = tabla_puesto$IdPuesto, labels = tabla_puesto$Nombre)
table(encuestas$IdPuesto)##
## Desarrollador de software / Programador
## 3900
## Arquitecto
## 320
## Lider de Proyecto
## 1061
## Analista Funcional
## 1026
## Selector de personal TI
## 96
## Diseñador Web
## 188
## Investigación
## 39
## Consultor TI
## 766
## Administrador de Base de Datos
## 285
## Administrador de Redes
## 267
## Analista de GarantÃa de Calidad (QA)
## 315
## Analista de Seguridad Informática
## 145
## Auditor
## 84
## Comercial de TI
## 132
## Director de Sistemas
## 160
## Documentador de Sistemas
## 2
## Gerente de Proyectos
## 458
## Implementador de Sistemas
## 210
## Instructor
## 24
## Gerente de Compras TI
## 8
## Gerente de Comunicaciones
## 34
## Gerente de Desarrollo
## 255
## Gerente de Operaciones
## 137
## Gerente de Seguridad Informática
## 63
## Gerente de Sistemas
## 541
## Gerente de TecnologÃa
## 279
## Gerente de Ventas TI
## 41
## Pasante
## 58
## Mesa de Ayuda (Help Desk)
## 143
## Soporte Técnico
## 659
## Pasante (Trainee)
## 85
## Otro
## 469
## Administrador de Almacenamiento (Storage)
## 38
## Administrador Middleware
## 15
## Administrador de Sistemas
## 352
## Administrador de Ambientes
## 589
## Administrador de Servidores
## 408
## Coordinador de Grupo
## 128
## Lider Técnico
## 357
## Comprador TI
## 10
## Data Entry
## 21
## Soporte de Aplicación
## 74
## Soporte de Posventa
## 14
## Jefe de Mesa de Ayuda
## 32
## Operador NOC
## 41
## LÃder de Mesa de Ayuda
## 16
## LÃder de Operaciones
## 41
## LÃder de GarantÃa de Calidad (QA)
## 85
## LÃder de Seguridad Informática
## 39
## LÃder de Soporte Técnico
## 85
## Operador de AS400
## 8
## Preventa
## 25
## Ejecutivo de Cuenta
## 35
## Gerente de Producto
## 38
## Analista BI
## 3
## Scrum Master
## 1
## Auditor de TI
## 0
## Gerente General
## 2
## Director General
## 2
## Administrador de Backup
## 0
## Maquetador
## 0
## Administrador de Proyectos
## 0
## Operador de Sistemas
## 0
## Tester Funcional
## 0
## Analista de Testeo
## 0
## Jefe de Compras TI
## 0
## Jefe de Comunicaciones
## 0
## Jefe de Desarrollo
## 0
## Jefe de Operaciones
## 0
## Jefe de Seguridad Informática
## 0
## Jefe de Sistemas
## 0
## Jefe de TecnologÃa
## 0
## Jefe de Ventas TI
## 0
## Jefe de Gestión de Demanda
## 0
## Diseñador Multimedia
## 0
## Gestor de Cambios de IT
## 0
## Gestor de Transición
## 0
## Gestor de Configuraciones
## 0
## Analista de Cambios
## 0
## Gerente de Procesos de IT
## 0
## Gestor de Incidentes
## 0
## Gestor de Problemas
## 0
## Gerente de Demanda
## 0
## Gerente de Infraestructura
## 0
## Jefe de Infraestructura
## 0
## Supervisor de Infraestructura
## 0
## Responsable de Infraestructura
## 0
## Analista de Gestión de la Demanda
## 0
## Responsable de Gestión de la Demanda
## 0
## Analista de Procesos
## 0
## Responsable de Procesos
## 0
## Gestor de Servicios
## 0
## Desarrollador BI
## 0
## Lider BI
## 0
## Gerente Regional de IT
## 0
table(encuestas$IdTecnologiaPrincipal)##
## 1 2 3 5 6 7 8 10 11 12 13 15 16 17 19
## 2999 2028 881 174 80 38 29 54 72 113 229 41 111 64 89
## 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## 1 462 931 29 124 80 24 805 61 1368 2135 436 34 45 22
## 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
## 106 115 5 12 98 15 153 7 21 7 13 49 152 8 65
## 50 51 52 53 54 55 56 57 58 59 60 62 63 64 65
## 54 56 42 51 18 19 30 14 10 2 5 4 5 1 13
encuestas$IdTecnologiaPrincipal <- factor(encuestas$IdTecnologiaPrincipal, levels = tabla_tecnologia$IdTecnologiaPrincipal, labels = tabla_tecnologia$Nombre)## Warning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels)
## else paste0(labels, : duplicated levels in factors are deprecated
table(encuestas$IdTecnologiaPrincipal)## Warning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels)
## else paste0(labels, : duplicated levels in factors are deprecated
##
## .Net Java PHP C++
## 2999 2028 881 174
## C Ruby Perl Prolog
## 80 38 29 0
## Smalltalk Python Delphi VisualBasic
## 54 72 113 229
## ActionScript Javascsript Asp Html
## 41 111 64 89
## Haskell MSSQLServer Oracle PostgreSql
## 1 462 931 29
## DatawareHousing Cobol DB2 SAP
## 124 178 24 805
## Siebel Otro Windows Linux
## 76 1368 2135 436
## Solaris Aix Hp-ux Mainframe
## 34 45 22 106
## AS/400 Assembler CMS Cobol
## 115 5 12 0
## Siebel ERP Flash Flex
## 0 153 7 21
## Meta4 RPG Hp Unix
## 7 13 49 152
## Clipper Genexus MySql Server Visual FoxPro
## 8 65 54 56
## Android Sharepoint Clarion QlikView
## 42 51 18 19
## Microstrategy BusinessObject Cognos Hyperion
## 30 14 10 2
## Tibco Board Pentaho CISCO
## 5 0 4 5
## SSIS VMWare PowerBuilder CRM
## 1 13 0 0
## Objective-C JD Edwards PeopleSoft Joomla
## 0 0 0 0
## Clojure Scala Node js Ruby on Rails
## 0 0 0 0
table(encuestas$TrabajaDesdeCasa)##
## False True
## 11723 2986
encuestas$TrabajaDesdeCasa <- factor(encuestas$TrabajaDesdeCasa, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$TrabajaDesdeCasa)##
## Si No
## 2986 11723
table(encuestas$LeGustaTrabajarDesdeCasa)##
## False True
## 3628 11081
encuestas$LeGustaTrabajarDesdeCasa <- factor(encuestas$LeGustaTrabajarDesdeCasa, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$LeGustaTrabajarDesdeCasa)##
## Si No
## 11081 3628
table(encuestas$CambioPorMejorSalario)##
## False True
## 3091 11618
encuestas$CambioPorMejorSalario <- factor(encuestas$CambioPorMejorSalario, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$CambioPorMejorSalario)##
## Si No
## 11618 3091
table(encuestas$CambioPorMejorAmbiente)##
## False True
## 10703 4006
encuestas$CambioPorMejorAmbiente <- factor(encuestas$CambioPorMejorAmbiente, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$CambioPorMejorAmbiente)##
## Si No
## 4006 10703
table(encuestas$CambioPorFormaDeTrabajo)##
## False True
## 8209 6500
encuestas$CambioPorFormaDeTrabajo <- factor(encuestas$CambioPorFormaDeTrabajo, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$CambioPorFormaDeTrabajo)##
## Si No
## 6500 8209
table(encuestas$CambioPorTecnologia)##
## False True
## 10395 4314
encuestas$CambioPorTecnologia <- factor(encuestas$CambioPorTecnologia, levels = c("True", "False"), labels = c("Si", "No"))
table(encuestas$CambioPorTecnologia)##
## Si No
## 4314 10395
table(encuestas$CambioPorCercania)##
## False True
## 4622 7546 2541
encuestas$CambioPorCercania <- factor(encuestas$CambioPorCercania, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
table(encuestas$CambioPorCercania)##
## No informa Si No
## 4622 2541 7546
table(encuestas$CambioPorMenorCargaHoraria)##
## False True
## 4622 7763 2324
encuestas$CambioPorMenorCargaHoraria <- factor(encuestas$CambioPorMenorCargaHoraria, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
table(encuestas$CambioPorMenorCargaHoraria)##
## No informa Si No
## 4622 2324 7763
table(encuestas$CambioPorOportunidadDeCarrera)##
## False True
## 4622 4437 5650
encuestas$CambioPorOportunidadDeCarrera <- factor(encuestas$CambioPorOportunidadDeCarrera, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
table(encuestas$CambioPorOportunidadDeCarrera)##
## No informa Si No
## 4622 5650 4437
table(encuestas$TienePersonasACargo)##
## False True
## 6171 5939 2599
encuestas$TienePersonasACargo <- factor(encuestas$TienePersonasACargo, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
table(encuestas$TienePersonasACargo)##
## No informa Si No
## 6171 2599 5939
# ---------------------- Limpieza de valores anomalos ----------------------
# todas las (edad > 65) las vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$Edad < 66, ]
hist(encuestas$Edad)
rug(encuestas$Edad)# todas las (horas trabajadas >= 120 o <= 18) las vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$horasTrabajadasXSemana < 120, ]
encuestas <- encuestas[encuestas$horasTrabajadasXSemana > 18, ]
hist(encuestas$horasTrabajadasXSemana)
rug(encuestas$horasTrabajadasXSemana)# todos los (meses en el puesto actual >= 360) los vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$MesesEnElPuestoActual < 480, ]
hist(encuestas$MesesEnElPuestoActual)
rug(encuestas$MesesEnElPuestoActual)# todos los (salario actual neto >= 150000) los vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$SalarioActualNeto < 150000, ]
hist(encuestas$SalarioActualNeto)
rug(encuestas$SalarioActualNeto)# todos los (salario ideal neto >= 150000) los vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$SalarioIdealNeto < 150000, ]
hist(encuestas$SalarioIdealNeto)
rug(encuestas$SalarioIdealNeto)# Borramos los levels que no se usan
encuestas <- droplevels(encuestas)## Warning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels)
## else paste0(labels, : duplicated levels in factors are deprecated
# ---------------------- Creación de caracteristicas ----------------------
encuestas$DiferenciaSalarioRealIdeal <- encuestas$SalarioIdealNeto - encuestas$SalarioActualNeto
encuestas$SalarioNetoPorHora <- encuestas$SalarioActualNeto / encuestas$horasTrabajadasXSemana
# Carga laboral: En relación a las horas que dedica al trabajo
encuestas$CargaLaboral <- cut(encuestas$horasTrabajadasXSemana, 5, labels = c("Part Time", "Full Time", "Extra Time", "Very Extra Time", "Extreme Time"))
# Antiguedad: Nivel de antiguedad en el actual trabajo
encuestas$Antiguedad <- cut(encuestas$MesesEnElPuestoActual,quantile(encuestas$MesesEnElPuestoActual,(0:4)/4), labels = c("Junior", "SemiSenior", "Senior", "Expert"))
# Experiencia: Nivel de antiguedad en cualquier trabajo
encuestas$Experiencia <- cut(encuestas$MesesDeExperiencia,quantile(encuestas$MesesDeExperiencia,(0:4)/4), labels = c("Junior", "SemiSenior", "Senior", "Expert"))
# ---------------------- Limpieza de valores anomalos en caracteristicas creadas ----------------------
# Todas las diferencias de salario real e ideal mayores a 25000 y menores a -5000 las eliminamos
# Por considerarlas anomalas.
encuestas <- encuestas[encuestas$DiferenciaSalarioRealIdeal < 25000, ]
encuestas <- encuestas[encuestas$DiferenciaSalarioRealIdeal > -5000, ]
hist(encuestas$DiferenciaSalarioRealIdeal)
rug(encuestas$DiferenciaSalarioRealIdeal)# Todos los salarios netos por hora mayores a 1500 los vamos a eliminar por considerarlos anomalos
encuestas <- encuestas[encuestas$SalarioNetoPorHora < 1500, ]
hist(encuestas$SalarioNetoPorHora)
rug(encuestas$SalarioNetoPorHora)# Todos los "Extreme Time" los vamos a borrar por no ser representativos
encuestas <- encuestas[encuestas$CargaLaboral != "Extreme Time", ]
table(encuestas$CargaLaboral)##
## Part Time Full Time Extra Time Very Extra Time
## 1301 11987 269 40
## Extreme Time
## 0
# Borramos los levels que no se usan
encuestas <- droplevels(encuestas)Algunos graficos de ejemplo:
Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.