Análisis de puestos


In [133]:
import pandas as pd
import pandas_profiling
import numpy as np
from pandasql import *

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
import string

In [134]:
df = pd.read_pickle('sueldos_contrata.pkl')

In [135]:
pandas_profiling.ProfileReport(df)


Out[135]:

Overview

Dataset info

Number of variables 8
Number of observations 16241
Total Missing (%) 0.0%
Total size in memory 1015.1 KiB
Average record size in memory 64.0 B

Variables types

Numeric 2
Categorical 6
Date 0
Text (Unique) 0
Rejected 0

Warnings

  • Cargo has a high cardinality: 2305 distinct values Warning
  • Fecha de inicio has a high cardinality: 742 distinct values Warning
  • Fecha de término has a high cardinality: 191 distinct values Warning
  • Grado EUS has a high cardinality: 72 distinct values Warning
  • Remuneración Bruta Mensualizada has 190 / 1.2% zeros
  • index has 169 / 1.0% zeros
  • Dataset has 12100 duplicate rows Warning

Variables

Cargo
Categorical

Distinct count 2305
Unique (%) 14.2%
Missing (%) 0.0%
Missing (n) 0
PROFESIONAL
 
788
PROFESIONAL SECTORIAL
 
572
PROFESIONAL DIRECCION REGIONAL
 
494
Other values (2302)
14387
Value Count Frequency (%)  
PROFESIONAL 788 4.9%
 
PROFESIONAL SECTORIAL 572 3.5%
 
PROFESIONAL DIRECCION REGIONAL 494 3.0%
 
PROFESIONAL DIVISION TECNICA 390 2.4%
 
JEFE SUBDEPARTAMENTO TECNICO 286 1.8%
 
Profesional Analista 234 1.4%
 
PROFESIONAL DEPARTAMENTO DE SOPORTE 234 1.4%
 
JEFE SUBDEPARTAMENTO DE SOPORTE 208 1.3%
 
31/12/2016 188 1.2%
 
PROFESIONAL DE APOYO 118 0.7%
 
Other values (2295) 12729 78.4%
 

Estamento
Categorical

Distinct count 24
Unique (%) 0.1%
Missing (%) 0.0%
Missing (n) 0
PROFESIONAL
9570
Profesional
4012
Técnico
 
527
Other values (21)
2132
Value Count Frequency (%)  
PROFESIONAL 9570 58.9%
 
Profesional 4012 24.7%
 
Técnico 527 3.2%
 
ADMINISTRATIVO 472 2.9%
 
Administrativo 463 2.9%
 
d. Profesional 231 1.4%
 
TÉCNICO 189 1.2%
 
DIRECTIVO 149 0.9%
 
FISCALIZADORES 100 0.6%
 
TECNICO 76 0.5%
 
Other values (14) 452 2.8%
 

Fecha de inicio
Categorical

Distinct count 742
Unique (%) 4.6%
Missing (%) 0.0%
Missing (n) 0
01/01/2016
7028
 
506
01/04/2016
 
185
Other values (739)
8522
Value Count Frequency (%)  
01/01/2016 7028 43.3%
 
506 3.1%
 
01/04/2016 185 1.1%
 
01/01/2001 159 1.0%
 
01/02/2016 142 0.9%
 
01/01/2010 142 0.9%
 
01/01/2015 136 0.8%
 
01/03/2016 135 0.8%
 
01/01/2002 130 0.8%
 
01/01/2007 113 0.7%
 
Other values (732) 7565 46.6%
 

Fecha de término
Categorical

Distinct count 191
Unique (%) 1.2%
Missing (%) 0.0%
Missing (n) 0
31/12/2016
14126
Indefinido
 
317
 
206
Other values (188)
 
1592
Value Count Frequency (%)  
31/12/2016 14126 87.0%
 
Indefinido 317 2.0%
 
206 1.3%
 
31/03/2016 154 0.9%
 
31/01/2016 153 0.9%
 
30/06/2016 105 0.6%
 
29/02/2016 97 0.6%
 
31/05/2016 69 0.4%
 
30/04/2016 50 0.3%
 
31/07/2016 41 0.3%
 
Other values (181) 923 5.7%
 

Grado EUS
Categorical

Distinct count 72
Unique (%) 0.4%
Missing (%) 0.0%
Missing (n) 0
6
2457
7
 
1820
4
 
1522
Other values (69)
10442
Value Count Frequency (%)  
6 2457 15.1%
 
7 1820 11.2%
 
4 1522 9.4%
 
8 1359 8.4%
 
5 1280 7.9%
 
9 1208 7.4%
 
10 1199 7.4%
 
11 653 4.0%
 
12 631 3.9%
 
13 480 3.0%
 
Other values (62) 3632 22.4%
 

Remuneración Bruta Mensualizada
Numeric

Distinct count 2297
Unique (%) 14.1%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 2513500
Minimum 0
Maximum 8168200
Zeros (%) 1.2%

Quantile statistics

Minimum 0
5-th percentile 678760
Q1 1829900
Median 2557600
Q3 3133100
95-th percentile 4508200
Maximum 8168200
Range 8168200
Interquartile range 1303200

Descriptive statistics

Standard deviation 1137800
Coef of variation 0.45269
Kurtosis 0.92494
Mean 2513500
MAD 870620
Skewness 0.23772
Sum 40821000000
Variance 1294600000000
Memory size 127.0 KiB
Value Count Frequency (%)  
0.0 190 1.2%
 
2653889.0 178 1.1%
 
2442925.0 167 1.0%
 
2453004.0 131 0.8%
 
2938934.0 130 0.8%
 
2950163.0 130 0.8%
 
3127463.0 130 0.8%
 
2927703.0 104 0.6%
 
3284469.0 104 0.6%
 
2972623.0 104 0.6%
 
Other values (2287) 14873 91.6%
 

Minimum 5 values

Value Count Frequency (%)  
0.0 190 1.2%
 
1.0 32 0.2%
 
2.0 46 0.3%
 
3.0 76 0.5%
 
4.0 18 0.1%
 

Maximum 5 values

Value Count Frequency (%)  
6987629.0 12 0.1%
 
7012797.0 4 0.0%
 
7829965.0 3 0.0%
 
8155360.0 4 0.0%
 
8168166.0 4 0.0%
 

index
Numeric

Distinct count 100
Unique (%) 0.6%
Missing (%) 0.0%
Missing (n) 0
Infinite (%) 0.0%
Infinite (n) 0
Mean 48.782
Minimum 0
Maximum 99
Zeros (%) 1.0%

Quantile statistics

Minimum 0
5-th percentile 4
Q1 24
Median 48
Q3 74
95-th percentile 94
Maximum 99
Range 99
Interquartile range 50

Descriptive statistics

Standard deviation 28.845
Coef of variation 0.59131
Kurtosis -1.1956
Mean 48.782
MAD 24.96
Skewness 0.031038
Sum 792263
Variance 832.03
Memory size 127.0 KiB
Value Count Frequency (%)  
0 169 1.0%
 
1 169 1.0%
 
2 169 1.0%
 
14 168 1.0%
 
17 168 1.0%
 
3 168 1.0%
 
11 168 1.0%
 
9 168 1.0%
 
18 168 1.0%
 
4 168 1.0%
 
Other values (90) 14558 89.6%
 

Minimum 5 values

Value Count Frequency (%)  
0 169 1.0%
 
1 169 1.0%
 
2 169 1.0%
 
3 168 1.0%
 
4 168 1.0%
 

Maximum 5 values

Value Count Frequency (%)  
95 157 1.0%
 
96 157 1.0%
 
97 156 1.0%
 
98 156 1.0%
 
99 156 1.0%
 

servicio
Categorical

