<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Alumnos
Step1:  1.1 Importamos las librerias que vamos a necesitar
Step2:  • Agrupa los países en grupos
Agrupamos las personas por ciudad, Las que son de EEUU en uno y los que no son de EEUU en otro
Step3:  • Mapeamos las razas
Step4:  • Mapea el tipo de trabajo
Step5:  •  Mapea el tipo de familia
Step6:  •  Mapea la ocupacion
Step7:  •  Mapea las ganancias (>50k o <=50k)
Step8:  •  Mapea el sexo
Step9:  •  Mapea el estado civil de cada persona
Step10:  2. Haz visualizaciones de diferentes valores con seaborn.
Describe lo que ves en las visualizaciones
Step11:  En esta grafica podemos ver que hay menos mujeres que ganan mas de 50k.
Step12:  Esta grafica nos muestra que los que mas ganan son los trabajadores con los puestos
Step13:  Aqui podemos ver que las personas de raza blanca son las mas numerosas.
Del mismo modo se ve que los blancos son los que ganan mas de 50k.
Step14:  En cambio al hacer la media de las personas nos da como resultado que que los que mas ganan son los asiaticos.
Step15:  En esta grafica se aprecia que el numero de personas que ganan mas de 50k son los 'maridos'
Step16:  Aqui podemos ver las 'esposas' tienen la mayor media de ganancias (> 50k)
Step17:  Podemos observar que la mayoria de las personas trabajan 40h a la semana
Correlacion
Step18:  4. Utiliza random forest con diferentes parámetros, diferentes features, y cross_validation para conseguir el mejor modelo posible.
<ASSISTANT_TASK:>
Python Code:
import sys #only needed to determine Python version number
# Handle table-like data and matrices
import numpy as np
import pandas as pd
# Visualisation
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import seaborn as sns
# Enable inline plotting
%matplotlib inline
# Modelo
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
print("ok")
Explanation: Alumnos: Cristhian Rodríguez y Jesus Perucha
1. Preparar los datos para aplicar algoritmos de ML
End of explanation
# Realizamos la lectura del fichero y incluimos en el fichero el nombre de las columnas
names_features = [
'age',             # Edad del individuo: [17 - 90] media 38, 
'type_employer',   # Tipo de trabajo : [ State-gov, Self-emp-not-inc, Private, Federal-gov, Local-gov, ?, Self-emp-inc, Without-pay, Never-worked ]
'fnlwgt',          # Numero de personas encuestadas
'education',       # Nivel mas alto de educacion para el individuo
'education-num',   # Nivel mas alto de educacion en forma numerica [1 - 16]
'marital-status',  # Estado civil de la persona: [ Never-married, Married-civ-spouse, Divorced, Married-spouse-absent, Separated, Married-AF-spouse, Widowed ]
'occupation',      # Ocupacion de la persona: [ Adm-clerical, Exec-managerial, Handlers-cleaners, Prof-specialty, Other-service, Sales, Craft-repair, Transport-moving, Farming-fishing, Machine-op-inspct, Tech-support, ?, Protective-serv, Armed-Forces, Priv-house-serv']
'relationship',    # Relacion familiar: [ Not-in-family, Husband, Wife, Own-child, Unmarried, Other-Relative]
'race',            # Raza de un individuo: [ White, Black, Asian-Pac-Islander, Amer-Indian-Eskimo, Other ]
'sex',             # Sexo de un individuo : [ Male, Female]
'capital_gain',    # Ganancias de capital : [ 0 - 99999 ]
'capital_loss',    # Perdidas de caapital : [ 0 - 4356 ]
'hours-per-week',  # Horas trabajadas por semana : [ 1 - 99 ]
'native-country',  # Pais de origen de la persona : [   ]
'income'           # Indica si una persona gana o no mas de 50.000        
]
df = pd.read_csv('adult.txt' , header=None, names=names_features)
df.head(3)
#print('ok')
columna_unica = df['native-country'].unique()
# Obtenemos las edades de las personas
edad = df['age']
# Hacemos una busqueda con las edades que pertenezcan a un rango
edad.where( edad < 30 ).where( edad > 18).count()
print('ok')
#",".join(ocupacion )
Explanation: 1.1 Importamos las librerias que vamos a necesitar
End of explanation
def isEEUU(x):
     
    if x == ' United-States':
        return 1
    else :
        return 0
  
