Fraud Modeler
Fraud Modeler
ABDOULAYE TANGARA
Student in MSc in Quantitative and Computable Economics
Contacts
ï LinkedIn
§ Mon GitHub
Mon Portfolio
# abdoulayetangara722@[Link]
"To get something you never had, you’ve got to do something you
never did. Get your mind right"
© Tangara Abdoulaye
Contexte :
Il y a quelques années, un de mes cousins a été victime d’une fraude bancaire. Un matin, il
consulte son relevé de compte et découvre que plusieurs virements ont été effectués à son insu
durant la nuit. Des sommes modestes, transférées vers des comptes inconnus, mais cumulées,
elles représentaient presque tout son solde.
Il avait pourtant activé les alertes SMS et n’avait cliqué sur aucun lien suspect. Après enquête,
la banque conclut à un piratage silencieux, utilisant des transactions éclatées et discrètes pour
contourner les systèmes de détection.
Cet événement a été un déclic. Il m’a fait prendre conscience que la fraude moderne ne se
manifeste plus toujours par des montants exorbitants ou des comportements flagrants. Elle
devient sournoise, évolutive, algorithmique.
Ce projet est donc né de cette prise de conscience : construire un modèle prédictif basé sur l’IA,
capable de repérer les signaux faibles que l’humain ne perçoit pas, et d’alerter avant qu’il ne soit
trop tard.
Problématique :
Comment exploiter la puissance du Machine Learning pour identifier des schémas frauduleux
complexes, tout en minimisant les faux positifs qui perturbent l’expérience client ?
Objectif :
Ce projet vise à développer un modèle prédictif capable de détecter les transactions frauduleuses
en temps réel, en s’appuyant sur une analyse approfondie des données transactionnelles (mon-
tants, soldes, types d’opérations). Grâce à des techniques avancées de feature engineering et à
l’algorithme XGBoost, le système parvient à une précision de 99 % (en termes de F1-score), tout
en maintenant un taux de rappel élevé pour ne pas laisser passer les fraudes.
Enjeux :
— Réduire les pertes financières liées aux fraudes.
— Améliorer la confiance des clients dans les transactions digitales.
— Automatiser la détection pour une réponse plus rapide que les méthodes manuelles.
1
© Tangara Abdoulaye
import shap
import warnings
[Link]('ignore')
[Link].chained_assignment = None
Gestion du temps
2
© Tangara Abdoulaye
"""
"""
3
© Tangara Abdoulaye
Le nombre de caractéristiques : 11
1. Analyse Univarée
def analyser_quanti(self):
print(f"\nStatistique descriptive des variables quantitatives :
,→\n{[Link][self.var_quanti].describe()}\n")
else:
[Link](f"{col} est normalement distribuée (p = {np.
,→round(pvalue, 2)})")
4
© Tangara Abdoulaye
[Link]()
def analyser_quali(self):
print(f"\nStatistique descriptive des variables qualitatives :\n{self.
,→df[self.var_quali].describe(include='all')}\n")
def lancer_analyse(self):
print("\nDÉBUT DE L'ANALYSE UNIVARIÉE\n")
if self.var_quanti:
self.analyser_quanti()
if self.var_quali:
self.analyser_quali()
print("\n FIN DE L'ANALYSE UNIVARIÉE\n")
newbalanceDest
count 6.362620e+06
mean 1.224996e+06
5
© Tangara Abdoulaye
std 3.674129e+06
min 0.000000e+00
25% 0.000000e+00
50% 2.146614e+05
75% 1.111909e+06
max 3.561793e+08
6
© Tangara Abdoulaye
7
© Tangara Abdoulaye
8
© Tangara Abdoulaye
9
© Tangara Abdoulaye
10
© Tangara Abdoulaye
11
© Tangara Abdoulaye
12
© Tangara Abdoulaye
Variables Qualitatives
L’analyse sur les types de transactions (représentés par la variable ’type’) montre que les
CASH_OUT (35.2%) et les PAYMENT (22.0%) dominent. Les fraudes sont souvent liées
à des types spécifiques (à vérifier en bivariée). Nous pouvons également repérer un déséquilibre
très important des classes de la variable cible ’isFraud’ avec seulement 0.1% de fraude, ce qui
nécessite des techniques comme le rééchantillonnage ou des métriques focalisées sur la classe
13
© Tangara Abdoulaye
if len(valid_vars) < 2:
raise ValueError("Moins de 2 variables numériques valides␣
,→trouvées dans le DataFrame")
df_clean = [Link][valid_vars].dropna()
for i in range(len(valid_vars)):
for j in range(i + 1, len(valid_vars)):
x_var, y_var = valid_vars[i], valid_vars[j]
[Link](figsize=(8, 6))
[Link](data=df_clean, x=x_var, y=y_var,
scatter_kws={'alpha': 0.5},
line_kws={'color': 'red'})
[Link](f"Relation entre {x_var} et {y_var}", pad=20)
plt.tight_layout()
[Link]()
print("-" * 50)
corr_matrix = df_clean.corr(method='spearman')
mask = [Link](np.ones_like(corr_matrix, dtype=bool))
[Link](figsize=(10, 8))
14
© Tangara Abdoulaye
def BivariateQual(self):
for i in self.qual_vars:
for j in self.qual_vars:
if i != j:
contingency_table = [Link]([Link][i], [Link][j])
print(f"\n## Test du Chi2 entre {i} et {j} ##")
chi2, pvalue, dof, expected = stats.
,→chi2_contingency(contingency_table)
else:
print(f" Aucune association entre {i} et {j}, p =␣
,→{pvalue:.4f}")
def BivariateQuantQual(self):
quant_vars = [var for var in self.quant_vars if var in [Link].
,→columns and [Link].is_numeric_dtype([Link][var])]
[Link](figsize=(10, 6))
[Link](x=qual_var, y=quant_var, data=df_clean)
[Link](x=qual_var, y=quant_var, data=df_clean,
15
© Tangara Abdoulaye
[Link](rotation=45)
plt.tight_layout()
[Link]()
except ValueError as e:
print(f"\nErreur avec {quant_var} et {qual_var} : {e}")
def lancer_analyse(self):
print("\n--- Analyse bivariée quantitative ---")
[Link](self.quant_vars)
[Link]()
16
© Tangara Abdoulaye
17
© Tangara Abdoulaye
18
© Tangara Abdoulaye
19
© Tangara Abdoulaye
20
© Tangara Abdoulaye
Variables
Matrice de Spearman : Aucune corrélation forte (>0.5) entre les variables quantitatives,
sauf entre oldbalanceOrg/newbalanceOrig (0.99) et oldbalanceDest/newbalanceDest
(0.97), suggérant des redondances à traiter (PCA ou suppression).
Relations non linéaires : Les regplots montrent des nuages de points dispersés, indiquant
que des modèles linéaires seraient peu adaptés → choix de XGBoost justifié par sa capacité à
capturer des relations complexes.
Fraude vs Montant : Les transactions frauduleuses ont des montants médians plus élevés
(boxplot amount par isFraud), mais avec une grande variance. XGBoost peut gérer cette hété-
rogénéité via ses splits optimaux.
Type de transaction : Les TRANSFER et CASH_OUT montrent des distributions de soldes
différentes pour les fraudes (p=0.0000), confirmant leur importance comme features.
Association type/isFraud : Lien significatif (p=0.0000), validant l’inclusion de type dans le
modèle.
4.1. Analyse Multivariée avant le Feature Engineering
— Encodage
— Normalisation
— Définition du target et des features
— Instanciation de PCA
21
© Tangara Abdoulaye
,→data_0[['amount','oldbalanceOrg', 'newbalanceOrig','oldbalanceDest',␣
,→'newbalanceDest']].mean())/data_0[['amount','oldbalanceOrg',␣
,→'newbalanceOrig','oldbalanceDest', 'newbalanceDest']].std()
data_vf = data_0.copy()
def pca(self):
}
)
22
© Tangara Abdoulaye
vecteur_propre_sorted = vecteur_propre.abs().max(axis=1).
,→sort_values(ascending=False).index
vecteur_propre = vecteur_propre.loc[vecteur_propre_sorted]
[Link]().add_artist(circle)
23
© Tangara Abdoulaye
# Afficher la figure
[Link]()
def lancer_analyse(self):
"""
Cela permet de lancer l'analyse
"""
print("\n --Analyse Multivariée -- \n")
cp, vp5 = [Link]()
print("-- Les Composants Principaux --")
print(f"\n {cp} \n")
--Analyse Multivariée --
24
© Tangara Abdoulaye
25
© Tangara Abdoulaye
— L’objetcif principal ici c’est de créer des variables dérivées permettant de capter au moins
les anomalies
data_1["DiffSoldeOrig"] = data_1["DiffSoldeOrig"].apply(lambda x: 1 if x != 0␣
,→else 0) # | Si 0 → anomalie possible. |
26
© Tangara Abdoulaye
data_1["PourcentageMontantOrig"] = data_1["amount"] /␣
,→(data_1["oldbalanceOrg"] + 1)
27
© Tangara Abdoulaye
28
© Tangara Abdoulaye
29
© Tangara Abdoulaye
30
© Tangara Abdoulaye
31
© Tangara Abdoulaye
32
© Tangara Abdoulaye
33
© Tangara Abdoulaye
34
© Tangara Abdoulaye
35
© Tangara Abdoulaye
Interprétations
Ces nouvelles variables comme : DiffSoldeOrig et DiffSoldeDest (qui vérifient si l’argent est vrai-
ment retiré du compte client. Si 0 ,→ anomalie possible.), détectent des anomalies fréquentes,
notamment dans des cas de fraude (ex. : argent "disparaît" ou "apparaît"). La variable isSa-
36
© Tangara Abdoulaye
meAccount (qui permet de détecter si le compte de départ est égal au compte d’arrivée) = 0
pour tous : donc pas discriminant ici.
activiteAnormale → valeur 2 indique une double anomalie (origine + destination), très utile.
Ces variables renforcent le signal de comportements soupçonnés frauduleux.
4.2. Analyse Multivariée après le Feature Engineering
— Encodage
— Normalisation
— Définition du target et des features
— Instanciation de PCA
df = [Link]([data_1,df_demmies], axis=1)
[Link](columns=["type"], inplace = True)
,→'newbalanceDest','step_day']] - df[['amount','oldbalanceOrg',␣
,→'newbalanceOrig','oldbalanceDest', 'newbalanceDest',
'step_day']].mean())/df[['amount','oldbalanceOrg',␣
,→'newbalanceOrig','oldbalanceDest', 'newbalanceDest','step_day']].std()
df_vf = [Link]()
--Analyse Multivariée --
37
© Tangara Abdoulaye
38
© Tangara Abdoulaye
39
© Tangara Abdoulaye
40
© Tangara Abdoulaye
Instancier le modèle
[11]: # Définition du train et test
features = df_vf.drop(columns="isFraud")
target = df_vf["isFraud"]
X_train,X_test, y_train, y_test = train_test_split(features,target,␣
,→train_size=0.3, random_state=42)
# Prediction du modèle
y_pred = model_xgb.predict(X_test)
41
© Tangara Abdoulaye
Pipeline du Modèle
],remainder='passthrough')
# Inplementation du pipeline
pipe_xgboost = Pipeline([
('prepros', preprocessing),
('model',XGBClassifier(
n_estimators = 100,
n_jobs = -1,
learning_rate = 0.1,
max_depth = 6,
subsample = 0.8,
enable_categorical = True))
])
# Entraitement final
pipe_xgboost.fit(X_train, y_train)
[12]: Pipeline(steps=[('prepros',
ColumnTransformer(remainder='passthrough',
transformers=[('cat',
OneHotEncoder(handle_unknown='ignore'),
['type']),
('norm', StandardScaler(),
['amount', 'oldbalanceOrg',
'newbalanceOrig',
'oldbalanceDest',
'newbalanceDest',
'step_day'])])),
('model',
XGBClassifier(base_score=None, booster=None, callbacks=None,
colsample_bylevel=None, col...
feature_types=None, gamma=None,␣
,→grow_policy=None,
importance_type=None,
interaction_constraints=None, learning_rate=0.
,→1,
max_bin=None, max_cat_threshold=None,
42
© Tangara Abdoulaye
max_cat_to_onehot=None, max_delta_step=None,
max_depth=6, max_leaves=None,
min_child_weight=None, missing=nan,
monotone_constraints=None, multi_strategy=None,
n_estimators=100, n_jobs=-1,
num_parallel_tree=None, random_state=None,
...))])
La matrice de confusion
0 4.44803e+06 36
1 29 5742
Interprétation
Malgré le ratio 1 :1000, le modèle capture 99% des fraudes sans sacrifier la précision.
L’importance de chaque variables dans le resultat de la prediction du modèle
43
© Tangara Abdoulaye
shap_values = explainer(X_transformed)
[Link](shap_values[0])
Interprétation
Variables les plus influentes :
type_CASH_IN (Feature 11) et type_DEBIT (Feature 13) sont les variables les plus
déterminantes, avec des contributions positives significatives (respectivement +15.825 et +2).
Cela confirme les résultats de l’analyse bivariée, où ces types de transactions étaient associés à
des schémas frauduleux.
type_TRANSFER et type_CASH_OUT (non explicitement nommées dans le waterfall
plot mais probablement incluses dans les "autres features") contribuent également, ce qui est
cohérent avec leur importance identifiée lors des analyses précédentes.
Contributions négatives :
Certaines variables, comme Feature 9 (-0.295) et Feature 6 (-0.282), ont un impact négatif sur
la prédiction de fraude. Cela suggère qu’elles sont plus associées à des transactions légitimes.
Effet global :
La valeur de base (E(f(x)) = -11.66) représente la prédiction moyenne du modèle en l’absence
d’information spécifique. Pour la transaction analysée, les features ont ajusté cette valeur à f(x)
= -11.956, indiquant une probabilité réduite de fraude pour ce cas particulier (car la sortie est
44
© Tangara Abdoulaye
proche de la valeur de référence, qui correspond généralement à la classe majoritaire, ici ’non
frauduleuse’).
Le waterfall plot montre comment chaque feature influence la prédiction pour un
cas individuel, utile pour l’audit
Perspectives
Bien que le modèle prédictif basé sur le machine learning ait montré d’excellentes performances
pour identifier les transactions suspectes individuellement, une prochaine étape incontournable
sera d’aller au-delà des observations isolées, en analysant les relations entre les entités :
comptes, bénéficiaires, transactions récurrentes.
Pour cela, la théorie des graphes s’impose comme une approche stratégique. En représentant
les transactions comme des arêtes reliant des nœuds (comptes émetteurs et récepteurs), il devient
possible de :
— Identifier des comportements collaboratifs suspects (fraude en réseau),
— Détecter des comptes pivot ou transitaires,
— Reconnaître des motifs cycliques ou en étoile, typiques du blanchiment d’argent.
Ainsi, l’intégration d’un moteur d’analyse de graphes (avec des outils comme ‘networkx‘, ‘Neo4j‘,
ou ‘GraphSAGE‘) permettrait d’optimiser le système de détection actuel d’augmenter
encore sa robustesse face à des scénarios de fraude complexes.
45