EncuestasIT

Encuestas IT

Este es un analisís general de los datos de las encuestas recolectadas por el sitio http://www.encuestasit.com/ Los datos en crudo de las encuestas están disponibles en el sitio, en la sección de Preguntas Frecuentes. Todo el trabajo fue realizado con la autorización de los creadores del sitio encuestasIt

Los objetivos de este trabajo son:

Indice

TODO

Obtención de datos

URL datos en crudo de las encuestas: R URL_ENCUESTAS URL datos de tabulado de tablas auxiliares: R URL_TABLAS

Estos archivos se guardarán localmente en R FILE_ENCUESTAS y R FILE_TABLAS respectivamente.

# Descargamos los datos en crudo del sitio de encuestasIT
if(!file.exists(FILE_ENCUESTAS))
    download.file(URL_ENCUESTAS, FILE_ENCUESTAS)

# Descargamos la información de las tablas anexas
if(!file.exists(FILE_TABLAS))
    download.file(URL_TABLAS, FILE_TABLAS)

Preprocesado de datos

Los datos están en formato CSV. Se espera es que cada linea sea un regitro y cada atributo está separado por una ",".

Hasta la versión publicada al 23/02/2017 ocurre un problema grave en el formato del documento, ya que uno de los campos (Observaciones) es de texto libre y no se encuentra "sanitizado" por lo que dentro del mismo puden haber "," y saltos de linea, lo que arruina el formato del documento. Algo similiar ocurre con el campo Medio para buscar trabajo que tiene valores separados por ","

El 22/02/2017 se solicitó al responsable del sitio que la proxima exportación de información se haga usando otro delimitador que no sea "," para evitar estos problemas

Antes de levantar los datos en una tabla necesitamos preprocesar el documento para solucionar estos problemas.

# 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)

# quitamos los espacios al final de cada linea (trim end)
txtdata <- gsub("\\s+$", "", 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)

# 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 total: R length(txtdata) Cantidad de renglones inconsistentes: R length(renglonesInconsistentes) Cantidad de renglones consistentes: R length(renglonesConsistentes)

Vemos que existen algunos registros que no se pueden formatear bien.
Por ser una cantidad poco significativa no le vamos a dar tratamiento a esos registros por el momento.

TODO: Darle tratamiento a los registros inconsistentes para dejarlos consistentes.

Queda como mejora revisar estos registros para darle el correcto formato.

# Grabamos el procesado que hicimos hasta ahora
write(renglonesInconsistentes, "./datos/encuestas_unclear.txt")
write(renglonesConsistentes, "./datos/encuestas_clear.txt")

Carga de datos en memoria

Levantamos los datos en un DataFrame con el nombre encuestas De aquí en más la variable encuestas será nuestra set de datos principal

# ----------------------  Levantar DataFrame  ----------------------

# Levantamos el archivo ya formateado, 
encuestas <- read.csv("./datos/encuestas_clear.txt", quote = "")

Tratamiento de valores faltantes

Antes de seguir debemos analisar los valores faltantes (NA) en nuestra tabla

# ----------------------  Tratamiento Valores Faltantes  ----------------------

# Analisamos valores faltantes
na_count <- sapply(encuestas, function(y) sum(length(which(is.na(y)))))
na_count <- data.frame(na_count)
na_count <- subset(na_count, na_count > 0)
kable(na_count, caption="Cantidad de valores faltantes por columna")
na_count
CantidadDeMesesParaCambiarDeTrabajo 8465
MedioParaBuscarTrabajo 4
CantidadDeEmpleadosEnLaOrganizacion 6203
RelaciónLaboral 7587
NivelRemunerativo 14136
SalarioActualBruto 22081
IdArea 22083
# Quitamos las columnas que tienen todos NA 
encuestas$SalarioActualBruto <- NULL
encuestas$IdArea <- NULL