# Aplicamos una funcion a la columna, para convertir los valores en enumerados
enum_isEEUU = df["native-country"].apply(isEEUU)
# Cramos la nueva columna enum_isEEUU con los datos anteriores
df["enum_isEEUU"] = enum_isEEUU    
print('ok')
Explanation: • Agrupa los países en grupos
Agrupamos las personas por ciudad, Las que son de EEUU en uno y los que no son de EEUU en otro
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
# Mapea los valores unicos de type_employer a enumerados
le.fit(df["race"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
# Aplicamos una funcion a la columna, para convertir los valores en enumerados
enum_razas = le.transform( df["race"])
# Cramos la nueva columna enum_razas con los datos anteriores
df["enum_race"] = enum_razas
#muestra la inversa
#list(le.inverse_transform(df["enum_razas"].head()))
print('ok')
Explanation: • Mapeamos las razas
End of explanation
    from sklearn import preprocessing
le = preprocessing.LabelEncoder()
# Mapea los valores unicos de type_employer a enumerados
le.fit(df["type_employer"].unique())
# Transformamos la columna type_employer con 'labelEncoder' en enumerados
enum_type_employer = le.transform( df["type_employer"])
# Cramos la nueva columna enum_type_employer con los datos anteriores
df["enum_type_employer"] = enum_type_employer
print('ok')
Explanation: • Mapea el tipo de trabajo
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["relationship"].unique())
enum_relationship = le.transform( df["relationship"])
df["enum_relationship"] = enum_relationship
#muestra la inversa
#list(le.inverse_transform(df["enum_rel"].head()))
print('ok')
Explanation: •  Mapea el tipo de familia
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["occupation"].unique())
df["enum_occupation"] = le.transform( df["occupation"])
print('ok')
Explanation: •  Mapea la ocupacion
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["income"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_income"] = le.transform( df["income"])
print('ok')
Explanation: •  Mapea las ganancias (>50k o <=50k)
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["sex"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_sex"] = le.transform( df["sex"])
print('ok')
Explanation: •  Mapea el sexo
End of explanation
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(df["marital-status"].unique())
# Muestra como lo ha mapeado
print(list(le.classes_))
df["enum_marital-status"] = le.transform( df["marital-status"])
print('ok')
Explanation: •  Mapea el estado civil de cada persona
End of explanation
plt.title('Personas que ganan mas de 50 o lo contrario', y=1.1, size=15)
sns.countplot('income', data=df)
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por sexos', size=20, y=1.1)
sns.countplot(x = 'income', hue='sex', data=df)
plt.title('media de las que ganan mas o menos de 50k diferenciadas por sexos', size=20, y=1.1)
sns.barplot(x = 'income', y='enum_sex',data=df)
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por el tipo de trabajador', size=20, y=1.1)
sns.countplot(x = 'income', hue='type_employer', data=df)
Explanation: 2. Haz visualizaciones de diferentes valores con seaborn.
Describe lo que ves en las visualizaciones
End of explanation
plt.title('Media de las ganancias diferenciadas por el tipo de trabajador', size=10, y=1.1)
sns.barplot(x = 'enum_type_employer', y='enum_income', data=df, hue="type_employer")
Explanation: En esta grafica podemos ver que hay menos mujeres que ganan mas de 50k.
End of explanation
plt.title('Numero de personas que ganan mas o menos de 50k diferenciadas por la raza', size=20, y=1.1)
sns.countplot(x = 'income', hue='race', data=df)
Explanation: Esta grafica nos muestra que los que mas ganan son los trabajadores con los puestos:
Self-emp-not-inc
Federal-gov
Local-gov
End of explanation
plt.title('Media de las ganancias diferenciadas por la raza', size=20, y=1.1)
sns.barplot(x = 'enum_race', y='enum_income', data=df, hue="race")
Explanation: Aqui podemos ver que las personas de raza blanca son las mas numerosas.
Del mismo modo se ve que los blancos son los que ganan mas de 50k.
End of explanation
plt.title('Numero de personas que ganan mas de 50k diferenciadas por la relacion familiar', size=20, y=1.1)
sns.countplot(x = 'income', hue='relationship', data=df)
Explanation: En cambio al hacer la media de las personas nos da como resultado que que los que mas ganan son los asiaticos.
End of explanation
plt.title('Media de las ganancias diferenciadas por la relacion familiar', size=20, y=1.1)
sns.barplot(x = 'enum_relationship', y='enum_income', data=df, hue="relationship")
Explanation: En esta grafica se aprecia que el numero de personas que ganan mas de 50k son los 'maridos'
End of explanation
plt.title('Numero de personas que ganan mas de 50k diferenciadas por la ocupacion', size=20, y=1.1)
sns.countplot(x = 'income', hue='occupation', data=df)
plt.title('Media de las ganancias diferenciadas por la relacion familiar', size=20, y=1.1)
sns.barplot(x = 'enum_occupation', y='enum_income', data=df, hue="occupation")
plt.title('Distribucion de las horas por semana', size=20, y=1.1)
sns.distplot(df['hours-per-week'])
df['hours-per-week'].describe()
Explanation: Aqui podemos ver las 'esposas' tienen la mayor media de ganancias (> 50k)
End of explanation
colormap = plt.cm.viridis
plt.figure(figsize=(12, 12))
plt.title("Correlacion entre todas las features", y=1.05, size=20)
sns.heatmap(df.corr(), linewidths=0.1, square=True, vmax=1.0, annot=True, cmap=colormap)
features = ["hours-per-week","enum_sex","enum_type_employer","enum_race","enum_income","age","education-num","capital_gain","capital_loss","enum_marital-status","enum_occupation","enum_relationship"]
X = df[features]       # features
var_correlations = {c: np.abs(X['enum_income'].corr(df[c])) for c in X.columns}
corr_dataframe = pd.DataFrame(var_correlations, index=['Correlation']).T.sort_values(by='Correlation')
plt.title('Correlacion entre las features y la ganancia', y=1.1, size=20)
plt.barh(range(corr_dataframe.shape[0]), corr_dataframe['Correlation'].values, tick_label=X.columns.values)
g = sns.FacetGrid(df, col='enum_income')
g.map(plt.hist, 'education-num', bins=20)
Explanation: Podemos observar que la mayoria de las personas trabajan 40h a la semana
Correlacion
End of explanation
from sklearn import svm
from sklearn.model_selection import cross_val_score
import pandas as pd
import numpy as np
# modelo
modelo = RandomForestClassifier(n_estimators=9, min_samples_split=2 ,min_samples_leaf =1, n_jobs = 49)
# Seleccionamos las features con las que vamos a usar el algoritmo
features = ["education-num","capital_gain","capital_loss","enum_marital-status","enum_occupation","enum_relationship"]
X = df[features]       # features
y = df["enum_income"]  # targets
#SCORE
scores = cross_val_score(modelo, X, y, cv = 5 )
print(scores.mean())
from sklearn.grid_search import GridSearchCV
# define the parameter values that should be searched
N_estimators = list(range(1, 20))
Min_samples_split= list(range(2, 10))
Min_samples_leaf = list(range(1, 2))
N_jobs = list(range(1, 20))
print(Min_samples_leaf)
print(Min_samples_split)
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_estimators=N_estimators, min_samples_split=Min_samples_split ,min_samples_leaf =Min_samples_leaf, n_jobs = N_jobs)
# instantiate and fit the grid
grid = GridSearchCV(modelo, param_grid, cv=5, scoring='accuracy')
grid.fit(X, y)
# view the complete results
grid.grid_scores_
Explanation: 4. Utiliza random forest con diferentes parámetros, diferentes features, y cross_validation para conseguir el mejor modelo posible.
End of explanation
<END_TASK>