<jupyter_start><jupyter_text>Stock y TARGETAquí se encuentra el target. Analizaremos diferencias entre set de train y de test. De aquí saldrá el primer modelo base.<jupyter_code># Reading dataset
df_stock_train = pd.read_csv("../data/DATA_STOCK_VARS_TRAIN_F.csv")
df_stock_test = pd.read_csv("../data/DATA_STOCK_VARS_TEST_F.csv")
df_stock_train.head().T
df_stock_train.info() # Enteros... pocos valores continuos en general en todos los datasets.
df_stock_train.shape
df_stock_test.shape
df_stock_train.describe().T
df_stock_test.describe().T<jupyter_output><empty_output><jupyter_text>Train y test se ven con una distribución similar.<jupyter_code># Duplicados? (No debería haber)

df_stock_train.sort_values(["MES_T0","ID_CLIENTE"], inplace = True)
bool_series = df_stock_train[["MES_T0","ID_CLIENTE"]].duplicated()
df_stock_train[bool_series] 

df_stock_test.sort_values(["MES_T0","ID_CLIENTE"], inplace = True)
bool_series = df_stock_test[["MES_T0","ID_CLIENTE"]].duplicated()
df_stock_test[bool_series]
#Por cliente?
df_stock_train.sort_values(["ID_CLIENTE"], inplace = True)
bool_series = df_stock_train[["ID_CLIENTE"]].duplicated()
df_stock_train[bool_series]<jupyter_output><empty_output><jupyter_text>Sòlo un registro por cliente. Amazing.  Distribución del target<jupyter_code>df_stock_train.FUGA_3M.value_counts(dropna=False).sort_index()
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train)<jupyter_output><empty_output><jupyter_text>Tengo muchas preguntas xd a ver  Distribución del target por periodo<jupyter_code>plt.figure(figsize=(20,5))
sns.barplot(x='MES_T0', y='FUGA_3M', data=df_stock_train)<jupyter_output><empty_output><jupyter_text>- Poca variación entre el porcentaje total de attrition por periodo (12-15%)- Rangos elevados en la mitad de año. [ojo, periodos que serán evaluados son del fin de año]  Solo se tiene un punto por cliente.<jupyter_code>df_stock_train[(df_stock_train['MES_T0'] == 201803) & (df_stock_train['FUGA_3M'] == 1)].ID_CLIENTE.value_counts(dropna=False).sort_index() #7823 clientes
#Historia del cliente 32
df_stock_train[df_stock_train['ID_CLIENTE'] == 32]<jupyter_output><empty_output><jupyter_text>A la hora de comparar con otros datasets, revisar que si hay informacion de estos clientes en abandono en pasados los 3 meses, ya que se podrian descubrir data leaks  Correlación entre rangos<jupyter_code>rang_cols = ['RGO_RIEGO_BBVA','RGO_RIESGO_SIST','RGO_SDO_MEDIO_ACTIVO',
             'RGO_SDO_MEDIO_PASIVO','RGO_MARGEN_OPER_MES','RGO_MARGEN_OPER_ACUM','RGO_FACTURA_ANUAL']