# La columna "MedioParaBuscarTrabajo" no va a formar parte del analisis, pues no interesa en principio.
encuestas$MedioParaBuscarTrabajo <- 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 quitarlo
encuestas$NivelRemunerativo <- NULL


# Analisamos valores faltantes nuevamente
na_count <- sapply(encuestas, function(y) sum(length(which(is.na(y)))))
na_count <- data.frame(na_count)
na_count <- subset(na_count, na_count > 0)
kable(na_count, caption="Cantidad de valores faltantes por columna")
na_count
CantidadDeMesesParaCambiarDeTrabajo 8465
CantidadDeEmpleadosEnLaOrganizacion 6203
RelaciónLaboral 7587

Con esto ya no tenemos valores faltantes en nuestro DataSet.

Filtrado de datos por ubicación: Solo incluimos Argentina.

Restringimos el dominio del analisís a Argentina. Para este analisís nos centraremos en los datos de un solo país.

Eventualmente esto puede cambiar. En una primera versión del analisís nos limitaremos a Argentina. Se puede cambiar esto para que el analisís sea con datos de otro país, pero hay fenomenos monetarios que son propios de cada nación (inflación, tipo de cambio) que deben ser analisados en detalle en cada caso

# 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

Filtrado de datos por año: Solo incluimos 2016

El analisis será solo por un año en especifico. El año puede cambiar para obtener el mismo analisís para otros años

encuestasSinFiltrarPorAnio <- encuestas
encuestas <- subset(encuestas, as.POSIXlt(Fecha)$year + 1900 == 2016 )

Ajuste de tipos de dato

Antes de seguir debemos ajustar algunos tipos de datos. Las fechas las vamos a trabajar como POSIXlt. Los valores tabulados vamos a setearlos como Factors usando las tablas auxiliares.

# ----------------------  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

encuestas$SeSienteMotivado <- factor(encuestas$SeSienteMotivado)
encuestas$SeLoReconoceComoDebiera <- factor(encuestas$SeLoReconoceComoDebiera)
encuestas$SeSientePresionado <- factor(encuestas$SeSientePresionado)
encuestas$SeSienteSobreexigido <- factor(encuestas$SeSienteSobreexigido)
     
