"""
Module: Arbre de décision
Catégorie : Apprentissage supervisé - Classification
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('iris_simple.csv')

# Explorer le dataset Iris
# Type: Code exécutable
# =============================================================================
# ETAPE 1 : EXPLORATION DU DATASET IRIS
# =============================================================================
# Le dataset Iris est LE dataset classique du machine learning.
# Il contient 150 fleurs de 3 especes differentes, avec 4 mesures par fleur.

print("=" * 70)
print("EXPLORATION DU DATASET IRIS")
print("=" * 70)
print()
print("Le dataset Iris est un classique du ML depuis 1936 !")
print("Objectif : Classifier des fleurs en 3 especes basees sur leurs mesures.")
print()

# --- 1.1 Apercu des donnees ---
print("1. APERCU DES DONNEES")
print("-" * 40)
print("Chaque ligne = une fleur avec 4 mesures et son espece.")
print()
display(df.head(10), title="Dataset Iris - 10 premieres fleurs")

# --- 1.2 Les 4 features ---
print()
print("2. LES 4 CARACTERISTIQUES (FEATURES)")
print("-" * 40)
print()
print("   SEPAL (sepale = partie externe de la fleur) :")
print("   → sepal_length : Longueur du sepale (cm)")
print("   → sepal_width  : Largeur du sepale (cm)")
print()
print("   PETAL (petale = partie interne coloree) :")
print("   → petal_length : Longueur du petale (cm)")
print("   → petal_width  : Largeur du petale (cm)")
print()

# --- 1.3 Distribution des especes ---
print("3. DISTRIBUTION DES ESPECES")
print("-" * 40)
print()
species_counts = df['species'].value_counts()
for species, count in species_counts.items():
    pct = count / len(df) * 100
    bar = "█" * int(pct / 2)
    print(f"   {species:12} : {count:3d} fleurs ({pct:.0f}%) {bar}")

print()
print("   ✓ Dataset parfaitement equilibre : 50 fleurs par espece")
print()

# --- 1.4 Statistiques par espece ---
print("4. STATISTIQUES PAR ESPECE")
print("-" * 40)
print()
print("   Comparons les mesures moyennes de chaque espece :")
print()
display(df.groupby('species').mean().round(2), title="Moyennes par espece")

# --- 1.5 Observations cles ---
print()
print("5. OBSERVATIONS CLES")
print("-" * 40)
print()

# Analyser les differences
stats = df.groupby('species').mean()

print("   SETOSA :")
print(f"   → Petales tres courts ({stats.loc['setosa', 'petal_length']:.1f} cm)")
print("   → Facile a distinguer des autres especes")
print()

print("   VERSICOLOR vs VIRGINICA :")
print(f"   → Versicolor : petal_width = {stats.loc['versicolor', 'petal_width']:.1f} cm")
print(f"   → Virginica  : petal_width = {stats.loc['virginica', 'petal_width']:.1f} cm")
print("   → Plus difficile a distinguer (valeurs proches)")
print()

print("   HYPOTHESE :")
print("   → Les PETALES semblent plus discriminants que les sepales.")
print("   → L'arbre de decision devrait utiliser petal_length et petal_width")
print("     comme features principales.")

print()
print("=" * 70)
print("Verifions notre hypothese avec une visualisation !")
print("=" * 70)


# Visualiser les features
# Type: Code exécutable
# =============================================================================
# ETAPE 2 : VISUALISATION DES FEATURES
# =============================================================================
# La visualisation nous permet de voir si les especes sont separables
# et quelles features sont les plus discriminantes.

print("=" * 70)
print("VISUALISATION : SEPALES vs PETALES")
print("=" * 70)
print()
print("Comparons la capacite des sepales et des petales a separer les especes.")
print()

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

colors = {'setosa': '#F7E64D', 'versicolor': '#9B7AC4', 'virginica': '#4CAF50'}

# Scatter plot: Sepal
for species in df['species'].unique():
    mask = df['species'] == species
    axes[0].scatter(df[mask]['sepal_length'], df[mask]['sepal_width'],
                   label=species, alpha=0.7, s=60, c=colors[species],
                   edgecolors='white', linewidth=0.5)
axes[0].set_xlabel('Sepal Length (cm)', fontsize=11)
axes[0].set_ylabel('Sepal Width (cm)', fontsize=11)
axes[0].set_title('SEPALES : Length vs Width', fontsize=12, fontweight='bold')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

# Scatter plot: Petal
for species in df['species'].unique():
    mask = df['species'] == species
    axes[1].scatter(df[mask]['petal_length'], df[mask]['petal_width'],
                   label=species, alpha=0.7, s=60, c=colors[species],
                   edgecolors='white', linewidth=0.5)
axes[1].set_xlabel('Petal Length (cm)', fontsize=11)
axes[1].set_ylabel('Petal Width (cm)', fontsize=11)
axes[1].set_title('PETALES : Length vs Width', fontsize=12, fontweight='bold')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

# --- Analyse visuelle ---
print()
print("ANALYSE VISUELLE")
print("-" * 40)
print()
print("   GRAPHIQUE 1 - SEPALES :")
print("   → Les 3 especes se CHEVAUCHENT beaucoup")
print("   → Difficile de tracer des frontieres claires")
print("   → Les sepales seuls ne suffisent pas a classifier")
print()
print("   GRAPHIQUE 2 - PETALES :")
print("   → SETOSA est completement SEPAREE (en bas a gauche)")
print("   → VERSICOLOR et VIRGINICA sont proches mais distinguables")
print("   → Les petales sont BEAUCOUP plus discriminants !")
print()

print("   CONCLUSION POUR L'ARBRE DE DECISION :")
print("   → L'algorithme devrait d'abord utiliser petal_length")
print("     pour separer Setosa des autres (split facile)")
print("   → Puis utiliser petal_width pour distinguer")
print("     Versicolor de Virginica (split plus fin)")
print()
print("   L'arbre de decision va decouvrir ces regles automatiquement !")


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