Administration

← Retour

Log : 20260322_080000

=== CRAWL 20260322_080000 ===
Trigger: scheduled
Started: 2026-03-22T08:00:00.000260
============================================================

Récupération de la page 1/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 2/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 3/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 4/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=4
  → 35 annonces récupérées (total en mémoire: 140)
Export de 140 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 5/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=5
  → 35 annonces récupérées (total en mémoire: 175)
Export de 175 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 6/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=6
  → 35 annonces récupérées (total en mémoire: 210)
Export de 210 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 7/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=7
  → 35 annonces récupérées (total en mémoire: 245)
Export de 245 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 8/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=8
  → 35 annonces récupérées (total en mémoire: 280)
Export de 280 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 9/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=9
  → 35 annonces récupérées (total en mémoire: 315)
Export de 315 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 10/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=10
  → 35 annonces récupérées (total en mémoire: 350)
Export de 350 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 11/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=11
  → 35 annonces récupérées (total en mémoire: 385)
Export de 385 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 12/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=12
  → 35 annonces récupérées (total en mémoire: 420)
Export de 420 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 13/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=13
  → 35 annonces récupérées (total en mémoire: 455)
Export de 455 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 14/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=14
  → 35 annonces récupérées (total en mémoire: 490)
Export de 490 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 15/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=15
  → 35 annonces récupérées (total en mémoire: 525)
Export de 525 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 16/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=16
  → 35 annonces récupérées (total en mémoire: 560)
Export de 560 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 17/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=17
  → 35 annonces récupérées (total en mémoire: 595)
Export de 595 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 18/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=18
  → 35 annonces récupérées (total en mémoire: 630)
Export de 630 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 19/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=19
  → 35 annonces récupérées (total en mémoire: 665)
Export de 665 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 20/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=20
  → 35 annonces récupérées (total en mémoire: 700)
Export de 700 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 21/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=21
  → 35 annonces récupérées (total en mémoire: 735)
Export de 735 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 22/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=22
  → 35 annonces récupérées (total en mémoire: 770)
Export de 770 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 23/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=23
  → 35 annonces récupérées (total en mémoire: 805)
Export de 805 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 24/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=24
  → 35 annonces récupérées (total en mémoire: 840)
Export de 840 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 25/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=25
  → 35 annonces récupérées (total en mémoire: 875)
Export de 875 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 26/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=26
  → 35 annonces récupérées (total en mémoire: 910)
Export de 910 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 27/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=27
  → 35 annonces récupérées (total en mémoire: 945)
Export de 945 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 28/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=28
  → 35 annonces récupérées (total en mémoire: 980)
Export de 980 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 29/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=29
  → 35 annonces récupérées (total en mémoire: 1015)
Export de 1015 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 30/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=30
  → 35 annonces récupérées (total en mémoire: 1050)
Export de 1050 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 31/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=31
  → 35 annonces récupérées (total en mémoire: 1085)
Export de 1085 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 32/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=32
  → 35 annonces récupérées (total en mémoire: 1120)
Export de 1120 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 33/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=33
  → 35 annonces récupérées (total en mémoire: 1155)
Export de 1155 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 34/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=34
  → 35 annonces récupérées (total en mémoire: 1190)
Export de 1190 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 35/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=35
  → 35 annonces récupérées (total en mémoire: 1225)
Export de 1225 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 36/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=36
  → 35 annonces récupérées (total en mémoire: 1260)
Export de 1260 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 37/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=37
  → 35 annonces récupérées (total en mémoire: 1295)
Export de 1295 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 38/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=38
  → 35 annonces récupérées (total en mémoire: 1330)
Export de 1330 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 39/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=39
  → 35 annonces récupérées (total en mémoire: 1365)
Export de 1365 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 40/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=40
  → 35 annonces récupérées (total en mémoire: 1400)
Export de 1400 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.
Récupération de la page 41/41 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=clio+4&price=3000-9000&regdate=2016-max&u_car_brand=RENAULT&u_car_model=RENAULT_Clio&gearbox=1&seats=5%2C4&order=asc&page=41
  → 35 annonces récupérées (total en mémoire: 1435)
Export de 1435 annonces vers /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv réussi.

Terminé : 1435 annonces au total dans /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv
INFO: Model override : clio_4
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_clio_4_20260322_080000.csv
   ✅ 1435 lus, 1435 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 1435 lus, 1435 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6456 annonces en base
════════════════════════════════════════════════════════════
INFO: 1421 list_id lus dans le CSV.
INFO: 1454 annonces actives en base pour renault clio_4.
INFO: 33 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_clio_4_20260322_080000.csv
  Brand : renault  |  Modèle : clio_4
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 1421
  Annonces actives en DB  : 1454
  Absentes du crawl       : 33
  Marquées indisponibles  : 33
════════════════════════════════════════════════════════════

  Vérification :
  SELECT list_id, available, unavailable_detected_at FROM ads WHERE available = 0;
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/clio_4/figures
  🔍 Modèle filtré    : clio_4
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 2597 annonces chargées (modèle 'clio_4')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 2597

📋 Premières lignes (colonnes parsées) :
      list_id                                                                          subject  price_eur  year_model  mileage_km     fuel    brand   model owner_type first_publication_date
0  3127969515                                                                   Renault clio 4       7000        2018       82900  essence  renault  clio_4        pro    2026-01-15 08:48:18
1  3118025641                               Renault clio 4 1.5 dci 2019 entretenu chez renault       7990        2019      113000   diesel  renault  clio_4    private    2025-12-27 01:30:58
2  3143719888             Renault clio 4 phase 2 0.9 tce 90cv energy limited entretien complet       7990        2018       95000  essence  renault  clio_4        pro    2026-02-12 11:14:08
3  3141083795  Renault Clio 4/IV Authentique / 1.2 16 V 75 ch / 88280 kms / Entretiens à jours       5990        2014       88280  essence  renault  clio_4        pro    2026-02-07 16:41:23
4  3147329929                                                                           Clio 4       4000        2014      100000  essence  renault  clio_4    private    2026-02-18 19:23:14

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2024-04-05 09:38:00
   Dernière publication : 2026-03-22 08:23:32
   Durée : 715 jours

👤 Répartition par type de vendeur :
   private         : 1680 (64.7%)
   pro             :  917 (35.3%)

⛽ Répartition par carburant :
   diesel               : 1417 (54.6%)
   essence              : 1176 (45.3%)
   autre                :    3 (0.1%)
   gpl                  :    1 (0.0%)

🏭 Top 10 marques :
   renault              : 2597 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    0 lignes supprimées
      km_aberrants              :    1 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    1
      Restantes               : 2596 / 2597
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :   39 outliers (1.5%)
      Bornes IQR : [4,740 ; 10,740]
   mileage_km           :   41 outliers (1.6%)
      Bornes IQR : [18,297 ; 253,022]
   age_years            :    8 outliers (0.3%)
      Bornes IQR : [5 ; 13]

   📌 Total d'annonces outliers (au moins 1 variable) : 73 (2.8%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 2596
   Dont outliers identifiés    : 73
   Annonces non-outliers       : 2523

   Plages de valeurs :
      price_eur            : [     3,300 ;      9,000]  (moy:      7,613)
      mileage_km           : [       125 ;    380,000]  (moy:    137,566)
      year_model           : [     2,014 ;      2,024]  (moy:      2,017)
      age_years            : [         2 ;         12]  (moy:          9)
      km_per_year          : [        18 ;     54,286]  (moy:     16,095)

   💾 2596 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  8 signaux de suspicion détectés
      km_trop_bas_diesel: 6
      km_trop_bas_essence: 2
   💾 8 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count          Mean   Median          Std         Min         Q1            Q3           Max          IQR
  price_eur   2596   7613.097843   7900.0  1103.421198 3300.000000   6990.000   8490.000000   9000.000000  1500.000000
 mileage_km   2596 137566.210709 134000.0 44647.442150  125.000000 106318.750 165000.000000 380000.000000 58681.250000
 year_model   2596   2017.271957   2017.0     1.361740 2014.000000   2016.000   2018.000000   2024.000000     2.000000
  age_years   2596      8.728043      9.0     1.361740    2.000000      8.000     10.000000     12.000000     2.000000
km_per_year   2596  16094.615952  15700.0  5693.547982   17.857143  12178.125  19564.732143  54285.714286  7386.607143

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur 2,596    7,613    7,900  1,103.42 3,300    6,990    8,490    9,000   1,500
 mileage_km 2,596  137,566  134,000 44,647.44   125  106,319  165,000  380,000  58,681
 year_model 2,596    2,017    2,017      1.36 2,014    2,016    2,018    2,024       2
  age_years 2,596      8.7      9.0      1.36   2.0      8.0     10.0     12.0     2.0
km_per_year 2,596 16,094.6 15,700.0  5,693.55  17.9 12,178.1 19,564.7 54,285.7 7,386.6

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 14%, σ = 1,103)
      → Étendue : [3,300 ; 9,000] (IQR = 1,500)

   📌 mileage_km :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 32%, σ = 44,647)
      → Étendue : [125 ; 380,000] (IQR = 58,681)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 1)
      → Étendue : [2,014 ; 2,024] (IQR = 2)

   📌 age_years :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 16%, σ = 1)
      → Étendue : [2 ; 12] (IQR = 2)

   📌 km_per_year :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 35%, σ = 5,694)
      → Étendue : [18 ; 54,286] (IQR = 7,387)

