<jupyter_start><jupyter_text>Analisis de los clientes en una cadena de supermercados<jupyter_code># Inslamos una actualización de plotly
pip install --user --upgrade plotly 
#Importamos las librerias necesarias para el proyecto
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
from datetime import datetime as dt
import random
import matplotlib.colors as mcolors<jupyter_output><empty_output><jupyter_text>**INTRODUCCIÓN**---**Contexto empresarial:** Una cadena de supermercados desea saber que segmento de clientes es más probable que compre cierto producto y solo comercializarlo en ese segmento en particular. Para ello requiere comprender mejor las necesidades, comportamientos y preocupaciones de los diferentes tipos de clientes.**Problema empresarial:** Analizar los datos proporcionados y proporcionar estadisticas para la creacion correcta de la campaña. Brindando visualizaciones que respondan a las preguntas específicas que tiene el cliente, que se mencionan a continuación.**Contexto analítico:** Se proporciona un archivo CSV que contiene detalles sobre cada cliente como fecha de nacimiento,ingresos, ubicación geografica del cliente, número de compras realizadas a través del sitio web de la empresa, etc. El delimitador en el archivo CSV dado es; en lugar del predeterminado,. Realizará las siguientes tareas con los datos:* Leer, transformar y preparar datos para su visualización* Realizar análisis y construir visualizaciones de los datos para identificar patronesEl cliente tiene un conjunto específico de preguntas a las que le gustaría obtener respuestas. Deberá proporcionar visualizaciones para acompañar estos: Tenemos las siguientes columnas:*   **ID**= Identificacion unica del cliente.*   **Year_Birth**= Año de nacimiento del cliente.*   **Marital_Status**= Estado civil.*   **Income**= Ingreso familiar anual del cliente.*   **Kidhome**= Número de niños en el hogar del cliente.*   **Teenhome**= Número de adolescentes en el hogar del cliente*   **Dt_Customer**= Fecha de inscripción del cliente en la empresa.*   **Recency**= Número de días desde la última compra del cliente*   **MntWines**= Cantidad gastada en vino en los últimos 2 años*   **MntFruits**= Cantidad gastada en frutas en los últimos 2 años*   **MntMeatProducts**= Cantidad gastada en carne en los últimos 2 años*   **MntFishProducts**= Cantidad gastada en pescado en los últimos 2 años*   MntSweetProducts= Cantidad gastada en dulces en los últimos 2 años*   **MntGoldProds**=Cantidad gastada en oro en los últimos 2 años*   **NumDealsPurchases**= Número de compras realizadas con descuento*   **NumWebPurchases**= Número de compras realizadas a través del sitio web de la empresa*   **NumCatalogPurchases**= Número de compras realizadas mediante catálogo*   **NumStorePurchases**=Número de compras realizadas directamente en tiendas*   **NumWebVisitsMonth**= Número de visitas al sitio web de la empresa en el último mes*   **AcceptedCmp3**=1 si el cliente aceptó la oferta en la tercera campaña, 0 en caso contrario*   **AcceptedCmp4**= 1 si el cliente aceptó la oferta en la cuarta campaña, 0 en caso contrario*   **AcceptedCmp5**=1 si el cliente aceptó la oferta en la quinta campaña, 0 en caso contrario*   **AcceptedCmp1**=1 si el cliente aceptó la oferta en la primera campaña, 0 en caso contrario*   **AcceptedCmp2**=1 si el cliente aceptó la oferta en la segunda campaña, 0 en caso contrario*   **Response**= 1 si el cliente aceptó la oferta en la última campaña, 0 en caso contrario*   **Complain**= 1 si el cliente se quejó en los últimos 2 años, 0 en caso contrario*   **Country**= Ubicación del cliente  Analizado los datos - columnas<jupyter_code>#Asigmos un DataFrame con el nombre data, con los datos de la tienda
data=pd.read_csv('marketing_data.csv')
data.head()
#Obtenemos la cantidad de registros por columna y tipo de dato
print(data.info())
data.shape #cantidad de registros y de columnas.
data.columns = data.columns.str.replace(' ', '',regex=True) #Reemplazar en las columnas los dos espacios por vacio.
data['Income'] = data['Income'].str.replace('$', '',regex=True)#Reemplazar en la columna Income el signo peso por vacio.
data['Income'] = data['Income'].str.replace(',','').astype('float')#Reemplazar en la columna Income la coma de los registros por vacio y convertirlos a tipo float.
#Buscamos si hay campos nulos en alguno de los campos que tenemos en los datos
data.isnull().sum().sort_values(ascending=False)#Sustituir valores nulos por True si es nulo o False si no lo es y sumarlos. Ordenar de mayor cantidad a menor.
data['Income']=data['Income'].fillna(data['Income'].median())#Sustituye en la columna Income los valores nulos por el valor mediano para evitar 
#el efecto de valores atipico
data<jupyter_output><empty_output><jupyter_text>Parte 1: ¿Como ha flutuado el número de compras durante los ultimos dos años? ¿Han aumentado con el tiempo? ¿Cual es el producto más comprado?En esta parte, vamos a identificar como ha sido las compras a lo largo de los dos años, por medio de las compras online, directamente con la tienda y como se comporta en los diferentes países donde tiene comercio la tienda.<jupyter_code>#Vamos a identificar cuanto(cantidad) ha vendido la tienda en los diferentes productos
cantidad_vino = data['MntWines'].sum() #Cantidad de vino
cantidad_fruta = data['MntFruits'].sum() #Cantidad de frutas
cantidad_carne = data['MntMeatProducts'].sum() #Cantidad de carne
cantidad_pescado = data['MntFishProducts'].sum() #Cantidad de pescado
cantidad_dulces = data['MntSweetProducts'].sum() #Cantidad de dulces
cantidad_oro = data['MntGoldProds'].sum() #Cantidad de oro
#Creamos el DataFrame
valores = pd.DataFrame()

#Asignamos las columnas del DataFrame
valores['productos'] = None
valores['cantidad'] = None

#Creamos campos, para llenar el DataFrame
productos = ['Vino', 'Fruta', 'Carne', 'Pescado', 'Dulce', 'Oro']
cantidad = [cantidad_vino, cantidad_fruta, cantidad_carne, cantidad_pescado, cantidad_dulces, cantidad_oro]

#Llenamos el DataFrame
valores['productos'] = productos
valores['cantidad'] = cantidad
valores
#Creamos la grafica de barras sobre la compra de los productos
valores = valores[["productos", "cantidad"]]
x = valores.productos
y = valores.cantidad
plt.bar(x, y, color = "#4CAF50")
plt.title("Ventas en la tienda")
plt.xlabel("Productos")
plt.ylabel("Cantidad de los productos vendidos")
plt.show()<jupyter_output><empty_output><jupyter_text>En la grafica podemos apreciar que el producto que más se vende en la tienda es el Vino y la menos apreciada por los clientes es la fruta y dulce, que tienen valores muy bajos<jupyter_code>#Sacamos el total de compras
purchases_col=[col for col in data.columns if 'Purchase' in col]#variable para las columnas que contienen la palabra 'Purchase' sumar aplicado en forma de filas.
data['TotalPurchases']=data[purchases_col].sum(axis=1)
#Identificamos los países donde se ofrecen los productos
data['Country'].unique()
#Agregamos una nueva columna a nuestro DataFrame con los nombres de los países
data['paises'] = data['Country'] #Asignamos los mismos valores que el campo Country para que la modificacion de los datos sea mas rapida
data['codigo'] = data['Country']

data['paises'] = data['Country'].replace({'SP': 'ESPAÑA', 'CA': 'CANADA', 'US': 'ESTADOS UNIDOS', 'AUS': 'AUSTRALIA', 'GER': 'ALEMANIA', 'IND': 'INDIA', 'SA': 'SUDAFRICA', 'ME': 'MEXICO', })
data['codigo'] = data['Country'].replace({'SP': '1', 'CA': '2', 'US': '3', 'AUS': '4', 'GER': '5', 'IND': '6', 'SA': '7', 'ME': '8'})
data
#Para la columna Country le cambiamos los codigos, a un codigo general de los países
data['Code_country'] = data['Country'].replace({'SP': 'ESP', 'CA': 'CAN', 'US': 'USA', 'SA': 'ZAF', 'ME': 'MEX'})
data
#Agrupamos por los paises, pero tambien por el producto que se desea saber la cantidad de compras
vino = data.groupby('paises').MntWines.sum()
fruta = data.groupby('paises').MntFruits.sum()
carne = data.groupby('paises').MntMeatProducts.sum()
pescado = data.groupby('paises').MntFishProducts.sum()
dulce = data.groupby('paises').MntSweetProducts.sum()
oro = data.groupby('paises').MntGoldProds.sum()
#Llenamos el DataFrame compra por los valores de los paises con los diferentes valores de las compras
compra = pd.DataFrame()
compra['paises'] = ["ALEMANIA", "AUSTRALIA", "CANADA", "ESPAÑA", "EEUU", "INDIA", "MEXICO", "SUDAFRICA"]
compra['Wine'] = [vino[0], vino[1], vino[2], vino[3], vino[4], vino[5], vino[6], vino[7]]
compra['Fruit'] = [fruta[0], fruta[1], fruta[2], fruta[3], fruta[4], fruta[5], fruta[6], fruta[7]]
compra['Meat'] = [carne[0], carne[1], carne[2], carne[3], carne[4], carne[5], carne[6], carne[7]]
compra['Fish'] = [pescado[0], pescado[1], pescado[2], pescado[3], pescado[4], pescado[5], pescado[6], pescado[7]]
compra['Sweet'] = [dulce[0], dulce[1], dulce[2], dulce[3], dulce[4], dulce[5], dulce[6], dulce[7]]
compra['Gold'] = [oro[0], oro[1], oro[2], oro[3], oro[4], oro[5], oro[6], oro[7]]
compra
#Creamos 6 graficas que son las cantidades de productos que ofrece la tienda
fig = plt.figure(figsize=(15,15))
fig.tight_layout()
colores = ['blue', 'green', 'red', 'cyan', 'magenta', 'yellow', 'purple', 'white']
product = ['VINO', 'FRUTA', 'CARNE', 'PESCADO', 'DULCE', 'ORO']

for i in range(1,7):
  x = ["ALEMANIA", "AUSTRALIA", "CANADA", "ESPAÑA", "EEUU", "INDIA", "MEXICO", "SUDAFRICA"]
  if i == 1:
    y = compra['Wine']
  elif i == 2:
    y = compra['Fruit']
  elif i == 3:
    y = compra['Meat']
  elif i == 4:
    y = compra['Fish']
  elif i == 5:
    y = compra['Sweet']
  elif i == 6:
    y = compra['Gold']
  ax = plt.subplot(3,2,i)
  ax.plot(x,y,color=colores[i])
  ax.set_xlabel('Paises')
  ax.set_ylabel('Cantidad de compras')
  ax.set_title('Grafica sobre el consumo de ' + str(product[i-1]))<jupyter_output><empty_output><jupyter_text>Cuando analizamos las graficas, nos damos cuenta que son muy parecidas entre todas, pero no nos indican bien, que producto es el que más se vende, pero ya podemos determinar que el país que compra más los productos de la tienda es España<jupyter_code>#Creamos la grafica
y = compra['Wine']
y2 = compra['Fruit']
y3 = compra['Meat']
y4 = compra['Fish']
y5 = compra['Sweet']
y6 = compra['Gold']
x = ["Alemania", "Australia", "Canada", "España", "EEUU", "India", "Mexico", "Sudafrica"]
plt.plot(x,y,label='Vino', linewidth = 1, color='blue', marker = "o")
plt.plot(x,y2, label='Fruta',linewidth= 1, color='green', marker = "o")
plt.plot(x,y3,label='Carne', linewidth = 1, color='cyan', marker = "o")
plt.plot(x,y4, label='Pescado',linewidth= 1, color='purple', marker = "o")
plt.plot(x,y5,label='Dulce', linewidth = 1, color='red', marker = "o")
plt.plot(x,y6, label='Oro',linewidth= 1, color='blue', marker = "o")
plt.title("Cantidad de productos vendidos en los diferentes paises")
plt.ylabel("Cantidad de productos")
plt.xlabel("Paises")
plt.legend()<jupyter_output><empty_output><jupyter_text>Ya identificamos que el producto que más se vende en la tienda es el vino y que el país que más le compra productos es España<jupyter_code>#Necesitamos agrupar los paises y sacar el número de compras
df_compras = data.groupby(['codigo', 'Code_country'])['TotalPurchases'].sum()
#Pasamos los datos a una lista
lista = [list(key) + [str(value)] for key, value in  df_compras.to_dict().items()]
#Pasamos los datos a un dataframe
df_compras = pd.DataFrame()
for x in lista:
  agregar = {}
  agregar = {"Pais" : x[0], "Codigo": x[1], "Total_compras": x[2]}
  df_compras = df_compras.append(agregar, ignore_index=True)
df_compras['Pais'] = df_compras['Pais'].replace({'1':'ESPAÑA', '2':'CANADA', '3':'ESTADOS UNIDOS', '4':'AUSTRALIA', '5':'ALEMANIA', '6':'INDIA', '7':'SUDAFRICA', '8':'MEXICO'})
df_compras
# Creacion del mapa
fig = px.choropleth(df_compras, locationmode='ISO-3', color ='Total_compras', hover_name="Pais",
                    locations='Codigo', projection='natural earth', title='Número total de compra por país'
                   )
fig.show()<jupyter_output><empty_output><jupyter_text>Por la segmentación de los colores del mapa, podemos identificar cual es el pais que más compra (España) y cual es el que menos (Mexico)  Parte 2: ¿Cual es la preferencia del cliente en las compras segun los datos?Averiguar las preferencias de los clientes por diferentes situaciones del mismo como la edad, nivel educativo, estado civil, cantidad de Kids/Teens e ingresos recibidos, tambien averiguar las preferencias del cliente en los descuentos *PREFERENCIAS DE LOS CLIENTES EN LAS COMPRAS SEGUN SU EDAD*<jupyter_code>#Obtenemos el año actual en el cual estamos trabajando
date = dt.today()
year = date.strftime("%Y")
year = int(year)
year
#Tenemos crear un nuevo campo en el DataFrame que nos de la edad, debido a que solos nos da los años de nacimiento de los clientes
data['edad'] = year - data['Year_Birth']
data['edad'].unique()
#Como hay clientes que tienen una edad superior a 100, lo vamos a eliminar
data = data[data.edad<100]
data = data.reset_index(drop=True)
data['edad'].unique()
  g=data.groupby(['edad'])['TotalPurchases'].count()
compra_edad = pd.DataFrame(g)
compra_edad.reset_index(level=0,inplace=True)
x_values = compra_edad['edad'].unique()
y_values = compra_edad['TotalPurchases']
plt.bar(x_values, y_values)
plt.title('N.compras por edad')
ax = plt.subplot() 
ax.set_xlabel('edad')  #Nombre del eje x
ax.set_ylabel('Total compras')  #Nombre del eje y
plt.show()
plt.close('all')<jupyter_output>/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:5: MatplotlibDeprecationWarning:

Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.<jupyter_text>Hay más compras en la tienda en las edades de los rangos de 40 a 50 años *PREFERENCIAS DE LOS CLIENTES EN LAS COMPRAS SEGUN SUS INGRESOS*<jupyter_code>sns.lmplot(x='Income', y='TotalPurchases', data=data[data['Income']<200000]);
plt.xlabel('Ingresos')
plt.ylabel('Total compras')
plt.xticks(rotation=45, horizontalalignment='right');<jupyter_output><empty_output><jupyter_text>*PREFERENCIAS DE LOS CLIENTES EN LAS COMPRAS SEGUN LA CANTIDAD DE HIJOS*<jupyter_code>data['Hijos']=data['Kidhome']+data['Teenhome']
plt.figure(figsize=(4,4))
sns.boxplot(x='Hijos', y='TotalPurchases', data=data);
plt.ylabel('Total compras')<jupyter_output><empty_output><jupyter_text>Los clientes que no tienen hijos, suelen ser los que más compras realizan en la tienda y los que tienen más hijos, son los que menos que compran. Por lo cual se puede afirmar que las compras depende de la cantidad de hijos que tenga el cliente *PREFERENCIAS DE LOS CLIENTES EN LAS COMPRAS SEGUN NIVEL EDUCATIVO*<jupyter_code>sns.boxplot(x='Education', y='TotalPurchases', data=data)
plt.ylabel('Total compras')
plt.xlabel('Nivel de educación')<jupyter_output><empty_output><jupyter_text>Las personas que están estudiando un doctorado (phD) son las personas que suelen gastar más en productos de la tienda y los que tiene un nivel educativo basico son los que menos *PREFERENCIAS DE LOS CLIENTES EN LAS COMPRAS SEGUN EL ESTADO CIVIL*<jupyter_code>data['Marital_Status'] = data['Marital_Status'].replace(['Alone','YOLO','Absurd'],'Single')
data.Marital_Status.value_counts()
sns.boxplot(x='Marital_Status', y='TotalPurchases', data=data)
plt.xlabel("Estado Civil")
plt.ylabel("Total comrpras")<jupyter_output><empty_output><jupyter_text>En el Estado Marital del cliente, no varia mucho el número de compras, pero se puede indicar que los divorciados son los que más compran  Parte 3: ¿Cual campaña tuvo mayor acogida entre los clientes?<jupyter_code>df_cam = data[['Code_country', 'AcceptedCmp1', 'AcceptedCmp2', 'AcceptedCmp3', 'AcceptedCmp4', 'AcceptedCmp5', 'Response']].melt(
    id_vars='Code_country', value_vars = ['AcceptedCmp1', 'AcceptedCmp2', 'AcceptedCmp3', 'AcceptedCmp4', 'AcceptedCmp5', 'Response'], var_name='Campaña', value_name='Aceptacion (%)')
df_cam = pd.DataFrame(df_cam.groupby(['Code_country', 'Campaña'])['Aceptacion (%)'].mean()*100).reset_index(drop=False)
df_cam['Campaña'] = df_cam['Campaña'].replace({'AcceptedCmp1': '1',
                                                'AcceptedCmp2': '2',
                                                'AcceptedCmp3': '3',
                                                'AcceptedCmp4': '4',
                                                'AcceptedCmp5': '5',
                                                'Response': 'Mas reciente'
                                                })
fig = px.choropleth(df_cam, locationmode='ISO-3', color='Aceptacion (%)', facet_col='Campaña', facet_col_wrap=3,
                    facet_row_spacing=0.05, facet_col_spacing=0.01,
                    locations='Code_country', projection='natural earth', title='Exito de las diferentes campañas'
                   )
fig.show()<jupyter_output><empty_output><jupyter_text>Viendo las diferentes campañas y las acogidas que tuvo en los diferentes paises, podemos indicar que no hubo gran acogida en muchas de las campañas, pero en la campaña 3, el país de Mexico acogio bien la campaña y la campaña más reciente, Mexico tambien tuvo una gran acogida, pero no es el unico país ya que vemos un incremento de acogemiento en los demás paises  Parte 4: ¿Que porcentaje de clientes realizan compras por catalogo, via online y directamente con la tienda?Se quiere verificar en que medio los clientes prefieren realizar sus compras con la tienda<jupyter_code>#Creamos la grafica de barras donde detectamos donde se compra más
#valores = valores[["productos", "cantidad"]]
x = ['Sitio Web', 'Catalogo', 'Tienda']
y = [data['NumWebPurchases'].sum(), data['NumCatalogPurchases'].sum(), data['NumStorePurchases'].sum()]
plt.bar(x, y, color = "#82eace")
plt.title("Ventas en la tienda")
plt.xlabel("Productos")
plt.ylabel("Cantidad de los productos vendidos")
plt.show()<jupyter_output><empty_output><jupyter_text>Como podemos apreciar, en la tienda se presentan más ventas presenciales y debería reforzar más las ventas por medio del catalogo.  Parte 5: ¿Cual es la recompra en relacion al ingreso?<jupyter_code>#Punto de relacion de ingresos con recompra
data['Frecuencia_compra'] = data['NumWebPurchases']+data['NumCatalogPurchases']+data['NumStorePurchases']+data['NumDealsPurchases']
data = data[data['Income']<150000]#ingresos menores a 150.000
data = data.reset_index(drop=True)
data['Dependientes'] = data['Kidhome']+data['Teenhome']
plt.figure(figsize=(10,6))#Relacion entre ingresos y la frecuencia de compra
sns.scatterplot(data=data, x='Income', y='Frecuencia_compra',hue='Dependientes')
plt.title("Correlación de ingresos con la frecuencia de compra")
plt.xlabel("Ingresos")
plt.ylabel("Frecuencia de compra")
plt.show()<jupyter_output><empty_output><jupyter_text>Existe una correlación positiva entre los ingresos de los clientes y la frecuencia de compra.La mayoría de los compradores de alta frecuencia no tienen más de dos hijos.La mayoría de los clientes de altos ingresos (más de $ 80000) no tienen hijos  Parte 6: ¿Cual es el lifetime value del cliente?El valor de la vida del cliente es una métrica realmente importante para cualquier tipo de empresa. Resulta así tras conocer que adquirir nuevos clientes es mucho más caro que conservar a los existentes, por lo que ampliar el LTV ayuda a que los negocios sean mucho más sostenibles; además, los resultados favorecen la creación de nuevas y mejores estrategias de retención de clientes entre ellas campañas de marketingEstos valores nos indican cuanto le retribuye respecto a la inversión de la empresa los clientes en un tiempo determinado,en este caso por mes.<jupyter_code>#Creamos un nuevo dataframe con los valores necesarios para obtener el lifetime value del cliente
clv = pd.DataFrame()
clv['ID'] = data['ID']
clv['Dt_Customer'] = data['Dt_Customer']
clv['MntWines'] = data['MntWines']
clv['MntFruits'] = data['MntFruits']
clv['MntMeatProducts'] = data['MntMeatProducts']
clv['MntFishProducts'] = data['MntFishProducts']
clv['MntSweetProducts'] = data['MntSweetProducts']
clv['MntGoldProds'] = data['MntGoldProds']
clv
#Sacamos el total de compras
purchases_col=[col for col in clv.columns if 'Mnt' in col]#variable para las columnas que contienen la palabra 'Purchase' sumar aplicado en forma de filas.
clv['Recompra']=clv[purchases_col].sum(axis=1)
clv
#Creamos un diccionario con el valor de cada producto
productos = {'Wines': 10, 'Fruits': 2, 'Meats': 5, 'Fish': 4, 'Sweet': 3, 'Gold': 20}
#Cambiamos los campos que estan por unidad a precio del producto
clv['MntWines'] = clv['MntWines'] * int(productos['Wines'])
clv['MntFruits'] = clv['MntFruits'] * int(productos['Fruits'])
clv['MntMeatProducts'] = clv['MntMeatProducts'] * int(productos['Meats'])
clv['MntFishProducts'] = clv['MntFishProducts'] * int(productos['Fish'])
clv['MntSweetProducts'] = clv['MntSweetProducts'] * int(productos['Sweet'])
clv['MntGoldProds'] = clv['MntGoldProds'] * int(productos['Gold'])
clv
#Creamos el nuevo campo con la suma de todos los campos
clv['total_compra'] = clv['MntWines'] + clv['MntFruits'] + clv['MntMeatProducts'] + clv['MntFishProducts'] + clv['MntSweetProducts'] + clv['MntGoldProds']
clv['Dt_Customer']=pd.to_datetime(clv['Dt_Customer']) #variable que necesita una transformacion. Convertir de formato objet a tipo fecha.
clv['Dt_Customer']
max_date = clv['Dt_Customer'].dt.date.max() #Encontramos la fecha maxima
min_date = clv['Dt_Customer'].dt.date.min() #Encontramos la fecha minima
total_cantidad = clv['Recompra'].sum() #Sumamos el total de los productos comprados
total_ventas = clv['total_compra'].sum() #Sumamos el valor de las ventas
 
print(f"El rango de fechas de las compras es de {min_date} a {max_date}")
print(f"Cantidad total de ventas: {total_cantidad} y total de ventas por periodo: {total_ventas}")
#Asignamos una columna con el nombre de fecha, donde nos va a indicar los dias que lleva en la tienda
clv['fecha']= pd.to_datetime(clv['Dt_Customer'], dayfirst=True,format = '%Y-%m-%d')
clv['fecha'] = pd.to_numeric(clv['fecha'].dt.date.apply(lambda x: (max_date - x)).dt.days, downcast='integer',errors="ignore")
#Creamos un nuevo DataFeame donde se evidencie los campos, del tiempo del cliente (en dias), las veces que compro y el total de las compras
cliente = pd.DataFrame()
cliente['Periodo_cliente'] = clv['fecha']
cliente['Frecuencia'] = clv['Recompra']
cliente['Ventas']= clv['total_compra']
#Sacamos los valores que necesitamos para obtener el VLC
promedio_ventas = round(np.mean(cliente['Ventas']), 2)
print(f"Promedio ventas: $ {promedio_ventas}")

frecuencia_compra = round(np.mean(cliente['Frecuencia']), 2)
print(f"Frecuencia compra: $ {frecuencia_compra}")

tasa_retencion = cliente[cliente['Frecuencia']>10].shape[0]/cliente.shape[0]
tasa_cancelacion = round(1-tasa_retencion, 2)
print(f"Tasa cancelación: $ {tasa_cancelacion} %")
margen_beneficio = 0.05
CLV = round(((promedio_ventas * frecuencia_compra / tasa_retencion)) * margen_beneficio, 2)
print(f"El valor de vida del cliente (CLV) para cada cliente es: $ {CLV}")
cliente['Ventas'].describe()<jupyter_output><empty_output><jupyter_text>Se verificara que el valor CLV del cliente es un valor que tiene sentido<jupyter_code>cliente['inicio_cliente'] = (pd.to_datetime(data['Dt_Customer'], errors="coerce").dt.month) #Este campo es el mes en el cual el cliente inicio
meses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']  

mensual_clv = []

for i in range(1, 13): 
  cliente_m = cliente[cliente['inicio_cliente'] == i]
  promedio_ventas = round(np.mean(cliente_m['Ventas']), 2)
  frecuencia_ventas = round(np.mean(cliente_m['Frecuencia']), 2)
  indice_retencion = cliente_m[cliente_m['Frecuencia'] > 15].shape[0]/cliente_m.shape[0] #Intentamos hayar el CLV con una frecuencia que fuera mayor a 1, pero nos daba 0.0 y generaba error
  tasa_cancelacion = round(1-indice_retencion, 2)
  CLV = round(((promedio_ventas * frecuencia_ventas / tasa_cancelacion)) * margen_beneficio, 2)
  mensual_clv.append(meses[i-1])
  mensual_clv.append(CLV)
mensual_clv<jupyter_output><empty_output><jupyter_text>Ahora, si observa el resultado, tenemos 12 valores de CLV diferentes durante 12 meses desde enero hasta diciembre. Y los clientes que se adquieren en diferentes meses tienen diferentes valores CLV adjuntos. Esto se debe a que podrían adquirirse mediante diferentes campañas, etc., por lo que su comportamiento puede ser diferente al de los demás.  Parte 7: ¿Cual es el nivel de sastifaccion del cliente con los productos que ofrece la tienda durante los dos ultimos años?<jupyter_code>#Para saber que porcentaje de sastifaccion hay en los clientes, toca verificar la cantidad de quejas
sastifaccion = data['Complain'].count()
cantidad = data.groupby('Complain')['Complain'].count()
positivo = cantidad[0] * 100 / sastifaccion
negativo = cantidad[1] * 100 / sastifaccion
#Graficamos
val = [positivo, negativo]
labels = ['SIN QUEJAS', 'CON QUEJAS']
expl = [0, 0]
plt.pie(val, labels=labels, explode=expl, startangle=150, shadow=True, autopct='%1.1f%%', radius=1, colors=['#d682ea', '#82eae4'])
plt.title("Sastifacción de los clientes")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1237693943451209, 'fraction_numerical': 0.01094746790580452, 'mean_word_length': 5.7611821086261985, 'pattern_counts': {'":': 2, '<': 71, '<?xml version=': 0, '>': 70, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 16, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '473599', 'license': 'MIT', 'n_tokens_mistral': 9309, 'n_tokens_neox': 9056, 'n_words': 2751, 'path': 'ProyectoFinal.ipynb', 'repo_name': 'GabyLeon10100/MujeresDigitales', 'size': '25394'}