Distinct count 48
Unique (%) 0.3%
Missing (%) 0.0%
Missing (n) 0
Servicio Agrícola Ganadero (SAG)
2600
Instituto de Desarrollo Agropecuario (INDAP)
 
1400
Instituto Nacional de Estadísticas (INE)
 
1100
Other values (45)
11141
Value Count Frequency (%)  
Servicio Agrícola Ganadero (SAG) 2600 16.0%
 
Instituto de Desarrollo Agropecuario (INDAP) 1400 8.6%
 
Instituto Nacional de Estadísticas (INE) 1100 6.8%
 
Dirección General de Relaciones Económicas Internacionales (DIRECON) 800 4.9%
 
Instituto de Seguridad Laboral (ISL) 500 3.1%
 
Caja de Previsión de la Defensa Nacional (CAPREDENA) 500 3.1%
 
Subsecretaría de Bienes Nacionales 500 3.1%
 
Corporación Nacional de Desarrollo Indígena (CONADI) 500 3.1%
 
Subsecretaría del Medio Ambiente 500 3.1%
 
Subsecretaría de Relaciones Exteriores 500 3.1%
 
Other values (38) 7341 45.2%
 

Sample

Estamento Cargo Grado EUS Remuneración Bruta Mensualizada Fecha de inicio Fecha de término servicio
0 PROFESIONAL JEFA UNIDAD COMUNICACIONES 3639594.0 01/08/2014 31/12/2016 Caja de Previsión de la Defensa Nacional (CAPR...
1 PROFESIONAL ASESOR DE VICEPRESIDENCIA 3900396.0 01/03/2015 05/06/2016 Caja de Previsión de la Defensa Nacional (CAPR...
2 PROFESIONAL JEFA AUDITORIA INTERNA 2911675.0 22/12/2011 31/12/2016 Caja de Previsión de la Defensa Nacional (CAPR...
3 PROFESIONAL JEFE DEPTO. CONTABILIDAD 2379684.0 26/05/2014 31/12/2016 Caja de Previsión de la Defensa Nacional (CAPR...
4 PROFESIONAL ASESOR LEGAL DE LOS CDS y R 2393036.0 02/01/1996 31/12/2016 Caja de Previsión de la Defensa Nacional (CAPR...

Limpieza de variable Estamento

Veamos cómo es la distribución de valores de esta variable


In [136]:
q  = "SELECT Estamento,count(*) as Nro FROM df GROUP BY Estamento ORDER BY 2 desc"
sqldf(q)


Out[136]:
Estamento Nro
0 PROFESIONAL 9570
1 Profesional 4012
2 Técnico 527
3 ADMINISTRATIVO 472
4 Administrativo 463
5 d. Profesional 231
6 TÉCNICO 189
7 DIRECTIVO 149
8 FISCALIZADORES 100
9 TECNICO 76
10 AUXILIAR 75
11 PROFESIONALES 72
12 FISCALIZADOR 60
13 Fiscalizador 41
14 g. Tco No Profes 39
15 Auxiliar 38
16 h. Admistrativo 27
17 No aplica 26
18 ADMINISTRATIVOS 24
19 EXPERTO 16
20 Directivo 15
21 AUXILIARES 12
22 TÉCNICOS 4
23 j. Auxiliar 3

Observaciones:

  • Mezcla de mayúsculas y minúsculas
  • Abreviaciones con puntuaciones extrañas (d.,j.,h.,g.)
  • Existe el concepto "No Aplica". Hay que investigar la razón.

Para la limpieza, vamos a eliminar todas las puntuaciones y reemplazaré algunas abreviaciones. Examinemos primero estos casos raros.


In [137]:
q  = '''
SELECT 
    distinct Estamento,
    Cargo, 
    Servicio 
FROM 
    df 
WHERE 
    Estamento like "_.%"
'''
sqldf(q)


Out[137]:
Estamento Cargo servicio
0 d. Profesional PROFESIONAL Servicio Evaluación Ambiental
1 d. Profesional JEFA DE DEPARTAMENTO Servicio Evaluación Ambiental
2 g. Tco No Profes ADMINISTRATIVO Servicio Evaluación Ambiental
3 h. Admistrativo ADMINISTRATIVO Servicio Evaluación Ambiental
4 g. Tco No Profes TECNICO Servicio Evaluación Ambiental
5 j. Auxiliar AUXILIAR Servicio Evaluación Ambiental
6 d. Profesional JEFE DE DEPARTAMENTO Servicio Evaluación Ambiental
7 h. Admistrativo TECNICO Servicio Evaluación Ambiental

Observamos que todos pertencen al Servicio de Evaluación Ambiental. Si miramos la fuente, podemos ver que efectivamente no hay referencias del significado de los prefijos mostrados, por lo que se eliminarán.


In [138]:
# No hay stop_words a borrar. Normalmente se usaría stop_words = stopwords.words('spanish')
stop_words = []

In [139]:
# Borramos abreviaciones sin significado
palabras_a_borrar = ['d.','g.','h.','j.']

# Normalmente se usa puntuaciones = string.punctuation
puntuaciones = []

In [140]:
def clean_text(s):
    
    # 1. Pasar todo a minúsculas y separar en arreglo de palabras
    ws = s.lower().split()

    # 2. Eliminar espaciones innecesarios, junto con conectores gramaticales'''
    ws = [w.strip() for w in ws if w not in stop_words]
    
    # 3. Remover puntuación
    ws = [w for w in ws if w not in puntuaciones]

    # 4. 
    ws = [w for w in ws if w not in palabras_a_borrar]
    return " ".join(ws)

In [141]:
estamentos = df['Estamento'].tolist()

In [142]:
estamentos = pd.Series([clean_text(s) for s in estamentos])

In [143]:
# Uniformemos valores con un diccionario y reemplazamos
d = {
    'técnico': 'tecnico',
    'fiscalizadores': 'fiscalizador',
    'administrativos': 'administrativo',
    'profesionales': 'profesional',
    'tco no profes': 'tecnico',
    'no aplica': 'otro',
    'auxiliares': 'auxiliar',
    'técnicos': 'tecnico'
}
estamentos.replace(d,inplace=True)

In [145]:
estamentos.sort_values().value_counts()


Out[145]:
profesional       13885
administrativo      959
tecnico             835
fiscalizador        201
directivo           164
auxiliar            128
admistrativo         27
otro                 26
experto              16
dtype: int64

No aparecen más problemas.

Limpieza de variable Cargo


In [19]:
# Primero veamos la lista de cargos con mayor frecuencia de aparición, ej. con frecuencia > 50
q  = "SELECT Cargo,count(*) as Nro FROM df GROUP BY Cargo HAVING Nro>50 ORDER BY 2 desc"
sqldf(q)


Out[19]:
Cargo Nro
0 PROFESIONAL 788
1 PROFESIONAL SECTORIAL 572
2 PROFESIONAL DIRECCION REGIONAL 494
3 PROFESIONAL DIVISION TECNICA 390
4 JEFE SUBDEPARTAMENTO TECNICO 286
5 PROFESIONAL DEPARTAMENTO DE SOPORTE 234
6 Profesional Analista 234
7 JEFE SUBDEPARTAMENTO DE SOPORTE 208
8 31/12/2016 188
9 PROFESIONAL DE APOYO 118
10 ANALISTA ECONOMICO 110
11 PROFESIONAL DE APOYO DIRECCION REGIONAL LOS LAGOS 98
12 Analista 96
13 AUDITOR INTERNO 78
14 PROFESIONAL ASESOR 78
15 PROFESIONAL DEPARTAMENTO TECNICO 78
16 PROFESIONAL DIVISION JURIDICA 78
17 ANALISTA ESTADISTICO 77
18 Abogado 77
19 DIRECTOR/A REGIONAL 75
20 AGREGADO CULTURAL 55
21 ENCARGADO/A UNIDAD 55
22 Profesional de Apoyo 55
23 JEFE DE DEPARTAMENTO 52
24 JEFE DEPARTAMENTO DE SOPORTE 52

Podemos observar que hay fechas metidas entre medio. Veamos los casos:


In [20]:
s = 'select servicio,count(*) as nro from df where Cargo like "%/2016" group by Cargo'
sqldf(s)


Out[20]:
servicio nro
0 Superindencia del Medio Ambiente 2
1 Superindencia del Medio Ambiente 2
2 Superindencia del Medio Ambiente 2
3 Superindencia del Medio Ambiente 2
4 Superindencia del Medio Ambiente 4
5 Superindencia del Medio Ambiente 188

Nos encontramos con que los casos corresponden a la misma institución (qu.e además tiene el nombre malo). Revisando la página web, podemos ver que el problema es del origen:

Por lo que borraremos estos registros en el merge final


In [147]:
# Pasamos los cargos a una variable para limpiar
cargos = df['Cargo'].tolist()

In [148]:
# Para usar la función "clean_text" usaremos además limpieza de conectores gramaticales de la lengua española
stop_words = stopwords.words('spanish')
palabras_a_borrar = []
puntuaciones = string.punctuation

In [149]:
cargos = pd.Series([clean_text(s) for s in cargos])

In [153]:
# Muestra para ver como quedó
cargos[0:10].to_frame(name='cargo')


Out[153]:
cargo
0 jefa unidad comunicaciones
1 asesor vicepresidencia
2 jefa auditoria interna
3 jefe depto. contabilidad
4 asesor legal cds r
5 jefe departamento fondo solidiario
6 jefa subrogante departamento pensiones
7 abogado garantía hipotecaria
8 jefa unidad capacitación evaluación desempeño
9 encargado departamento asistencia social

In [154]:
# Veamos una lista general
df_cargos = cargos.to_frame(name='cargo')
q  = "SELECT cargo,count(*) as nro FROM df_cargos GROUP BY cargo ORDER BY 2 desc"
sqldf(q)


Out[154]:
cargo nro
0 profesional 794
1 profesional sectorial 572
2 profesional direccion regional 495
3 profesional division tecnica 390
4 jefe subdepartamento tecnico 286
5 profesional analista 234
6 profesional departamento soporte 234
7 jefe subdepartamento soporte 208
8 31/12/2016 188
9 profesional apoyo 174
10 analista 128
11 abogado 116
12 analista economico 110
13 profesional apoyo direccion regional lagos 98
14 profesional division juridica 84
15 auditor interno 81
16 profesional asesor 78
17 profesional departamento tecnico 78
18 analista estadistico 77
19 director/a regional 75
20 secretaria 62
21 economista 57
22 agregado cultural 55
23 encargado/a unidad 55
24 jefe departamento 52
25 jefe departamento soporte 52
26 periodista 51
27 prevencionista riesgo 45
28 secretaria direccion regional coquimbo 42
29 conductor 41
... ... ...
2160 secretaria departamento coordinación municipal 1
2161 secretaria departamento programacion 1
2162 secretaria depto. adm.y finanzas 1
2163 secretaria depto. operaciones habitacionales 1
2164 secretaria depto. planificación estratégica 1
2165 secretaria direccion regional 1
2166 secretaria división adminstración finanzas 1
2167 secretaria división análisis control gestión 1
2168 secretaria división análisis control gestión. ... 1
2169 secretaria división autorizaciones 1
2170 secretaria división jurídica 1
2171 secretaria división planificación ordenamiento... 1
2172 secretaria división planificación. 1
2173 secretaria secretaría general departamento legal 1
2174 secretaria subsecretaria turismo 1
2175 secretaria superintendente 1
2176 secretaria unidad asesoría jurídica 1
2177 secretaria unidad gestión terrenos 1
2178 secretaria área administración finanzas 1
2179 secretario departamento comunicaciones 1
2180 servicios generales chofer unidad provincial o... 1
2181 tecnico abastecimiento 1
2182 tecnico apoyo unidad abastecimiento 1
2183 tecnico dacg 1
2184 tecnico diplade 1
2185 tecnico unidad informática 1
2186 técnico consejo regional 1
2187 técnico departamento finanzas 1
2188 técnico depto. recursos humanos 1
2189 técnico sección contabilidad 1

2190 rows × 2 columns

Para hacer la limpieza más eficiente, vamos a separar el nombre del cargo en dos componentes:

  • La denominación principal del cargo, ej.: jefe, encargado, tecnico
  • Área de aplicación

Luego procederemos a normalizar cada campo:

  • Unificando género, ej.: jefe = jefa
  • Eliminando subrogancias
  • Limpiando acrónimos, ej: cdr r
  • Normalizando textos equivalentes en significado: depto. = departamento

In [155]:
# Creamos un nuevo Data Frame expandiendo por el primer split. Luego de las correciones los uniremos
df_cargos = df_cargos['cargo'].str.split(' ', 1, expand=True)
df_cargos.columns = ['nivel','ambito']
df_cargos.head()


Out[155]:
nivel ambito
0 jefa unidad comunicaciones
1 asesor vicepresidencia
2 jefa auditoria interna
3 jefe depto. contabilidad
4 asesor legal cds r

In [156]:
# Veamos las correcciones al campo "nivel"
s='select nivel,count(*) as nro from df_cargos group by nivel having nro>1 order by 2 desc'
sqldf(s)


Out[156]:
nivel nro
0 profesional 5276
1 jefe 2104
2 analista 1341
3 encargado 583
4 jefa 498
5 ejecutivo 454
6 abogado 451
7 asistente 427
8 encargada 421
9 administrativo 398
10 secretaria 367
11 apoyo 256
12 coordinador 216
13 tecnico 189
14 31/12/2016 188
15 auditor 161
16 agregado 160
17 auxiliar 156
18 técnico 145
19 coordinador(a) 132
20 fiscalizador 128
21 asesor 122
22 asesora 117
23 director 115
24 conductor 100
25 director/a 92
26 ingeniero 88
27 encargado/a 86
28 jefe/a 75
29 periodista 71
... ... ...
112 analisis 3
113 asistentente 3
114 auditora 3
115 delegado 3
116 dpto. 3
117 gabinete 3
118 gestor 3
119 profesional, 3
120 profsional 3
121 prosefional 3
122 relacionador 3
123 reportera 3
124 secretario 3
125 supervisora 3
126 02/10/2016 2
127 20/08/2016 2
128 21/06/2016 2
129 30/09/2016 2
130 egresado 2
131 ejecutiva 2
132 experto 2
133 fiscal 2
134 jede 2
135 líder 2
136 mayordomo 2
137 portero 2
138 profesionalde 2
139 secretaría 2
140 sub 2
141 tesorera 2

142 rows × 2 columns

La lista nos muestra varios tipos de reemplazos. Haremos un diccionario y aplicaremos las correcciones


In [157]:
# Cambiemos acentos
# Uniformemos valores con un diccionario y reemplazamos (sugerencia: cargar desde archivo dict.txt)
d = {
    'director/a':'director',
    'directora':'director',
    'subdirector/a': 'subdirector',
    'subdirectora': 'subdirector',
    'jefa':'jefe',
    'jefe/a':'jefe',
    'jefe(a)':'jefe',
    'jefatura': 'jefe',
    'jefatura,': 'jefe',
    'consultor/a,': 'consultor',
    'consultora': 'consultor',
    'asesora': 'asesor',
    'asesor(a)': 'asesor',
    'asesoria': 'asesor',
    'asesora,':'asesor',
    'enc.': 'encargado',
    'encargada':'encargado',
    'encargada,': 'encargado',
    'encargada(s)':'encargado',
    'encargado/a': 'encargado',
    'encargado(a)': 'encargado',
    'encagado': 'encargado',
    'coordinador(a)': 'coordinador',
    'coordinadora': 'coordinador',
    'coordinador/a': 'coordinador',
    'abogado/a': 'abogado',
    'técnico': 'tecnico',
    'tecnico(a)': 'tecnico',
    'técnico(a)' : 'tecnico',
    'estadístico': 'estadistico',
    'fiscalizadora': 'fiscalizador',
    'ejecutiva':'ejecutivo',
    'operadora': 'operador',
    'abogada': 'abogado',
    'profesionalde': 'profesional',
    'jede': 'jefe',
    'tesorera': 'tesorero',
    'adm.': 'administrativo',
    'administrativo/a': 'administrativo',
    'administrativa': 'administrativo',
    'administrativo(a)': 'administrativo',
    'administrtivo' : 'administrativo',
    'analista,': 'analista',
    'editora': 'editor',
    'guía': 'guia',
    'digitadora': 'digitador',
    'examinadora': 'examinador',
    'secretaria,': 'secretaria',
    'transcriptor,': 'transcriptor',
    'auditora': 'auditor',
    'profesional,' : 'profesional',
    'profsional' : 'profesional',
    'prosefional' : 'profesional',
    'reportera' : 'reportero',
    'nutricionista,' : 'nutricionista',
    'profecional' : 'profesional',
    'restaurador,' : 'restaurador',
    'psicólogo' : 'psicologo',
    'trabajadora': 'trabajador',
    'asistentente': 'asistente',
    'supervisora': 'supervisor',
    'líder' : 'lider',
    'secretario' : 'secretariado',
    'secretaria' : 'secretariado',
    'admninistrativo' : 'administrativo',
    'administración': 'administrativo',
    'experta': 'experto'
}
df_cargos["nivel"].replace(d,inplace=True)

In [158]:
s = 'select nivel, count(*) as nro from df_cargos group by nivel having nro>1 order by 2 desc'
print(sqldf(s)['nivel'].tolist())


['profesional', 'jefe', 'analista', 'encargado', 'abogado', 'administrativo', 'ejecutivo', 'asistente', 'coordinador', 'secretariado', 'tecnico', 'asesor', 'apoyo', 'director', '31/12/2016', 'auditor', 'agregado', 'auxiliar', 'fiscalizador', 'conductor', 'ingeniero', 'periodista', 'economista', 'consultor/a', 'agente', 'prevencionista', 'subdirector', 'chofer', 'estadistico', 'oirs', 'sociologo', 'supervisor', 'actuario', 'examinador', 'intendente', 'editor', 'guia', 'receptor', 'tesorero', 'geografo', 'subjefe', 'consultor', 'operador', 'chef', 'oficial', 'reportero', 'control', 'administrador', 'contador', 'contralor', 'desarrollar', 'digitador', 'experto', 'soporte', 'asist.', 'psicologo', 'revisor', 'seremi', '31/01/2016', 'coordinar', 'daf', 'desarrollador', 'electricista,', 'estafeta', 'estafeta,', 'gasfiter', 'maestro', 'nutricionista', 'programa', 'representante', 'restaurador', 'sectorialista', 'trabajador', 'transcriptor', 'analisis', 'delegado', 'dpto.', 'gabinete', 'gestor', 'relacionador', '02/10/2016', '20/08/2016', '21/06/2016', '30/09/2016', 'egresado', 'fiscal', 'lider', 'mayordomo', 'portero', 'secretaría', 'sub']

Revisaremos además:

  • asist.
  • sub
  • analisis
  • dpto.
  • gabinete
  • desarrollar
  • coordinar
  • programa
  • secretaría
  • oficina

In [159]:
s = '''
select * from df where Cargo like "asist. %" union
select * from df where Cargo like "sub %" union
select * from df where Cargo like "analisis %" union
select * from df where Cargo like "dpto. %" union
select * from df where Cargo like "gabinete %" union
select * from df where Cargo like "desarrollar %" union
select * from df where Cargo like "programa %" union
select * from df where Cargo like "secretaría %" union
select * from df where Cargo like "oficina %"
'''
sqldf(s)


Out[159]:
Estamento Cargo Grado EUS Remuneración Bruta Mensualizada Fecha de inicio Fecha de término servicio
0 ADMINISTRATIVO PROGRAMA MUJER Y TRABAJO 12 1657601.0 01/01/2016 31/12/2016 Servicio Nacional de la Mujer (SERNAM)
1 ADMINISTRATIVO Secretaría Apoyo Asesores 18 807364.0 01/01/2016 31/12/2016 Subsecretaría de Hacienda
2 Auxiliar OFICINA DE PARTES 17 1074499.0 01/03/2016 31/10/2016 Gobierno Regional de Aysén
3 PROFESIONAL ANALISIS DE CUENTA, CONCILIACIONES BANCARIAS Y... 19 842932.0 16/03/2016 31/12/2016 Subsecretaría de Economía
4 PROFESIONAL DESARROLLAR PROYECTO TRIBUNAL SIN PAPEL. ESTUD... 10 1831080.0 02/05/2016 08/08/2016 Subsecretaría de Economía
5 PROFESIONAL DESARROLLAR PROYECTO TRIBUNAL SIN PAPEL. ESTUD... 10 1831080.0 21/03/2016 01/05/2016 Subsecretaría de Economía
6 PROFESIONAL Dpto. Técnico de Sistemas de Combustibles 08º 3356200.0 24/06/2011 31/12/2016 Superintendencia de Electricidad y Combustible...
7 PROFESIONALES Sub Jefe División Abusos Unilaterales 4 5197469.0 01/01/2016 31/12/2016 Fiscalía Nacional Económica (FNE)
8 Profesional Gabinete Subsecretaria 11° EUS 1629768.0 01/01/2016 31/12/2016 Subsecretaría de Energía
9 Técnico Asist. Tec. Servicios Generales 18 602428.0 01/01/2016 31/12/2016 SERVIU IX Región
10 Técnico Asist. Técnico Area Seguimiento de Proyectos 14 1414387.0 01/01/2007 31/12/2016 SERVIU X Región
11 Técnico Asist. Técnico Area Seguimiento de Proyectos 16 1192512.0 01/01/2011 31/12/2016 SERVIU X Región

Hay varias situaciones:

  • Mezclas de cargos con función
  • Se escribe nombre de área de impacto
  • asist. = asistente
  • sub = subjefe

En los primeros dos casos, reemplazaremos el cargo por el nombre del estamento


In [160]:
d = {}
d = {
    'asist.': 'asistente',
    'programa': 'administrativo', 
    'secretaría' : 'administrativo',
    'analisis': 'profesional',
    'dpto.': 'profesional',
    'gabinete': 'profesional',
    'desarrollar': 'profesional',
    'coordinar': 'profesional',
    'programa': 'profesional',
    'sub': 'subjefe',
    'oficina': 'auxiliar'
}
df_cargos["nivel"].replace(d,inplace=True)

In [161]:
# Veamos ahora los cargos de menor frecuencia
s='select nivel,count(*) as nro from df_cargos group by nivel having nro=1 order by 2 desc'
sqldf(s)


Out[161]:
nivel nro
0 &nbs 1
1 administrativo-chofer 1
2 administrativo-estafeta 1
3 administrativo-servicios 1
4 adquisiciones 1
5 apoyotécnico 1
6 comunicaciones 1
7 contabilidad 1
8 contralora 1
9 enc.unidad 1
10 servicios 1

In [162]:
d = {
    'contralora': 'contralor',
    'administrativo-chofer' : 'chofer',
    'administrativo-estafeta' : 'estafeta',
    'administrativo-servicios' : 'admninistrativo',
    'enc.unidad' : 'encargado',
    'apoyotécnico' : 'técnico',
}
df_cargos["nivel"].replace(d,inplace=True)

In [163]:
# Veamos ahora los cargos de menor frecuencia
s='select * from df where Cargo like "&nbs%"'
sqldf(s)


Out[163]:
Estamento Cargo Grado EUS Remuneración Bruta Mensualizada Fecha de inicio Fecha de término servicio
0 Profesional &nbs 5 3216550.0 01/01/2011 31/12/2016 SERVIU Arica y Parinacota

Cambiamos por el estamento


In [164]:
d = {'&nbs': 'profesional'}
df_cargos["nivel"].replace(d,inplace=True)

In [165]:
# Hagamos una revisión
print(df_cargos['nivel'].unique().tolist())


['jefe', 'asesor', 'abogado', 'encargado', 'agente', 'profesional', 'analista', 'director', 'operador', 'asistente', 'consultor', 'psicologo', 'administrador', 'tesorero', 'auditor', 'adquisiciones', 'contabilidad', 'ejecutivo', 'estafeta', 'chofer', 'admninistrativo', 'administrativo', 'secretariado', 'apoyo', 'coordinador', 'fiscal', 'ingeniero', 'lider', 'desarrollador', 'auxiliar', 'tecnico', 'consultor/a', 'subdirector', 'economista', 'subjefe', 'contralor', 'periodista', 'egresado', 'oficial', 'conductor', 'contador', 'técnico', 'servicios', 'mayordomo', 'prevencionista', 'revisor', 'sociologo', 'estadistico', 'geografo', 'examinador', 'soporte', 'digitador', 'reportero', 'representante', 'nutricionista', 'chef', 'transcriptor', 'guia', 'maestro', 'restaurador', 'electricista,', 'estafeta,', 'oirs', 'sectorialista', 'comunicaciones', 'delegado', 'receptor', 'experto', 'portero', 'gestor', 'fiscalizador', 'control', 'agregado', 'seremi', 'editor', 'trabajador', 'gasfiter', 'daf', '31/12/2016', '21/06/2016', '20/08/2016', '02/10/2016', '30/09/2016', '31/01/2016', 'supervisor', 'relacionador', 'intendente', 'actuario']

Pareciera estar bastante mejor. Veamos ahora el ámbito


In [166]:
s = 'select distinct ambito from df_cargos order by 1 asc'
sqldf(s)


Out[166]:
ambito
0 None
1 (a) capacitación- recursos humanos
2 (a) catastro
3 (a) cocina, departamento repostero presidencial
4 (a) departamento estudios economicos coyunturales
5 (a) departamento estudios laborales
6 (a) departamento gestion financiera
7 (a) departamento judicial
8 (a) gabinete ministro (a) justicia
9 (a) gabinete subsecretario (a) justicia
10 (a) gabinete subsecretario justicia
11 (a) garzones repostero, departamento repostero...
12 (a) implementación ley tribunales fa
13 (a) interno (a), auditoria interna
14 (a) jurídico unidad mediación
15 (a) ministro
16 (a) operativa
17 (a) procesos gestión logística, departamento d
18 (a) recursos humanos
19 (a) seccion imagen corporativa
20 (a) sección indultos
21 (a) sección partes, archivo transcripciones
22 (a) servicios generales
23 (a) subdeparamento estad. estruct. industrias
24 (a) subdepartamento bienestar
25 (a) subdepartamento estad. estruct. comercio s...
26 (a) subdepartamento estadisticas laborales
27 (a) subdepartamento presupuesto
28 (a) subdepartamento tecnologia informacion
29 (a) subdepto. atencion usuario
... ...
1723 área administración personal, departamento gesti
1724 área administrativa
1725 área adquisiciones contratos
1726 área alta dirección pública
1727 área auditoria interna
1728 área bienes nacionales
1729 área catastro
1730 área catastro mensura
1731 área compras, departamento abastecimiento
1732 área comunicaciones
1733 área comunicaciones participación ciudadana
1734 área conservación restauración, departamento d
1735 área constitución propiedad raíz
1736 área desarrollo
1737 área desarrollo, departamento gestión person
1738 área difusión estudios
1739 área educación
1740 área finanzas
1741 área gestión
1742 área gestión información
1743 área gestión personas
1744 área gestión territorial coordinación institucion
1745 área informatica
1746 área logística
1747 área planificación presupuesto
1748 área prevención emergencia
1749 área protección inversionista asegurado
1750 área remuneraciones
1751 área tecnologías información
1752 área técnica-económica

1753 rows × 1 columns


In [44]:
rep


Out[44]:
nivel
profesional 33.133845
jefe 17.642292
analista 8.509445
encargado 7.406022
abogado 3.378842
administrativo 2.911290
ejecutivo 2.842716
asistente 2.711801
coordinador 2.462440
secretariado 2.331525

Limpieza de variable Grado


In [48]:
s = 'select distinct `Grado EUS` from df'
print(sqldf(s)['Grado EUS'].tolist())


['4°', '6°', '7°', '8°', '9°', '10°', 'I', 'II', 'III', '7', '14', '16', '6', '8', '9', '10', '11', '4', '5', '12', '13', '2', '5°', '11°', '12°', '13°', '14°', '20°', '22', '3', '15', '1C', '17', '19', '20', '21', '18', '06', '05', '07', '09', '08', '04', '9° EUS', '6° EUS', '4° EUS', '7° EUS', '11° EUS', '8° EUS', '10° EUS', '2° EUS', '5° EUS', '13° EUS', '16° EUS', '12° EUS', 'Región Metropolitana de Santiago', 'Región del Biobío', 'Atacama', 'Región Aisén del Gral. Carlos Ibáñez del Campo', 'Región del Libertador Gral. Bernardo OHiggins', 'Región de Los Lagos', 'Región de la Araucanía', 'Región de Los Ríos', 'Tarapacá', '04º', '05º', '06º', '08º', '09º', '10º', '11º', '12º']

Hay varias correcciones que hacer:

  • Sacar el símbolo de grado (º)
  • Eliminar la palabra EUS
  • Examinar aquellos registros en que aparece una región

In [76]:
# Limpieza de símbolos
grados = df['Grado EUS']
grados = grados.str.replace('°','')
grados = grados.str.replace('º','')
grados = grados.str.replace(' EUS','')
grados = grados.str.replace('1C','1')

In [77]:
print(grados.unique().tolist())


['4', '6', '7', '8', '9', '10', 'I', 'II', 'III', '14', '16', '11', '5', '12', '13', '2', '20', '22', '3', '15', '1', '17', '19', '21', '18', '06', '05', '07', '09', '08', '04', 'Región Metropolitana de Santiago', 'Región del Biobío', 'Atacama', 'Región Aisén del Gral. Carlos Ibáñez del Campo', 'Región del Libertador Gral. Bernardo OHiggins', 'Región de Los Lagos', 'Región de la Araucanía', 'Región de Los Ríos', 'Tarapacá']

Examinemos los casos anómalos


In [74]:
s = 'select servicio,count(*) as nro from df where `Grado EUS` like "Reg%" group by servicio'
sqldf(s)


Out[74]:
servicio nro
0 Subsecretaría del Medio Ambiente 485

Todos los datos pertenecen a esta institución. El error viene de la fuente:

Como tenemos la Remuneración Mensualizada Bruta, podemos imputar el grado con el valor de la mediana de asociada a cada grado, ya que la información de grados de cada página es imprecisa para hacer esta imputación


In [81]:
# Reemplazaremos los datos anómalos por Nulo e imputaremos posteriormente
d = {
    'I' : '0', 
    'II' : '0', 
    'III' : '0',
    'Región Metropolitana de Santiago' : '0', 
    'Región del Biobío' : '0', 
    'Atacama' : '0', 
    'Región Aisén del Gral. Carlos Ibáñez del Campo' : '0', 
    'Región del Libertador Gral. Bernardo OHiggins' : '0', 
    'Región de Los Lagos' : '0', 
    'Región de la Araucanía' : '0', 
    'Región de Los Ríos' : '0', 
    'Tarapacá' : '0'
}
grados.replace(d,inplace=True)
grados = grados.astype('int')
print(grados.unique().tolist())


[4, 6, 7, 8, 9, 10, 0, 14, 16, 11, 5, 12, 13, 2, 20, 22, 3, 15, 1, 17, 19, 21, 18]

Limpieza de variables fecha de inicio y término


In [202]:
s = 'select distinct `Fecha de inicio` from df'
print(sqldf(s)['Fecha de inicio'].tolist())


['01/08/2014', '01/03/2015', '22/12/2011', '26/05/2014', '02/01/1996', '01/11/2004', '20/09/1995', '15/10/1999', '24/05/2010', '01/06/2014', '13/12/2010', '07/11/1994', '28/07/2014', '23/07/2012', '27/01/1995', '01/12/1999', '18/08/2014', '01/03/2011', '01/06/2012', '09/09/2012', '01/01/2009', '01/01/1995', '18/04/2016', '01/06/1991', '01/01/2005', '01/02/2014', '10/01/2000', '01/07/2001', '01/07/1995', '01/02/2000', '01/08/2011', '01/02/2013', '01/01/1988', '01/09/1986', '01/08/2001', '23/12/2013', '01/11/1997', '15/12/2014', '01/01/2003', '01/12/1989', '01/10/2007', '16/01/2012', '01/01/2000', '09/06/2014', '06/04/1998', '04/10/2007', '01/09/2006', '01/06/1998', '02/11/2001', '01/03/1981', '28/05/1996', '08/07/2008', '20/10/1999', '15/11/2004', '01/10/1994', '07/06/1999', '23/10/1995', '13/11/1995', '25/08/1989', '01/07/2006', '01/10/1989', '01/02/1994', '01/01/2016', '15/04/1994', '02/10/1995', '11/07/2012', '01/11/2003', '01/06/1994', '01/10/2006', '01/12/1991', '01/08/2010', '01/12/2014', '01/02/2005', '01/03/1996', '01/05/2007', '01/02/1999', '01/09/2009', '23/06/2015', '01/04/1999', '18/01/1995', '19/01/2015', '01/05/1991', '01/08/2016', '01/07/2016', '15/02/2016', '01/01/2002', '29/10/2014', '21/04/2014', '08/04/2014', '19/05/2014', '16/03/2015', '01/01/2001', '04/03/2015', '01/05/1995', '09/01/2015', '01/04/1995', '30/01/2012', '01/07/2009', '01/04/2016', '11/08/2008', '21/02/2001', '13/06/2014', '14/04/2014', '01/07/2015', '01/10/2005', '15/12/2015', '22/09/2014', '06/05/1998', '01/01/2015', '01/01/1994', '01/05/2011', '01/07/1997', '13/05/2014', '01/02/2015', '06/08/2007', '02/02/2015', '01/02/2004', '25/08/2008', '02/06/2008', '18/07/1994', '01/01/2010', '04/03/2002', '06/03/2013', '25/02/2002', '02/05/1996', '05/02/2015', '01/07/2003', '21/06/2004', '05/08/2014', '14/07/2008', '01/10/2008', '01/01/2011', '01/07/1994', '10/03/2008', '22/09/2009', '01/10/2000', '01/09/2003', '16/05/2016', '03/03/2008', '01/03/2014', '08/06/2009', '01/02/2006', '09/06/2003', '01/07/2014', '15/04/2013', '08/08/2016', '28/06/2016', '06/02/2016', '11/07/2016', '21/03/2016', '22/08/2016', '13/04/2016', '11/04/2016', '01/02/2016', '06/04/2016', '01/03/2016', '20/06/2016', '16/04/2016', '01/06/2016', '01/05/2016', '16/08/2016', '15/04/2016', '19/04/2016', '01/03/2006', '13/08/2008', '11/03/2014', '10/08/2016', '04/08/2014', '13/06/2016', '27/07/2004', '25/07/2016', '17/08/2015', '15/07/2004', '04/01/2016', '02/05/2016', '07/04/2016', '', '01/01/1999', '24/03/1997', '30/07/2007', '17/12/2007', '21/10/2013', '22/05/2007', '03/06/2014', '01/10/2013', '05/05/2008', '01/01/2013', '01/11/2015', '21/09/2015', '05/05/2014', '01/10/2014', '17/08/1998', '01/01/1997', '17/02/2003', '06/06/2014', '01/11/2013', '01/06/2015', '02/06/2014', '06/09/2010', '01/05/2009', '08/01/2015', '01/09/2015', '01/01/1996', '01/08/2015', '05/08/2009', '01/02/1997', '01/05/2014', '01/04/2014', '01/02/2011', '18/06/2012', '27/10/2000', '06/06/2016', '01/11/2012', '02/10/2015', '01/01/2006', '01/04/2015', '17/05/2010', '27/08/2008', '21/08/2013', '22/10/2014', '01/04/2012', '01/08/2005', '01/01/2012', '01/01/2004', '01/04/2004', '01/03/2010', '07/07/2015', '20/07/2015', '03/01/2011', '01/01/2014', '03/06/2013', '15/01/2014', '01/07/2010', '01/11/1995', '30/06/2016', '01/03/2003', '01/07/2004', '16/08/1977', '01/10/2001', '18/06/2007', '13/04/1980', '21/06/1993', '01/04/2003', '23/03/2015', '01/09/2011', '01/06/2007', '30/09/1994', '01/07/2008', '01/03/2008', '21/07/2014', '01/01/1998', '17/07/2012', '01/08/1990', '17/05/1999', '15/02/1978', '19/04/1993', '19/01/2012', '25/06/2012', '15/10/1984', '21/01/1980', '01/03/1991', '25/04/2008', '02/05/2013', '20/04/2015', '07/03/1980', '01/06/2009', '19/10/1981', '08/05/2006', '01/09/1996', '20/01/2015', '07/08/2000', '01/03/2007', '08/04/2015', '04/04/2005', '02/10/2006', '18/06/2014', '01/05/2008', '01/06/1993', '01/04/2006', '10/04/1989', '12/03/2008', '16/07/1990', '20/10/1986', '19/05/2003', '01/04/1991', '03/02/1986', '12/03/1973', '02/01/2015', '01/04/2009', '22/02/1996', '01/04/1977', '11/05/1998', '01/11/2009', '22/06/1992', '04/12/2000', '02/03/2010', '24/01/2012', '03/02/2014', '21/08/2000', '15/03/1993', '19/06/2014', '01/06/2004', '13/05/2013', '01/01/2008', '01/12/2008', '26/04/1982', '11/10/1973', '17/11/2014', '06/05/1985', '15/04/2014', '17/03/2014', '26/03/2014', '07/05/1999', '04/05/2015', '14/07/2014', '01/03/2009', '01/02/2009', '01/09/2005', '25/03/2014', '20/09/2002', '22/08/2011', '05/11/1991', '06/01/2014', '06/08/2012', '19/03/2014', '01/06/2013', '06/05/2014', '24/04/2014', '01/10/2004', '24/11/2014', '23/04/2014', '10/10/2012', '22/04/2014', '01/02/2007', '16/06/2014', '02/05/2014', '03/10/2002', '13/01/1978', '14/03/2016', '20/12/1993', '02/05/2012', '03/11/1992', '12/06/1995', '05/12/1994', '11/05/1977', '01/10/2012', '09/05/2001', '09/12/2013', '31/07/2001', '20/06/2011', '13/09/2012', '09/05/2016', '20/09/1993', '27/10/2014', '01/11/2014', '23/04/1973', '27/01/1981', '09/04/2007', '22/05/1974', '07/07/1977', '18/12/1978', '10/08/1981', '12/01/1993', '20/06/1988', '19/10/1993', '30/10/2015', '03/11/2014', '01/11/1978', '14/09/2009', '13/01/2016', '11/01/2016', '10/02/2016', '11/03/2016', '27/07/2016', '23/07/2016', '01/09/2014', '01/07/1988', '14/10/1976', '23/11/1976', '15/03/1974', '01/05/1985', '11/05/1976', '02/01/1981', '01/04/1972', '13/08/1976', '25/07/1979', '17/01/2011', '01/05/1998', '01/03/1988', '01/01/1991', '10/10/1988', '16/08/2010', '01/01/2007', '04/10/1976', '26/04/2012', '31/05/1979', '13/03/1985', '16/11/1987', '25/05/1976', '17/05/1978', '16/04/1993', '23/07/1976', '23/01/1996', '01/04/1998', '01/03/1999', '01/11/1998', '20/04/1976', '06/03/1995', '01/12/2000', '03/06/1975', '21/04/1977', '01/10/2010', '17/01/2005', '01/08/1991', '01/02/2010', '09/07/2012', '14/08/1981', '01/05/2012', '01/08/1998', '01/05/2005', '17/04/1989', '16/08/1990', '12/04/1999', '01/12/2011', '15/07/2013', '23/05/1988', '01/02/1998', '08/11/1993', '01/04/2011', '03/11/1994', '09/08/1993', '06/02/1989', '12/09/1988', '01/06/1985', '04/01/1971', '17/04/1995', '20/04/1998', '01/08/1995', '01/09/2004', '25/08/1981', '12/03/2007', '01/02/2002', '06/06/1988', '19/07/1993', '23/10/2007', '08/11/2010', '08/09/2015', '04/07/2011', '01/10/2011', '14/03/2011', '01/11/2006', '06/10/2015', '03/10/1994', '24/10/2011', '01/03/2005', '15/02/2011', '01/06/1996', '10/01/2011', '16/10/1994', '09/04/2012', '01/03/2001', '17/06/1994', '27/07/2015', '01/05/2002', '18/04/2011', '06/10/2003', '14/08/2010', '05/05/2016', '01/12/2010', '07/03/2016', '06/02/2012', '11/02/2008', '01/09/2002', '06/06/2015', '29/10/2007', '24/08/2011', '15/04/2011', '11/01/2010', '10/06/2008', '01/08/2000', '16/06/2008', '23/02/2015', '26/11/2007', '03/02/2016', '03/12/2012', '03/03/2014', '01/10/2003', '27/01/2014', '17/10/2011', '02/11/2015', '15/07/2014', '27/01/2016', '25/05/2016', '08/02/2016', '25/04/2016', '18/07/2012', '05/11/2014', '30/05/1994', '13/01/2009', '11/06/2015', '07/11/2011', '23/04/2007', '01/08/2008', '05/01/2015', '02/08/2011', '01/02/2008', '08/01/2009', '16/01/2009', '14/09/2015', '17/05/2011', '02/09/2013', '07/07/2014', '01/09/2012', '15/10/2010', '16/06/2011', '15/01/2003', '02/10/1972', '20/08/2014', '01/03/2012', '01/01/1993', '01/11/2007', '07/09/2009', '29/12/2000', '13/03/2006', '01/03/2013', '01/04/2008', '01/08/2006', '21/11/2011', '13/06/1977', '24/06/1977', '19/05/1971', '01/04/2005', '09/04/2003', '06/02/1992', '01/12/2015', '02/03/2015', '01/06/2000', '10/01/2008', '26/07/1993', '01/05/2004', '13/04/2015', '11/03/2008', '15/01/2009', '01/02/2012', '26/05/2003', '01/11/2011', '01/05/2013', '18/07/2011', '01/07/2012', '01/12/2012', '18/02/2008', '03/08/2015', '22/03/1991', '28/10/1980', '02/11/1998', '09/06/2008', '24/10/2008', '08/05/2008', '07/06/1991', '05/11/2008', '16/03/2016', '04/02/2016', '04/04/2016', '22/02/2016', '24/02/2016', '20/01/2016', '06/01/2016', '15/08/2016', '25/01/2016', '18/01/2016', '10/03/2016', '21/07/2016', '15/01/2016', '15/06/2016', '23/01/2012', '08/04/1996', '14/04/2008', '03/10/2011', '04/11/1996', '18/08/2003', '08/04/2008', '01/10/2002', '28/04/2014', '15/06/2001', '01/05/2006', '14/02/2000', '25/05/2015', '02/01/2008', '01/03/2000', '07/04/2014', '16/05/2011', '28/01/2013', '07/09/2004', '20/08/2007', '01/07/1999', '07/02/2000', '27/04/2015', '01/03/2002', '13/07/2015', '18/04/2012', '01/07/2011', '01/09/1998', '04/04/2011', '15/04/2005', '01/06/2006', '11/11/2009', '12/05/2014', '06/08/2013', '01/04/2001', '10/03/2015', '21/04/2016', '01/08/1999', '09/01/1967', '01/12/1995', '01/08/2004', '28/07/2008', '17/01/2000', '16/11/1992', '01/06/2008', '24/01/2000', '15/03/1997', '19/07/2004', '01/02/1991', '01/04/2002', '09/04/1981', '30/04/1998', '15/11/1999', '01/08/2012', '24/06/2011', '17/01/2013', '31/01/2011', '22/09/1989', '17/04/2006', '01/06/2010', '18/01/2004', '12/10/2010', '09/12/2010', '03/11/1997', '09/08/2010', '11/06/2008', '16/04/1999', '17/06/2013', '22/04/2003', '01/05/1997', '19/10/1992', '01/04/1987', '30/11/1981', '01/05/1996', '01/11/1988', '08/07/2013', '01/04/1990', '01/06/1981', '20/10/2003', '01/09/1990', '28/08/2006', '12/07/1989', '01/08/1993', '01/02/1989', '06/01/2003', '17/06/2002', '08/03/1993', '05/07/2008', '01/06/1982', '07/01/2008', '14/04/2003', '16/10/1991', '13/10/1992', '03/12/2014', '01/06/1990', '08/03/2011', '11/01/1993', '21/06/2010', '01/06/1984', '13/06/2011', '12/11/2012', '20/08/2012', '15/04/1991', '05/02/1998', '02/03/2009', '18/02/2013', '18/05/2015', '10/08/2004', '01/08/1992', '19/03/2007', '01/07/1982', '15/07/1986', '20/02/2012', '01/02/1995', '07/10/2009', '15/06/2015', '20/09/2012', '16/12/2013', '24/08/2015', '10/06/2013', '16/07/2001', '18/11/2013', '05/11/1997', '01/08/1996', '10/10/1990', '01/06/2005', '13/09/2000', '01/04/2000', '01/11/1996', '01/05/2003', '01/10/1992', '15/08/2006', '02/04/2001', '18/04/2005', '01/06/2011', '17/10/2006', '25/03/2013', '15/03/1994', '05/09/2006', '20/04/2005', '20/11/1990', '17/08/2005', '25/09/2002', '14/08/1995', '01/05/2010', '24/02/2014', '19/03/2013', '24/10/2000', '22/10/2006', '11/10/2000', '23/03/2009', '05/01/1998', '04/06/2016', '01/12/2006', '22/03/2001', '13/02/1997', '04/02/2008', '28/06/2005', '24/06/2003', '23/05/2016', '01/04/2013', '14/11/2011', '17/06/2003', '20/09/2006', '14/01/2016', '12/07/2016', '23/02/2016', '10/05/2016']

Un examen preliminar de los datos no evidencia elementos extraños en el campo. Intentaremos convertir a tipo fecha.


In [203]:
fecha_inicio = df['Fecha de inicio']

In [204]:
df.columns


Out[204]:
Index(['Estamento', 'Cargo', 'Grado EUS', 'Remuneración Bruta Mensualizada',
       'Fecha de inicio', 'Fecha de término', 'servicio'],
      dtype='object')

In [205]:
s = 'select distinct `Fecha de término` from df'
print(sqldf(s)['Fecha de término'].tolist())


['31/12/2016', '05/06/2016', '31/05/2016', '18/03/2016', '06/02/2016', '18/10/2016', '31/01/2016', '04/05/2016', '30/06/2016', '17/03/2016', '29/02/2016', '17/07/2016', '05/04/2016', '27/06/2016', '25/02/2016', '31/07/2016', '21/08/2016', '05/02/2016', '11/08/2016', '16/08/2016', '31/03/2016', '18/08/2016', '26/07/2016', '12/10/2016', '20/03/2016', '26/08/2016', '06/03/2016', '30/04/2016', '15/04/2016', '19/06/2016', '15/08/2016', '14/04/2016', '19/07/2016', '08/05/2016', 'Indefinido', '06/07/2016', '30/09/2015', '12/07/2016', '17/04/2016', '19/02/2016', '08/08/2016', '10/03/2016', '22/03/2016', '27/03/2016', '15/03/2016', '17/01/2016', '', '31/10/2016', '30/09/2016', '12/06/2016', '21/07/2016', '13/08/2016', '21/06/2016', '30/08/2016', '05/03/2016', '03/07/2016', '19/05/2016', '01/08/2016', '27/02/2016', '23/05/2016', '18/04/2016', '22/06/2016', '15/05/2016', '03/02/2016', '13/10/2016', '22/07/2016', '01/05/2016', '18/05/2016', '03/10/2016', '28/08/2016', '19/08/2016', '21/05/2016', '08/06/2016', '30/05/2016', '16/06/2016', '11/05/2016', '09/02/2016', '17/08/2016', '10/01/2016', '24/04/2016', '14/06/2016', '04/04/2016', '12/04/2016', '14/02/2016', '24/06/2016', '20/05/2016', '01/09/2016', '10/04/2016', '21/03/2016', '28/02/2016', '06/06/2016', '01/07/2016', '15/09/2016', '31/08/2016', '15/07/2016', '01/03/2016', '01/06/2016', '22/04/2016', '16/05/2016', '05/05/2016', '12/05/2016', '01/02/2016', '22/02/2016', '14/03/2016', '05/07/2016', '30/11/2016', '22/08/2016', '01/01/2006', '01/02/2001', '06/01/2014', '01/01/2005', '01/03/2015', '01/06/2006', '01/01/1998', '01/08/2007', '01/05/2003', '29/08/1994', '05/10/1998', '01/01/2015', '02/08/1993', '26/06/1992', '01/12/2015', '01/12/1979', '06/04/1987', '01/06/1978', '26/02/1985', '01/06/2011', '15/05/1998', '03/10/2011', '15/12/1994', '01/07/1970', '20/09/2004', '01/04/2013', '01/01/2009', '01/03/2005', '20/01/2014', '12/05/2014', '16/11/2009', '12/01/2009', '20/09/1994', '02/05/2014', '22/02/2010', '16/03/2009', '09/03/2010', '01/10/2014', '01/04/2015', '01/07/2006', '01/01/2010', '15/12/2014', '07/11/2014', '15/03/2010', '23/01/2014', '01/04/2005', '01/08/2014', '01/04/2011', '15/11/2004', '01/01/2013', '01/04/2016', '07/07/2009', '01/01/2011', '15/01/2007', '06/01/1997', '01/10/2015', '01/03/2014', '16/06/2014', '06/07/1998', '01/07/2009', '03/11/1987', '01/05/2012', '07/12/1994', '14/02/2011', '01/12/1996', '23/06/2008', '08/09/2006', '01/07/1990', '01/07/2008', '04/03/1996', '23/09/2013', '03/04/1995', '27/01/2014', '09/12/1996', '07/01/2016', '01/11/1995', '14/07/1997', '01/06/2014', '01/03/1995', '19/02/2007', '01/09/2011', '05/01/2005', '26/01/2016', '23/02/2016']

En el caso de la fecha de término, observamos que la fecha de término contiene el string "Indefinido", y en ambos campos no hay valores nulos. Reemplazaremos Indefinido por nulo.


In [207]:
# Reemplazo de indefinido por nulo
fecha_termino = df['Fecha de término'].replace('Indefinido',np.nan)

No hay más correcciones. Ensamblaremos el Data Frame final.


In [259]:
# Data Frame final
datos = {
    'estamento': estamentos,
    'nivel': df_cargos['nivel'].tolist(),
    'ambito': df_cargos['ambito'].tolist(),
    'grado': grados.values,
    'rbm': df['Remuneración Bruta Mensualizada'].tolist(),
    'fecha_inicio': fecha_inicio.values,
    'fecha_termino': fecha_termino.values,
    'servicio': df['servicio'].values
}
df_final = pd.DataFrame(datos)
df_final.head()


Out[259]:
ambito estamento fecha_inicio fecha_termino grado nivel rbm servicio
0 unidad comunicaciones profesional 01/08/2014 31/12/2016 4 jefe 3639594.0 Caja de Previsión de la Defensa Nacional (CAPR...
1 vicepresidencia profesional 01/03/2015 05/06/2016 4 asesor 3900396.0 Caja de Previsión de la Defensa Nacional (CAPR...
2 auditoria interna profesional 22/12/2011 31/12/2016 4 jefe 2911675.0 Caja de Previsión de la Defensa Nacional (CAPR...
3 depto. contabilidad profesional 26/05/2014 31/12/2016 6 jefe 2379684.0 Caja de Previsión de la Defensa Nacional (CAPR...
4 legal cds r profesional 02/01/1996 31/12/2016 7 asesor 2393036.0 Caja de Previsión de la Defensa Nacional (CAPR...

In [260]:
# Cambiamos el order
cols = ['servicio','estamento','grado','nivel','ambito','fecha_inicio','fecha_termino','rbm']
df_final = df_final[cols]
df_final.head()


Out[260]:
servicio estamento grado nivel ambito fecha_inicio fecha_termino rbm
0 Caja de Previsión de la Defensa Nacional (CAPR... profesional 4 jefe unidad comunicaciones 01/08/2014 31/12/2016 3639594.0
1 Caja de Previsión de la Defensa Nacional (CAPR... profesional 4 asesor vicepresidencia 01/03/2015 05/06/2016 3900396.0
2 Caja de Previsión de la Defensa Nacional (CAPR... profesional 4 jefe auditoria interna 22/12/2011 31/12/2016 2911675.0
3 Caja de Previsión de la Defensa Nacional (CAPR... profesional 6 jefe depto. contabilidad 26/05/2014 31/12/2016 2379684.0
4 Caja de Previsión de la Defensa Nacional (CAPR... profesional 7 asesor legal cds r 02/01/1996 31/12/2016 2393036.0

In [261]:
s = 'select * from df_final where nivel not like "%/2016"'
df_final = sqldf(s)

In [262]:
df_final['fecha_inicio'] = pd.to_datetime(df_final['fecha_inicio'])
df_final['fecha_termino'] = pd.to_datetime(df_final['fecha_termino'])

In [263]:
df_final.to_pickle('sueldos_contrata_clean.pkl')