======================================================================
2026-03-22 08:02:25,237 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:02:25,237 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2014    53      6,972      7,200        N/A
     2015    55      7,319      7,600      -5.0%
     2016   748      7,290      7,500      +0.4%
     2017   690      7,625      7,800      -4.6%
     2018   560      7,723      7,990      -1.3%
     2019   351      7,968      8,200      -3.2%
     2020   107      8,285      8,590      -4.0%
     2021    24      8,345      8,490      -0.7%
     2022     6      8,838      8,930      -5.9%
     2024     2      8,000      8,000      +9.5%

   📌 Décote annuelle moyenne : -1.6%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k     9      7,514      6,990        N/A
         20-50k    16      8,158      8,600      +8.6%
         50-80k   164      8,199      8,490      +0.5%
        80-120k   811      7,998      8,000      -2.5%
       120-160k   830      7,902      7,990      -1.2%
       160-200k   529      7,142      7,000      -9.6%
          200k+   237      5,898      5,800     -17.4%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       2     2      8,000        N/A
       4     6      8,838     +10.5%
       5    24      8,345      -5.6%
       6   107      8,285      -0.7%
       7   351      7,968      -3.8%
       8   560      7,723      -3.1%
       9   690      7,625      -1.3%
      10   748      7,290      -4.4%
      11    55      7,319      +0.4%
      12    53      6,972      -4.7%

   📌 La décote ralentit significativement à 6 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
             autre     3      7,630      6,990
            diesel  1417      7,468      7,700
           essence  1175      7,787      7,990

   📌 Carburant avec prix médian le plus élevé : essence (7,990€)
   📌 Carburant avec prix médian le plus bas : autre (6,990€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private  1679      7,450      7,600
          pro   917      7,912      7,990

   📌 Test Mann-Whitney (médiane) : p = 0.0000
   ✅ Différence SIGNIFICATIVE (p < 0.05)
   📌 Écart médian Pro - Particulier : +390€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (clio_4) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/clio_4/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        10k : décote    2.0% (n=  2)
        20k : décote  -16.7% (n=  5)
        30k : décote    1.6% (n=  6)
        40k : décote   14.3% (n=  5) ⚡
        50k : décote  -12.2% (n= 34)
        60k : décote   -2.5% (n= 48)
        70k : décote    3.0% (n= 82)
        80k : décote   -0.9% (n=124)
        90k : décote    0.9% (n=195)
       100k : décote    2.4% (n=212)
       110k : décote    0.4% (n=280)
       120k : décote   -2.0% (n=207)
       130k : décote    1.4% (n=209)
       140k : décote    0.3% (n=214)
       150k : décote    2.7% (n=200)
       160k : décote    3.9% (n=172)
       170k : décote    2.0% (n=146)
       180k : décote    3.9% (n=110)
       190k : décote    3.7% (n=101)
       200k : décote    6.4% (n= 93)
       210k : décote    4.4% (n= 46)
       220k : décote   -4.1% (n= 21)
       230k : décote   11.3% (n= 30) ⚡
       240k : décote    4.0% (n=  8)
       250k : décote    1.0% (n= 15)
       260k : décote   -2.9% (n=  4)
       270k : décote   15.3% (n=  4) ⚡
       280k : décote  -17.0% (n=  5)
       290k : décote   18.5% (n=  6) ⚡
      300k+ : décote  -10.5% (n=  5)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 40k km : 14.3%
      → 230k km : 11.3%
      → 270k km : 15.3%
      → 290k km : 18.5%
   ✅ Sauvegardé : /home/ubuntu/app/stats/clio_4/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     4 ans : décote  -10.5% (n=  6) 🐢 LENTE
     5 ans : décote    5.6% (n= 24)
     6 ans : décote    0.7% (n=107) 🐢 LENTE
     7 ans : décote    3.8% (n=351)
     8 ans : décote    3.1% (n=560)
     9 ans : décote    1.3% (n=690) 🐢 LENTE
    10 ans : décote    4.4% (n=748)
    11 ans : décote   -0.4% (n= 55) 🐢 LENTE
    12 ans : décote    4.7% (n= 53)

   📌 Décote lente (< 5% par an) :
      → 4 ans : -10.5%
      → 6 ans : 0.7%
      → 7 ans : 3.8%
      → 8 ans : 3.1%
      → 9 ans : 1.3%
      → 10 ans : 4.4%
      → 11 ans : -0.4%
      → 12 ans : 4.7%
   ✅ Sauvegardé : /home/ubuntu/app/stats/clio_4/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -174.49 × âge + -0.0130 × km + 10,927
   📌 R² = 0.343
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :  155 (  6.0%)
      👍 Bonne affaire             :  328 ( 12.6%)
      📊 Prix marché               : 1618 ( 62.3%)
      💰 Cher                      :  420 ( 16.2%)
      🔴 Très cher                 :   75 (  2.9%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/clio_4/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3139618502] Renault Clio 4 estate accidenté
       Prix:    3,300€ | Attendu:    7,824€ | Écart:  -57.8% | Année: 2018 | Km: 131,159
    2. [3147790884] Clio 4 phase 2
       Prix:    3,500€ | Attendu:    7,839€ | Écart:  -55.3% | Année: 2018 | Km: 130,000
    3. [3165548491] Renault clio 4
       Prix:    3,500€ | Attendu:    7,469€ | Écart:  -53.1% | Année: 2017 | Km: 145,000
    4. [3150016687] Clio 4
       Prix:    4,000€ | Attendu:    7,776€ | Écart:  -48.6% | Année: 2016 | Km: 108,000
    5. [3162715888] Clio 4 2018
       Prix:    4,700€ | Attendu:    9,010€ | Écart:  -47.8% | Année: 2018 | Km: 40,000
    6. [3154311236] Renault Clio 4 1.5 dCi 2016 – Diesel – Société – 1
       Prix:    3,800€ | Attendu:    7,190€ | Écart:  -47.2% | Année: 2016 | Km: 153,000
    7. [3147329929] Clio 4
       Prix:    4,000€ | Attendu:    7,531€ | Écart:  -46.9% | Année: 2014 | Km: 100,000
    8. [3144664626] Clio 4 retour de vol
       Prix:    4,800€ | Attendu:    8,989€ | Écart:  -46.6% | Année: 2019 | Km: 55,000
    9. [3161045630] Clio 4 75ch
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
       Prix:    4,000€ | Attendu:    6,982€ | Écart:  -42.7% | Année: 2016 | Km: 169,000
   10. [3138542846] Clio 4 essence retour vol
       Prix:    4,500€ | Attendu:    7,706€ | Écart:  -41.6% | Année: 2015 | Km: 100,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3147178650] 🚗 Renault Clio 4 en très bon état
       Prix:    7,000€ | Attendu:    4,759€ | Écart:  +47.1% | Année: 2019 | Km: 380,000
    2. [3163754314] Clio 4 initiale paris
       Prix:    8,900€ | Attendu:    6,578€ | Écart:  +35.3% | Année: 2016 | Km: 200,000
    3. [3161126708] RENAULT CLIO IV dCi 110 Initiale Paris | FULL OPTI
       Prix:    8,990€ | Attendu:    6,662€ | Écart:  +34.9% | Année: 2017 | Km: 207,000
    4. [3165923653] RENAULT CLIO IV BUSINESS dCi 90 Energy eco2 82g Bu
       Prix:    8,990€ | Attendu:    7,008€ | Écart:  +28.3% | Année: 2016 | Km: 166,990
    5. [3144046817] Clio 5
       Prix:    9,000€ | Attendu:    7,037€ | Écart:  +27.9% | Année: 2019 | Km: 205,000
    6. [3151967791] Clio 4 initiale Paris
       Prix:    8,900€ | Attendu:    6,961€ | Écart:  +27.9% | Année: 2017 | Km: 184,000
    7. [3155921737] Renault CLIO IV 1.5 DCI 90CH ENERGY BUSINESS 82G 5
       Prix:    8,490€ | Attendu:    6,649€ | Écart:  +27.7% | Année: 2016 | Km: 194,600
    8. [3155418369] Renault CLIO IV 1.5 DCI 90CH ENERGY BUSINESS 82G 5
       Prix:    8,490€ | Attendu:    6,649€ | Écart:  +27.7% | Année: 2016 | Km: 194,600
    9. [3136191420] Clio IV
       Prix:    7,490€ | Attendu:    5,886€ | Écart:  +27.2% | Année: 2018 | Km: 280,000
   10. [3151279318] Clio 4 ÉDITION ONE
       Prix:    8,899€ | Attendu:    7,005€ | Écart:  +27.0% | Année: 2016 | Km: 167,264

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  12 annonces avec prix suspect
   💾 12 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 2597
Récupération de la page 1/2 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=toyota+yaris&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=TOYOTA&order=asc&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_yaris_20260322_080226.csv réussi.
Récupération de la page 2/2 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=toyota+yaris&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=TOYOTA&order=asc&page=2
  → 15 annonces récupérées (total en mémoire: 50)
Export de 50 annonces vers /home/ubuntu/app/leboncoin_ads_yaris_20260322_080226.csv réussi.

Terminé : 50 annonces au total dans /home/ubuntu/app/leboncoin_ads_yaris_20260322_080226.csv
INFO: Model override : yaris
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_yaris_20260322_080226.csv
   ✅ 50 lus, 50 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 50 lus, 50 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6457 annonces en base
════════════════════════════════════════════════════════════
INFO: 50 list_id lus dans le CSV.
INFO: 50 annonces actives en base pour toyota yaris.
INFO: Aucune annonce manquante — toutes présentes dans le crawl.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_yaris_20260322_080226.csv
  Brand : toyota  |  Modèle : yaris
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 50
  Annonces actives en DB  : 50
  Absentes du crawl       : 0
  Marquées indisponibles  : 0
════════════════════════════════════════════════════════════
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/yaris/figures
  🔍 Modèle filtré    : yaris
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 109 annonces chargées (modèle 'yaris')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 109

📋 Premières lignes (colonnes parsées) :
      list_id                                subject  price_eur  year_model  mileage_km     fuel   brand  model owner_type first_publication_date
0  3149141739           TOYOTA YARIS 69 VVT-i Active       7490        2015      132826  essence  toyota  yaris        pro    2026-02-22 05:48:49
1  3045595309       Toyota Yaris 69 VVT-I DYNAMIC 5P       8200        2015      110000  essence  toyota  yaris        pro    2025-08-25 15:40:00
2  3122430376  TOYOTA YARIS 1.3 VVT-i 69 CH TENDANCE       6990        2015      134360  essence  toyota  yaris        pro    2026-01-04 17:35:29
3  3151345668                           Toyota Yaris       2500        2016      150000   diesel  toyota  yaris    private    2026-02-25 20:06:54
4  3152706239                           Toyota yaris       7700        2017      119800   diesel  toyota  yaris    private    2026-02-28 12:41:35

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2025-06-13 15:11:00
   Dernière publication : 2026-03-21 23:57:57
   Durée : 281 jours

👤 Répartition par type de vendeur :
   pro             :   58 (53.2%)
   private         :   51 (46.8%)

⛽ Répartition par carburant :
   essence              :   94 (86.2%)
   diesel               :   15 (13.8%)

🏭 Top 10 marques :
   toyota               :  109 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    0 lignes supprimées
      km_aberrants              :    0 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    0
      Restantes               :  109 / 109
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    1 outliers (0.9%)
      Bornes IQR : [4,822 ; 11,426]
   mileage_km           :    2 outliers (1.8%)
      Bornes IQR : [21,200 ; 218,800]
   age_years            :    2 outliers (1.8%)
      Bornes IQR : [5 ; 13]

   📌 Total d'annonces outliers (au moins 1 variable) : 4 (3.7%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 109
   Dont outliers identifiés    : 4
   Annonces non-outliers       : 105

   Plages de valeurs :
      price_eur            : [     2,500 ;      9,000]  (moy:      7,923)
      mileage_km           : [       150 ;    200,000]  (moy:    117,271)
      year_model           : [     2,015 ;      2,025]  (moy:      2,017)
      age_years            : [         1 ;         11]  (moy:          9)
      km_per_year          : [        15 ;    143,200]  (moy:     13,989)

   💾 109 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  1 signaux de suspicion détectés
      km_trop_bas_essence: 1
   💾 1 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count          Mean   Median          Std    Min           Q1            Q3      Max          IQR
  price_eur    109   7923.431193   8000.0  1137.532103 2500.0  7299.000000   8950.000000   9000.0  1651.000000
 mileage_km    109 117271.357798 117640.0 37457.950151  150.0 95300.000000 144700.000000 200000.0 49400.000000
 year_model    109   2016.862385   2016.0     1.618572 2015.0  2016.000000   2018.000000   2025.0     2.000000
  age_years    109      9.137615     10.0     1.618572    1.0     8.000000     10.000000     11.0     2.000000
km_per_year    109  13988.852958  12862.1 13176.180580   15.0  9714.285714  14892.857143 143200.0  5178.571429

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min      Q1       Q3       Max     IQR
  price_eur   109    7,923    8,000  1,137.53 2,500   7,299    8,950     9,000   1,651
 mileage_km   109  117,271  117,640 37,457.95   150  95,300  144,700   200,000  49,400
 year_model   109    2,017    2,016      1.62 2,015   2,016    2,018     2,025       2
  age_years   109      9.1     10.0      1.62   1.0     8.0     10.0      11.0     2.0
km_per_year   109 13,988.9 12,862.1 13,176.18  15.0 9,714.3 14,892.9 143,200.0 5,178.6

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 14%, σ = 1,138)
      → Étendue : [2,500 ; 9,000] (IQR = 1,651)

   📌 mileage_km :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 32%, σ = 37,458)
      → Étendue : [150 ; 200,000] (IQR = 49,400)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 2)
      → Étendue : [2,015 ; 2,025] (IQR = 2)

   📌 age_years :
      → Distribution asymétrique GAUCHE (moyenne 9 < médiane 10)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → Faible dispersion (CV = 18%, σ = 2)
      → Étendue : [1 ; 11] (IQR = 2)

   📌 km_per_year :
      → Distribution asymétrique DROITE (moyenne 13,989 > médiane 12,862)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → FORTE dispersion (CV = 94%, σ = 13,176)
      → Étendue : [15 ; 143,200] (IQR = 5,179)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