encuestas$IdSexo <- factor(encuestas$IdSexo, levels = tabla_sexo$IdSexo, labels = tabla_sexo$Nombre)
kable(as.data.frame(table(encuestas$IdSexo)), caption="Cantidad de registros por sexo")
Var1 Freq
No informa 31
Masculino 1747
Femenino 236
encuestas$IdNivelEducativo <- factor(encuestas$IdNivelEducativo, levels = tabla_nivel_educativo$IdNivelEducativo, labels = tabla_nivel_educativo$Nombre)
kable(as.data.frame(table(encuestas$IdNivelEducativo)), caption="Cantidad de registros por nivel educativo")
Var1 Freq
No informa 30
Primario 4
Secundario en curso o incompleto 13
Secundario completo 86
Terciario en curso o incompleto 138
Terciario completo 241
Universitario en curso o incompleto 669
Universitario completo 695
Master o postgrado en curso o incompleto 60
Master o postgrado completo 78
encuestas$IdTipoDeEmpresa <- factor(encuestas$IdTipoDeEmpresa, levels = tabla_tipo_empresa$IdTipoDeEmpresa, labels = tabla_tipo_empresa$Nombre)
kable(as.data.frame(table(encuestas$IdTipoDeEmpresa)), caption="Cantidad de registros por tipo de empresa")
Var1 Freq
No informa 12
Una empresa privada 1630
Un organismo estatal 131
Una ONG 4
Otro 59
Mi propia empresa 118
Soy independiente / freelance 60
encuestas$IdProvincia <- factor(encuestas$IdProvincia, levels = tabla_provincia$IdProvincia, labels = tabla_provincia$Nombre)
kable(as.data.frame(table(encuestas$IdProvincia)), caption="Cantidad de registros por provincia")
Var1 Freq
Capital Federal 1242
GBA Zona Norte 159
GBA Zona Oeste 29
GBA Zona Sur 36
Costa Atlántica 8
Buenos Aires 94
Catamarca 1
Córdoba 173
Chaco 14
Chubut 2
Corrientes 10
Entre Ríos 16
Formosa 2
Jujuy 2
La Pampa 4
La Rioja 0
Misiones 17
Mendoza 39
Neuquén 11
Río Negro 10
Salta 5
Santa Cruz 2
Santiago del Estero 0
Sante Fe 96
San Juan 4
San Luis 10
Tierra del Fuego 0
Tucumán 28
encuestas$IdPuesto <- factor(encuestas$IdPuesto, levels = tabla_puesto$IdPuesto, labels = tabla_puesto$Nombre)
kable(as.data.frame(table(encuestas$IdPuesto)), caption="Cantidad de registros por puesto")
Var1 Freq
Desarrollador de software / Programador 486
Arquitecto 32
Lider de Proyecto 79
Analista Funcional 157
Selector de personal TI 0
Diseñador Web 5
Investigación 2
Consultor TI 60
Administrador de Base de Datos 29
Administrador de Redes 22
Analista de Garantía de Calidad (QA) 10
Analista de Seguridad Informática 16
Auditor 0
Comercial de TI 1
Director de Sistemas 13
Documentador de Sistemas 0
Gerente de Proyectos 58
Implementador de Sistemas 9
Instructor 0
Gerente de Compras TI 0
Gerente de Comunicaciones 0
Gerente de Desarrollo 13
Gerente de Operaciones 3
Gerente de Seguridad Informática 4
Gerente de Sistemas 35
Gerente de Tecnología 15
Gerente de Ventas TI 3
Pasante 3
Mesa de Ayuda (Help Desk) 12
Soporte Técnico 61
Pasante (Trainee) 2
Otro 13
Administrador de Almacenamiento (Storage) 367
Administrador Middleware 2
Administrador de Sistemas 56
Administrador de Ambientes 2
Administrador de Servidores 47
Coordinador de Grupo 9
Lider Técnico 51
Comprador TI 1
Data Entry 0
Soporte de Aplicación 12
Soporte de Posventa 0
Jefe de Mesa de Ayuda 2
Operador NOC 3
Líder de Mesa de Ayuda 2
Líder de Operaciones 2
Líder de Garantía de Calidad (QA) 5
Líder de Seguridad Informática 4
Líder de Soporte Técnico 9
Operador de AS400 0
Preventa 5
Ejecutivo de Cuenta 2
Gerente de Producto 9
Analista BI 20
Scrum Master 9
Auditor de TI 8
Gerente General 3
Director General 7
Administrador de Backup 0
Maquetador 0
Administrador de Proyectos 8
Operador de Sistemas 5
Tester Funcional 15
Analista de Testeo 15
Jefe de Compras TI 1
Jefe de Comunicaciones 5
Jefe de Desarrollo 32
Jefe de Operaciones 5
Jefe de Seguridad Informática 5
Jefe de Sistemas 43
Jefe de Tecnología 8
Jefe de Ventas TI 1
Jefe de Gestión de Demanda 3
Diseñador Multimedia 0
Gestor de Cambios de IT 0
Gestor de Transición 0
Gestor de Configuraciones 0
Analista de Cambios 1
Gerente de Procesos de IT 1
Gestor de Incidentes 1
Gestor de Problemas 0
Gerente de Demanda 2
Gerente de Infraestructura 8
Jefe de Infraestructura 12
Supervisor de Infraestructura 13
Responsable de Infraestructura 11
Analista de Gestión de la Demanda 1
Responsable de Gestión de la Demanda 1
Analista de Procesos 5
Responsable de Procesos 2
Gestor de Servicios 1
Desarrollador BI 20
Lider BI 5
Gerente Regional de IT 4
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
kable(as.data.frame(table(encuestas$IdTecnologiaPrincipal)), caption="Cantidad de registros por tecnología principal")
## Warning in `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels)
## else paste0(labels, : duplicated levels in factors are deprecated
Var1 Freq
.Net 682
Java 212
PHP 86
C++ 13
C 8
Ruby 9
Perl 2
Prolog 0
Smalltalk 9
Python 18
Delphi 11
VisualBasic 17
ActionScript 1
Javascsript 38
Asp 3
Html 4
Haskell 0
MSSQLServer 43
Oracle 97
PostgreSql 5
DatawareHousing 11
Cobol 17
DB2 0
SAP 108
Siebel 7
Otro 97
Windows 225
Linux 52
Solaris 1
Aix 5
Hp-ux 1
Mainframe 10
AS/400 17
Assembler 0
CMS 1
Cobol 0
Siebel 0
ERP 14
Flash 0
Flex 0
Meta4 4
RPG 1
Hp 6
Unix 10
Clipper 2
Genexus 19
MySql Server 6
Visual FoxPro 15
Android 17
Sharepoint 5
Clarion 4
QlikView 9
Microstrategy 7
BusinessObject 0
Cognos 0
Hyperion 1
Tibco 0
Board 0
Pentaho 4
CISCO 20
SSIS 1
VMWare 22
PowerBuilder 5
CRM 8
Objective-C 10
JD Edwards 1
PeopleSoft 4
Joomla 0
Clojure 0
Scala 2
Node js 4
Ruby on Rails 3
encuestas$TrabajaDesdeCasa <- factor(encuestas$TrabajaDesdeCasa, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$TrabajaDesdeCasa)), caption="Cantidad de registros por trabaja desde casa")
Var1 Freq
Si 582
No 1432
encuestas$LeGustaTrabajarDesdeCasa <- factor(encuestas$LeGustaTrabajarDesdeCasa, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$LeGustaTrabajarDesdeCasa)), caption="Cantidad de registros por le gusta trabajar desde casa")
Var1 Freq
Si 1678
No 336
encuestas$CambioPorMejorSalario <- factor(encuestas$CambioPorMejorSalario, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorMejorSalario)), caption="Cantidad de registros por cambiaria por mejor salario")
Var1 Freq
Si 1616
No 398
encuestas$CambioPorMejorAmbiente <- factor(encuestas$CambioPorMejorAmbiente, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorMejorAmbiente)), caption="Cantidad de registros por cambiaria por ambiente")
Var1 Freq
Si 559
No 1455
encuestas$CambioPorFormaDeTrabajo <- factor(encuestas$CambioPorFormaDeTrabajo, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorFormaDeTrabajo)), caption="Cantidad de registros por cambiaria por forma de trabajo")
Var1 Freq
Si 810
No 1204
encuestas$CambioPorTecnologia <- factor(encuestas$CambioPorTecnologia, levels = c("True", "False"), labels = c("Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorTecnologia)), caption="Cantidad de registros por cambiaria por tecnología")
Var1 Freq
Si 619
No 1395
encuestas$CambioPorCercania <- factor(encuestas$CambioPorCercania, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorCercania)), caption="Cantidad de registros por cambiaria por cercania")
Var1 Freq
No informa 0
Si 584
No 1430
encuestas$CambioPorMenorCargaHoraria <- factor(encuestas$CambioPorMenorCargaHoraria, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorMenorCargaHoraria)), caption="Cantidad de registros por cambiaria por menor carga horaria")
Var1 Freq
No informa 0
Si 556
No 1458
encuestas$CambioPorOportunidadDeCarrera <- factor(encuestas$CambioPorOportunidadDeCarrera, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
kable(as.data.frame(table(encuestas$CambioPorOportunidadDeCarrera)), caption="Cantidad de registros por cambiaria por oportunidad de carrera")
Var1 Freq
No informa 0
Si 1013
No 1001
encuestas$TienePersonasACargo <- factor(encuestas$TienePersonasACargo, levels = c("", "True", "False"), labels = c("No informa", "Si", "No"))
kable(as.data.frame(table(encuestas$TienePersonasACargo)), caption="Cantidad de registros por tiene personas a cargo")
Var1 Freq
No informa 0
Si 695
No 1319

Limpieza de valores anomalos

cantRegistrosAntesLimpieza <- dim(encuestas)[1]

# ---------------------- Limpieza de valores anomalos  ---------------------- 

# todas las (edad > 65 o < 18) las vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$Edad < 66, ]
encuestas <- encuestas[encuestas$Edad > 17,  ]
hist(encuestas$Edad)
rug(encuestas$Edad)

cantAnomalosPorEdad <- cantRegistrosAntesLimpieza -  dim(encuestas)[1]

# todas las (horas trabajadas >= 120 o <= 18) las vamos a considerar anomalas.
# no vamos a desechar esos registros ya que son muchos, vamos a considerar que trabajan 40hs por semana
encuestas[encuestas$horasTrabajadasXSemana >= 100, ]$horasTrabajadasXSemana <- 40
encuestas[encuestas$horasTrabajadasXSemana <= 18, ]$horasTrabajadasXSemana <- 40
hist(encuestas$horasTrabajadasXSemana)
rug(encuestas$horasTrabajadasXSemana)

cantAnomalosPorHorasTrabajadas <- cantRegistrosAntesLimpieza - cantAnomalosPorEdad -  dim(encuestas)[1]

# 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)

cantAnomalosPorMesesEnPuestoActual <- cantRegistrosAntesLimpieza - cantAnomalosPorHorasTrabajadas - cantAnomalosPorEdad - dim(encuestas)[1]

# todos los (salario actual neto >= 150000 o <= 7000) los vamos a considerar anomalas y vamos a desechar esos registros
encuestas <- encuestas[encuestas$SalarioActualNeto < 150000, ]
encuestas <- encuestas[encuestas$SalarioActualNeto > 7000, ]
hist(encuestas$SalarioActualNeto)
rug(encuestas$SalarioActualNeto)

cantAnomalosPorSalarioActualNeto <- cantRegistrosAntesLimpieza - cantAnomalosPorHorasTrabajadas - cantAnomalosPorEdad - cantAnomalosPorMesesEnPuestoActual - dim(encuestas)[1]


# 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)

cantAnomalosPorSalarioIdealNeto <- cantRegistrosAntesLimpieza - cantAnomalosPorHorasTrabajadas - cantAnomalosPorEdad - cantAnomalosPorMesesEnPuestoActual - cantAnomalosPorSalarioActualNeto - dim(encuestas)[1]


# 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
cantRegistrosDespuesLimpieza <- dim(encuestas)[1]

Cantidad de registros anomalos por edad: R cantAnomalosPorEdad Cantidad de registros anomalos por horas trabajadas: R cantAnomalosPorHorasTrabajadas Cantidad de registros anomalos por meses en el puesto actual: R cantAnomalosPorMesesEnPuestoActual Cantidad de registros anomalos por salario actual neto: R cantAnomalosPorSalarioActualNeto Cantidad de registros anomalos por salario ideal neto: R cantAnomalosPorSalarioIdealNeto

Cantidad de registros antes de limpieza: R cantRegistrosAntesLimpieza Cantidad de registros despues de limpieza: R cantRegistrosDespuesLimpieza Cantidad de registros anomalos eliminados: R (cantRegistrosAntesLimpieza - cantRegistrosDespuesLimpieza)

Creación de caracteristicas

# ---------------------- Creación de caracteristicas  ---------------------- 

encuestas$Anio <- factor(encuestas$Fecha$year + 1900)
encuestas$AnioMes <- factor((encuestas$Fecha$year + 1900) * 100 + encuestas$Fecha$mon + 1)

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, c(0, 35, 45, 50, 999), labels = c("Part Time", "Full Time", "Extra Time", "Very Extra Time"))

