"""
Module: Régression linéaire
Catégorie : Apprentissage supervisé - Régression
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('housing_simple.csv')

# Charger et explorer les données
# Type: Code exécutable
# =============================================================================
# ETAPE 1 : EXPLORATION DES DONNEES
# =============================================================================
# Avant de construire un modele, nous devons COMPRENDRE nos donnees.

# Fonction pour formater les nombres au style francais (espace comme separateur)
def fmt(n, decimals=0):
    return f"{n:,.{decimals}f}".replace(",", " ")

print("=" * 70)
print("EXPLORATION DU DATASET IMMOBILIER")
print("=" * 70)
print()

# --- 1.1 Apercu des premieres lignes ---
print("1. APERCU DES DONNEES")
print("-" * 40)
print("Voici les 5 premieres lignes du dataset :")
print("(Chaque ligne = un bien immobilier vendu)")
print()
display(df.head(), title="Apercu du dataset immobilier")

# --- 1.2 Dimensions du dataset ---
n_lignes, n_colonnes = df.shape
print()
print("2. DIMENSIONS DU DATASET")
print("-" * 40)
print(f"   Nombre de biens immobiliers : {n_lignes}")
print(f"   Nombre de caracteristiques  : {n_colonnes}")
print()
print(f"   Interpretation concrete :")
print(f"   → Nous avons {n_lignes} exemples de ventes passees pour entrainer notre modele.")
print(f"   → Pour chaque vente, nous connaissons {n_colonnes} informations.")

# --- 1.3 Types de donnees ---
print()
print("3. COLONNES DISPONIBLES")
print("-" * 40)
for col in df.columns:
    dtype = df[col].dtype
    exemple = df[col].iloc[0]
    print(f"   • {col:12} | Type: {str(dtype):8} | Exemple: {exemple}")

print()
print("   Roles des colonnes :")
print("   → 'surface'  : Variable explicative (ce qu'on connait)")
print("   → 'nb_rooms' : Variable explicative (ce qu'on connait)")
print("   → 'price'    : Variable cible (ce qu'on veut predire)")

# --- 1.4 Statistiques descriptives ---
print()
print("4. STATISTIQUES DESCRIPTIVES")
print("-" * 40)
print("Voici les statistiques cles de chaque colonne :")
print()
display(df.describe().round(2), title="Statistiques descriptives")

# --- 1.5 Interpretation des statistiques ---
print()
print("5. INTERPRETATION DES STATISTIQUES")
print("-" * 40)

surface_min = df['surface'].min()
surface_max = df['surface'].max()
surface_mean = df['surface'].mean()

price_min = df['price'].min()
price_max = df['price'].max()
price_mean = df['price'].mean()

print(f"   SURFACES :")
print(f"   → Les biens vont de {surface_min:.0f} m² a {surface_max:.0f} m²")
print(f"   → Surface moyenne : {surface_mean:.0f} m²")
print(f"   → C'est un marche plutot oriente vers des appartements/maisons de taille moyenne.")
print()
print(f"   PRIX :")
print(f"   → Les prix vont de {fmt(price_min)} EUR a {fmt(price_max)} EUR")
print(f"   → Prix moyen : {fmt(price_mean)} EUR")
print(f"   → Ecart important ({price_max/price_min:.1f}x), suggere une bonne variabilite.")
print()
print("   POURQUOI C'EST IMPORTANT ?")
print("   → Une bonne variabilite dans les donnees permet au modele")
print("     d'apprendre des patterns robustes.")
print("   → Si tous les biens avaient le meme prix, impossible d'apprendre !")

# --- 1.6 Verification des valeurs manquantes ---
print()
print("6. VERIFICATION DE LA QUALITE DES DONNEES")
print("-" * 40)
missing = df.isnull().sum()
if missing.sum() == 0:
    print("   ✓ Aucune valeur manquante ! Le dataset est complet.")
else:
    print("   ⚠ Valeurs manquantes detectees :")
    for col, count in missing.items():
        if count > 0:
            print(f"     - {col}: {count} valeurs manquantes")

print()
print("=" * 70)
print("CONCLUSION : Nos donnees sont pretes pour la modelisation !")
print("=" * 70)


# Visualiser la relation surface-prix
# Type: Code exécutable
# =============================================================================
# ETAPE 2 : VISUALISATION DE LA RELATION
# =============================================================================
# La visualisation est ESSENTIELLE avant de modeliser.
# Elle nous permet de :
# 1) Verifier si une relation lineaire existe (prerequis de la regression)
# 2) Detecter des anomalies ou outliers
# 3) Avoir une intuition sur la force de la relation

print("=" * 70)
print("ANALYSE VISUELLE : SURFACE vs PRIX")
print("=" * 70)
print()
print("Question : Y a-t-il une relation entre la surface et le prix ?")
print("→ Si oui, la regression lineaire sera appropriee.")
print("→ Si non, il faudra envisager d'autres approches.")
print()

# Creation du graphique
plt.figure(figsize=(10, 6))
plt.scatter(df['surface'], df['price'], alpha=0.6, color='#9B7AC4', s=50)
plt.xlabel('Surface (m²)', fontsize=12)
plt.ylabel('Prix (EUR)', fontsize=12)
plt.title('Relation entre Surface et Prix des biens immobiliers', fontsize=14)
plt.grid(True, alpha=0.3)

# Ajouter des annotations explicatives
plt.annotate('Chaque point = un bien vendu', xy=(0.02, 0.98), xycoords='axes fraction',
             fontsize=10, color='gray', ha='left', va='top')

plt.tight_layout()
plt.show()

# --- Analyse de la correlation ---
print()
print("ANALYSE DE LA CORRELATION")
print("-" * 40)
correlation = df['surface'].corr(df['price'])
print(f"   Coefficient de correlation (r) : {correlation:.3f}")
print()

# Interpretation du coefficient
print("   INTERPRETATION :")
if abs(correlation) >= 0.8:
    force = "tres forte"
    emoji = "★★★"
elif abs(correlation) >= 0.6:
    force = "forte"
    emoji = "★★☆"
elif abs(correlation) >= 0.4:
    force = "moderee"
    emoji = "★☆☆"
else:
    force = "faible"
    emoji = "☆☆☆"

direction = "positive (plus grand = plus cher)" if correlation > 0 else "negative"

print(f"   → Force de la relation : {force.upper()} {emoji}")
print(f"   → Direction : {direction}")
print()
print("   GUIDE D'INTERPRETATION DU COEFFICIENT r :")
print("   |r| > 0.8  : Correlation tres forte  → Excellent pour la regression")
print("   |r| > 0.6  : Correlation forte       → Bon pour la regression")
print("   |r| > 0.4  : Correlation moderee    → Acceptable")
print("   |r| < 0.4  : Correlation faible     → Regression peu fiable")
print()
print("   CONCLUSION VISUELLE :")
print("   → Les points suivent globalement une tendance ascendante.")
print("   → La regression lineaire semble appropriee pour ces donnees.")
print("   → On peut estimer qu'un bien plus grand coute plus cher.")


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