2026-03-22 08:02:34,537 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:02:34,537 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
   ---------------------------------------------------------------------------
     2015    16      7,880      7,980        N/A
     2016    41      7,644      7,990      +3.0%
     2017    22      8,250      8,495      -7.9%
     2018    14      8,089      8,500      +2.0%
     2019    12      8,443      8,745      -4.4%
     2020     2      8,840      8,840      -4.7%

   📌 Décote annuelle moyenne : -2.4%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k     2      6,125      6,125        N/A
         20-50k     2      8,840      8,840     +44.3%
         50-80k    13      8,724      8,990      -1.3%
        80-120k    39      8,207      8,490      -5.9%
       120-160k    40      7,701      7,990      -6.2%
       160-200k    12      7,142      6,990      -7.3%
          200k+     1      6,500      6,500      -9.0%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       6     2      8,840        N/A
       7    12      8,443      -4.5%
       8    14      8,089      -4.2%
       9    22      8,250      +2.0%
      10    41      7,644      -7.3%
      11    16      7,880      +3.1%

   📌 La décote ralentit significativement à 11 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel    15      7,564      8,000
           essence    94      7,981      8,200

   📌 Carburant avec prix médian le plus élevé : essence (8,200€)
   📌 Carburant avec prix médian le plus bas : diesel (8,000€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private    51      7,606      7,999
          pro    58      8,203      8,490

   📌 Test Mann-Whitney (médiane) : p = 0.0393
   ✅ Différence SIGNIFICATIVE (p < 0.05)
   📌 Écart médian Pro - Particulier : +491€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (yaris) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/yaris/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        60k : décote    0.0% (n=  8)
        70k : décote    1.0% (n=  3)
        80k : décote    3.6% (n=  4)
        90k : décote   -2.0% (n= 11)
       100k : décote    4.8% (n= 12)
       110k : décote    1.4% (n= 12)
       120k : décote   -4.1% (n=  9)
       130k : décote    4.7% (n=  9)
       140k : décote    6.1% (n= 15)
       150k : décote    3.7% (n=  7)
       160k : décote   -4.6% (n=  3)
       170k : décote    4.2% (n=  7)
       180k : décote    9.9% (n=  2)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 180k km : 9.9%
   ✅ Sauvegardé : /home/ubuntu/app/stats/yaris/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     7 ans : décote    4.5% (n= 12)
     8 ans : décote    4.2% (n= 14)
     9 ans : décote   -2.0% (n= 22) 🐢 LENTE
    10 ans : décote    7.3% (n= 41)
    11 ans : décote   -3.1% (n= 16) 🐢 LENTE

   📌 Décote lente (< 5% par an) :
      → 7 ans : 4.5%
      → 8 ans : 4.2%
      → 9 ans : -2.0%
      → 11 ans : -3.1%
   ✅ Sauvegardé : /home/ubuntu/app/stats/yaris/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = 73.56 × âge + -0.0106 × km + 8,498
   📌 R² = 0.117
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :    8 (  7.3%)
      👍 Bonne affaire             :    9 (  8.3%)
      📊 Prix marché               :   71 ( 65.1%)
      💰 Cher                      :   17 ( 15.6%)
      🔴 Très cher                 :    4 (  3.7%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/yaris/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3151345668] Toyota Yaris
       Prix:    2,500€ | Attendu:    7,639€ | Écart:  -67.3% | Année: 2016 | Km: 150,000
    2. [3152322073] Toyota Yaris 1.0 VVTI PRO EXPORT (0101261)
       Prix:    5,250€ | Attendu:    8,555€ | Écart:  -38.6% | Année: 2023 | Km: 15,333
    3. [3157660912] Toyota Yaris
       Prix:    5,500€ | Attendu:    7,928€ | Écart:  -30.6% | Année: 2018 | Km: 109,000
    4. [3165225181] Toyota yaris
       Prix:    5,300€ | Attendu:    7,427€ | Écart:  -28.6% | Année: 2016 | Km: 170,000
    5. [3161632025] Toyota Yaris III - 5P - 2016
       Prix:    5,500€ | Attendu:    7,533€ | Écart:  -27.0% | Année: 2016 | Km: 160,000
    6. [3157975215] Toyota yaris 2011
       Prix:    5,150€ | Attendu:    7,049€ | Écart:  -26.9% | Année: 2025 | Km: 143,200
    7. [3165747251] Toyota Yaris
       Prix:    7,000€ | Attendu:    9,232€ | Écart:  -24.2% | Année: 2016 | Km: 150
    8. [3160315775] Toyota aygo xplay
       Prix:    6,399€ | Attendu:    8,002€ | Écart:  -20.0% | Année: 2018 | Km: 102,000
    9. [3164108049] Toyota yaris lllphase2
       Prix:    6,000€ | Attendu:    7,427€ | Écart:  -19.2% | Année: 2016 | Km: 170,000
   10. [3096659493] Toyota Yaris 3
       Prix:    6,300€ | Attendu:    7,755€ | Écart:  -18.8% | Année: 2015 | Km: 146,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3157352360] Toyota Yaris III 1.5 VVT-i 110 ch – Design Y20-201
       Prix:    8,900€ | Attendu:    7,153€ | Écart:  +24.4% | Année: 2019 | Km: 175,000
    2. [3151218398] TOYOTA Yaris 3 Phase 2 / 1.3 VVTi 16V 100 cv *Fini
       Prix:    8,990€ | Attendu:    7,363€ | Écart:  +22.1% | Année: 2016 | Km: 176,000
    3. [3153117476] Toyota Yaris 70 VVT-i France 5p MY19
       Prix:    8,990€ | Attendu:    7,456€ | Écart:  +20.6% | Année: 2018 | Km: 153,356
    4. [3163742160] Toyota Yaris 90 D-4D Design 5p style
       Prix:    8,990€ | Attendu:    7,489€ | Écart:  +20.0% | Année: 2016 | Km: 164,156
    5. [3135900987] TOYOTA YARIS RC18 110 VVT-i COLLECTION
       Prix:    8,990€ | Attendu:    7,651€ | Écart:  +17.5% | Année: 2018 | Km: 135,000
    6. [3151923222] Toyota Yaris 110 VVT-i Design Y20 5p RC19
       Prix:    8,990€ | Attendu:    7,665€ | Écart:  +17.3% | Année: 2019 | Km: 126,787
    7. [3006906577] Toyota Yaris III 69 VVT-i France
       Prix:    8,990€ | Attendu:    7,737€ | Écart:  +16.2% | Année: 2016 | Km: 140,770
    8. [3146935741] Toyota Yaris 1.4 D-4D 90 Business
       Prix:    8,990€ | Attendu:    7,787€ | Écart:  +15.5% | Année: 2017 | Km: 129,178
    9. [3154060767] Toyota yaris
       Prix:    9,000€ | Attendu:    7,819€ | Écart:  +15.1% | Année: 2017 | Km: 126,126
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
   10. [3154999177] Toyota Yaris 1.4 l D4D
       Prix:    8,900€ | Attendu:    7,828€ | Écart:  +13.7% | Année: 2016 | Km: 132,200

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  1 annonces avec prix suspect
   💾 1 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 109
Récupération de la page 1/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=i20&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=HYUNDAI&u_car_model=HYUNDAI_i20&order=asc&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv réussi.
Récupération de la page 2/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=i20&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=HYUNDAI&u_car_model=HYUNDAI_i20&order=asc&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv réussi.
Récupération de la page 3/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=i20&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=HYUNDAI&u_car_model=HYUNDAI_i20&order=asc&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv réussi.
Récupération de la page 4/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=i20&price=3000-9000&regdate=2016-max&gearbox=1&seats=5%2C4&u_car_brand=HYUNDAI&u_car_model=HYUNDAI_i20&order=asc&page=4
  → 16 annonces récupérées (total en mémoire: 121)
Export de 121 annonces vers /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv réussi.

Terminé : 121 annonces au total dans /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv
INFO: Model override : i20
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_i20_20260322_080236.csv
   ✅ 121 lus, 121 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 121 lus, 121 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6460 annonces en base
════════════════════════════════════════════════════════════
INFO: 120 list_id lus dans le CSV.
INFO: 121 annonces actives en base pour hyundai i20.
INFO: 1 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_i20_20260322_080236.csv
  Brand : hyundai  |  Modèle : i20
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 120
  Annonces actives en DB  : 121
  Absentes du crawl       : 1
  Marquées indisponibles  : 1
════════════════════════════════════════════════════════════

  Vérification :
  SELECT list_id, available, unavailable_detected_at FROM ads WHERE available = 0;
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/i20/figures
  🔍 Modèle filtré    : i20
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 228 annonces chargées (modèle 'i20')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 228

📋 Premières lignes (colonnes parsées) :
      list_id                                     subject  price_eur  year_model  mileage_km     fuel    brand model owner_type first_publication_date
0  3068840554                      HYUNDAI i20 1.2 Initia       8990        2020       91000  essence  hyundai   i20        pro    2025-10-04 11:09:00
1  3150341430                   Hyundai i20 1.2 75 Initia       8990        2019       93859  essence  hyundai   i20        pro    2026-02-24 00:06:00
2  3142118035            Hyundai i20 1.6 CRDI - 16V TURBO       7990        2016      129000   diesel  hyundai   i20        pro    2026-02-09 11:27:08
3  3144114421       Hyundai I20 1.0 T-GDI 100CH INTUITIVE       8490        2019      138310  essence  hyundai   i20        pro    2026-02-13 02:48:08
4  3143181277  GARANTIE 12 MOIS / Crit'air 1 / HYUNAI I20       8990        2015       59700  essence  hyundai   i20        pro    2026-02-11 10:52:53

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2025-04-14 15:12:00
   Dernière publication : 2026-03-22 07:16:27
   Durée : 341 jours

👤 Répartition par type de vendeur :
   private         :  127 (55.7%)
   pro             :  101 (44.3%)

⛽ Répartition par carburant :
   essence              :  184 (80.7%)
   diesel               :   43 (18.9%)
   autre                :    1 (0.4%)

🏭 Top 10 marques :
   hyundai              :  228 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    0 lignes supprimées
      km_aberrants              :    0 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    0
      Restantes               :  228 / 228
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    2 outliers (0.9%)
      Bornes IQR : [4,750 ; 10,750]
   mileage_km           :    6 outliers (2.6%)
      Bornes IQR : [28,968 ; 216,220]
   age_years            :   22 outliers (9.6%)
      Bornes IQR : [8 ; 12]

   📌 Total d'annonces outliers (au moins 1 variable) : 28 (12.3%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 228
   Dont outliers identifiés    : 28
   Annonces non-outliers       : 200

   Plages de valeurs :
      price_eur            : [     3,800 ;      9,000]  (moy:      7,780)
      mileage_km           : [        95 ;    230,567]  (moy:    121,953)
      year_model           : [     2,015 ;      2,025]  (moy:      2,017)
      age_years            : [         1 ;         11]  (moy:          9)
      km_per_year          : [        12 ;     24,308]  (moy:     13,402)

   💾 228 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  3 signaux de suspicion détectés
      km_trop_bas_essence: 1
      km_trop_bas_diesel: 2
   💾 3 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count          Mean        Median          Std      Min        Q1       Q3           Max       IQR
  price_eur    228   7779.710526   7990.000000  1071.492674 3800.000  7000.000   8500.0   9000.000000  1500.000
 mileage_km    228 121953.416667 125370.000000 37645.516822   95.000 99187.000 146000.0 230567.000000 46813.000
 year_model    228   2016.793860   2016.000000     1.359113 2015.000  2016.000   2017.0   2025.000000     1.000
  age_years    228      9.206140     10.000000     1.359113    1.000     9.000     10.0     11.000000     1.000
km_per_year    228  13401.560087  13308.766667  4242.400654   11.875 10479.425  16400.0  24308.166667  5920.575

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   228    7,780    7,990  1,071.49 3,800    7,000    8,500    9,000   1,500
 mileage_km   228  121,953  125,370 37,645.52    95   99,187  146,000  230,567  46,813
 year_model   228    2,017    2,016      1.36 2,015    2,016    2,017    2,025       1
  age_years   228      9.2     10.0      1.36   1.0      9.0     10.0     11.0     1.0
km_per_year   228 13,401.6 13,308.8  4,242.40  11.9 10,479.4 16,400.0 24,308.2 5,920.6

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 14%, σ = 1,071)
      → Étendue : [3,800 ; 9,000] (IQR = 1,500)

   📌 mileage_km :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 31%, σ = 37,646)
      → Étendue : [95 ; 230,567] (IQR = 46,813)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 1)
      → Étendue : [2,015 ; 2,025] (IQR = 1)

   📌 age_years :
      → Distribution asymétrique GAUCHE (moyenne 9 < médiane 10)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → Faible dispersion (CV = 15%, σ = 1)
      → Étendue : [1 ; 11] (IQR = 1)

   📌 km_per_year :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 32%, σ = 4,242)
      → Étendue : [12 ; 24,308] (IQR = 5,921)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
