{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Árboles de Decisión para Marketing Bancario\n",
"\n",
"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.\n",
"\n",
"## Obtención de los Datos\n",
"\n",
"Primero, cargaremos el dataset de marketing bancario, como se mostró previamente:\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" age | \n",
" job | \n",
" marital | \n",
" education | \n",
" default | \n",
" balance | \n",
" housing | \n",
" loan | \n",
" contact | \n",
" day_of_month | \n",
" month | \n",
" duration | \n",
" campaign | \n",
" pdays | \n",
" previous | \n",
" poutcome | \n",
" HasTermDeposit | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 58 | \n",
" management | \n",
" married | \n",
" tertiary | \n",
" no | \n",
" 2143 | \n",
" yes | \n",
" no | \n",
" NaN | \n",
" 5 | \n",
" may | \n",
" 261 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" NaN | \n",
" no | \n",
"
\n",
" \n",
" 1 | \n",
" 44 | \n",
" technician | \n",
" single | \n",
" secondary | \n",
" no | \n",
" 29 | \n",
" yes | \n",
" no | \n",
" NaN | \n",
" 5 | \n",
" may | \n",
" 151 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" NaN | \n",
" no | \n",
"
\n",
" \n",
" 2 | \n",
" 33 | \n",
" entrepreneur | \n",
" married | \n",
" secondary | \n",
" no | \n",
" 2 | \n",
" yes | \n",
" yes | \n",
" NaN | \n",
" 5 | \n",
" may | \n",
" 76 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" NaN | \n",
" no | \n",
"
\n",
" \n",
" 3 | \n",
" 47 | \n",
" blue-collar | \n",
" married | \n",
" NaN | \n",
" no | \n",
" 1506 | \n",
" yes | \n",
" no | \n",
" NaN | \n",
" 5 | \n",
" may | \n",
" 92 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" NaN | \n",
" no | \n",
"
\n",
" \n",
" 4 | \n",
" 33 | \n",
" NaN | \n",
" single | \n",
" NaN | \n",
" no | \n",
" 1 | \n",
" no | \n",
" no | \n",
" NaN | \n",
" 5 | \n",
" may | \n",
" 198 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" NaN | \n",
" no | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" age job marital education default balance housing loan \\\n",
"0 58 management married tertiary no 2143 yes no \n",
"1 44 technician single secondary no 29 yes no \n",
"2 33 entrepreneur married secondary no 2 yes yes \n",
"3 47 blue-collar married NaN no 1506 yes no \n",
"4 33 NaN single NaN no 1 no no \n",
"\n",
" contact day_of_month month duration campaign pdays previous poutcome \\\n",
"0 NaN 5 may 261 1 -1 0 NaN \n",
"1 NaN 5 may 151 1 -1 0 NaN \n",
"2 NaN 5 may 76 1 -1 0 NaN \n",
"3 NaN 5 may 92 1 -1 0 NaN \n",
"4 NaN 5 may 198 1 -1 0 NaN \n",
"\n",
" HasTermDeposit \n",
"0 no \n",
"1 no \n",
"2 no \n",
"3 no \n",
"4 no "
]
},
"execution_count": 1,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"df_bank=pd.read_csv('bank_marketing.csv')\n",
"\n",
"df_bank.head()\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Análisis Exploratorio de Datos (EDA)\n",
"\n",
"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.\n",
"\n",
"```markdown\n",
"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.\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"\n",
"\n",
"## Preprocesamiento de Datos\n",
"\n",
"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.\n",
"\n",
"```markdown\n",
"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.\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Iniciamos con la descripción de las variables del dataset:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" job | \n",
" marital | \n",
" education | \n",
" default | \n",
" housing | \n",
" loan | \n",
" contact | \n",
" month | \n",
" poutcome | \n",
" HasTermDeposit | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 44923 | \n",
" 45211 | \n",
" 43354 | \n",
" 45211 | \n",
" 45211 | \n",
" 45211 | \n",
" 32191 | \n",
" 45211 | \n",
" 8252 | \n",
" 45211 | \n",
"
\n",
" \n",
" unique | \n",
" 11 | \n",
" 3 | \n",
" 3 | \n",
" 2 | \n",
" 2 | \n",
" 2 | \n",
" 2 | \n",
" 12 | \n",
" 3 | \n",
" 2 | \n",
"
\n",
" \n",
" top | \n",
" blue-collar | \n",
" married | \n",
" secondary | \n",
" no | \n",
" yes | \n",
" no | \n",
" cellular | \n",
" may | \n",
" failure | \n",
" no | \n",
"
\n",
" \n",
" freq | \n",
" 9732 | \n",
" 27214 | \n",
" 23202 | \n",
" 44396 | \n",
" 25130 | \n",
" 37967 | \n",
" 29285 | \n",
" 13766 | \n",
" 4901 | \n",
" 39922 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" job marital education default housing loan contact \\\n",
"count 44923 45211 43354 45211 45211 45211 32191 \n",
"unique 11 3 3 2 2 2 2 \n",
"top blue-collar married secondary no yes no cellular \n",
"freq 9732 27214 23202 44396 25130 37967 29285 \n",
"\n",
" month poutcome HasTermDeposit \n",
"count 45211 8252 45211 \n",
"unique 12 3 2 \n",
"top may failure no \n",
"freq 13766 4901 39922 "
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Descripción de las variables\n",
"\n",
"df_bank.describe(include='object')"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" age | \n",
" balance | \n",
" day_of_month | \n",
" duration | \n",
" campaign | \n",
" pdays | \n",
" previous | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
" 45211.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 40.936210 | \n",
" 1362.272058 | \n",
" 15.806419 | \n",
" 258.163080 | \n",
" 2.763841 | \n",
" 40.197828 | \n",
" 0.580323 | \n",
"
\n",
" \n",
" std | \n",
" 10.618762 | \n",
" 3044.765829 | \n",
" 8.322476 | \n",
" 257.527812 | \n",
" 3.098021 | \n",
" 100.128746 | \n",
" 2.303441 | \n",
"
\n",
" \n",
" min | \n",
" 18.000000 | \n",
" -8019.000000 | \n",
" 1.000000 | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" -1.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 25% | \n",
" 33.000000 | \n",
" 72.000000 | \n",
" 8.000000 | \n",
" 103.000000 | \n",
" 1.000000 | \n",
" -1.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 50% | \n",
" 39.000000 | \n",
" 448.000000 | \n",
" 16.000000 | \n",
" 180.000000 | \n",
" 2.000000 | \n",
" -1.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 75% | \n",
" 48.000000 | \n",
" 1428.000000 | \n",
" 21.000000 | \n",
" 319.000000 | \n",
" 3.000000 | \n",
" -1.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" max | \n",
" 95.000000 | \n",
" 102127.000000 | \n",
" 31.000000 | \n",
" 4918.000000 | \n",
" 63.000000 | \n",
" 871.000000 | \n",
" 275.000000 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" age balance day_of_month duration campaign \\\n",
"count 45211.000000 45211.000000 45211.000000 45211.000000 45211.000000 \n",
"mean 40.936210 1362.272058 15.806419 258.163080 2.763841 \n",
"std 10.618762 3044.765829 8.322476 257.527812 3.098021 \n",
"min 18.000000 -8019.000000 1.000000 0.000000 1.000000 \n",
"25% 33.000000 72.000000 8.000000 103.000000 1.000000 \n",
"50% 39.000000 448.000000 16.000000 180.000000 2.000000 \n",
"75% 48.000000 1428.000000 21.000000 319.000000 3.000000 \n",
"max 95.000000 102127.000000 31.000000 4918.000000 63.000000 \n",
"\n",
" pdays previous \n",
"count 45211.000000 45211.000000 \n",
"mean 40.197828 0.580323 \n",
"std 100.128746 2.303441 \n",
"min -1.000000 0.000000 \n",
"25% -1.000000 0.000000 \n",
"50% -1.000000 0.000000 \n",
"75% -1.000000 0.000000 \n",
"max 871.000000 275.000000 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_bank.describe(include='number')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exploremos las variables con problemas, miremos las que tienen valores faltantes:\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"age 0\n",
"job 288\n",
"marital 0\n",
"education 1857\n",
"default 0\n",
"balance 0\n",
"housing 0\n",
"loan 0\n",
"contact 13020\n",
"day_of_month 0\n",
"month 0\n",
"duration 0\n",
"campaign 0\n",
"pdays 0\n",
"previous 0\n",
"poutcome 36959\n",
"HasTermDeposit 0\n",
"dtype: int64"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"## Nulos\n",
"\n",
"df_bank.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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.\n",
"\n",
"```{note}\n",
"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.\n",
"```\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ahora revisemos información sobre las variables, hagamos un análisi profundo para determinar cuales son realmente explicativas para la variable objetivo.\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"RangeIndex: 45211 entries, 0 to 45210\n",
"Data columns (total 17 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 age 45211 non-null int64 \n",
" 1 job 44923 non-null object\n",
" 2 marital 45211 non-null object\n",
" 3 education 43354 non-null object\n",
" 4 default 45211 non-null object\n",
" 5 balance 45211 non-null int64 \n",
" 6 housing 45211 non-null object\n",
" 7 loan 45211 non-null object\n",
" 8 contact 32191 non-null object\n",
" 9 day_of_month 45211 non-null int64 \n",
" 10 month 45211 non-null object\n",
" 11 duration 45211 non-null int64 \n",
" 12 campaign 45211 non-null int64 \n",
" 13 pdays 45211 non-null int64 \n",
" 14 previous 45211 non-null int64 \n",
" 15 poutcome 8252 non-null object\n",
" 16 HasTermDeposit 45211 non-null object\n",
"dtypes: int64(7), object(10)\n",
"memory usage: 5.9+ MB\n"
]
}
],
"source": [
"df_bank.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Variables utiles para la entrada\n",
"\n",
"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.\n",
"\n",
"### Variables Interesantes para el Modelo\n",
"\n",
"1. **age**: La edad del cliente puede influir en su decisión de suscribirse a un depósito a plazo.\n",
"2. **job**: La profesión podría tener una correlación con la propensión a suscribirse a un depósito a plazo.\n",
"3. **marital**: El estado civil podría influir en las decisiones financieras.\n",
"4. **education**: El nivel de educación podría correlacionarse con la decisión de suscribirse a un depósito a plazo.\n",
"5. **default**: Saber si el cliente tiene créditos en mora podría ser relevante para la decisión de marketing.\n",
"6. **balance**: El saldo de la cuenta podría indicar la solvencia económica del cliente y su propensión a invertir.\n",
"7. **housing**: Tener una hipoteca podría influir en la disponibilidad de fondos para invertir en un depósito a plazo.\n",
"8. **loan**: Similar a \"housing\", tener préstamos personales podría afectar la capacidad de suscribirse a un depósito a plazo.\n",
"9. **contact**: El método de contacto podría influir en la efectividad de la campaña.\n",
"10. **day_of_month**, **month**: La fecha de último contacto puede tener efectos estacionales en la decisión del cliente.\n",
"11. **duration**: La duración de la última llamada puede ser un indicador del interés del cliente.\n",
"12. **campaign**: La cantidad de contactos durante la campaña puede afectar la decisión del cliente.\n",
"13. **pdays**, **previous**, **poutcome**: Estas relacionadas con campañas anteriores pueden ofrecer insights sobre la receptividad del cliente.\n",
"\n",
"### Variables a Considerar Quitar\n",
"\n",
"1. **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.\n",
"2. **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.\n",
"\n",
"### Consideraciones Adicionales\n",
"\n",
"- **Tratamiento de valores faltantes**: Es importante decidir cómo manejar las variables con valores faltantes. En algunos casos, como `poutcome` y `contact`, 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.\n",
"- **Codificación de variables categóricas**: Variables como `job`, `marital`, `education`, `default`, `housing`, `loan`, y `month` 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.\n",
"\n",
"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.\n",
"\n",
"### Variable objetivo\n",
"\n",
"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.\n",
"\n",
"```{note}\n",
"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.\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"HasTermDeposit\n",
"no 39922\n",
"yes 5289\n",
"Name: count, dtype: int64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_bank['HasTermDeposit'] .value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" age | \n",
" job | \n",
" marital | \n",
" education | \n",
" default | \n",
" balance | \n",
" housing | \n",
" loan | \n",
" day_of_month | \n",
" month | \n",
" duration | \n",
" campaign | \n",
" pdays | \n",
" previous | \n",
" HasTermDeposit | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 58 | \n",
" management | \n",
" married | \n",
" tertiary | \n",
" no | \n",
" 2143 | \n",
" yes | \n",
" no | \n",
" 5 | \n",
" may | \n",
" 261 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 1 | \n",
" 44 | \n",
" technician | \n",
" single | \n",
" secondary | \n",
" no | \n",
" 29 | \n",
" yes | \n",
" no | \n",
" 5 | \n",
" may | \n",
" 151 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 2 | \n",
" 33 | \n",
" entrepreneur | \n",
" married | \n",
" secondary | \n",
" no | \n",
" 2 | \n",
" yes | \n",
" yes | \n",
" 5 | \n",
" may | \n",
" 76 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 3 | \n",
" 47 | \n",
" blue-collar | \n",
" married | \n",
" NaN | \n",
" no | \n",
" 1506 | \n",
" yes | \n",
" no | \n",
" 5 | \n",
" may | \n",
" 92 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
" 4 | \n",
" 33 | \n",
" NaN | \n",
" single | \n",
" NaN | \n",
" no | \n",
" 1 | \n",
" no | \n",
" no | \n",
" 5 | \n",
" may | \n",
" 198 | \n",
" 1 | \n",
" -1 | \n",
" 0 | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" age job marital education default balance housing loan \\\n",
"0 58 management married tertiary no 2143 yes no \n",
"1 44 technician single secondary no 29 yes no \n",
"2 33 entrepreneur married secondary no 2 yes yes \n",
"3 47 blue-collar married NaN no 1506 yes no \n",
"4 33 NaN single NaN no 1 no no \n",
"\n",
" day_of_month month duration campaign pdays previous HasTermDeposit \n",
"0 5 may 261 1 -1 0 0 \n",
"1 5 may 151 1 -1 0 0 \n",
"2 5 may 76 1 -1 0 0 \n",
"3 5 may 92 1 -1 0 0 \n",
"4 5 may 198 1 -1 0 0 "
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"\n",
"\n",
"# Para 'poutcome' y 'contact', consideraremos eliminar estas columnas debido a la alta cantidad de valores faltantes\n",
"df_bank.drop(columns=['poutcome', 'contact'], inplace=True)\n",
"# Si la variable objetivo 'HasTermDeposit' es categórica ('yes', 'no'), la convertimos a numérica\n",
"df_bank['HasTermDeposit'] = df_bank['HasTermDeposit'].map({'yes': 1, 'no': 0})\n",
"\n",
"df_bank.head()\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"## Cómo Funcionan los Árboles de Decisión\n",
"\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.\n",
"\n",
"### Conceptos Básicos\n",
"\n",
"```{note}\n",
"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.\n",
"```\n",
"\n",
"#### División de los Datos\n",
"\n",
"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.\n",
"\n",
"```{tip}\n",
"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.\n",
"```\n",
"\n",
"#### Criterios de División\n",
"\n",
"Dos criterios predominantes para la división son la Ganancia de Información y el Índice Gini.\n",
"\n",
"```{example}\n",
"- **Ganancia de Información**: Mide la reducción en entropía o incertidumbre.\n",
"- **Índice Gini**: Evalúa la frecuencia con la que un elemento aleatorio sería identificado incorrectamente.\n",
"```\n",
"\n",
"#### Poda del Árbol\n",
"\n",
"Limitar la complejidad del árbol es crucial para prevenir el sobreajuste, manteniendo el modelo generalizable a nuevos datos.\n",
"\n",
"```{warning}\n",
"El sobreajuste ocurre cuando un modelo aprende patrones del ruido en los datos de entrenamiento, afectando negativamente su rendimiento en datos no vistos.\n",
"```\n",
"\n",
"### Ventajas y Desventajas\n",
"\n",
"```{note}\n",
"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.\n",
"```\n",
"\n",
"### Aplicaciones Prácticas\n",
"\n",
"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.\n",
"\n",
"#### Ejemplo de Implementación en Python\n",
"\n",
"A continuación, un breve ejemplo de cómo implementar un árbol de decisión utilizando scikit-learn en Python.\n",
"\n",
"```python\n",
"# Importando las bibliotecas necesarias\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import accuracy_score\n",
"\n",
"# Dividir el conjunto de datos y entrenar el modelo\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
"modelo = DecisionTreeClassifier(max_depth=5, random_state=42)\n",
"modelo.fit(X_train, y_train)\n",
"\n",
"# Evaluar el modelo\n",
"y_pred = modelo.predict(X_test)\n",
"print(f\"Exactitud del modelo: {accuracy_score(y_test, y_pred):.2f}\")\n",
"```\n",
"\n",
"#### Visualización del Árbol\n",
"\n",
"Visualizar el árbol de decisión nos permite interpretar cómo el modelo toma sus decisiones.\n",
"\n",
"```python\n",
"from sklearn.tree import plot_tree\n",
"import matplotlib.pyplot as plt\n",
"\n",
"plt.figure(figsize=(20,10))\n",
"plot_tree(modelo, filled=True, feature_names=X.columns, class_names=['No', 'Yes'], rounded=True, proportion=True)\n",
"plt.show()\n",
"```\n",
"\n",
"```{tip}\n",
"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.\n",
"```\n",
"\n",
"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."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "base",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.4"
}
},
"nbformat": 4,
"nbformat_minor": 2
}