Willydmq / la-esencia-del-cliente-parte-1

La junta directiva de la cadena de supermercados Universal Food ha observado una estabilización en sus ventas y busca comprender cómo mejorar la relación con sus clientes, entendiendo sus hábitos de compra, para ofrecerles un servicio de mayor calidad.jj

Home Page:https://soysena-my.sharepoint.com/:p:/g/personal/mayad_soy_sena_edu_co/Ea_gsdQ3aDFFqF3NC5rS7ZIBNEomWCLsmv0hcuzLXyug5g?e=1zvrOC

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

#1. Configuración del Ambiente

Para desarrollar este desafío te recomendamos trabajar directamente desde la plataforma Google Colab. (Recuerda que debes tener una cuenta en gmail, si aún no la tienes, debes crearla).

  • Accede a la siguiente URL: Google Colaboratory
  • Debes crear un nuevo Notebook, y asignarle el nombre que desees: Ej. La esencia del cliente 1
  • Tras seguir los pasos anteriores, debes conectar tu notebook con tu cuenta de Google Drive. Para ello, en una nueva celda de código digita y ejecuta:
from google.colab import drive
drive.mount('/content/drive')
  • Accede a las siguientes URLs para descargar el dataset que estaremos utilizando: Cost Prediction on acquiring Customers.
  • Después de descargar el dataset, crea un directorio en tu cuenta de Drive y haz el upload de este.
  • Ya estás listo para avanzar a la siguiente etapa. ¡Te deseo muchos Éxitos!
from google.colab import drive
drive.mount('/content/drive')

#2. Obtención de los datos

  1. Para que puedas cargar en tu notebook los archivos que almacenaste previamente en tu cuenta de Drive, debes utilizar la biblioteca pandas.

  2. Como el dataset original está en inglés, lo vas a dejar todo en español para que puedas tener una mejor comprensión del mismo. La idea no es que inviertas tu tiempo en la traducción del dataset y, por este motivo, aquí te voy a dejar un link con un archivo de python que contiene los diccionarios:

Diccionarios

  1. Tu dataset para el análisis lo debes exportar en formato .csv y almacenarlo en tu directorio de Drive, pues será necesario para la segunda parte del desafío.

¡Ahora sí puedes avanzar a la siguiente fase! :)

import pandas as pd

media_prediction = pd.read_csv("/content/drive/MyDrive/BootCamp/CHALLENGE/Spring_3/media prediction and its cost.csv");

media_prediction.head()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
food_category food_department food_family store_sales(in millions) store_cost(in millions) unit_sales(in millions) promotion_name sales_country marital_status gender ... grocery_sqft frozen_sqft meat_sqft coffee_bar video_store salad_bar prepared_food florist media_type cost
0 Breakfast Foods Frozen Foods Food 7.36 2.7232 4.0 Bag Stuffers USA M F ... 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Daily Paper, Radio 126.62
1 Breakfast Foods Frozen Foods Food 5.52 2.5944 3.0 Cash Register Lottery USA M M ... 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Daily Paper, Radio 59.86
2 Breakfast Foods Frozen Foods Food 3.68 1.3616 2.0 High Roller Savings USA S F ... 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Daily Paper, Radio 84.16
3 Breakfast Foods Frozen Foods Food 3.68 1.1776 2.0 Cash Register Lottery USA M F ... 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 In-Store Coupon 95.78
4 Breakfast Foods Frozen Foods Food 4.08 1.4280 3.0 Double Down Sale USA M M ... 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Radio 50.79

5 rows × 40 columns

print(list(media_prediction.columns))
['food_category', 'food_department', 'food_family', 'store_sales(in millions)', 'store_cost(in millions)', 'unit_sales(in millions)', 'promotion_name', 'sales_country', 'marital_status', 'gender', 'total_children', 'education', 'member_card', 'occupation', 'houseowner', 'avg_cars_at home(approx)', 'avg. yearly_income', 'num_children_at_home', 'avg_cars_at home(approx).1', 'brand_name', 'SRP', 'gross_weight', 'net_weight', 'recyclable_package', 'low_fat', 'units_per_case', 'store_type', 'store_city', 'store_state', 'store_sqft', 'grocery_sqft', 'frozen_sqft', 'meat_sqft', 'coffee_bar', 'video_store', 'salad_bar', 'prepared_food', 'florist', 'media_type', 'cost']
import drive.MyDrive.BootCamp.CHALLENGE.Spring_3.diccionarios as diccionarios

df = media_prediction.copy()

# Obtener el diccionario de mapeo de columnas
column_mappings = diccionarios.columnas

# Mapeo de la columna media_prediction
df['food_category'] = df['food_category'].map(diccionarios.categoria_alimento);
df['food_department'] = df['food_department'].map(diccionarios.departamento);
df['food_family'] = df['food_family'].map(diccionarios.tipo);
df['promotion_name'] = df['promotion_name'].map(diccionarios.promocion);
df['education'] = df['education'].map(diccionarios.escolaridad);
df['member_card'] = df['member_card'].map(diccionarios.miembro);
df['occupation'] = df['occupation'].map(diccionarios.ocupacion);
df['sales_country'] = df['sales_country'].map(diccionarios.pais);
df['marital_status'] = df['marital_status'].map(diccionarios.estado_civil);
df['gender'] = df['gender'].map(diccionarios.genero);
df['avg. yearly_income'] = df['avg. yearly_income'].map(diccionarios.ingreso_anual);
df['houseowner'] = df['houseowner'].map(diccionarios.vivienda_propia);
df['store_type'] = df['store_type'].map(diccionarios.comercio);
df['media_type'] = df['media_type'].map(diccionarios.divulgacion);

df = df.rename(columns=column_mappings)

pd.set_option('display.max_rows', 5)
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

df.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda(en millones) costo_tienda(en millones) ventas_unitarias(en millones) promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos(aprox) ingreso_anual numero_hijos promedio_autos(aprox) marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
7514 Dulces Snacks Comida 8.40 3.1080 4.0 Rebajadores de precios Estados Unidos Casado Masculino 1.0 Primaria NaN Técnico 1.0 20000 1.0 1.0 Musial 2.10 19.7 16.7 1.0 0.0 33.0 Supermercado de lujo Salem OR 27694.0 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Periódico dominical, radio, televisión 54.11
55638 Productos de cocina Artículos para el hogar No comestible 5.70 1.8810 3.0 Días de dólar Estados Unidos Casado Femenino 5.0 Secundaria Bronce Técnico 3.0 40000 1.0 3.0 Sunset 1.90 17.4 15.3 1.0 0.0 19.0 Supermercado de lujo Tacoma WA 33858.0 22123.0 7041.0 4694.0 1.0 0.0 1.0 1.0 1.0 Periódico diario, radio 138.81
17745 Alimentos para picar Alimentos para picar Comida 6.20 2.6040 4.0 Venta Doble Estados Unidos Casado Masculino 4.0 Secundaria Oro Obrero No 4.0 40000 4.0 4.0 Fort West 1.55 18.0 17.0 0.0 0.0 15.0 Supermercado de lujo Salem OR 27694.0 18670.0 5415.0 3610.0 1.0 1.0 1.0 1.0 1.0 Radio 50.79
50526 Anchoas enlatadas Alimentos enlatados Comida 11.40 5.3580 4.0 Duplica tus ahorros Canadá Soltero Masculino 2.0 Superior Bronce Profesional 2.0 100000 0.0 2.0 Just Right 2.85 10.1 7.1 1.0 1.0 9.0 Supermercado mediano Victoria BC 34452.0 27463.0 4193.0 2795.0 1.0 0.0 0.0 0.0 1.0 Panfletos 114.72
11976 Alimentos ricos en almidón Alimentos ricos en almidón Comida 10.92 3.6036 4.0 Venta de dos días Estados Unidos Soltero Masculino 1.0 Secundaria NaN Profesional 2.0 140000 0.0 2.0 Discover 2.73 14.5 13.5 1.0 0.0 27.0 Supermercado Seattle WA 21215.0 13305.0 4746.0 3164.0 1.0 0.0 0.0 0.0 0.0 Radio 91.28
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60428 entries, 0 to 60427
Data columns (total 40 columns):
 #   Column                         Non-Null Count  Dtype
---  ------                         --------------  -----
 0   categoria_alimento             60428 non-null  object
 1   departamento                   60428 non-null  object
 2   tipo                           60428 non-null  object
 3   ventas_tienda(en millones)     60428 non-null  float64
 4   costo_tienda(en millones)      60428 non-null  float64
 5   ventas_unitarias(en millones)  60428 non-null  float64
 6   promocion                      60428 non-null  object
 7   pais                           60428 non-null  object
 8   estado_civil                   60428 non-null  object
 9   genero                         60428 non-null  object
 10  total_de_hijos                 60428 non-null  float64
 11  escolaridad                    60428 non-null  object
 12  miembro                        46561 non-null  object
 13  ocupacion                      60428 non-null  object
 14  vivienda_propia                60428 non-null  object
 15  promedio_autos(aprox)          60428 non-null  float64
 16  ingreso_anual                  60428 non-null  int64
 17  numero_hijos                   60428 non-null  float64
 18  promedio_autos(aprox)          60428 non-null  float64
 19  marca                          60428 non-null  object
 20  precio_recomendado             60428 non-null  float64
 21  peso_bruto                     60428 non-null  float64
 22  peso_neto                      60428 non-null  float64
 23  empaque_reciclable             60428 non-null  float64
 24  bajo_en_grasa                  60428 non-null  float64
 25  unidades_por_caja              60428 non-null  float64
 26  comercio                       60428 non-null  object
 27  ciudad                         60428 non-null  object
 28  estado                         60428 non-null  object
 29  pies_cuadrados_tienda          60428 non-null  float64
 30  pies_cuadrados_comestibles     60428 non-null  float64
 31  pies_cuadrados_congelados      60428 non-null  float64
 32  pies_cuadrados_carne           60428 non-null  float64
 33  cafeteria                      60428 non-null  float64
 34  tienda_de_videos               60428 non-null  float64
 35  barra_de_ensaladas             60428 non-null  float64
 36  comida_preparada               60428 non-null  float64
 37  floristeria                    60428 non-null  float64
 38  divulgacion                    60428 non-null  object
 39  costo                          60428 non-null  float64
dtypes: float64(23), int64(1), object(16)
memory usage: 18.4+ MB

#3. Exploración de los datos

La exploración visual de datos permite a los científicos de datos examinar y explorar grandes volúmenes de datos de manera intuitiva y eficiente. Al representar los datos visualmente, se pueden identificar características importantes, como valores atípicos, distribuciones, correlaciones y agrupaciones, que podrían no ser evidentes al examinar solo los números o las tablas de datos.

Se trata de una herramienta poderosa para comprender, analizar y comunicar información clave presente en los conjuntos de datos, brindando una comprensión más profunda y facilitando la toma de decisiones informadas.

  1. Haciendo uso de Matplotlib y Seaborn vamos a generar diversos gráficos para entender mejor nuestros datos.

  2. Ejemplo: A través de un histograma, podrás observar la distribución de ingresos anuales de los clientes, por ejemplo. (Siéntete libre de escoger las variables que desees visualizar, y genera varios gráficos, según lo consideres pertinente)

  3. Es importante que escribas todas tus observaciones e hipótesis en la medida que generes los gráficos. Puedes utilizar una celda de texto de tu notebook para hacerlo.

Tip: Voy a dejar a continuación algunas variables que pueden ser de interés para tenerlas en cuenta en tu análisis visual: Escolaridad, Ocupación, Miembro, Género, Estado Civil, Número de Hijos, Ingresos_anuales, Categoría de alimentos, Tipo, entre otras.

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.barplot(x='escolaridad', y='ingreso_anual', data=df, ax=ax1)
ax1.set_title("Ingreso Anual", fontsize=12)
ax1.set_xlabel("Escolaridad", fontsize=10)
ax1.set_ylabel("Ingreso", fontsize=10)

# Gráfico derecho
sns.barplot(x='escolaridad', y='numero_hijos', data=df, ax=ax2)
ax2.set_title("Número de Hijos", fontsize=12)
ax2.set_xlabel("Escolaridad", fontsize=10)
ax2.set_ylabel("Número de Hijos", fontsize=10)

# Ajustar espaciado entre subplots
plt.tight_layout()

plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.violinplot(x='ocupacion', y='ventas_unitarias(en millones)', data=df, ax=ax1)
ax1.set_title("Ventas Unitarias por Ocupación (en millones)", fontsize=12)
ax1.set_xlabel("Ocupación", fontsize=10)
ax1.set_ylabel("Ventas Unitarias", fontsize=10)

# Gráfico derecho
sns.violinplot(x='ocupacion', y='costo_tienda(en millones)', data=df, ax=ax2)
ax2.set_title("Costo Tienda por Ocupación (en millones)", fontsize=12)
ax2.set_xlabel("Ocupación", fontsize=10)
ax2.set_ylabel("Costo Tienda", fontsize=10)

# Ajustar espaciado entre subplots
plt.tight_layout()

plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.boxplot(x='miembro', y='ingreso_anual', data=df, ax=ax1)
ax1.set_title('Ingreso Anual', fontsize=12)
ax1.set_xlabel('Miembro', fontsize=10)
ax1.set_ylabel('Ingreso', fontsize=10)

# Gráfico derecho
sns.boxplot(x='miembro', y='numero_hijos', data=df, ax=ax2)
ax2.set_title('Número de Hijos', fontsize=12)
ax2.set_xlabel('Miembro', fontsize=10)
ax2.set_ylabel('Número de Hijos', fontsize=10)

