{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5bd5964d",
   "metadata": {},
   "source": [
    "# 产品增长模型 — 留存 & 病毒系数\n",
    "\n",
    "对应案例: [产品增长](/docs/case-studies/strategy/product-growth-case/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d056338d",
   "metadata": {},
   "source": [
    "## 1. 增长模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "31fe7ce4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
    "np.random.seed(42)\n",
    "# Growth model parameters\n",
    "weeks=52\n",
    "new_users_per_week=lambda w:500*np.exp(-0.02*w)+100  # declining\n",
    "retention=0.6  # weekly\n",
    "virality=0.15  # viral coefficient\n",
    "users=[100]; new_u_list=[]\n",
    "for w in range(weeks):\n",
    "    new_organic=new_users_per_week(w)\n",
    "    new_viral=users[-1]*retention*virality\n",
    "    new=round(new_organic+new_viral)\n",
    "    retained=round(users[-1]*retention)\n",
    "    users.append(retained+new)\n",
    "    new_u_list.append({'week':w,'organic':new_organic,'viral':new_viral,'total_new':new,'retained':retained,'active':users[-1]})\n",
    "df=pd.DataFrame(new_u_list)\n",
    "print(f'Week 52 active: {users[-1]:,}')\n",
    "print(df.tail())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "61b4398d",
   "metadata": {},
   "source": [
    "## 2. 可视化增长"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2ef7106",
   "metadata": {},
   "outputs": [],
   "source": [
    "fig,(ax1,ax2)=plt.subplots(2,1,figsize=(12,8))\n",
    "ax1.plot(df['week'],df['active'],color='#2196F3',lw=2)\n",
    "ax1.fill_between(df['week'],0,df['active'],alpha=0.1,color='#2196F3')\n",
    "ax1.set_ylabel('Active Users'); ax1.set_title('User Growth')\n",
    "ax2.stackplot(df['week'],df['retained'],df['organic'],df['viral'],\n",
    "    labels=['Retained','Organic','Viral'],colors=['#4CAF50','#2196F3','#FF9800'],alpha=0.7)\n",
    "ax2.set_xlabel('Week'); ax2.set_ylabel('Users')\n",
    "ax2.legend(loc=2); ax2.set_title('Growth Breakdown')\n",
    "plt.tight_layout(); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8a88693",
   "metadata": {},
   "source": [
    "## 3. 敏感性分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b24875b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# What if virality changes?\n",
    "virals=[0.05,0.1,0.15,0.2,0.25]\n",
    "final_users=[]\n",
    "for v in virals:\n",
    "    u=[100]\n",
    "    for w in range(weeks):\n",
    "        organic=new_users_per_week(w)\n",
    "        viral=u[-1]*retention*v\n",
    "        u.append(round(u[-1]*retention+organic+viral))\n",
    "    final_users.append(u[-1])\n",
    "for v,fu in zip(virals,final_users):\n",
    "    print(f'Virality={v:.2f}: {fu:,} users ({(fu/100-1)*100:+.0f}% vs base=100)')\n",
    "plt.figure(figsize=(8,5))\n",
    "plt.plot(virals,final_users,'o-',color='#2196F3',markersize=10)\n",
    "plt.xlabel('Viral Coefficient'); plt.ylabel('Final Active Users')\n",
    "plt.title('Virality Sensitivity'); plt.grid(alpha=0.3); plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "86f0da20",
   "metadata": {},
   "source": [
    "---\n",
    "*更多分析见 [案例文档](/docs/case-studies/strategy/product-growth-case/)*"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
