Spaces:
Runtime error
Runtime error
Download src/streamlit_app.py from nab3588/smartdecision: direct link, hf CLI and curl.
- Browser
- Download file 8.26 kB
-
https://huggingface.co/spaces/nab3588/smartdecision/resolve/main/src/streamlit_app.py
- Command line
-
hf download hf://spaces/nab3588/smartdecision/src/streamlit_app.py
-
curl -L -o streamlit_app.py https://huggingface.co/spaces/nab3588/smartdecision/resolve/main/src/streamlit_app.py
8.26 kB
| import streamlit as st | |
| import numpy as np | |
| from scipy import stats | |
| from dotenv import load_dotenv | |
| import os | |
| from google import genai | |
| # Load API key | |
| load_dotenv() | |
| client = genai.Client(api_key=os.getenv("GOOGLE_API_KEY")) | |
| st.set_page_config(page_title="SmartDecision Lab - Dari Profitly", page_icon="📊", layout="centered") | |
| st.title("SmartDecision Lab - Dari Profitly") | |
| st.write(""" | |
| Selamat datang di **SmartDecision Lab**, tempatmu bereksperimen dengan keputusan bisnis kecilmu. | |
| Aplikasi ini membantu kamu memahami apakah keputusan seperti diskon, promosi, atau strategi baru | |
| benar-benar berpengaruh pada penjualanmu — dengan cara yang mudah dan terarah. | |
| """) | |
| st.divider() | |
| # Step 0: Input Faktor | |
| factor = st.text_input("Masukkan faktor yang ingin diuji (contoh: Diskon 10%, Kemasan Baru, Iklan TikTok):", "") | |
| if factor: | |
| # number of days | |
| num_days = 14 | |
| # Initialize persistent storage for analysis | |
| if "t_test_result" not in st.session_state: | |
| st.session_state.t_test_result = "" | |
| if "analysis_text" not in st.session_state: | |
| st.session_state.analysis_text = "" | |
| if "corr_result" not in st.session_state: | |
| st.session_state.corr_result = "" | |
| # Step 1: T-Test Section | |
| st.subheader(f"Langkah 1: Bandingkan Sebelum dan Sesudah '{factor}'") | |
| st.write(f"Masukkan data penjualan harian selama {num_days} hari sebelum dan sesudah perubahan dilakukan:") | |
| with st.expander("Input Data Penjualan Harian"): | |
| col1, col2 = st.columns(2) | |
| before, after = [], [] | |
| with col1: | |
| st.markdown(f"**{num_days} Hari Sebelum Perubahan**") | |
| for i in range(1, num_days + 1): | |
| val = st.number_input(f"Hari {i} Sebelum", min_value=0, step=1000, key=f"before_{i}") | |
| before.append(val) | |
| if val > 0: | |
| st.caption(f"💰 Rp {val:,.0f}".replace(",", ".")) | |
| with col2: | |
| st.markdown(f"**{num_days} Hari Sesudah Perubahan**") | |
| for i in range(1, num_days + 1): | |
| val = st.number_input(f"Hari {i} Sesudah", min_value=0, step=1000, key=f"after_{i}") | |
| after.append(val) | |
| if val > 0: | |
| st.caption(f"💰 Rp {val:,.0f}".replace(",", ".")) | |
| before = np.array(before) | |
| after = np.array(after) | |
| if st.button("Analisis Perubahan"): | |
| if np.count_nonzero(before) == num_days and np.count_nonzero(after) == num_days: | |
| t_stat, p_val = stats.ttest_rel(after, before) | |
| mean_before, mean_after = np.mean(before), np.mean(after) | |
| change = mean_after - mean_before | |
| summary = ( | |
| f"Rata-rata Sebelum: Rp {mean_before:,.0f} | " | |
| f"Rata-rata Sesudah: Rp {mean_after:,.0f} | " | |
| f"T-stat: {t_stat:.3f}, p-value: {p_val:.4f}" | |
| ) | |
| st.session_state.t_test_result = summary | |
| st.success("Hasil Analisis T-Test") | |
| st.write(summary.replace(",", ".")) | |
| analysis_text = "" | |
| if p_val < 0.05: | |
| if change > 0: | |
| st.markdown(f"### ✅ Ada peningkatan signifikan setelah penerapan **{factor}** (p-value = {p_val:.4f}).") | |
| st.markdown("Perubahan ini kemungkinan besar berdampak positif.") | |
| analysis_text += f"Hasil menunjukkan peningkatan signifikan pada penjualan setelah penerapan {factor}. " | |
| else: | |
| st.markdown(f"### ⚠️ Ada penurunan signifikan setelah penerapan **{factor}** (p-value = {p_val:.4f}).") | |
| st.markdown("Keputusan ini mungkin perlu dievaluasi kembali.") | |
| analysis_text += f"Hasil menunjukkan penurunan signifikan pada penjualan setelah penerapan {factor}. " | |
| else: | |
| st.info(f"Tidak ada perubahan signifikan (p-value = {p_val:.4f}).") | |
| st.markdown("Perubahan kemungkinan hanya akibat variasi harian biasa.") | |
| analysis_text += f"Tidak ada perubahan signifikan pada data sebelum dan sesudah {factor}. " | |
| st.session_state.analysis_text = analysis_text | |
| else: | |
| st.error(f"Pastikan semua {num_days} data sebelum dan sesudah telah diisi dengan benar.") | |
| # Show last result if available | |
| if st.session_state.t_test_result: | |
| st.info(f"Terakhir: {st.session_state.t_test_result}") | |
| st.divider() | |
| # Step 2: Korelasi Section, Pearson | |
| st.subheader(f"Langkah 2: Analisis Korelasi '{factor}'") | |
| st.write(""" | |
| Jika dapat diukur, masukkan berapa kali kamu melakukan faktor tersebut setiap hari | |
| dan total penjualan harian. | |
| """) | |
| with st.expander("Input Data Korelasi"): | |
| col3, col4 = st.columns(2) | |
| x_data, y_data = [], [] | |
| with col3: | |
| st.markdown("**Jumlah Aktivitas per Hari (X)**") | |
| for i in range(1, num_days + 1): | |
| val = st.number_input(f"Hari {i} - Aktivitas", min_value=0, step=1, key=f"x_{i}") | |
| x_data.append(val) | |
| if val > 0: | |
| st.caption(f"{val:,.0f} {factor}".replace(",", ".")) | |
| with col4: | |
| st.markdown("**Total Penjualan per Hari (Y)**") | |
| for i in range(1, num_days + 1): | |
| val = st.number_input(f"Hari {i} - Penjualan", min_value=0, step=1000, key=f"y_{i}") | |
| y_data.append(val) | |
| if val > 0: | |
| st.caption(f"💰 Rp {val:,.0f}".replace(",", ".")) | |
| x_data = np.array(x_data) | |
| y_data = np.array(y_data) | |
| if st.button("Analisis Korelasi"): | |
| if len(x_data) == len(y_data) and np.count_nonzero(y_data) >= 5: | |
| corr, p_corr = stats.pearsonr(x_data, y_data) | |
| st.success("Hasil Analisis Korelasi") | |
| st.write(f"Nilai Korelasi (r): **{corr:.3f}**") | |
| analysis_text = st.session_state.analysis_text | |
| if corr > 0.5: | |
| st.markdown("### Hubungan kuat dan positif: semakin sering faktor dilakukan, penjualan meningkat.") | |
| analysis_text += f"Terdapat hubungan positif yang kuat (r={corr:.3f}) antara intensitas {factor} dan penjualan. " | |
| elif corr < -0.5: | |
| st.markdown("### Hubungan kuat tapi negatif: semakin sering faktor dilakukan, penjualan menurun.") | |
| analysis_text += f"Terdapat hubungan negatif yang kuat (r={corr:.3f}) antara intensitas {factor} dan penjualan. " | |
| else: | |
| st.markdown("### Hubungan lemah atau tidak pasti antara faktor tersebut dan penjualan.") | |
| analysis_text += f"Tidak ditemukan hubungan kuat (r={corr:.3f}) antara {factor} dan penjualan. " | |
| st.session_state.corr_result = f"Korelasi: {corr:.3f}, p-value: {p_corr:.4f}" | |
| st.session_state.analysis_text = analysis_text | |
| else: | |
| st.error(f"Pastikan jumlah data X dan Y sama dan minimal 5 dari {num_days} hari terisi.") | |
| if st.session_state.corr_result: | |
| st.info(f"Terakhir: {st.session_state.corr_result}") | |
| st.divider() | |
| # Step 3: Gemini Insight Button | |
| if st.button("Analisis Insight Otomatis (Gemini)"): | |
| combined_summary = ( | |
| f"Faktor: {factor}. " | |
| f"Hasil T-Test: {st.session_state.t_test_result}. " | |
| f"Hasil Korelasi: {st.session_state.corr_result}. " | |
| f"{st.session_state.analysis_text}" | |
| ) | |
| prompt = f""" | |
| Kamu adalah analis bisnis profesional. Jelaskan hasil berikut dalam bahasa Indonesia yang mudah dipahami. | |
| Data: {combined_summary} | |
| Berikan: | |
| 1. Ringkasan hasil analisis (arti bisnisnya secara sederhana). | |
| 2. Tiga kemungkinan penyebab hasil tersebut. | |
| 3. Tiga saran praktis untuk memperbaiki atau memaksimalkan hasil dari '{factor}'. | |
| Gunakan format markdown yang rapi. | |
| """ | |
| try: | |
| with st.spinner("Gemini sedang menganalisis hasil..."): | |
| response = client.models.generate_content( | |
| model="gemini-2.5-flash", | |
| contents=prompt | |
| ) | |
| st.markdown(response.text) | |
| except Exception as e: | |
| st.error("Gagal menghasilkan insight otomatis.") | |
| st.exception(e) | |