plt.tight_layout()
plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.lineplot(x='genero', y='ingreso_anual', data=df, ax=ax1)
ax1.set_title('Ingreso Anual', fontsize=12)
ax1.set_xlabel('Género', fontsize=10)
ax1.set_ylabel('Ingreso', fontsize=10)

# Gráfico derecho
sns.lineplot(x='genero', y='total_de_hijos', data=df, ax=ax2)
ax2.set_title('Total de Hijos', fontsize=12)
ax2.set_xlabel('Género', fontsize=10)
ax2.set_ylabel('Total de Hijos', fontsize=10)

plt.tight_layout()
plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.boxplot(x='estado_civil', y='ventas_tienda(en millones)', data=df, ax=ax1)
ax1.set_title('Ventas de la Tienda', fontsize=12)
ax1.set_xlabel('Estado Civil', fontsize=10)
ax1.set_ylabel('Ventas (millones)', fontsize=10)

# Gráfico derecho
sns.boxplot(x='estado_civil', y='peso_neto', data=df, ax=ax2)
ax2.set_title('Peso Neto', fontsize=12)
ax2.set_xlabel('Estado Civil', fontsize=10)
ax2.set_ylabel('Peso Neto (kg)', fontsize=10)

plt.tight_layout()
plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura
fig, ax = plt.subplots()

# Gráfico de violín
sns.violinplot(x='escolaridad', y='numero_hijos', data=df, ax=ax)

plt.tight_layout()
plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.barplot(x='pais', y='ingreso_anual', data=df, ax=ax1)
ax1.set_ylim(50000, 60000) # Acotar eje y
ax1.set_title("Ingreso Anual vs País", fontsize=12)
ax1.set_xlabel("País", fontsize=10)
ax1.set_ylabel("Ingreso Anual", fontsize=10)

# Gráfico derecho
sns.barplot(x='estado_civil', y='ingreso_anual', data=df, ax=ax2)
ax2.set_ylim(50000, 60000) # Acotar eje y
ax2.set_title("Ingreso Anual vs Estado Civil", fontsize=12)
ax2.set_xlabel("Estado Civil", fontsize=10)
ax2.set_ylabel("Ingreso Anual", fontsize=10)

# Ajustar espaciado entre subplots
plt.tight_layout()

plt.show()

png

import seaborn as sns
import matplotlib.pyplot as plt

# Obtener top 10 categorías
top10_ventas = df['categoria_alimento'].value_counts().index[:10]
top10_costo = df.groupby('categoria_alimento')['costo'].mean().sort_values(ascending=False).index[:10]

# Filtrar df
df_top10 = df[df['categoria_alimento'].isin(top10_ventas) | df['categoria_alimento'].isin(top10_costo)]

# Crear figura con dos subplots
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))

# Gráfico izquierdo
sns.boxplot(x='ventas_unitarias(en millones)', y='categoria_alimento', data=df_top10, ax=ax1)
ax1.set_title("Ventas Unitarias", fontsize=12)
ax1.set_ylabel("Categoría Alimento", fontsize=10)
ax1.set_xlabel("Ventas Unitarias", fontsize=10)

# Gráfico derecho - Barras
ax2.set_xlim(80, 120) # Establecer límites de eje x
sns.barplot(x='costo', y='categoria_alimento', data=df_top10, ax=ax2)
ax2.set_title("Costo", fontsize=12)
ax2.set_ylabel("Costo", fontsize=10)
ax2.set_xlabel("Categoría Alimento", fontsize=10)

# Ajustar espaciado
plt.tight_layout()

plt.show()

png

import matplotlib.pyplot as plt

# Gráficos de torta más pequeños con figsize
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))

# Ventas unitarias
ventas_por_tipo = df.groupby('tipo')['ventas_unitarias(en millones)'].sum()
ax1.pie(ventas_por_tipo, labels=ventas_por_tipo.index, autopct='%1.1f%%')
ax1.set_title("Ventas Unitarias por Tipo")

# Costos
costos_por_tipo = df.groupby('tipo')['costo'].sum()
ax2.pie(costos_por_tipo, labels=costos_por_tipo.index, autopct='%1.1f%%')
ax2.set_title("Costo por Tipo")

plt.tight_layout()
plt.show()

png

#4. Preprocesamiento y Obtención de Features

  1. En esta fase es importante utilizar una forma de codificar las variables categóricas para que el modelo de clusterización las pueda reconocer. Puedes usar one-hot-encoder, get_dummies, o establecer un valor numérico para las variables de acuerdo con tu percepción; por ejemplo, si queremos categorizar primaria, secundaria y universidad, podríamos decir que el valor numérico para primaria podría ser 1, el valor numérico para secundaria, 2, y así sucesivamente. (Es importante aclarar que en ejemplo citado, asignamos los valores a cada nivel porque sabemos que primaria es menor que secundaria, y secundaria menor que universidad)

  2. Tras establecer un método de codificación para tus variables categóricas, debes reemplazar los valores numéricos asignados en el dataset para sustituir las cadenas de texto.

Tip: La pregunta que te debes estar haciendo es: ¿Será que tengo que codificar todas las columnas categóricas del dataset? La respuesta es no; únicamente codifica las columnas que tu consideres que puedan ser relevantes para la clusterización.

  1. Teniendo en cuenta el paso anterior, debes en efecto seleccionar las variables que sean más relevantes para el caso de estudio: Se desea agrupar a los clientes en diversos clusters para entender sus características y brindarles el mejor servicio.

  2. Con tus atributos seleccionados, al menos 6 y máximo 12, procederemos a estandarizar nuestros datos (que en este punto deben ser todos numéricos) para que todas las variables puedan ser tenidas en cuenta dentro de una misma escala. Varios de los hiperparámetros utilizados en las funciones de un modelo de Machine Learning asumen que todas las características están centradas alrededor de 0 y tienen varianza en el mismo orden. Si uno de los atributos del dataset tiene una varianza con orden de magnitud muy superior al de los demás atributos, puede dominar la función del modelo y hacer que el estimador no aprenda correctamente de los otros atributos como se espera. Vamos a utilizar con el StandardScaler. Puedes almacenar los valores estandarizados en una variable llamada X_std , por ejemplo.

¡Vas a obtener un numpy array listo para avanzar a la próxima fase!

df.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda(en millones) costo_tienda(en millones) ventas_unitarias(en millones) promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos(aprox) ingreso_anual numero_hijos promedio_autos(aprox) marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
49698 Productos de baño Salud e higiene No comestible 10.86 3.3666 3.0 Adelante Estados Unidos Soltero Masculino 0.0 Secundaria Bronce Técnico No 3.0 40000 0.0 3.0 Hilltop 3.62 19.30 16.20 0.0 0.0 32.0 Supermercado Portland OR 20319.0 16232.0 2452.0 1635.0 0.0 0.0 0.0 0.0 0.0 Periódico diario, radio 67.01
38768 Alimentos para picar Alimentos para picar Comida 2.04 0.6528 4.0 Ahorro para apostadores grandes Estados Unidos Casado Masculino 1.0 Superior Plata Profesional 3.0 60000 1.0 3.0 Fast 0.51 12.30 11.30 1.0 1.0 26.0 Supermercado gourmet Beverly Hills CA 23688.0 15337.0 5011.0 3340.0 1.0 1.0 1.0 1.0 1.0 Periódico dominical, radio, televisión 95.55
36419 Carne Charcutería Comida 2.98 1.0728 2.0 Descuento de fin de semana Estados Unidos Casado Femenino 2.0 Primaria NaN Obrero 1.0 20000 2.0 1.0 Moms 1.49 11.30 10.30 1.0 0.0 32.0 Supermercado Los Angeles CA 23598.0 14210.0 5633.0 3755.0 0.0 0.0 0.0 0.0 1.0 Panfletos 53.37
4781 Vegetales Productos frescos Comida 7.32 2.9280 4.0 Ahorro de precios México Soltero Masculino 2.0 Secundaria Bronce Profesional 4.0 140000 0.0 4.0 Hermanos 1.83 9.71 8.71 1.0 0.0 6.0 Supermercado Orizaba Veracruz 34791.0 26354.0 5062.0 3375.0 0.0 0.0 1.0 1.0 0.0 Televisión 77.72
780 Pan Productos horneados Comida 6.54 2.8122 2.0 Venta de dos días México Soltero Masculino 1.0 Técnico Bronce Cargo de Oficina 3.0 40000 0.0 3.0 Colony 3.27 7.71 5.71 0.0 0.0 18.0 Supermercado de lujo Hidalgo Zacatecas 30584.0 21938.0 5188.0 3458.0 1.0 1.0 1.0 1.0 1.0 Radio 94.79
print(df["divulgacion"].unique())
['Periódico diario, radio' 'Cupón en la tienda' 'Radio' 'Periódico diario'
 'Anexo del producto' 'Periódico dominical, radio'
 'Periódico dominical, radio, televisión' 'Periódico dominical'
 'Panfletos' 'Televisión' 'Correo masivo' 'Entrega en el punto de venta'
 'Periódico diario, radio, televisión']
import pandas as pd
import numpy as np

df_filter = df.copy()

# Mapear valores a números
categoria_alimento_map={'Alimentos para el desayuno':1,'Pan':2,'Camarones enlatados':3,
                        'Productos para hornear':4,'Vegetales':5,'Postres congelados':6,
                        'Dulces':7,'Alimentos para picar':8,'Productos lácteos':9,
                        'Alimentos ricos en almidón':10,'Suministros de limpieza':11,
                        'Descongestionantes':12,'Carne':13,'Bebidas calientes':14,
                        'Mermeladas y jaleas':15,'Bebidas carbonatadas':16,'Mariscos':17,
                        'Especialidades':18,'Productos de cocina':19,'Eléctrico':20,
                        'Cerveza y vino':21,'Velas':22,'Fruta':23,'Bebidas de jugo puro':24,
                        'Sopa enlatada':25,'Productos de papel':26,'Atún enlatado':27,
                        'Huevos':28,'Artículos de ferretería':29,'Sardinas enlatadas':30,
                        'Almejas enlatadas':31,'Analgésicos':32,'Acompañamientos':33,
                        'Productos de baño':34,'Revistas':35,'Platos preparados congelados':36,
                        'Pizza':37,'Remedios para el resfriado':38,'Anchoas enlatadas':39,
                        'Bebidas':40,'Higiene':41,'Productos de plástico':42,
                        'Ostras enlatadas':43,'Vegetales envasados':44,'Misceláneos':45}
departamento_map={'Alimentos congelados':1, 'Productos horneados':2,
                  'Alimentos enlatados':3,'Productos para hornear':4,
                  'Productos frescos':5, 'Snacks':6, 'Alimentos para picar':7,
                  'Productos lácteos':8, 'Alimentos ricos en almidón':9,
                  'Artículos para el hogar':10, 'Salud e higiene':11, 'Carne':12,
                  'Bebidas':13, 'Mariscos':14, 'Charcutería':15, 'Bebidas alcohólicas':16,
                  'Productos enlatados':17, 'Huevos':18, 'Publicaciones periódicas':19,
                  'Alimentos para el desayuno':20, 'Caja de salida':21, 'Carrusel':22}
tipo_map = {'Comida': 1, 'No comestible': 2, 'Bebida': 3}
promocion_map={'Bolsas llenas':1,'Lotería de la caja registradora':2,
               'Ahorro para apostadores grandes':3,'Venta Doble':4,'Días de luz verde':5,
               'Ahorro Enorme':6, 'Ahorro de precios':7,'Rebajadores de precios':8,
               'Días de dólar':9,'Venta de dos días':10,'Super Ahorradores':11,
               'Descuento de fin de semana':12,'Recortadores de dólares':13,
               'Promociones por montones':14,'Gran promoción':15,'Gratis para todos':16,
               'Ahorros por montones':17,'Ahorro de precios imbatible':18,
               'Aplastadores de precios':19,'Días de liquidación de estanterías':20,
               'Días de venta':21, 'Adelante':22,'Super Ahorro':23,'Ahorradores de billetera':24,
               'Venta Ahorra Ya':25,'Destructores de precios':26,'Dos por uno':27,
               'Descuentos de gran magnitud':28,'Estantes vacíos':29,'Adiós bebé':30,
               'Venta de un día':31,'Descuentos fantásticos':32,'Días de ahorro':33,
               'Ganadores de ventas':34,'Espectacular de cupones':35,'Tres por uno':36,
               'Ganadores de precios':37,'Más barato':38,'Venta No Puedo Creerlo':39,
               'Ahorradores de dinero':40,'Especial luz verde':41,'Rebajando precios':42,
               'Ahorro de primera clase':43,'Mejores ahorros':44,'Elige tus ahorros':45,
               'Duplica tus ahorros':46,'Venta misteriosa':47,
               'Super ahorradores de billetera':48}
pais_map ={'Estados Unidos':1, 'México':2, 'Canadá':3}
estado_civil_map={'Casado':1, 'Soltero':2}
genero_map={'Femenino':1, 'Masculino':2}
estado_map={'OR':1, 'WA':2, 'CA':3, 'Veracruz':4, 'Yucatan':5, 'Zacatecas':6, 'DF':7,
            'BC':8, 'Jalisco':9, 'Guerrero':10}
