Árboles de Decisión para Marketing Bancario#
En este capítulo, exploraremos el uso de árboles de decisión en el contexto del marketing bancario, utilizando el dataset disponible en el repositorio de UCI. Los árboles de decisión son herramientas poderosas para la clasificación y regresión, y son especialmente útiles por su facilidad de interpretación.
Obtención de los Datos#
Primero, cargaremos el dataset de marketing bancario, como se mostró previamente:
import pandas as pd
df_bank=pd.read_csv('bank_marketing.csv')
df_bank.head()
age | job | marital | education | default | balance | housing | loan | contact | day_of_week | month | duration | campaign | pdays | previous | poutcome | HasTermDeposit | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 58 | management | married | tertiary | no | 2143 | yes | no | NaN | 5 | may | 261 | 1 | -1 | 0 | NaN | no |
1 | 44 | technician | single | secondary | no | 29 | yes | no | NaN | 5 | may | 151 | 1 | -1 | 0 | NaN | no |
2 | 33 | entrepreneur | married | secondary | no | 2 | yes | yes | NaN | 5 | may | 76 | 1 | -1 | 0 | NaN | no |
3 | 47 | blue-collar | married | NaN | no | 1506 | yes | no | NaN | 5 | may | 92 | 1 | -1 | 0 | NaN | no |
4 | 33 | NaN | single | NaN | no | 1 | no | no | NaN | 5 | may | 198 | 1 | -1 | 0 | NaN | no |
Análisis Exploratorio de Datos (EDA)#
Antes de proceder con la construcción de modelos, realizaremos un análisis exploratorio de los datos para comprender mejor las características y la distribución de los mismos.
El EDA nos ayudará a identificar las variables más significativas y a entender la relación entre ellas y la variable objetivo. Esto es crucial para determinar cómo preprocesar los datos y qué variables incluir en el modelo de árbol de decisión.
Preprocesamiento de Datos#
El preprocesamiento incluirá la limpieza de datos, el manejo de valores faltantes, la codificación de variables categóricas y la normalización de variables numéricas, si es necesario.
Es importante preprocesar adecuadamente los datos para maximizar la efectividad del modelo de árbol de decisión. Esto incluye convertir variables categóricas a un formato que el modelo pueda interpretar y asegurar que todas las variables estén en una escala comparable.
Iniciamos con la descripción de las variables del dataset:
## Descripción de las variables
df_bank.describe(include='object')
job | marital | education | default | housing | loan | contact | month | poutcome | HasTermDeposit | |
---|---|---|---|---|---|---|---|---|---|---|
count | 44923 | 45211 | 43354 | 45211 | 45211 | 45211 | 32191 | 45211 | 8252 | 45211 |
unique | 11 | 3 | 3 | 2 | 2 | 2 | 2 | 12 | 3 | 2 |
top | blue-collar | married | secondary | no | yes | no | cellular | may | failure | no |
freq | 9732 | 27214 | 23202 | 44396 | 25130 | 37967 | 29285 | 13766 | 4901 | 39922 |
df_bank.describe(include='number')
age | balance | day_of_week | duration | campaign | pdays | previous | |
---|---|---|---|---|---|---|---|
count | 45211.000000 | 45211.000000 | 45211.000000 | 45211.000000 | 45211.000000 | 45211.000000 | 45211.000000 |
mean | 40.936210 | 1362.272058 | 15.806419 | 258.163080 | 2.763841 | 40.197828 | 0.580323 |
std | 10.618762 | 3044.765829 | 8.322476 | 257.527812 | 3.098021 | 100.128746 | 2.303441 |
min | 18.000000 | -8019.000000 | 1.000000 | 0.000000 | 1.000000 | -1.000000 | 0.000000 |
25% | 33.000000 | 72.000000 | 8.000000 | 103.000000 | 1.000000 | -1.000000 | 0.000000 |
50% | 39.000000 | 448.000000 | 16.000000 | 180.000000 | 2.000000 | -1.000000 | 0.000000 |
75% | 48.000000 | 1428.000000 | 21.000000 | 319.000000 | 3.000000 | -1.000000 | 0.000000 |
max | 95.000000 | 102127.000000 | 31.000000 | 4918.000000 | 63.000000 | 871.000000 | 275.000000 |
Exploremos las variables con problemas, miremos las que tienen valores faltantes:
## Nulos
df_bank.isnull().sum()
age 0
job 288
marital 0
education 1857
default 0
balance 0
housing 0
loan 0
contact 13020
day_of_week 0
month 0
duration 0
campaign 0
pdays 0
previous 0
poutcome 36959
HasTermDeposit 0
dtype: int64
la variable poutcome
tiene bastantes valores faltantes, por lo que la eliminaremos del dataset. Además, convertiremos las variables categóricas en variables dummy para que el modelo de árbol de decisión pueda interpretarlas.
Note
La eliminación de la variable poutcome
se realiza para simplificar el análisis. En un escenario real, se podrían explorar otras opciones para manejar los valores faltantes, como la imputación de valores o el uso de modelos más avanzados.
Ahora revisemos información sobre las variables, hagamos un análisi profundo para determinar cuales son realmente explicativas para la variable objetivo.
df_bank.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 45211 entries, 0 to 45210
Data columns (total 17 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 age 45211 non-null int64
1 job 44923 non-null object
2 marital 45211 non-null object
3 education 43354 non-null object
4 default 45211 non-null object
5 balance 45211 non-null int64
6 housing 45211 non-null object
7 loan 45211 non-null object
8 contact 32191 non-null object
9 day_of_week 45211 non-null int64
10 month 45211 non-null object
11 duration 45211 non-null int64
12 campaign 45211 non-null int64
13 pdays 45211 non-null int64
14 previous 45211 non-null int64
15 poutcome 8252 non-null object
16 HasTermDeposit 45211 non-null object
dtypes: int64(7), object(10)
memory usage: 5.9+ MB
Variables utiles para la entrada#
Cuando trabajamos con modelos de aprendizaje automático, especialmente árboles de decisión, es crucial elegir cuidadosamente las variables (características) que incluiremos en nuestro modelo. Esta elección se basa en la relevancia de las variables para la predicción, así como en consideraciones prácticas como la cantidad de valores faltantes y la naturaleza de los datos. Vamos a analizar las variables del dataset de marketing bancario y discutir cuáles podrían ser interesantes para el modelo y cuáles podríamos considerar quitar.
Variables Interesantes para el Modelo#
age: La edad del cliente puede influir en su decisión de suscribirse a un depósito a plazo.
job: La profesión podría tener una correlación con la propensión a suscribirse a un depósito a plazo.
marital: El estado civil podría influir en las decisiones financieras.
education: El nivel de educación podría correlacionarse con la decisión de suscribirse a un depósito a plazo.
default: Saber si el cliente tiene créditos en mora podría ser relevante para la decisión de marketing.
balance: El saldo de la cuenta podría indicar la solvencia económica del cliente y su propensión a invertir.
housing: Tener una hipoteca podría influir en la disponibilidad de fondos para invertir en un depósito a plazo.
loan: Similar a “housing”, tener préstamos personales podría afectar la capacidad de suscribirse a un depósito a plazo.
contact: El método de contacto podría influir en la efectividad de la campaña.
day_of_month, month: La fecha de último contacto puede tener efectos estacionales en la decisión del cliente.
duration: La duración de la última llamada puede ser un indicador del interés del cliente.
campaign: La cantidad de contactos durante la campaña puede afectar la decisión del cliente.
pdays, previous, poutcome: Estas relacionadas con campañas anteriores pueden ofrecer insights sobre la receptividad del cliente.
Variables a Considerar Quitar#
poutcome: Aunque es interesante, tiene una gran cantidad de valores faltantes (solo 8252 no nulos de 45211), lo que podría dificultar su uso directo sin un manejo adecuado de los valores faltantes.
contact: Si bien el método de contacto podría ser relevante, la gran cantidad de valores faltantes (32191 no nulos de 45211) también puede limitar su utilidad a menos que se apliquen técnicas de imputación.
Consideraciones Adicionales#
Tratamiento de valores faltantes: Es importante decidir cómo manejar las variables con valores faltantes. En algunos casos, como
poutcome
ycontact
, podríamos optar por excluir la variable, imputar los valores faltantes, o incluso transformarla en una variable binaria que indique la presencia o ausencia de información.Codificación de variables categóricas: Variables como
job
,marital
,education
,default
,housing
,loan
, ymonth
son categóricas y necesitarán ser transformadas a un formato numérico a través de técnicas como la codificación One-Hot antes de ser utilizadas en el modelo.
La selección final de variables debería basarse en un análisis más detallado, incluyendo la importancia de las características y cómo afectan al rendimiento del modelo. Una técnica útil para esto podría ser el análisis de importancia de variables que ofrecen muchos modelos de árboles de decisión, lo que nos permite evaluar qué tan importantes son las distintas características para las predicciones del modelo.
Variable objetivo#
La variable objetivo ‘HasTermDeposit’ indica si un cliente se suscribió a un depósito a plazo o no. Esta es la variable que queremos predecir con nuestro modelo de árbol de decisión. Esta con yes o no, por lo que la convertiremos a 1 o 0 para que el modelo pueda interpretarla.
Note
La conversión de la variable objetivo a 1 y 0 es necesaria para que el modelo de árbol de decisión pueda interpretarla. En general, es importante asegurarse de que la variable objetivo esté en un formato que el modelo pueda entender.
df_bank['HasTermDeposit'] .value_counts()
HasTermDeposit
no 39922
yes 5289
Name: count, dtype: int64
import pandas as pd
import numpy as np
# Para 'poutcome' y 'contact', consideraremos eliminar estas columnas debido a la alta cantidad de valores faltantes
df_bank.drop(columns=['poutcome', 'contact'], inplace=True)
# Si la variable objetivo 'HasTermDeposit' es categórica ('yes', 'no'), la convertimos a numérica
df_bank['HasTermDeposit'] = df_bank['HasTermDeposit'].map({'yes': 1, 'no': 0})
df_bank.head()
age | job | marital | education | default | balance | housing | loan | day_of_week | month | duration | campaign | pdays | previous | HasTermDeposit | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 58 | management | married | tertiary | no | 2143 | yes | no | 5 | may | 261 | 1 | -1 | 0 | 0 |
1 | 44 | technician | single | secondary | no | 29 | yes | no | 5 | may | 151 | 1 | -1 | 0 | 0 |
2 | 33 | entrepreneur | married | secondary | no | 2 | yes | yes | 5 | may | 76 | 1 | -1 | 0 | 0 |
3 | 47 | blue-collar | married | NaN | no | 1506 | yes | no | 5 | may | 92 | 1 | -1 | 0 | 0 |
4 | 33 | NaN | single | NaN | no | 1 | no | no | 5 | may | 198 | 1 | -1 | 0 | 0 |
Cómo Funcionan los Árboles de Decisión#
Los árboles de decisión son una metodología de aprendizaje automático supervisado utilizada tanto para clasificación como para regresión, valorada por su claridad y facilidad de interpretación. A continuación, exploraremos los principios fundamentales detrás de los árboles de decisión y cómo pueden aplicarse en análisis predictivos.
Conceptos Básicos#
Note
Un árbol de decisión representa un modelo de predicciones en forma de estructura de árbol, donde cada nodo interno simboliza una “pregunta” sobre una característica, cada rama la decisión tomada y cada hoja el resultado o predicción final.
División de los Datos#
La construcción de un árbol inicia en la raíz y se divide basándose en la selección de características que resulten en los subconjuntos más puros posibles.
Tip
La “pureza” de un nodo se refiere a qué tan homogéneas son las muestras dentro de ese nodo respecto a la variable objetivo. Un nodo es completamente puro cuando todas sus muestras pertenecen a la misma categoría.
Criterios de División#
Dos criterios predominantes para la división son la Ganancia de Información y el Índice Gini.
Poda del Árbol#
Limitar la complejidad del árbol es crucial para prevenir el sobreajuste, manteniendo el modelo generalizable a nuevos datos.
Warning
El sobreajuste ocurre cuando un modelo aprende patrones del ruido en los datos de entrenamiento, afectando negativamente su rendimiento en datos no vistos.
Ventajas y Desventajas#
Note
Los árboles de decisión son intuitivos y pueden manejar datos categóricos y numéricos. Sin embargo, son propensos al sobreajuste y pueden ser sensibles a pequeñas variaciones en los datos de entrenamiento.
Aplicaciones Prácticas#
En el marketing bancario, los árboles de decisión pueden ayudar a identificar perfiles de clientes propensos a adquirir un producto o a abandonar un servicio.
Ejemplo de Implementación en Python#
A continuación, un breve ejemplo de cómo implementar un árbol de decisión utilizando scikit-learn en Python.
# Importando las bibliotecas necesarias
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# Dividir el conjunto de datos y entrenar el modelo
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
modelo = DecisionTreeClassifier(max_depth=5, random_state=42)
modelo.fit(X_train, y_train)
# Evaluar el modelo
y_pred = modelo.predict(X_test)
print(f"Exactitud del modelo: {accuracy_score(y_test, y_pred):.2f}")
Visualización del Árbol#
Visualizar el árbol de decisión nos permite interpretar cómo el modelo toma sus decisiones.
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(20,10))
plot_tree(modelo, filled=True, feature_names=X.columns, class_names=['No', 'Yes'], rounded=True, proportion=True)
plt.show()
Tip
La visualización de un árbol de decisión facilita la comprensión de las decisiones del modelo y es una herramienta poderosa para explicar los resultados a partes interesadas no técnicas.
Con estos elementos, los árboles de decisión se presentan como una herramienta versátil y comprensible para el análisis predictivo en diversas aplicaciones, incluido el marketing bancario. Su capacidad para desglosar decisiones complejas en una serie de preguntas y respuestas simples los hace especialmente atractivos para la toma de decisiones basada en datos.