Para mejorar la capacidad predictiva de nuestros modelos binomiales, es recomendable transformar las variables independientes. Existen técnicas que lo hacen de modo automático, pero hoy os quería mostrar en un vídeo un método “casero” para agrupar una variable cuantitativa con respecto a una variable respuesta, todo muy orientado a que la transformación tenga un sentido de negocio.
El código empleado para hacer el vídeo es el siguiente:
from urllib.request import urlretrieve import pandas as pd import numpy as np import matplotlib.pyplot as plt link = 'https://raw.githubusercontent.com/yhat/demo-churn-pred/master/model/churn.csv' urlretrieve(link, "churn.csv") df = pd.read_csv("churn.csv") df.head(5) # Visualización de la variable objetivo pd.crosstab(df['Churn?'], columns='count').plot(kind='bar') plt.show() # Creación de la variable target numérica df['churn_num'] = np.where(df['Churn?'] == 'True.', 1, 0) # Análisis de la variable 'Day Mins' print(df['Day Mins'].describe()) plt.hist(df['Day Mins'], bins=20) plt.show() # Transformación casera: agrupamiento por tramos de 10 minutos con límites df['minutos_cat'] = np.where(df['Day Mins'] >= 270, 270, (df['Day Mins'] // 10) * 10) df['minutos_cat'] = np.where(df['minutos_cat'] <= 70, 70, df['minutos_cat']) # Cálculo de tasa de churn por tramo churn_rate = df.groupby('minutos_cat')['churn_num'].mean() counts = df.groupby('minutos_cat')['churn_num'].count() # Gráfico de doble eje: volumen de clientes y tasa de churn fig, ax1 = plt.subplots() ax1.bar(counts.index.astype(str), counts.values, color='skyblue', label='Clientes') ax1.set_xlabel('Tramos de Minutos') ax1.set_ylabel('Número de Clientes') ax1.grid(True, axis='y') ax2 = ax1.twinx() ax2.plot(churn_rate.values, linestyle='-', linewidth=2.0, color='red', label='Tasa de Churn') ax2.set_ylabel('Tasa de Churn') plt.title('Transformación de variable Day Mins') plt.show()