Projet actuariel (assurance non-vie / P&C) en Python. À partir d'un portefeuille de transactions, on estime la probabilité de litige d'une mise en relation entre un voyageur et un expéditeur de colis, on la traduit en score de confiance affichable dans l'application, et on en déduit le prix d'une assurance colis.
Cadrage. Faire tourner une telle plateforme pose de vraies questions juridiques (responsabilité douanière du voyageur, transport du bien d'un tiers, marchandises sensibles). Ce dépôt n'opère pas la plateforme : il en construit le cerveau d'évaluation du risque — la brique actuarielle, réutilisable et défendable. C'est aussi un objet de portfolio orienté pricing non-vie.
transactions ──▶ proba de litige ──▶ score /100 ──▶ décision (valider / vérifier)
│
└────────────▶ prime pure ──▶ prix de l'assurance colis
scoring-confiance-colis/
├── noyau_scoring.py # fonctions partagées (chargement, modèles, scoring)
├── 01_generation_donnees.py # crée 8 000 transactions synthétiques
├── 02_modele_scoring.py # modèles fréquence + sévérité, score du portefeuille
├── 03_benchmark_ml.py # PISTE 1 : logistique vs LightGBM + SHAP
├── 04_calibration_seuils.py # PISTE 2 : seuil de décision optimal (coûts)
├── 05_tarification_commerciale.py# PISTE 3 : prime pure → prix de vente
├── 06_demo_scoring.py # PISTE 4 : outil de scoring (démo + interactif)
├── requirements.txt
├── data/ # CSV générés
├── figures/ # graphiques PNG
└── rapport/ # rapport Word
pip install -r requirements.txt
# à lancer dans l'ordre (chaque script écrit ce que le suivant peut réutiliser)
python3 01_generation_donnees.py # -> data/transactions_synthetiques.csv
python3 02_modele_scoring.py # -> score du portefeuille + 1 figure
python3 03_benchmark_ml.py # -> comparaison de modèles + 2 figures
python3 04_calibration_seuils.py # -> seuil de décision optimal + 1 figure
python3 05_tarification_commerciale.py # -> grille tarifaire + 1 figure
python3 06_demo_scoring.py # -> démo de scoring (interactif en terminal)Le 01 est reproductible (np.random.seed(2024)).
Les données (01). La plateforme n'existe pas, donc aucune donnée réelle.
On fabrique 8 000 transactions dont le risque dépend de facteurs connus :
corridor, catégorie de colis, expérience du voyageur, taux de réussite passé,
vérification d'identité (KYC), anomalie de prix au kilo, valeur déclarée.
Le modèle (02). Deux modèles classiques d'assurance :
- fréquence (régression logistique) → probabilité de litige ;
- sévérité (modèle Gamma) → coût moyen d'un litige.
On assemble : prime pure = probabilité × coût, et
score de confiance = (1 − probabilité) × 100.
Piste 1 — Benchmark machine learning (03). On confronte la régression
logistique à un LightGBM, mesuré en AUC / Gini, avec une courbe de lift et une
analyse SHAP. Ici la logistique fait jeu égal (voire mieux) : le risque est
essentiellement linéaire, donc le modèle simple et lisible l'emporte — un bon
argument pour le garder en production.
Piste 2 — Calibration du seuil (04). Un score ne sert à rien sans règle de
décision. On définit une matrice de coûts (coût d'une vérification vs coût d'un
litige subi) et on cherche le seuil qui minimise le coût total. Résultat :
basculer en vérification manuelle sous 71/100, soit ~10 % des transactions.
Piste 3 — Tarification commerciale (05). On transforme la prime pure en
prix de vente : frais de gestion (15 %), commission (10 %), marge de sécurité
(8 %), puis la taxe belge sur les primes (9,6 % en 2026). Le client paie en
moyenne ~1,6× la prime pure, soit de ~25 € à ~46 € selon le corridor.
Piste 4 — Outil de scoring (06). La brique qu'appellerait l'application :
elle prend une transaction et rend score + décision. Scénarios de démonstration
inclus, plus un mode interactif en terminal.
Le modèle retrouve la hiérarchie de risque injectée (test de cohérence) :
| Facteur | Effet sur le risque |
|---|---|
| Anomalie de prix au kilo | ×2,2 |
| Catégorie médicaments | ×2,2 |
| Corridor Bruxelles→Kinshasa | ×1,3 |
| Identité vérifiée (KYC) | ×0,5 |
| Catégorie documents | ×0,5 |
Exemples de scoring :
| Profil | Score | Décision |
|---|---|---|
| Voyageur fiable, électronique, BRU→DLA | 93/100 | Valider |
| Profil moyen, vêtements, CDG→DKR | 94/100 | Valider |
| Nouveau compte, médicaments, prix anormal, BRU→FIH | 11/100 | Vérification manuelle |
- Données synthétiques : on valide la mécanique, pas le marché réel.
- Le score d'anomalie de prix est un indicateur simplifié.
- Les hypothèses de coûts (vérification, chargements) sont à caler avec le métier.
- Pas de dimension temporelle (saisonnalité, dérive des corridors).
Stack : Python — pandas, numpy, statsmodels, scikit-learn, lightgbm, shap, matplotlib. Auteur : Steve.