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**.")