smartdecision / src /streamlit_app.py
nab3588's picture
Update src/streamlit_app.py
7da5e88 verified
Raw History Blame Contribute Delete
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)