MMMInc-testing / app.py
LianHP's picture
Upload folder using huggingface_hub
4316927 verified
import gradio as gr
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# To avoid backend display issues on HF
plt.switch_backend("Agg")
def generate_fake_data():
np.random.seed(42)
weeks = 104
data = pd.DataFrame({
"week": range(1, weeks + 1),
"tv_spend": np.random.gamma(30, 15, weeks),
"social_spend": np.random.gamma(20, 20, weeks),
"search_spend": np.random.gamma(25, 10, weeks),
"price": np.random.normal(10, 0.4, weeks),
})
# true coefficients
true_coef = {"tv": 0.8, "social": 1.2, "search": 0.6, "price": -20}
data["sales"] = (
true_coef["tv"] * data["tv_spend"] +
true_coef["social"] * data["social_spend"] +
true_coef["search"] * data["search_spend"] +
true_coef["price"] * data["price"] +
np.random.normal(0, 50, weeks)
).round(2)
return data
def run_mmm(data, incremental_increase):
X = data[["tv_spend", "social_spend", "search_spend", "price"]]
y = data["sales"]
model = LinearRegression()
model.fit(X, y)
coef = pd.Series(model.coef_, index=X.columns).round(4)
intercept = round(model.intercept_, 2)
# Incrementality
social_coef = coef["social_spend"]
incremental_sales = round(social_coef * incremental_increase, 2)
# Plot actual vs predicted
data["pred_sales"] = model.predict(X)
plt.figure(figsize=(8, 4))
plt.plot(data["sales"], label="Actual Sales")
plt.plot(data["pred_sales"], label="Predicted Sales")
plt.legend()
plt.title("Actual vs Predicted Sales (MMM)")
plt.xlabel("Week")
plt.ylabel("Sales")
plot_path = "plot.png"
plt.tight_layout()
plt.savefig(plot_path)
plt.close()
return (
coef.to_frame("Coefficient").reset_index().rename(columns={"index": "Variable"}),
f"Incremental sales from +${incremental_increase} social spend: {incremental_sales}",
plot_path
)
def ui_run(incremental_increase):
data = generate_fake_data()
coef_table, inc_msg, plot_path = run_mmm(data, incremental_increase)
return coef_table, inc_msg, plot_path
### -------- Gradio Interface -------- ###
demo = gr.Interface(
fn=ui_run,
inputs=[
gr.Number(label="Increase in Social Spend (In Dollars)", value=10000)
],
outputs=[
gr.Dataframe(label="MMM Coefficients"),
gr.Textbox(label="Incrementality Result"),
gr.Image(label="Actual vs Predicted Sales")
],
title="Marketing Mix Model (MMM) + Incrementality",
description="A simple MMM that models TV, Social, Search, and Price to predict Sales. Enter an additional Social Ad spend to estimate the incremental uplift.",
allow_flagging="never"
)
if __name__ == "__main__":
demo.launch(share=True)