Initial commit: Data Analysis application with FastAPI backend and Next.js frontend
This commit is contained in:
266
backend/generate_test_data.py
Normal file
266
backend/generate_test_data.py
Normal file
@@ -0,0 +1,266 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user