# Heatmap train
plt.figure(figsize=(18,10))
sns.heatmap(df_stock_train[rang_cols].corr(),annot=True)
# Heatmap test
plt.figure(figsize=(18,10))
sns.heatmap(df_stock_test[rang_cols].corr(),annot=True)<jupyter_output><empty_output><jupyter_text>Hay correlaciones fuertes entre los rangos,como es de esperarse. Todos son en el tiempo N-1.  Analisis por el total de empleados. (Deberia tener relación con el tipo de empresa)<jupyter_code>#Train
df_stock_train.TO_EMPLEADOS.value_counts(dropna=False).sort_index() # Mayoria en 0
#Train
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TO_EMPLEADOS', data = df_stock_train) # flags por intervalos? analizar cuales son las empresas que tienen 0
#Test
df_stock_test.TO_EMPLEADOS.value_counts(dropna=False).sort_index() 
#Test
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TO_EMPLEADOS', data = df_stock_test) # Esperaria que gran mayoria sea pymes<jupyter_output><empty_output><jupyter_text>Revisar a que negocio pertenecen aquellos que tienen 0 empleados y nulos<jupyter_code>df_stock_train[df_stock_train['TO_EMPLEADOS'] == 0].TIPO_NEGOCIO.value_counts(dropna=False).sort_index() 
df_stock_test[df_stock_test['TO_EMPLEADOS'] == 0].TIPO_NEGOCIO.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>PNN para empleados en 0<jupyter_code># Revisar a que negocio pertenecen aquellos que tienen null en nro de emplds.
df_stock_train[df_stock_train['TO_EMPLEADOS'].isnull()].TIPO_NEGOCIO.value_counts(dropna=False).sort_index() 
# Revisar a que negocio pertenecen aquellos que tienen null en nro de emplds.
df_stock_test[df_stock_test['TO_EMPLEADOS'].isnull()].TIPO_NEGOCIO.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>Variado  Revisar a que persona pertenecen aquellos que tienen 0 empleados y nulos<jupyter_code>df_stock_train[df_stock_train['TO_EMPLEADOS'] == 0].TP_PERSONA.value_counts(dropna=False).sort_index() 
df_stock_test[df_stock_test['TO_EMPLEADOS'] == 0].TP_PERSONA.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>Variado<jupyter_code>df_stock_train[df_stock_train['TO_EMPLEADOS'].isnull()].TP_PERSONA.value_counts(dropna=False).sort_index() 
df_stock_test[df_stock_test['TO_EMPLEADOS'].isnull()].TP_PERSONA.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>F y J suben bastante en nulos  Revisar a que tipo de vivienda pertenecen aquellos que tienen null en nro de emplds.<jupyter_code>df_stock_train[df_stock_train['TO_EMPLEADOS']==0].TP_VIVI.value_counts(dropna=False).sort_index() 
df_stock_test[df_stock_test['TO_EMPLEADOS']==0].TP_VIVI.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>HOGAR para empleados en 0, mayormente.<jupyter_code>df_stock_train[df_stock_train['TO_EMPLEADOS'].isnull()].TP_VIVI.value_counts(dropna=False).sort_index() 
df_stock_test[df_stock_test['TO_EMPLEADOS'].isnull()].TP_VIVI.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>Existe una correspondencia entre los nulos de total de empleados y tipo de vivienda. Ojo al llenar.  Analisis del tipo de vivienda<jupyter_code>#Train
df_stock_train.TP_VIVI.value_counts(dropna=False).sort_index() #Mas del doble en hogar
#Test
df_stock_test.TP_VIVI.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>Análisis contra el target<jupyter_code>plt.figure(figsize=(20,5))
sns.barplot(x='TP_VIVI', y='FUGA_3M', data=df_stock_train.fillna('nans')) 
# Nulos tienen variacion. Trabajo no abandona.
df_stock_train[df_stock_train['TP_VIVI'] == 'TRABAJO'].FUGA_3M.value_counts(dropna=False).sort_index()
df_stock_train[df_stock_train['TP_VIVI'].isnull()].FUGA_3M.value_counts(dropna=False).sort_index()<jupyter_output><empty_output><jupyter_text>Analisis del tipo de persona<jupyter_code>#Train
df_stock_train.TP_PERSONA.value_counts(dropna=False).sort_index()
#Train
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TP_PERSONA', data = df_stock_train)
#Test
df_stock_test.TP_PERSONA.value_counts(dropna=False).sort_index()
#Test
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TP_PERSONA', data = df_stock_test)<jupyter_output><empty_output><jupyter_text>Misma distribucion entre train y test (me asusté pero en la x axis se ordena la A y la F al revés xd)  Análisis contra el target<jupyter_code>plt.figure(figsize=(20,5))
sns.barplot(x='TP_PERSONA', y='FUGA_3M', data=df_stock_train.fillna('nans'))<jupyter_output><empty_output><jupyter_text>F tiene más abandono en promedio, seguido del tipo persona A.  Analisis del tipo de negocio<jupyter_code>#Train
df_stock_train.TIPO_NEGOCIO.value_counts(dropna=False).sort_index()
#Train
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TIPO_NEGOCIO', data = df_stock_train)
#Test
df_stock_test.TIPO_NEGOCIO.value_counts(dropna=False).sort_index()
#Test
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'TIPO_NEGOCIO', data = df_stock_test)<jupyter_output><empty_output><jupyter_text>Same dist  Análisis contra el target<jupyter_code>plt.figure(figsize=(20,5))
sns.barplot(x='TIPO_NEGOCIO', y='FUGA_3M', data=df_stock_train.fillna('nans'))<jupyter_output><empty_output><jupyter_text>PNN presenta mayor abandono en promedio  Analisis de variables de la SBS  CD_SBS_NORMAL<jupyter_code>#Train
sns.distplot(df_stock_train['CD_SBS_NORMAL'], bins=10);
#Test
sns.distplot(df_stock_test['CD_SBS_NORMAL'], bins=10);<jupyter_output><empty_output><jupyter_text>Analisis con target<jupyter_code># Evaluaciones menores a 73 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_NORMAL'] < 73])
df_stock_train[df_stock_train['CD_SBS_NORMAL'] < 73].FUGA_3M.value_counts(normalize=True) # Mayor al promedio general en unos
# Evaluaciones mayores o iguales a 73 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_NORMAL'] >= 73])
df_stock_train[df_stock_train['CD_SBS_NORMAL'] >= 73].FUGA_3M.value_counts(normalize=True) # Más bajo número de 1s que el prom<jupyter_output><empty_output><jupyter_text>CD_SBS_CPP<jupyter_code>#Train
sns.distplot(df_stock_train['CD_SBS_CPP'], bins=10);
#Test
sns.distplot(df_stock_test['CD_SBS_CPP'], bins=10);<jupyter_output><empty_output><jupyter_text>Analisis con el target<jupyter_code># Evaluaciones menores a 2 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_CPP'] < 2])
# Evaluaciones may o ig a 2 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_CPP'] >= 2])
df_stock_train[df_stock_train['CD_SBS_CPP'] < 2].FUGA_3M.value_counts(normalize=True)
df_stock_train[df_stock_train['CD_SBS_CPP'] >= 2].FUGA_3M.value_counts(normalize=True) # Contradictorio<jupyter_output><empty_output><jupyter_text>CD_SBS_DDP<jupyter_code>#Train
sns.distplot(df_stock_train['CD_SBS_DDP'], bins=10);
#Test
sns.distplot(df_stock_test['CD_SBS_DDP'], bins=10);<jupyter_output><empty_output><jupyter_text>Analisis con el target<jupyter_code># Evaluaciones menores a 17 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_DDP'] < 17])
# Evaluaciones menores a 17 (mean)
plt.figure(figsize=(20,5))
plot = sns.countplot(x = 'FUGA_3M', data = df_stock_train[df_stock_train['CD_SBS_DDP'] >= 17])
df_stock_train[df_stock_train['CD_SBS_DDP'] < 17].FUGA_3M.value_counts(normalize=True)
df_stock_train[df_stock_train['CD_SBS_DDP'] >= 17].FUGA_3M.value_counts(normalize=True)<jupyter_output><empty_output><jupyter_text>Analizando las fechas y computando las diferencias dentre fecha y T0.Aqui testearemos el preprocessing y crearemos otros dfs.<jupyter_code>df_stock_train['FH_NACIMIENTO'].head(10)
df_stock_train['FH_ALTA'].head(10)
df_stock_train_p = df_stock_train.copy()
df_stock_test_p = df_stock_test.copy()
#Numero de meses hasta la fecha de nacimiento desde año 0 mes 0.
df_stock_train_p['months_NACIMIENTO'] = df_stock_train_p['FH_NACIMIENTO'].apply(lambda x: int(str(x).split('-')[0])*12 + int(str(x).split('-')[1]) if isinstance(x, str) else x)
df_stock_test_p['months_NACIMIENTO'] = df_stock_test_p['FH_NACIMIENTO'].apply(lambda x: int(str(x).split('-')[0])*12 + int(str(x).split('-')[1]) if isinstance(x, str) else x)
#Numero de meses basta fecha de alta desde año 0 mes 0
df_stock_train_p['months_ALTA'] = df_stock_train_p['FH_ALTA'].apply(lambda x: int(str(x).split('-')[0])*12 + int(str(x).split('-')[1]) if isinstance(x, str) else x)
df_stock_test_p['months_ALTA'] = df_stock_test_p['FH_ALTA'].apply(lambda x: int(str(x).split('-')[0])*12 + int(str(x).split('-')[1]) if isinstance(x, str) else x)
#Computando los meses del T0 desde el año 0 mes 0
df_stock_train_p['months_T0'] = df_stock_train_p['MES_T0'].apply(lambda x: int(str(x)[:4])*12 + int(str(x)[4:6]))
df_stock_test_p['months_T0'] = df_stock_test_p['MES_T0'].apply(lambda x: int(str(x)[:4])*12 + int(str(x)[4:6]))
#Computando columnas finales
df_stock_train_p['diff_months_T0_NACIMIENTO'] = df_stock_train_p['months_T0'] - df_stock_train_p['months_NACIMIENTO']
df_stock_test_p['diff_months_T0_NACIMIENTO'] = df_stock_test_p['months_T0'] - df_stock_test_p['months_NACIMIENTO']

