credit-card-clustering / src /streamlit_app.py
ESMATUGBA's picture
Update src/streamlit_app.py
fa1e250 verified
Raw
History Blame Contribute Delete
5.78 kB
import streamlit as st
import pandas as pd
import joblib
import numpy as np
from PIL import Image
import os
# 1. Sayfa Yapılandırması
st.set_page_config(page_title="Credit Card Segmentation", layout="wide")
# 2. Modelleri ve Görseli Yükle
@st.cache_resource
def load_assets():
current_dir = os.path.dirname(os.path.abspath(__file__))
model = joblib.load('kmeans_model.pkl')
scaler = joblib.load('scaler.pkl')
img_path = os.path.join(current_dir, 'clustering.png')
cluster_img = Image.open(img_path) if os.path.exists(img_path) else None
return model, scaler, cluster_img
model, scaler, cluster_img = load_assets()
# 3. Kümelerin Tanımları
descriptions = {
0: "Pasif Kullanıcı / Passive User (Düşük Bakiye & Düşük Harcama)",
1: "Taksit Odaklı / Installment User (Düzenli Küçük Taksitli Alışveriş)",
2: "Borçlu-Nakitçi / Cash Advance User (Yüksek Nakit Avans ve Borç)",
3: "Dengeli Müşteri / Balanced User (Düzenli Harcama ve Ödeme)",
4: "VIP Müşteri / High Spender (Çok Yüksek Bakiye ve Lüks Harcama)",
5: "Yeni/Gelişmekte Olan / Emerging User (Orta Seviye Bakiye, Düşük İşlem)",
6: "Nakit Odaklı / Cash-Oriented (Sık Nakit Avans, Az Alışveriş)",
7: "Potansiyel VIP / Potential VIP (Limitine Göre Yüksek Harcama Yapanlar)"
}
# 4. Sol Panel (Sidebar)
st.sidebar.markdown("### 📌 Cluster Descriptions / Küme Açıklamaları")
# İlk 5 Cluster (0-4)
st.sidebar.write(f"**Cluster 0:** {descriptions[0]}")
st.sidebar.write(f"**Cluster 1:** {descriptions[1]}")
st.sidebar.write(f"**Cluster 2:** {descriptions[2]}")
st.sidebar.write(f"**Cluster 3:** {descriptions[3]}")
st.sidebar.write(f"**Cluster 4:** {descriptions[4]}")
# 4'ten sonrası (5, 6, 7) Gizli Menü
with st.sidebar.expander("Show More / Devamını Gör (5-7)"):
st.write(f"**Cluster 5:** {descriptions[5]}")
st.write(f"**Cluster 6:** {descriptions[6]}")
st.write(f"**Cluster 7:** {descriptions[7]}")
st.sidebar.divider()
st.sidebar.markdown("### 🔧 Input Financial Data / Finansal Veri Girişi")
def user_input_features():
balance = st.sidebar.number_input("Balance (Bakiye)", value=100.0)
purchases = st.sidebar.number_input("Purchases (Toplam Alışveriş)", value=0.0)
cash_advance = st.sidebar.number_input("Cash Advance (Nakit Avans)", value=0.0)
credit_limit = st.sidebar.number_input("Credit Limit (Kredi Limiti)", value=1000.0)
payments = st.sidebar.number_input("Payments (Yapılan Ödemeler)", value=0.0)
balance_freq = st.sidebar.slider("Balance Frequency / Bakiye Sıklığı", 0.0, 1.0, 1.0)
oneoff_purchases = st.sidebar.number_input("One-off Purchases / Tek Seferlik Alışveriş", value=0.0)
inst_purchases = st.sidebar.number_input("Installments Purchases / Taksitli Alışveriş", value=0.0)
purchases_freq = st.sidebar.slider("Purchases Frequency / Alışveriş Sıklığı", 0.0, 1.0, 0.0)
oneoff_freq = st.sidebar.slider("One-off Frequency / Tek Seferlik Sıklık", 0.0, 1.0, 0.0)
inst_freq = st.sidebar.slider("Installments Frequency / Taksit Sıklığı", 0.0, 1.0, 0.0)
cash_adv_freq = st.sidebar.slider("Cash Advance Frequency / Nakit Avans Sıklığı", 0.0, 1.0, 0.0)
cash_adv_trx = st.sidebar.number_input("Cash Advance TRX / Nakit Avans İşlem Sayısı", value=0)
purch_trx = st.sidebar.number_input("Purchases TRX / Alışveriş İşlem Sayısı", value=0)
min_pay = st.sidebar.number_input("Minimum Payments / Minimum Ödeme", value=0.0)
full_pay = st.sidebar.slider("PRC Full Payment / Borç Kapatma Oranı", 0.0, 1.0, 0.0)
tenure = st.sidebar.selectbox("Tenure / Kullanım Süresi (Ay)", [6,7,8,9,10,11,12], index=6)
return pd.DataFrame({
'BALANCE': balance, 'BALANCE_FREQUENCY': balance_freq, 'PURCHASES': purchases,
'ONEOFF_PURCHASES': oneoff_purchases, 'INSTALLMENTS_PURCHASES': inst_purchases,
'CASH_ADVANCE': cash_advance, 'PURCHASES_FREQUENCY': purchases_freq,
'ONEOFF_PURCHASES_FREQUENCY': oneoff_freq, 'PURCHASES_INSTALLMENTS_FREQUENCY': inst_freq,
'CASH_ADVANCE_FREQUENCY': cash_adv_freq, 'CASH_ADVANCE_TRX': cash_adv_trx,
'PURCHASES_TRX': purch_trx, 'CREDIT_LIMIT': credit_limit, 'PAYMENTS': payments,
'MINIMUM_PAYMENTS': min_pay, 'PRC_FULL_PAYMENT': full_pay, 'TENURE': tenure
}, index=[0])
input_df = user_input_features()
# 5. Ana Sayfa (İngilizce Başlık Eklendi)
st.markdown("# 💳 Credit Card Customer Segmentation / Kredi Kartı Müşteri Segmentasyonu")
predict_button = st.button("🎯 Predict / Tahmin Et")
st.write("---")
if predict_button:
scaled_data = scaler.transform(input_df)
prediction = int(model.predict(scaled_data)[0])
st.balloons()
# Sonuç Kısmına İngilizce Karşılık Eklendi
st.success(f"### 🎯 Sonuç: Müşteri **Cluster {prediction}** grubuna aittir. / Result: Customer belongs to **Cluster {prediction}**.")
st.info(f"**Açıklama / Description:** {descriptions.get(prediction)}")
st.divider()
if cluster_img:
st.image(cluster_img, caption="Customer Segmentation Distribution / Müşteri Segmentasyonu Dağılımı", width=500)
st.markdown("""
**💡 Genel Sistem Analiz Notu / General System Analysis Note:**
* **TR:** Banka için en güvenli bölge sağ alt tarafa (yüksek harcama, düşük borç) doğru uzanan müşterilerdir. En riskli bölge ise harcama yapmadığı halde bakiyesi (borcu) sürekli yukarı tırmanan dikey hattaki müşterilerdir.
* **EN:** The safest zone for the bank is the customers extending towards the bottom right (high spending, low debt). The riskiest zone is the customers on the vertical line whose balance (debt) keeps climbing even though they do not spend.
""")