{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "4f86e1f0",
   "metadata": {},
   "source": [
    "# 营销组合模型 — 贝叶斯渠道归因\n",
    "\n",
    "对应案例: [MMM](/docs/case-studies/marketing/marketing-mix-case/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2005d810",
   "metadata": {},
   "source": [
    "## 1. 模拟营销数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e3e69702",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
    "np.random.seed(42)\n",
    "n=156; t=np.arange(n)\n",
    "tv=50+10*np.sin(2*np.pi*t/52)+np.random.normal(0,5,n)\n",
    "dig=30+0.3*t+np.random.normal(0,8,n)\n",
    "soc=20+np.random.normal(0,3,n)\n",
    "sales=100+0.5*t+20*np.sin(2*np.pi*t/52)+0.8*tv+0.5*dig+0.3*soc+np.random.normal(0,10,n)\n",
    "sales=np.maximum(sales,10)\n",
    "df=pd.DataFrame({'week':t,'sales':sales,'tv':tv,'digital':dig,'social':soc})\n",
    "print(df.head())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2caaac79",
   "metadata": {},
   "source": [
    "## 2. 简单线性回归估计渠道效应"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a72478ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "X=df[['tv','digital','social']]; y=df['sales']\n",
    "lr=LinearRegression().fit(X,y)\n",
    "for name,coef in zip(['TV','Digital','Social'],lr.coef_):\n",
    "    print(f'{name}: {coef:.4f} (每万元支出增加 {coef:.2f} 万销售额)')\n",
    "# ROI\n",
    "total_spend=df[['tv','digital','social']].sum()\n",
    "total_revenue=y.sum()\n",
    "print(f'总ROI: {total_revenue/total_spend.sum():.2f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "97b909c1",
   "metadata": {},
   "source": [
    "## 3. 渠道 ROI 对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "63a6fabd",
   "metadata": {},
   "outputs": [],
   "source": [
    "channels=['TV','Digital','Social']\n",
    "spends=[df[c].sum() for c in ['tv','digital','social']]\n",
    "revenues=[lr.coef_[i]*spends[i] for i in range(3)]\n",
    "roi=[revenues[i]/spends[i] for i in range(3)]\n",
    "colors=['#2196F3','#4CAF50','#FF9800']\n",
    "fig,(ax1,ax2)=plt.subplots(1,2,figsize=(12,5))\n",
    "ax1.bar(channels,roi,color=colors)\n",
    "ax1.set_ylabel('ROI'); ax1.set_title('Channel ROI')\n",
    "ax2.pie(revenues,labels=channels,autopct='%1.1f%%',colors=colors)\n",
    "ax2.set_title('Revenue Attribution')\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5577a5ef",
   "metadata": {},
   "source": [
    "---\n",
    "*更多分析见 [案例文档](/docs/case-studies/marketing/marketing-mix-case/)*"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