escolaridad_map={'Primaria':1, 'Superior':2, 'Secundaria':3, 'Maestría':4, 'Técnico':5}
miembro_map = {np.nan: 0, 'Plata': 1, 'Bronce': 2, 'Oro': 3}
ocupacion_map={'Técnico':1, 'Profesional':2, 'Obrero':3, 'Gestión':4, 'Cargo de Oficina':5}
vivienda_propia_map={'Sí':1, 'No':0}
marca_map={'Carrington':1,'Golden':2,'Imagine':3,'Big Time':4,'PigTail':5,'Fantastic':6,
           'Great':7,'Sphinx':8,'Modell':9,'Colony':10,'Blue Label':11,'Pleasant':12,
           'Bravo':13,'Better':14,'Just Right':15,'Plato':16,'BBB Best':17,'Landslide':18,
           'Super':19,'CDR':20,'High Top':21,'Tri-State':22,'Hermanos':23,'Tell Tale':24,
           'Ebony':25,'Thresher':26,'Gulf Coast':27,'Musial':28,'Atomic':29,'Choice':30,
           'Fort West':31,'Nationeel':32,'Horatio':33,'Best Choice':34,'Fast':35,'Gorilla':36,
           'Carlson':37,'Even Better':38,'Club':39,'Booker':40,'Shady Lake':41,'Monarch':42,
           'Discover':43,'Colossal':44,'Medalist':45,'Jardon':46,'Cormorant':47,'Sunset':48,
           'Red Wing':49,'High Quality':50,'Denny':51,'Faux Products':52,'Steady':53,
           'Consolidated':54,'Bird Call':55,'Hilltop':56,'Ship Shape':57,'Footnote':58,
           'Genteel':59,'Quick':60,'Gerolli':61,'Excellent':62,'Fabulous':63,'Token':64,
           'Skinner':65,'Washington':66,'Dual City':67,'Kiwi':68,'Tip Top':69,'Amigo':70,
           'Curlew':71,'Moms':72,'Cutting Edge':73,'Red Spade':74,'Lake':75,'American':76,
           'Walrus':77,'Pearl':78,'Good':79,'Top Measure':80,'Portsmouth':81,'Toucan':82,
           'Applause':83,'Swell':84,'Green Ribbon':85,'Big City':86,'National':87,
           'Blue Medal':88,'Urban':89,'Jumbo':90,'Giant':91,'Dollar':92,'Mighty Good':93,
           'Robust':94,'Gauss':95,'Excel':96,'Radius':97,'Best':98,'Jeffers':99,'Johnson':100,
           'Special':101,'Akron':102,'Framton':103,'Black Tie':104,'Queen':105,'James Bay':106,
           'Toretti':107,'Prelude':108,'Symphony':109,'ADJ':110,'King':111}
comercio_map={'Supermercado de lujo':1, 'Supermercado':2, 'Supermercado gourmet':3,
          'Pequeño supermercado':4, 'Supermercado mediano':5}
ciudad_map={'Salem':1,'Tacoma':2,'Seattle':3,'Spokane':4,'Los Angeles':5,'Beverly Hills':6,
            'Portland':7,'Bellingham':8,'Orizaba':9,'Merida':10,'Hidalgo':11,'Mexico City':12,
            'Vancouver':13,'Bremerton':14,'Camacho':15,'Guadalajara':16,'Acapulco':17,
            'San Francisco':18,'Victoria':19}
divulgacion_map={'Periódico diario, radio':1,'Cupón en la tienda':2,'Radio':3,
                 'Periódico diario':4,'Anexo del producto':5,'Periódico dominical, radio':6,
                 'Periódico dominical, radio, televisión':7,'Periódico dominical':8,
                 'Panfletos':9,'Televisión':10,'Correo masivo':11,
                 'Entrega en el punto de venta':12,'Periódico diario, radio, televisión':13}


df_filter['categoria_alimento'] = df_filter['categoria_alimento'].map(categoria_alimento_map)
df_filter['departamento'] = df_filter['departamento'].map(departamento_map)
df_filter['tipo'] = df_filter['tipo'].map(tipo_map)
df_filter['promocion'] = df_filter['promocion'].map(promocion_map)
df_filter['pais'] = df_filter['pais'].map(pais_map)
df_filter['estado_civil'] = df_filter['estado_civil'].map(estado_civil_map)
df_filter['genero'] = df_filter['genero'].map(genero_map)
df_filter['estado'] = df_filter['estado'].map(estado_map)
df_filter['escolaridad'] = df_filter['escolaridad'].map(escolaridad_map)
df_filter['miembro'] = df_filter['miembro'].map(miembro_map)
df_filter['ocupacion'] = df_filter['ocupacion'].map(ocupacion_map)
df_filter['vivienda_propia'] = df_filter['vivienda_propia'].map(vivienda_propia_map)
df_filter['marca'] = df_filter['marca'].map(marca_map)
df_filter['comercio'] = df_filter['comercio'].map(comercio_map)
df_filter['ciudad'] = df_filter['ciudad'].map(ciudad_map)
df_filter['divulgacion'] = df_filter['divulgacion'].map(divulgacion_map)

df_filter.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda(en millones) costo_tienda(en millones) ventas_unitarias(en millones) promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos(aprox) ingreso_anual numero_hijos promedio_autos(aprox) marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
46056 5 3 1 2.61 0.9918 3.0 5 2 1 1 2.0 2 2 2 0 2.0 60000 1.0 2.0 13 0.87 13.40 11.30 0.0 0.0 32.0 3 15 6 23759.0 16844.0 4149.0 2766.0 1.0 0.0 1.0 1.0 1.0 4 75.76
59222 34 11 2 4.47 2.0562 3.0 5 2 2 2 3.0 1 2 2 0 1.0 80000 0.0 1.0 56 1.49 13.10 10.10 0.0 0.0 9.0 1 10 5 30797.0 20141.0 6393.0 4262.0 1.0 1.0 1.0 1.0 1.0 8 92.57
9292 8 7 1 6.90 3.1050 3.0 48 1 2 1 1.0 4 2 2 1 3.0 40000 0.0 3.0 31 2.30 8.32 6.31 0.0 0.0 23.0 2 7 1 20319.0 16232.0 2452.0 1635.0 0.0 0.0 0.0 0.0 0.0 12 140.19
43814 5 1 1 6.66 2.2644 3.0 21 1 2 1 4.0 2 2 2 0 3.0 60000 0.0 3.0 1 2.22 16.10 14.10 1.0 0.0 29.0 2 4 2 30268.0 22063.0 4923.0 3282.0 0.0 0.0 0.0 0.0 0.0 11 116.74
16994 4 4 1 2.50 1.2250 2.0 36 1 2 1 1.0 1 0 3 0 2.0 20000 0.0 2.0 18 1.25 9.48 6.47 0.0 0.0 27.0 2 14 2 39696.0 24390.0 9184.0 6122.0 0.0 0.0 1.0 1.0 0.0 8 118.25
nan_counts = df_filter.isnull().sum()

print(nan_counts)
categoria_alimento               0
departamento                     0
tipo                             0
ventas_tienda(en millones)       0
costo_tienda(en millones)        0
ventas_unitarias(en millones)    0
promocion                        0
pais                             0
estado_civil                     0
genero                           0
total_de_hijos                   0
escolaridad                      0
miembro                          0
ocupacion                        0
vivienda_propia                  0
promedio_autos(aprox)            0
ingreso_anual                    0
numero_hijos                     0
promedio_autos(aprox)            0
marca                            0
precio_recomendado               0
peso_bruto                       0
peso_neto                        0
empaque_reciclable               0
bajo_en_grasa                    0
unidades_por_caja                0
comercio                         0
ciudad                           0
estado                           0
pies_cuadrados_tienda            0
pies_cuadrados_comestibles       0
pies_cuadrados_congelados        0
pies_cuadrados_carne             0
cafeteria                        0
tienda_de_videos                 0
barra_de_ensaladas               0
comida_preparada                 0
floristeria                      0
divulgacion                      0
costo                            0
dtype: int64
X_std = df_filter[['categoria_alimento','departamento','tipo','ventas_tienda(en millones)',
                   'costo_tienda(en millones)','ventas_unitarias(en millones)','promocion',
                   'pais','estado_civil','genero','total_de_hijos','escolaridad','miembro',
                   'ocupacion','vivienda_propia','promedio_autos(aprox)','ingreso_anual',
                   'numero_hijos','marca','precio_recomendado',
                   'peso_bruto','peso_neto','empaque_reciclable','bajo_en_grasa',
                   'unidades_por_caja','comercio','ciudad','estado','pies_cuadrados_tienda',
                   'pies_cuadrados_comestibles','pies_cuadrados_congelados',
                   'pies_cuadrados_carne','cafeteria','tienda_de_videos','barra_de_ensaladas',
                   'comida_preparada','floristeria','divulgacion','costo']]

X_std.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda(en millones) costo_tienda(en millones) ventas_unitarias(en millones) promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos(aprox) promedio_autos(aprox) ingreso_anual numero_hijos marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
8243 7 6 1 13.75 6.0500 5.0 11 3 1 2 4.0 2 3 2 1 4.0 4.0 80000 4.0 27 2.75 14.7 11.60 0.0 0.0 3.0 1 13 8 23112.0 16418.0 4016.0 2678.0 1.0 1.0 1.0 1.0 1.0 9 51.00
20988 19 10 2 1.89 0.7371 3.0 7 2 2 2 4.0 3 2 3 0 3.0 3.0 40000 0.0 48 0.63 14.5 13.50 1.0 0.0 3.0 2 9 4 34791.0 26354.0 5062.0 3375.0 0.0 0.0 1.0 1.0 0.0 10 77.72
828 2 2 1 5.04 2.3184 4.0 4 3 2 2 2.0 1 0 1 1 1.0 1.0 20000 0.0 9 1.26 10.3 9.30 1.0 1.0 10.0 1 13 8 23112.0 16418.0 4016.0 2678.0 1.0 1.0 1.0 1.0 1.0 3 53.21
6329 5 5 1 6.08 2.2496 4.0 5 2 1 1 5.0 5 1 2 0 3.0 3.0 140000 5.0 21 1.52 10.7 7.69 0.0 1.0 4.0 3 15 6 23759.0 16844.0 4149.0 2766.0 1.0 0.0 1.0 1.0 1.0 4 75.76
31889 25 3 1 2.28 1.0488 4.0 44 1 2 1 4.0 1 0 1 0 0.0 0.0 20000 0.0 14 0.57 16.9 14.80 1.0 0.0 6.0 2 3 2 21215.0 13305.0 4746.0 3164.0 1.0 0.0 0.0 0.0 0.0 9 114.01
X_std['ventas_unitarias(en millones)'] = X_std['ventas_unitarias(en millones)'].astype('int64')
X_std['total_de_hijos'] = X_std['total_de_hijos'].astype('int64')
X_std['cafeteria'] = X_std['cafeteria'].astype('int64')
X_std['tienda_de_videos'] = X_std['tienda_de_videos'].astype('int64')
X_std['barra_de_ensaladas'] = X_std['barra_de_ensaladas'].astype('int64')
X_std['comida_preparada'] = X_std['comida_preparada'].astype('int64')
X_std['floristeria'] = X_std['floristeria'].astype('int64')
X_std['promedio_autos(aprox)'] = X_std['promedio_autos(aprox)'].astype('int64')
X_std['numero_hijos'] = X_std['numero_hijos'].astype('int64')
X_std['empaque_reciclable'] = X_std['empaque_reciclable'].astype('int64')
X_std['bajo_en_grasa'] = X_std['bajo_en_grasa'].astype('int64')
X_std['unidades_por_caja'] = X_std['unidades_por_caja'].astype('int64')
X_std = X_std.rename(columns={'ventas_tienda(en millones)':'ventas_tienda_millones'})
X_std = X_std.rename(columns={'costo_tienda(en millones)':'costo_tienda_millones'})
X_std = X_std.rename(columns={'ventas_unitarias(en millones)':'ventas_unitarias_millones'})
X_std = X_std.rename(columns={'promedio_autos(aprox)':'promedio_autos'})

X_std.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60428 entries, 0 to 60427
Data columns (total 40 columns):
 #   Column                      Non-Null Count  Dtype
---  ------                      --------------  -----
 0   categoria_alimento          60428 non-null  int64
 1   departamento                60428 non-null  int64
 2   tipo                        60428 non-null  int64
 3   ventas_tienda_millones      60428 non-null  float64
 4   costo_tienda_millones       60428 non-null  float64
 5   ventas_unitarias_millones   60428 non-null  int64
 6   promocion                   60428 non-null  int64
 7   pais                        60428 non-null  int64
 8   estado_civil                60428 non-null  int64
 9   genero                      60428 non-null  int64
 10  total_de_hijos              60428 non-null  int64
 11  escolaridad                 60428 non-null  int64
 12  miembro                     60428 non-null  int64
 13  ocupacion                   60428 non-null  int64
 14  vivienda_propia             60428 non-null  int64
 15  promedio_autos              60428 non-null  int64
 16  promedio_autos              60428 non-null  int64
 17  ingreso_anual               60428 non-null  int64
 18  numero_hijos                60428 non-null  int64
 19  marca                       60428 non-null  int64
 20  precio_recomendado          60428 non-null  float64
 21  peso_bruto                  60428 non-null  float64
 22  peso_neto                   60428 non-null  float64
 23  empaque_reciclable          60428 non-null  int64
 24  bajo_en_grasa               60428 non-null  int64
 25  unidades_por_caja           60428 non-null  int64
 26  comercio                    60428 non-null  int64
 27  ciudad                      60428 non-null  int64
 28  estado                      60428 non-null  int64
 29  pies_cuadrados_tienda       60428 non-null  float64
 30  pies_cuadrados_comestibles  60428 non-null  float64
 31  pies_cuadrados_congelados   60428 non-null  float64
 32  pies_cuadrados_carne        60428 non-null  float64
 33  cafeteria                   60428 non-null  int64
 34  tienda_de_videos            60428 non-null  int64
 35  barra_de_ensaladas          60428 non-null  int64
 36  comida_preparada            60428 non-null  int64
 37  floristeria                 60428 non-null  int64
 38  divulgacion                 60428 non-null  int64
 39  costo                       60428 non-null  float64
