"""
Module: K-Means Clustering
Catégorie : Apprentissage non supervisé
Difficulté : Débutant

Généré depuis la plateforme ML Formation
"""

# Imports
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, mean_squared_error, r2_score

# Charger le dataset
df = pd.read_csv('clustering_2d.csv')

# Explorer les données
# Type: Code exécutable
# =============================================================================
# ETAPE 1 : EXPLORATION DES DONNEES POUR LE CLUSTERING
# =============================================================================
# En clustering non supervise, nous n'avons PAS de labels !
# L'objectif est de decouvrir des structures cachees dans les donnees.

print("=" * 70)
print("EXPLORATION DU DATASET POUR CLUSTERING")
print("=" * 70)
print()
print("RAPPEL : En clustering, nous n'avons PAS de labels predefinies.")
print("L'algorithme doit trouver les groupes par lui-meme !")
print()

# --- 1.1 Apercu des donnees ---
print("1. APERCU DES DONNEES")
print("-" * 40)
print("Chaque ligne represente un point dans un espace 2D (x, y).")
print("Nous ne savons pas a quel groupe appartient chaque point.")
print()
display(df.head(10), title="Apercu du dataset (pas de label !)")

# --- 1.2 Dimensions ---
n_points = len(df)
n_features = len(df.columns)
print()
print("2. DIMENSIONS DU DATASET")
print("-" * 40)
print(f"   Nombre de points   : {n_points}")
print(f"   Nombre de features : {n_features}")
print()
print(f"   Interpretation : Nous avons {n_points} points a regrouper")
print(f"   dans un espace a {n_features} dimensions.")

# --- 1.3 Statistiques descriptives ---
print()
print("3. STATISTIQUES DESCRIPTIVES")
print("-" * 40)
print("   Ces statistiques nous aident a comprendre l'etendue des donnees :")
print()
display(df.describe().round(3), title="Statistiques")

# --- 1.4 Analyse de l'etendue ---
print()
print("4. ANALYSE DE L'ETENDUE DES DONNEES")
print("-" * 40)

x_min, x_max = df['x'].min(), df['x'].max()
y_min, y_max = df['y'].min(), df['y'].max()
x_range = x_max - x_min
y_range = y_max - y_min

print(f"   Coordonnee X : de {x_min:.2f} a {x_max:.2f} (etendue : {x_range:.2f})")
print(f"   Coordonnee Y : de {y_min:.2f} a {y_max:.2f} (etendue : {y_range:.2f})")
print()

# Verification de l'echelle
if abs(x_range - y_range) / max(x_range, y_range) < 0.3:
    print("   ✓ Les echelles X et Y sont similaires.")
    print("     → Pas besoin de normalisation pour K-Means.")
else:
    print("   ⚠ Les echelles X et Y sont differentes.")
    print("     → Envisagez une normalisation avant K-Means.")

# --- 1.5 Detecter des patterns potentiels ---
print()
print("5. INDICES DE STRUCTURE DANS LES DONNEES")
print("-" * 40)

# Verifier si les donnees ont une distribution uniforme ou structuree
x_std = df['x'].std()
y_std = df['y'].std()

print(f"   Ecart-type X : {x_std:.3f}")
print(f"   Ecart-type Y : {y_std:.3f}")
print()
print("   Si l'ecart-type est grand par rapport a l'etendue,")
print("   les donnees sont probablement dispersees (plusieurs clusters).")
print()

# Correlation entre X et Y
correlation = df['x'].corr(df['y'])
print(f"   Correlation X-Y : {correlation:.3f}")
if abs(correlation) < 0.3:
    print("   → Faible correlation : les clusters peuvent etre dans toutes les directions.")
else:
    print("   → Correlation notable : les clusters pourraient suivre une diagonale.")

print()
print("=" * 70)
print("CONCLUSION : Visualisons les donnees pour voir les groupes naturels !")
print("=" * 70)


# Visualiser les données brutes
# Type: Code exécutable
# =============================================================================
# ETAPE 2 : VISUALISATION DES DONNEES BRUTES
# =============================================================================
# La visualisation est CRUCIALE en clustering pour :
# 1) Observer les groupes naturels a l'oeil nu
# 2) Estimer le nombre de clusters (K) a utiliser
# 3) Detecter des outliers potentiels

print("=" * 70)
print("VISUALISATION DES DONNEES BRUTES")
print("=" * 70)
print()
print("Question cle : Combien de groupes distincts voyez-vous ?")
print("Cette observation guidera notre choix de K pour K-Means.")
print()

# Creation du graphique
plt.figure(figsize=(10, 8))
plt.scatter(df['x'], df['y'], alpha=0.6, color='#9B7AC4', s=50,
            edgecolors='white', linewidth=0.5)
plt.xlabel('X', fontsize=12)
plt.ylabel('Y', fontsize=12)
plt.title('Donnees brutes - Pouvez-vous identifier des groupes naturels ?', fontsize=14)
plt.grid(True, alpha=0.3)

# Ajouter une annotation
plt.annotate('Chaque point = un echantillon a clusteriser',
             xy=(0.02, 0.98), xycoords='axes fraction',
             fontsize=10, color='gray', ha='left', va='top')

plt.tight_layout()
plt.show()

# --- Analyse visuelle guidee ---
print()
print("GUIDE D'OBSERVATION")
print("-" * 40)
print()
print("   Posez-vous ces questions en regardant le graphique :")
print()
print("   1. GROUPES DISTINCTS :")
print("      → Combien de 'nuages' de points distincts voyez-vous ?")
print("      → Les groupes sont-ils bien separes ou se chevauchent-ils ?")
print()
print("   2. FORME DES GROUPES :")
print("      → Les groupes sont-ils plutot ronds (bon pour K-Means)")
print("        ou allonges/irreguliers (mieux adapte a DBSCAN) ?")
print()
print("   3. TAILLE DES GROUPES :")
print("      → Les groupes semblent-ils de taille similaire ?")
print("      → Y a-t-il des groupes beaucoup plus petits que d'autres ?")
print()
print("   4. POINTS ISOLES :")
print("      → Y a-t-il des points tres eloignes des autres (outliers) ?")
print("      → Ces points pourraient perturber K-Means.")
print()

# Estimation visuelle
print("   ESTIMATION VISUELLE :")
print("   Sur ce dataset, on peut observer environ 5 groupes distincts.")
print("   Nous allons utiliser K=5 pour commencer, puis valider avec")
print("   la methode du coude.")


# ----------------------------------------------------------------------
# La suite de ce module demande un compte.
# Les cellules de code restantes ne sont pas dans ce fichier.
# ----------------------------------------------------------------------
