""" Générateur de données de test pour l'outil d'analyse de données. Crée des fichiers CSV et XLSX avec des corrélations et relations polynomiales. """ import pandas as pd import numpy as np from pathlib import Path # Configuration np.random.seed(42) n_samples = 500 output_dir = Path(__file__).parent.parent / "test_data" output_dir.mkdir(exist_ok=True) print(f"📁 Génération des données de test dans: {output_dir}") # ============================================================================ # 1. Dataset Ventes & Marketing (corrélations multiples, relations linéaires) # ============================================================================ print("\n📊 Dataset: Ventes & Marketing") ventes_data = { # Budget marketing mensuel (€) 'budget_marketing': np.random.uniform(1000, 50000, n_samples), # Heures de publicité TV 'tv_ads_hours': np.random.uniform(5, 100, n_samples), # Nombre de posts sur réseaux sociaux 'social_media_posts': np.random.randint(10, 200, n_samples), # Prix moyen du produit (€) - légère corrélation négative avec ventes 'prix_moyen': np.random.uniform(20, 100, n_samples), # Temperature moyenne (°C) - effet saisonnier 'temperature': np.random.normal(20, 8, n_samples), # Concurrence (index 1-10) 'concurrence': np.random.randint(1, 11, n_samples), } df_ventes = pd.DataFrame(ventes_data) # Créer les ventes avec des relations réalistes # Ventes de base ventes_base = 5000 # Effet budget marketing (fortement positif) effet_budget = df_ventes['budget_marketing'] * 0.8 # Effet TV ads (modéré) effet_tv = df_ventes['tv_ads_hours'] * 25 # Effet social media (faible mais positif) effet_social = df_ventes['social_media_posts'] * 8 # Effet prix (négatif - prix plus élevé = moins de ventes) effet_prix = -df_ventes['prix_moyen'] * 15 # Effet température (positif - meilleur temps = plus de ventes) effet_temp = df_ventes['temperature'] * 30 # Effet concurrence (négatif) effet_concurrence = -df_ventes['concurrence'] * 200 # Bruit aléatoire bruit = np.random.normal(0, 500, n_samples) # Ventes totales df_ventes['ventes'] = (ventes_base + effet_budget + effet_tv + effet_social + effet_prix + effet_temp + effet_concurrence + bruit) # Arrondir df_ventes['ventes'] = df_ventes['ventes'].round(2) # Sauvegarder ventes_csv = output_dir / "ventes_marketing.csv" ventes_excel = output_dir / "ventes_marketing.xlsx" df_ventes.to_csv(ventes_csv, index=False) df_ventes.to_excel(ventes_excel, index=False) print(f" ✅ {ventes_csv.name}: {n_samples} lignes, {len(df_ventes.columns)} colonnes") print(f" ✅ {ventes_excel.name}: {n_samples} lignes, {len(df_ventes.columns)} colonnes") # ============================================================================ # 2. Dataset Production Industriel (relation polynomiale / quadratique) # ============================================================================ print("\n🏭 Dataset: Production Industrielle") production_data = { # Température machine (°C) 'temperature_machine': np.random.uniform(150, 250, n_samples), # Pression (bar) 'pression': np.random.uniform(2, 10, n_samples), # Vitesse conveyor (m/min) 'vitesse_conveyor': np.random.uniform(50, 150, n_samples), # Humidité (%) 'humidite': np.random.uniform(30, 70, n_samples), # Qualité matière première (index 1-100) 'qualite_matiere': np.random.uniform(60, 100, n_samples), } df_production = pd.DataFrame(production_data) # Relation polynomiale: température optimale ~200°C # Efficacité = a*(T - Toptimal)^2 + b T_optimal = 200 df_production['efficacite_production'] = ( -0.08 * (df_production['temperature_machine'] - T_optimal) ** 2 + 95 # Efficacité maximale + df_production['pression'] * 1.5 + df_production['vitesse_conveyor'] * 0.1 + df_production['qualite_matiere'] * 0.3 + np.random.normal(0, 3, n_samples) ) # Borner entre 0 et 100 df_production['efficacite_production'] = df_production['efficacite_production'].clip(0, 100).round(2) # Défauts de production (relation inverse avec l'efficacité) df_production['defauts'] = ( 100 - df_production['efficacite_production'] ) * 0.5 + np.random.normal(0, 1, n_samples) df_production['defauts'] = df_production['defauts'].clip(0, None).round(2) # Sauvegarder production_csv = output_dir / "production_industrielle.csv" production_excel = output_dir / "production_industrielle.xlsx" df_production.to_csv(production_csv, index=False) df_production.to_excel(production_excel, index=False) print(f" ✅ {production_csv.name}: {n_samples} lignes, {len(df_production.columns)} colonnes") print(f" ✅ {production_excel.name}: {n_samples} lignes, {len(df_production.columns)} colonnes") # ============================================================================ # 3. Dataset Santé & Fitness (relations mixtes) # ============================================================================ print("\n🏃 Dataset: Santé & Fitness") sante_data = { # Âge (années) 'age': np.random.randint(18, 80, n_samples), # Poids (kg) 'poids': np.random.normal(75, 15, n_samples), # Taille (cm) 'taille': np.random.normal(170, 10, n_samples), # Heures d'exercice par semaine 'heures_exercice': np.random.uniform(0, 15, n_samples), # Calories consommées par jour 'calories_jour': np.random.normal(2200, 400, n_samples), # Heures de sommeil 'heures_sommeil': np.random.normal(7, 1.5, n_samples), # Niveau de stress (1-10) 'stress': np.random.randint(1, 11, n_samples), } df_sante = pd.DataFrame(sante_data) # IMC (BMI) df_sante['imc'] = (df_sante['poids'] / (df_sante['taille'] / 100) ** 2).round(2) # Métabolisme de base (formule de Harris-Benedict simplifiée) # Hommes: BMR = 88.362 + (13.397 × kg) + (4.799 × cm) - (5.677 × age) df_sante['metabolisme_base'] = ( 88.362 + 13.397 * df_sante['poids'] + 4.799 * df_sante['taille'] - 5.677 * df_sante['age'] + np.random.normal(0, 50, n_samples) ).round(2) # Niveau d'énergie (subjectif 1-10) df_sante['niveau_energie'] = ( 5 + 0.3 * df_sante['heures_exercice'] - 0.2 * df_sante['stress'] + 0.15 * df_sante['heures_sommeil'] - 0.01 * (df_sante['age'] - 30) + np.random.normal(0, 1, n_samples) ).clip(1, 10).round(2) # Sauvegarder sante_csv = output_dir / "sante_fitness.csv" sante_excel = output_dir / "sante_fitness.xlsx" df_sante.to_csv(sante_csv, index=False) df_sante.to_excel(sante_excel, index=False) print(f" ✅ {sante_csv.name}: {n_samples} lignes, {len(df_sante.columns)} colonnes") print(f" ✅ {sante_excel.name}: {n_samples} lignes, {len(df_sante.columns)} colonnes") # ============================================================================ # 4. Dataset Finance (relation exponentielle) # ============================================================================ print("\n💰 Dataset: Finance & Investissement") finance_data = { # Montant investi (€) 'montant_investi': np.random.uniform(1000, 100000, n_samples), # Durée investissement (années) 'duree_annees': np.random.uniform(1, 30, n_samples), # Taux de rendement annuel (%) 'taux_rendement': np.random.uniform(2, 15, n_samples), # Risque (1-10) 'niveau_risque': np.random.randint(1, 11, n_samples), } df_finance = pd.DataFrame(finance_data) # Valeur finale avec intérêts composés: A = P(1 + r)^t df_finance['valeur_finale'] = ( df_finance['montant_investi'] * (1 + df_finance['taux_rendement'] / 100) ** df_finance['duree_annees'] * (1 - 0.02 * df_finance['niveau_risque']) # Pénalité de risque + np.random.normal(0, df_finance['montant_investi'] * 0.01, n_samples) ).round(2) # Profit df_finance['profit'] = (df_finance['valeur_finale'] - df_finance['montant_investi']).round(2) # Rendement total (%) df_finance['rendement_total'] = (df_finance['profit'] / df_finance['montant_investi'] * 100).round(2) # Sauvegarder finance_csv = output_dir / "finance_investissement.csv" finance_excel = output_dir / "finance_investissement.xlsx" df_finance.to_csv(finance_csv, index=False) df_finance.to_excel(finance_excel, index=False) print(f" ✅ {finance_csv.name}: {n_samples} lignes, {len(df_finance.columns)} colonnes") print(f" ✅ {finance_excel.name}: {n_samples} lignes, {len(df_finance.columns)} colonnes") # ============================================================================ # Résumé # ============================================================================ print("\n" + "="*60) print("✅ Tous les fichiers de test ont été générés avec succès !") print("="*60) print(f"\n📂 Répertoire: {output_dir}") print("\n📋 Fichiers créés:") print(" 1. ventes_marketing.csv/xlsx - Corrélations multiples linéaires") print(" 2. production_industrielle.csv/xlsx - Relation polynomiale (quadratique)") print(" 3. sante_fitness.csv/xlsx - Relations mixtes + IMC calculé") print(" 4. finance_investissement.csv/xlsx - Relation exponentielle") print("\n💡 Utilisez ces fichiers pour tester:") print(" • Analyse de corrélation") print(" • Régression linéaire, polynomiale, exponentielle") print(" • Import CSV et Excel") print("="*60)