dtypes: float64(10), int64(30)
memory usage: 18.4 MB
X_std.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda_millones costo_tienda_millones ventas_unitarias_millones promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos promedio_autos ingreso_anual numero_hijos marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
52616 41 11 2 10.70 3.5310 5 16 1 1 1 3 2 3 4 1 4 4 80000 3 53 2.14 8.89 5.89 0 0 26 1 2 2 33858.0 22123.0 7041.0 4694.0 1 0 1 1 1 9 55.18
47231 7 6 1 4.32 1.6416 2 26 2 2 2 5 1 0 1 0 1 1 20000 0 29 2.16 17.50 15.50 0 1 32 1 11 6 30584.0 21938.0 5188.0 3458.0 1 1 1 1 1 12 148.62
59238 34 11 2 4.35 1.3050 3 30 2 1 1 1 3 2 1 0 3 3 40000 0 53 1.45 9.65 7.64 1 0 14 5 12 7 36509.0 22450.0 8435.0 5624.0 0 0 0 0 0 8 141.39
1756 4 4 1 3.08 1.3552 4 45 2 1 1 2 1 0 3 1 0 0 20000 1 16 0.77 13.40 10.30 1 1 26 1 11 6 30584.0 21938.0 5188.0 3458.0 1 1 1 1 1 7 141.38
20039 18 5 1 5.04 2.1672 3 12 1 2 1 1 1 0 1 0 1 1 20000 0 25 1.68 17.20 14.20 1 1 8 2 3 2 21215.0 13305.0 4746.0 3164.0 1 0 0 0 0 1 69.63

#5. Clusterización y validación

##Clusterización

  1. El algoritmo recomendado para la clusterización es KMeans, sin embargo, eres libre de utilizar cualquier otro algoritmo como Mean Shift o, incluso, DBSCAN. Lo importante es hallar el mejor número de clusters.
from sklearn.preprocessing import Normalizer

values = Normalizer().fit_transform(X_std.values)
values
array([[2.53355590e-05, 2.53355590e-05, 2.53355590e-05, ...,
        2.53355590e-05, 2.53355590e-05, 3.20798848e-03],
       [1.44974962e-05, 1.44974962e-05, 1.44974962e-05, ...,
        1.44974962e-05, 1.44974962e-05, 8.67820124e-04],
       [2.53356320e-05, 2.53356320e-05, 2.53356320e-05, ...,
        2.53356320e-05, 2.53356320e-05, 2.13224679e-03],
       ...,
       [3.70003343e-04, 4.52226308e-04, 4.11114826e-05, ...,
        0.00000000e+00, 1.43890189e-04, 1.38771809e-03],
       [1.96787923e-04, 2.40518573e-04, 2.18653248e-05, ...,
        1.09326624e-05, 8.74612992e-05, 1.45273218e-03],
       [3.70009261e-04, 4.52233541e-04, 4.11121401e-05, ...,
        2.05560700e-05, 2.05560700e-05, 1.80400071e-03]])
from sklearn.cluster import KMeans

kmeans = KMeans(n_clusters=5, n_init=10, max_iter=300)
y_pred = kmeans.fit_predict(values)

##Validación

  1. Número de clusters: Debes instanciar de 3 a máximo 10 clusters con el(los) algoritmo(s) seleccionado(s), utilizando X_std y obtener cómo mínimo el puntaje de Silhouette, aunque te recomiendo utilizar otras métricas como Davies-Bouldin y Calinski and Harabasz para que puedas decidir cuál es la mejor configuración para el número de clusters.

    Restricciones: (El puntaje mínimo de Silhouette debe ser de 0.50; el de Davies-Bouldin máximo de 0.75; y el de CalinskiHarabasz, el número más alto posible.)

  2. Estructura: Debes evaluar la estructura de los clusters tomando como referencia una baseline. Para generar la baseline, vamos a generar números aleatorios con el módulo random de numpy con las mismas dimensiones de tu dataset X_std y lo vas a almacenar en una variable llamada random_data y vas a repetir el paso 2. Analiza los puntajes da la(s) métrica(s) utilizada y asegúrate de que tu X_std tiene un desempeño muy superior al de random_data.

  3. Estabilidad: Finalmente, debes evaluar la estabilidad de los clusters con el número de clusters seleccionado en el paso 2. Para ello, debes segmentar X_std en 3 o 5 partes iguales, (puedes apoyarte en la función array_split() de numpy, y almacenar cada fragmento del dataset en una variable llamada set_1, set_2, ..., set_n) y repetir los pasos de validación para el número de clusters escogido en cada uno de los sets. Aquí lo verdaderamente importante es que los puntajes no presenten una variación mayor a ±5% entre sí. Esto va a garantizar que hay homogeneidad en la composición de los clusters.

Si has logrado llevar a cabo con éxito los pasos anteriores, puedes avanzar a la próxima fase. En caso contrario, verifica nuevamente las variables: añade, remueve, cambia por otras, y repite de nuevo los pasos de la tarjeta anterior para poder repetir los pasos de esta tarjeta hasta que obtengas los resultados sugeridos.

from sklearn import metrics

labels = kmeans.labels_

silhouette = metrics.silhouette_score(values, labels, metric='euclidean')
print(silhouette)
0.5352733712987886
dbs = metrics.davies_bouldin_score(values, labels)
print(dbs)
0.5845848355952169
calinski = metrics.calinski_harabasz_score(values, labels)
print(calinski)
248671.8844556791
scores= []

for s in range(3,11):
  score={}
  kmeans = KMeans(n_clusters= s, n_init=10, max_iter= 300)
  y_pred = kmeans.fit_predict(values)
  labels = kmeans.labels_
  score['N_Clusters'] = s
  score['Silhouette'] = metrics.silhouette_score(values, labels, metric='euclidean')
  score['Davies-Bouldin'] = metrics.davies_bouldin_score(values, labels)
  score['Calinski-Harabasz'] = metrics.calinski_harabasz_score(values, labels)
  scores.append(score)

table = pd.DataFrame(scores)
table
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
N_Clusters Silhouette Davies-Bouldin Calinski-Harabasz
0 3 0.575792 0.545360 197252.435022
1 4 0.538342 0.576338 211771.411390
2 5 0.535273 0.584585 248671.884456
3 6 0.547922 0.611305 296370.912708
4 7 0.542302 0.613893 301186.729127
5 8 0.544900 0.625250 295784.826934
6 9 0.517273 0.734864 296932.908036
7 10 0.498212 0.784870 295121.956476

##Instanciando la mejor configuración de clusters

  1. Vas a instanciar el algoritmo de clusterización una vez , con la configuración escogida, y vas a crear un nuevo atributo en el dataset datos_raw llamado 'cluster' para almacenar los labels de los clusters.

    Nota: Te sugiero que no ejecutes KMeans de nuevo, porque los clusters van a cambiar de label y color con cada ejecución del algoritmo.

  2. Vas a realizar varios gráficos de dispersión para comparar las variables añadiendo una tercera dimensión con los clusters en el parámetro hue del gráfico. Trata de describir tus observaciones. Por ejemplo: En el cluster 0, de color rojo, se encuentran agrupados los clientes que gastan más dinero en productos no comestibles.

Repite el paso anterior hasta que puedas obtener varias descripciones de cada uno de los clusters.

¡Ten buen ánimo y adelante que ya estás en la recta final!

import numpy as np

random_data = np.random.rand(60428,40)

scores= []

for s in range(3,11):
  score={}
  kmeans = KMeans(n_clusters= s, n_init=10, max_iter= 300)
  y_pred = kmeans.fit_predict(random_data)
  labels = kmeans.labels_
  score['N_Clusters'] = s
  score['Silhouette'] = metrics.silhouette_score(random_data, labels, metric='euclidean')
  score['Davies-Bouldin'] = metrics.davies_bouldin_score(random_data, labels)
  score['Calinski-Harabasz'] = metrics.calinski_harabasz_score(random_data, labels)
  scores.append(score)

random_data = pd.DataFrame(scores)
random_data
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
N_Clusters Silhouette Davies-Bouldin Calinski-Harabasz
0 3 0.015365 6.572858 948.065238
1 4 0.015080 6.469964 831.855857
2 5 0.014512 5.954636 738.331278
3 6 0.014367 5.599739 671.767696
4 7 0.014182 5.462235 618.858338
5 8 0.013996 5.214281 577.613804
6 9 0.013992 5.057696 542.671464
7 10 0.013937 4.951830 513.183774
set1,set2,set3,set4,set5,set6,set7,set8,set9,set10,set11,set12 = np.array_split(values,12)
sets = [set1,set2,set3,set4,set5,set6,set7,set8,set9,set10,set11,set12]

scores= []
n=1
for set_ in sets:
  score={}
  kmeans = KMeans(n_clusters= 7, n_init=10, max_iter= 300)
  y_pred = kmeans.fit_predict(set_)
  labels = kmeans.labels_
  score['Set'] = f'set{n}'
  n += 1
  score['Silhouette'] = metrics.silhouette_score(set_, labels, metric='euclidean')
  score['Davies-Bouldin'] = metrics.davies_bouldin_score(set_, labels)
  score['Calinski-Harabasz'] = metrics.calinski_harabasz_score(set_, labels)
  scores.append(score)

datos_raw = pd.DataFrame(scores)
datos_raw
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Set Silhouette Davies-Bouldin Calinski-Harabasz
0 set1 0.549975 0.615592 26095.828477
1 set2 0.547154 0.605508 24494.738300
2 set3 0.544430 0.612219 25032.404405
3 set4 0.545244 0.607009 25665.988326
4 set5 0.509466 0.660016 24628.177579
5 set6 0.549379 0.608522 24905.403881
6 set7 0.535179 0.619307 24222.956940
7 set8 0.542868 0.611956 25006.426084
8 set9 0.541970 0.610896 25427.453831
9 set10 0.542398 0.621619 25685.796319
10 set11 0.538981 0.622191 24458.451420
11 set12 0.539179 0.613452 25026.559504
kmeans = KMeans(n_clusters= 7, n_init=10, max_iter= 300)
y_pred = kmeans.fit_predict(values)
labels = kmeans.labels_

X_std['CLUSTER'] = labels

import matplotlib.pyplot as plt

plt.figure(figsize=(12,8))
plt.scatter(X_std['ventas_tienda_millones'], X_std['costo_tienda_millones'], c=labels, s=6, cmap='gist_rainbow')
plt.xlabel('Ventas en la Tienda (millones)')
plt.ylabel('Costos en la Tienda (millones)')

plt.show
<function matplotlib.pyplot.show(close=None, block=None)>

png

X_std.sample(5)
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda_millones costo_tienda_millones ventas_unitarias_millones promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos promedio_autos ingreso_anual numero_hijos marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo CLUSTER
29170 13 15 1 4.74 1.7538 2 24 1 2 2 1 1 0 1 1 0 0 20000 0 73 2.37 12.90 11.80 0 1 13 2 4 2 30268.0 22063.0 4923.0 3282.0 0 0 0 0 0 7 79.95 3
41425 33 15 1 1.94 0.8342 2 26 1 2 1 3 1 2 2 1 2 2 140000 0 74 0.97 8.83 6.82 0 0 6 2 5 3 23598.0 14210.0 5633.0 3755.0 0 0 0 0 1 10 135.92 6
8024 7 6 1 4.74 2.2752 3 7 2 1 1 1 2 2 2 1 2 2 60000 1 26 1.58 10.30 8.30 1 0 7 2 9 4 34791.0 26354.0 5062.0 3375.0 0 0 1 1 0 10 77.72 2
53756 5 1 1 13.28 5.4448 4 44 1 1 2 2 2 2 2 1 2 2 60000 1 4 3.32 7.20 6.19 1 0 21 3 6 3 23688.0 15337.0 5011.0 3340.0 1 1 1 1 1 13 53.82 5
13332 14 13 3 11.48 4.1328 4 5 1 2 1 2 2 2 4 1 3 3 60000 0 17 2.87 17.10 15.10 0 0 34 1 1 1 27694.0 18670.0 5415.0 3610.0 1 1 1 1 1 4 66.27 5

#6. Descripción de los clusters

¡Excelente trabajo! Los clusters generados tienen una descripción y ahora es el momento de analizar cada una da las descripciones.

  1. Debes generar en una celda de texto el resultado consolidado de tu análisis.
X_std.groupby('CLUSTER').describe()
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead tr th {
    text-align: left;
}

