Administration

← Retour

Log : 20260323_140000

=== CRAWL 20260323_140000 ===
Trigger: scheduled
Started: 2026-03-23T14:00:00.002367
============================================================

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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.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_20260323_140000.csv réussi.

Terminé : 1435 annonces au total dans /home/ubuntu/app/leboncoin_ads_clio_4_20260323_140000.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_20260323_140000.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
  📌 6628 annonces en base
════════════════════════════════════════════════════════════
INFO: 1424 list_id lus dans le CSV.
INFO: 1471 annonces actives en base pour renault clio_4.
INFO: 47 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_clio_4_20260323_140000.csv
  Brand : renault  |  Modèle : clio_4
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 1424
  Annonces actives en DB  : 1471
  Absentes du crawl       : 47
  Marquées indisponibles  : 47
════════════════════════════════════════════════════════════

  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
   ✅ 2695 annonces chargées (modèle 'clio_4')

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

📌 Nombre total d'annonces : 2695

📋 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-23 14:52:55
   Durée : 717 jours

👤 Répartition par type de vendeur :
   private         : 1769 (65.6%)
   pro             :  926 (34.4%)

⛽ Répartition par carburant :
   diesel               : 1477 (54.8%)
   essence              : 1214 (45.0%)
   autre                :    3 (0.1%)
   gpl                  :    1 (0.0%)

🏭 Top 10 marques :
   renault              : 2695 (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               : 2694 / 2695
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :   41 outliers (1.5%)
      Bornes IQR : [4,740 ; 10,740]
   mileage_km           :   44 outliers (1.6%)
      Bornes IQR : [19,062 ; 252,562]
   age_years            :    8 outliers (0.3%)
      Bornes IQR : [5 ; 13]

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

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 2694
   Dont outliers identifiés    : 77
   Annonces non-outliers       : 2617

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

   💾 2694 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  9 signaux de suspicion détectés
      km_trop_bas_essence: 2
      km_trop_bas_diesel: 7
   💾 9 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   2694   7608.956199   7900.000000  1104.537741 3300.000000   6990.000   8490.000000   9000.000000  1500.000000
 mileage_km   2694 137699.084633 134000.000000 44746.472496  125.000000 106625.000 165000.000000 380000.000000 58375.000000
 year_model   2694   2017.275056   2017.000000     1.357569 2014.000000   2016.000   2018.000000   2024.000000     2.000000
  age_years   2694      8.724944      9.000000     1.357569    2.000000      8.000     10.000000     12.000000     2.000000
km_per_year   2694  16116.352665  15714.285714  5717.291662   17.857143  12195.625  19593.166667  54285.714286  7397.541667

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur 2,694    7,609    7,900  1,104.54 3,300    6,990    8,490    9,000   1,500
 mileage_km 2,694  137,699  134,000 44,746.47   125  106,625  165,000  380,000  58,375
 year_model 2,694    2,017    2,017      1.36 2,014    2,016    2,018    2,024       2
  age_years 2,694      8.7      9.0      1.36   2.0      8.0     10.0     12.0     2.0
km_per_year 2,694 16,116.4 15,714.3  5,717.29  17.9 12,195.6 19,593.2 54,285.7 7,397.5

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

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

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

   📌 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,717)
      → Étendue : [18 ; 54,286] (IQR = 7,398)

======================================================================
2026-03-23 14:02:11,508 [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-23 14:02:11,509 [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   777      7,296      7,500      +0.3%
     2017   720      7,612      7,800      -4.3%
     2018   583      7,720      7,980      -1.4%
     2019   359      7,967      8,100      -3.2%
     2020   114      8,233      8,500      -3.3%
     2021    25      8,344      8,490      -1.3%
     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    10      7,363      6,970        N/A
         20-50k    17      8,119      8,500     +10.3%
         50-80k   171      8,207      8,490      +1.1%
        80-120k   833      7,997      8,000      -2.6%
       120-160k   867      7,894      7,990      -1.3%
       160-200k   547      7,144      7,000      -9.5%
          200k+   249      5,903      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    25      8,344      -5.6%
       6   114      8,233      -1.3%
       7   359      7,967      -3.2%
       8   583      7,720      -3.1%
       9   720      7,612      -1.4%
      10   777      7,296      -4.2%
      11    55      7,319      +0.3%
      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  1477      7,466      7,700
           essence  1213      7,782      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  1768      7,449      7,600
          pro   926      7,914      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   -0.5% (n=  2)
        20k : décote  -16.7% (n=  5)
        30k : décote    1.6% (n=  6)
        40k : décote   13.9% (n=  6) ⚡
        50k : décote  -11.6% (n= 34)
        60k : décote   -2.6% (n= 53)
        70k : décote    3.0% (n= 84)
        80k : décote   -0.9% (n=127)
        90k : décote    0.8% (n=204)
       100k : décote    2.7% (n=215)
       110k : décote    0.3% (n=287)
       120k : décote   -2.1% (n=211)
       130k : décote    1.3% (n=221)
       140k : décote    0.7% (n=227)
       150k : décote    2.5% (n=208)
       160k : décote    3.7% (n=176)
       170k : décote    1.8% (n=153)
       180k : décote    4.0% (n=115)
       190k : décote    3.8% (n=103)
       200k : décote    6.4% (n= 96)
       210k : décote    3.1% (n= 48)
       220k : décote   -2.7% (n= 24)
       230k : décote   11.5% (n= 33) ⚡
       240k : décote    3.6% (n=  8)
       250k : décote    1.8% (n= 15)
       260k : décote   -3.8% (n=  4)
       270k : décote   15.3% (n=  4) ⚡
       280k : décote  -14.2% (n=  6)
       290k : décote   16.5% (n=  6) ⚡
      300k+ : décote  -10.5% (n=  5)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 40k km : 13.9%
      → 230k km : 11.5%
      → 270k km : 15.3%
      → 290k km : 16.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= 25)
     6 ans : décote    1.3% (n=114) 🐢 LENTE
     7 ans : décote    3.2% (n=359)
     8 ans : décote    3.1% (n=583)
     9 ans : décote    1.4% (n=720) 🐢 LENTE
    10 ans : décote    4.2% (n=777)
    11 ans : décote   -0.3% (n= 55) 🐢 LENTE
    12 ans : décote    4.7% (n= 53)

   📌 Décote lente (< 5% par an) :
      → 4 ans : -10.5%
      → 6 ans : 1.3%
      → 7 ans : 3.2%
      → 8 ans : 3.1%
      → 9 ans : 1.4%
      → 10 ans : 4.2%
      → 11 ans : -0.3%
      → 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 = -170.95 × âge + -0.0130 × km + 10,891
   📌 R² = 0.340
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :  160 (  5.9%)
      👍 Bonne affaire             :  345 ( 12.8%)
      📊 Prix marché               : 1673 ( 62.1%)
      💰 Cher                      :  436 ( 16.2%)
      🔴 Très cher                 :   80 (  3.0%)
📊 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,818€ | Écart:  -57.8% | Année: 2018 | Km: 131,159
    2. [3147790884] Clio 4 phase 2
       Prix:    3,500€ | Attendu:    7,833€ | Écart:  -55.3% | Année: 2018 | Km: 130,000
    3. [3165548491] Renault clio 4
       Prix:    3,500€ | Attendu:    7,467€ | Écart:  -53.1% | Année: 2017 | Km: 145,000
    4. [3150016687] Clio 4
       Prix:    4,000€ | Attendu:    7,777€ | Écart:  -48.6% | Année: 2016 | Km: 108,000
    5. [3162715888] Clio 4 2018
       Prix:    4,700€ | Attendu:    9,003€ | É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,192€ | Écart:  -47.2% | Année: 2016 | Km: 153,000
    7. [3147329929] Clio 4
       Prix:    4,000€ | Attendu:    7,539€ | Écart:  -46.9% | Année: 2014 | Km: 100,000
    8. [3144664626] Clio 4 retour de vol
       Prix:    4,800€ | Attendu:    8,979€ | Écart:  -46.5% | 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,984€ | Écart:  -42.7% | Année: 2016 | Km: 169,000
   10. [3138542846] Clio 4 essence retour vol
       Prix:    4,500€ | Attendu:    7,710€ | É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,753€ | Écart:  +47.3% | Année: 2019 | Km: 380,000
    2. [3163754314] Clio 4 initiale paris
       Prix:    8,900€ | Attendu:    6,581€ | Écart:  +35.2% | Année: 2016 | Km: 200,000
    3. [3161126708] RENAULT CLIO IV dCi 110 Initiale Paris | FULL OPTI
       Prix:    8,990€ | Attendu:    6,661€ | Écart:  +35.0% | Année: 2017 | Km: 207,000
    4. [3165923653] RENAULT CLIO IV BUSINESS dCi 90 Energy eco2 82g Bu
       Prix:    8,990€ | Attendu:    7,010€ | Écart:  +28.2% | Année: 2016 | Km: 166,990
    5. [3144046817] Clio 5
       Prix:    9,000€ | Attendu:    7,029€ | Écart:  +28.0% | Année: 2019 | Km: 205,000
    6. [3151967791] Clio 4 initiale Paris
       Prix:    8,900€ | Attendu:    6,960€ | É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,651€ | Écart:  +27.6% | Année: 2016 | Km: 194,600
    8. [3155418369] Renault CLIO IV 1.5 DCI 90CH ENERGY BUSINESS 82G 5
       Prix:    8,490€ | Attendu:    6,651€ | Écart:  +27.6% | Année: 2016 | Km: 194,600
    9. [3136191420] Clio IV
       Prix:    7,490€ | Attendu:    5,883€ | Écart:  +27.3% | Année: 2018 | Km: 280,000
   10. [3151279318] Clio 4 ÉDITION ONE
       Prix:    8,899€ | Attendu:    7,007€ | É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 : 2695
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_20260323_140213.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
  → 17 annonces récupérées (total en mémoire: 52)
Export de 52 annonces vers /home/ubuntu/app/leboncoin_ads_yaris_20260323_140213.csv réussi.

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

📂 leboncoin_ads_yaris_20260323_140213.csv
   ✅ 52 lus, 52 insérés, 0 ignorés, 0 erreurs

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

  Annonces dans le CSV    : 52
  Annonces actives en DB  : 52
  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
   ✅ 114 annonces chargées (modèle 'yaris')

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

📌 Nombre total d'annonces : 114

📋 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-23 12:13:01
   Durée : 282 jours

👤 Répartition par type de vendeur :
   pro             :   59 (51.8%)
   private         :   55 (48.2%)

⛽ Répartition par carburant :
   essence              :   97 (85.1%)
   diesel               :   17 (14.9%)

🏭 Top 10 marques :
   toyota               :  114 (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               :  114 / 114
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    1 outliers (0.9%)
      Bornes IQR : [4,712 ; 11,413]
   mileage_km           :    3 outliers (2.6%)
      Bornes IQR : [21,122 ; 219,207]
   age_years            :    2 outliers (1.8%)
      Bornes IQR : [5 ; 13]

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

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

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

   💾 114 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  2 signaux de suspicion détectés
      km_trop_bas_essence: 2
   💾 2 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    114   7907.052632   8100.00  1145.532437 2500.0  7224.750000   8900.000000   9000.0  1675.25
 mileage_km    114 117282.456140 118720.00 38428.078967  150.0 95403.750000 144925.000000 200000.0 49521.25
 year_model    114   2016.824561   2016.00     1.592269 2015.0  2016.000000   2018.000000   2025.0     2.00
  age_years    114      9.175439     10.00     1.592269    1.0     8.000000     10.000000     11.0     2.00
km_per_year    114  13890.764670  12881.05 12942.117495   15.0  9770.464286  14903.464286 143200.0  5133.00

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min      Q1       Q3       Max     IQR
  price_eur   114    7,907    8,100  1,145.53 2,500   7,225    8,900     9,000   1,675
 mileage_km   114  117,282  118,720 38,428.08   150  95,404  144,925   200,000  49,521
 year_model   114    2,017    2,016      1.59 2,015   2,016    2,018     2,025       2
  age_years   114      9.2     10.0      1.59   1.0     8.0     10.0      11.0     2.0
km_per_year   114 13,890.8 12,881.0 12,942.12  15.0 9,770.5 14,903.5 143,200.0 5,133.0

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

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

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

   📌 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 = 17%, σ = 2)
      → Étendue : [1 ; 11] (IQR = 2)

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

======================================================================
📊 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-23 14:02:20,925 [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-23 14:02:20,926 [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    46      7,634      7,994      +3.1%
     2017    22      8,250      8,495      -8.1%
     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     3      6,950      7,000        N/A
         20-50k     2      8,840      8,840     +27.2%
         50-80k    13      8,724      8,990      -1.3%
        80-120k    40      8,210      8,490      -5.9%
       120-160k    41      7,720      7,990      -6.0%
       160-200k    14      7,001      6,990      -9.3%
          200k+     1      6,500      6,500      -7.2%

📊 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    46      7,634      -7.5%
      11    16      7,880      +3.2%

   📌 La décote ralentit significativement à 11 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel    17      7,674      8,000
           essence    97      7,948      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    55      7,585      7,999
          pro    59      8,207      8,490

   📌 Test Mann-Whitney (médiane) : p = 0.0207
   ✅ 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 :
   --------------------------------------------------
        50k : décote  -26.3% (n=  2)
        60k : décote    0.0% (n=  8)
        70k : décote    1.0% (n=  3)
        80k : décote    3.6% (n=  4)
        90k : décote   -1.8% (n= 12)
       100k : décote    4.7% (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    5.2% (n= 16)
       150k : décote    4.6% (n=  7)
       160k : décote   -2.8% (n=  4)
       170k : décote    5.8% (n=  8)
       180k : décote    6.9% (n=  2)
   ✅ 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.5% (n= 46)
    11 ans : décote   -3.2% (n= 16) 🐢 LENTE

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

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

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = 69.47 × âge + -0.0110 × km + 8,565
   📌 R² = 0.131
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :    8 (  7.0%)
      👍 Bonne affaire             :   10 (  8.8%)
      📊 Prix marché               :   74 ( 64.9%)
      💰 Cher                      :   18 ( 15.8%)
      🔴 Très cher                 :    4 (  3.5%)
📊 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,603€ | Écart:  -67.1% | Année: 2016 | Km: 150,000
    2. [3152322073] Toyota Yaris 1.0 VVTI PRO EXPORT (0101261)
       Prix:    5,250€ | Attendu:    8,604€ | Écart:  -39.0% | Année: 2023 | Km: 15,333
    3. [3157660912] Toyota Yaris
       Prix:    5,500€ | Attendu:    7,917€ | Écart:  -30.5% | Année: 2018 | Km: 109,000
    4. [3165225181] Toyota yaris
       Prix:    5,300€ | Attendu:    7,382€ | Écart:  -28.2% | Année: 2016 | Km: 170,000
    5. [3166534631] Toyota yaris
       Prix:    5,300€ | Attendu:    7,382€ | Écart:  -28.2% | Année: 2016 | Km: 170,000
    6. [3157975215] Toyota yaris 2011
       Prix:    5,150€ | Attendu:    7,053€ | Écart:  -27.0% | Année: 2025 | Km: 143,200
    7. [3161632025] Toyota Yaris III - 5P - 2016
       Prix:    5,500€ | Attendu:    7,492€ | Écart:  -26.6% | Année: 2016 | Km: 160,000
    8. [3165747251] Toyota Yaris
       Prix:    7,000€ | Attendu:    9,258€ | Écart:  -24.4% | Année: 2016 | Km: 150
    9. [3160315775] Toyota aygo xplay
       Prix:    6,399€ | Attendu:    7,994€ | Écart:  -20.0% | Année: 2018 | Km: 102,000
   10. [3164108049] Toyota yaris lllphase2
       Prix:    6,000€ | Attendu:    7,382€ | Écart:  -18.7% | Année: 2016 | Km: 170,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,118€ | Écart:  +25.0% | 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,316€ | Écart:  +22.9% | Année: 2016 | Km: 176,000
    3. [3153117476] Toyota Yaris 70 VVT-i France 5p MY19
       Prix:    8,990€ | Attendu:    7,427€ | Écart:  +21.0% | Année: 2018 | Km: 153,356
    4. [3163742160] Toyota Yaris 90 D-4D Design 5p style
       Prix:    8,990€ | Attendu:    7,447€ | Écart:  +20.7% | Année: 2016 | Km: 164,156
    5. [3135900987] TOYOTA YARIS RC18 110 VVT-i COLLECTION
       Prix:    8,990€ | Attendu:    7,630€ | Écart:  +17.8% | Année: 2018 | Km: 135,000
    6. [3151923222] Toyota Yaris 110 VVT-i Design Y20 5p RC19
       Prix:    8,990€ | Attendu:    7,651€ | Écart:  +17.5% | Année: 2019 | Km: 126,787
    7. [3006906577] Toyota Yaris III 69 VVT-i France
       Prix:    8,990€ | Attendu:    7,705€ | Écart:  +16.7% | Année: 2016 | Km: 140,770
    8. [3146935741] Toyota Yaris 1.4 D-4D 90 Business
       Prix:    8,990€ | Attendu:    7,763€ | Écart:  +15.8% | Année: 2017 | Km: 129,178
    9. [3154060767] Toyota yaris
       Prix:    9,000€ | Attendu:    7,797€ | Écart:  +15.4% | Année: 2017 | Km: 126,126
   10. [3154999177] Toyota Yaris 1.4 l D4D
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,900€ | Attendu:    7,800€ | Écart:  +14.1% | 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 : 114
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_20260323_140222.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_20260323_140222.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_20260323_140222.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
  → 17 annonces récupérées (total en mémoire: 122)
Export de 122 annonces vers /home/ubuntu/app/leboncoin_ads_i20_20260323_140222.csv réussi.

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

📂 leboncoin_ads_i20_20260323_140222.csv
   ✅ 122 lus, 122 insérés, 0 ignorés, 0 erreurs

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

  Annonces dans le CSV    : 122
  Annonces actives en DB  : 122
  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/i20/figures
  🔍 Modèle filtré    : i20
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 233 annonces chargées (modèle 'i20')

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

📌 Nombre total d'annonces : 233

📋 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 16:29:35
   Durée : 342 jours

👤 Répartition par type de vendeur :
   private         :  131 (56.2%)
   pro             :  102 (43.8%)

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

🏭 Top 10 marques :
   hyundai              :  233 (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               :  233 / 233
      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 : [26,500 ; 217,700]
   age_years            :    2 outliers (0.9%)
      Bornes IQR : [5 ; 13]

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

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 233
   Dont outliers identifiés    : 8
   Annonces non-outliers       : 225

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

   💾 233 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  3 signaux de suspicion détectés
      km_trop_bas_diesel: 2
      km_trop_bas_essence: 1
   💾 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    233   7783.579399   7990.0  1066.605053 3800.000  7000.0   8500.0   9000.000000  1500.0
 mileage_km    233 121481.540773 124500.0 37672.846563   95.000 98200.0 146000.0 230567.000000 47800.0
 year_model    233   2016.806867   2017.0     1.352375 2015.000  2016.0   2018.0   2025.000000     2.0
  age_years    233      9.193133      9.0     1.352375    1.000     8.0     10.0     11.000000     2.0
km_per_year    233  13358.817977  13284.2  4225.222793   11.875 10400.0  16350.0  24308.166667  5950.0

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   233    7,784    7,990  1,066.61 3,800    7,000    8,500    9,000   1,500
 mileage_km   233  121,482  124,500 37,672.85    95   98,200  146,000  230,567  47,800
 year_model   233    2,017    2,017      1.35 2,015    2,016    2,018    2,025       2
  age_years   233      9.2      9.0      1.35   1.0      8.0     10.0     11.0     2.0
km_per_year   233 13,358.8 13,284.2  4,225.22  11.9 10,400.0 16,350.0 24,308.2 5,950.0

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

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

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

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

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

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

======================================================================
📊 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-23 14:02:35,199 [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-23 14:02:35,200 [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    25      7,574      7,800        N/A
     2016    91      7,620      7,900      -0.6%
     2017    58      7,645      7,945      -0.3%
     2018    37      8,169      8,500      -6.9%
     2019    15      8,361      8,490      -2.4%
     2020     5      8,584      8,480      -2.7%

   📌 Décote annuelle moyenne : -2.6%

📊 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    24      8,539      8,725      +4.0%
        80-120k    74      8,174      8,490      -4.3%
       120-160k    89      7,766      7,900      -5.0%
       160-200k    33      6,526      6,000     -16.0%
          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,584        N/A
       7    15      8,361      -2.6%
       8    37      8,169      -2.3%
       9    58      7,645      -6.4%
      10    91      7,620      -0.3%
      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    44      7,188      7,290
           essence   188      7,920      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   131      7,659      7,900
          pro   102      7,943      7,994

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

📊 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    4.2% (n= 10)
        70k : décote   -3.3% (n= 12)
        80k : décote    2.9% (n=  7)
        90k : décote    0.6% (n= 22)
       100k : décote    2.5% (n= 28)
       110k : décote    2.5% (n= 17)
       120k : décote    3.7% (n= 27)
       130k : décote   -1.5% (n= 26)
       140k : décote   -1.0% (n= 23)
       150k : décote   -1.4% (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    2.6% (n= 15) 🐢 LENTE
     8 ans : décote    2.3% (n= 37) 🐢 LENTE
     9 ans : décote    6.4% (n= 58)
    10 ans : décote    0.3% (n= 91) 🐢 LENTE
    11 ans : décote    0.6% (n= 25) 🐢 LENTE

   📌 Décote lente (< 5% par an) :
      → 7 ans : 2.6%
      → 8 ans : 2.3%
      → 10 ans : 0.3%
      → 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 = -111.88 × âge + -0.0129 × km + 10,385
   📌 R² = 0.256
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   15 (  6.4%)
      👍 Bonne affaire             :   31 ( 13.3%)
      📊 Prix marché               :  139 ( 59.7%)
      💰 Cher                      :   44 ( 18.9%)
      🔴 Très cher                 :    4 (  1.7%)
📊 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,782€ | Écart:  -51.2% | Année: 2015 | Km: 106,000
    2. [3160167161] Hyundai i20 2017
       Prix:    4,000€ | Attendu:    7,811€ | Écart:  -48.8% | Année: 2017 | Km: 121,054
    3. [3132112485] Vend ou échange
       Prix:    5,500€ | Attendu:    9,150€ | Écart:  -39.9% | 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,289€ | Écart:  -31.5% | Année: 2018 | Km: 170,000
    5. [3141044598] Hyundai i20
       Prix:    5,600€ | Attendu:    7,950€ | Écart:  -29.6% | Année: 2016 | Km: 101,653
    6. [3154012812] Hyundai
       Prix:    5,100€ | Attendu:    7,065€ | Écart:  -27.8% | Année: 2016 | Km: 170,000
    7. [3159144757] Hyundai i20 1.2 essence 2016 – CT OK – pneus neufs
       Prix:    5,400€ | Attendu:    7,213€ | Écart:  -25.1% | Année: 2016 | Km: 158,600
    8. [3144748405] Hyundai i20 1.2 Go Klima RadioCD
       Prix:    5,385€ | Attendu:    7,101€ | Écart:  -24.2% | Année: 2017 | Km: 175,866
    9. [3139554030] Hyundai i20 coupe 1.2 84 cv intuitive 3 portes
       Prix:    5,500€ | Attendu:    7,198€ | Écart:  -23.6% | Année: 2018 | Km: 177,000
   10. [3157664571] Hyundai i20 1.1 CRDI
       Prix:    5,300€ | Attendu:    6,884€ | Écart:  -23.0% | 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,130€ | Écart:  +26.1% | Année: 2016 | Km: 165,000
    2. [3164886925] Hyundai i20 Coupé
       Prix:    9,000€ | Attendu:    7,371€ | Écart:  +22.1% | Année: 2017 | Km: 155,000
    3. [3158481657] Hyundai i20
       Prix:    8,900€ | Attendu:    7,394€ | Écart:  +20.4% | Année: 2016 | Km: 144,600
    4. [3109227704] Hyundai i20 crdi 75ch edition navy
       Prix:    8,900€ | Attendu:    7,408€ | Écart:  +20.1% | Année: 2017 | Km: 152,154
    5. [3152500439] Hyundai i20 1.0 T-GDi 100 UEFA EURO 2016
       Prix:    8,489€ | Attendu:    7,241€ | Écart:  +17.2% | Année: 2016 | Km: 156,400
    6. [3151384014] Hyundai i20
       Prix:    8,500€ | Attendu:    7,303€ | Écart:  +16.4% | Année: 2015 | Km: 143,000
    7. [3155001248] Vente voiture hyundai i20
       Prix:    8,500€ | Attendu:    7,315€ | Écart:  +16.2% | Année: 2018 | Km: 168,000
    8. [2972084163] HYUNDAI I20 1.2i - 84 BERLINE Initia
       Prix:    8,990€ | Attendu:    7,743€ | Écart:  +16.1% | Année: 2015 | Km: 109,000
    9. [3140396976] HYUNDAI i20 1.1 CRDi 75 Intuitive
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,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,843€ | É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 : 233
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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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_20260323_140236.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
  → 18 annonces récupérées (total en mémoire: 333)
Export de 333 annonces vers /home/ubuntu/app/leboncoin_ads_berlingo_20260323_140236.csv réussi.

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

📂 leboncoin_ads_berlingo_20260323_140236.csv
   ✅ 333 lus, 333 insérés, 0 ignorés, 0 erreurs

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

  Annonces dans le CSV    : 333
  Annonces actives en DB  : 335
  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/berlingo/figures
  🔍 Modèle filtré    : berlingo
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 533 annonces chargées (modèle 'berlingo')

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

📌 Nombre total d'annonces : 533

📋 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-23 11:25:11
   Durée : 404 jours

👤 Répartition par type de vendeur :
   pro             :  432 (81.1%)
   private         :  101 (18.9%)

⛽ Répartition par carburant :
   diesel               :  518 (97.2%)
   électrique           :   10 (1.9%)
   essence              :    5 (0.9%)

🏭 Top 10 marques :
   citroen              :  533 (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               :  517 / 533
      Pourcentage conservé    : 97.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    6 outliers (1.2%)
      Bornes IQR : [15 ; 28,775]
   mileage_km           :    4 outliers (0.8%)
      Bornes IQR : [-83,202 ; 243,374]
   age_years            :    3 outliers (0.6%)
      Bornes IQR : [-3 ; 13]

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

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

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

   💾 517 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    517 14780.802708 13590.0  5789.515367 2800.0 10800.000000  17990.000000  38190.000000  7190.000000
 mileage_km    517 83992.067698 86050.0 57383.219231    1.0 39264.000000 120908.000000 309000.000000 81644.000000
 year_model    517  2020.642166  2020.0     2.729682 2009.0  2019.000000   2023.000000   2025.000000     4.000000
  age_years    517     5.357834     6.0     2.729682    1.0     3.000000      7.000000     17.000000     4.000000
km_per_year    517 14136.756141 14420.0  9198.513917    1.0  8571.428571  19526.777778  56666.666667 10955.349206

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min      Q1       Q3      Max      IQR
  price_eur   517   14,781   13,590  5,789.52 2,800  10,800   17,990   38,190    7,190
 mileage_km   517   83,992   86,050 57,383.22     1  39,264  120,908  309,000   81,644
 year_model   517    2,021    2,020      2.73 2,009   2,019    2,023    2,025        4
  age_years   517      5.4      6.0      2.73   1.0     3.0      7.0     17.0      4.0
km_per_year   517 14,136.8 14,420.0  9,198.51   1.0 8,571.4 19,526.8 56,666.7 10,955.3

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

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

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

   📌 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,199)
      → Étendue : [1 ; 56,667] (IQR = 10,955)
2026-03-23 14:03:06,831 [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-23 14:03:06,832 [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    34      8,850      8,715      -9.8%
     2018    62     10,092      9,495     -14.0%
     2019    60     12,087     11,989     -19.8%
     2020    95     13,157     12,690      -8.8%
     2021    65     14,236     13,800      -8.2%
     2022    51     14,714     14,500      -3.4%
     2023    39     18,103     17,900     -23.0%
     2024    20     21,073     20,235     -16.4%
     2025    72     24,898     24,480     -18.2%

   📌 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    95     23,774     23,900        N/A
         20-50k    55     17,427     17,760     -26.7%
         50-80k    85     15,252     15,890     -12.5%
        80-120k   143     12,504     12,590     -18.0%
       120-160k    90     10,511     10,395     -15.9%
       160-200k    37      8,583      8,890     -18.3%
          200k+    12      6,388      6,000     -25.6%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       1    72     24,898        N/A
       2    20     21,073     -15.4%
       3    39     18,103     -14.1%
       4    51     14,714     -18.7%
       5    65     14,236      -3.2%
       6    95     13,157      -7.6%
       7    60     12,087      -8.1%
       8    62     10,092     -16.5%
       9    34      8,850     -12.3%
      10    12      8,057      -9.0%
      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   503     14,781     13,590
           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   100     12,261     11,200
          pro   417     15,385     13,990

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

📊 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.3% (n= 28)
        60k : décote   -1.0% (n= 30)
        70k : décote    5.0% (n= 27)
        80k : décote    6.4% (n= 36)
        90k : décote    5.3% (n= 37)
       100k : décote    8.3% (n= 36)
       110k : décote    8.6% (n= 34)
       120k : décote    1.5% (n= 31)
       130k : décote    2.7% (n= 25)
       140k : décote    1.5% (n= 13)
       150k : décote    2.0% (n= 21)
       160k : décote   13.1% (n= 19) ⚡
       170k : décote   -1.1% (n= 11)
       180k : décote   16.9% (n=  7) ⚡
       200k : décote    7.5% (n=  5)
       210k : décote   -4.0% (n=  3)
      300k+ : décote   32.7% (n=  2) ⚡

   📌 Seuils où la décote s'accélère (> 8%) :
      → 10k km : 22.6%
      → 50k km : 9.3%
      → 100k km : 8.3%
      → 110k km : 8.6%
      → 160k km : 13.1%
      → 180k km : 16.9%
      → 300k+ km : 32.7%
   ✅ 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.4% (n= 20) ⚡ FORTE
     3 ans : décote   14.1% (n= 39)
     4 ans : décote   18.7% (n= 51) ⚡ FORTE
     5 ans : décote    3.2% (n= 65)
     6 ans : décote    7.6% (n= 95)
     7 ans : décote    8.1% (n= 60)
     8 ans : décote   16.5% (n= 62) ⚡ FORTE
     9 ans : décote   12.3% (n= 34)
    10 ans : décote    9.0% (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.4%
      → 3 ans : 14.1%
      → 4 ans : 18.7%
      → 8 ans : 16.5%
      → 9 ans : 12.3%
      → 13 ans : 26.7%
      → 17 ans : 29.9%

   📌 Décote lente (< 5% par an) :
      → 5 ans : 3.2%
      → 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 = -938.21 × âge + -0.0502 × km + 24,024
   📌 R² = 0.774
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   49 (  9.5%)
      👍 Bonne affaire             :   87 ( 16.9%)
      📊 Prix marché               :  267 ( 51.9%)
      💰 Cher                      :   52 ( 10.1%)
      🔴 Très cher                 :   59 ( 11.5%)
📊 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,919€ | Écart:  -69.8% | Année: 2018 | Km: 131,461
    2. [3166746198] Citroën Berlingo FOURGON XL BLUEHDI 100 S&S ETG6 C
       Prix:    3,000€ | Attendu:    8,141€ | Écart:  -63.1% | Année: 2018 | Km: 166,868
    3. [3156023107] Citroën Berlingo 1.5 BLUEHDI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   16,389€ | Écart:  -51.2% | Année: 2021 | Km: 58,647
    4. [3158805212] EZ-923 Citroen BERLINGO XL TOLLÉE L2 1.6 BLUEHDI 1
       Prix:    7,990€ | Attendu:   16,058€ | Écart:  -50.2% | Année: 2018 | Km: 9,173
    5. [3144063650] Citroën Berlingo 1.5 BLUEDHI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   15,896€ | Écart:  -49.7% | Année: 2022 | Km: 87,146
    6. [3156192309] Citroën Berlingo FOURGON XL BLUEHDI 100 S&S ETG6 C
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:    2,800€ | Attendu:    5,339€ | Écart:  -47.6% | Année: 2017 | Km: 203,997
    7. [3156023444] Citroën Berlingo 1.5 BLUEHDI 100 STE XL DRIVER
       Prix:    8,000€ | Attendu:   15,152€ | Écart:  -47.2% | Année: 2021 | Km: 83,293
    8. [3157282073] Citroen berlingo xl 1.6 bluehdi 100 cv club
       Prix:    5,980€ | Attendu:   11,077€ | Écart:  -46.0% | Année: 2018 | Km: 108,380
    9. [3163320492] Citroën Berlingo VAN XL 950 PURETECH 130 S&S EAT8 
       Prix:    8,250€ | Attendu:   14,951€ | Écart:  -44.8% | Année: 2020 | Km: 68,597
   10. [2984931973] Citroën Berlingo Electrique Taille XL Club
       Prix:    8,590€ | Attendu:   15,231€ | Écart:  -43.6% | Année: 2018 | Km: 25,657

   🔴 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,423€ | Écart: +321.8% | Année: 2017 | Km: 282,000
    2. [3155307735] Citroën berlingo
       Prix:    7,000€ | Attendu:    1,761€ | Écart: +297.4% | Année: 2013 | Km: 200,500
    3. [3130621009] Citroen BERLINGO XL 1.6 HDI 90 ch CABINE APPROFOND
       Prix:   11,490€ | Attendu:    6,942€ | Écart:  +65.5% | Année: 2014 | Km: 116,000
    4. [3115315205] Citroën Jumpy CAB APPROFONDIE XL BLUEHDI 180 S&S E
       Prix:   38,190€ | Attendu:   23,084€ | Écart:  +65.4% | Année: 2025 | Km: 40
    5. [3140204221] Citroen Berlingo Van XL BlueHDi 100 S&S Cabine App
       Prix:    9,490€ | Attendu:    5,829€ | Écart:  +62.8% | Année: 2018 | Km: 212,912
    6. [3148392923] CITROEN BERLINGO 1.5 BlueHDi S&S - 130 XL Feel 7 P
       Prix:   19,990€ | Attendu:   12,301€ | Écart:  +62.5% | Année: 2018 | Km: 84,000
    7. [3097892706] Citroën Berlingo CABINE APPROFONDIE CA TAILLE XL B
       Prix:   37,140€ | Attendu:   23,086€ | Écart:  +60.9% | Année: 2025 | Km: 1
    8. [3156325212] À vendre - Citroën Berlingo rallongée - Boîte auto
       Prix:    9,500€ | Attendu:    6,308€ | Écart:  +50.6% | Année: 2016 | Km: 166,000
    9. [3158708742] Berlingo XL 1.6L bluehdi aménagé
       Prix:   15,000€ | Attendu:    9,992€ | Écart:  +50.1% | Année: 2018 | Km: 130,000
   10. [3144316655] Citroën Berlingo XL / Rallongé - 1.6 HDI 90cv - BV
       Prix:    6,700€ | Attendu:    4,548€ | Écart:  +47.3% | 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 : 533
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_20260323_140308.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_20260323_140308.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_20260323_140308.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_20260323_140308.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
  → 23 annonces récupérées (total en mémoire: 163)
Export de 163 annonces vers /home/ubuntu/app/leboncoin_ads_c4_20260323_140308.csv réussi.

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

📂 leboncoin_ads_c4_20260323_140308.csv
   ✅ 163 lus, 163 insérés, 0 ignorés, 0 erreurs

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

  Annonces dans le CSV    : 163
  Annonces actives en DB  : 164
  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/c4/figures
  🔍 Modèle filtré    : c4
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 275 annonces chargées (modèle 'c4')

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

📌 Nombre total d'annonces : 275

📋 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-23 10:42:17
   Durée : 865 jours

👤 Répartition par type de vendeur :
   pro             :  141 (51.3%)
   private         :  134 (48.7%)

⛽ Répartition par carburant :
   diesel               :  153 (55.6%)
   essence              :  122 (44.4%)

🏭 Top 10 marques :
   citroen              :  275 (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               :  274 / 275
      Pourcentage conservé    : 99.6%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :   12 outliers (4.4%)
      Bornes IQR : [6,404 ; 13,114]
   mileage_km           :   12 outliers (4.4%)
      Bornes IQR : [66,312 ; 185,812]
   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 : 274
   Dont outliers identifiés    : 24
   Annonces non-outliers       : 250

   Plages de valeurs :
      price_eur            : [     4,500 ;     11,000]  (moy:      9,522)
      mileage_km           : [       186 ;    150,000]  (moy:    120,974)
      year_model           : [     2,015 ;      2,022]  (moy:      2,017)
      age_years            : [         4 ;         11]  (moy:          9)
      km_per_year          : [        17 ;     37,387]  (moy:     14,698)

   💾 274 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  8 signaux de suspicion détectés
      km_trop_bas_essence: 1
      km_trop_bas_diesel: 7
   💾 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    274   9522.047445   9990.0  1464.000193 4500.000000   8920.0  10597.500000  11000.00  1677.500000
 mileage_km    274 120974.328467 129750.0 29695.076939  186.000000 111125.0 141000.000000 150000.00 29875.000000
 year_model    274   2017.321168   2017.0     1.793085 2015.000000   2016.0   2019.000000   2022.00     3.000000
  age_years    274      8.678832      9.0     1.793085    4.000000      7.0     10.000000     11.00     3.000000
km_per_year    274  14697.963841  14210.0  5149.628664   16.909091  12000.0  16666.666667  37386.75  4666.666667

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   274    9,522    9,990  1,464.00 4,500    8,920   10,598   11,000   1,678
 mileage_km   274  120,974  129,750 29,695.08   186  111,125  141,000  150,000  29,875
 year_model   274    2,017    2,017      1.79 2,015    2,016    2,019    2,022       3
  age_years   274      8.7      9.0      1.79   4.0      7.0     10.0     11.0     3.0
km_per_year   274 14,698.0 14,210.0  5,149.63  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,678)

   📌 mileage_km :
      → Distribution asymétrique GAUCHE (moyenne 120,974 < médiane 129,750)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → Faible dispersion (CV = 25%, σ = 29,695)
      → Étendue : [186 ; 150,000] (IQR = 29,875)

   📌 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,150)
      → Étendue : [17 ; 37,387] (IQR = 4,667)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================
2026-03-23 14:03:23,546 [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-23 14:03:23,547 [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    39      9,654      9,990      +1.0%
     2019    42     10,028     10,000      -3.9%
     2020    20      9,820     10,240      +2.1%
     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    73      9,542      9,990      -6.1%
       120-160k   178      9,491      9,990      -0.5%

📊 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,028      +2.1%
       8    39      9,654      -3.7%
       9    53      9,754      +1.0%
      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,926     10,000
           essence   122      9,019      9,495

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

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private   133      9,198      9,500
          pro   141      9,827      9,990

   📌 Test Mann-Whitney (médiane) : p = 0.0072
   ✅ 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   -0.8% (n= 10)
        90k : décote    5.8% (n= 17)
       100k : décote   -6.6% (n= 15)
       110k : décote    8.1% (n= 31)
       120k : décote   -5.4% (n= 41)
       130k : décote    1.6% (n= 57)
       140k : décote    2.9% (n= 72)
       150k : décote   -1.6% (n=  8)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 110k km : 8.1%
   ✅ 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.1% (n= 42) 🐢 LENTE
     8 ans : décote    3.7% (n= 39)
     9 ans : décote   -1.0% (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.1%
      → 8 ans : 3.7%
      → 9 ans : -1.0%
      → 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 = -250.92 × âge + -0.0013 × km + 11,855
   📌 R² = 0.095
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :   32 ( 11.7%)
      👍 Bonne affaire             :   27 (  9.9%)
      📊 Prix marché               :  142 ( 51.8%)
      💰 Cher                      :   61 ( 22.3%)
      🔴 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,205€ | Écart:  -50.1% | Année: 2016 | Km: 110,000
    2. [3144627553] Grand C4 Picasso
       Prix:    4,500€ | Attendu:    8,915€ | Écart:  -49.5% | Année: 2015 | Km: 140,000
    3. [3148620999] C4 Picasso
       Prix:    4,600€ | Attendu:    8,913€ | Écart:  -48.4% | Année: 2015 | Km: 142,000
    4. [3155010351] C4 Picasso
       Prix:    4,600€ | Attendu:    8,913€ | É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,185€ | Écart:  -36.9% | Année: 2016 | Km: 125,000
    7. [3158296763] C4 grand Picasso 2l hdi 150 cv pack exclusive
       Prix:    5,800€ | Attendu:    9,185€ | Écart:  -36.9% | Année: 2016 | Km: 125,000
    8. [3159003549] Vends CITROEN GRAND C4 PICASSO Intensive
       Prix:    5,900€ | Attendu:    9,169€ | Écart:  -35.7% | Année: 2016 | Km: 138,000
    9. [3162574098] Citroën c4 Picasso 7 places
       Prix:    6,000€ | Attendu:    9,194€ | Écart:  -34.7% | Année: 2016 | Km: 118,000
   10. [3147269001] CITROEN GRAND C4 PICASSO Spacetourer
       Prix:    6,000€ | Attendu:    9,169€ | É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.4% | Année: 2015 | Km: 149,900
    2. [3146221969] Citroen C4 Grand Picasso 7 Places - 2.0 BlueHDi 15
       Prix:   10,990€ | Attendu:    8,913€ | Écart:  +23.3% | Année: 2015 | Km: 142,000
    3. [2934302132] Citroen Grand C4 Picasso PureTech 130ch Confort S&
       Prix:   10,990€ | Attendu:    8,936€ | Écart:  +23.0% | Année: 2015 | Km: 123,901
    4. [3136798926] Grand C4 Picasso 120 HDI
       Prix:   11,000€ | Attendu:    8,946€ | É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,949€ | É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,957€ | Écart:  +22.7% | Année: 2015 | Km: 107,256
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. [3161244489] Citroën Grand C4 Picasso e-HDi 115 Exclusive ETG6
       Prix:   10,980€ | Attendu:    9,033€ | Écart:  +21.5% | Année: 2015 | Km: 47,966
    8. [3149154360] Grand c4
       Prix:   11,000€ | Attendu:    9,158€ | Écart:  +20.1% | Année: 2016 | Km: 146,230
    9. [3071933719] Citroën C4 grand Picasso
       Prix:   11,000€ | Attendu:    9,160€ | Écart:  +20.1% | Année: 2016 | Km: 145,000
   10. [3160469081] Grand C4 Picasso 7 places
       Prix:   10,800€ | Attendu:    8,994€ | Écart:  +20.1% | Année: 2015 | Km: 78,300

🔎 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 : 275
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_20260323_140325.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_20260323_140325.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
  → 32 annonces récupérées (total en mémoire: 102)
Export de 102 annonces vers /home/ubuntu/app/leboncoin_ads_scenic_20260323_140325.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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_20260323_140337.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
  → 35 annonces récupérées (total en mémoire: 1050)
Export de 1050 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260323_140337.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
  → 11 annonces récupérées (total en mémoire: 1061)
Export de 1061 annonces vers /home/ubuntu/app/leboncoin_ads_5008_20260323_140337.csv réussi.

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

📂 leboncoin_ads_5008_20260323_140337.csv
   ✅ 1061 lus, 1061 insérés, 0 ignorés, 0 erreurs

────────────────────────────────────────────────────────────
  📊 TOTAL : 1061 lus, 1061 insérés
  💾 Base : /home/ubuntu/app/db/lbc.sqlite
  📌 6652 annonces en base
════════════════════════════════════════════════════════════
INFO: 1046 list_id lus dans le CSV.
INFO: 1078 annonces actives en base pour peugeot 5008.
INFO: 32 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_5008_20260323_140337.csv
  Brand : peugeot  |  Modèle : 5008
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 1046
  Annonces actives en DB  : 1078
  Absentes du crawl       : 32
  Marquées indisponibles  : 32
════════════════════════════════════════════════════════════

  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/5008/figures
  🔍 Modèle filtré    : 5008
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 1661 annonces chargées (modèle '5008')

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

📌 Nombre total d'annonces : 1661

📋 Premières lignes (colonnes parsées) :
      list_id                                                        subject  price_eur  year_model  mileage_km     fuel    brand model owner_type first_publication_date
0  3105496930                            Peugeot 5008 1.6 HDI 115 ALLURE 7PL       9990        2016      145460   diesel  peugeot  5008        pro    2025-12-03 14:49:00
1  3150966962                  PEUGEOT 5008 1.6 BlueHDi 120ch SS BVM6 Allure      10990        2015      131475   diesel  peugeot  5008        pro    2026-02-25 09:13:36
2  3076705800          PEUGEOT 5008 1.6 HDi 120ch BVM6 Style - SUIVI COMPLET       8990        2015      142500   diesel  peugeot  5008        pro    2025-10-18 09:09:00
3  3035013147                 Peugeot 5008 1.6 HDI 115CH FAP ALLURE 7 PLACES       8990        2015      144500   diesel  peugeot  5008        pro    2025-08-04 18:43:00
4  3138259074  Peugeot 5008 GENERATION-II 1.2 PURETECH 130 ALLURE START-STOP       5990        2016      105000  essence  peugeot  5008        pro    2026-02-02 14:34:28

❓ 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-06-06 10:10:00
   Dernière publication : 2026-03-23 15:01:14
   Durée : 655 jours

👤 Répartition par type de vendeur :
   private         : 1078 (64.9%)
   pro             :  583 (35.1%)

⛽ Répartition par carburant :
   diesel               : 1524 (91.8%)
   essence              :  136 (8.2%)
   hybride              :    1 (0.1%)

🏭 Top 10 marques :
   peugeot              : 1661 (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            :    2 lignes supprimées
      km_aberrants              :    0 lignes supprimées
      annee_aberrante           :    0 lignes supprimées
      age_negatif               :    0 lignes supprimées
      ─────────────────────────────────────────────
      Total supprimé          :    2
      Restantes               : 1659 / 1661
      Pourcentage conservé    : 99.9%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    0 outliers (0.0%)
      Bornes IQR : [-488 ; 12,932]
   mileage_km           :   36 outliers (2.2%)
      Bornes IQR : [60,522 ; 349,286]
   age_years            :    1 outliers (0.1%)
      Bornes IQR : [5 ; 21]

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

======================================================================
📊 RÉSUMÉ APRÈS NETTOYAGE
======================================================================
   Nombre d'annonces restantes : 1659
   Dont outliers identifiés    : 37
   Annonces non-outliers       : 1622

   Plages de valeurs :
      price_eur            : [       700 ;     11,000]  (moy:      6,286)
      mileage_km           : [         1 ;    410,000]  (moy:    206,329)
      year_model           : [     2,009 ;      2,022]  (moy:      2,013)
      age_years            : [         4 ;         17]  (moy:         13)
      km_per_year          : [         0 ;     53,776]  (moy:     16,270)

   💾 1659 annonces enrichies persistées dans SQLite

🔎 Détection des annonces suspectes...
   ⚠️  18 signaux de suspicion détectés
      km_trop_bas_essence: 1
      km_trop_bas_diesel: 17
   💾 18 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   1659   6285.528029   5990.0  2326.831598  700.000000   4545.000000   7900.000000  11000.000000  3355.0
 mileage_km   1659 206328.938517 207000.0 56932.586492    1.000000 168809.000000 241000.000000 410000.000000 72191.0
 year_model   1659   2012.989753   2012.0     2.491581 2009.000000   2011.000000   2015.000000   2022.000000     4.0
  age_years   1659     13.010247     14.0     2.491581    4.000000     11.000000     15.000000     17.000000     4.0
km_per_year   1659  16269.511259  15750.0  5019.937885    0.111111  13333.333333  18533.333333  53776.166667  5200.0

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur 1,659    6,286    5,990  2,326.83   700    4,545    7,900   11,000   3,355
 mileage_km 1,659  206,329  207,000 56,932.59     1  168,809  241,000  410,000  72,191
 year_model 1,659    2,013    2,012      2.49 2,009    2,011    2,015    2,022       4
  age_years 1,659     13.0     14.0      2.49   4.0     11.0     15.0     17.0     4.0
km_per_year 1,659 16,269.5 15,750.0  5,019.94   0.1 13,333.3 18,533.3 53,776.2 5,200.0

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

   📌 price_eur :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 37%, σ = 2,327)
      → Étendue : [700 ; 11,000] (IQR = 3,355)

   📌 mileage_km :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 28%, σ = 56,933)
      → Étendue : [1 ; 410,000] (IQR = 72,191)

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

   📌 age_years :
      → Distribution asymétrique GAUCHE (moyenne 13 < médiane 14)
        Quelques valeurs basses tirent la moyenne vers le bas.
      → Faible dispersion (CV = 19%, σ = 2)
      → Étendue : [4 ; 17] (IQR = 4)

   📌 km_per_year :
      → Distribution relativement SYMÉTRIQUE (moyenne ≈ médiane)
      → Dispersion MODÉRÉE (CV = 31%, σ = 5,020)
      → Étendue : [0 ; 53,776] (IQR = 5,200)

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

📊 Prix moyen par année modèle...
2026-03-23 14:05:11,929 [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-23 14:05:11,929 [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.

   📋 Table : Prix par année modèle
   ---------------------------------------------------------------------------
    Année    Nb   Prix moy   Prix méd   Décote %
   ---------------------------------------------------------------------------
     2009    30      4,497      4,250        N/A
     2010   252      4,522      4,495      -0.6%
     2011   283      4,896      4,990      -8.3%
     2012   271      5,485      5,499     -12.0%
     2013   203      5,891      5,590      -7.4%
     2014   162      6,992      6,990     -18.7%
     2015   139      7,948      7,990     -13.7%
     2016   168      8,063      7,990      -1.4%
     2017    63      9,731     10,000     -20.7%
     2018    46      9,873     10,345      -1.5%
     2019    27     10,446     10,490      -5.8%
     2020    13      9,489      9,990      +9.2%

   📌 Décote annuelle moyenne : -7.4%

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

   📋 Table : Prix par tranche de km
   ----------------------------------------------------------------------
        Tranche    Nb   Prix moy   Prix méd      Var %
   ----------------------------------------------------------------------
          0-20k    12      5,712      4,775        N/A
         20-50k     6      6,180      5,400      +8.2%
         50-80k     7      9,153      9,450     +48.1%
        80-120k    51      8,816      9,490      -3.7%
       120-160k   246      8,580      9,000      -2.7%
       160-200k   416      7,105      6,990     -17.2%
          200k+   921      5,149      4,990     -27.5%

📊 Prix moyen par âge...

   📋 Table : Prix par âge
   -----------------------------------------------------------------
     Âge    Nb   Prix moy   Décote %
   -----------------------------------------------------------------
       6    13      9,489        N/A
       7    27     10,446     +10.1%
       8    46      9,873      -5.5%
       9    63      9,731      -1.4%
      10   168      8,063     -17.1%
      11   139      7,948      -1.4%
      12   162      6,992     -12.0%
      13   203      5,891     -15.8%
      14   271      5,485      -6.9%
      15   283      4,896     -10.7%
      16   252      4,522      -7.6%
      17    30      4,497      -0.6%

   📌 La décote ralentit significativement à 9 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel  1523      6,141      5,990
           essence   135      7,890      8,800

   📌 Carburant avec prix médian le plus élevé : essence (8,800€)
   📌 Carburant avec prix médian le plus bas : diesel (5,990€)

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private  1077      5,853      5,500
          pro   582      7,087      6,500

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

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

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

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

📊 Analyse des seuils de kilométrage...

   📋 Taux de décote par tranche de 10k km :
   --------------------------------------------------
        20k : décote   17.2% (n=  2) ⚡
        30k : décote  -21.5% (n=  3)
        50k : décote  -62.9% (n=  2)
        60k : décote  -13.1% (n=  2)
        70k : décote   26.8% (n=  3) ⚡
        80k : décote  -12.1% (n=  4)
        90k : décote   -0.7% (n= 11)
       100k : décote   -3.8% (n= 14)
       110k : décote    7.4% (n= 22)
       120k : décote  -10.1% (n= 40)
       130k : décote   -0.1% (n= 52)
       140k : décote   11.9% (n= 71) ⚡
       150k : décote    4.2% (n= 83)
       160k : décote    0.8% (n= 99)
       170k : décote    5.7% (n=111)
       180k : décote   10.4% (n=105) ⚡
       190k : décote    2.7% (n=101)
       200k : décote    4.3% (n=117)
       210k : décote    2.9% (n=123)
       220k : décote    5.1% (n=126)
       230k : décote    6.8% (n=107)
       240k : décote   -0.7% (n=114)
       250k : décote    7.1% (n= 67)
       260k : décote   11.5% (n= 68) ⚡
       270k : décote    7.8% (n= 49)
       280k : décote  -19.6% (n= 32)
       290k : décote   28.8% (n= 29) ⚡
      300k+ : décote    5.7% (n= 89)

   📌 Seuils où la décote s'accélère (> 8%) :
      → 20k km : 17.2%
      → 70k km : 26.8%
      → 140k km : 11.9%
      → 180k km : 10.4%
      → 260k km : 11.5%
      → 290k km : 28.8%
   ✅ Sauvegardé : /home/ubuntu/app/stats/5008/figures/seuils_km.png

📊 Analyse des seuils d'âge...

   📋 Taux de décote par année d'âge :
   ---------------------------------------------
     7 ans : décote  -10.1% (n= 27) 🐢 LENTE
     8 ans : décote    5.5% (n= 46)
     9 ans : décote    1.4% (n= 63) 🐢 LENTE
    10 ans : décote   17.1% (n=168) ⚡ FORTE
    11 ans : décote    1.4% (n=139) 🐢 LENTE
    12 ans : décote   12.0% (n=162)
    13 ans : décote   15.8% (n=203) ⚡ FORTE
    14 ans : décote    6.9% (n=271)
    15 ans : décote   10.7% (n=283)
    16 ans : décote    7.6% (n=252)
    17 ans : décote    0.6% (n= 30) 🐢 LENTE

   📌 Décote rapide (> 10% par an) :
      → 10 ans : 17.1%
      → 12 ans : 12.0%
      → 13 ans : 15.8%
      → 15 ans : 10.7%

   📌 Décote lente (< 5% par an) :
      → 7 ans : -10.1%
      → 9 ans : 1.4%
      → 11 ans : 1.4%
      → 17 ans : 0.6%
   ✅ Sauvegardé : /home/ubuntu/app/stats/5008/figures/seuils_age.png

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

📊 Construction du modèle de prix attendu...
   📌 Modèle : prix = -521.03 × âge + -0.0174 × km + 16,646
   📌 R² = 0.653
📊 Calcul des écarts de prix...

   📋 Classification des annonces :
      🌟 Excellente affaire        :  250 ( 15.1%)
      👍 Bonne affaire             :  247 ( 14.9%)
      📊 Prix marché               :  644 ( 38.8%)
      💰 Cher                      :  225 ( 13.6%)
      🔴 Très cher                 :  293 ( 17.7%)
📊 Graphique : Distribution des écarts de prix...
   ✅ Sauvegardé : /home/ubuntu/app/stats/5008/figures/ecarts_prix.png

   🌟 TOP 10 MEILLEURES AFFAIRES (écart le plus négatif) :
   ====================================================================================================
    1. [3163345953] Peugeot 5008 1.6, 120cv B.hdi
       Prix:    1,000€ | Attendu:    5,707€ | Écart:  -82.5% | Année: 2014 | Km: 270,000
    2. [3166827215] Voiture entiere avec moteur qui claque
       Prix:      900€ | Attendu:    4,456€ | Écart:  -79.8% | Année: 2010 | Km: 222,000
    3. [3098662962] Peugeot 5008 hdi
       Prix:    1,900€ | Attendu:    8,729€ | Écart:  -78.2% | Année: 2016 | Km: 155,900
    4. [3163979849] Opel Corsa 2009 232000km
       Prix:    1,900€ | Attendu:    8,450€ | Écart:  -77.5% | Année: 2018 | Km: 232,000
    5. [3161987772] 5008 7 places
       Prix:    1,000€ | Attendu:    4,144€ | Écart:  -75.9% | Année: 2011 | Km: 270,000
    6. [3154103448] Vend Peugeot 5008 dans l etat
       Prix:    1,000€ | Attendu:    4,056€ | Écart:  -75.3% | Année: 2010 | Km: 245,000
    7. [3145452074] Peugeot 5008
       Prix:    1,000€ | Attendu:    3,675€ | Écart:  -72.8% | Année: 2012 | Km: 327,000
    8. [3151017355] Vends Peugeot 5008 a spécialiste
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:    1,500€ | Attendu:    5,359€ | Écart:  -72.0% | Année: 2012 | Km: 230,000
    9. [3154289763] 5008 essence sur l'état
       Prix:    1,700€ | Attendu:    6,059€ | Écart:  -71.9% | Année: 2011 | Km: 159,660
   10. [3162529124] Peugeot 5008
       Prix:    1,500€ | Attendu:    5,116€ | Écart:  -70.7% | Année: 2013 | Km: 274,000

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3146000438] 5008 hdi
       Prix:    7,500€ | Attendu:    3,726€ | Écart: +101.3% | Année: 2009 | Km: 234,000
    2. [3152738100] Peugeot 5008 2l hdi 150cv
       Prix:    8,000€ | Attendu:    4,359€ | Écart:  +83.5% | Année: 2010 | Km: 227,600
    3. [3126969597] Peugeot 5008
       Prix:    4,200€ | Attendu:    2,320€ | Écart:  +81.0% | Année: 2009 | Km: 315,000
    4. [3157618424] Peugeot 5008
       Prix:    3,500€ | Attendu:    1,973€ | Écart:  +77.4% | Année: 2010 | Km: 365,000
    5. [3165438627] Vend peugeot 5008 1l6 hdi année 2009 
Caroserie 31
       Prix:    4,000€ | Attendu:    2,268€ | Écart:  +76.3% | Année: 2009 | Km: 318,000
    6. [3126598226] Peugeot 5008 1.6 hdi fap confort pack 7pl
       Prix:    7,990€ | Attendu:    4,551€ | Écart:  +75.6% | Année: 2010 | Km: 216,500
    7. [3155918327] Peugeot 5008
       Prix:    6,500€ | Attendu:    3,726€ | Écart:  +74.4% | Année: 2009 | Km: 234,000
    8. [3147840406] Peugeot 5008 1.6 hdi FAP Premium 7pls
       Prix:    6,990€ | Attendu:    4,039€ | Écart:  +73.1% | Année: 2010 | Km: 246,000
    9. [3159646980] PEUGEOT 5008 2.0 HDI 163cv
       Prix:    7,500€ | Attendu:    4,404€ | Écart:  +70.3% | Année: 2012 | Km: 285,000
   10. [3129737643] 🚗 Peugeot 5008 1.6 HDi 110 Premium – 7 places
       Prix:   10,000€ | Attendu:    5,914€ | Écart:  +69.1% | Année: 2010 | Km: 138,000

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

======================================================================
  M05 — Extraction LLM des titres (GPT-5 Nano)
======================================================================
  Annonces sans évaluation LLM : 1661
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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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_20260323_140513.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
  → 21 annonces récupérées (total en mémoire: 1491)
Export de 1491 annonces vers /home/ubuntu/app/leboncoin_ads_fiesta_20260323_140513.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_20260323_140729.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_20260323_140729.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_20260323_140729.csv réussi.

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

📂 leboncoin_ads_nv200_20260323_140729.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
  📌 6654 annonces en base
════════════════════════════════════════════════════════════
INFO: 96 list_id lus dans le CSV.
INFO: 97 annonces actives en base pour nissan nv200.
INFO: 1 annonce(s) marquées indisponibles.
════════════════════════════════════════════════════════════
  CHECK DISPONIBILITÉ
  CSV   : leboncoin_ads_nv200_20260323_140729.csv
  Brand : nissan  |  Modèle : nv200
════════════════════════════════════════════════════════════

  Annonces dans le CSV    : 96
  Annonces actives en DB  : 97
  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/nv200/figures
  🔍 Modèle filtré    : nv200
  📊 Graphiques       : Non
══════════════════════════════════════════════════════════════════════
📂 Chargement depuis SQLite : /home/ubuntu/app/db/lbc.sqlite
   ✅ 184 annonces chargées (modèle 'nv200')

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

📌 Nombre total d'annonces : 184

📋 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-23 14:18:27
   Durée : 541 jours

👤 Répartition par type de vendeur :
   private         :  127 (69.0%)
   pro             :   57 (31.0%)

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

🏭 Top 10 marques :
   nissan               :  184 (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               :  184 / 184
      Pourcentage conservé    : 100.0%

🔍 Détection des outliers (méthode IQR)...
   price_eur            :    1 outliers (0.5%)
      Bornes IQR : [-2,735 ; 19,225]
   mileage_km           :    1 outliers (0.5%)
      Bornes IQR : [-40,128 ; 366,612]
   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 : 184
   Dont outliers identifiés    : 2
   Annonces non-outliers       : 182

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

   💾 184 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    184   8588.059783   8125.000000  3710.445302 2000.000000   5500.000000  10990.0  19990.0   5490.000000
 mileage_km    184 164772.608696 152000.000000 71213.756428    1.000000 112400.000000 214085.0 420000.0 101685.000000
 year_model    184   2014.788043   2015.000000     2.712785 2009.000000   2013.000000   2017.0   2019.0      4.000000
  age_years    184     11.211957     11.000000     2.712785    7.000000      9.000000     13.0     17.0      4.000000
km_per_year    184  14891.338236  13666.666667  5978.011523    0.066667  10392.884943  18650.0  30000.0   8257.115057

📊 Tableau formaté :
   Variable Count     Mean   Median       Std   Min       Q1       Q3      Max     IQR
  price_eur   184    8,588    8,125  3,710.45 2,000    5,500   10,990   19,990   5,490
 mileage_km   184  164,773  152,000 71,213.76     1  112,400  214,085  420,000 101,685
 year_model   184    2,015    2,015      2.71 2,009    2,013    2,017    2,019       4
  age_years   184     11.2     11.0      2.71   7.0      9.0     13.0     17.0     4.0
km_per_year   184 14,891.3 13,666.7  5,978.01   0.1 10,392.9 18,650.0 30,000.0 8,257.1

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

   📌 price_eur :
      → Distribution asymétrique DROITE (moyenne 8,588 > médiane 8,125)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 43%, σ = 3,710)
      → Étendue : [2,000 ; 19,990] (IQR = 5,490)

   📌 mileage_km :
      → Distribution asymétrique DROITE (moyenne 164,773 > médiane 152,000)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 43%, σ = 71,214)
      → Étendue : [1 ; 420,000] (IQR = 101,685)

   📌 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,891 > médiane 13,667)
        Quelques valeurs élevées tirent la moyenne vers le haut.
      → Dispersion MODÉRÉE (CV = 40%, σ = 5,978)
      → Étendue : [0 ; 30,000] (IQR = 8,257)

======================================================================
📊 DISTRIBUTIONS PAR CATÉGORIES
======================================================================
2026-03-23 14:07:40,352 [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-23 14:07:40,352 [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 %
   ---------------------------------------------------------------------------
     2009     2      3,600      3,600        N/A
     2010     9      4,764      4,200     -32.3%
     2011    17      5,152      4,900      -8.1%
     2012    13      6,548      5,200     -27.1%
     2013    24      7,259      7,690     -10.9%
     2014    22      8,706      8,740     -19.9%
     2015    13      8,429      9,000      +3.2%
     2016    25      8,914      8,000      -5.8%
     2017    22     10,629      9,895     -19.2%
     2018    22     11,668     11,750      -9.8%
     2019    15     11,246     10,990      +3.6%

   📌 Décote annuelle moyenne : -12.6%

📊 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    38     11,555     10,940     -15.3%
       120-160k    42      9,756      9,745     -15.6%
       160-200k    32      6,852      6,850     -29.8%
          200k+    56      5,453      5,200     -20.4%

📊 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,629      -8.9%
      10    25      8,914     -16.1%
      11    13      8,429      -5.4%
      12    22      8,706      +3.3%
      13    24      7,259     -16.6%
      14    13      6,548      -9.8%
      15    17      5,152     -21.3%
      16     9      4,764      -7.5%
      17     2      3,600     -24.4%

   📌 La décote ralentit significativement à 11 ans

📊 Prix par type de carburant...

   📋 Table : Prix par carburant
   ----------------------------------------------------------------------
         Carburant    Nb   Prix moy   Prix méd
   ----------------------------------------------------------------------
            diesel   184      8,588      8,125

📊 Prix par type de vendeur...

   📋 Table : Prix par type de vendeur
   ------------------------------------------------------------
         Type    Nb   Prix moy   Prix méd
   ------------------------------------------------------------
      private   127      8,029      7,500
          pro    57      9,834      9,890

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

📊 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.4% (n= 11) ⚡
       120k : décote  -14.4% (n= 11)
       130k : décote   14.3% (n= 12) ⚡
       140k : décote   12.6% (n= 13) ⚡
       150k : décote   19.7% (n=  6) ⚡
       160k : décote  -13.1% (n=  6)
       170k : décote   29.5% (n=  8) ⚡
       180k : décote  -12.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    0.8% (n=  8)
       230k : décote   -0.4% (n=  7)
       240k : décote   -5.4% (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.4%
      → 130k km : 14.3%
      → 140k km : 12.6%
      → 150k km : 19.7%
      → 170k km : 29.5%
      → 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.9% (n= 22)
    10 ans : décote   16.1% (n= 25) ⚡ FORTE
    11 ans : décote    5.4% (n= 13)
    12 ans : décote   -3.3% (n= 22) 🐢 LENTE
    13 ans : décote   16.6% (n= 24) ⚡ FORTE
    14 ans : décote    9.8% (n= 13)
    15 ans : décote   21.3% (n= 17) ⚡ FORTE
    16 ans : décote    7.5% (n=  9)
    17 ans : décote   24.4% (n=  2) ⚡ FORTE

   📌 Décote rapide (> 10% par an) :
      → 10 ans : 16.1%
      → 13 ans : 16.6%
      → 15 ans : 21.3%
      → 17 ans : 24.4%

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

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

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

   📋 Classification des annonces :
      🌟 Excellente affaire        :   35 ( 19.1%)
      👍 Bonne affaire             :   35 ( 19.1%)
      📊 Prix marché               :   61 ( 33.3%)
      💰 Cher                      :   22 ( 12.0%)
      🔴 Très cher                 :   30 ( 16.4%)
📊 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,774€ | Écart:  -83.0% | Année: 2011 | Km: 1
    2. [3159812831] Vend utilitaires nv200 nissan
       Prix:    2,000€ | Attendu:    6,702€ | Écart:  -70.2% | Année: 2011 | Km: 170,000
    3. [3160668277] Nissan nv 200
       Prix:    3,000€ | Attendu:    7,079€ | Écart:  -57.6% | Année: 2013 | Km: 188,000
    4. [3164906877] Nissan
       Prix:    3,500€ | Attendu:    6,599€ | Écart:  -47.0% | Année: 2016 | Km: 250,000
    5. [3109648143] Nissan nv200 1.5 dci turbo
       Prix:    3,990€ | Attendu:    6,980€ | Écart:  -42.8% | Année: 2012 | Km: 176,000
    6. [3154995725] Nissan NV200 Fourgon 1.5 DCi 110ch BVM5 Optima - 2
       Prix:    4,000€ | Attendu:    6,763€ | Écart:  -40.9% | Année: 2014 | Km: 213,880
    7. [3116605709] Nissan NV200
       Prix:    4,500€ | Attendu:    7,597€ | Écart:  -40.8% | Année: 2011 | Km: 140,000
    8. [3127367839] Nissan NV200 1.5 DCI
       Prix:    5,490€ | Attendu:    8,791€ | Écart:  -37.6% | Année: 2014 | Km: 145,899
    9. [3142568361] Nissan nv 200 1.5 90ch
       Prix:    5,200€ | Attendu:    8,299€ | Écart:  -37.3% | Année: 2016 | Km: 193,000
   10. [3164561805] Nissan nv200
       Prix:    5,290€ | Attendu:    8,091€ | Écart:  -34.6% | Année: 2016 | Km: 200,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'

   🔴 TOP 10 ANNONCES SURÉVALUÉES (écart le plus positif) :
   ====================================================================================================
    1. [3156635875] Nissan NV200
       Prix:    3,500€ | Attendu:      548€ | Écart: +538.7% | Année: 2010 | Km: 361,000
    2. [3154023820] Camion
       Prix:    3,500€ | Attendu:      727€ | Écart: +381.4% | Année: 2010 | Km: 355,000
    3. [3153372541] Nissan nv 200
       Prix:   10,500€ | Attendu:    5,527€ | Écart:  +90.0% | Année: 2013 | Km: 240,000
    4. [3114600758] Van
       Prix:   18,500€ | Attendu:   10,220€ | Écart:  +81.0% | Année: 2014 | Km: 98,000
    5. [3156516616] 🚐 Nissan NV200 aménagé – Prêt à voyager
       Prix:    9,300€ | Attendu:    5,718€ | Écart:  +62.6% | Année: 2011 | Km: 203,000
    6. [3158536730] Véhicule aménagé
       Prix:   13,500€ | Attendu:    8,352€ | Écart:  +61.6% | Année: 2012 | Km: 130,000
    7. [3083668151] Nissan NV200 1.5 DCI 90CH VAN AMENAGE
       Prix:   14,999€ | Attendu:    9,533€ | Écart:  +57.3% | Année: 2014 | Km: 121,041
    8. [3163982347] Utilitaire aménagé Van NV200 2016 84000 km
       Prix:   17,900€ | Attendu:   11,551€ | Écart:  +55.0% | Année: 2016 | Km: 84,000
    9. [3155364135] Utilitaire Van Nissan NV200 2016
       Prix:   17,900€ | Attendu:   11,581€ | Écart:  +54.6% | Année: 2016 | Km: 83,000
   10. [3150255673] Van aménagé Nissan NV200
       Prix:    8,500€ | Attendu:    5,590€ | Écart:  +52.1% | 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 : 184
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 : 6654
============================================================
  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_20260323_140000.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_clio_4_20260323_140000.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_20260323_140000.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_20260323_140213.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_yaris_20260323_140213.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_20260323_140213.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_20260323_140222.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_i20_20260323_140222.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_20260323_140222.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_20260323_140236.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_berlingo_20260323_140236.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_20260323_140236.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_20260323_140308.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_c4_20260323_140308.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_20260323_140308.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
  CSV : leboncoin_ads_5008_20260323_140337.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_5008_20260323_140337.csv --db /home/ubuntu/app/db/lbc.sqlite --model 5008
  $ /home/ubuntu/app/.venv/bin/python /home/ubuntu/app/scripts/check_availability.py --csv /home/ubuntu/app/leboncoin_ads_5008_20260323_140337.csv --brand peugeot --model 5008 --db /home/ubuntu/app/db/lbc.sqlite
  $ /home/ubuntu/app/.venv/bin/python -m stats.main --model 5008 --skip-plots
  AVERTISSEMENT : stats échouées 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_20260323_140729.csv
  $ /home/ubuntu/app/.venv/bin/python -m db.migrate_csv --input /home/ubuntu/app/leboncoin_ads_nv200_20260323_140729.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_20260323_140729.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                 → OK
  ✗ fiesta               → ERREUR crawler
  ✓ nv200                → OK
============================================================

============================================================
Finished: 2026-03-23T14:07:42.119993
Duration: 462.1s
STATUS:SUCCESS