# Antiguedad: Nivel de antiguedad en el actual trabajo
encuestas$Antiguedad <- cut(encuestas$MesesEnElPuestoActual,c(0, 18, 36, 60, 999), labels = c("Junior", "SemiSenior", "Senior", "Expert"))

# Experiencia: Nivel de antiguedad en cualquier trabajo
encuestas$Experiencia <- cut(encuestas$MesesDeExperiencia,c(0, 18, 36, 60, 999), labels = c("Junior", "SemiSenior", "Senior", "Expert"))

# IdEdad: Nivel de antiguedad en cualquier trabajo
encuestas$IdEdad <- cut(encuestas$Edad,c(0, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65))

Limpieza de valores anomalos en caracteristicas creadas

# ---------------------- 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)

cantAnomalosPorDiferenciaRealIdeal <- cantRegistrosDespuesLimpieza - dim(encuestas)[1]

# 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)

cantAnomalosPorSalarioPorHora <- cantRegistrosDespuesLimpieza - cantAnomalosPorDiferenciaRealIdeal - dim(encuestas)[1]

# Borramos los levels que no se usan
encuestas <- droplevels(encuestas)

Exploración grafica

Algunos graficos de ejemplo:

# distribución de sueldo netos por hora en función del puesto
bymedian <- with(encuestas, reorder(IdPuesto, -SalarioNetoPorHora, median))
bwplot(bymedian ~ SalarioNetoPorHora, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función del puesto
# para sueldos mayores de $500 por hora
bymedian <- with(subset(encuestas, SalarioNetoPorHora > 500), reorder(IdPuesto, -SalarioNetoPorHora, median))
bwplot(bymedian ~ SalarioNetoPorHora, subset(encuestas, SalarioNetoPorHora > 500), horizontal = TRUE)

# distribución de sueldo netos por hora en función del nivel educativo
bymedian <- with(encuestas, reorder(IdNivelEducativo, -SalarioNetoPorHora, median))
bwplot(bymedian ~ SalarioNetoPorHora, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función del sexo
bymedian <- with(encuestas, reorder(IdSexo, -SalarioNetoPorHora, median))
bwplot(bymedian ~ SalarioNetoPorHora, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función de las horas trabajadas por semana
bymedian <- with(encuestas, reorder(CargaLaboral, -SalarioNetoPorHora, median))
bwplot(bymedian ~ SalarioNetoPorHora, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función de la experiencia
bymedian <- with(encuestas, reorder(Experiencia, -SalarioActualNeto, median))
bwplot(bymedian ~ SalarioActualNeto, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función de la antiguedad
bymedian <- with(encuestas, reorder(Antiguedad, -SalarioActualNeto, median))
bwplot(bymedian ~ SalarioActualNeto, encuestas, horizontal = TRUE)

# distribución de sueldo netos por hora en función de la tecnologia
bymedian <- with(encuestas, reorder(IdTecnologiaPrincipal, -SalarioActualNeto, median))
bwplot(bymedian ~ SalarioActualNeto, encuestas, horizontal = TRUE)

# Se ve la relación entre sueldo y antiguedad alterada segun el sexo?
qplot(Edad, SalarioNetoPorHora, data = subset(encuestas, IdSexo != "No informa"), color= IdSexo, fill = IdSexo, geom=c("point", "smooth"), facets = .~Anio, method="lm")
## Warning: Ignoring unknown parameters: method

# Relación entre salario y sexo segun
qplot(SalarioNetoPorHora, data = encuestas, color= IdSexo, fill = IdSexo, facets = .~Anio)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

qplot(SalarioNetoPorHora, data = encuestas, color= IdSexo, fill = IdSexo, facets = .~IdNivelEducativo)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.