File size: 6,252 Bytes
c1d7c3a
8d14b42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
05cb691
8d14b42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c1d7c3a
8d14b42
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
import streamlit as st
import pandas as pd
import joblib
from PIL import Image
import requests
from pathlib import Path

# --- CONFIGURATION DE LA PAGE ---
st.set_page_config(
    page_title="Prédiction des Dépenses",
    page_icon="💳",
    layout="wide"
)

script = Path(__file__)
script_dir = script.parent

# --- CHARGEMENT DES RESSOURCES ---

# Utiliser le cache de Streamlit pour ne charger le modèle et les images qu'une seule fois
@st.cache_resource
def load_model():
    """Charge le modèle de prédiction depuis le fichier joblib."""
    try:
        model = joblib.load(script_dir/'xgboost_expenditure_predictor.joblib')
        return model
    except FileNotFoundError:
        return None
    
# Charger le modèle et les images
model = load_model()

# --- BARRE LATÉRALE DE NAVIGATION ---
logo_school_url = script_dir/"Keyce_Logo.jpg"
st.sidebar.image(logo_school_url, width=200, caption="Etablissement")
st.sidebar.header("Navigation")
pages = ["Accueil", "Prédiction"]
choice = st.sidebar.selectbox("Choisissez une page", pages)

# --- PAGE D'ACCUEIL ---
if choice == "Accueil":
    st.title("Projet de Machine Learning : Prédiction des Dépenses par Carte de Crédit")
    
    logo_theme_url = script_dir/"Credit-Card.png"  # Un logo générique de carte de crédit
    if logo_theme_url:
        col1, col2 = st.columns(2)
        with col1:
            st.image(logo_theme_url, width=200, caption="Carte de credit")
    st.markdown("---")
    st.header("Présentation")
    st.markdown("""
    Cette application web est le résultat d'un projet de fin de module visant à appliquer une procédure complète de Data Science.
    
    - **Objectif :** Prédire le montant des dépenses mensuelles d'un client détenteur d'une carte de crédit.
    - **Modèle utilisé :** `XGBoost Regressor`, un algorithme de type "gradient boosting" réputé pour sa performance.
    - **Démarche :** Le projet a suivi les étapes rigoureuses de la science des données, incluant le chargement, l'exploration, le nettoyage, le prétraitement, la modélisation et l'optimisation d'hyperparamètres.
    """)

    st.markdown("---")
    st.subheader("Informations")
    st.info("""
    - **Étudiant :** TATSA TCHINDA Colince
    - **Établissement :** KEYCE INFORMATIQUE & IA
    - **Module :** Machine Learning dans le Cloud
    """)

# --- PAGE DE PRÉDICTION ---
elif choice == "Prédiction":
    st.header("Prédiction des Dépenses Mensuelles 💳")
    st.markdown("Veuillez renseigner les informations du client pour obtenir une estimation de ses dépenses.")

    if model is None:
        st.error("ERREUR : Le fichier du modèle `xgboost_expenditure_predictor.joblib` n'a pas été trouvé. Assurez-vous qu'il se trouve dans le même dossier que l'application.")
    else:
        # Création des volets pour les inputs
        col1, col2 = st.columns(2)

        with col1:
            st.subheader("Informations Personnelles")
            age = st.slider("Âge", 18, 85, 35)
            income = st.number_input("Revenu annuel (en dizaines de milliers de $)", min_value=0.5, max_value=20.0, value=4.5, step=0.1, format="%.2f")
            dependents = st.slider("Nombre de dépendants", 0, 10, 2)
            owner = st.radio("Propriétaire de son logement ?", ('Oui', 'Non'), horizontal=True)
            selfemp = st.radio("Travailleur indépendant (auto-entrepreneur) ?", ('Oui', 'Non'), horizontal=True)

        with col2:
            st.subheader("Informations Bancaires")
            reports = st.slider("Nombre de rapports de crédit négatifs", 0, 20, 0)
            months = st.number_input("Ancienneté à la banque (en mois)", min_value=0, max_value=600, value=54)
            majorcards = st.radio("Possède une carte de crédit majeure ?", ('Oui', 'Non'), horizontal=True)
            active = st.slider("Nombre d'autres cartes de crédit actives", 0, 50, 12)

        st.markdown("---")
        if st.button("Lancer la Prédiction", type="primary"):
            
            # --- Prétraitement des données d'entrée ---
            st.write("#### 1. Préparation des données pour le modèle...")
            
            # Mapper les réponses textuelles en valeurs attendues par le modèle
            owner_mapped = 'yes' if owner == 'Oui' else 'no'
            selfemp_mapped = 'yes' if selfemp == 'Oui' else 'no'
            majorcards_mapped = 1 if majorcards == 'Oui' else 0
            
            input_data = pd.DataFrame({
                # Colonnes fournies par l'utilisateur
                'reports': [reports],
                'age': [age],
                'income': [income],
                'owner': [owner_mapped],
                'selfemp': [selfemp_mapped],
                'dependents': [dependents],
                'months': [months],
                'majorcards': [majorcards_mapped],
                'active': [active],
                # Colonnes manquantes ajoutées avec des valeurs factices
                'card': ['yes'],
                'share': [0.0]
            })

            st.write("Données formatées (avec colonnes factices pour le modèle) :")
            st.dataframe(input_data)

            # --- Exécution de la prédiction ---
            st.write("#### 2. Exécution du modèle XGBoost...")
            prediction = model.predict(input_data)
            predicted_value = prediction[0]

            # Assurer que la dépense prédite ne soit pas négative
            if predicted_value < 0:
                predicted_value = 0

            # --- Affichage du résultat ---
            st.write("#### 3. Résultat de la Prédiction")
            st.metric(
                label="Dépense Mensuelle Estimée",
                value=f"${predicted_value:,.2f} USD",
                help="Cette prédiction est basée sur le modèle XGBoost entraîné."
            )

            if predicted_value > 750:
                st.success("Le profil de ce client suggère une **dépense élevée**. C'est un client à fort potentiel.")
            elif predicted_value > 200:
                st.info("Le profil de ce client suggère une **dépense moyenne**.")
            else:
                st.warning("Le profil de ce client suggère une **dépense faible**.")