267 lines
9.1 KiB
Python
267 lines
9.1 KiB
Python
"""
|
||
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)
|