2026-03-22 08:02:51,552 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:02:51,553 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2015    25      7,574      7,800        N/A
     2016    90      7,618      7,900      -0.6%
     2017    57      7,666      7,990      -0.6%
     2018    34      8,124      8,485      -6.0%
     2019    15      8,361      8,490      -2.9%
     2020     5      8,684      8,980      -3.9%

   📌 Décote annuelle moyenne : -2.8%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k     3      7,800      8,900        N/A
         20-50k     6      8,212      8,240      +5.3%
         50-80k    22      8,531      8,800      +3.9%
        80-120k    73      8,165      8,490      -4.3%
       120-160k    87      7,787      7,950      -4.6%
       160-200k    33      6,526      6,000     -16.2%
          200k+     4      6,148      6,050      -5.8%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       6     5      8,684        N/A
       7    15      8,361      -3.7%
       8    34      8,124      -2.8%
       9    57      7,666      -5.6%
      10    90      7,618      -0.6%
      11    25      7,574      -0.6%

   📌 La décote ralentit significativement à 10 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel    43      7,173      7,290
           essence   184      7,919      8,000

   📌 Carburant avec prix médian le plus élevé : essence (8,000€)
   📌 Carburant avec prix médian le plus bas : diesel (7,290€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private   127      7,634      7,850
          pro   101      7,963      7,999

   📌 Test Mann-Whitney (médiane) : p = 0.0572
   ❌ Différence NON significative (p >= 0.05)
   📌 Écart médian Pro - Particulier : +149€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (i20) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/i20/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        40k : décote   -6.1% (n=  5)
        50k : décote   -5.6% (n=  2)
        60k : décote    5.0% (n=  8)
        70k : décote   -4.1% (n= 12)
        80k : décote    2.9% (n=  7)
        90k : décote    0.9% (n= 21)
       100k : décote    2.3% (n= 28)
       110k : décote    2.5% (n= 17)
       120k : décote    3.1% (n= 26)
       130k : décote   -0.9% (n= 26)
       140k : décote   -1.3% (n= 22)
       150k : décote   -1.1% (n= 13)
       160k : décote    6.7% (n= 14)
       170k : décote   22.5% (n= 13) ⚡
       180k : décote   -8.0% (n=  5)
       200k : décote    2.4% (n=  2)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 170k km : 22.5%
   ✅ Sauvegardé : /home/ubuntu/app/stats/i20/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     7 ans : décote    3.7% (n= 15)
     8 ans : décote    2.8% (n= 34) 🐢 LENTE
     9 ans : décote    5.6% (n= 57)
    10 ans : décote    0.6% (n= 90) 🐢 LENTE
    11 ans : décote    0.6% (n= 25) 🐢 LENTE

   📌 Décote lente (< 5% par an) :
      → 7 ans : 3.7%
      → 8 ans : 2.8%
      → 10 ans : 0.6%
      → 11 ans : 0.6%
   ✅ Sauvegardé : /home/ubuntu/app/stats/i20/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -116.09 × âge + -0.0129 × km + 10,418
   📌 R² = 0.252
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   15 (  6.6%)
      👍 Bonne affaire             :   30 ( 13.2%)
      📊 Prix marché               :  135 ( 59.2%)
      💰 Cher                      :   44 ( 19.3%)
      🔴 Très cher                 :    4 (  1.8%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/i20/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3150513139] Hyundai i20 essence
       Prix:    3,800€ | Attendu:    7,777€ | Écart:  -51.1% | Année: 2015 | Km: 106,000
    2. [3160167161] Hyundai i20 2017
       Prix:    4,000€ | Attendu:    7,815€ | Écart:  -48.8% | Année: 2017 | Km: 121,054
    3. [3132112485] Vend ou échange
       Prix:    5,500€ | Attendu:    9,137€ | Écart:  -39.8% | Année: 2015 | Km: 296
    4. [3146778483] HYUNDAI i20 II 5 Portes Phase 2 1.2 i 16V 84 cv
       Prix:    4,990€ | Attendu:    7,301€ | Écart:  -31.7% | Année: 2018 | Km: 170,000
    5. [3141044598] Hyundai i20
       Prix:    5,600€ | Attendu:    7,949€ | Écart:  -29.5% | Année: 2016 | Km: 101,653
    6. [3154012812] Hyundai
       Prix:    5,100€ | Attendu:    7,069€ | Écart:  -27.9% | Année: 2016 | Km: 170,000
    7. [3159144757] Hyundai i20 1.2 essence 2016 – CT OK – pneus neufs
       Prix:    5,400€ | Attendu:    7,216€ | Écart:  -25.2% | Année: 2016 | Km: 158,600
    8. [3144748405] Hyundai i20 1.2 Go Klima RadioCD
       Prix:    5,385€ | Attendu:    7,110€ | Écart:  -24.3% | Année: 2017 | Km: 175,866
    9. [3139554030] Hyundai i20 coupe 1.2 84 cv intuitive 3 portes
       Prix:    5,500€ | Attendu:    7,211€ | Écart:  -23.7% | Année: 2018 | Km: 177,000
   10. [3157664571] Hyundai i20 1.1 CRDI
       Prix:    5,300€ | Attendu:    6,889€ | Écart:  -23.1% | Année: 2016 | Km: 184,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3105795045] HYUNDAI I20 Coupé 1.0 TGDi 120 CV 03/2016 1 ERE MA
       Prix:    8,990€ | Attendu:    7,134€ | Écart:  +26.0% | Année: 2016 | Km: 165,000
    2. [3164886925] Hyundai i20 Coupé
       Prix:    9,000€ | Attendu:    7,378€ | Écart:  +22.0% | Année: 2017 | Km: 155,000
    3. [3158481657] Hyundai i20
       Prix:    8,900€ | Attendu:    7,396€ | Écart:  +20.3% | Année: 2016 | Km: 144,600
    4. [3109227704] Hyundai i20 crdi 75ch edition navy
       Prix:    8,900€ | Attendu:    7,415€ | Écart:  +20.0% | Année: 2017 | Km: 152,154
    5. [3152500439] Hyundai i20 1.0 T-GDi 100 UEFA EURO 2016
       Prix:    8,489€ | Attendu:    7,244€ | Écart:  +17.2% | Année: 2016 | Km: 156,400
    6. [3151384014] Hyundai i20
       Prix:    8,500€ | Attendu:    7,301€ | Écart:  +16.4% | Année: 2015 | Km: 143,000
    7. [2972084163] HYUNDAI I20 1.2i - 84 BERLINE Initia
       Prix:    8,990€ | Attendu:    7,738€ | Écart:  +16.2% | Année: 2015 | Km: 109,000
    8. [3155001248] Vente voiture hyundai i20
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
       Prix:    8,500€ | Attendu:    7,327€ | Écart:  +16.0% | Année: 2018 | Km: 168,000
    9. [3140396976] HYUNDAI i20 1.1 CRDi 75 Intuitive
       Prix:    8,900€ | Attendu:    7,700€ | Écart:  +15.6% | Année: 2016 | Km: 121,000
   10. [3164815335] Hyundai I20 1.2 84 GO NAVI
       Prix:    8,990€ | Attendu:    7,842€ | Écart:  +14.6% | Année: 2016 | Km: 109,939

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  2 annonces avec prix suspect
   💾 2 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 228
Récupération de la page 1/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 2/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 3/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 4/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=4
  → 35 annonces récupérées (total en mémoire: 140)
Export de 140 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 5/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=5
  → 35 annonces récupérées (total en mémoire: 175)
Export de 175 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 6/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=6
  → 35 annonces récupérées (total en mémoire: 210)
Export de 210 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 7/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=7
  → 35 annonces récupérées (total en mémoire: 245)
Export de 245 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 8/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=8
  → 35 annonces récupérées (total en mémoire: 280)
Export de 280 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 9/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=9
  → 35 annonces récupérées (total en mémoire: 315)
Export de 315 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.
Récupération de la page 10/10 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=CITROEN&u_utility_model=CITROEN_Berlingo&page=10
  → 12 annonces récupérées (total en mémoire: 327)
Export de 327 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv réussi.

Terminé : 327 annonces au total dans /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv
INFO: Model override : berlingo
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_berlingo_20260322_080253.csv
   ✅ 327 lus, 327 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 327 lus, 327 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6462 annonces en base
════════════════════════════════════════════════════════════
INFO: 326 list_id lus dans le CSV.
INFO: 330 annonces actives en base pour citroen berlingo.
INFO: 4 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_berlingo_20260322_080253.csv
  Brand : citroen  |  Modèle : berlingo
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 326
  Annonces actives en DB  : 330
  Absentes du crawl       : 4
  Marquées indisponibles  : 4
════════════════════════════════════════════════════════════

  Vérification :
  SELECT list_id, available, unavailable_detected_at FROM ads WHERE available = 0;
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/berlingo/figures
  🔍 Modèle filtré    : berlingo
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 523 annonces chargées (modèle 'berlingo')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 523

📋 Premières lignes (colonnes parsées) :
      list_id                                                                                     subject  price_eur  year_model  mileage_km    fuel    brand     model owner_type first_publication_date
0  3137494988                                           Citroen berlingo xl 3 places 130 ch eat8 19990 ht      23988        2025          50  diesel  citroen  berlingo        pro    2026-02-01 11:46:21
1  3127792883  CITROEN BERLINGO XL 950kg 1.5 BlueHDi 100ch Control BVM5 S&S 2pl - GARANTIE 6 MOIS MINIMUM      14990        2020       25000  diesel  citroen  berlingo        pro    2026-01-14 15:23:00
2  3140287724                                                                            Berlingo XL 2019      12500        2019       70000  diesel  citroen  berlingo    private    2026-02-06 10:22:45
3  3088625727                                                       Citroën Berlingo BHDI 100 CLUB XL BVM      13990        2020      105583  diesel  citroen  berlingo        pro    2025-11-07 09:24:00
4  3136059936                                                                                 Berlingo xl      17000        2021       65000  diesel  citroen  berlingo    private    2026-01-29 18:26:54

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2025-02-11 15:13:00
   Dernière publication : 2026-03-22 08:33:58
   Durée : 403 jours

👤 Répartition par type de vendeur :
   pro             :  430 (82.2%)
   private         :   93 (17.8%)

⛽ Répartition par carburant :
   diesel               :  508 (97.1%)
   électrique           :   10 (1.9%)
   essence              :    5 (1.0%)

🏭 Top 10 marques :
   citroen              :  523 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    0 lignes supprimées
      km_aberrants              :    2 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :   14 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :   16
      Restantes               :  507 / 523
      Pourcentage conservé    : 96.9%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    6 outliers (1.2%)
      Bornes IQR : [252 ; 28,632]
   mileage_km           :    4 outliers (0.8%)
      Bornes IQR : [-82,431 ; 241,459]
   age_years            :    3 outliers (0.6%)
      Bornes IQR : [-3 ; 13]

   📌 Total d'annonces outliers (au moins 1 variable) : 10 (2.0%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 507
   Dont outliers identifiés    : 10
   Annonces non-outliers       : 497

   Plages de valeurs :
      price_eur            : [     2,800 ;     38,190]  (moy:     14,862)
      mileage_km           : [         1 ;    309,000]  (moy:     83,476)
      year_model           : [     2,009 ;      2,025]  (moy:      2,021)
      age_years            : [         1 ;         17]  (moy:          5)
      km_per_year          : [         1 ;     56,667]  (moy:     14,103)

   💾 507 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  6 signaux de suspicion détectés
      km_trop_bas_diesel: 6
   💾 6 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count         Mean  Median          Std    Min      Q1       Q3           Max     IQR
  price_eur    507 14862.396450 13800.0  5774.879176 2800.0 10895.0  17990.0  38190.000000  7095.0
 mileage_km    507 83475.840237 85600.0 57329.982947    1.0 39027.5 120000.0 309000.000000 80972.5
 year_model    507  2020.668639  2020.0     2.735483 2009.0  2019.0   2023.0   2025.000000     4.0
  age_years    507     5.331361     6.0     2.735483    1.0     3.0      7.0     17.000000     4.0
km_per_year    507 14102.553732 14420.0  9231.812202    1.0  8437.5  19445.0  56666.666667 11007.5

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min      Q1       Q3      Max      IQR
  price_eur   507   14,862   13,800  5,774.88 2,800  10,895   17,990   38,190    7,095
 mileage_km   507   83,476   85,600 57,329.98     1  39,028  120,000  309,000   80,972
 year_model   507    2,021    2,020      2.74 2,009   2,019    2,023    2,025        4
  age_years   507      5.3      6.0      2.74   1.0     3.0      7.0     17.0      4.0
km_per_year   507 14,102.6 14,420.0  9,231.81   1.0 8,437.5 19,445.0 56,666.7 11,007.5

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution asymétrique DROITE (moyenne 14,862 > médiane 13,800)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 39%, σ = 5,775)
      → Étendue : [2,800 ; 38,190] (IQR = 7,095)

   📌 mileage_km :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → FORTE dispersion (CV = 69%, σ = 57,330)
      → Étendue : [1 ; 309,000] (IQR = 80,972)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 3)
      → Étendue : [2,009 ; 2,025] (IQR = 4)

   📌 age_years :
      → Distribution asymétrique GAUCHE (moyenne 5 < médiane 6)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → FORTE dispersion (CV = 51%, σ = 3)
      → Étendue : [1 ; 17] (IQR = 4)

   📌 km_per_year :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → FORTE dispersion (CV = 65%, σ = 9,232)
      → Étendue : [1 ; 56,667] (IQR = 11,008)

