Skip to content

Commit e07ef0d

Browse files
Merge branch 'release/0.1.0'
2 parents 501424b + 151fad0 commit e07ef0d

45 files changed

Lines changed: 544730 additions & 2 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,7 @@ cython_debug/
158158
# and can be added to the global gitignore or merged into this file. For a more nuclear
159159
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
160160
#.idea/
161+
162+
# Outros:
163+
164+
rascunho.md

README.md

Lines changed: 219 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,219 @@
1-
# Customer_Segmentation_For_Marketing
2-
Você foi contratado por uma empresa de e-commerce que está buscando entender melhor o comportamento de seus clientes para personalizar as suas campanhas de marketing. Para isso, a empresa disponibilizou uma base de dados em csv contendo dados sobre clientes, produtos e transações da loja realizadas entre os anos de 2010 e 2011.
1+
# Customer Segmentation For Marketing:
2+
3+
### Índice
4+
5+
- [Customer Segmentation For Marketing:](#customer-segmentation-for-marketing)
6+
- [Índice](#índice)
7+
- [Contextualização:](#contextualização)
8+
- [Metodologia Aplicada:](#metodologia-aplicada)
9+
- [Entendimento do Negócio:](#entendimento-do-negócio)
10+
- [Entendimento dos Dados:](#entendimento-dos-dados)
11+
- [Variáveis:](#variáveis)
12+
- [Verificando as Dimensões do DataFrame:](#verificando-as-dimensões-do-dataframe)
13+
- [Verificando Tipos:](#verificando-tipos)
14+
- [Describe:](#describe)
15+
- [Verificando Valores Nulos:](#verificando-valores-nulos)
16+
- [Verificando Valores duplicados:](#verificando-valores-duplicados)
17+
- [Verificando As Variáveis Com Boxplot:](#verificando-as-variáveis-com-boxplot)
18+
- [Verificando Distribuição:](#verificando-distribuição)
19+
- [Preparação dos Dados:](#preparação-dos-dados)
20+
- [Criando Uma Copia do DataFrame:](#criando-uma-copia-do-dataframe)
21+
- [Removendo nulos:](#removendo-nulos)
22+
- [Convertendo a coluna 'CustomerID' para str:](#convertendo-a-coluna-customerid-para-str)
23+
- [Convertendo a coluna 'InvoiceDate' para Datetime::](#convertendo-a-coluna-invoicedate-para-datetime)
24+
- [Análise RFV:](#análise-rfv)
25+
- [Recency:](#recency)
26+
- [Frequency:](#frequency)
27+
- [Monetary:](#monetary)
28+
- [Merge:](#merge)
29+
- [RFV Boxplot:](#rfv-boxplot)
30+
- [RFV - Distribuição Recency:](#rfv---distribuição-recency)
31+
- [RFV - Distribuição Frequency:](#rfv---distribuição-frequency)
32+
- [RFV - Distribuição Monetary:](#rfv---distribuição-monetary)
33+
- [Data Preparetion:](#data-preparetion)
34+
- [Testando técnicas de remoção de outliers:](#testando-técnicas-de-remoção-de-outliers)
35+
- [RFV Boxplot Limpo:](#rfv-boxplot-limpo)
36+
- [RFV Distribuição:](#rfv-distribuição)
37+
- [Modelagem:](#modelagem)
38+
- [KMeans:](#kmeans)
39+
- [Gráfico Kelbow Visualizer:](#gráfico-kelbow-visualizer)
40+
- [Criando os clusters::](#criando-os-clusters)
41+
- [Gráfico Scatterplot3d:](#gráfico-scatterplot3d)
42+
- [Grupos:](#grupos)
43+
- [Clusters:](#clusters)
44+
- [Dataframe Clusters:](#dataframe-clusters)
45+
- [gráfico\_heatmap:](#gráfico_heatmap)
46+
- [Avaliação:](#avaliação)
47+
- [Implantação:](#implantação)
48+
- [Pré-requisitos para executar o projeto:](#pré-requisitos-para-executar-o-projeto)
49+
- [Instale o Pacote Anaconda:](#instale-o-pacote-anaconda)
50+
- [Ambiente virtual e Dependências:](#ambiente-virtual-e-dependências)
51+
52+
53+
### Contextualização:
54+
Você foi contratado por uma empresa de e-commerce que está buscando entender
55+
melhor o comportamento de seus clientes para personalizar as suas campanhas de
56+
marketing. Para isso, a empresa disponibilizou uma base de dados em csv contendo
57+
dados sobre clientes, produtos e transações da loja realizadas entre os anos de 2010 e
58+
2011.
59+
60+
### Metodologia Aplicada:
61+
A análise foi realizada utilizando o modelo CRISP-DM, o CRISP-DM (Cross Industry Standard Process for Data Mining) é um modelo padrão de processo para projetos de mineração de dados que define um conjunto de fases e tarefas que devem ser executadas para desenvolver soluções de mineração de dados efetivas.
62+
63+
![CRISP-DM](/core/img/CRISP-DM.png)
64+
65+
O modelo CRISP-DM é uma abordagem sistemática e estruturada para a mineração de dados que ajuda as empresas a desenvolver soluções de mineração de dados de maneira eficiente e eficaz, reduzindo o tempo e os custos do projeto.
66+
67+
## Entendimento do Negócio:
68+
Com base nesses dados, você precisa agrupar os clientes em clusters com base em seu comportamento de compra. Isso irá permitir identificar padrões e características em comum entre os clientes, como:
69+
Clientes que compram os mesmos produtos;
70+
Clientes que possuem a mesma frequência de compras;
71+
Clientes que gastam mais dinheiro em suas compras.
72+
A partir desses clusters, gere insights para que a empresa possa segmentar melhor a sua base de clientes e personalizar as suas campanhas de marketing, direcionando promoções e ofertas aos clientes com base no comportamento de compras.
73+
74+
## Entendimento dos Dados:
75+
### Variáveis:
76+
![Data Frame](/core/img/dataframe.png)
77+
78+
### Verificando as Dimensões do DataFrame:
79+
![Data Frame](/core/img/shape.png)
80+
81+
### Verificando Tipos:
82+
![Data Frame](/core/img/tipos.png)
83+
84+
### Describe:
85+
![Data Frame](/core/img/describe.png)
86+
87+
### Verificando Valores Nulos:
88+
![Data Frame](/core/img/nulos.png)
89+
90+
### Verificando Valores duplicados:
91+
![Data Frame](/core/img/duplicados.png)
92+
93+
### Verificando As Variáveis Com Boxplot:
94+
![Data Frame](/core/img/boxplot1.png)
95+
96+
### Verificando Distribuição:
97+
![Data Frame](/core/img/distribuição.png)
98+
99+
## Preparação dos Dados:
100+
### Criando Uma Copia do DataFrame:
101+
![Data Frame](/core/img/copy.png)
102+
103+
### Removendo nulos:
104+
![Data Frame](/core/img/removendo_nulos.png)
105+
106+
### Convertendo a coluna 'CustomerID' para str:
107+
![Data Frame](/core/img/CustomerID.png)
108+
109+
### Convertendo a coluna 'InvoiceDate' para Datetime::
110+
![Data Frame](/core/img/InvoiceDate.png)
111+
112+
### Análise RFV:
113+
![Data Frame](/core/img/RFV.png)
114+
115+
### Recency:
116+
![Data Frame](/core/img/Recency.png)
117+
118+
### Frequency:
119+
![Data Frame](/core/img/Frequency.png)
120+
121+
### Monetary:
122+
![Data Frame](/core/img/Monetary.png)
123+
124+
### Merge:
125+
![Data Frame](/core/img/Merge.png)
126+
127+
### RFV Boxplot:
128+
![Data Frame](/core/img/rfv_boxplot.png)
129+
130+
### RFV - Distribuição Recency:
131+
![Data Frame](/core/img/distribuição_Recency.png)
132+
133+
### RFV - Distribuição Frequency:
134+
![Data Frame](/core/img/distribuição_Frequency.png)
135+
136+
### RFV - Distribuição Monetary:
137+
![Data Frame](/core/img/distribuição_Monetary.png)
138+
139+
### Data Preparetion:
140+
![Data Frame](/core/img/data_preparetion.png)
141+
142+
### Testando técnicas de remoção de outliers:
143+
![Data Frame](/core/img/outliers.png)
144+
145+
### RFV Boxplot Limpo:
146+
![Data Frame](/core/img/rfv_boxplot_limpo.png)
147+
148+
### RFV Distribuição:
149+
![Alt text](/core/img/rfv_distribuição.png)
150+
151+
## Modelagem:
152+
### KMeans:
153+
![Alt text](/core/img/kmeans.png)
154+
155+
### Gráfico Kelbow Visualizer:
156+
![Alt text](/core/img/gráfico_kelbow_visualizer.png)
157+
158+
### Criando os clusters::
159+
![Alt text](/core/img/criando_os_clusters.png)
160+
161+
### Gráfico Scatterplot3d:
162+
![Alt text](/core/img/gráfico_clusters_scatterplot3d.png)
163+
164+
### Grupos:
165+
![Alt text](/core/img/grupos.png)
166+
167+
### Clusters:
168+
![Alt text](/core/img/clusters.png)
169+
170+
### Dataframe Clusters:
171+
![Alt text](/core/img/dataframe_clusters.png)
172+
173+
### gráfico_heatmap:
174+
![Alt text](/core/img/corr.png)
175+
176+
## Avaliação:
177+
Com o objetivo de identificar e segmentar os perfis dos clientes com base em seu padrão de compra, a fim de promover campanhas de marketing mais personalizadas, chegamos a 5 grupos distintos, representando 5 perfis de clientes.
178+
179+
- Perfil 1: O perfil 1 apresenta a pior recência em relação aos demais, indicando que esses clientes estão afastados de nossa plataforma há mais tempo. No entanto, o perfil 1 não difere muito dos perfis 4 e 5 em relação à recência. Além disso, a frequência de acesso à nossa plataforma por parte desse perfil também é baixa, sendo a segunda mais baixa, ficando atrás apenas do perfil 5.
180+
181+
- Perfil 2: O perfil 2 é composto por clientes que tiveram interações muito recentes em nossa plataforma. Portanto, é importante manter esses clientes interessados em nosso e-commerce, seja por meio de anúncios de produtos relevantes que possam resolver seus problemas ou proporcionar diversão. Em resumo, o perfil 2 apresenta excelente recência, frequência adequada e gastos moderados.
182+
183+
- Perfil 3: O perfil 3 também é composto por clientes que entraram em contato recentemente com nossa plataforma. Eles possuem excelente recência, frequência adequada e gastos moderados.
184+
185+
- Perfil 4: O perfil 4 é o perfil de cliente mais engajado que temos. Apresenta recência adequada, frequência excelente e gastos consideráveis. Em suma, o perfil 4 é extremamente valioso, e cada centavo investido nesse grupo vale a pena.
186+
187+
- Perfil 5: O perfil 5 representa nosso perfil de cliente mais inativo. Possui recência satisfatória, frequência baixa e gastos reduzidos. Trata-se de um perfil de cliente com pouca interação e, consequentemente, baixo volume de compras.
188+
189+
Conclusão: Nosso principal objetivo é criar uma campanha de marketing mais personalizada, lembrando que, no final, tudo se resume a vender. Um padrão identificado foi que os clientes que mais gastam em nossa plataforma são aqueles que a frequentam com mais regularidade. Portanto, uma ideia interessante seria criar estratégias para incentivar o cliente a visitar nossa plataforma e interagir. Por exemplo, podemos oferecer um desconto de 25% a partir da compra do 3º item ou promover descontos especiais nas sextas-feiras para clientes fiéis, a fim de fidelizá-los.
190+
191+
## Implantação:
192+
Iniciando a etapa de implementação do modelo em produção.
193+
194+
## Pré-requisitos para executar o projeto:
195+
Abaixo, listarei os requisitos necessários para que o projeto funcione corretamente.
196+
197+
### Instale o Pacote Anaconda:
198+
Você pode baixá-lo em: <https://www.anaconda.com/download/>
199+
200+
### Ambiente virtual e Dependências:
201+
Criando ambiente virtual:
202+
```
203+
conda create -n .cluster
204+
```
205+
206+
Entrando no ambiente virtual:
207+
```
208+
conda activate .cluster
209+
```
210+
211+
Instale as dependências:
212+
```
213+
conda install --file core/requirements.txt
214+
```
215+
216+
---
217+
Linkedin: <https://www.linkedin.com/in/samuel-barbosa-dev/>
218+
219+
E-mail: <samueloficial@protonmail.com>

core/core/DataPreparetion.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import numpy as np
2+
import pandas as pd
3+
from scipy.stats import zscore
4+
from sklearn.preprocessing import scale
5+
from sklearn.preprocessing import LabelEncoder
6+
from DataUnderstanding import DataUnderstanding
7+
8+
9+
class DataPreparetion(DataUnderstanding):
10+
def removendo_nulos(self, dataframe: pd.DataFrame) -> pd.DataFrame:
11+
return dataframe.dropna()
12+
13+
def removing_outliers_zscore(self, dataframe: pd.DataFrame, column: list, threshold: int=3):
14+
z_scores = np.abs(zscore(dataframe[column]))
15+
outlier_indices = np.where(z_scores > threshold)[0]
16+
outlier_labels = dataframe.index[outlier_indices]
17+
dataframe_cleaned = dataframe.drop(outlier_labels)
18+
print(f'Amount of outliers: {len(outlier_indices)}')
19+
return dataframe_cleaned
20+
21+
22+
def removendo_colunas(self, dataframe: pd.DataFrame, colunas=[]) -> pd.DataFrame:
23+
return dataframe.drop(colunas, axis=1)
24+
25+
def renomeando_colunas(self, dataframe: pd.DataFrame, novo_nome_e_velho_nome: dict):
26+
return dataframe.rename(columns=novo_nome_e_velho_nome)
27+
28+
def substituindo_valores(self, dataframe: pd.DataFrame, colunas, valores) -> pd.DataFrame:
29+
return dataframe[colunas].replace(valores)
30+
31+
def convertendo_colunas(self, dataframe: pd.DataFrame, colunas: list, tipo: str) -> pd.DataFrame:
32+
return dataframe[colunas].astype(tipo)
33+
34+
def dummy(self, dataframe: pd.DataFrame, colunas=[]):
35+
dataframe = pd.get_dummies(dataframe[colunas])
36+
colunas = dataframe.columns
37+
return dataframe, colunas
38+
39+
def label_endcode(self, dataframe: pd.DataFrame):
40+
training = LabelEncoder().fit(dataframe)
41+
dataframe = training.transform(dataframe)
42+
return dataframe
43+
44+
def normalizando_os_dados(self, dataframe: pd.DataFrame):
45+
return scale(dataframe)
46+
47+
48+
if __name__ == '__main__':
49+
data_preparetion = DataPreparetion()

core/core/DataUnderstanding.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import pandas as pd
2+
3+
4+
class DataUnderstanding():
5+
def verificando_as_dimensões_do_dataframe(self, dataframe: pd.DataFrame):
6+
dataframe = dataframe.shape
7+
print(f'Linhas: {dataframe[0]} \nColunas: {dataframe[1]}')
8+
9+
def descrição(self, dataframe: pd.DataFrame):
10+
dataframe = dataframe.describe().round(decimals=2)
11+
return dataframe
12+
13+
def verificando_tipos(self, dataframe: pd.DataFrame):
14+
dataframe = (
15+
dataframe.dtypes
16+
.to_frame('Tipos')
17+
)
18+
return dataframe
19+
20+
def verificando_valores_nulos(self, dataframe: pd.DataFrame):
21+
valores_nulos = dataframe.isnull().sum()
22+
percent_missing = (valores_nulos / len(dataframe))
23+
dataframe = pd.DataFrame(
24+
{
25+
'Quantidade': valores_nulos,
26+
'Porcentagem': percent_missing
27+
}
28+
)
29+
dataframe = dataframe.style.format('{:.2%}', subset=['Porcentagem'])
30+
return dataframe
31+
32+
def verificando_valores_duplicados(self, dataframe: pd.DataFrame):
33+
valores_repetidos = dataframe.apply(lambda x: x.duplicated()).sum()
34+
percent_missing = (valores_repetidos / len(dataframe))
35+
dataframe = pd.DataFrame(
36+
{
37+
'Quantidade': valores_repetidos,
38+
'Porcentagem': percent_missing
39+
},
40+
index=dataframe.columns
41+
)
42+
43+
dataframe = dataframe.style.format('{:.2%}', subset=['Porcentagem'])
44+
return dataframe
45+
46+
def frequencia_da_repetição_dos_valores(self, dataframe: pd.DataFrame, coluna: str):
47+
dataframe = dataframe[coluna].value_counts().reset_index()
48+
return dataframe
49+
50+
def verificando_correlação(self, dataframe: pd.DataFrame):
51+
dataframe = dataframe.corr()
52+
return dataframe
53+
54+
55+
if __name__ == '__main__':
56+
data_understanding = DataUnderstanding()

0 commit comments

Comments
 (0)