import streamlit as st
import pandas as pd
import joblib
st.set_page_config(page_title="Clusterização de Clientes", layout="wide")
st.title("Aplicação de Clusterização com KMeans")
# Carregar artefatos salvos
encoder = joblib.load("encoder.pkl")
scaler = joblib.load("scaler.pkl")
modelo = joblib.load("kmeans.pkl")
st.write("Faça upload de um arquivo CSV com a coluna 'sexo' e demais atributos usados no treinamento.")
arquivo = st.file_uploader("Selecione o arquivo CSV", type="csv")
def descrever_cluster(c):
descricoes = {
0: "Grupo 0: público jovem, forte interesse em moda, música e aparência.",
1: "Grupo 1: perfil ligado a esportes e atividades culturais.",
2: "Grupo 2: perfil equilibrado, com interesses em música, dança e moda."
}
return descricoes.get(c, "Grupo sem descrição.")
if arquivo is not None:
df = pd.read_csv(arquivo)
st.subheader("Prévia dos dados")
st.dataframe(df.head())
if "sexo" not in df.columns:
st.error("O arquivo precisa conter a coluna 'sexo'.")
else:
# Codificação
sexo_cod = encoder.transform(df[["sexo"]])
sexo_df = pd.DataFrame(
sexo_cod,
columns=encoder.get_feature_names_out(["sexo"]),
index=df.index
)
dados = pd.concat([df, sexo_df], axis=1).drop("sexo", axis=1)
# Escalonamento
dados_escalados = scaler.transform(dados)
# Clusterização
clusters = modelo.predict(dados_escalados)
resultado = df.copy()
resultado["cluster"] = clusters
resultado["descricao_cluster"] = resultado["cluster"].apply(descrever_cluster)
st.subheader("Resultado da clusterização")
st.dataframe(resultado)
st.subheader("Distribuição dos grupos")
contagem = resultado["cluster"].value_counts().sort_index()
st.bar_chart(contagem)
st.subheader("Descrição dos grupos encontrados")
for c in sorted(resultado["cluster"].unique()):
st.write(f"**Cluster {c}:** {descrever_cluster(c)}")
csv = resultado.to_csv(index=False).encode("utf-8")
st.download_button(
label="Baixar resultado em CSV",
data=csv,
file_name="clientes_clusterizados.csv",
mime="text/csv"
)
else:
st.info("Envie um arquivo CSV para começar.")