import streamlit as st import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # Apply the default theme and activate color codes sns.set_theme() sns.set(color_codes=True) ################### import dataset tips = sns.load_dataset("tips") tips["tip_percentage"] = tips["tip"] / tips["total_bill"] * 100 ########### set the title and subtitle st.title("How does the amount of tip / percentage of tips differ across different days of the week?") st.subheader("This app shows which days of the week bring in higher tip percentages and tip amounts, helping restaurants and staff adapt to customer tipping behavior and optimize their business.") ############## create filters for our interactive plot with st.sidebar: st.subheader("Filters") # Day selection all_days = sorted(tips["day"].unique()) selected_days = st.multiselect( "Days to show", options=all_days, default=all_days, ) # Feature options feature_options = { "Tip": "tip", "Tip Percentage": "tip_percentage" } feature_label = st.selectbox("Feature (x-axis)", list(feature_options.keys())) x_col = feature_options[feature_label] # KDE options fill = st.checkbox("Shade area", value=True) if not selected_days: st.info("Select at least one day to display the plot.") else: # Filter the data data = tips[tips["day"].isin(selected_days)].dropna(subset=[x_col]) # KPI (numeric summary) avg_value = data[x_col].mean() unit = "$" if x_col == "tip" else "%" st.metric( label=f"Average {feature_label} for selected days", value=f"{avg_value:.2f} {unit}" ) # KDE plot g = sns.displot( data=data, x=x_col, hue="day", kind="kde", fill=fill ) fig = g.fig st.pyplot(fig) plt.close(fig) # Dynamic insight text max_day = ( data.groupby("day")[x_col].mean() .sort_values(ascending=False) .index[0] ) st.success( f"💡 On average, **{max_day}** has the highest {feature_label.lower()} among the selected days." )