#!/usr/bin/env python # coding: utf-8 # # Ejercicio Aplicando PCA: Principal Component Analysis # Lee el articulo completo en www.aprendemachinelearning.com # ### Importamos librerias # In[1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') plt.rcParams['figure.figsize'] = (16, 9) plt.style.use('ggplot') from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix from sklearn.naive_bayes import GaussianNB # ### Cargamos datos de entrada # In[2]: dataframe = pd.read_csv(r"comprar_alquilar.csv") dataframe.tail(10) # REFERENCIAS: # ingresos y gastos son mensuales de 1 personas o 2 si están casados. # trabajo: 0-sin trabajo 1-autonomo 2-asalariado 3-empresario 4-Autonomos 5-Asalariados 6-Autonomo y Asalariado 7-Empresario y Autonomo 8 Empresarios o empresario y autónomo # estado_civil: 0-soltero 1-casado 2-divorciado # hijos: Cantidad de hijos menores (no trabajan) # comprar: 0-mejor alquilar 1-Comprar casa # hipoteca fija a 30 años con interes # ### Visualicemos las dimensiones # In[3]: fig,axes =plt.subplots(5,2, figsize=(12, 9)) # 2 columnas cada una con 5 figuras, total 10 features alquilar=dataframe[dataframe['comprar']==0] # conviene alquilar casa comprar=dataframe[dataframe['comprar']==1] # conviene comprar casa ax=axes.ravel() for i in range(len(dataframe.columns)): _,bins=np.histogram(dataframe[dataframe.columns[i]],bins=40) ax[i].hist(alquilar.values[:,i],bins=bins,color='r',alpha=.5)# rojo alquilar ax[i].hist(comprar.values[:,i],bins=bins,color='g',alpha=0.3)# verde para comprar ax[i].set_title(dataframe.columns[i],fontsize=9) ax[i].axes.get_xaxis().set_visible(False) ax[i].set_yticks(()) ax[0].legend(['alquilar','comprar'],loc='best',fontsize=8) plt.tight_layout() plt.show() # ### Ejemplo de como se correlacionan # In[4]: plt.subplot(1,2,1)#fisrt plot plt.scatter(dataframe['ingresos'], dataframe['ahorros'], s=dataframe['vivienda']*0.0005, color='magenta', label='check', alpha=0.3) plt.xlabel('Ingresos',fontsize=12) plt.ylabel('Ahorros',fontsize=12) plt.subplot(1,2,2)# 2nd plot plt.scatter(dataframe['gastos_comunes'], dataframe['gastos_otros'], s=dataframe['vivienda']*0.0005, color='purple', label='check', alpha=0.3) plt.xlabel('Gastos Comunes',fontsize=12) plt.ylabel('Vivienda',fontsize=12) plt.tight_layout() plt.show() # ## Vamos a Normalizar ó Estandalizar los datos # In[5]: scaler=StandardScaler()#instantiate df = dataframe.drop(['comprar'], axis=1) scaler.fit(df) # calcula la media y estandar para cada dimension X_scaled=scaler.transform(df)# transforma los datos a su nueva escala # ## Aplicamos PCA # In[6]: pca=PCA(n_components=9) #pca=PCA(.85) pca.fit(X_scaled) # buscar los componentes principales X_pca=pca.transform(X_scaled) #revisemos la forma del array print("shape of X_pca", X_pca.shape) # ### Veamos cuán buenos predictores son las nuevas dimensiones # In[7]: expl = pca.explained_variance_ratio_ print(expl) print('suma:',sum(expl[0:5])) #con 5 componentes tenemos algo mas del 85% de varianza explicada # ### graficamos la variacion explicada acumulada # In[8]: plt.plot(np.cumsum(pca.explained_variance_ratio_)) plt.xlabel('number of components') plt.ylabel('cumulative explained variance') plt.show() # ## Graficamos los 2 componentes principales # In[9]: Xax=X_pca[:,0] Yax=X_pca[:,1] labels=dataframe['comprar'].values #labels=[0,1] # Malignant, Beningn cdict={0:'red',1:'green'} labl={0:'Alquilar',1:'Comprar'} marker={0:'*',1:'o'} alpha={0:.3, 1:.5} fig,ax=plt.subplots(figsize=(7,5)) fig.patch.set_facecolor('white') for l in np.unique(labels): ix=np.where(labels==l) ax.scatter(Xax[ix],Yax[ix],c=cdict[l],label=labl[l],s=40,marker=marker[l],alpha=alpha[l]) plt.xlabel("First Principal Component",fontsize=14) plt.ylabel("Second Principal Component",fontsize=14) plt.legend() plt.show() # please check the scatter plot of the remaining component and you will see and understand the difference # ### Veamos la correlacion entre las nuevas componentes y las dimensiones originales # In[10]: plt.matshow(pca.components_[0:5],cmap='viridis') plt.yticks([0,1,2,3,4],['1st Comp','2nd Comp','3rd Comp','4th Comp','5th Comp'],fontsize=10) plt.colorbar() plt.xticks(range(len(df.columns)),df.columns,rotation=65,ha='left') plt.tight_layout() plt.show()# # In[11]: components = pd.DataFrame(pca.components_, columns = df.columns) components # ## Preparo nuevas entradas para validar el algoritmo # In[12]: # Split dataset in training and test datasets dfScaledPca = pd.DataFrame(X_pca, columns = df.columns) dfScaledPca["comprar"]=dataframe["comprar"] print (dfScaledPca.head()) print(dfScaledPca.shape) X_train, X_test = train_test_split(dfScaledPca, test_size=0.2, random_state=4) #6 y_train =X_train["comprar"] y_test = X_test["comprar"] X_train = X_train.drop(['comprar'], axis=1) X_test = X_test.drop(['comprar'], axis=1) # ## Prediccion con Gaussian Naive Bayes # ### Con datos de entrada con reducción de dimensiones por PCA # In[13]: # Instantiate the classifier gnb = GaussianNB() # Train classifier gnb.fit( X_train.values, y_train ) y_pred = gnb.predict(X_test) # ## Resultados Obtenidos # In[14]: print('Precisión en el set de Entrenamiento: {:.2f}' .format(gnb.score(X_train, y_train))) #batir 87 print('Precisión en el set de Test: {:.2f}' .format(gnb.score(X_test, y_test))) #batir 90 # In[15]: # Print Test results print("Total de Muestras en Test: {}\nFallos: {}" .format( X_test.shape[0], (y_test != y_pred).sum() )) # In[16]: print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) # ### Comprobamos con predicciones individuales # In[19]: X_scaledTest=scaler.transform([[6830,1298,345,309,46761,429812,1,1,5], # 1 [4054,1095,371,440,22183,223971,1,0,3], # 0 [6455,1033,98,795,57463,321779,2,1,8], # 1 [6470,1035,39,782,57439,606291,0,0,1] #0 ]) X_pcaTest=pca.transform(X_scaledTest) #print(X_pcaTest) print(gnb.predict(X_pcaTest)) # In[ ]: