Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. # import libraries
2. import pandas as pd
3. import numpy as np
4. import sys
5. import matplotlib.pyplot as plt
6. from sklearn.cluster import KMeans
25. # creando una dataframe generico para capturar el CustomerID y nuevos escores de
segmentación# creando una dataframe generico para capturar el CustomerID y nuevos
escores de segmentación, cada fila muestra un CustomerID distinto
26. tx_user = pd.DataFrame(tx_data['CustomerID'].unique())
27. #Asigna en la primera fila el titulo de la columna--
28. tx_user.columns = ['CustomerID']
40. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
recency
41. #tx_user = tx_user[tx_user['Recency']<tx_user['Recency'].quantile(0.98)]
42. #print(tx_user)
49. # 4. Frecuencia
50. #Asigna a la dataframe tx_frequency la cantidad de veces que cada cliente de united
kingdom ha realizado una transaccion por dia, ordenado por CustomerID
51. tx_frequency = tx_uk.groupby('CustomerID').InvoiceDate.count().reset_index()
52. #Cambia el nombre de las columnas a CustomerID y Frequency
53. tx_frequency.columns = ['CustomerID','Frequency']
54. # une ta tabla tx_user con la tabla tx_frequency cuyo punto en comun es CustomerID,
ordenado por CustomerID de tx_user
55. tx_user = pd.merge(tx_user, tx_frequency, on='CustomerID')
56. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
frecuencia
57. #tx_user = tx_user[tx_user['Frequency']<tx_user['Frequency'].quantile(0.98)]
58. # construye 4 grupos para frecuencia y adiciona a tx_user
59. kmeans=KMeans(n_clusters=4)
60. #Ingresa unna columna FrequencyCluster a la tabla tx_user donde se indica el numero de
grupo asignado
61. tx_user['FrequencyCluster']=kmeans.fit_predict(tx_user[['Frequency']])
62. # ordena los grupos por FrequencyCluster, despues por Frequency de la tabla tx_user, y al
final cambia la Frequency en forma ascendete debido al true
63. tx_user = order_cluster('FrequencyCluster', 'Frequency', tx_user, True )
64. # 5. Revenue
65. # calcula el ingreso por cada cliente, multiplicando el precio unitario por la cantidad
66. tx_uk['Revenue'] = tx_uk['UnitPrice'] * tx_uk['Quantity']
67. #Agrupa la columna CustomerID con la columna ingresos agrupados por cliente y la suma
de sus ingresos del pais United Kingdom
68. tx_revenue = tx_uk.groupby('CustomerID').Revenue.sum().reset_index()
69. # pasa estos datos a tx_user, combinando tx_user con tx_revenue siguiendo el orden de
tx_user por CustomerID
70. tx_user = pd.merge(tx_user, tx_revenue, on='CustomerID')
71. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
revenue
72. #tx_user = tx_user[tx_user['Revenue']<tx_user['Revenue'].quantile(0.98)]
92. #Realiza un garfico tridimensional para que se pueda signar los datos
93. ax = fig.add_subplot(111, projection='3d')
110. plt.show()
1. # import libraries
2. import pandas as pd
3. import numpy as np
4. import sys
5. import matplotlib.pyplot as plt
6. from sklearn.cluster import KMeans
7.
8. def order_cluster(cluster_field_name, target_field_name,df,ascending):
9. new_cluster_field_name = 'new_' + cluster_field_name
10. df_new = df.groupby(cluster_field_name)[target_field_name].mean().reset_index()
11. df_new =
df_new.sort_values(by=target_field_name,ascending=ascending).reset_index(drop=True)
12. df_new['index'] = df_new.index
13. df_final = pd.merge(df,df_new[[cluster_field_name,'index']], on=cluster_field_name)
14. df_final = df_final.drop([cluster_field_name],axis=1)
15. df_final = df_final.rename(columns={"index":cluster_field_name})
16. return df_final
17.
18. # lee los datos y crea
19. #Asigna a tx_data toda las filas y columnas del archivo customer_segmenation
20. tx_data = pd.read_csv('./data/customer_segmentation.csv', encoding='cp1252')
21. # convirtiendo el tipo de dato del campo InvoiceDate de string a datetime (fecha mas
hora)
22. tx_data['InvoiceDate'] = pd.to_datetime(tx_data['InvoiceDate'])
23. # creando el campo InvoiceYearMonth para reporte y visualizacion al final de la columna
24. tx_data['InvoiceYearMonth'] = tx_data['InvoiceDate'].map(lambda date: 100*date.year +
date.month)
25. # se trabaja solo con los datos de 'United Kingdom'
26. tx_uk = tx_data.query("Country=='United Kingdom'").reset_index(drop=True)
27.
28. # creando una dataframe generico para capturar el CustomerID y nuevos escores de
segmentación
29. # creando una dataframe generico para capturar el CustomerID y nuevos escores de
segmentación, cada fila muestra un CustomerID distinto
30. tx_user = pd.DataFrame(tx_data['CustomerID'].unique())
31. #Asigna en la primera fila el titulo de la columna--
32. tx_user.columns = ['CustomerID']
33. # 3. Recency ----------------------
34. # calcula la fecha máxima de compra por cada cliente de united kingdom, ademas coloca
los titulos a cada columna y la numeracion a la izquierda que era de origen
35. #ordenado por CustomerID
36. tx_max_purchase = tx_uk.groupby('CustomerID').InvoiceDate.max().reset_index()
37. #Cambia los titulos de las columnas a CustomerID y MaxPurchaseDate
38. tx_max_purchase.columns = ['CustomerID','MaxPurchaseDate']
39. # Compara la fecha de la última transacción por cada cliente, resta la fecha maxima total
menos la fecha de compra de cada cliente
40. tx_max_purchase['Recency'] = (tx_max_purchase['MaxPurchaseDate'].max() -
tx_max_purchase['MaxPurchaseDate']).dt.days
41. #Une la tabla tx_user con la tabla tx_max_purchase de manera que empezamos por la
columna CustomerID de la tabla tx_user
42. #Se muestra las columnas CustomerID y Recency
43. tx_user = pd.merge(tx_user, tx_max_purchase[['CustomerID','Recency']],
on='CustomerID')
44.
45.
46. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su recency
47. #tx_user = tx_user[tx_user['Recency']<tx_user['Recency'].quantile(0.98)]
48. #print(tx_user)
49.
50. # construye 4 grupos para frecuencia y adiciona a tx_user
51. kmeans = KMeans(n_clusters=4)
52. #Ingresa unna columna donde se indica el numero de grupo asignado
53. tx_user['RecencyCluster'] = kmeans.fit_predict(tx_user[['Recency']])
54. # ordena los grupos por RecencyCluster, despues por Recency de la tabla tx_user, y al
final cambia el RecencyCluster en forma descendente debido a false
55. tx_user = order_cluster('RecencyCluster', 'Recency',tx_user,False)
56.
57.
58. # 4. Frecuencia
59. #Asigna a la dataframe tx_frequency la cantidad de veces que cada cliente de united
kingdom ha realizado una transaccion por dia, ordenado por CustomerID
60. tx_frequency = tx_uk.groupby('CustomerID').InvoiceDate.count().reset_index()
61. #Cambia el nombre de las columnas a CustomerID y Frequency
62. tx_frequency.columns = ['CustomerID','Frequency']
63. # une la tabla tx_user con la tabla tx_frequency cuyo punto en comun es CustomerID,
ordenado por CustomerID de tx_user
64. tx_user = pd.merge(tx_user, tx_frequency, on='CustomerID')
65. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su frecuencia
66. #tx_user = tx_user[tx_user['Frequency']<tx_user['Frequency'].quantile(0.98)]
67. # construye 4 grupos para frecuencia y adiciona a tx_user
68. kmeans=KMeans(n_clusters=4)
69. #Ingresa unna columna FrequencyCluster a la tabla tx_user donde se indica el numero de
grupo asignado
70. tx_user['FrequencyCluster']=kmeans.fit_predict(tx_user[['Frequency']])
71. # ordena los grupos por FrequencyCluster, despues por Frequency de la tabla tx_user, y
al final cambia la Frequency en forma ascendete debido al true
72. tx_user = order_cluster('FrequencyCluster', 'Frequency', tx_user, True )
73.
74.
75. # 5. Revenue
76. # calcula el ingreso por cada cliente, multiplicando el precio unitario por la cantidad
77. tx_uk['Revenue'] = tx_uk['UnitPrice'] * tx_uk['Quantity']
78. #Agrupa la columna CustomerID con la columna ingresos agrupados por cliente y la suma
de sus ingresos del pais United Kingdom
79. tx_revenue = tx_uk.groupby('CustomerID').Revenue.sum().reset_index()
80. # pasa estos datos a tx_user, combinando tx_user con tx_revenue siguiendo el orden de
tx_user por CustomerID
81. tx_user = pd.merge(tx_user, tx_revenue, on='CustomerID')
82. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su revenue
83. #tx_user = tx_user[tx_user['Revenue']<tx_user['Revenue'].quantile(0.98)]
84.
85. # construye 4 grupos para frecuencia y adiciona a tx_user
86. kmeans = KMeans(n_clusters=4)
87. #Ingresa unna columna RevenueCluster a la tabla tx_user donde se indica el numero de
grupo asignado
88. tx_user['RevenueCluster'] = kmeans.fit_predict(tx_user[['Revenue']])
89. # ordena los grupos por RevenueCluster, despues por Revenue de la tabla tx_user, y al
final cambia la columna Revenue en forma ascendete debido al true
90. tx_user = order_cluster('RevenueCluster', 'Revenue',tx_user,True)
91. #imprime la tabla tx_user agrupados segun las agrupaciones de los ingresos
92. print(tx_user.head().to_string())
93.
94. # se construye 4 grupos para los clusters identificados
95. kmeans = KMeans(n_clusters=4)
96. #Ingresa unna columna WCCluster a la tabla tx_user donde se agrupa segun su grupo de
recency, grupo de frecuencia y grupo de ingreso
97. #print(tx_user[['RecencyCluster', 'FrequencyCluster','RevenueCluster']])
98.
99. tx_user['VVCCluster'] = kmeans.fit_predict(tx_user[['RecencyCluster',
'FrequencyCluster','RevenueCluster']])
100. #Imprime la tabla tx_user donde se observa los 05 primeros clientes de la lista , que
se ve su recency, frequency y revenue y su grupo respectivo ademas se agrego una
columna de WCCluster
101. print(tx_user.head().to_string())
102. #Imprime segun el grupo de WCCluster su descripcion de cada columna Recency
cluster, FrequencyCluster y RevenueCluster
103. print(tx_user.groupby('VVCCluster')[['RecencyCluster',
'FrequencyCluster','RevenueCluster']].describe().to_string())
104.
105.
106.
107. #Realiza el ploteo de la ventana figura
108. fig = plt.figure()
109.
110. #Realiza un garfico tridimensional para que se pueda signar los datos
111. ax = fig.add_subplot(111, projection='3d')
112.
113. #Realiza la asignacion a x de los valores de RecencyCluster
114. x = np.array(tx_user['RecencyCluster'])
115. #Realiza la asignacion a x de los valores de FrequencyCluster
116. y = np.array(tx_user['FrequencyCluster'])
117. #Realiza la asignacion a x de los valores de RevenueCluster
118. z = np.array(tx_user['RevenueCluster'])
119.
120. #Coloca el titulo del grafico tridimensional
121. ax.set_title("Valor de Vida de los Clientes")
122. #Coloca la etiqueta del eje RecencyCluster
123. ax.set_xlabel("RecencyCluster")
124. #Coloca la etiqueta del eje FrequencyCluster
125. ax.set_ylabel("FrequencyCluster")
126. #Coloca la etiqueta del eje RevenueCluster
127. ax.set_zlabel("RevenueCluster")
128.
129.
130. #Realiza la colocacion de los datos tx_user[WCCluster] en el grafico tridimensional,
donde aquellos puntos donde tiene mas coincidencia se va a visualizar con mayor color y
encerrado en cuadrado
131. ax.scatter(x,y,z, marker="s", c=tx_user["VVCCluster"], s=40, cmap="RdBu")
132.
133. plt.show()
1. # import libraries
2. import pandas as pd
3. import numpy as np
4. import sys
5. import matplotlib.pyplot as plt
6. from sklearn.cluster import KMeans
7.
8. def order_cluster(cluster_field_name, target_field_name,df,ascending):
9. new_cluster_field_name = 'new_' + cluster_field_name
10. df_new = df.groupby(cluster_field_name)[target_field_name].mean().reset_index()
11. df_new =
df_new.sort_values(by=target_field_name,ascending=ascending).reset_index(drop=True)
12. df_new['index'] = df_new.index
13. df_final = pd.merge(df,df_new[[cluster_field_name,'index']], on=cluster_field_name)
14. df_final = df_final.drop([cluster_field_name],axis=1)
15. df_final = df_final.rename(columns={"index":cluster_field_name})
16. return df_final
17.
18. # lee los datos y crea
19. #Asigna a tx_data toda las filas y columnas del archivo customer_segmenation
20. tx_data = pd.read_csv('./data/customer_segmentation.csv', encoding='cp1252')
21. # convirtiendo el tipo de dato del campo InvoiceDate de string a datetime (fecha mas
hora)
22. tx_data['InvoiceDate'] = pd.to_datetime(tx_data['InvoiceDate'])
23. # creando el campo InvoiceYearMonth para reporte y visualizacion al final de la columna
24. tx_data['InvoiceYearMonth'] = tx_data['InvoiceDate'].map(lambda date: 100*date.year +
date.month)
25. # se trabaja solo con los datos de 'United Kingdom'
26. tx_uk = tx_data.query("Country=='United Kingdom'").reset_index(drop=True)
27.
28. # creando una dataframe generico para capturar el CustomerID y nuevos escores de
segmentación
29. # creando una dataframe generico para capturar el CustomerID y nuevos escores de
segmentación, cada fila muestra un CustomerID distinto
30. tx_user = pd.DataFrame(tx_data['CustomerID'].unique())
31. #Asigna en la primera fila el titulo de la columna--
32. tx_user.columns = ['CustomerID']
33. # 3. Recency ----------------------
34. # calcula la fecha máxima de compra por cada cliente de united kingdom, ademas coloca
los titulos a cada columna y la numeracion a la izquierda que era de origen
35. #ordenado por CustomerID
36. tx_max_purchase = tx_uk.groupby('CustomerID').InvoiceDate.max().reset_index()
37. #Cambia los titulos de las columnas a CustomerID y MaxPurchaseDate
38. tx_max_purchase.columns = ['CustomerID','MaxPurchaseDate']
39. # Compara la fecha de la última transacción por cada cliente, resta la fecha maxima total
menos la fecha de compra de cada cliente
40. tx_max_purchase['Recency'] = (tx_max_purchase['MaxPurchaseDate'].max() -
tx_max_purchase['MaxPurchaseDate']).dt.days
41. #Une la tabla tx_user con la tabla tx_max_purchase de manera que empezamos por la
columna CustomerID de la tabla tx_user
42. #Se muestra las columnas CustomerID y Recency
43. tx_user = pd.merge(tx_user, tx_max_purchase[['CustomerID','Recency']],
on='CustomerID')
44.
45.
46. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su recency
47. #tx_user = tx_user[tx_user['Recency']<tx_user['Recency'].quantile(0.98)]
48. #print(tx_user)
49.
50. # construye 4 grupos para frecuencia y adiciona a tx_user
51. kmeans = KMeans(n_clusters=4)
52. #Ingresa unna columna donde se indica el numero de grupo asignado
53. tx_user['RecencyCluster'] = kmeans.fit_predict(tx_user[['Recency']])
54. # ordena los grupos por RecencyCluster, despues por Recency de la tabla tx_user, y al
final cambia el RecencyCluster en forma descendente debido a false
55. tx_user = order_cluster('RecencyCluster', 'Recency',tx_user,False)
56.
57.
58. # 4. Frecuencia
59. #Asigna a la dataframe tx_frequency la cantidad de veces que cada cliente de united
kingdom ha realizado una transaccion por dia, ordenado por CustomerID
60. tx_frequency = tx_uk.groupby('CustomerID').InvoiceDate.count().reset_index()
61. #Cambia el nombre de las columnas a CustomerID y Frequency
62. tx_frequency.columns = ['CustomerID','Frequency']
63. # une la tabla tx_user con la tabla tx_frequency cuyo punto en comun es CustomerID,
ordenado por CustomerID de tx_user
64. tx_user = pd.merge(tx_user, tx_frequency, on='CustomerID')
65. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su frecuencia
66. #tx_user = tx_user[tx_user['Frequency']<tx_user['Frequency'].quantile(0.98)]
67. # construye 4 grupos para frecuencia y adiciona a tx_user
68. kmeans=KMeans(n_clusters=4)
69. #Ingresa unna columna FrequencyCluster a la tabla tx_user donde se indica el numero de
grupo asignado
70. tx_user['FrequencyCluster']=kmeans.fit_predict(tx_user[['Frequency']])
71. # ordena los grupos por FrequencyCluster, despues por Frequency de la tabla tx_user, y
al final cambia la Frequency en forma ascendete debido al true
72. tx_user = order_cluster('FrequencyCluster', 'Frequency', tx_user, True )
73.
74.
75. # 5. Revenue
76. # calcula el ingreso por cada cliente, multiplicando el precio unitario por la cantidad
77. tx_uk['Revenue'] = tx_uk['UnitPrice'] * tx_uk['Quantity']
78. #Agrupa la columna CustomerID con la columna ingresos agrupados por cliente y la suma
de sus ingresos del pais United Kingdom
79. tx_revenue = tx_uk.groupby('CustomerID').Revenue.sum().reset_index()
80. # pasa estos datos a tx_user, combinando tx_user con tx_revenue siguiendo el orden de
tx_user por CustomerID
81. tx_user = pd.merge(tx_user, tx_revenue, on='CustomerID')
82. #Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98%
su revenue
83. #tx_user = tx_user[tx_user['Revenue']<tx_user['Revenue'].quantile(0.98)]
84.
85. # construye 4 grupos para frecuencia y adiciona a tx_user
86. kmeans = KMeans(n_clusters=4)
87. #Ingresa unna columna RevenueCluster a la tabla tx_user donde se indica el numero de
grupo asignado
88. tx_user['RevenueCluster'] = kmeans.fit_predict(tx_user[['Revenue']])
89. # ordena los grupos por RevenueCluster, despues por Revenue de la tabla tx_user, y al
final cambia la columna Revenue en forma ascendete debido al true
90. tx_user = order_cluster('RevenueCluster', 'Revenue',tx_user,True)
91. #imprime la tabla tx_user agrupados segun las agrupaciones de los ingresos
92. #print(tx_user.head().to_string())
93.
94. # se construye 4 grupos para los clusters identificados
95. kmeans = KMeans(n_clusters=4)
96. #Ingresa unna columna WCCluster a la tabla tx_user donde se agrupa segun su grupo de
recency, grupo de frecuencia y grupo de ingreso
97. #print(tx_user[['RecencyCluster', 'FrequencyCluster','RevenueCluster']])
98.
99. tx_user['VVCCluster'] = kmeans.fit_predict(tx_user[['RecencyCluster',
'FrequencyCluster','RevenueCluster']])
100. #Imprime la tabla tx_user donde se observa los 05 primeros clientes de la lista , que
se ve su recency, frequency y revenue y su grupo respectivo ademas se agrego una
columna de WCCluster
101. #print(tx_user.head().to_string())
102. #Imprime segun el grupo de WCCluster su descripcion de cada columna Recency
cluster, FrequencyCluster y RevenueCluster
103. #print(tx_user.groupby('VVCCluster')[['RecencyCluster',
'FrequencyCluster','RevenueCluster']].describe().to_string())
104.
105.
106.
107. #Realiza el ploteo de la ventana figura
108. fig = plt.figure()
109.
110. #Realiza un garfico tridimensional para que se pueda signar los datos
111. ax = fig.add_subplot(111, projection='3d')
112.
113. #Realiza la asignacion a x de los valores de RecencyCluster
114. x = np.array(tx_user['RecencyCluster'])
115. #Realiza la asignacion a x de los valores de FrequencyCluster
116. y = np.array(tx_user['FrequencyCluster'])
117. #Realiza la asignacion a x de los valores de RevenueCluster
118. z = np.array(tx_user['RevenueCluster'])
119.
120. #Coloca el titulo del grafico tridimensional
121. ax.set_title("Valor de Vida de los Clientes")
122. #Coloca la etiqueta del eje RecencyCluster
123. ax.set_xlabel("RecencyCluster")
124. #Coloca la etiqueta del eje FrequencyCluster
125. ax.set_ylabel("FrequencyCluster")
126. #Coloca la etiqueta del eje RevenueCluster
127. ax.set_zlabel("RevenueCluster")
128.
129.
130. #Realiza la colocacion de los datos tx_user[WCCluster] en el grafico tridimensional,
donde aquellos puntos donde tiene mas coincidencia se va a visualizar con mayor color y
encerrado en cuadrado
131. ax.scatter(x,y,z, marker="s", c=tx_user["VVCCluster"], s=40, cmap="RdBu")
132.
133. plt.show()
Después de Eliminar de la tabla tx_user aquellos clientes que se encuentren por encima del
98% su revenue (Aumenta la dispersión en el eje de revenue)
Grupo de 03
Grupo de 04
Grupo de 05
Grupo de 06
Grupo de 08
Grupo de 10
6. Haciendo un análisis manual, determine el orden de los grupos VVC, es decir qué grupo
VVC es el de mayor rendimiento y cuál el de menor rendimiento (se trata de identificar los
criterios).
El grupo VVC esta formado por los criterios de Recency, Frequency y Revenue, demanera que
el que tenga mayor rendimiento será aquel que tenga menor Recency (Fecha de la ultima
transacción de los clientes menos la fecha de transacción de cada cliente), mayor Frequency
(cantidad de veces que va cada cliente), y mayor revenue(suma de ingresos de cada cliente),
cuyo grado de importancia seria primero Revenue, después Frequency y por ultimo Recency
Se toma el de grupo de 06 por tener mayor dispersión y se ordena los grupos de VVCCluster en
función a los revenue, y se elige aquellos que tenga mayor revenue como mayor rendimiento y
aquellos que tengan menor revenue menor rendimiento
Mayor rendimiento
Grupo 05 VVCCluster
Promedio 3786 Revenue
Promedio 317 Frequency
Promedio 14 Recency
Menor rendimiento
Grupo 0 VVCCluster
Promedio 123.5 Revenue
Promedio 451 Frequency
Promedio 123.5 Recency
count mean std min 25% 50% 75% max count mean std
min 25% 50% 75% max count mean std min 25% 50% 75% max
VVCCluster
0 248.0 11.229839 13.325252 0.0 2.00 7.0 16.0 86.0 248.0 451.713710
722.969446 4.0 173.5 298.0 452.00 7983.0 248.0 123.500000 71.735626 0.0 61.75
123.5 185.25 247.0
1 570.0 184.436842 31.856230 131.0 156.00 184.0 211.0 244.0 570.0 34.861404
44.400479 1.0 10.0 22.0 40.75 548.0 570.0 559.164912 284.451251 248.0 390.25
532.5 674.75 3204.0
2 1471.0 19.223657 13.180469 0.0 8.00 18.0 30.0 47.0 1471.0 64.579878
47.664548 1.0 26.0 53.0 97.00 190.0 1471.0 1537.843644 426.949963 801.0 1169.50
1537.0 1905.50 3064.0
3 948.0 77.609705 22.762434 48.0 59.00 72.0 93.0 130.0 948.0 51.995781
54.268642 1.0 15.0 32.0 69.00 378.0 948.0 2732.456751 284.184071 942.0 2498.75
2736.5 2972.25 3210.0
4 478.0 304.393305 41.183489 245.0 266.25 300.0 336.0 373.0 478.0 23.374477
29.688388 1.0 7.0 15.0 28.75 312.0 478.0 3415.280335 198.470728 2263.0 3312.25
3430.5 3548.75 3668.0
5 235.0 14.080851 12.446718 0.0 3.50 10.0 23.0 47.0 235.0 317.106383
140.129555 191.0 217.0 264.0 367.50 981.0 235.0 3786.000000 67.982841 3669.0
3727.50 3786.0 3844.50 3903.0
tx_user['VVCCluster'] = kmeans.fit_predict(tx_user[['RecencyCluster',
'FrequencyCluster','RevenueCluster']])
#Imprime la tabla tx_user donde se observa los 05 primeros clientes de la lista , que se ve su
recency, frequency y revenue y su grupo respectivo ademas se agrego una columna de
WCCluster
print(tx_user.head().to_string())
#Imprime segun el grupo de WCCluster su descripcion de cada columna Recency cluster,
FrequencyCluster y RevenueCluster
print(tx_user.groupby('VVCCluster')[['RecencyCluster',
'FrequencyCluster','RevenueCluster']].describe().to_string())
count mean std min 25% 50% 75% max count mean std
min 25% 50% 75% max count mean std min 25% 50% 75% max
VVCCluster
0 248.0 11.229839 13.325252 0.0 2.00 7.0 16.0 86.0 248.0 451.713710
722.969446 4.0 173.5 298.0 452.00 7983.0 248.0 123.500000 71.735626 0.0 61.75
123.5 185.25 247.0
1 570.0 184.436842 31.856230 131.0 156.00 184.0 211.0 244.0 570.0 34.861404
44.400479 1.0 10.0 22.0 40.75 548.0 570.0 559.164912 284.451251 248.0 390.25
532.5 674.75 3204.0
2 1471.0 19.223657 13.180469 0.0 8.00 18.0 30.0 47.0 1471.0 64.579878
47.664548 1.0 26.0 53.0 97.00 190.0 1471.0 1537.843644 426.949963 801.0 1169.50
1537.0 1905.50 3064.0
3 948.0 77.609705 22.762434 48.0 59.00 72.0 93.0 130.0 948.0 51.995781
54.268642 1.0 15.0 32.0 69.00 378.0 948.0 2732.456751 284.184071 942.0 2498.75
2736.5 2972.25 3210.0
4 478.0 304.393305 41.183489 245.0 266.25 300.0 336.0 373.0 478.0 23.374477
29.688388 1.0 7.0 15.0 28.75 312.0 478.0 3415.280335 198.470728 2263.0 3312.25
3430.5 3548.75 3668.0
5 235.0 14.080851 12.446718 0.0 3.50 10.0 23.0 47.0 235.0 317.106383
140.129555 191.0 217.0 264.0 367.50 981.0 235.0 3786.000000 67.982841 3669.0
3727.50 3786.0 3844.50 3903.0
# import libraries
import pandas as pd
import numpy as np
import sys
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
# 3. Recency ----------------------
# calcula la fecha máxima de compra por cada cliente de united kingdom, ademas coloca los
titulos a cada columna y la numeracion a la izquierda que era de origen
#ordenado por CustomerID
tx_max_purchase = tx_uk.groupby('CustomerID').InvoiceDate.max().reset_index()
#Cambia los titulos de las columnas a CustomerID y MaxPurchaseDate
tx_max_purchase.columns = ['CustomerID','MaxPurchaseDate']
# Compara la fecha de la última transacción por cada cliente, resta la fecha maxima total
menos la fecha de compra de cada cliente
tx_max_purchase['Recency'] = (tx_max_purchase['MaxPurchaseDate'].max() -
tx_max_purchase['MaxPurchaseDate']).dt.days
#Une la tabla tx_user con la tabla tx_max_purchase de manera que empezamos por la
columna CustomerID de la tabla tx_user
#Se muestra las columnas CustomerID y Recency
tx_user = pd.merge(tx_user, tx_max_purchase[['CustomerID','Recency']], on='CustomerID')
#Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
recency
#tx_user = tx_user[tx_user['Recency']<tx_user['Recency'].quantile(0.98)]
#print(tx_user)
# 4. Frecuencia
#Asigna a la dataframe tx_frequency la cantidad de veces que cada cliente de united kingdom
ha realizado una transaccion por dia, ordenado por CustomerID
tx_frequency = tx_uk.groupby('CustomerID').InvoiceDate.count().reset_index()
#Cambia el nombre de las columnas a CustomerID y Frequency
tx_frequency.columns = ['CustomerID','Frequency']
# une ta tabla tx_user con la tabla tx_frequency cuyo punto en comun es CustomerID,
ordenado por CustomerID de tx_user
tx_user = pd.merge(tx_user, tx_frequency, on='CustomerID')
#Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
frecuencia
#tx_user = tx_user[tx_user['Frequency']<tx_user['Frequency'].quantile(0.98)]
# construye 4 grupos para frecuencia y adiciona a tx_user
kmeans=KMeans(n_clusters=4)
#Ingresa unna columna FrequencyCluster a la tabla tx_user donde se indica el numero de
grupo asignado
tx_user['FrequencyCluster']=kmeans.fit_predict(tx_user[['Frequency']])
# ordena los grupos por FrequencyCluster, despues por Frequency de la tabla tx_user, y al final
cambia la Frequency en forma ascendete debido al true
tx_user = order_cluster('FrequencyCluster', 'Frequency', tx_user, True )
# 5. Revenue
# calcula el ingreso por cada cliente, multiplicando el precio unitario por la cantidad
tx_uk['Revenue'] = tx_uk['UnitPrice'] * tx_uk['Quantity']
#Agrupa la columna CustomerID con la columna ingresos agrupados por cliente y la suma de
sus ingresos del pais United Kingdom
tx_revenue = tx_uk.groupby('CustomerID').Revenue.sum().reset_index()
# pasa estos datos a tx_user, combinando tx_user con tx_revenue siguiendo el orden de
tx_user por CustomerID
tx_user = pd.merge(tx_user, tx_revenue, on='CustomerID')
#Eliminando de la tabla tx_user aquellos clientes que se encuentren por encima del 98% su
revenue
#tx_user = tx_user[tx_user['Revenue']<tx_user['Revenue'].quantile(0.98)]
tx_user['VVCCluster'] = kmeans.fit_predict(tx_user[['RecencyCluster',
'FrequencyCluster','RevenueCluster']])
#Imprime la tabla tx_user donde se observa los 05 primeros clientes de la lista , que se ve su
recency, frequency y revenue y su grupo respectivo ademas se agrego una columna de
WCCluster
print(tx_user.head().to_string())
#Imprime segun el grupo de WCCluster su descripcion de cada columna Recency cluster,
FrequencyCluster y RevenueCluster
print(tx_user.groupby('VVCCluster')[['RecencyCluster',
'FrequencyCluster','RevenueCluster']].describe().to_string())
plt.show()
La empresa tiene 3950 clientes en el país de UnitedKingdom los cuales 235 clientes tienen
mayor rendimiento que nos genera ingresos de 3786 en promedio y frecuencia de 317 con un
recency de 14 dias
Los de menor rendimiento generan ingresos de 123.5 en promedio con una frecuencia de 451
y un recenty de 123.5 dias