.dataframe thead tr:last-of-type th {
    text-align: right;
}
</style>
categoria_alimento departamento tipo ventas_tienda_millones costo_tienda_millones ventas_unitarias_millones promocion pais estado_civil genero total_de_hijos escolaridad miembro ocupacion vivienda_propia promedio_autos ingreso_anual numero_hijos marca precio_recomendado peso_bruto peso_neto empaque_reciclable bajo_en_grasa unidades_por_caja comercio ciudad estado pies_cuadrados_tienda pies_cuadrados_comestibles pies_cuadrados_congelados pies_cuadrados_carne cafeteria tienda_de_videos barra_de_ensaladas comida_preparada floristeria divulgacion costo
count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max
CLUSTER
0 6719.0 16.018157 11.401139 1.0 7.0 13.0 23.0 45.0 6719.0 7.813663 4.980981 1.0 4.0 7.0 11.0 22.0 6719.0 1.382497 0.648926 1.0 1.0 1.0 2.0 3.0 6719.0 6.534888 3.442566 0.51 3.8600 5.91 8.64 19.90 6719.0 2.616995 1.442993 0.1632 1.528200 2.3730 3.449550 9.7265 6719.0 3.098824 0.831465 1.0 3.0 3.0 4.0 6.0 6719.0 22.140944 12.753622 1.0 11.0 21.0 33.0 48.0 6719.0 1.454681 0.623060 1.0 1.0 1.0 2.0 3.0 6719.0 1.470606 0.499172 1.0 1.0 1.0 2.0 2.0 6719.0 1.512427 0.499883 1.0 1.0 2.0 2.0 2.0 6719.0 2.492186 1.451987 0.0 1.0 2.0 4.0 5.0 6719.0 2.561095 1.089796 1.0 2.0 2.0 3.0 5.0 6719.0 1.929751 0.653026 0.0 2.0 2.0 2.0 3.0 6719.0 2.611401 0.921475 2.0 2.0 2.0 4.0 4.0 6719.0 0.679268 0.466793 0.0 0.0 1.0 1.0 1.0 6719.0 2.484894 0.937161 1.0 2.0 3.0 3.0 4.0 6719.0 2.484894 0.937161 1.0 2.0 3.0 3.0 4.0 6719.0 100202.411073 22740.641045 80000.0 80000.0 100000.0 120000.0 160000.0 6719.0 0.830630 1.249546 0.0 0.0 0.0 1.0 5.0 6719.0 36.756511 25.254382 1.0 18.0 33.0 51.0 111.0 6719.0 2.112741 0.927165 0.5 1.42 2.13 2.78 3.98 6719.0 13.853000 4.597272 6.0 9.79 13.7 17.8 21.9 6719.0 11.831424 4.670995 3.05 7.80 11.6 16.00 20.8 6719.0 0.560947 0.496309 0.0 0.0 1.0 1.0 1.0 6719.0 0.346778 0.475980 0.0 0.0 0.0 1.0 1.0 6719.0 18.639827 10.287779 1.0 9.00 19.0 28.0 36.0 6719.0 1.999107 0.995972 1.0 1.0 2.0 2.0 5.0 6719.0 8.159399 4.721513 1.0 4.0 7.0 12.0 19.0 6719.0 3.747730 2.455784 1.0 2.0 3.0 6.0 10.0 6719.0 27472.634321 5888.038463 20319.0 23112.0 23759.0 30797.0 39696.0 6719.0 18760.949546 4060.769026 13305.0 15337.0 17475.0 22063.0 30351.0 6719.0 5227.030064 1632.846700 2452.0 4149.0 5011.0 6393.0 9184.0 6719.0 3484.615717 1088.418572 1635.0 2766.0 3340.0 4262.0 6122.0 6719.0 0.615568 0.486497 0.0 0.0 1.0 1.0 1.0 6719.0 0.346034 0.475739 0.0 0.0 0.0 1.0 1.0 6719.0 0.590713 0.491739 0.0 0.0 1.0 1.0 1.0 6719.0 0.590713 0.491739 0.0 0.0 1.0 1.0 1.0 6719.0 0.562286 0.496142 0.0 0.0 1.0 1.0 1.0 6719.0 6.579402 3.757208 1.0 3.0 6.0 10.0 13.0 6719.0 99.787136 29.439739 50.79 73.27 98.81 126.24 149.75
1 7184.0 15.847996 11.217355 1.0 7.0 13.0 23.0 45.0 7184.0 7.856487 4.921025 1.0 4.0 7.0 11.0 22.0 7184.0 1.379872 0.651873 1.0 1.0 1.0 2.0 3.0 7184.0 6.535227 3.575841 0.51 3.6800 5.86 8.72 19.90 7184.0 2.624038 1.505865 0.1792 1.448850 2.3524 3.534150 9.5250 7184.0 3.096604 0.846655 1.0 3.0 3.0 4.0 5.0 7184.0 22.942650 12.740289 1.0 12.0 22.0 33.0 48.0 7184.0 1.365535 0.644978 1.0 1.0 1.0 2.0 3.0 7184.0 1.522829 0.499513 1.0 1.0 2.0 2.0 2.0 7184.0 1.510022 0.499934 1.0 1.0 2.0 2.0 2.0 7184.0 2.528257 1.462619 0.0 1.0 3.0 4.0 5.0 7184.0 1.526448 1.037845 1.0 1.0 1.0 1.0 5.0 7184.0 0.543012 0.965124 0.0 0.0 0.0 1.0 3.0 7184.0 2.075306 1.082190 1.0 1.0 2.0 3.0 5.0 7184.0 0.573775 0.494562 0.0 0.0 1.0 1.0 1.0 7184.0 1.347300 1.017355 0.0 1.0 1.0 2.0 4.0 7184.0 1.347300 1.017355 0.0 1.0 1.0 2.0 4.0 7184.0 24120.267261 8089.366585 20000.0 20000.0 20000.0 20000.0 40000.0 7184.0 0.794961 1.295264 0.0 0.0 0.0 1.0 5.0 7184.0 37.064449 24.964938 1.0 19.0 33.0 51.0 111.0 7184.0 2.103470 0.943698 0.5 1.38 2.13 2.78 3.98 7184.0 13.868502 4.624514 6.0 9.75 13.7 17.9 21.9 7184.0 11.856224 4.684531 3.05 7.77 11.6 16.10 20.8 7184.0 0.555540 0.496940 0.0 0.0 1.0 1.0 1.0 7184.0 0.353703 0.478152 0.0 0.0 0.0 1.0 1.0 7184.0 18.811665 10.238437 1.0 9.75 19.0 28.0 36.0 7184.0 2.314727 0.872284 1.0 2.0 2.0 3.0 5.0 7184.0 9.387667 4.768647 3.0 5.0 7.0 14.0 18.0 7184.0 3.656459 2.683140 1.0 2.0 3.0 6.0 10.0 7184.0 25953.479677 6973.816914 20319.0 21215.0 23598.0 23759.0 39696.0 7184.0 17494.010301 4486.158512 13305.0 14210.0 16232.0 17475.0 30351.0 7184.0 5075.773107 2041.601544 2452.0 4016.0 4746.0 5633.0 9184.0 7184.0 3383.741787 1360.750479 1635.0 2678.0 3164.0 3755.0 6122.0 7184.0 0.461442 0.498546 0.0 0.0 0.0 1.0 1.0 7184.0 0.213948 0.410119 0.0 0.0 0.0 0.0 1.0 7184.0 0.434716 0.495754 0.0 0.0 0.0 1.0 1.0 7184.0 0.434716 0.495754 0.0 0.0 0.0 1.0 1.0 7184.0 0.390590 0.487917 0.0 0.0 0.0 1.0 1.0 7184.0 7.108714 3.952208 1.0 4.0 7.0 11.0 13.0 7184.0 102.537609 30.087471 51.00 75.76 106.10 129.50 149.75
2 13249.0 15.878406 11.358319 1.0 7.0 13.0 24.0 45.0 13249.0 7.889048 4.966106 1.0 4.0 7.0 11.0 22.0 13249.0 1.384784 0.655383 1.0 1.0 1.0 2.0 3.0 13249.0 6.577622 3.464084 0.52 3.8400 6.00 8.70 19.90 13249.0 2.632508 1.449975 0.1953 1.518000 2.4054 3.505500 9.0945 13249.0 3.096083 0.829733 1.0 3.0 3.0 4.0 6.0 13249.0 22.672504 12.701308 1.0 12.0 22.0 33.0 48.0 13249.0 1.477017 0.682624 1.0 1.0 1.0 2.0 3.0 13249.0 1.502000 0.500015 1.0 1.0 2.0 2.0 2.0 13249.0 1.466601 0.498902 1.0 1.0 1.0 2.0 2.0 13249.0 2.578761 1.478613 0.0 1.0 3.0 4.0 5.0 13249.0 2.775153 1.090458 1.0 2.0 3.0 3.0 5.0 13249.0 1.942939 0.661373 0.0 2.0 2.0 2.0 3.0 13249.0 2.292022 1.104488 1.0 1.0 2.0 3.0 5.0 13249.0 0.578157 0.493872 0.0 0.0 1.0 1.0 1.0 13249.0 2.548796 0.959738 1.0 2.0 3.0 3.0 4.0 13249.0 2.548796 0.959738 1.0 2.0 3.0 3.0 4.0 13249.0 47836.063099 11149.442999 40000.0 40000.0 40000.0 60000.0 80000.0 13249.0 0.889954 1.343360 0.0 0.0 0.0 2.0 5.0 13249.0 37.077138 25.170741 1.0 18.0 33.0 52.0 111.0 13249.0 2.121408 0.925099 0.5 1.43 2.13 2.80 3.98 13249.0 13.835425 4.622013 6.0 9.71 13.6 17.8 21.9 13249.0 11.826391 4.686204 3.05 7.75 11.6 16.00 20.8 13249.0 0.563363 0.495988 0.0 0.0 1.0 1.0 1.0 13249.0 0.348781 0.476603 0.0 0.0 0.0 1.0 1.0 13249.0 18.958110 10.266305 1.0 10.00 20.0 28.0 36.0 13249.0 2.076685 0.919630 1.0 2.0 2.0 2.0 5.0 13249.0 8.612348 4.692500 2.0 5.0 7.0 13.0 19.0 13249.0 3.787154 2.503074 1.0 2.0 3.0 6.0 10.0 13249.0 26608.861876 6085.229383 20319.0 22478.0 23688.0 30797.0 39696.0 13249.0 18211.873802 4198.366284 13305.0 15337.0 16418.0 22063.0 30351.0 13249.0 5038.183863 1694.409428 2452.0 4016.0 4923.0 5633.0 9184.0 13249.0 3358.754095 1129.403360 1635.0 2678.0 3282.0 3755.0 6122.0 13249.0 0.560873 0.496299 0.0 0.0 1.0 1.0 1.0 13249.0 0.277606 0.447835 0.0 0.0 0.0 1.0 1.0 13249.0 0.521624 0.499551 0.0 0.0 1.0 1.0 1.0 13249.0 0.521624 0.499551 0.0 0.0 1.0 1.0 1.0 13249.0 0.495585 0.499999 0.0 0.0 0.0 1.0 1.0 13249.0 6.888218 3.851519 1.0 4.0 7.0 10.0 13.0 13249.0 102.290299 29.921509 51.00 76.41 102.47 129.50 149.75
3 7255.0 15.697726 11.314660 1.0 7.0 13.0 23.0 45.0 7255.0 7.842867 5.033344 1.0 4.0 7.0 11.0 22.0 7255.0 1.364438 0.639697 1.0 1.0 1.0 2.0 3.0 7255.0 6.519322 3.377506 0.52 3.9000 5.97 8.56 19.75 7255.0 2.615060 1.422929 0.1705 1.543900 2.3976 3.456000 8.9500 7255.0 3.073191 0.809045 1.0 3.0 3.0 4.0 6.0 7255.0 21.648105 13.417428 1.0 10.0 22.0 34.0 48.0 7255.0 1.397519 0.520804 1.0 1.0 1.0 2.0 3.0 7255.0 1.493039 0.499986 1.0 1.0 1.0 2.0 2.0 7255.0 1.463542 0.498703 1.0 1.0 1.0 2.0 2.0 7255.0 2.389387 1.489092 0.0 1.0 2.0 4.0 5.0 7255.0 1.139904 0.511381 1.0 1.0 1.0 1.0 5.0 7255.0 0.170503 0.602138 0.0 0.0 0.0 0.0 3.0 7255.0 1.904618 1.009603 1.0 1.0 1.0 3.0 5.0 7255.0 0.531633 0.499033 0.0 0.0 1.0 1.0 1.0 7255.0 0.873329 0.681047 0.0 0.0 1.0 1.0 2.0 7255.0 0.873329 0.681047 0.0 0.0 1.0 1.0 2.0 7255.0 20000.000000 0.000000 20000.0 20000.0 20000.0 20000.0 20000.0 7255.0 0.757960 1.242068 0.0 0.0 0.0 1.0 5.0 7255.0 36.909028 25.492280 1.0 18.0 32.0 52.0 111.0 7255.0 2.127858 0.933107 0.5 1.43 2.15 2.80 3.98 7255.0 13.685054 4.593611 6.0 9.63 13.4 17.5 21.9 7255.0 11.673932 4.657111 3.05 7.63 11.3 15.70 20.8 7255.0 0.555479 0.496947 0.0 0.0 1.0 1.0 1.0 7255.0 0.349139 0.476731 0.0 0.0 0.0 1.0 1.0 7255.0 18.985665 10.268000 1.0 10.00 20.0 28.0 36.0 7255.0 1.719779 1.162157 1.0 1.0 1.0 2.0 5.0 7255.0 7.024397 4.964149 1.0 2.0 9.0 11.0 19.0 7255.0 3.194624 2.010422 1.0 2.0 2.0 5.0 8.0 7255.0 32487.966092 3776.713279 27694.0 30268.0 30797.0 34791.0 39696.0 7255.0 22174.368573 2531.526823 18670.0 20141.0 22063.0 22450.0 30351.0 7255.0 6188.274845 1489.697279 3561.0 5062.0 5415.0 7041.0 9184.0 7255.0 4125.404273 993.055541 2374.0 3375.0 3610.0 4694.0 6122.0 7255.0 0.619435 0.485559 0.0 0.0 1.0 1.0 1.0 7255.0 0.400138 0.489960 0.0 0.0 0.0 1.0 1.0 7255.0 0.767609 0.422386 0.0 1.0 1.0 1.0 1.0 7255.0 0.767609 0.422386 0.0 1.0 1.0 1.0 1.0 7255.0 0.595314 0.490865 0.0 0.0 1.0 1.0 1.0 7255.0 6.509580 3.810494 1.0 3.0 6.0 10.0 13.0 7255.0 96.568673 30.127996 50.79 68.91 95.21 123.61 149.08
4 9552.0 15.860762 11.394961 1.0 7.0 13.0 23.0 45.0 9552.0 7.743928 4.951483 1.0 4.0 7.0 11.0 22.0 9552.0 1.384213 0.653906 1.0 1.0 1.0 2.0 3.0 9552.0 6.619889 3.488748 0.58 3.8700 6.16 8.73 19.90 9552.0 2.655329 1.466884 0.2496 1.522425 2.4207 3.510225 9.5305 9552.0 3.124477 0.830461 1.0 3.0 3.0 4.0 6.0 9552.0 20.793446 13.066999 1.0 9.0 22.0 31.0 46.0 9552.0 1.448178 0.523388 1.0 1.0 1.0 2.0 3.0 9552.0 1.502827 0.500018 1.0 1.0 2.0 2.0 2.0 9552.0 1.505549 0.499995 1.0 1.0 2.0 2.0 2.0 9552.0 2.711474 1.486505 0.0 2.0 3.0 4.0 5.0 9552.0 3.044075 1.164172 1.0 3.0 3.0 3.0 5.0 9552.0 2.021880 0.615000 0.0 2.0 2.0 2.0 3.0 9552.0 2.171587 1.145282 1.0 1.0 2.0 3.0 5.0 9552.0 0.576214 0.494183 0.0 0.0 1.0 1.0 1.0 9552.0 2.533396 0.924279 1.0 2.0 3.0 3.0 4.0 9552.0 2.533396 0.924279 1.0 2.0 3.0 3.0 4.0 9552.0 40117.252931 1526.942850 40000.0 40000.0 40000.0 40000.0 60000.0 9552.0 0.834485 1.326633 0.0 0.0 0.0 1.0 5.0 9552.0 36.314280 25.058367 1.0 18.0 32.0 51.0 111.0 9552.0 2.121784 0.935803 0.5 1.41 2.14 2.81 3.98 9552.0 13.770019 4.632081 6.0 9.63 13.5 17.7 21.9 9552.0 11.769253 4.683986 3.05 7.69 11.5 16.00 20.8 9552.0 0.557580 0.496700 0.0 0.0 1.0 1.0 1.0 9552.0 0.351026 0.477316 0.0 0.0 0.0 1.0 1.0 9552.0 18.852178 10.263379 1.0 9.00 20.0 28.0 36.0 9552.0 1.625523 1.140598 1.0 1.0 1.0 2.0 5.0 9552.0 6.069514 4.381597 1.0 2.0 4.0 10.0 19.0 9552.0 3.338358 2.038074 1.0 2.0 2.0 5.0 8.0 9552.0 31391.844640 2659.016403 27694.0 30268.0 30584.0 33858.0 38382.0 9552.0 21648.771357 2168.766572 18670.0 20141.0 22063.0 22123.0 30351.0 9552.0 5845.873953 1075.452638 3561.0 5062.0 5415.0 7041.0 8435.0 9552.0 3897.224246 717.100699 2374.0 3375.0 3610.0 4694.0 5624.0 9552.0 0.689908 0.462555 0.0 0.0 1.0 1.0 1.0 9552.0 0.459171 0.498356 0.0 0.0 0.0 1.0 1.0 9552.0 0.731784 0.443054 0.0 0.0 1.0 1.0 1.0 9552.0 0.731784 0.443054 0.0 0.0 1.0 1.0 1.0 9552.0 0.666248 0.471577 0.0 0.0 1.0 1.0 1.0 9552.0 6.239740 3.790656 1.0 3.0 6.0 9.0 13.0 9552.0 95.488011 29.250215 50.79 68.91 94.79 116.74 149.08
5 10769.0 15.667471 11.314588 1.0 7.0 13.0 23.0 45.0 10769.0 7.776488 4.931562 1.0 4.0 7.0 11.0 22.0 10769.0 1.364751 0.637724 1.0 1.0 1.0 2.0 3.0 10769.0 6.417448 3.390633 0.53 3.7200 5.82 8.52 22.92 10769.0 2.567445 1.424065 0.2014 1.459200 2.3312 3.410400 9.2825 10769.0 3.060544 0.802724 1.0 3.0 3.0 4.0 6.0 10769.0 20.129817 13.184394 1.0 8.0 18.0 31.0 48.0 10769.0 1.407466 0.609335 1.0 1.0 1.0 2.0 3.0 10769.0 1.524933 0.499401 1.0 1.0 2.0 2.0 2.0 10769.0 1.481939 0.499697 1.0 1.0 1.0 2.0 2.0 10769.0 2.434674 1.501494 0.0 1.0 2.0 4.0 5.0 10769.0 2.353329 0.964574 1.0 2.0 2.0 2.0 5.0 10769.0 1.974928 0.592112 0.0 2.0 2.0 2.0 3.0 10769.0 2.617606 0.988572 1.0 2.0 2.0 4.0 5.0 10769.0 0.587055 0.492386 0.0 0.0 1.0 1.0 1.0 10769.0 2.568762 0.912667 1.0 2.0 3.0 3.0 4.0 10769.0 2.568762 0.912667 1.0 2.0 3.0 3.0 4.0 10769.0 69623.920513 12181.213148 60000.0 60000.0 60000.0 80000.0 120000.0 10769.0 0.743244 1.208758 0.0 0.0 0.0 1.0 5.0 10769.0 36.617420 24.977073 1.0 18.0 32.0 51.0 111.0 10769.0 2.100218 0.933576 0.5 1.40 2.11 2.77 3.98 10769.0 13.794186 4.654042 6.0 9.63 13.6 17.8 21.9 10769.0 11.783691 4.707324 3.05 7.68 11.5 16.00 20.8 10769.0 0.552233 0.497287 0.0 0.0 1.0 1.0 1.0 10769.0 0.352679 0.477826 0.0 0.0 0.0 1.0 1.0 10769.0 18.852540 10.238454 1.0 10.00 19.0 28.0 36.0 10769.0 1.887269 1.005886 1.0 1.0 2.0 2.0 5.0 10769.0 6.991271 5.049929 1.0 3.0 6.0 11.0 19.0 10769.0 3.426502 2.419777 1.0 2.0 2.0 5.0 10.0 10769.0 26922.884948 4911.235923 20319.0 23112.0 27694.0 30584.0 39696.0 10769.0 18396.785124 3579.372493 13305.0 15337.0 18670.0 21938.0 30351.0 10769.0 5115.719380 1306.882889 2452.0 4294.0 5062.0 5633.0 9184.0 10769.0 3410.450367 871.180241 1635.0 2863.0 3375.0 3755.0 6122.0 10769.0 0.703501 0.456735 0.0 0.0 1.0 1.0 1.0 10769.0 0.405330 0.490979 0.0 0.0 0.0 1.0 1.0 10769.0 0.600056 0.489909 0.0 0.0 1.0 1.0 1.0 10769.0 0.600056 0.489909 0.0 0.0 1.0 1.0 1.0 10769.0 0.639892 0.480054 0.0 0.0 1.0 1.0 1.0 10769.0 6.520661 3.855941 1.0 3.0 6.0 10.0 13.0 10769.0 98.344258 30.333223 50.79 69.63 95.74 126.62 149.75
6 5700.0 15.683509 11.364258 1.0 6.0 13.0 23.0 45.0 5700.0 7.758070 5.006845 1.0 4.0 7.0 11.0 22.0 5700.0 1.364211 0.636645 1.0 1.0 1.0 2.0 3.0 5700.0 6.599498 3.534297 0.65 3.7575 5.97 8.79 19.75 5700.0 2.630025 1.470617 0.2130 1.472450 2.3936 3.521700 9.2825 5700.0 3.110000 0.856632 1.0 3.0 3.0 4.0 6.0 5700.0 21.124912 13.236501 1.0 10.0 21.0 31.0 48.0 5700.0 1.341404 0.620698 1.0 1.0 1.0 2.0 3.0 5700.0 1.482982 0.499754 1.0 1.0 1.0 2.0 2.0 5700.0 1.493860 0.500006 1.0 1.0 1.0 2.0 2.0 5700.0 2.559474 1.546089 0.0 1.0 3.0 4.0 5.0 5700.0 2.620175 1.236024 1.0 2.0 3.0 3.0 5.0 5700.0 1.939123 0.750724 0.0 2.0 2.0 2.0 3.0 5700.0 2.594737 0.914280 2.0 2.0 2.0 4.0 4.0 5700.0 0.786140 0.410065 0.0 1.0 1.0 1.0 1.0 5700.0 2.564211 0.931172 1.0 2.0 3.0 3.0 4.0 5700.0 2.564211 0.931172 1.0 2.0 3.0 3.0 4.0 5700.0 134263.157895 17764.150911 100000.0 120000.0 140000.0 140000.0 160000.0 5700.0 0.975263 1.462133 0.0 0.0 0.0 2.0 5.0 5700.0 36.476667 25.348942 1.0 18.0 32.0 51.0 111.0 5700.0 2.120232 0.936789 0.5 1.42 2.14 2.80 3.98 5700.0 13.844575 4.612528 6.0 9.79 13.7 17.7 21.9 5700.0 11.834211 4.671976 3.05 7.78 11.6 15.85 20.8 5700.0 0.567018 0.495532 0.0 0.0 1.0 1.0 1.0 5700.0 0.350877 0.477286 0.0 0.0 0.0 1.0 1.0 5700.0 18.827018 10.249523 1.0 10.00 19.0 28.0 36.0 5700.0 1.913333 0.780665 1.0 1.0 2.0 2.0 5.0 5700.0 6.790351 4.488047 1.0 3.0 6.0 10.0 19.0 5700.0 3.263158 2.350020 1.0 2.0 3.0 5.0 10.0 5700.0 24951.024035 3777.961898 20319.0 21215.0 23598.0 27694.0 36509.0 5700.0 17090.746491 3074.783847 13305.0 14210.0 16232.0 18670.0 27463.0 5700.0 4716.225088 1065.744226 2452.0 4149.0 4923.0 5415.0 8435.0 5700.0 3144.102807 710.316197 1635.0 2766.0 3282.0 3610.0 5624.0 5700.0 0.610351 0.487713 0.0 0.0 1.0 1.0 1.0 5700.0 0.387193 0.487151 0.0 0.0 0.0 1.0 1.0 5700.0 0.439474 0.496367 0.0 0.0 0.0 1.0 1.0 5700.0 0.439474 0.496367 0.0 0.0 0.0 1.0 1.0 5700.0 0.574211 0.494506 0.0 0.0 1.0 1.0 1.0 5700.0 6.528246 4.048583 1.0 3.0 6.0 10.0 13.0 5700.0 98.965900 30.139485 50.79 69.63 98.52 126.62 149.75
kmeans.cluster_centers_
array([[1.58172551e-04, 7.70610374e-05, 1.36417593e-05, 6.45507355e-05,
        2.58528667e-05, 3.06112298e-05, 2.17936780e-04, 1.42799056e-05,
        1.45706441e-05, 1.48761729e-05, 2.47279928e-05, 2.51345298e-05,
        1.92079447e-05, 2.57618566e-05, 6.50597769e-06, 2.45573027e-05,
        2.45573027e-05, 9.46414710e-01, 8.20276496e-06, 3.62242011e-04,
        2.08851188e-05, 1.37149966e-04, 1.17157000e-04, 5.56229603e-06,
        3.42067942e-06, 1.84114933e-04, 1.99699121e-05, 8.02081105e-05,
        3.70242828e-05, 2.60753896e-01, 1.78297171e-01, 4.94741924e-02,
        3.29821717e-02, 6.15620185e-06, 3.47674384e-06, 5.43257687e-06,
        5.43257687e-06, 5.55080838e-06, 6.49688528e-05, 9.88580818e-04],
       [4.20509951e-04, 2.08652418e-04, 3.65626499e-05, 1.72918244e-04,
        6.93850592e-05, 8.18787351e-05, 5.98210905e-04, 3.62993429e-05,
        4.03153359e-05, 4.00265388e-05, 6.70528891e-05, 3.60602076e-05,
        1.00177674e-05, 5.47391664e-05, 1.54235134e-05, 3.22129488e-05,
        3.22129488e-05, 5.96261692e-01, 2.10138959e-05, 9.84452606e-04,
        5.58139888e-05, 3.68109421e-04, 3.14721135e-04, 1.46795444e-05,
        9.34706763e-06, 4.99111276e-04, 6.02519314e-05, 2.35614854e-04,
        9.72726449e-05, 6.50446711e-01, 4.40918390e-01, 1.25718502e-01,
        8.38105362e-02, 1.34481097e-05, 6.09981908e-06, 1.03615260e-05,
        1.03615260e-05, 1.11418950e-05, 1.87692679e-04, 2.72334689e-03],
       [2.86015192e-04, 1.42229711e-04, 2.49396319e-05, 1.18267992e-04,
        4.72959824e-05, 5.56675749e-05, 4.05048248e-04, 2.64102279e-05,
        2.70572528e-05, 2.66147839e-05, 4.64783992e-05, 5.13436813e-05,
        3.50547884e-05, 4.08205715e-05, 1.03818121e-05, 4.59223574e-05,
        4.59223574e-05, 8.23279117e-01, 1.58983601e-05, 6.68554736e-04,
        3.81921080e-05, 2.48969039e-04, 2.12752892e-04, 1.01532626e-05,
        6.28391656e-06, 3.41146459e-04, 3.76327392e-05, 1.52656453e-04,
        6.81973017e-05, 4.58667059e-01, 3.14236052e-01, 8.66583724e-02,
        5.77719028e-02, 1.03890556e-05, 5.10434504e-06, 8.66013864e-06,
        8.66013864e-06, 9.02382374e-06, 1.24307264e-04, 1.84841802e-03],
       [3.52901749e-04, 1.76347551e-04, 3.06786286e-05, 1.46405944e-04,
        5.87267016e-05, 6.90330672e-05, 4.80451918e-04, 3.12536816e-05,
        3.35465125e-05, 3.28778296e-05, 5.38159761e-05, 2.56628734e-05,
        3.80942644e-06, 4.28158290e-05, 1.19376139e-05, 1.95433791e-05,
        1.95433791e-05, 4.49546049e-01, 1.71753540e-05, 8.29953788e-04,
        4.78228821e-05, 3.07522476e-04, 2.62326328e-04, 1.24936711e-05,
        7.83646446e-06, 4.27241384e-04, 3.75812547e-05, 1.51942210e-04,
        7.08167450e-05, 7.23013285e-01, 4.94185902e-01, 1.37299196e-01,
        9.15303505e-02, 1.44935619e-05, 9.67810069e-06, 1.73060520e-05,
        1.73060520e-05, 1.39102319e-05, 1.45072333e-04, 2.16109009e-03],
       [2.84499701e-04, 1.38968788e-04, 2.48324414e-05, 1.18680088e-04,
        4.75985814e-05, 5.60212134e-05, 3.71352392e-04, 2.58242706e-05,
        2.69828537e-05, 2.70112582e-05, 4.86007202e-05, 5.45834549e-05,
        3.62360240e-05, 3.89239037e-05, 1.03208758e-05, 4.54911482e-05,
        4.54911482e-05, 7.19102551e-01, 1.49080103e-05, 6.51648997e-04,
        3.80613787e-05, 2.47102046e-04, 2.11208487e-04, 1.00031204e-05,
        6.30101578e-06, 3.38155218e-04, 2.87041110e-05, 1.07526993e-04,
        5.91723499e-05, 5.61146042e-01, 3.86874514e-01, 1.04563596e-01,
        6.97085230e-02, 1.25276082e-05, 8.49685446e-06, 1.31909509e-05,
        1.31909509e-05, 1.20890024e-05, 1.11600810e-04, 1.70747742e-03],
       [2.08304344e-04, 1.03578181e-04, 1.81653483e-05, 8.53881272e-05,
        3.41615883e-05, 4.06791295e-05, 2.67263750e-04, 1.85889752e-05,
        2.03632531e-05, 1.97926484e-05, 3.22987898e-05, 3.11696012e-05,
        2.61838546e-05, 3.46682313e-05, 7.67608539e-06, 3.42256005e-05,
        3.42256005e-05, 9.01925708e-01, 9.74709063e-06, 4.87718330e-04,
        2.79739794e-05, 1.83483130e-04, 1.56711817e-04, 7.32619876e-06,
        4.69162603e-06, 2.50768363e-04, 2.54454015e-05, 9.35773274e-05,
        4.54621516e-05, 3.48934415e-01, 2.38270804e-01, 6.63990314e-02,
        4.42656589e-02, 9.37259513e-06, 5.35085528e-06, 7.68839439e-06,
        7.68839439e-06, 8.41452201e-06, 8.70057208e-05, 1.31273656e-03],
       [1.15832753e-04, 5.72847408e-05, 1.00700034e-05, 4.87879642e-05,
        1.94478297e-05, 2.29866797e-05, 1.56438956e-04, 9.82030704e-06,
        1.09702789e-05, 1.10115527e-05, 1.88649457e-05, 1.95588111e-05,
        1.43450666e-05, 1.91996425e-05, 5.79312313e-06, 1.88635206e-05,
        1.88635206e-05, 9.73747826e-01, 7.10472815e-06, 2.69355761e-04,
        1.56657567e-05, 1.02250538e-04, 8.74006943e-05, 4.19472575e-06,
        2.59437066e-06, 1.39060037e-04, 1.42346629e-05, 5.00446844e-05,
        2.37598513e-05, 1.82454739e-01, 1.24908117e-01, 3.45283851e-02,
        2.30186257e-02, 4.45768621e-06, 2.74734151e-06, 3.12608553e-06,
        3.12608553e-06, 4.16543105e-06, 4.82817013e-05, 7.32851823e-04]])