df_stock_train_p['diff_months_T0_ALTA'] = df_stock_train_p['months_T0'] - df_stock_train_p['months_ALTA']
df_stock_test_p['diff_months_T0_ALTA'] = df_stock_test_p['months_T0'] - df_stock_test_p['months_ALTA']<jupyter_output><empty_output><jupyter_text>Analizando los meses desde el nacimiento y alta<jupyter_code>df_stock_train_p[['diff_months_T0_NACIMIENTO','diff_months_T0_ALTA']].describe().T
df_stock_test_p[['diff_months_T0_NACIMIENTO','diff_months_T0_ALTA']].describe().T
#Train NACIMIENTO
sns.distplot(df_stock_train_p['diff_months_T0_NACIMIENTO'], bins=15);
#Test NACIMIENTO
sns.distplot(df_stock_test_p['diff_months_T0_NACIMIENTO'], bins=15);
#Train ALTA
sns.distplot(df_stock_train_p['diff_months_T0_ALTA'], bins=12);
#Test ALTA
sns.distplot(df_stock_test_p['diff_months_T0_ALTA'], bins=12);<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1336227308602999, 'fraction_numerical': 0.017995264404104185, 'mean_word_length': 10.066375545851528, 'pattern_counts': {'":': 0, '<': 115, '<?xml version=': 0, '>': 115, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '27', 'dir': 'jupyter-structured-clean-dedup', 'id': '161349', 'license': 'MIT', 'n_tokens_mistral': 5451, 'n_tokens_neox': 5240, 'n_words': 766, 'path': 'eda/BasicEDA_DATA_STOCK_VARS.ipynb', 'repo_name': 'davichoar/BBVA-2019', 'size': '12670'}