Aplicación de Machine Learning para Revolucionar los Servicios Bancarios
Objetivo de Negocio:
En la actualidad, el Banco XYZ se encuentra en un punto de crecimiento continuo, contando con una base de clientes en expansión, donde la mayoría son clientes de pasivo (depositantes) en lugar de ser prestatarios (clientes de activo).
El banco busca estratégicamente expandir su base de prestatarios para incrementar sus negocios a través de los intereses de los préstamos.
Una campaña reciente mostró una tasa de conversión promedio en un solo dígito.
En la última reunión general, el líder de marketing destacó la transformación digital como la fortaleza central de nuestra estrategia de negocio, resaltando la importancia de diseñar campañas efectivas con un marketing dirigido para duplicar la tasa de conversión manteniendo el mismo presupuesto de la campaña anterior.
Como científico de datos, se me ha encomendado el desarrollo de un modelo de aprendizaje automático que identifique a los posibles prestatarios para apoyar un marketing enfocado.
🟩Descripción de los Datos
✔️ Contamos con 2 archivos CSV:
Data1: 5000 filas y 8 columnas.
Data2: 5000 filas y 7 columnas.
✔️Estos datos incluyen atributos como:
ID del Cliente, Edad, Antigüedad como Cliente, Gastos Máximos, Código Postal, entre otros, diseñados para perfilar de manera óptima a los clientes actuales y potenciales.
✔️ DESCRIPCIÓN DE LOS DATOS: Los datos consisten en los siguientes atributos:
➡️ID: Identificación del Cliente
➡️Edad: Edad aproximada del cliente.
➡️ClienteDesde: Cliente del banco desde.
➡️GastoMáximo: El mayor gasto del cliente hasta la fecha en una transacción.
➡️CódigoPostal: Código postal del cliente.
➡️PuntajeOculto: Un puntaje asociado al cliente que está oculto por el banco como una Propiedad Intelectual (IP).
➡️GastoMensualPromedio: Gasto mensual promedio del cliente hasta la fecha.
➡️Nivel: Un nivel asociado al cliente que está oculto por el banco como una Propiedad Intelectual (IP).
➡️Hipoteca: Hipoteca del cliente.
➡️Seguridad: Activo de seguridad del cliente con el banco.
➡️CuentaDepósitoAFijo: Cuenta de depósito a plazo fijo del cliente con el banco.
➡️BancaPorInternet: Si el cliente utiliza la banca por internet.
➡️TarjetaDeCrédito: Si el cliente utiliza la tarjeta de crédito del banco.
➡️PréstamoEnTarjeta: Si el cliente tiene un préstamo en la tarjeta de crédito.
✔️ Objetivo:
Elaborar un modelo de aprendizaje automático para realizar marketing digital enfocado, prediciendo a los clientes potenciales que se convertirán de clientes de pasivo a activo.
✔️ Tecnologías Utilizadas:
Lenguaje: Python.
Librerías: numpy, pandas, matplotlib, seaborn, sklearn, pickle, imblearn.
✔️ Enfoque Metodológico:
Preparación de datos y fusión de datasets.
Análisis exploratorio para obtener insights valiosos.
Ingeniería de características para refinar el dataset.
Construcción de varios modelos predictivos, incluyendo Regresión Logística y Árboles de Decisión.
Validación de modelos para seleccionar el más efectivo, basándonos en métricas como la precisión y la matriz de confusión.
Ajuste de hiperparámetros y balanceo de datos para optimizar el rendimiento.
Selección y guardado del modelo final para implementación.
📊Import Libraries:
%matplotlib inline
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
📊Load data:
data1 = pd.read_csv("C:/Users/Renata Lima/python/data/Data1.csv")
data2 = pd.read_csv("C:/Users/Renata Lima/python/data/Data2.csv")
📊Tamaño dataset:
print(data1.shape)
print(data2.shape)
📊Ver las primeras lineas del dataframe_1:
data1.head(5)
📊Ver las primeras lineas del dataframe_2:
data2.head(5)
📊Unir los dos datasets:
cust_data=data1.merge(data2, how='inner', on='ID')
📊Tamaño dataframe final:
print(cust_data.shape)
📊Explorar data types:
cust_data.dtypes
📊Resumen Estadístico de los Datos:
cust_data.describe().transpose()
Age = Edad --> La edad promedio de los clientes es aproximadamente 45 años
El cliente más joven tiene 23 años y el cliente con más edad tiene 67 años.
Esta distribución de la edad puede proporcionar información valiosa cuando se busca segmentar la base de clientes para campañas de marketing, ya que permite identificar grupos etarios específicos para dirigir las ofertas de productos financieros.
Cliente Desde = CustomerSince---> La antigüedad como cliente podría correlacionarse con la lealtad y confianza en el banco y por tanto, con una mayor probabilidad de aceptar ofertas de préstamos.
En promedio, los clientes han estado con el banco aproximadamente 20 años.
El valor mínimo es -3, lo cual es atípico y podría sugerir un error en los datos o una entrada incorrecta, ya que no es posible tener una antigüedad negativa.
El cliente más antiguo ha estado con el banco durante 43 años.
BancaPorInternet = InternetBanking---> Aproximadamente el 59.68% (media) de los clientes utiliza la banca por internet, asumiendo que 1 representa el uso y 0 la no utilización. La Desviación estándar (std): 0.490589 Existe una variabilidad moderada en el uso de la banca por internet entre los clientes.
➡️Esta información es relevante para la transformación digital en el sector bancario, ya que muestra una adopción significativa de la banca por internet entre los clientes.
Para una campaña de marketing enfocada en la conversión de clientes de pasivo a activo, se podría considerar que aquellos que ya utilizan servicios digitales podrían ser más receptivos a ofertas de productos financieros en línea, como préstamos o tarjetas de crédito virtuales.
📊Eliminar la columna ID:
cust_data = cust_data.drop(columns='ID')
📊Dataframe sin ID:
cust_data.shape
📊Comprobar null value:
cust_data.isnull().sum()
“PréstamoEnTarjeta” (LoanOnCard), hay 20 registros que no tienen datos, es decir, están vacíos o nulos.
Esto constituye un porcentaje muy pequeño del total del conjunto de datos, específicamente el 0.4%.
En el contexto de la ciencia de datos, un valor nulo es básicamente un espacio en blanco o un marcador de posición que indica que no hay información disponible.
📊Eliminar los nulls values:
cust_data = cust_data.dropna()
📊Tamaño del dataframe sin los nulls values:
cust_data.shape
📊Exploratory Data Analysis:
sns.countplot(x='LoanOnCard', data=cust_data, palette=["#54bebe", "#d7658b"]);
Este gráfico muestra claramente que los datos están altamente desbalanceados.
📊Calcular el porcentaje de datos de la clase objetivo:
n_true = len(cust_data.loc[cust_data['LoanOnCard'] == 1.0])
n_false = len(cust_data.loc[cust_data['LoanOnCard'] == 0.0])
El resultado que temos indica que solo el 9.64% de los casos son verdaderos, mientras que el 90.36% son falsos, lo que sugiere que hay una distribución muy desigual entre las dos clases de la variable objetivo.
Este desequilibrio de datos es un problema común en machine learning.
📊Gráfico de dispersión para ver cómo se distribuyen los puntos de datos para "GastoMensualPromedio" y "GastoMáximo" según la clase objetivo:
📊Clientes:
📊Cuentas:
📊 Histogramas de Distribución de Variables Numéricas:
📊 Boxplots:
📊Gráfico de Barras para variables categóricas:
📊Gráfico de Densidad:
📊Análisis de Componentes Principales (PCA):
El gráfico de PCA muestra que no existe una distinción clara entre los clientes con y sin préstamos, sugiriendo que los factores que determinan la adquisición de préstamos podrían ser más complejos y no lineales.
Este resultado motiva a explorar modelos predictivos más avanzados para captar mejor estas complejidades y mejorar la identificación de clientes potenciales para campañas de préstamos.
📊Analisis de Correlación:
corr = cust_data.corr()
corr
➡️Edad (Age) y ClienteDesde (CustomerSince):
Tienen una correlación muy alta de 0.994208, lo que indica que estas dos variables contienen información muy similar. Esto es lógico, ya que cuanto más tiempo haya sido cliente una persona, mayor es probable que sea su edad.
➡️GastoMáximo (HighestSpend) y GastoMensualPromedio (MonthlyAverageSpend):
Presentan una correlación positiva moderada de 0.646109, indicando que clientes que gastan más en una sola transacción tienden a tener un mayor gasto mensual promedio.
➡️GastoMáximo (HighestSpend) y PréstamoEnTarjeta (LoanOnCard):
La correlación es moderadamente (0.502626), lo que sugiere que aquellos clientes con mayores gastos en una transacción tienden a tener un préstamo en su tarjeta de crédito.
➡️GastoMensualPromedio (MonthlyAverageSpend) y PréstamoEnTarjeta (LoanOnCard):
Tienen una correlación positiva de 0.366912, lo que indica que los clientes que gastan más mensualmente tienen una mayor probabilidad de tener un préstamo en tarjeta.
➡️CuentaDepósitoAFijo (FixedDepositAccount) y Seguridad (Security):
Muestran una correlación positiva de 0.317673, sugiriendo que los clientes con cuentas de depósito a plazo fijo tienden también a tener activos de seguridad con el banco.
➡️CuentaDepósitoAFijo (FixedDepositAccount) y PréstamoEnTarjeta (LoanOnCard):
Tienen una correlación positiva de 0.316131, indicando una tendencia entre los clientes con cuentas de depósito a plazo fijo a tener también préstamos en tarjeta.
Las demás correlaciones son generalmente bajas, lo que indica una relación menos fuerte entre esas variables.
Conclusión:
Las variables GastoMáximo, GastoMensualPromedio, y CuentaDepósitoAFijo parecen ser importantes para predecir la posibilidad de un cliente tener un PréstamoEnTarjeta, basado en sus correlaciones.
La alta correlación entre Edad y ClienteDesde sugiere que podrías considerar usar solo una de estas dos variables para evitar la multicolinealidad en el modelo.
Este análisis de correlación ofrece una base sólida sobre qué variables son más relevantes para incluir en tu modelo de aprendizaje automático para predecir la adquisición de préstamos en tarjeta por parte de los clientes.
📊Heatmap:
fig,ax = plt.subplots(figsize=(10, 10))
sns.heatmap(cust_data.corr(), ax=ax, annot=True, linewidths=0.05, fmt= '.2f',cmap="magma") # the color intensity is based on
plt.show()
Dado que "Edad" y "ClienteDesde" están altamente correlacionadas, podemos prescindir de una de ellas. Yo eliminaré "Edad"
📊Spliting the data:
Usaré 70% del data para training y 30% para testing.
from sklearn.model_selection import train_test_split
X = cust_data.drop('LoanOnCard',axis=1)
Y = cust_data['LoanOnCard'] # Predicted class (1=True, 0=False)
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=1)
⚡⚡Modelos:
⚡Regresión Logística
✅ Import model and matrics:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, roc_auc_score, precision_score, recall_score, f1_score
La Regresión Logística es un método estadístico popular para predecir la probabilidad de una variable categórica binaria.
✅Fit the model on train:
model = LogisticRegression(solver="liblinear")
model.fit(x_train, y_train)
✅Predicción en el conjunto de prueba:
y_predict = model.predict(x_test)
✅Creación de un DataFrame con los coeficientes:
coef_df = pd.DataFrame(model.coef_)
✅Añadiendo el término intercepto al DataFrame:
coef_df['intercept'] = model.intercept_
✅Performance:
⚡Regresión Logística Ponderada para manejar el desbalance de clases
✅ Class Weights (el peso de cada clase):
w = {0:1, 1:2}
✅Fit the model on train:
model_weighted = LogisticRegression(solver="liblinear", class_weight=w)
model_weighted.fit(x_train, y_train)
✅Predicción en el conjunto de prueba:
y_predict = model_weighted.predict(x_test)
✅Performance:
I
Aunque la exactitud disminuye, el AUC y el recall aumentan significativamente, por lo tanto, es un mejor modelo. Por lo tanto, seleccionamos "model_weighted".
⚡Naive bayes algorithm
✅from sklearn.naive_bayes import GaussianNB
✅Creación del modelo:
diab_model = GaussianNB()
diab_model.fit(x_train, y_train)
Este algoritmo es particularmente útil para clasificación en datos con una distribución gaussiana y funciona bajo la suposición de independencia entre las variables predictoras.
✅Performance del Conjunto de datos training:
diab_train_predict = diab_model.predict(x_train)
from sklearn import metrics
print("Model Accuracy: {0:.4f}".format(metrics.accuracy_score(y_train, diab_train_predict)))
print()
✅Performance del Conjunto de datos test:
y_predict = diab_model.predict(x_test)
from sklearn import metrics
print("Model Accuracy: {0:.4f}".format(metrics.accuracy_score(y_test, y_predict)))
print()
✅Performance:
⚡Ajuste de Priors para Datos Desbalanceados con Gaussian Naive Bayes
diab_model_cp = GaussianNB(priors=[0.1, 0.9])
diab_model_cp.fit(x_train, y_train.ravel())
y_predict = diab_model_cp.predict(x_test)
✅Performance:
El ajuste de las prioridades de clase en el modelo Naive Bayes ha mostrado ser efectivo para mejorar el recall en la clasificación de la clase minoritaria, a pesar de una reducción en la precisión general.
Este trade-off es común y aceptable en contextos donde es crucial identificar correctamente la mayoría de los casos positivos (por ejemplo, en diagnósticos médicos o detección de fraudes).
La mejora en el AUC y el recall sugiere que el modelo ajustado es más valioso en términos de identificar la clase de interés en conjuntos de datos desbalanceados.
⚡Support Vector Machines
✅ from sklearn import svm
clf = svm.SVC(gamma=0.25, C=10)
clf.fit(x_train , y_train)
y_predict = clf.predict(x_test)
He implementado el modelo SVM, utilizando la biblioteca sklearn.
Este tipo de modelo es ampliamente utilizado para clasificación, regresión y otras tareas.
✅Performance:
⚡Nuevo Modelo con Datos Estandarizados SVM
✅from scipy.stats import zscore
XScaled = X.apply(zscore) # convert all attributes to Z scale
XScaled.describe()
clf = svm.SVC(gamma=0.25, C=10)
clf.fit(x_trains , y_trains)
y_predicts = clf.predict(x_tests)
✅Performance:
La estandarización de los datos antes de aplicar el modelo SVC ha tenido un impacto positivo en todos los aspectos del rendimiento del modelo.
Esto destaca la importancia de la preprocesamiento adecuado de los datos, especialmente la estandarización, cuando se trabaja con algoritmos sensibles a la escala de los atributos, como SVM.
Estos resultados sugieren que, para futuros modelos y análisis, la estandarización podría ser una práctica recomendada para mejorar el rendimiento del modelo.
⚡Decision Tree Classifier
✅ Construir decision tree model
from sklearn.tree import DecisionTreeClassifier
dTree = DecisionTreeClassifier(criterion = 'gini', random_state=1)
dTree.fit(x_train, y_train)
✅ Scoring del modelo Decision Tree
print(dTree.score(x_train, y_train))
print(dTree.score(x_test, y_test))
y_predict = dTree.predict(x_test)
✅Performance:
Primer Modelo de Árbol de Decisión (Sin Regularización):
Este modelo alcanza una puntuación perfecta de 1.0 en el conjunto de entrenamiento, indicando que ha aprendido los datos de entrenamiento a la perfección, posiblemente demasiado bien, lo que podría ser un signo de sobreajuste. Sin embargo, sigue teniendo un rendimiento sobresaliente en el conjunto de prueba.
⚡Decision Tree Classifier con Regularización
✅Reduciendo el sobreajuste (Regularización):
dTreeR = DecisionTreeClassifier(criterion = 'gini', max_depth = 5, random_state=1)
dTreeR.fit(x_train, y_train)
print(dTreeR.score(x_train, y_train))
print(dTreeR.score(x_test, y_test))
La regularización se ha implementado a través del parámetro max_depth, que limita la profundidad del árbol. Esta es una técnica efectiva para prevenir el sobreajuste, ya que restringe la complejidad del modelo, impidiendo que el árbol de decisión se vuelva excesivamente complejo y aprenda el "ruido" en los datos de entrenamiento en lugar de las verdaderas relaciones subyacentes.
y_predictR = dTreeR.predict(x_test)
✅Performance:
Segundo Modelo de Árbol de Decisión (Con Regularización):
Con la introducción de la regularización mediante max_depth = 5, se reduce ligeramente la puntuación en el conjunto de entrenamiento (lo cual es bueno para prevenir el sobreajuste) y se mejora ligeramente en el conjunto de prueba. La mejora en la exactitud, AUC, recall y la puntuación F1 sugiere que el modelo regularizado es capaz de generalizar mejor a datos nuevos.
✅Visualización:
⚡Random forest classifier
✅from sklearn.ensemble import RandomForestClassifier
rfcl = RandomForestClassifier(random_state=1)
rfcl = rfcl.fit(x_train, y_train)
y_predict = rfcl.predict(x_test)
✅Performance:
⚡Manejo de Datos Desbalanceados con Random Forest Classifier
✅from imblearn.over_sampling import SMOTE
✅from imblearn.under_sampling import RandomUnderSampler
✅from imblearn.pipeline import Pipeline
✅from collections import Counter
x_trainb, x_testb, y_trainb, y_testb = train_test_split(Xb, Yb, test_size=0.3, random_state=1)
Después de haber aplicado la estandarización (con XScaled) y técnicas de balanceo de datos (con SMOTE y Random UnderSampler), el entrenamiento de modelos con estos datos preprocesados permite explorar cómo estas transformaciones afectan el rendimiento de diferentes algoritmos de clasificación, en este caso, SVM y Random Forest.
⚡SVM with balanced Data
clf = svm.SVC(gamma=0.25, C=10)
clf.fit(x_trainb , y_trainb)
y_predictb = clf.predict(x_testb)
✅Performance:
⚡Random Forest classifier with Balanced Data
rfcl = RandomForestClassifier(random_state=1)
rfcl = rfcl.fit(x_trainb, y_trainb)
y_predict = rfcl.predict(x_testb)
✅Performance:
Los modelos entrenados con datos balanceados y presumiblemente, estandarizados muestran un rendimiento sobresaliente en términos de exactitud, matriz de confusión, AUC, recall, precisión y puntuación F1.
Esto demuestra que el preprocesamiento cuidadoso de los datos —incluyendo tanto la estandarización como el balanceo de clases— es fundamental para desarrollar modelos de aprendizaje automático robustos y eficaces.
La razón de repetir el entrenamiento del modelo SVM (y también entrenar un modelo de Random Forest) después de haber realizado XScaled y aplicado técnicas de balanceo de datos es para verificar cómo estas transformaciones mejoran el rendimiento de los modelos y facilitan la comparación entre diferentes algoritmos bajo condiciones de preprocesamiento similares.
Esto subraya la importancia del preprocesamiento de datos en el flujo de trabajo de la ciencia de datos y cómo puede impactar significativamente en la capacidad de los modelos para aprender y generalizar a partir de los datos.
⚡Grid Search
✅from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1,1, 10, 100], 'gamma': [1,0.1,0.25,0.01],'kernel': ['rbf', 'poly', 'sigmoid']}
grid = GridSearchCV(svm.SVC(),param_grid,refit=True,verbose=2)
grid.fit(x_trainb,y_trainb)
print(grid.best_estimator_)
La elección de hiperparámetros mediante GridSearchCV es crucial para optimizar el rendimiento del modelo.
⭐⭐El modelo seleccionado ha sido Random Forest classifier with Balanced Data!!!
Conclusiones:
En este proyecto, he implementado y evaluado modelos de Machine Learning utilizando Logistic Regression, Decision Tree, Naive Bayes, Support Vector Machine (SVM) y Random Forest Classifier.
Dado que el dataset tiene un alto grado de imbalance, entonces la accuracy por sí sola no es una métrica adecuada para medir el rendimiento de los modelos.
Por ello, me he enfocado en métricas más reveladoras como Precision, Recall y Area Under the Curve (AUC) para identificar el modelo más efectivo.
Para abordar el challenge del data imbalance, he aplicado la técnica de Class Weight, observando una mejora significativa en el performance de los modelos al incorporar esta estrategia.
Se ha destacado la importancia del feature scaling o data transformation, especialmente cuando trabajamos con SVM, debido a su impacto directo en la eficacia del modelo.
Además, he explorado técnicas avanzadas de resampling, incluyendo undersampling y oversampling a través de SMOTE, como métodos proactivos para manejar el imbalance de datos.
El Hyperparameter Tuning, realizado mediante Grid Search, ha sido fundamental para optimizar los modelos y alcanzar un rendimiento superior.
En conclusión, este estudio ha demostrado cómo la aplicación metódica de técnicas de preprocesamiento de datos, junto con un ajuste cuidadoso de hiperparámetros, puede mejorar sistemáticamente la precisión y la efectividad de los modelos de Machine Learning frente a datasets desbalanceados.
Este proyecto demuestra cómo la ciencia de datos puede ser una herramienta poderosa para la transformación digital en el sector bancario, mejorando significativamente la eficacia del marketing dirigido y apoyando el crecimiento empresarial a través de la innovación tecnológica.
Nuevos Clientes para probar el modelo:
✅import pandas as pd
datos_clientes_ejemplo = pd.DataFrame({
"CustomerSince": [9, 39, 5, 23, 32, 41, 30, 14, 18, 21],
"HighestSpend": [180, 105, 45, 114, 40, 112, 22, 130, 81, 193],
"HiddenScore": [1, 4, 3, 2, 4, 1, 1, 4, 4, 2],
"MonthlyAverageSpend": [8.9, 2.4, 0.1, 3.8, 2.5, 2.0, 1.5, 4.7, 2.4, 8.1],
"Level": [3, 3, 2, 3, 2, 1, 3, 3, 1, 3],
"Mortgage": [0, 0, 0, 0, 0, 0, 0, 134, 0, 0],
"Security": [0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
"FixedDepositAccount": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
"InternetBanking": [0, 0, 1, 0, 1, 0, 1, 0, 0, 0],
"CreditCard": [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
})
import pickle
✅ Cargar el modelo
filename = 'finalized_model.sav'
loaded_model = pickle.load(open(filename, 'rb'))
✅ Hacer predicciones
y_predictb = loaded_model.predict(datos_clientes_ejemplo)
✅ Agregar las predicciones al DataFrame para análisis
datos_clientes_ejemplo['Prediccion_LoanOnCard'] = y_predictb
⭐⭐Conclusiones:
Dado que todas las predicciones de Prediccion_LoanOnCard son 1.0, el modelo predice que todos los clientes en este conjunto de ejemplo tienen una alta probabilidad de convertirse de pasivos a activos.
Esto podría indicar que el modelo ha identificado características fuertes en estos clientes que los alinean con el perfil de aquellos que están más inclinados a aceptar una oferta de producto que los convierta en clientes activos.
Analizando las características comunes entre los clientes a partir de los datos nuevos, se pueden observar varios patrones o atributos que podrían estar contribuyendo a la predicción positiva de que estos clientes tienen una alta probabilidad de convertirse de clientes pasivos a activos según el modelo de Random Forest Classifier:
✅ Nivel de Gasto (HighestSpend y MonthlyAverageSpend):
Se observa una variabilidad en el HighestSpend que va desde 22 hasta 193, lo que indica que no necesariamente los clientes con el mayor gasto son los únicos considerados para convertirse en activos. Sin embargo, el MonthlyAverageSpend tiende a ser más bajo en general, excepto para algunos clientes (por ejemplo, los clientes 0 y 9) que tienen un gasto mensual promedio más alto (8.9 y 8.1, respectivamente).
Esto podría sugerir que el modelo valora no solo los picos de gasto sino también un cierto nivel de consistencia en el gasto mensual.
✅ Antigüedad del Cliente (CustomerSince):
Los años de antigüedad varían significativamente, desde clientes relativamente nuevos (5 años) hasta clientes con una larga relación con el banco (41 años). Esto indica que la antigüedad por sí sola no es un factor determinante para la predicción de conversión, ya que clientes tanto nuevos como antiguos son predichos como potenciales para convertirse en activos.
✅ Servicios Bancarios (InternetBanking y CreditCard):
La mayoría de los clientes predichos como convertibles a activos no están utilizando InternetBanking ni tienen CreditCard. Esto podría sugerir que hay oportunidades para promover la adopción de estos servicios entre los clientes identificados como propensos a convertirse en activos, potencialmente como parte de su conversión a clientes más activos e involucrados.
✅ Factores Adicionales:
Mortgage y Security: Uno de los clientes (cliente 7) tiene una hipoteca, pero esto no parece ser común entre los demás clientes predichos como activos. La presencia de Security es baja también, lo que podría indicar que estos factores no son decisivos para la predicción. HiddenScore y Level: Estos parecen variar a lo largo de los clientes predichos como convertibles, lo que sugiere que el modelo está considerando estas variables de manera compleja, posiblemente en combinación con otras características, para hacer sus predicciones.
Conclusión:
El análisis sugiere que el modelo está identificando potenciales clientes activos basándose en una combinación compleja de características, incluyendo pero no limitándose a el nivel y consistencia del gasto, antigüedad del cliente y la utilización de ciertos servicios bancarios.
La falta de uso generalizado de InternetBanking y CreditCard entre los clientes predichos como convertibles sugiere una oportunidad para dirigir esfuerzos de marketing digital para promover la adopción de estos servicios. Además, el modelo no parece depender fuertemente de la presencia de hipotecas o seguros para realizar sus predicciones, lo que apunta a la importancia de otros factores como el comportamiento de gasto y la relación a largo plazo con el banco.
Comments