X_std.drop(columns='CLUSTER', inplace=True)

centroids = pd.DataFrame(kmeans.cluster_centers_, columns=X_std.columns)
round(centroids.var(),3).sort_values(ascending=False)
pies_cuadrados_tienda         0.041
ingreso_anual                 0.038
pies_cuadrados_comestibles    0.019
pies_cuadrados_carne          0.001
pies_cuadrados_congelados     0.001
empaque_reciclable            0.000
bajo_en_grasa                 0.000
unidades_por_caja             0.000
comercio                      0.000
ciudad                        0.000
estado                        0.000
categoria_alimento            0.000
peso_bruto                    0.000
cafeteria                     0.000
tienda_de_videos              0.000
barra_de_ensaladas            0.000
comida_preparada              0.000
floristeria                   0.000
divulgacion                   0.000
peso_neto                     0.000
precio_recomendado            0.000
departamento                  0.000
genero                        0.000
tipo                          0.000
ventas_tienda_millones        0.000
costo_tienda_millones         0.000
ventas_unitarias_millones     0.000
promocion                     0.000
pais                          0.000
estado_civil                  0.000
total_de_hijos                0.000
marca                         0.000
escolaridad                   0.000
miembro                       0.000
ocupacion                     0.000
vivienda_propia               0.000
promedio_autos                0.000
promedio_autos                0.000
numero_hijos                  0.000
costo                         0.000
dtype: float64
X_std['CLUSTER']=labels
X_std.groupby('CLUSTER')['miembro','comercio','promocion',
                                          'ocupacion','escolaridad','estado_civil',
                                          'genero','total_de_hijos','ingreso_anual',
                                          'costo'].describe()