======================================================================
2026-03-22 08:03:38,081 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:03:38,082 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2009     2      4,800      4,800        N/A
     2013     2      6,850      6,850     -42.7%
     2014     2      9,345      9,345     -36.4%
     2016    12      8,057      8,200     +13.8%
     2017    33      8,908      8,940     -10.6%
     2018    58     10,252      9,495     -15.1%
     2019    58     12,135     11,989     -18.4%
     2020    95     13,157     12,690      -8.4%
     2021    63     14,291     13,980      -8.6%
     2022    51     14,714     14,500      -3.0%
     2023    39     18,103     17,900     -23.0%
     2024    19     21,024     19,990     -16.1%
     2025    72     24,898     24,480     -18.4%

   📌 Décote annuelle moyenne : -15.6%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k    94     23,793     23,944        N/A
         20-50k    55     17,427     17,760     -26.8%
         50-80k    83     15,362     15,990     -11.9%
        80-120k   140     12,542     12,545     -18.4%
       120-160k    88     10,500     10,395     -16.3%
       160-200k    36      8,738      8,915     -16.8%
          200k+    11      6,433      6,000     -26.4%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       1    72     24,898        N/A
       2    19     21,024     -15.6%
       3    39     18,103     -13.9%
       4    51     14,714     -18.7%
       5    63     14,291      -2.9%
       6    95     13,157      -7.9%
       7    58     12,135      -7.8%
       8    58     10,252     -15.5%
       9    33      8,908     -13.1%
      10    12      8,057      -9.6%
      12     2      9,345     +16.0%
      13     2      6,850     -26.7%
      17     2      4,800     -29.9%

   📌 La décote ralentit significativement à 5 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel   493     14,865     13,800
           essence     5     11,744      9,990
        électrique     9     16,439     15,990

   📌 Carburant avec prix médian le plus élevé : électrique (15,990€)
   📌 Carburant avec prix médian le plus bas : essence (9,990€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private    92     12,348     11,650
          pro   415     15,420     13,990

   📌 Test Mann-Whitney (médiane) : p = 0.0000
   ✅ Différence SIGNIFICATIVE (p < 0.05)
   📌 Écart médian Pro - Particulier : +2,340€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (berlingo) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/berlingo/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        10k : décote   22.6% (n=  8) ⚡
        20k : décote    6.1% (n= 14)
        30k : décote   -0.2% (n= 23)
        40k : décote    3.8% (n= 18)
        50k : décote    9.1% (n= 28)
        60k : décote   -0.8% (n= 30)
        70k : décote    3.2% (n= 25)
        80k : décote    7.4% (n= 35)
        90k : décote    6.1% (n= 37)
       100k : décote    8.0% (n= 34)
       110k : décote    9.0% (n= 34)
       120k : décote    1.8% (n= 30)
       130k : décote    2.2% (n= 24)
       140k : décote    1.7% (n= 13)
       150k : décote    2.0% (n= 21)
       160k : décote    9.9% (n= 18)
       170k : décote    2.5% (n= 11)
       180k : décote   16.9% (n=  7) ⚡
       200k : décote    7.5% (n=  5)
       210k : décote  -13.0% (n=  2)
      300k+ : décote   38.0% (n=  2) ⚡

   📌 Seuils où la décote s'accélère (> 8%) :
      → 10k km : 22.6%
      → 50k km : 9.1%
      → 110k km : 9.0%
      → 160k km : 9.9%
      → 180k km : 16.9%
      → 300k+ km : 38.0%
   ✅ Sauvegardé : /home/ubuntu/app/stats/berlingo/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     2 ans : décote   15.6% (n= 19) ⚡ FORTE
     3 ans : décote   13.9% (n= 39)
     4 ans : décote   18.7% (n= 51) ⚡ FORTE
     5 ans : décote    2.9% (n= 63) 🐢 LENTE
     6 ans : décote    7.9% (n= 95)
     7 ans : décote    7.8% (n= 58)
     8 ans : décote   15.5% (n= 58) ⚡ FORTE
     9 ans : décote   13.1% (n= 33)
    10 ans : décote    9.6% (n= 12)
    12 ans : décote  -16.0% (n=  2) 🐢 LENTE
    13 ans : décote   26.7% (n=  2) ⚡ FORTE
    17 ans : décote   29.9% (n=  2) ⚡ FORTE

   📌 Décote rapide (> 10% par an) :
      → 2 ans : 15.6%
      → 3 ans : 13.9%
      → 4 ans : 18.7%
      → 8 ans : 15.5%
      → 9 ans : 13.1%
      → 13 ans : 26.7%
      → 17 ans : 29.9%

   📌 Décote lente (< 5% par an) :
      → 5 ans : 2.9%
      → 12 ans : -16.0%
   ✅ Sauvegardé : /home/ubuntu/app/stats/berlingo/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -927.00 × âge + -0.0504 × km + 24,008
   📌 R² = 0.773
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   45 (  8.9%)
      👍 Bonne affaire             :   93 ( 18.5%)
      📊 Prix marché               :  256 ( 50.8%)
      💰 Cher                      :   53 ( 10.5%)
      🔴 Très cher                 :   57 ( 11.3%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/berlingo/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3156231773] Citroën Berlingo XL BLUEHDI 100 S&S ETG6 CLUB
       Prix:    3,000€ | Attendu:    9,972€ | Écart:  -69.9% | Année: 2018 | Km: 131,461
    2. [3156023107] Citroën Berlingo 1.5 BLUEHDI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   16,420€ | Écart:  -51.3% | Année: 2021 | Km: 58,647
    3. [3158805212] EZ-923 Citroen BERLINGO XL TOLLÉE L2 1.6 BLUEHDI 1
       Prix:    7,990€ | Attendu:   16,130€ | Écart:  -50.5% | Année: 2018 | Km: 9,173
    4. [3144063650] Citroën Berlingo 1.5 BLUEDHI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   15,912€ | Écart:  -49.7% | Année: 2022 | Km: 87,146
    5. [3156192309] Citroën Berlingo FOURGON XL BLUEHDI 100 S&S ETG6 C
       Prix:    2,800€ | Attendu:    5,393€ | Écart:  -48.1% | Année: 2017 | Km: 203,997
    6. [3156023444] Citroën Berlingo 1.5 BLUEHDI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   15,179€ | Écart:  -47.3% | Année: 2021 | Km: 83,293
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
    7. [3157282073] Citroen berlingo xl 1.6 bluehdi 100 cv club
       Prix:    5,980€ | Attendu:   11,135€ | Écart:  -46.3% | Année: 2018 | Km: 108,380
    8. [3163320492] Citroën Berlingo VAN XL 950 PURETECH 130 S&S EAT8 
       Prix:    8,250€ | Attendu:   14,992€ | Écart:  -45.0% | Année: 2020 | Km: 68,597
    9. [2984931973] Citroën Berlingo Electrique Taille XL Club
       Prix:    8,590€ | Attendu:   15,300€ | Écart:  -43.9% | Année: 2018 | Km: 25,657
   10. [3156133024] Citroën berlingo xl électrique confort isotherme T
       Prix:    7,990€ | Attendu:   13,722€ | Écart:  -41.8% | Année: 2018 | Km: 57,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3153561957] Citroën Berlingo XL 1.6 BlueHDI 100 Cabine Approfo
       Prix:    6,000€ | Attendu:    1,465€ | Écart: +309.4% | Année: 2017 | Km: 282,000
    2. [3155307735] Citroën berlingo
       Prix:    7,000€ | Attendu:    1,861€ | Écart: +276.1% | Année: 2013 | Km: 200,500
    3. [3115315205] Citroën Jumpy CAB APPROFONDIE XL BLUEHDI 180 S&S E
       Prix:   38,190€ | Attendu:   23,079€ | Écart:  +65.5% | Année: 2025 | Km: 40
    4. [3130621009] Citroen BERLINGO XL 1.6 HDI 90 ch CABINE APPROFOND
       Prix:   11,490€ | Attendu:    7,043€ | Écart:  +63.1% | Année: 2014 | Km: 116,000
    5. [3148392923] CITROEN BERLINGO 1.5 BlueHDi S&S - 130 XL Feel 7 P
       Prix:   19,990€ | Attendu:   12,362€ | Écart:  +61.7% | Année: 2018 | Km: 84,000
    6. [3140204221] Citroen Berlingo Van XL BlueHDi 100 S&S Cabine App
       Prix:    9,490€ | Attendu:    5,871€ | Écart:  +61.6% | Année: 2018 | Km: 212,912
    7. [3097892706] Citroën Berlingo CABINE APPROFONDIE CA TAILLE XL B
       Prix:   37,140€ | Attendu:   23,081€ | Écart:  +60.9% | Année: 2025 | Km: 1
    8. [3158708742] Berlingo XL 1.6L bluehdi aménagé
       Prix:   15,000€ | Attendu:   10,046€ | Écart:  +49.3% | Année: 2018 | Km: 130,000
    9. [3156325212] À vendre - Citroën Berlingo rallongée - Boîte auto
       Prix:    9,500€ | Attendu:    6,379€ | Écart:  +48.9% | Année: 2016 | Km: 166,000
   10. [3144316655] Citroën Berlingo XL / Rallongé - 1.6 HDI 90cv - BV
       Prix:    6,700€ | Attendu:    4,656€ | Écart:  +43.9% | Année: 2013 | Km: 145,000

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  12 annonces avec prix suspect
   💾 12 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 523
Récupération de la page 1/5 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=2015-max&mileage=min-150000&u_car_brand=CITROEN&seats=999999&u_car_model=CITROEN_C4%2CCITROEN_C4+Aircross%2CCITROEN_C4+Cactus%2CCITROEN_C4+Picasso%2CCITROEN_C4+SpaceTourer%2CCITROEN_C4+X&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv réussi.
Récupération de la page 2/5 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=2015-max&mileage=min-150000&u_car_brand=CITROEN&seats=999999&u_car_model=CITROEN_C4%2CCITROEN_C4+Aircross%2CCITROEN_C4+Cactus%2CCITROEN_C4+Picasso%2CCITROEN_C4+SpaceTourer%2CCITROEN_C4+X&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv réussi.
Récupération de la page 3/5 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=2015-max&mileage=min-150000&u_car_brand=CITROEN&seats=999999&u_car_model=CITROEN_C4%2CCITROEN_C4+Aircross%2CCITROEN_C4+Cactus%2CCITROEN_C4+Picasso%2CCITROEN_C4+SpaceTourer%2CCITROEN_C4+X&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv réussi.
Récupération de la page 4/5 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=2015-max&mileage=min-150000&u_car_brand=CITROEN&seats=999999&u_car_model=CITROEN_C4%2CCITROEN_C4+Aircross%2CCITROEN_C4+Cactus%2CCITROEN_C4+Picasso%2CCITROEN_C4+SpaceTourer%2CCITROEN_C4+X&page=4
  → 35 annonces récupérées (total en mémoire: 140)
Export de 140 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv réussi.
Récupération de la page 5/5 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=2015-max&mileage=min-150000&u_car_brand=CITROEN&seats=999999&u_car_model=CITROEN_C4%2CCITROEN_C4+Aircross%2CCITROEN_C4+Cactus%2CCITROEN_C4+Picasso%2CCITROEN_C4+SpaceTourer%2CCITROEN_C4+X&page=5
  → 27 annonces récupérées (total en mémoire: 167)
Export de 167 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv réussi.

Terminé : 167 annonces au total dans /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv
INFO: Model override : c4
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_c4_20260322_080339.csv
   ✅ 167 lus, 167 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 167 lus, 167 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6462 annonces en base
════════════════════════════════════════════════════════════
INFO: 167 list_id lus dans le CSV.
INFO: 169 annonces actives en base pour citroen c4.
INFO: 2 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_c4_20260322_080339.csv
  Brand : citroen  |  Modèle : c4
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 167
  Annonces actives en DB  : 169
  Absentes du crawl       : 2
  Marquées indisponibles  : 2
════════════════════════════════════════════════════════════

  Vérification :
  SELECT list_id, available, unavailable_detected_at FROM ads WHERE available = 0;
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/c4/figures
  🔍 Modèle filtré    : c4
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 274 annonces chargées (modèle 'c4')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 274

📋 Premières lignes (colonnes parsées) :
      list_id                                                                     subject  price_eur  year_model  mileage_km     fuel    brand model owner_type first_publication_date
0  3114906971                                   Citroen c4 spacetourer 1.2 130cv business       9500        2019      114200  essence  citroen    c4        pro    2026-02-17 16:35:09
1  3120070348                   Citroen GRAND C4 PICASSO BLUEHDI 120CH BUSINESS + S&S 98G       9990        2015      149515   diesel  citroen    c4        pro    2025-12-30 11:37:00
2  3150919595             Citroen GRAND C4 SPACETOURER PURETECH 130CH S&S BUSINESS + E6.D      10990        2019      109477  essence  citroen    c4        pro    2026-02-25 04:59:50
3  3067498742  CITROEN C4 SPACETOURER 1.2 130 Business EAT8 7 Places / DISTRIBUTION NEUVE      10990        2019       68000  essence  citroen    c4        pro    2025-10-01 09:38:00
4  3034772801            Citroen C4 Grand Picasso 1.6 BLUEHDI 120 FEEL EAT BVA START-STOP      10490        2017      143000   diesel  citroen    c4        pro    2025-08-04 09:52:00

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2023-11-09 04:54:09
   Dernière publication : 2026-03-21 18:13:28
   Durée : 863 jours

👤 Répartition par type de vendeur :
   pro             :  141 (51.5%)
   private         :  133 (48.5%)

⛽ Répartition par carburant :
   diesel               :  153 (55.8%)
   essence              :  121 (44.2%)

🏭 Top 10 marques :
   citroen              :  274 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    1 lignes supprimées
      km_aberrants              :    0 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    1
      Restantes               :  273 / 274
      Pourcentage conservé    : 99.6%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :   12 outliers (4.4%)
      Bornes IQR : [6,365 ; 13,125]
   mileage_km           :   12 outliers (4.4%)
      Bornes IQR : [67,250 ; 185,250]
   age_years            :    0 outliers (0.0%)
      Bornes IQR : [2 ; 14]

   📌 Total d'annonces outliers (au moins 1 variable) : 24 (8.8%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 273
   Dont outliers identifiés    : 24
   Annonces non-outliers       : 249

   Plages de valeurs :
      price_eur            : [     4,500 ;     11,000]  (moy:      9,520)
      mileage_km           : [       186 ;    150,000]  (moy:    121,082)
      year_model           : [     2,015 ;      2,022]  (moy:      2,017)
      age_years            : [         4 ;         11]  (moy:          9)
      km_per_year          : [        17 ;     37,387]  (moy:     14,710)

   💾 273 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  8 signaux de suspicion détectés
      km_trop_bas_diesel: 7
      km_trop_bas_essence: 1
   💾 8 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count          Mean   Median          Std         Min       Q1            Q3       Max          IQR
  price_eur    273   9519.600733   9990.0  1463.600224 4500.000000   8900.0  10590.000000  11000.00  1690.000000
 mileage_km    273 121081.926740 130000.0 29696.054122  186.000000 111500.0 141000.000000 150000.00 29500.000000
 year_model    273   2017.318681   2017.0     1.795905 2015.000000   2016.0   2019.000000   2022.00     3.000000
  age_years    273      8.681319      9.0     1.795905    4.000000      7.0     10.000000     11.00     3.000000
km_per_year    273  14709.861144  14210.0  5155.312247   16.909091  12000.0  16666.666667  37386.75  4666.666667

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   273    9,520    9,990  1,463.60 4,500    8,900   10,590   11,000   1,690
 mileage_km   273  121,082  130,000 29,696.05   186  111,500  141,000  150,000  29,500
 year_model   273    2,017    2,017      1.80 2,015    2,016    2,019    2,022       3
  age_years   273      8.7      9.0      1.80   4.0      7.0     10.0     11.0     3.0
km_per_year   273 14,709.9 14,210.0  5,155.31  16.9 12,000.0 16,666.7 37,386.8 4,666.7

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 15%, σ = 1,464)
      → Étendue : [4,500 ; 11,000] (IQR = 1,690)

   📌 mileage_km :
      → Distribution asymétrique GAUCHE (moyenne 121,082 < médiane 130,000)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → Faible dispersion (CV = 25%, σ = 29,696)
      → Étendue : [186 ; 150,000] (IQR = 29,500)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 2)
      → Étendue : [2,015 ; 2,022] (IQR = 3)

   📌 age_years :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 21%, σ = 2)
      → Étendue : [4 ; 11] (IQR = 3)

   📌 km_per_year :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 35%, σ = 5,155)
      → Étendue : [17 ; 37,387] (IQR = 4,667)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================
2026-03-22 08:03:56,481 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:03:56,481 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2015    52      8,889      9,000        N/A
     2016    53      9,019      9,490      -1.5%
     2017    53      9,754     10,200      -8.2%
     2018    38      9,619      9,990      +1.4%
     2019    42     10,047     10,000      -4.5%
     2020    20      9,820     10,240      +2.3%
     2021    13     10,521     10,700      -7.1%
     2022     2     10,495     10,495      +0.2%

   📌 Décote annuelle moyenne : -2.5%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k     7      8,527      8,500        N/A
         20-50k     1     10,980     10,980     +28.8%
         50-80k    15     10,164     10,449      -7.4%
        80-120k    72      9,533      9,990      -6.2%
       120-160k   178      9,491      9,990      -0.4%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       4     2     10,495        N/A
       5    13     10,521      +0.2%
       6    20      9,820      -6.7%
       7    42     10,047      +2.3%
       8    38      9,619      -4.3%
       9    53      9,754      +1.4%
      10    53      9,019      -7.5%
      11    52      8,889      -1.4%

   📌 La décote ralentit significativement à 7 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel   152      9,928     10,000
           essence   121      9,007      9,500

   📌 Carburant avec prix médian le plus élevé : diesel (10,000€)
   📌 Carburant avec prix médian le plus bas : essence (9,500€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private   132      9,185      9,500
          pro   141      9,833      9,990

   📌 Test Mann-Whitney (médiane) : p = 0.0049
   ✅ Différence SIGNIFICATIVE (p < 0.05)
   📌 Écart médian Pro - Particulier : +490€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (c4) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/c4/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        60k : décote  -23.9% (n=  6)
        70k : décote    6.1% (n=  8)
        80k : décote   -1.1% (n= 10)
        90k : décote    7.1% (n= 16)
       100k : décote   -7.8% (n= 15)
       110k : décote    7.9% (n= 31)
       120k : décote   -5.2% (n= 41)
       130k : décote    1.6% (n= 57)
       140k : décote    2.9% (n= 72)
       150k : décote   -1.6% (n=  8)
   ✅ Sauvegardé : /home/ubuntu/app/stats/c4/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     5 ans : décote   -0.2% (n= 13) 🐢 LENTE
     6 ans : décote    6.7% (n= 20)
     7 ans : décote   -2.3% (n= 42) 🐢 LENTE
     8 ans : décote    4.3% (n= 38)
     9 ans : décote   -1.4% (n= 53) 🐢 LENTE
    10 ans : décote    7.5% (n= 53)
    11 ans : décote    1.4% (n= 52) 🐢 LENTE

   📌 Décote lente (< 5% par an) :
      → 5 ans : -0.2%
      → 7 ans : -2.3%
      → 8 ans : 4.3%
      → 9 ans : -1.4%
      → 11 ans : 1.4%
   ✅ Sauvegardé : /home/ubuntu/app/stats/c4/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -251.43 × âge + -0.0012 × km + 11,847
   📌 R² = 0.095
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   32 ( 11.7%)
      👍 Bonne affaire             :   27 (  9.9%)
      📊 Prix marché               :  142 ( 52.0%)
      💰 Cher                      :   60 ( 22.0%)
      🔴 Très cher                 :   12 (  4.4%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/c4/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3159491862] CITROEN GRANDE C4 PICASSO 1.2 130Ch Exclusive
       Prix:    4,590€ | Attendu:    9,201€ | Écart:  -50.1% | Année: 2016 | Km: 110,000
    2. [3144627553] Grand C4 Picasso
       Prix:    4,500€ | Attendu:    8,914€ | Écart:  -49.5% | Année: 2015 | Km: 140,000
    3. [3148620999] C4 Picasso
       Prix:    4,600€ | Attendu:    8,912€ | Écart:  -48.4% | Année: 2015 | Km: 142,000
    4. [3155010351] C4 Picasso
       Prix:    4,600€ | Attendu:    8,912€ | Écart:  -48.4% | Année: 2015 | Km: 142,000
    5. [3159599228] Vends C4 Grand Picasso II 7 places
       Prix:    6,000€ | Attendu:    9,674€ | Écart:  -38.0% | Année: 2018 | Km: 135,000
    6. [3148926526] C4 grand Picasso 2l hdi 150cv exclusive
       Prix:    5,800€ | Attendu:    9,183€ | Écart:  -36.8% | Année: 2016 | Km: 125,000
    7. [3158296763] C4 grand Picasso 2l hdi 150 cv pack exclusive
       Prix:    5,800€ | Attendu:    9,183€ | Écart:  -36.8% | Année: 2016 | Km: 125,000
    8. [3159003549] Vends CITROEN GRAND C4 PICASSO Intensive
       Prix:    5,900€ | Attendu:    9,168€ | Écart:  -35.6% | Année: 2016 | Km: 138,000
    9. [3162574098] Citroën c4 Picasso 7 places
       Prix:    6,000€ | Attendu:    9,192€ | Écart:  -34.7% | Année: 2016 | Km: 118,000
   10. [3147269001] CITROEN GRAND C4 PICASSO Spacetourer
       Prix:    6,000€ | Attendu:    9,168€ | Écart:  -34.6% | Année: 2016 | Km: 137,500

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3017985052] CITROEN C4 PICASSO Grand 1.6 HDi - 120 Intensive 7
       Prix:   10,990€ | Attendu:    8,902€ | Écart:  +23.5% | Année: 2015 | Km: 149,900
    2. [3146221969] Citroen C4 Grand Picasso 7 Places - 2.0 BlueHDi 15
       Prix:   10,990€ | Attendu:    8,912€ | Écart:  +23.3% | Année: 2015 | Km: 142,000
    3. [2934302132] Citroen Grand C4 Picasso PureTech 130ch Confort S&
       Prix:   10,990€ | Attendu:    8,933€ | Écart:  +23.0% | Année: 2015 | Km: 123,901
    4. [3136798926] Grand C4 Picasso 120 HDI
       Prix:   11,000€ | Attendu:    8,943€ | Écart:  +23.0% | Année: 2015 | Km: 116,000
    5. [3155706473] Citroën Grand C4 Picasso 1.6 BlueHdi 115 Intensive
       Prix:   10,995€ | Attendu:    8,945€ | Écart:  +22.9% | Année: 2015 | Km: 113,981
    6. [3138161286] Citroën C4 PICASSO II Exclusive 2.0 BLUEHDI 150CV 
       Prix:   10,990€ | Attendu:    8,953€ | Écart:  +22.8% | Année: 2015 | Km: 107,256
    7. [3161244489] Citroën Grand C4 Picasso e-HDi 115 Exclusive ETG6
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
       Prix:   10,980€ | Attendu:    9,024€ | Écart:  +21.7% | Année: 2015 | Km: 47,966
    8. [3160469081] Grand C4 Picasso 7 places
       Prix:   10,800€ | Attendu:    8,988€ | Écart:  +20.2% | Année: 2015 | Km: 78,300
    9. [3149154360] Grand c4
       Prix:   11,000€ | Attendu:    9,158€ | Écart:  +20.1% | Année: 2016 | Km: 146,230
   10. [3071933719] Citroën C4 grand Picasso
       Prix:   11,000€ | Attendu:    9,160€ | Écart:  +20.1% | Année: 2016 | Km: 145,000

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  4 annonces avec prix suspect
   💾 4 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 274
Récupération de la page 1/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=scenic&price=min-11000&regdate=2015-max&mileage=min-150000&seats=999999&u_car_brand=RENAULT&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_scenic_20260322_080358.csv réussi.
Récupération de la page 2/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=scenic&price=min-11000&regdate=2015-max&mileage=min-150000&seats=999999&u_car_brand=RENAULT&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_scenic_20260322_080358.csv réussi.
Récupération de la page 3/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=scenic&price=min-11000&regdate=2015-max&mileage=min-150000&seats=999999&u_car_brand=RENAULT&page=3
  → 30 annonces récupérées (total en mémoire: 100)
Export de 100 annonces vers /home/ubuntu/app/leboncoin_ads_scenic_20260322_080358.csv réussi.
Récupération de la page 4/4 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=scenic&price=min-11000&regdate=2015-max&mileage=min-150000&seats=999999&u_car_brand=RENAULT&page=4
Erreur lors de l'appel à l'API: 404 Client Error: Not Found for url: https://piloterr.com/api/v2/leboncoin/search?query=https%3A%2F%2Fwww.leboncoin.fr%2Frecherche%3Fcategory%3D2%26text%3Dscenic%26price%3Dmin-11000%26regdate%3D2015-max%26mileage%3Dmin-150000%26seats%3D999999%26u_car_brand%3DRENAULT%26page%3D4
Récupération de la page 1/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 2/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 3/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 4/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=4
  → 35 annonces récupérées (total en mémoire: 140)
Export de 140 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 5/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=5
  → 35 annonces récupérées (total en mémoire: 175)
Export de 175 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 6/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=6
  → 35 annonces récupérées (total en mémoire: 210)
Export de 210 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 7/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=7
  → 35 annonces récupérées (total en mémoire: 245)
Export de 245 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 8/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=8
  → 35 annonces récupérées (total en mémoire: 280)
Export de 280 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 9/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=9
  → 35 annonces récupérées (total en mémoire: 315)
Export de 315 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 10/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=10
  → 35 annonces récupérées (total en mémoire: 350)
Export de 350 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 11/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=11
  → 35 annonces récupérées (total en mémoire: 385)
Export de 385 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 12/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=12
  → 35 annonces récupérées (total en mémoire: 420)
Export de 420 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 13/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=13
  → 35 annonces récupérées (total en mémoire: 455)
Export de 455 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 14/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=14
  → 35 annonces récupérées (total en mémoire: 490)
Export de 490 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 15/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=15
  → 35 annonces récupérées (total en mémoire: 525)
Export de 525 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 16/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=16
  → 35 annonces récupérées (total en mémoire: 560)
Export de 560 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 17/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=17
  → 35 annonces récupérées (total en mémoire: 595)
Export de 595 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 18/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=18
  → 35 annonces récupérées (total en mémoire: 630)
Export de 630 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 19/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=19
  → 35 annonces récupérées (total en mémoire: 665)
Export de 665 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 20/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=20
  → 35 annonces récupérées (total en mémoire: 700)
Export de 700 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 21/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=21
  → 35 annonces récupérées (total en mémoire: 735)
Export de 735 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 22/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=22
  → 35 annonces récupérées (total en mémoire: 770)
Export de 770 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 23/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=23
  → 35 annonces récupérées (total en mémoire: 805)
Export de 805 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 24/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=24
  → 35 annonces récupérées (total en mémoire: 840)
Export de 840 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 25/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=25
  → 35 annonces récupérées (total en mémoire: 875)
Export de 875 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 26/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=26
  → 35 annonces récupérées (total en mémoire: 910)
Export de 910 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 27/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=27
  → 35 annonces récupérées (total en mémoire: 945)
Export de 945 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 28/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=28
  → 35 annonces récupérées (total en mémoire: 980)
Export de 980 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 29/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=29
  → 35 annonces récupérées (total en mémoire: 1015)
Export de 1015 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 30/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=30
  → 34 annonces récupérées (total en mémoire: 1049)
Export de 1049 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260322_080408.csv réussi.
Récupération de la page 31/31 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_brand=PEUGEOT&seats=999999&u_car_model=PEUGEOT_5008&page=31
Erreur lors de l'appel à l'API: 404 Client Error: Not Found for url: https://piloterr.com/api/v2/leboncoin/search?query=https%3A%2F%2Fwww.leboncoin.fr%2Frecherche%3Fcategory%3D2%26text%3D5008%26price%3Dmin-11000%26u_car_brand%3DPEUGEOT%26seats%3D999999%26u_car_model%3DPEUGEOT_5008%26page%3D31
Récupération de la page 1/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 2/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 3/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=3
  → 35 annonces récupérées (total en mémoire: 105)
Export de 105 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 4/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=4
  → 35 annonces récupérées (total en mémoire: 140)
Export de 140 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 5/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=5
  → 35 annonces récupérées (total en mémoire: 175)
Export de 175 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 6/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=6
  → 35 annonces récupérées (total en mémoire: 210)
Export de 210 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 7/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=7
  → 35 annonces récupérées (total en mémoire: 245)
Export de 245 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 8/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=8
  → 35 annonces récupérées (total en mémoire: 280)
Export de 280 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 9/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=9
  → 35 annonces récupérées (total en mémoire: 315)
Export de 315 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 10/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=10
  → 35 annonces récupérées (total en mémoire: 350)
Export de 350 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 11/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=11
  → 35 annonces récupérées (total en mémoire: 385)
Export de 385 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 12/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=12
  → 35 annonces récupérées (total en mémoire: 420)
Export de 420 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 13/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=13
  → 35 annonces récupérées (total en mémoire: 455)
Export de 455 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 14/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=14
  → 35 annonces récupérées (total en mémoire: 490)
Export de 490 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 15/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=15
  → 35 annonces récupérées (total en mémoire: 525)
Export de 525 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 16/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=16
  → 35 annonces récupérées (total en mémoire: 560)
Export de 560 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 17/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=17
  → 35 annonces récupérées (total en mémoire: 595)
Export de 595 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 18/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=18
  → 35 annonces récupérées (total en mémoire: 630)
Export de 630 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 19/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=19
  → 35 annonces récupérées (total en mémoire: 665)
Export de 665 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 20/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=20
  → 35 annonces récupérées (total en mémoire: 700)
Export de 700 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 21/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=21
  → 35 annonces récupérées (total en mémoire: 735)
Export de 735 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 22/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=22
  → 35 annonces récupérées (total en mémoire: 770)
Export de 770 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 23/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=23
  → 35 annonces récupérées (total en mémoire: 805)
Export de 805 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 24/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=24
  → 35 annonces récupérées (total en mémoire: 840)
Export de 840 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 25/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=25
  → 35 annonces récupérées (total en mémoire: 875)
Export de 875 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 26/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=26
  → 35 annonces récupérées (total en mémoire: 910)
Export de 910 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 27/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=27
  → 35 annonces récupérées (total en mémoire: 945)
Export de 945 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 28/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=28
  → 35 annonces récupérées (total en mémoire: 980)
Export de 980 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 29/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=29
  → 35 annonces récupérées (total en mémoire: 1015)
Export de 1015 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 30/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=30
  → 35 annonces récupérées (total en mémoire: 1050)
Export de 1050 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 31/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=31
  → 35 annonces récupérées (total en mémoire: 1085)
Export de 1085 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 32/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=32
  → 35 annonces récupérées (total en mémoire: 1120)
Export de 1120 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 33/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=33
  → 35 annonces récupérées (total en mémoire: 1155)
Export de 1155 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 34/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=34
  → 35 annonces récupérées (total en mémoire: 1190)
Export de 1190 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 35/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=35
  → 35 annonces récupérées (total en mémoire: 1225)
Export de 1225 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 36/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=36
  → 35 annonces récupérées (total en mémoire: 1260)
Export de 1260 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 37/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=37
  → 35 annonces récupérées (total en mémoire: 1295)
Export de 1295 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 38/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=38
  → 35 annonces récupérées (total en mémoire: 1330)
Export de 1330 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 39/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=39
  → 35 annonces récupérées (total en mémoire: 1365)
Export de 1365 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 40/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=40
  → 35 annonces récupérées (total en mémoire: 1400)
Export de 1400 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 41/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=41
  → 35 annonces récupérées (total en mémoire: 1435)
Export de 1435 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 42/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=42
  → 35 annonces récupérées (total en mémoire: 1470)
Export de 1470 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 43/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=43
  → 18 annonces récupérées (total en mémoire: 1488)
Export de 1488 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260322_080559.csv réussi.
Récupération de la page 44/44 avec l'URL: https://www.leboncoin.fr/recherche?category=2&text=ford+fiesta&price=3000-10000&regdate=2014-max&u_car_brand=FORD&fuel=1%2C2&u_car_model=FORD_Fiesta&page=44
Erreur lors de l'appel à l'API: 404 Client Error: Not Found for url: https://piloterr.com/api/v2/leboncoin/search?query=https%3A%2F%2Fwww.leboncoin.fr%2Frecherche%3Fcategory%3D2%26text%3Dford%2Bfiesta%26price%3D3000-10000%26regdate%3D2014-max%26u_car_brand%3DFORD%26fuel%3D1%252C2%26u_car_model%3DFORD_Fiesta%26page%3D44
Récupération de la page 1/3 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=nv200&u_utility_brand=NISSAN&u_utility_model=NISSAN_NV200&fuel=2&page=1
  → 35 annonces récupérées (total en mémoire: 35)
Export de 35 annonces vers /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv réussi.
Récupération de la page 2/3 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=nv200&u_utility_brand=NISSAN&u_utility_model=NISSAN_NV200&fuel=2&page=2
  → 35 annonces récupérées (total en mémoire: 70)
Export de 70 annonces vers /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv réussi.
Récupération de la page 3/3 avec l'URL: https://www.leboncoin.fr/recherche?category=5&text=nv200&u_utility_brand=NISSAN&u_utility_model=NISSAN_NV200&fuel=2&page=3
  → 26 annonces récupérées (total en mémoire: 96)
Export de 96 annonces vers /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv réussi.

Terminé : 96 annonces au total dans /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv
INFO: Model override : nv200
INFO: Schéma initialisé dans /home/ubuntu/app/db/lbc.sqlite
════════════════════════════════════════════════════════════
  📦 MIGRATION CSV → SQLite unifié
════════════════════════════════════════════════════════════

📂 leboncoin_ads_nv200_20260322_080831.csv
   ✅ 96 lus, 96 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 96 lus, 96 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6462 annonces en base
════════════════════════════════════════════════════════════
INFO: 96 list_id lus dans le CSV.
INFO: 96 annonces actives en base pour nissan nv200.
INFO: Aucune annonce manquante — toutes présentes dans le crawl.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_nv200_20260322_080831.csv
  Brand : nissan  |  Modèle : nv200
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 96
  Annonces actives en DB  : 96
  Absentes du crawl       : 0
  Marquées indisponibles  : 0
════════════════════════════════════════════════════════════
══════════════════════════════════════════════════════════════════════
  🚗 ANALYSEUR LEBONCOIN - Analyses Descriptives Véhicules
══════════════════════════════════════════════════════════════════════
  💾 Base SQLite       : /home/ubuntu/app/db/lbc.sqlite
  📁 Dossier figures  : /home/ubuntu/app/stats/nv200/figures
  🔍 Modèle filtré    : nv200
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 180 annonces chargées (modèle 'nv200')

======================================================================
📊 EXPLORATION DES DONNÉES BRUTES
======================================================================

📌 Nombre total d'annonces : 180

📋 Premières lignes (colonnes parsées) :
      list_id                                                  subject  price_eur  year_model  mileage_km    fuel   brand  model owner_type first_publication_date
0  2859214095                            Nissan NV200 N CONNNECTA 90CV      12990        2017       94500  diesel  nissan  nv200        pro    2024-10-05 17:02:00
1  3139983877                        Nissan NV200 1,5L dCi 90ch Acenta      11990        2013      106800  diesel  nissan  nv200        pro    2026-02-05 16:52:21
2  3083668151                    Nissan NV200 1.5 DCI 90CH VAN AMENAGE      14999        2014      121041  diesel  nissan  nv200        pro    2025-10-29 21:10:00
3  3131716141                      Nissan NV200 1.5 DCI 110 N-CONNECTA       9890        2016      194000  diesel  nissan  nv200        pro    2026-01-21 20:45:17
4  3131492774  Nissan NV200 Fourgon 1.5 dCi 110cv 1ère Main N-Connecta       8990        2017      187000  diesel  nissan  nv200        pro    2026-01-21 14:43:24

❓ Valeurs manquantes par colonne clé :
   list_id                        :    0 manquantes (0.0%)
   subject                        :    0 manquantes (0.0%)
   price_eur                      :    0 manquantes (0.0%)
   year_model                     :    0 manquantes (0.0%)
   mileage_km                     :    0 manquantes (0.0%)
   fuel                           :    0 manquantes (0.0%)
   brand                          :    0 manquantes (0.0%)
   model                          :    0 manquantes (0.0%)
   owner_type                     :    0 manquantes (0.0%)
   first_publication_date         :    0 manquantes (0.0%)

📅 Période couverte :
   Première publication : 2024-09-27 22:07:00
   Dernière publication : 2026-03-21 16:20:45
   Durée : 539 jours

👤 Répartition par type de vendeur :
   private         :  124 (68.9%)
   pro             :   56 (31.1%)

⛽ Répartition par carburant :
   diesel               :  180 (100.0%)

🏭 Top 10 marques :
   nissan               :  180 (100.0%)

🧮 Création des colonnes calculées...
   ✅ Colonnes ajoutées : age_years, km_per_year, price_per_km

🧹 Nettoyage des données...

   📊 Rapport de nettoyage :
      prix_aberrants            :    0 lignes supprimées
      km_aberrants              :    0 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    0
      Restantes               :  180 / 180
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    1 outliers (0.6%)
      Bornes IQR : [-2,735 ; 19,225]
   mileage_km           :    1 outliers (0.6%)
      Bornes IQR : [-40,940 ; 367,100]
   age_years            :    0 outliers (0.0%)
      Bornes IQR : [3 ; 19]

   📌 Total d'annonces outliers (au moins 1 variable) : 2 (1.1%)
   ⚠️  Les outliers sont identifiés mais NON supprimés.

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 180
   Dont outliers identifiés    : 2
   Annonces non-outliers       : 178

   Plages de valeurs :
      price_eur            : [     2,000 ;     19,990]  (moy:      8,636)
      mileage_km           : [         1 ;    420,000]  (moy:    164,733)
      year_model           : [     2,009 ;      2,019]  (moy:      2,015)
      age_years            : [         7 ;         17]  (moy:         11)
      km_per_year          : [         0 ;     30,000]  (moy:     14,941)

   💾 180 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  5 signaux de suspicion détectés
      km_trop_bas_diesel: 5
   💾 5 signaux persistés dans SQLite

======================================================================
📊 STATISTIQUES DESCRIPTIVES GLOBALES
======================================================================

📊 Tableau récapitulatif (valeurs brutes) :
   Variable  Count          Mean   Median          Std         Min            Q1            Q3      Max           IQR
  price_eur    180   8636.183333   8265.0  3725.732251 2000.000000   5500.000000  10990.000000  19990.0   5490.000000
 mileage_km    180 164733.111111 151676.5 71775.250121    1.000000 112075.000000 214085.000000 420000.0 102010.000000
 year_model    180   2014.833333   2015.0     2.691804 2009.000000   2013.000000   2017.000000   2019.0      4.000000
  age_years    180     11.166667     11.0     2.691804    7.000000      9.000000     13.000000     17.0      4.000000
km_per_year    180  14940.772213  13900.0  6027.667837    0.066667  10387.203125  18711.538462  30000.0   8324.335337

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   180    8,636    8,265  3,725.73 2,000    5,500   10,990   19,990   5,490
 mileage_km   180  164,733  151,676 71,775.25     1  112,075  214,085  420,000 102,010
 year_model   180    2,015    2,015      2.69 2,009    2,013    2,017    2,019       4
  age_years   180     11.2     11.0      2.69   7.0      9.0     13.0     17.0     4.0
km_per_year   180 14,940.8 13,900.0  6,027.67   0.1 10,387.2 18,711.5 30,000.0 8,324.3

📝 INTERPRÉTATION DES STATISTIQUES :
--------------------------------------------------

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 43%, σ = 3,726)
      → Étendue : [2,000 ; 19,990] (IQR = 5,490)

   📌 mileage_km :
      → Distribution asymétrique DROITE (moyenne 164,733 > médiane 151,676)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 44%, σ = 71,775)
      → Étendue : [1 ; 420,000] (IQR = 102,010)

   📌 year_model :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 0%, σ = 3)
      → Étendue : [2,009 ; 2,019] (IQR = 4)

   📌 age_years :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Faible dispersion (CV = 24%, σ = 3)
      → Étendue : [7 ; 17] (IQR = 4)

   📌 km_per_year :
      → Distribution asymétrique DROITE (moyenne 14,941 > médiane 13,900)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 40%, σ = 6,028)
      → Étendue : [0 ; 30,000] (IQR = 8,324)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================

📊 Prix moyen par année modèle...

   📋 Table : Prix par année modèle
2026-03-22 08:08:43,830 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
2026-03-22 08:08:43,830 [INFO] matplotlib.category — Using categorical units to plot a list of strings that are all parsable as floats or dates. If these strings should be plotted as numbers, cast to the appropriate data type before plotting.
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2010     9      4,764      4,200        N/A
     2011    16      5,056      4,795      -6.1%
     2012    13      6,548      5,200     -29.5%
     2013    24      7,259      7,690     -10.9%
     2014    22      8,752      8,740     -20.6%
     2015    12      8,299      9,000      +5.2%
     2016    24      8,998      8,000      -8.4%
     2017    22     10,651      9,895     -18.4%
     2018    22     11,668     11,750      -9.5%
     2019    15     11,246     10,990      +3.6%

   📌 Décote annuelle moyenne : -10.5%

📊 Prix moyen par tranche de kilométrage...

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k     1      2,000      2,000        N/A
         20-50k     5     13,656     12,800    +582.8%
         50-80k    10     13,644     13,000      -0.1%
        80-120k    37     11,597     10,980     -15.0%
       120-160k    41      9,838      9,990     -15.2%
       160-200k    31      6,857      7,000     -30.3%
          200k+    55      5,505      5,200     -19.7%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       7    15     11,246        N/A
       8    22     11,668      +3.8%
       9    22     10,651      -8.7%
      10    24      8,998     -15.5%
      11    12      8,299      -7.8%
      12    22      8,752      +5.5%
      13    24      7,259     -17.1%
      14    13      6,548      -9.8%
      15    16      5,056     -22.8%
      16     9      4,764      -5.8%

   📌 La décote ralentit significativement à 16 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel   180      8,636      8,265

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private   124      8,088      7,650
          pro    56      9,849      9,890

   📌 Test Mann-Whitney (médiane) : p = 0.0020
   ✅ Différence SIGNIFICATIVE (p < 0.05)
   📌 Écart médian Pro - Particulier : +2,240€

📊 Prix par modèle de véhicule...
   ℹ️ Un seul modèle détecté (nv200) — comparaison non applicable

   ✅ Toutes les distributions par catégorie sauvegardées dans /home/ubuntu/app/stats/nv200/figures

======================================================================
📊 ANALYSES AVANCÉES - SEUILS PSYCHOLOGIQUES
======================================================================

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        50k : décote  -11.8% (n=  3)
        60k : décote   15.9% (n=  2) ⚡
        70k : décote    1.4% (n=  5)
        80k : décote    4.5% (n=  9)
        90k : décote   -0.2% (n= 10)
       100k : décote    5.9% (n=  8)
       110k : décote   10.1% (n= 10) ⚡
       120k : décote  -14.0% (n= 11)
       130k : décote   14.0% (n= 12) ⚡
       140k : décote   12.9% (n= 13) ⚡
       150k : décote   19.2% (n=  5) ⚡
       160k : décote  -12.4% (n=  6)
       170k : décote   31.3% (n=  7) ⚡
       180k : décote  -15.2% (n=  6)
       190k : décote  -14.5% (n= 12)
       200k : décote   -1.5% (n=  5)
       210k : décote   21.0% (n=  7) ⚡
       220k : décote   -4.6% (n=  7)
       230k : décote    2.5% (n=  7)
       240k : décote   -2.9% (n=  8)
       250k : décote   26.0% (n=  5) ⚡
       260k : décote   15.2% (n=  2) ⚡
       290k : décote  -21.6% (n=  6)
      300k+ : décote   15.3% (n=  6) ⚡

   📌 Seuils où la décote s'accélère (> 8%) :
      → 60k km : 15.9%
      → 110k km : 10.1%
      → 130k km : 14.0%
      → 140k km : 12.9%
      → 150k km : 19.2%
      → 170k km : 31.3%
      → 210k km : 21.0%
      → 250k km : 26.0%
      → 260k km : 15.2%
      → 300k+ km : 15.3%
   ✅ Sauvegardé : /home/ubuntu/app/stats/nv200/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     8 ans : décote   -3.8% (n= 22) 🐢 LENTE
     9 ans : décote    8.7% (n= 22)
    10 ans : décote   15.5% (n= 24) ⚡ FORTE
    11 ans : décote    7.8% (n= 12)
    12 ans : décote   -5.5% (n= 22) 🐢 LENTE
    13 ans : décote   17.1% (n= 24) ⚡ FORTE
    14 ans : décote    9.8% (n= 13)
    15 ans : décote   22.8% (n= 16) ⚡ FORTE
    16 ans : décote    5.8% (n=  9)

   📌 Décote rapide (> 10% par an) :
      → 10 ans : 15.5%
      → 13 ans : 17.1%
      → 15 ans : 22.8%

   📌 Décote lente (< 5% par an) :
      → 8 ans : -3.8%
      → 12 ans : -5.5%
   ✅ Sauvegardé : /home/ubuntu/app/stats/nv200/figures/seuils_age.png

======================================================================
📊 IDENTIFICATION DES BONNES AFFAIRES
======================================================================

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -457.28 × âge + -0.0298 × km + 18,645
   📌 R² = 0.600
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   35 ( 19.6%)
      👍 Bonne affaire             :   33 ( 18.4%)
      📊 Prix marché               :   57 ( 31.8%)
      💰 Cher                      :   26 ( 14.5%)
      🔴 Très cher                 :   28 ( 15.6%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/nv200/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3138843536] Vehicule camionnette nissan nv200
       Prix:    2,000€ | Attendu:   11,785€ | Écart:  -83.0% | Année: 2011 | Km: 1
    2. [3159812831] Vend utilitaires nv200 nissan
       Prix:    2,000€ | Attendu:    6,727€ | Écart:  -70.3% | Année: 2011 | Km: 170,000
    3. [3160668277] Nissan nv 200
       Prix:    3,000€ | Attendu:    7,105€ | Écart:  -57.8% | Année: 2013 | Km: 188,000
    4. [3164906877] Nissan
       Prix:    3,500€ | Attendu:    6,632€ | Écart:  -47.2% | Année: 2016 | Km: 250,000
    5. [3109648143] Nissan nv200 1.5 dci turbo
       Prix:    3,990€ | Attendu:    7,005€ | Écart:  -43.0% | Année: 2012 | Km: 176,000
    6. [3154995725] Nissan NV200 Fourgon 1.5 DCi 110ch BVM5 Optima - 2
       Prix:    4,000€ | Attendu:    6,793€ | Écart:  -41.1% | Année: 2014 | Km: 213,880
    7. [3116605709] Nissan NV200
       Prix:    4,500€ | Attendu:    7,619€ | Écart:  -40.9% | Année: 2011 | Km: 140,000
    8. [3127367839] Nissan NV200 1.5 DCI
       Prix:    5,490€ | Attendu:    8,816€ | Écart:  -37.7% | Année: 2014 | Km: 145,899
    9. [3142568361] Nissan nv 200 1.5 90ch
       Prix:    5,200€ | Attendu:    8,329€ | Écart:  -37.6% | Année: 2016 | Km: 193,000
   10. [3164561805] Nissan nv200
       Prix:    5,290€ | Attendu:    8,120€ | Écart:  -34.9% | Année: 2016 | Km: 200,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3156635875] Nissan NV200
       Prix:    3,500€ | Attendu:      586€ | Écart: +497.7% | Année: 2010 | Km: 361,000
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/main.py", line 245, in <module>
    main()
  File "/home/ubuntu/app/stats/main.py", line 185, in main
    df = run_llm_title_analysis(df, model_filter=model_filter, run_id=None)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'
    2. [3154023820] Camion
       Prix:    3,500€ | Attendu:      764€ | Écart: +358.1% | Année: 2010 | Km: 355,000
    3. [3153372541] Nissan nv 200
       Prix:   10,500€ | Attendu:    5,558€ | Écart:  +88.9% | Année: 2013 | Km: 240,000
    4. [3114600758] Van
       Prix:   18,500€ | Attendu:   10,241€ | Écart:  +80.6% | Année: 2014 | Km: 98,000
    5. [3156516616] 🚐 Nissan NV200 aménagé – Prêt à voyager
       Prix:    9,300€ | Attendu:    5,745€ | Écart:  +61.9% | Année: 2011 | Km: 203,000
    6. [3158536730] Véhicule aménagé
       Prix:   13,500€ | Attendu:    8,374€ | Écart:  +61.2% | Année: 2012 | Km: 130,000
    7. [3083668151] Nissan NV200 1.5 DCI 90CH VAN AMENAGE
       Prix:   14,999€ | Attendu:    9,555€ | Écart:  +57.0% | Année: 2014 | Km: 121,041
    8. [3163982347] Utilitaire aménagé Van NV200 2016 84000 km
       Prix:   17,900€ | Attendu:   11,572€ | Écart:  +54.7% | Année: 2016 | Km: 84,000
    9. [3155364135] Utilitaire Van Nissan NV200 2016
       Prix:   17,900€ | Attendu:   11,602€ | Écart:  +54.3% | Année: 2016 | Km: 83,000
   10. [3150255673] Van aménagé Nissan NV200
       Prix:    8,500€ | Attendu:    5,615€ | Écart:  +51.4% | Année: 2010 | Km: 192,000

🔎 Détection des prix suspects (seuil: -40%)...
   ⚠️  7 annonces avec prix suspect
   💾 7 signaux prix persistés dans SQLite

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 180
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 245, in <module>
    run_llm_title_analysis(
  File "/home/ubuntu/app/stats/m05_llm_title_analysis.py", line 195, in run_llm_title_analysis
    from services.llm_service import analyze_titles_batch
  File "/home/ubuntu/app/services/llm_service.py", line 14, in <module>
    from openai import APIStatusError
ModuleNotFoundError: No module named 'openai'

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 6462
============================================================
  CRAWL ALL — 9 modèle(s)
============================================================

[1/9] CLIO_4  (brand=renault, pages=41)
  URL: https://www.leboncoin.fr/recherche?category=2&text=clio%204&price=3000-9000&regd...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 41 --model clio_4
  CSV : leboncoin_ads_clio_4_20260322_080000.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv --db /home/ubuntu/app/db/lbc.sqlite --model clio_4
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_clio_4_20260322_080000.csv --brand renault --model clio_4 --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model clio_4 --skip-plots
  AVERTISSEMENT : stats échouées pour clio_4

[2/9] YARIS  (brand=toyota, pages=2)
  URL: https://www.leboncoin.fr/recherche?category=2&text=toyota%20yaris&price=3000-900...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 2 --model yaris
  CSV : leboncoin_ads_yaris_20260322_080226.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_yaris_20260322_080226.csv --db /home/ubuntu/app/db/lbc.sqlite --model yaris
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_yaris_20260322_080226.csv --brand toyota --model yaris --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model yaris --skip-plots
  AVERTISSEMENT : stats échouées pour yaris

[3/9] I20  (brand=hyundai, pages=4)
  URL: https://www.leboncoin.fr/recherche?category=2&text=i20&price=3000-9000&regdate=2...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 4 --model i20
  CSV : leboncoin_ads_i20_20260322_080236.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv --db /home/ubuntu/app/db/lbc.sqlite --model i20
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_i20_20260322_080236.csv --brand hyundai --model i20 --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model i20 --skip-plots
  AVERTISSEMENT : stats échouées pour i20

[4/9] BERLINGO  (brand=citroen, pages=10)
  URL: https://www.leboncoin.fr/recherche?category=5&text=berlingo+xl&u_utility_brand=C...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 10 --model berlingo
  CSV : leboncoin_ads_berlingo_20260322_080253.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv --db /home/ubuntu/app/db/lbc.sqlite --model berlingo
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_berlingo_20260322_080253.csv --brand citroen --model berlingo --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model berlingo --skip-plots
  AVERTISSEMENT : stats échouées pour berlingo

[5/9] C4  (brand=citroen, pages=5)
  URL: https://www.leboncoin.fr/recherche?category=2&text=c4&price=min-11000&regdate=20...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 5 --model c4
  CSV : leboncoin_ads_c4_20260322_080339.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv --db /home/ubuntu/app/db/lbc.sqlite --model c4
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_c4_20260322_080339.csv --brand citroen --model c4 --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model c4 --skip-plots
  AVERTISSEMENT : stats échouées pour c4

[6/9] SCENIC  (brand=renault, pages=4)
  URL: https://www.leboncoin.fr/recherche?category=2&text=scenic&price=min-11000&regdat...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 4 --model scenic
  ERREUR : crawler échoué pour scenic

[7/9] 5008  (brand=peugeot, pages=31)
  URL: https://www.leboncoin.fr/recherche?category=2&text=5008&price=min-11000&u_car_br...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 31 --model 5008
  ERREUR : crawler échoué pour 5008

[8/9] FIESTA  (brand=ford, pages=44)
  URL: https://www.leboncoin.fr/recherche?category=2&text=ford%20fiesta&price=3000-1000...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 44 --model fiesta
  ERREUR : crawler échoué pour fiesta

[9/9] NV200  (brand=nissan, pages=3)
  URL: https://www.leboncoin.fr/recherche?category=5&text=nv200&u_utility_brand=NISSAN&...
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/crawler/leboncoin_search_export.py --output-file /home/ubuntu/app/leboncoin_ads.csv --pages 3 --model nv200
  CSV : leboncoin_ads_nv200_20260322_080831.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv --db /home/ubuntu/app/db/lbc.sqlite --model nv200
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_nv200_20260322_080831.csv --brand nissan --model nv200 --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model nv200 --skip-plots
  AVERTISSEMENT : stats échouées pour nv200

  .env restauré

============================================================
  LLM — Extraction des titres (toutes les annonces)
============================================================
  $ /home/ubuntu/app/.venv/bin/python -m stats.m05_llm_title_analysis
  AVERTISSEMENT : extraction LLM échouée

============================================================
  RÉSUMÉ
============================================================
  ✓ clio_4               → OK
  ✓ yaris                → OK
  ✓ i20                  → OK
  ✓ berlingo             → OK
  ✓ c4                   → OK
  ✗ scenic               → ERREUR crawler
  ✗ 5008                 → ERREUR crawler
  ✗ fiesta               → ERREUR crawler
  ✓ nv200                → OK
============================================================

============================================================
Finished: 2026-03-22T08:08:45.610270
Duration: 525.6s
STATUS:SUCCESS