PORTFOLIO OSWALDO L. ZÁRATE


logo

Prediccion de Salarios para Desarrolladores de Software


Comenzamos importando las librerias necesarias para el proyecto.

Lectura del dataset

- Country: Que es el País 
- EdLevel: Es el Nivel de Educación
- YearsCodePro: Años de experiencia profesional
- Employment: Si el desarrollador se mantiene   traba jando a tiempo completo
- ConvertedComp: Compensacion convertida, que es el salario convertido a dolares estadounidenses, y este es un salario anual


Limpieza del Dataset

Ahora podemos ver que solo tenemos las columnas que seleccionamos y tambien el cambio de nombre de la columna "ConvertedComp" a "Salary". Entonces las columnas con las columnas y puntos de datos elegidos podremos hacer predicciones de la caracteristica objetivo "Salary".

A su vez tambien podemos ver que la columna objetivo Salary tiene mucha informacion faltante donde el encuestado no ingreso el salario, asi que para el entrenamiento de los datos solo tomaremos en cuenta los datos donde el salario este disponible. Por lo que tendremos que eliminar todas las filas donde exista informacion faltante o NaN, esto lo haremos con la instruccion notnull

Como se puede observar las filas que contenian informacion faltante fueron eliminadas, ahora podemos trabajar con un conjunto de datos con toda la informacion disponible de los salarios de los puntos de datos.

la siguiente instruccion nos dará un vistazo a la información del dataframe

Arriba, podemos observar que tenemos 34756 entradas de datos, tambien podemos ver las columnas el tipo de dato que existe en la columna, correspondiendo el tipo object a una cadena y entero.

Ahora lo siguiente es eliminar todas las filas de una de estas columnas que no es un numero, asi que podemos hacer esto con el siguiente codigo:

Entonces deberiamos obtener un cero para cada columna como el resultado de arriba, por lo que ahora solo usamos puntos de datos que tienen datos. Sin embargo deshacerse de todos estos datos es un enfoque muy radical de limpieza de datos, ya que existen otros enfoques que se podrían utilizar, como por ejemplo se puede completar los datos faltantes con la media de la columna, pero en este caso todavia tenemos suficientes puntos de datos disponibles , por lo que deberia estar bien simplemente eliminarlos.

Lo siguiente que queremos hacer es limpiar los datos relacionados a "Country" esto lo hacemos con un recuento de puntos:

El resultado de encima nos muestra cuantos puntos de datos tenemos por cada país, por lo que tenemos la mayor cantidad de los Estados Unidos y tambien vemos mucha informacion para muchos paises que solo tienen un punto de datos, por lo que no necesitaremos datos tan pequeños, asi que nos vamos a deshacer de todos los paises con puntos de datos mas pequeños, esto es debido a que tener datos muy pequeños podrian confundir al modelo, porque realmente no podria aprender de un único punto de datos.

Ahora llamaremos a la funcion creada:

Luego lo siguiente que haremos es inspeccionar el rango de salario, para esto graficaremos "Salary" contra "Country" en un trazo.

Este tipo de gráficos nos permite identificar valores atípicos y comparar distribuciones. Además de conocer de una forma cómoda y rápida como el 50% de los valores centrales se distribuyen. No es de extrañar que en un conjunto de datos se muestren máximos muy altos o mínimos muy bajos por lo que se considera que existen los valores raros.

En nuestro caso la interpretacion que nos daría el grafico de caja para nuestro conjunto de datos, son las cajas o areas pequeñas correponderian al valor medio y todos los puntos son en realidad valores atípicos, por lo que hay muchos valores atípicos en este dataframe, asi que la mayoria de los puntos de datos están en el área mediana, por lo que nos tocaría mantener solo los puntos de datos donde tenemos la mayor cantidad de información, lo haremos con el siguiente comando:

Vemos que tenemos valores de cadena, asi que lo siguiente a realizar es convertir estos valores de cadena a float, convirtiendo las cadenas "Less than 1 year" a 0.5 y "More than 50 years" a 50.

Para hacer esto creamos una función clean_experience que obtiene x, y usamos una estructura condicional para el proposito describe lineas mas arriba.

Si echamos un vistazo a todos estos valores unicos de la columna "EdLevel" vemos que tenemos muchas respuestas diferentes, por lo que aquí tambien queremos combinar algunas categorias, mantenemos la categoria "Bachelor's degree", "Master's degree", "Professional degree" o "Other Doctoral degree" y para todas las demás categorias decimos que es menor que Bachelor's.

Para hacer esto nuevamente creamos una función que nos ayude a combinar categorias y seleccionar lo que queramos la funcion se denominará clean_education

Por ejemplo para la salida de la funcion clean_Education en lugar de las cadenas 'Bachelo's degree', 'Master’s degree', 'Less than a Bachelors', 'Post grad', podriamos usar el numero 0,1,2,3 .

Entonces podemos observar en el resultado de encima que ya no se tienen valores de cadena, en su lugar tenemos datos de valores numericos como 0,2,1,3, porlo que el orden no es realmente importante aqui , lo importante es que el codificador de etiquetas le_education sabe exactamente que numero pertenece a que cadena, pudiendo asi poder convertir esto denuevo.

Ahora ya que hicimos esto para la columna "EdLevel", entonces ahora hacemos lo mismo para la columna "Country" por lo que asignamos cada pais a un numero unico

Nuevamente el resultado nos muestra numeros en lugar de cadenas.


  • ## Modeling data

Para predecir nuevos valores usamos la duncion predict

El resultado del error nos muestra un error de 39274 dolares, lo que significa que nuestro modelo en promedio esta desfasado en este numero y esto sigue siendo bastante alto si pensamos que los numeros oscilan entre 10000 a 25000 y cada vez que predecimos el salario en promedio estamos fuera de este valor. Asi que probamos un diferente modelo, el siguiente modelo a probar será un Regresor Arbol de Decisiones

Verificando el resultado, esta vez la rai cuadrada del error cuadratico medio es solo 29000, porlo que esto esta mucho mejor.

Echamos un vistazo al resultado y esta vez y el error sigue siendo 29000, porlo que no es realmente mejor que el Arbol de Decisiones.

Al ejecutar el comando de arriba lo que sucede es basicamente recorrer todos los diferentes parametros que se colocaron en max_depth y probará todos los diferentes parametros y cada vez evalua el error y luego elije el mejor modelo para los datos.

Asi que este es el error final que obtenemos para nuestro regresor final, y ahora aplicamos modelo a los nuevos datos, pero antes echemos un vistazo de nuevo al dataframe

Lo que queremos hacer con esta prueba es aplicar el codificador de etiquetas para "Country" porlo que seria la columna cero, luego queremos aplicar el codificador de etiquetas para "EdLEvel"

Por lo que con esa informacion ya podemos ver el salario que predijo el modelo, y ahora es lo que tenemos que hacer en nuestra App.



!!!A PARTIR DE ESTE PUNTO SI EL CODIGO ES CORRECTO NO VOLVER A GUARDAR CON PICKLE PORQUE CUALQUIER CAMBIO EN saved_steps.pkl AFECTARIA A LA APP WEB QUE ESTA COMPILADA EN VISUAL CODE !!!



  • ## Guardando el Modelo