<ipython-input-37-98d8a544ebde>:2: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  X_std.groupby('CLUSTER')['miembro','comercio','promocion',
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead tr th {
    text-align: left;
}

.dataframe thead tr:last-of-type th {
    text-align: right;
}
</style>
miembro comercio promocion ocupacion escolaridad estado_civil genero total_de_hijos ingreso_anual costo
count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max count mean std min 25% 50% 75% max
CLUSTER
0 6719.0 1.929751 0.653026 0.0 2.0 2.0 2.0 3.0 6719.0 1.999107 0.995972 1.0 1.0 2.0 2.0 5.0 6719.0 22.140944 12.753622 1.0 11.0 21.0 33.0 48.0 6719.0 2.611401 0.921475 2.0 2.0 2.0 4.0 4.0 6719.0 2.561095 1.089796 1.0 2.0 2.0 3.0 5.0 6719.0 1.470606 0.499172 1.0 1.0 1.0 2.0 2.0 6719.0 1.512427 0.499883 1.0 1.0 2.0 2.0 2.0 6719.0 2.492186 1.451987 0.0 1.0 2.0 4.0 5.0 6719.0 100202.411073 22740.641045 80000.0 80000.0 100000.0 120000.0 160000.0 6719.0 99.787136 29.439739 50.79 73.27 98.81 126.24 149.75
1 7184.0 0.543012 0.965124 0.0 0.0 0.0 1.0 3.0 7184.0 2.314727 0.872284 1.0 2.0 2.0 3.0 5.0 7184.0 22.942650 12.740289 1.0 12.0 22.0 33.0 48.0 7184.0 2.075306 1.082190 1.0 1.0 2.0 3.0 5.0 7184.0 1.526448 1.037845 1.0 1.0 1.0 1.0 5.0 7184.0 1.522829 0.499513 1.0 1.0 2.0 2.0 2.0 7184.0 1.510022 0.499934 1.0 1.0 2.0 2.0 2.0 7184.0 2.528257 1.462619 0.0 1.0 3.0 4.0 5.0 7184.0 24120.267261 8089.366585 20000.0 20000.0 20000.0 20000.0 40000.0 7184.0 102.537609 30.087471 51.00 75.76 106.10 129.50 149.75
2 13249.0 1.942939 0.661373 0.0 2.0 2.0 2.0 3.0 13249.0 2.076685 0.919630 1.0 2.0 2.0 2.0 5.0 13249.0 22.672504 12.701308 1.0 12.0 22.0 33.0 48.0 13249.0 2.292022 1.104488 1.0 1.0 2.0 3.0 5.0 13249.0 2.775153 1.090458 1.0 2.0 3.0 3.0 5.0 13249.0 1.502000 0.500015 1.0 1.0 2.0 2.0 2.0 13249.0 1.466601 0.498902 1.0 1.0 1.0 2.0 2.0 13249.0 2.578761 1.478613 0.0 1.0 3.0 4.0 5.0 13249.0 47836.063099 11149.442999 40000.0 40000.0 40000.0 60000.0 80000.0 13249.0 102.290299 29.921509 51.00 76.41 102.47 129.50 149.75
3 7255.0 0.170503 0.602138 0.0 0.0 0.0 0.0 3.0 7255.0 1.719779 1.162157 1.0 1.0 1.0 2.0 5.0 7255.0 21.648105 13.417428 1.0 10.0 22.0 34.0 48.0 7255.0 1.904618 1.009603 1.0 1.0 1.0 3.0 5.0 7255.0 1.139904 0.511381 1.0 1.0 1.0 1.0 5.0 7255.0 1.493039 0.499986 1.0 1.0 1.0 2.0 2.0 7255.0 1.463542 0.498703 1.0 1.0 1.0 2.0 2.0 7255.0 2.389387 1.489092 0.0 1.0 2.0 4.0 5.0 7255.0 20000.000000 0.000000 20000.0 20000.0 20000.0 20000.0 20000.0 7255.0 96.568673 30.127996 50.79 68.91 95.21 123.61 149.08
4 9552.0 2.021880 0.615000 0.0 2.0 2.0 2.0 3.0 9552.0 1.625523 1.140598 1.0 1.0 1.0 2.0 5.0 9552.0 20.793446 13.066999 1.0 9.0 22.0 31.0 46.0 9552.0 2.171587 1.145282 1.0 1.0 2.0 3.0 5.0 9552.0 3.044075 1.164172 1.0 3.0 3.0 3.0 5.0 9552.0 1.502827 0.500018 1.0 1.0 2.0 2.0 2.0 9552.0 1.505549 0.499995 1.0 1.0 2.0 2.0 2.0 9552.0 2.711474 1.486505 0.0 2.0 3.0 4.0 5.0 9552.0 40117.252931 1526.942850 40000.0 40000.0 40000.0 40000.0 60000.0 9552.0 95.488011 29.250215 50.79 68.91 94.79 116.74 149.08
5 10769.0 1.974928 0.592112 0.0 2.0 2.0 2.0 3.0 10769.0 1.887269 1.005886 1.0 1.0 2.0 2.0 5.0 10769.0 20.129817 13.184394 1.0 8.0 18.0 31.0 48.0 10769.0 2.617606 0.988572 1.0 2.0 2.0 4.0 5.0 10769.0 2.353329 0.964574 1.0 2.0 2.0 2.0 5.0 10769.0 1.524933 0.499401 1.0 1.0 2.0 2.0 2.0 10769.0 1.481939 0.499697 1.0 1.0 1.0 2.0 2.0 10769.0 2.434674 1.501494 0.0 1.0 2.0 4.0 5.0 10769.0 69623.920513 12181.213148 60000.0 60000.0 60000.0 80000.0 120000.0 10769.0 98.344258 30.333223 50.79 69.63 95.74 126.62 149.75
6 5700.0 1.939123 0.750724 0.0 2.0 2.0 2.0 3.0 5700.0 1.913333 0.780665 1.0 1.0 2.0 2.0 5.0 5700.0 21.124912 13.236501 1.0 10.0 21.0 31.0 48.0 5700.0 2.594737 0.914280 2.0 2.0 2.0 4.0 4.0 5700.0 2.620175 1.236024 1.0 2.0 3.0 3.0 5.0 5700.0 1.482982 0.499754 1.0 1.0 1.0 2.0 2.0 5700.0 1.493860 0.500006 1.0 1.0 1.0 2.0 2.0 5700.0 2.559474 1.546089 0.0 1.0 3.0 4.0 5.0 5700.0 134263.157895 17764.150911 100000.0 120000.0 140000.0 140000.0 160000.0 5700.0 98.965900 30.139485 50.79 69.63 98.52 126.62 149.75

##Posibles estrategias a implementar

  1. Aquí vas a elaborar una serie de recomendaciones de estrategias para personalizar la experiencia de los clientes en cada uno de los clusters; por ejemplo:

En el cluster A, se encuentran reunidos los clientes que gastan más dinero en productos de bebida.

Estrategia sugerida: Elaborar una campaña dirigida a estos clientes para que también compren productos de comida(…)

Aquí puedes usar toda tu creatividad, y la idea es proponer acciones para los clientes según sus características de consumo.

Miembro: Como los Supermarket clasifica a sus clientes

  {
  'No afiliado': 0,
  'Plata': 1,
  'Bronce': 2,
  'Oro': 3
  }

Comercio: Los Supermarket se clasifican dependiendo de su ubicación en valor adquisito referente a sus clientes

  {
    'Supermercado de lujo':1,
    'Supermercado':2,
    'Supermercado gourmet':3,
    'Pequeño supermercado':4,
    'Supermercado mediano':5
  }

Promocion: Esta Categoria los Supermarket genera insentivos a los clientes para generar mayores compras en ciertos productos

  {
    'Bolsas llenas':1,
    'Lotería de la caja registradora':2,
    'Ahorro para apostadores grandes':3,
    'Venta Doble':4,
    'Días de luz verde':5,
    'Ahorro Enorme':6,
    'Ahorro de precios':7,
    'Rebajadores de precios':8,
    'Días de dólar':9,
    'Venta de dos días':10,
    'Super Ahorradores':11,
    'Descuento de fin de semana':12,'Recortadores de dólares':13,
    'Promociones por montones':14,
    'Gran promoción':15,
    'Gratis para todos':16,
    'Ahorros por montones':17,
    'Ahorro de precios imbatible':18,
    'Aplastadores de precios':19,
    'Días de liquidación de estanterías':20,
    'Días de venta':21,
    'Adelante':22,
    'Super Ahorro':23,
    'Ahorradores de billetera':24,
    'Venta Ahorra Ya':25,
    'Destructores de precios':26,
    'Dos por uno':27,
    'Descuentos de gran magnitud':28,
    'Estantes vacíos':29,
    'Adiós bebé':30,
    'Venta de un día':31,
    'Descuentos fantásticos':32,
    'Días de ahorro':33,
    'Ganadores de ventas':34,
    'Espectacular de cupones':35,
    'Tres por uno':36,
    'Ganadores de precios':37,
    'Más barato':38,
    'Venta No Puedo Creerlo':39,
    'Ahorradores de dinero':40,
    'Especial luz verde':41,
    'Rebajando precios':42,
    'Ahorro de primera clase':43,
    'Mejores ahorros':44,
    'Elige tus ahorros':45,
    'Duplica tus ahorros':46,
    'Venta misteriosa':47,
    'Super ahorradores de billetera':48
    }

Ocupacion: Trabajo remunerado o no remunerado que tiene el Cliente

  {
    'Técnico':1,
    'Profesional':2,
    'Obrero':3,
    'Gestión':4,
    'Cargo de Oficina':5
  }

Escolaridad: Profesion o nivel de estudio del Cliente

  {
    'Primaria':1,
    'Superior':2,
    'Secundaria':3,
    'Maestría':4,
    'Técnico':5
  }

Estado_civil: Nivel que comparte con otro persona o con ninguna

  {
    'Casado':1,
    'Soltero':2
  }

Genero: Clasificacion fisica del Cliente

  {
    'Femenino':1,
    'Masculino':2
  }

Total_de_hijos: Integrantes de niños ó niñas que tiene a cargo el cliente

Ingreso_anual: Dinero ganado del cliente por prestar su tiempo y espacio a una empresa, ó negocio propio

Costo: Gasto que tiene ó tubo el cliente en el Supermarket

description = round(X_std.groupby('CLUSTER', as_index=False)['miembro','comercio','promocion',
                                          'ocupacion','escolaridad','estado_civil',
                                          'genero','total_de_hijos','ingreso_anual',
                                          'costo'].mean(),2)

description['N.CUSTOMERS'] = X_std.CLUSTER.value_counts()

description
<ipython-input-38-8510fd11d7d1>:1: FutureWarning: Indexing with multiple keys (implicitly converted to a tuple of keys) will be deprecated, use a list instead.
  description = round(X_std.groupby('CLUSTER', as_index=False)['miembro','comercio','promocion',
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
CLUSTER miembro comercio promocion ocupacion escolaridad estado_civil genero total_de_hijos ingreso_anual costo N.CUSTOMERS
0 0 1.93 2.00 22.14 2.61 2.56 1.47 1.51 2.49 100202.41 99.79 6719
1 1 0.54 2.31 22.94 2.08 1.53 1.52 1.51 2.53 24120.27 102.54 7184
2 2 1.94 2.08 22.67 2.29 2.78 1.50 1.47 2.58 47836.06 102.29 13249
3 3 0.17 1.72 21.65 1.90 1.14 1.49 1.46 2.39 20000.00 96.57 7255
4 4 2.02 1.63 20.79 2.17 3.04 1.50 1.51 2.71 40117.25 95.49 9552
5 5 1.97 1.89 20.13 2.62 2.35 1.52 1.48 2.43 69623.92 98.34 10769
6 6 1.94 1.91 21.12 2.59 2.62 1.48 1.49 2.56 134263.16 98.97 5700
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = description.set_index('CLUSTER')

# Usar los nombres de las columnas del df
corr_matrix = description[['miembro','comercio','promocion','ocupacion','escolaridad',
                           'estado_civil','genero','total_de_hijos','ingreso_anual',
                           'costo','N.CUSTOMERS']].corr()

plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')

plt.tight_layout()
plt.show()

png

# Convertir la matriz de correlación en un dataframe
correlation_df = pd.DataFrame(corr_matrix.unstack().sort_values(ascending=False), columns=['Correlación'])
correlation_df = correlation_df.reset_index()
correlation_df.columns = ['Columna 1', 'Columna 2', 'Correlación']

# Imprimir el dataframe de correlación
print(correlation_df)
          Columna 1       Columna 2  Correlación
0           miembro         miembro     1.000000
1          comercio        comercio     1.000000
2             costo           costo     1.000000
3     ingreso_anual   ingreso_anual     1.000000
4    total_de_hijos  total_de_hijos     1.000000
5            genero          genero     1.000000
6       escolaridad     escolaridad     1.000000
7         ocupacion       ocupacion     1.000000
8         promocion       promocion     1.000000
9      estado_civil    estado_civil     1.000000
10      N.CUSTOMERS     N.CUSTOMERS     1.000000
11            costo        comercio     0.962213
12         comercio           costo     0.962213
13          miembro     escolaridad     0.957956
14      escolaridad         miembro     0.957956
15        ocupacion   ingreso_anual     0.865165
16    ingreso_anual       ocupacion     0.865165
17        ocupacion         miembro     0.786562
18          miembro       ocupacion     0.786562
19            costo       promocion     0.757094
20        promocion           costo     0.757094
21        promocion        comercio     0.724955
22         comercio       promocion     0.724955
23   total_de_hijos     escolaridad     0.713147
24      escolaridad  total_de_hijos     0.713147
25          miembro   ingreso_anual     0.633225
26    ingreso_anual         miembro     0.633225
27      escolaridad       ocupacion     0.599581
28        ocupacion     escolaridad     0.599581
29   total_de_hijos          genero     0.530590
30           genero  total_de_hijos     0.530590
31      escolaridad   ingreso_anual     0.504588
32    ingreso_anual     escolaridad     0.504588
33          miembro  total_de_hijos     0.500362
34   total_de_hijos         miembro     0.500362
35      N.CUSTOMERS    estado_civil     0.473156
36     estado_civil     N.CUSTOMERS     0.473156
37      escolaridad     N.CUSTOMERS     0.384205
38      N.CUSTOMERS     escolaridad     0.384205
39      N.CUSTOMERS         miembro     0.363968
40          miembro     N.CUSTOMERS     0.363968
41           genero     escolaridad     0.338124
42      escolaridad          genero     0.338124
43         comercio    estado_civil     0.283701
44     estado_civil        comercio     0.283701
45          miembro          genero     0.265200
46           genero         miembro     0.265200
47         comercio          genero     0.236850
48           genero        comercio     0.236850
49        ocupacion          genero     0.226446
50           genero       ocupacion     0.226446
51   total_de_hijos     N.CUSTOMERS     0.214656
52      N.CUSTOMERS  total_de_hijos     0.214656
53            costo    estado_civil     0.204214
54     estado_civil           costo     0.204214
55    ingreso_anual          genero     0.197152
56           genero   ingreso_anual     0.197152
57      N.CUSTOMERS           costo     0.171893
58            costo     N.CUSTOMERS     0.171893
59            costo       ocupacion     0.133692
60        ocupacion           costo     0.133692
61        promocion          genero     0.103353
62           genero       promocion     0.103353
63         comercio       ocupacion     0.102325
64        ocupacion        comercio     0.102325
65           genero           costo     0.090548
66            costo          genero     0.090548
67    ingreso_anual  total_de_hijos     0.041879
68   total_de_hijos   ingreso_anual     0.041879
69    ingreso_anual           costo     0.031037
70            costo   ingreso_anual     0.031037
71   total_de_hijos       promocion     0.019112
72        promocion  total_de_hijos     0.019112
73         comercio     N.CUSTOMERS    -0.001454
74      N.CUSTOMERS        comercio    -0.001454
75    ingreso_anual        comercio    -0.003838
76         comercio   ingreso_anual    -0.003838
77   total_de_hijos    estado_civil    -0.004771
78     estado_civil  total_de_hijos    -0.004771
79        ocupacion     N.CUSTOMERS    -0.012022
80      N.CUSTOMERS       ocupacion    -0.012022
81   total_de_hijos       ocupacion    -0.017104
82        ocupacion  total_de_hijos    -0.017104
83        promocion     N.CUSTOMERS    -0.035405
84      N.CUSTOMERS       promocion    -0.035405
85          miembro           costo    -0.041898
86            costo         miembro    -0.041898
87           genero    estado_civil    -0.042366
88     estado_civil          genero    -0.042366
89            costo  total_de_hijos    -0.053814
90   total_de_hijos           costo    -0.053814
91      escolaridad           costo    -0.067793
92            costo     escolaridad    -0.067793
93        promocion    estado_civil    -0.077745
94     estado_civil       promocion    -0.077745
95         comercio  total_de_hijos    -0.114355
96   total_de_hijos        comercio    -0.114355
97          miembro        comercio    -0.160990
98         comercio         miembro    -0.160990
99      escolaridad        comercio    -0.200315
100        comercio     escolaridad    -0.200315
101    estado_civil         miembro    -0.202606
102         miembro    estado_civil    -0.202606
103    estado_civil     escolaridad    -0.219002
104     escolaridad    estado_civil    -0.219002
105    estado_civil       ocupacion    -0.262904
106       ocupacion    estado_civil    -0.262904
107       promocion   ingreso_anual    -0.293029
108   ingreso_anual       promocion    -0.293029
109     escolaridad       promocion    -0.295902
110       promocion     escolaridad    -0.295902
111   ingreso_anual     N.CUSTOMERS    -0.357520
112     N.CUSTOMERS   ingreso_anual    -0.357520
113     N.CUSTOMERS          genero    -0.362627
114          genero     N.CUSTOMERS    -0.362627
115       promocion       ocupacion    -0.375470
116       ocupacion       promocion    -0.375470
117         miembro       promocion    -0.406670
118       promocion         miembro    -0.406670
119   ingreso_anual    estado_civil    -0.580792
120    estado_civil   ingreso_anual    -0.580792

CLUSTER 0:

{
  miembro:No esta afiliado
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención el día de Super Ahorro
  ocupacion: Este grupo tiene un cargo mas Profesional
  escolaridad: un mayor porcentaje solo tienen primaria aunque algunos son Profesionales
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 2 hijos
  ingreso_anual: su poder adquisitivo es uno de los bajos
  costo:sus gastos tiene una tendencia alta
  N.CUSTOMERS:Número de clientes bajo
}

CLUSTER 1:

{
  miembro:Plata, con derechos de algunos productos con descuento
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención los Días de liquidación de estanterías
  ocupacion: Este grupo tiene un cargo mas Obrero
  escolaridad: un porcentaje promedio graduados en Superior
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 2 hijos
  ingreso_anual: su poder adquisitivo es promedio
  costo:sus gastos tiene una tendencia promedia
  N.CUSTOMERS:Número de clientes alto
}

CLUSTER 2:

{
  miembro:Plata, con derechos de algunos productos con descuento
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención los Días de Adelanto
  ocupacion: Este grupo tiene un cargo mas Obrero
  escolaridad: un porcentaje alto en graduados de Secundaria
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 2 hijos
  ingreso_anual: su poder adquisitivo esta en un grado alto
  costo:sus gastos tiene una tendencia promedia
  N.CUSTOMERS:Número de clientes bajo
}

CLUSTER 3:

{
  miembro:Plata, con derechos de algunos productos con descuento
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención el día de Super Ahorro
  ocupacion: Este grupo tiene un cargo mas Profesional
  escolaridad: un porcentaje alto en graduados de Secundaria
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 3 hijos
  ingreso_anual: su poder adquisitivo es basico
  costo:sus gastos tiene una tendencia alta
  N.CUSTOMERS:Número de clientes alto
}

CLUSTER 4:

{
  miembro:Plata, con derechos de algunos productos con descuento
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención los Días de venta
  ocupacion: Este grupo tiene un cargo mas Profesional
  escolaridad: un porcentaje alto en graduados de Secundaria
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 3 hijos
  ingreso_anual: su poder adquisitivo es basico
  costo:sus gastos tiene una tendencia baja
  N.CUSTOMERS:Número de clientes alto
}

CLUSTER 5:

{
  miembro:Plata, con derechos de algunos
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención los Días de Adelanto
  ocupacion: Este grupo tiene un cargo mas Profesional
  escolaridad: un mayor porcentaje solo tienen primaria aunque algunos son Profesionales
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 2 hijos
  ingreso_anual: su poder adquisitivo es uno de los bajos
  costo:sus gastos tiene una tendencia baja
  N.CUSTOMERS:Número de clientes bajo
}

CLUSTER 6:

{
  miembro:No esta afiliado
  comercio:Nucleo de compras principal es el Supermarket
  promocion:Le llama mas la atención los Días de venta
  ocupacion: Este grupo tiene un cargo mas Obrero
  escolaridad: un porcentaje alto en graduados de Secundaria
  estado_civil: Personas Casadas
  genero: Este grupo tiene un alto número de mujeres
  total_de_hijos: un promedio de 3 hijos
  ingreso_anual: su poder adquisitivo es el mas alto
  costo:sus gastos tiene una tendencia promedia
  N.CUSTOMERS:Número de clientes bajo
}

About

La junta directiva de la cadena de supermercados Universal Food ha observado una estabilización en sus ventas y busca comprender cómo mejorar la relación con sus clientes, entendiendo sus hábitos de compra, para ofrecerles un servicio de mayor calidad.jj

https://soysena-my.sharepoint.com/:p:/g/personal/mayad_soy_sena_edu_co/Ea_gsdQ3aDFFqF3NC5rS7ZIBNEomWCLsmv0hcuzLXyug5g?e=1zvrOC


Languages

Language:Jupyter Notebook 100.0%