TRABAJO GRUPAL SEMANA 4
Grupo N°8
NRC1753
1. ANDRÉS BARRERA SOTO
2. CAROL VALDEBENITO CUEVAS
3. JUAN GARRIDO FUHROP
4. MARCO MENDOZA CIFUENTES
5. NIDIA ALUCEMA CAMPILLAY
Universidad
AndrésBello®
Conectar•Innovar•Liderar
1. PROBLEMA
1.1. Contexto
Dataset:
El conjunto de datos 'clientes.xlxs' fue descargado de una base de datos de ventas que contiene
todas las facturas realizadas por una empresa el año 2022.
Objetivo:
La empresa bancaria tiene como objetivo realizar un análisis del comportamiento
de sus clientes, pero sus datos están corruptos y nesecitan corregir todos los
errores para poder realizar el análisis..
Desarrollo:
Tomando el dataset de la empresa “clientes.xlsx”, utilice lenguaje Python, para realizar
preprocesamiento de los datos que cumpla con los siguientes puntos:
1. Identibque errores de registro, datos faltantes y datos atípicos en la base de datos de la
empresa. Explique un resumen de los casos encontrados.
2. Corrija los errores a través de una rutina de limpieza, transformación e imputación de datos
para cada caso. Fundamente su elección.
3. Realice un breve resumen estadístico donde corrobore las correcciones realizadas,
interpretando los resultados de todos los estadísticos, grábcos y tablas.
4. Realice una transformación de variables categóricas a numéricas a través del método de
encoding, donde muestre qué número se le asignó a cada clase.
1.2. Librerías
# OPERACIONES CON ARREGLOS (MATRICES Y VECTORES)
import numpy as np
# ESTRUCTURA Y MANIPULACIÓN DE DATOS
import pandas as pd
# VISUALIZACIÓN
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import seaborn as sb
from seaborn import kdeplot
from seaborn import lmplot
from seaborn import boxplot
# Configura el estilo de seaborn para desactivar la notación científica
sb.set(style="ticks", rc={'axes.formatter.limits': (-2, 10)})
# ADVERTENCIAS
import warnings
warnings.filterwarnings('ignore')
1.3. Carga de datos
[ ] ↳ 5 celdas ocultas
2. CONJUNTO DE DATOS
[ ] ↳ 29 celdas ocultas
3. PREPROCESAMIENTO
3.1. Errores de registro
# Unificar clases de la columna 'Educación'
df['Educacion'] = df['Educacion'].replace({'Técnico': 'Tecnico'})
df['Educacion'].unique()
array(['Tecnico', nan, 'Media', 'Universitario', 0, 'Magister',
'Doctorado'], dtype=object)
# Unificar clases de la columna 'Medio_pago'
#df['Medio_pago'] = df['Medio_pago'].replace({'Crédito': 'Credito', 'Débito': 'Debito'
#df['Medio_pago'].unique()
# Unificar clases de la columna 'Region'
df['Educacion'] = df['Educacion'].replace({'Tecinoc': 'Tecnico'})
df['Educacion'].unique()
array(['Tecnico', nan, 'Media', 'Universitario', 0, 'Magister',
'Doctorado'], dtype=object)
#Cantidad de Nivel de Educación
df['Educacion'].value_counts()
count
Educacion
Tecnico 89680
Universitario 53792
Media 25208
Magister 21752
Doctorado 9512
0 112
dtype: int64
3.2. Limpieza
Se eliminan todos los registros que no aportan al estudio:
# Filtrar filas distintas de 0
df = df[df['Seguro'] != 0]
text_columns = df.select_dtypes(include=['object']).columns
for column in text_columns:
# Detectar valores no numéricos
errores = df[column].apply(pd.to_numeric, errors='coerce').isna()
# Mostrar conteo de valores no numéricos
if errores.any():
print(f"Valores no numéricos en la columna {column}:\n", df.loc[errores, colum
Valores no numéricos en la columna Seguro:
Seguro
Automotriz 62998
Salud 41824
Desgravamen 33818
Vida 23168
Viaje 13208
Accidente 12778
Robo 12440
Name: count, dtype: int64
Valores no numéricos en la columna Genero:
Genero
Femenino 101248
Masculino 98824
$ 24
Name: count, dtype: int64
Valores no numéricos en la columna Ciudad:
Ciudad
Santiago 78384
Concepción 21848
Rancagua 17328
Valparaíso 16144
Chillán 11456
Arica 10368
Osorno 7544
Los Ángeles 7336
Copiapó 5208
La Serena 4520
Puerto Montt 4360
Antofagasta 3600
Buin 3000
Temuco 2008
Iquique 1424
Ovalle 1400
Linares 1296
Villarrica 1128
Talca 1064
Calama 776
$ 8
Name: count, dtype: int64
Valores no numéricos en la columna Region:
Region
Metropolitana 80312
Biobío 29544
O'Higgins 16968
Valparaíso 15792
Los Lagos 11664
Ñuble 11288
Arica y Parinacota 10160
Coquimbo 5784
Atacama 5064
Antofagasta 4240
Maule 2352
Araucanía 2008
Tarapacá 1408
Biobio 136
$ 24
Name: count, dtype: int64
Valores no numéricos en la columna Estado_Civil:
Estado_Civil
# Eliminar columnas completamente vacías
empty_columns = df.columns[df.isnull().all()]
print(f"Columnas vacías a eliminar: {empty_columns.tolist()}")
# Eliminar columnas
df.drop(columns=empty_columns, inplace=True)
# Verificar duplicados
duplicates_count = df.duplicated().sum()
print(f"Número de registros duplicados: {duplicates_count}")
# Eliminar duplicados si corresponde
if duplicates_count > 0:
df.drop_duplicates(inplace=True)
Columnas vacías a eliminar: ['Columna 11']
Número de registros duplicados: 0
# Filtrar filas distintas de $
df = df[df['Seguro'] != '$']
3.3. Duplicados
# Encontrar duplicados
duplicados = df[df.duplicated(subset=['Id_cliente'], keep=False)]
duplicados
Id_cliente Seguro Genero Ciudad Region Estado_Civil Educacion N°_Hijos
Se corrobora la eliminacion
Para eliminar blas duplicadas y conservar la última aparición:
df = df.drop_duplicates(subset=['Id', 'N°_factura'], keep='last')
3.4. Datos nulos (missing)
Identibcacion de datos nulos.
#Datos nulos
df.isna().sum()
Id_cliente 0
Seguro 239
Genero 400
Ciudad 264
Region 3728
Estado_Civil 448
Educacion 528
N°_Hijos 312
Cupo_TC 416
Gasto_Mensual 1192
dtype: int64
Eliminación de registros con menor cantidad de nulos:
print(df.columns)
Index(['Id_cliente', 'Seguro', 'Genero', 'Ciudad', 'Region', 'Estado_Civil',
'Educacion', 'N°_Hijos', 'Cupo_TC', 'Gasto_Mensual'],
dtype='object')
# Eliminar filas donde 'Ciudad', 'Genero', o 'Cupo_TC' sean nulos
df = df.dropna(subset=['Ciudad', 'Genero', 'Cupo_TC'])
# Mostrar las primeras filas para verificar que se eliminaron las filas nulas
print("DataFrame después de eliminar filas con datos nulos:")
print(df.head())
# Mostrar información del DataFrame para verificar el número de registros
print("Información del DataFrame después de la limpieza:")
print(df.info())
DataFrame después de eliminar filas con datos nulos:
Id_cliente Seguro Genero Ciudad Region Estado_Civil \
0 23210 Accidente Femenino 0 Los Lagos $
2 23212 Accidente $ Ovalle NaN Soltero(a)
5 23215 Accidente Femenino Buin NaN Soltero(a)
6 23216 Accidente Femenino Concepción Biobío Casado(a)
7 23217 Accidente Femenino Puerto Montt Los Lagos Soltero(a)
Educacion N°_Hijos Cupo_TC Gasto_Mensual
0 Tecnico 0.0 10000000.0 592360.0
2 NaN 3.0 1000000.0 -578670.0
5 Tecnico 5.0 1000000.0 530661.0
6 NaN 5.0 -1000000.0 NaN
7 Tecnico 1.0 1000000.0 904428.0
Información del DataFrame después de la limpieza:
<class 'pandas.core.frame.DataFrame'>
Index: 199704 entries, 0 to 200583
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Id_cliente 199704 non-null int64
1 Seguro 199569 non-null object
2 Genero 199704 non-null object
3 Ciudad 199704 non-null object
4 Region 196128 non-null object
5 Estado_Civil 199384 non-null object
6 Educacion 199312 non-null object
7 N°_Hijos 199544 non-null float64
8 Cupo_TC 199704 non-null float64
9 Gasto_Mensual 198632 non-null float64
dtypes: float64(3), int64(1), object(6)
memory usage: 16.8+ MB
None
#Datos nulos
df.isna().sum()
Id_cliente 0
Seguro 135
Genero 0
Ciudad 0
Region 3576
Estado_Civil 320
Educacion 392
N°_Hijos 160
Cupo_TC 0
Gasto_Mensual 1072
dtype: int64
Imputación de datos faltantes de las variables con mayor cantidad de nulos.
#Imputacion por moda
for column in ['Ciudad', 'Seguro', 'Genero', 'Region', 'Estado_Civil', 'Educacion']:
moda = df[column].mode()[0] # Encuentra la moda
df[column].fillna(moda, inplace=True) # Rellena nulos con la moda
# Mostrar las primeras filas para verificar los cambios
print("DataFrame después de imputar valores nulos por moda:")
print(df.head())
DataFrame después de imputar valores nulos por moda:
Id_cliente Seguro Genero Ciudad Region Estado_Civil \
0 23210 Accidente Femenino 0 Los Lagos $
2 23212 Accidente $ Ovalle NaN Soltero(a)
5 23215 Accidente Femenino Buin NaN Soltero(a)
6 23216 Accidente Femenino Concepción Biobío Casado(a)
7 23217 Accidente Femenino Puerto Montt Los Lagos Soltero(a)
Educacion N°_Hijos Cupo_TC Gasto_Mensual
0 Tecnico 0.0 10000000.0 592360.0
2 Tecnico 3.0 1000000.0 -578670.0
5 Tecnico 5.0 1000000.0 530661.0
6 Tecnico 5.0 -1000000.0 NaN
7 Tecnico 1.0 1000000.0 904428.0
#Datos nulos
df.isna().sum()
Id_cliente 0
Seguro 0
Genero 0
Ciudad 0
Region 3576
Estado_Civil 320
Educacion 0
N°_Hijos 160
Cupo_TC 0
Gasto_Mensual 1072
dtype: int64
#Resumen estadístico columnas que son numéricas
resumen_estadistico = df.describe()
# Mostrar el resumen
print("Resumen estadístico de las columnas numéricas:")
print(resumen_estadistico)
Resumen estadístico de las columnas numéricas:
Id_cliente N°_Hijos Cupo_TC Gasto_Mensual
count 199704.000000 199544.000000 1.997040e+05 1.986320e+05
mean 123506.721768 1.876438 1.455554e+06 1.768507e+06
std 57903.398500 1.558588 1.276941e+06 8.534547e+06
min 23210.000000 0.000000 -2.000000e+06 -9.350280e+05
25% 73355.750000 1.000000 1.000000e+06 7.140360e+05
50% 123501.500000 2.000000 1.000000e+06 9.352970e+05
75% 173647.250000 3.000000 2.000000e+06 1.941800e+06
max 223793.000000 5.000000 1.000000e+08 9.460400e+08
# Comprobar valores nulos por columna
valores_nulos = df.isnull().sum()
print("Muestra los Valores nulos por columna después de la imputación:")
print(valores_nulos[valores_nulos > 0]) # Mostrar solo columnas con valores nulos
Muestra los Valores nulos por columna después de la imputación:
Region 3576
Estado_Civil 320
N°_Hijos 160
Gasto_Mensual 1072
dtype: int64
# Eliminar valores negativos en 'Cupo_TC'
df = df[df['Cupo_TC'] >= 0]
# Convertir a entero
df['Cupo_TC'] = df['Cupo_TC'].astype(int)
# Eliminar valores negativos en 'Gasto_Mensual' y convertir a entero
df = df[df['Gasto_Mensual'] >= 0]
df['Gasto_Mensual'] = df['Gasto_Mensual'].astype(int)
#verificar Datos
print(df['Cupo_TC'].dtype) # Debe ser int
print(df['Gasto_Mensual'].dtype)
int64
int64
import matplotlib.pyplot as plt
import seaborn as sns
# Seleccionar las columnas "Cupo_TC" y "Gasto_Mensual"
columnas = df[["Cupo_TC", "Gasto_Mensual"]]
# Selección de las columnas "Cupo_TC" y "Gasto_Mensual"
columnas = df[["Cupo_TC", "Gasto_Mensual"]]
# Ahora se crea una figura con dos subplots en una fila
fig, axes = plt.subplots(1, 2, figsize=(12, 4)) # 1 fila, 2 columnas
# Creación de gráfico de caja para cada columna
for i, column in enumerate(columnas.columns):
ax = axes[i]
ax.boxplot(columnas[column], patch_artist=True, boxprops=dict(facecolor='lightblue
ax.set_xlabel(column) # Título del eje x con el nombre de la columna
ax.set_ylabel("Valores") # Título del eje Y
ax.set_title(f"Boxplot de {column}")
# Se Ajusta la disposición para mostrar gráficos uno al lado del otro
plt.tight_layout()
plt.show()
df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 198512 entries, 0 to 200583
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Id_cliente 198512 non-null int64
1 Seguro 198512 non-null object
2 Genero 198512 non-null object
3 Ciudad 198512 non-null object
4 Region 194960 non-null object
5 Estado_Civil 198192 non-null object
6 Educacion 198512 non-null object
7 N°_Hijos 198360 non-null float64
8 Cupo_TC 198512 non-null int64
9 Gasto_Mensual 198512 non-null int64
dtypes: float64(1), int64(3), object(6)
memory usage: 16.7+ MB
df.describe()
1 to 8 of 8 entries Filter
index Id_cliente N°_Hijos Cupo_TC Gasto_Mensual
count 198512.0 198360.0 198512.0 198512.0
mean 123480.6190457 1.8760233918128655 1454783.61191263 1769264.4103731764
std 57902.12618313948 1.5582162517219422 1278049.831438998 8537015.086534398
min 23210.0 0.0 0.0 0.0
25% 73355.75 1.0 1000000.0 714386.0
50% 123501.5 2.0 1000000.0 935642.0
75% 173647.25 3.0 2000000.0 1941800.0
max 223793.0 5.0 100000000.0 946040000.0
Show 25 per page
Like what you see? Visit the data table notebook to learn more about interactive tables.
Distributions
2-d distributions
200000-
175000-
150000-
125000-
÷100000-
75000-
50000-
25000-
0- •
250005000075000100000125000150000175000200000225000
Id_cliente
from scipy import stats
Debnición Valores Atípicos, desviación estandar
# importar
from scipy import stats
# Se define la cantidad de desviaciones estándar
corte = 3
# Calcular el Z-Score para 'Cupo_TC'
z_cupo_tc = stats.zscore(df['Cupo_TC'])
outliers_cupo_tc = (abs(z_cupo_tc) > corte)
# Imprime el recuento de valores atípicos en 'Cupo_TC'
print(f"Recuento de valores atípicos en Cupo TC: {outliers_cupo_tc.sum()}")
# Calcular el Z-Score para 'Gasto_Mensual'
z_gasto_mensual = stats.zscore(df['Gasto_Mensual'])
outliers_gasto_mensual = (abs(z_gasto_mensual) > corte)
# Imprime el recuento de valores atípicos en 'Gasto_Mensual'
print(f"Recuento de valores atípicos en Gasto Mensual: {outliers_gasto_mensual.sum()}"
Recuento de valores atípicos en Cupo TC: 40
Recuento de valores atípicos en Gasto Mensual: 40
#verificación
print("Valores atípicos en Cupo TC:")
print(df[outliers_cupo_tc])
print("Valores atípicos en Gasto Mensual:")
print(df[outliers_gasto_mensual])
Valores atípicos en Cupo TC:
Id_cliente Seguro Genero Ciudad Region \
0 23210 Accidente Femenino 0 Los Lagos
9850 33060 Vida Masculino Los Ángeles Biobío
10035 33245 Automotriz Masculino Copiapó Atacama
10263 33473 Automotriz Masculino Santiago Metropolitana
10498 33708 Vida Femenino Osorno Los Lagos
25073 48283 Accidente Femenino 0 Los Lagos
34923 58133 Vida Masculino Los Ángeles Biobío
35108 58318 Automotriz Masculino Copiapó Atacama
35336 58546 Automotriz Masculino Santiago Metropolitana
35571 58781 Vida Femenino Osorno Los Lagos
50146 73356 Accidente Femenino 0 Los Lagos
59996 83206 Vida Masculino Los Ángeles Biobío
60181 83391 Automotriz Masculino Copiapó Atacama
60409 83619 Automotriz Masculino Santiago Metropolitana
60644 83854 Vida Femenino Osorno Los Lagos
75219 98429 Accidente Femenino 0 Los Lagos
85069 108279 Vida Masculino Los Ángeles Biobío
85254 108464 Automotriz Masculino Copiapó Atacama
85482 108692 Automotriz Masculino Santiago Metropolitana
85717 108927 Vida Femenino Osorno Los Lagos
100292 123502 Accidente Femenino 0 Los Lagos
110142 133352 Vida Masculino Los Ángeles Biobío
110327 133537 Automotriz Masculino Copiapó Atacama
110555 133765 Automotriz Masculino Santiago Metropolitana
110790 134000 Vida Femenino Osorno Los Lagos
125365 148575 Accidente Femenino 0 Los Lagos
135215 158425 Vida Masculino Los Ángeles Biobío
135400 158610 Automotriz Masculino Copiapó Atacama
135628 158838 Automotriz Masculino Santiago Metropolitana
135863 159073 Vida Femenino Osorno Los Lagos
150438 173648 Accidente Femenino 0 Los Lagos
160288 183498 Vida Masculino Los Ángeles Biobío
160473 183683 Automotriz Masculino Copiapó Atacama
160701 183911 Automotriz Masculino Santiago Metropolitana
160936 184146 Vida Femenino Osorno Los Lagos
175511 198721 Accidente Femenino 0 Los Lagos
185361 208571 Vida Masculino Los Ángeles Biobío
185546 208756 Automotriz Masculino Copiapó Atacama
185774 208984 Automotriz Masculino Santiago Metropolitana
186009 209219 Vida Femenino Osorno Los Lagos
Estado_Civil Educacion N°_Hijos Cupo_TC Gasto_Mensual
0 $ Tecnico 0.0 10000000 592360
9850 Soltero(a) Tecnico 0.0 10000000 586746
10035 Casado(a) Tecnico 4.0 100000000 736465
10263 Soltero(a) Tecnico 0.0 100000000 996749
10498 Casado(a) Media 1.0 50000000 440074
25073 $ Tecnico 0.0 10000000 592360
34923 Soltero(a) Tecnico 0.0 10000000 586746
35108 Casado(a) Tecnico 4.0 100000000 736465
35336 Soltero(a) Tecnico 0.0 100000000 996749
35571 Casado(a) Media 1.0 50000000 440074
50146 $ Tecnico 0.0 10000000 592360
59996 Soltero(a) Tecnico 0.0 10000000 586746
60181 Casado(a) Tecnico 4.0 100000000 736465
60409 Soltero(a) Tecnico 0.0 100000000 996749
60644 Casado(a) Media 1.0 50000000 440074
NOTA
Es importante revisar el comportamiento de las variables antes de este paso, ya
que en otros casos puede que hayan datos que no sean realmente atípicos pero
por su naturaleza queden fuera del rango normal, por lo que no sería necesario
realizar ninguna modibcación. En otros casos hay que hacer un bltro para eliminar
sólo los datos de las variables que correspondan. Por otro lado, cuando hay
demasiados datos atípicos (más de un 10-20% de los registros) es mejor imputar
los datos en vez de eliminarlos.
# Generar el resumen estadístico y formatear los montos
resumen_estadistico = df.describe()
resumen_estadistico['Cupo_TC'] = resumen_estadistico['Cupo_TC'].apply('{:.0f}'.format)
resumen_estadistico['Gasto_Mensual'] = resumen_estadistico['Gasto_Mensual'].apply('{:.
# Mostrar el resumen estadístico formateado
print(resumen_estadistico)
Id_cliente N°_Hijos Cupo_TC Gasto_Mensual
count 198512.000000 198360.000000 198512 198512
mean 123480.619046 1.876023 1454784 1769264
std 57902.126183 1.558216 1278050 8537015
min 23210.000000 0.000000 0 0
25% 73355.750000 1.000000 1000000 714386
50% 123501.500000 2.000000 1000000 935642
75% 173647.250000 3.000000 2000000 1941800
max 223793.000000 5.000000 100000000 946040000
4. ANÁLISIS DE DATOS CORREGIDOS
# Generar el resumen estadístico
resumen_estadistico = df.describe()
# Formatear las columnas numéricas
resumen_estadistico['Cupo_TC'] = resumen_estadistico['Cupo_TC'].apply('{:.0f}'.format)
resumen_estadistico['Gasto_Mensual'] = resumen_estadistico['Gasto_Mensual'].apply('{:.
# Mostrar el resumen estadístico formateado
print(resumen_estadistico)
Id_cliente N°_Hijos Cupo_TC Gasto_Mensual
count 198512.000000 198360.000000 198512 198512
mean 123480.619046 1.876023 1454784 1769264
std 57902.126183 1.558216 1278050 8537015
min 23210.000000 0.000000 0 0
25% 73355.750000 1.000000 1000000 714386
50% 123501.500000 2.000000 1000000 935642
75% 173647.250000 3.000000 2000000 1941800
max 223793.000000 5.000000 100000000 946040000
df.head()
Id_cliente Seguro Genero Ciudad Region Estado_Civil Educacion N°_H
0 23210 Accidente Femenino 0 Los Lagos $ Tecnico
5 23215 Accidente Femenino Buin NaN Soltero(a) Tecnico
Puerto
7 23217 Accidente Femenino Los Lagos Soltero(a) Tecnico
Montt
8 23218 Automotriz Masculino Valparaíso Valparaíso Soltero(a) Tecnico
9 23219 Accidente Femenino Concepción NaN Casado(a) Tecnico
Agrupación de datos en tablas para resumir información del dataset:
# Función lambda para indicar el formato de moneda
moneda = lambda x: "${:,.0f}".format(x).replace(",", ".")
# Aplicar el formato $
df['Cupo_TC'] = df['Cupo_TC'].apply(moneda)
df['Gasto_Mensual'] = df['Gasto_Mensual'].apply(moneda)
# Mostrar las primeras filas para verificar los cambios
print(df[['Cupo_TC', 'Gasto_Mensual']].head())
Cupo_TC Gasto_Mensual
0 $10.000.000 $592.360
5 $1.000.000 $530.661
7 $1.000.000 $904.428
8 $1.000.000 $704.975
9 $1.000.000 $767.575
# Mostrar los primeros registros de la columna 'Gasto_Mensual'
print(df['Gasto_Mensual'].head(20))
# Verificar cuántos valores no numéricos hay
non_numeric = df[~df['Gasto_Mensual'].astype(str).str.isnumeric()]
print("Valores no numéricos encontrados en 'Gasto_Mensual':")
print(non_numeric)
# Intentar convertir nuevamente a numérico
df['Gasto_Mensual'] = pd.to_numeric(df['Gasto_Mensual'], errors='coerce')
# Verificar cuántos valores nulos hay después de la conversión
print("Valores nulos en 'Gasto_Mensual' después de la conversión:", df['Gasto_Mensual'
# Imputar la media o mediana
df['Gasto_Mensual'].fillna(df['Gasto_Mensual'].mean(), inplace=True) # O usa df['Gast
# Eliminar filas con valores nulos en 'Gasto_Mensual'
df.dropna(subset=['Gasto_Mensual'], inplace=True)
# Mostrar los primeros registros de la columna 'Gasto_Mensual'
print(df['Gasto_Mensual'].head(20))
Mostrar el resultado oculto
print(df['Gasto_Mensual'].head(20))
Series([], Name: Gasto_Mensual, dtype: float64)
# Calcular la suma de Gasto Mensual por región
suma_por_region = df[["Region", "Gasto_Mensual"]].groupby(by="Region").sum()
# Ordenar los resultados en orden descendente
suma_por_region = suma_por_region.sort_values(by="Gasto_Mensual", ascending=False)
# Formatear la columna 'Gasto_Mensual' como moneda
moneda = lambda x: "${:,.0f}".format(x).replace(",", ".")
suma_por_region["Gasto_Mensual"] = suma_por_region["Gasto_Mensual"].apply(moneda)
# Mostrar el resultado final
print(suma_por_region)
Empty DataFrame
Columns: [Gasto_Mensual]
Index: []
5. ENCODING
Luego de preprocesar los datos es necesario realizar una transformación de las variables
categóricas a numéricas discretas, ya que los modelos predictivos necesitan que todas las
entradas de datos sean numéricas.
Este proceso de reemplazar las clases de cada variable por un código numérico se llama
"encoding".
Label Encoding : Creación de etiquetas numéricas dentro de la misma columna. Sólo sirve
para variables categóricas nominales ya que las etiquetas perderían el orden para variables
categoricas ordinales. Se recomienda para variables con muchas clases.
# Mostrar los tipos de columnas
print(df.dtypes)
# Listar las columnas categóricas
categorical_columns = df.select_dtypes(include=['object']).columns
print("Columnas categóricas:", categorical_columns)
from sklearn.preprocessing import LabelEncoder
# Inicializar el codificador
label_encoder = LabelEncoder()
# Aplicar Label Encoding a las columnas categóricas
for column in categorical_columns:
df[column] = label_encoder.fit_transform(df[column])
# Mostrar el DataFrame después del Label Encoding
print(df.head())
Id_cliente int64
Seguro object
Genero object
Ciudad object
Region object
Estado_Civil object
Educacion object
N°_Hijos float64
Cupo_TC object
Gasto_Mensual float64
dtype: object
Columnas categóricas: Index(['Seguro', 'Genero', 'Ciudad', 'Region', 'Estado_Civi
'Cupo_TC'],
dtype='object')
Empty DataFrame
Columns: [Id_cliente, Seguro, Genero, Ciudad, Region, Estado_Civil, Educacion, N°
Index: []
DOCUMENTACIÓN
Numpy: https://numpy.org/devdocs/user/index.html#user
Pandas: https://pandas.pydata.org/docs/user_guide/index.html
Scipy: https://docs.scipy.org/doc/scipy/
Matplotlib: https://matplotlib.org/stable/users/index.html
Seaborn: https://seaborn.pydata.org/tutorial.html