# Importações
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder, MinMaxScaler, LabelEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.dummy import DummyClassifier
from sklearn.tree import DecisionTreeClassifier, plot_tree
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
import pickle
# Carregamento dos dados
dados = pd.read_csv('churn.csv')
dados.drop(columns='id_cliente', inplace=True)
# Visualizações categóricas
variaveis_categoricas = ['pais', 'sexo_biologico', 'tem_cartao_credito', 'membro_ativo']
for var in variaveis_categoricas:
sns.countplot(data=dados, x=var, hue='churn')
plt.title(f'Distribuição de {var}')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
# Visualizações numéricas
variaveis_numericas = ['score_credito', 'idade', 'anos_de_cliente', 'saldo', 'servicos_adquiridos', 'salario_estimado']
for var in variaveis_numericas:
sns.histplot(data=dados, x=var, kde=True, bins=30)
plt.title(f'Distribuição: {var}')
plt.tight_layout()
plt.show()
# Separação de X e y
x = dados.drop('churn', axis=1)
y = LabelEncoder().fit_transform(dados['churn'])
# Pré-processador
col_cat = x.select_dtypes(include='object').columns.tolist()
col_num = x.select_dtypes(exclude='object').columns.tolist()
preprocessador = ColumnTransformer(transformers=[
('onehot', OneHotEncoder(drop='if_binary', sparse_output=False), col_cat),
('scaler', MinMaxScaler(), col_num)
])
# Divisão dos dados
x_treino, x_teste, y_treino, y_teste = train_test_split(x, y, test_size=0.2, stratify=y, random_state=42)
# Dummy Classifier (modelo base)
dummy = DummyClassifier(strategy='most_frequent', random_state=42)
dummy_pipe = Pipeline([('pre', preprocessador), ('modelo', dummy)])
dummy_pipe.fit(x_treino, y_treino)
acc_dummy = dummy_pipe.score(x_teste, y_teste)
# Árvore de Decisão
arvore = DecisionTreeClassifier(max_depth=4, random_state=42)
arvore_pipe = Pipeline([('pre', preprocessador), ('modelo', arvore)])
arvore_pipe.fit(x_treino, y_treino)
acc_tree = arvore_pipe.score(x_teste, y_teste)
# KNN
knn = KNeighborsClassifier()
knn_pipe = Pipeline([('pre', preprocessador), ('modelo', knn)])
knn_pipe.fit(x_treino, y_treino)
acc_knn = knn_pipe.score(x_teste, y_teste)
# Avaliação
print(f"Acurácia Dummy: {acc_dummy:.4f}")
print(f"Acurácia Árvore: {acc_tree:.4f}")
print(f"Acurácia KNN: {acc_knn:.4f}")
# Escolha do melhor modelo
if acc_knn > acc_tree and acc_knn > acc_dummy:
melhor_pipe, nome_arquivo = knn_pipe, 'modelo_knn.pkl'
elif acc_tree > acc_dummy:
melhor_pipe, nome_arquivo = arvore_pipe, 'modelo_arvore.pkl'
else:
melhor_pipe, nome_arquivo = dummy_pipe, 'modelo_dummy.pkl'
# Salvando modelo
with open(nome_arquivo, 'wb') as f:
pickle.dump(melhor_pipe, f)
print(f"Modelo salvo como: {nome_arquivo}")
# Carrega o modelo salvo
with open(nome_arquivo, 'rb') as f:
modelo_carregado = pickle.load(f)
# Novo dado
novo_dado = pd.DataFrame([{
'score_credito': 850,
'pais': 'França',
'sexo_biologico': 'Homem',
'idade': 27,
'anos_de_cliente': 3,
'saldo': 56000,
'servicos_adquiridos': 1,
'tem_cartao_credito': 'sim',
'membro_ativo': 'sim',
'salario_estimado': 85270.00
}])
# Previsão
previsao = modelo_carregado.predict(novo_dado)
print("Previsão [0=Não, 1=Sim]:", previsao[0])