# Librerias
import pandas as pd # Manejo de DataFrame
import matplotlib.pyplot as plt # Libreria gráfica
import seaborn as sns # Libreria gráfica
import numpy as np # Libreria de algebra lineal
import pylab as pl # Módulo que proporciona un espacio de nombres similar a Matlab
from sklearn import metrics # Validar nuestro metodo
from sklearn.model_selection import train_test_split # Entrenar y divir la información
from sklearn.tree import DecisionTreeClassifier # Arboles de decisión
from sklearn.ensemble import RandomForestClassifier # Bosques aleatorios
from sklearn.linear_model import LogisticRegression # Regresión logistica
from sklearn.svm import SVC # Máquinas de vectores de soporte
# Lectura el dataset
credit_risk = pd.read_csv("/work/credit_data.csv")
# Primeras 5 filas del dataset
credit_risk.head()
# ¿Que columnas tienen los datos?
credit_risk.columns
# ¿Que tamaño tiene el dataset?
credit_risk.shape
# ¿Hay datos nulos?
credit_risk.info()
# ¿Como se distribuyen las variables númericas?
credit_risk.describe()
# ¿Como se comportan las variables categoricas?
credit_risk.describe(include="O")
credit_risk.info()
# Renombramos las columnas
credit_risk = credit_risk.rename(columns={"Age":"Edad",
"Sex":"Género",
"Job":"Trabajo",
"Housing":"Alojamiento",
"Saving accounts":"Cuentas de ahorro",
"Checking account":"Cuenta de cheques",
"Credit amount":"Monto de crédito",
"Duration":"Duración",
"Purpose":"Propósito",
"Risk":"Riesgo"})
# Observamos el cambio de nombres de las columnas
credit_risk.columns
# Procedemos a eliminar una columna
credit_risk = credit_risk.drop(["Unnamed: 0"], axis=1)
credit_risk.drop(['Género', 'Alojamiento', 'Cuentas de ahorro', 'Cuenta de cheques', 'Propósito', 'Riesgo'],axis=1).hist(bins=30, figsize=(15,15))
pl.suptitle("Histogramas para las variables númericas")
plt.show()
# Gráfica de riesgo crediticio
plt.figure(figsize=(8,5))
sns.countplot(credit_risk['Riesgo'])
plt.title("Personas con o sin riesgo crediticio")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función del género
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Género", palette = "rocket", multiple = "dodge")
plt.title("Riesgo en función del género")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función de la cantidad de trabajos
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Trabajo", palette = "Set2", multiple = "dodge")
plt.title("Riesgo en función de la cantidad de trabajos")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función del tipo de alojamiento
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Alojamiento", palette = "viridis", multiple = "dodge")
plt.title("Riesgo en función del tipo de alojamiento")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función de cuentas de ahorro
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Cuentas de ahorro", palette = "cubehelix", multiple = "dodge")
plt.title("Riesgo en función de cuentas de ahorro")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función de cuenta de cheques
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Cuenta de cheques", palette = "dark:salmon_r", multiple = "dodge")
plt.title("Riesgo en función de cuenta de cheques")
plt.xlabel("Riesgo crediticio")
plt.show()
# Riesgo en función del proposito del credito
plt.figure(figsize=(8,5))
sns.histplot(data = credit_risk, x = "Riesgo",
hue = "Propósito", palette = "icefire", multiple = "dodge")
plt.title("Riesgo en función del proposito del credito")
plt.xlabel("Riesgo crediticio")
plt.show()
credit_risk.info()
# Observamos los valores unicos de las variables
print("Edad: ", credit_risk['Edad'].unique())
print("Género: ", credit_risk["Género"].unique())
print("Trabajo: ",credit_risk["Trabajo"].unique())
print("Alojamiento: ",credit_risk["Alojamiento"].unique())
print("Cuentas de ahorro: ",credit_risk["Cuentas de ahorro"].unique())
print("Cuenta de cheques: ",credit_risk["Cuenta de cheques"].unique())
print("Duración: ",credit_risk["Duración"].unique())
print("Propósito: ",credit_risk["Propósito"].unique())
print("Riesgo: ",credit_risk["Riesgo"].unique())
# Convertimos riesgo a dummy
credit_risk["Riesgo"] = credit_risk.Riesgo.map({"bad":0,
"good":1})
# Terminamos de convertir el resto de variables categoricas a dummy
credit_risk = credit_risk.merge(pd.get_dummies(credit_risk["Género"], drop_first=True, prefix="Género"), left_index=True, right_index=True)
credit_risk = credit_risk.merge(pd.get_dummies(credit_risk["Alojamiento"], drop_first=True, prefix="Alojamiento"), left_index=True, right_index=True)
credit_risk = credit_risk.merge(pd.get_dummies(credit_risk["Cuentas de ahorro"], drop_first=True, prefix="Cuentas de ahorro"), left_index=True, right_index=True)
credit_risk = credit_risk.merge(pd.get_dummies(credit_risk["Cuenta de cheques"], drop_first=True, prefix="Cuenta de cheques"), left_index=True, right_index=True)
credit_risk = credit_risk.merge(pd.get_dummies(credit_risk["Propósito"], drop_first=True, prefix = "Propósito"),left_index=True, right_index=True)
# Observamos las variables
credit_risk.head()
# Eliminamos las variables categoricas
credit_risk = credit_risk.drop(["Género",
"Alojamiento",
"Cuentas de ahorro",
"Cuenta de cheques",
"Propósito"], axis = 1)
# Obtenemos la información nuevamente de nuestras variables
credit_risk.info()
# Matriz de correlación
credit_risk.corr()
# Gráfica de matriz de correlación
plt.figure(figsize=(10,6))
sns.heatmap(credit_risk.corr(), vmax = 0.9, square= True)
plt.title("Matriz de correlación de Pearson")
plt.show()
# Creamos nuestra varible dependiente y independientes
X = credit_risk.drop(["Riesgo"],axis=1) # Varibles independientes o explicativas
Y = credit_risk["Riesgo"] # Variable dependiente riesgo crediticio
# Dividimos nuestros datos
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size= 0.2, random_state= 0)
# Procedemos a aplicar nuestro algoritmo
arbol_decisión = DecisionTreeClassifier(criterion= "entropy")
arbol_decisión.fit(X_train, Y_train) # Ejecución del modelo
Y_pred_arbol = arbol_decisión.predict(X_test)
# Creamos la matriz de confusión
matriz_arbol = metrics.confusion_matrix(Y_test, Y_pred_arbol)
matriz_arbol
# Gráficamos la matriz de confusión
class_names = [0, 1]
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(matriz_arbol), annot = True, cmap = "rocket", fmt = "g")
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title("Matriz de confusión", y = 1.1)
plt.ylabel("Etiqueta actual")
plt.xlabel("Etiqueta de predicción")
# Exactitud del modelo
print("Exactitud", metrics.accuracy_score(Y_test, Y_pred_arbol))
# Procedemos a aplicar nuestro algoritmo
bosques_aleatorios = RandomForestClassifier(n_estimators=10, criterion="entropy")
bosques_aleatorios.fit(X_train, Y_train) # Ejecución del modelo
Y_pred_bosques = bosques_aleatorios.predict(X_test)
# Creamos la matriz de confusión
matriz_bosques = metrics.confusion_matrix(Y_test, Y_pred_bosques)
matriz_bosques
# Gráficamos la matriz de confusión
class_names = [0, 1]
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(matriz_bosques), annot = True, cmap = "viridis", fmt = "g")
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title("Matriz de confusión", y = 1.1)
plt.ylabel("Etiqueta actual")
plt.xlabel("Etiqueta de predicción")
# Exactitud del modelo
print("Exactitud", metrics.accuracy_score(Y_test, Y_pred_bosques))
# Procedemos aplicar nuestro algoritmo
logreg = LogisticRegression()
logreg.fit(X_train, Y_train) # Ejecución del modelo
Y_pred_log = logreg.predict(X_test)
# Creamos una matriz de confusión
matriz_log = metrics.confusion_matrix(Y_test, Y_pred_log)
matriz_log
# Gráficamos la matriz de confusión
class_names = [0, 1]
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(matriz_log), annot = True, cmap = "Blues_r", fmt = "g")
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title("Matriz de confusión", y = 1.1)
plt.ylabel("Etiqueta actual")
plt.xlabel("Etiqueta de predicción")
# Exactitud del modelo
print("Exactitud", metrics.accuracy_score(Y_test, Y_pred_log))
# Procedemos aplicar nuestro algoritmo
vcs = SVC(kernel="linear")
vcs.fit(X_train, Y_train) # Ejecución del modelo
Y_pred_vcs = vcs.predict(X_test)
# Creamos una matriz de confusión
matriz_vcs = metrics.confusion_matrix(Y_test, Y_pred_vcs)
matriz_vcs
# Gráficamos la matriz de confusión
class_names = [0, 1]
fig, ax = plt.subplots()
tick_marks = np.arange(len(class_names))
plt.xticks(tick_marks, class_names)
plt.yticks(tick_marks, class_names)
sns.heatmap(pd.DataFrame(matriz_vcs), annot = True, cmap = "Spectral", fmt = "g")
ax.xaxis.set_label_position("top")
plt.tight_layout()
plt.title("Matriz de confusión", y = 1.1)
plt.ylabel("Etiqueta actual")
plt.xlabel("Etiqueta de predicción")
# Exactitud del modelo
print("Exactitud", metrics.accuracy_score(Y_test, Y_pred_vcs))