import gradio as gr import pandas as pd import numpy as np import plotly.express as px from sklearn.cluster import KMeans, AgglomerativeClustering, SpectralClustering from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA def perform_clustering(data_file, model_type, n_clusters): # Lire les données df = pd.read_csv(data_file.name) # Nettoyage supplémentaire au cas où (suppression des NaN) df = df.dropna() # Standardisation des données scaler = StandardScaler() X_scaled = scaler.fit_transform(df) # Réduction de dimension pour visualisation (si plus de 2 features) if X_scaled.shape[1] > 2: pca = PCA(n_components=2) X_vis = pca.fit_transform(X_scaled) else: X_vis = X_scaled # Application du clustering if model_type == "KMeans": model = KMeans(n_clusters=n_clusters, random_state=42) elif model_type == "CAH": model = AgglomerativeClustering(n_clusters=n_clusters) elif model_type == "Spectral Clustering": model = SpectralClustering(n_clusters=n_clusters, affinity='nearest_neighbors', random_state=42) clusters = model.fit_predict(X_scaled) # Création du dataframe de résultats results_df = df.copy() results_df['Cluster'] = clusters # Visualisation if X_vis.shape[1] >= 2: fig = px.scatter( x=X_vis[:, 0], y=X_vis[:, 1], color=clusters, title=f"Visualisation des clusters ({model_type}, k={n_clusters})", labels={'x': 'Composante 1', 'y': 'Composante 2'}, color_continuous_scale=px.colors.qualitative.Plotly ) else: fig = px.scatter( x=range(len(X_vis)), y=X_vis[:, 0], color=clusters, title=f"Visualisation des clusters ({model_type}, k={n_clusters})", labels={'x': 'Index', 'y': 'Valeur'}, color_continuous_scale=px.colors.qualitative.Plotly ) return fig, results_df # Interface Gradio iface = gr.Interface( fn=perform_clustering, inputs=[ gr.File(label="Uploader votre jeu de données (CSV)"), gr.Dropdown(["KMeans", "CAH", "Spectral Clustering"], label="Modèle de clustering", value="KMeans"), gr.Slider(2, 10, step=1, label="Nombre de clusters (k)", value=3) ], outputs=[ gr.Plot(label="Visualisation des clusters"), gr.Dataframe(label="Données avec labels de cluster") ], title="Application de Clustering", description="""Uploader un jeu de données nettoyé, choisissez un modèle de clustering et le nombre de clusters pour obtenir une visualisation et les résultats.""" ) iface.launch()