{"id":3893,"date":"2025-09-13T22:19:39","date_gmt":"2025-09-13T14:19:39","guid":{"rendered":"http:\/\/viplao.com\/?p=3893"},"modified":"2025-09-13T22:19:41","modified_gmt":"2025-09-13T14:19:41","slug":"%e3%80%90python%e5%ae%9e%e8%b7%b5%e6%a1%88%e4%be%8b%e3%80%91%e7%94%b5%e5%95%86%e5%b9%b3%e5%8f%b0%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e5%92%8c%e6%8c%96%e6%8e%98-%e7%94%a8%e6%88%b7%e8%a1%8c%e4%b8%ba-2","status":"publish","type":"post","link":"http:\/\/viplao.com\/index.php\/2025\/09\/13\/%e3%80%90python%e5%ae%9e%e8%b7%b5%e6%a1%88%e4%be%8b%e3%80%91%e7%94%b5%e5%95%86%e5%b9%b3%e5%8f%b0%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e5%92%8c%e6%8c%96%e6%8e%98-%e7%94%a8%e6%88%b7%e8%a1%8c%e4%b8%ba-2\/","title":{"rendered":"\u3010Python\u5b9e\u8df5\u6848\u4f8b\u3011\u7535\u5546\u5e73\u53f0\u6570\u636e\u5206\u6790\u548c\u6316\u6398 &#8211;  \u7528\u6237\u884c\u4e3a\u9884\u6d4b"},"content":{"rendered":"\n<p>\u5f00\u53d1\u601d\u8def:\u7ed3\u5408\u7528\u6237\u753b\u50cf\uff08\u5206\u7fa4\u3001\u5e74\u9f84\uff09\u548c\u8fd1\u671f\u884c\u4e3a\uff08\u6d4f\u89c8\u3001\u52a0\u8d2d\u3001\u8d2d\u4e70\u6b21\u6570\uff0c\u6d4f\u89c8\u5546\u54c1\u5747\u4ef7\u7b49\uff09\u6784\u5efa\u7279\u5f81,\u6c47\u603b\u573a\u666f\u5316\u8425\u9500\u548c\u884c\u4e3a\u9884\u6d4b\u7684\u5206\u6790\u7ed3\u679c<\/p>\n\n\n\n<ol>\n<li><strong>\u914d\u7f6e (<code># --- \u914d\u7f6e ---<\/code>)<\/strong>:\n<ul>\n<li>\u5b9a\u4e49\u4e86\u6a21\u62df\u6570\u636e\u7684\u89c4\u6a21 (<code>NUM_USERS<\/code>,&nbsp;<code>NUM_PRODUCTS<\/code>,&nbsp;<code>NUM_INTERACTIONS<\/code>)\u3002<\/li>\n\n\n\n<li>\u8bbe\u7f6e\u4e86\u62a5\u544a\u6587\u4ef6\u540d\u524d\u7f00\u548c\u968f\u673a\u79cd\u5b50\u4ee5\u4fdd\u8bc1\u7ed3\u679c\u53ef\u590d\u73b0\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u6570\u636e\u751f\u6210 (<code>generate_sample_data<\/code>)<\/strong>:\n<ul>\n<li>\u521b\u5efa\u4e86\u6a21\u62df\u7684\u7528\u6237 (<code>user_id<\/code>,&nbsp;<code>segment<\/code>,&nbsp;<code>age_group<\/code>,&nbsp;<code>gender<\/code>)\u3001\u5546\u54c1 (<code>product_id<\/code>,&nbsp;<code>category<\/code>,&nbsp;<code>price<\/code>) \u548c\u7528\u6237-\u5546\u54c1\u4ea4\u4e92 (<code>user_id<\/code>,&nbsp;<code>product_id<\/code>,&nbsp;<code>action<\/code>,&nbsp;<code>timestamp<\/code>) \u6570\u636e\u3002<\/li>\n\n\n\n<li>\u4ea4\u4e92\u884c\u4e3a\uff08\u6d4f\u89c8\u3001\u52a0\u8d2d\u3001\u8d2d\u4e70\uff09\u7684\u6982\u7387\u53d7\u5230\u7528\u6237\u5206\u7fa4\u548c\u5546\u54c1\u5c5e\u6027\u7684\u5f71\u54cd\uff0c\u4f7f\u6570\u636e\u66f4\u8d34\u8fd1\u73b0\u5b9e\u3002<\/li>\n\n\n\n<li>\u751f\u6210\u7684\u6570\u636e\u88ab\u4fdd\u5b58\u4e3a\u4e09\u4e2aCSV\u6587\u4ef6\uff0c\u65b9\u4fbf\u67e5\u770b\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u573a\u666f\u5316\u8425\u9500 (<code>scenario_based_marketing<\/code>)<\/strong>:\n<ul>\n<li>\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5177\u4f53\u7684\u8425\u9500\u573a\u666f\uff1a<strong>\u201c\u5bf9\u6d4f\u89c8\/\u52a0\u8d2d\u4e86\u67d0\u7c7b\u5546\u54c1\u4f46\u672a\u8d2d\u4e70\u7684\u7528\u6237\u8fdb\u884c\u63a8\u8350\u201d<\/strong>\u3002<\/li>\n\n\n\n<li>\u4ee3\u7801\u4f1a\u8bc6\u522b\u51fa\u7b26\u5408\u6b64\u573a\u666f\u7684\u7528\u6237\u3002<\/li>\n\n\n\n<li>\u4e3a\u8fd9\u4e9b\u7528\u6237\u63a8\u8350\u540c\u4e00\u7c7b\u522b\u4e0b\u4ed6\u4eec\u672a\u4ea4\u4e92\u8fc7\u4e14\u4ef7\u683c\u76f8\u8fd1\u7684\u5546\u54c1\u3002<\/li>\n\n\n\n<li>\u751f\u6210\u7684\u63a8\u8350\u793a\u4f8b\u88ab\u6253\u5370\u51fa\u6765\u5e76\u4fdd\u5b58\u5230CSV\u6587\u4ef6\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u7528\u6237\u884c\u4e3a\u9884\u6d4b (<code>predict_user_behavior<\/code>)<\/strong>:\n<ul>\n<li><strong>\u7279\u5f81\u5de5\u7a0b<\/strong>: \u7ed3\u5408\u7528\u6237\u753b\u50cf\uff08\u5206\u7fa4\u3001\u5e74\u9f84\uff09\u548c\u8fd1\u671f\u884c\u4e3a\uff08\u6d4f\u89c8\u3001\u52a0\u8d2d\u3001\u8d2d\u4e70\u6b21\u6570\uff0c\u6d4f\u89c8\u5546\u54c1\u5747\u4ef7\u7b49\uff09\u6784\u5efa\u7279\u5f81\u3002<\/li>\n\n\n\n<li><strong>\u6807\u7b7e\u6784\u5efa<\/strong>: \u7b80\u5316\u5904\u7406\uff0c\u5c06\u5386\u53f2\u4e0a\u6709\u8fc7\u8d2d\u4e70\u884c\u4e3a\u7684\u7528\u6237\u6807\u8bb0\u4e3a\u6b63\u6837\u672c\uff08\u4f1a\u8d2d\u4e70\uff09\u3002<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u8bad\u7ec3<\/strong>: \u4f7f\u7528&nbsp;<code>scikit-learn<\/code>&nbsp;\u7684&nbsp;<code>LogisticRegression<\/code>&nbsp;\u6a21\u578b\u3002<\/li>\n\n\n\n<li><strong>\u6a21\u578b\u8bc4\u4f30<\/strong>: \u8ba1\u7b97\u51c6\u786e\u7387\uff0c\u5e76\u6253\u5370\u8be6\u7ec6\u7684\u5206\u7c7b\u62a5\u544a (<code>classification_report<\/code>) \u548c\u6df7\u6dc6\u77e9\u9635 (<code>confusion_matrix<\/code>)\u3002<\/li>\n\n\n\n<li><strong>\u53ef\u89c6\u5316<\/strong>: \u4f7f\u7528&nbsp;<code>matplotlib<\/code>&nbsp;\u548c&nbsp;<code>seaborn<\/code>&nbsp;\u7ed8\u5236\u6df7\u6dc6\u77e9\u9635\u70ed\u529b\u56fe\u548c\u7279\u5f81\u91cd\u8981\u6027\uff08\u903b\u8f91\u56de\u5f52\u7cfb\u6570\uff09\u6761\u5f62\u56fe\u3002<\/li>\n\n\n\n<li><strong>\u8f93\u51fa<\/strong>: \u8fd4\u56de\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u3001\u9884\u5904\u7406\u5668\u548c\u8bc4\u4f30\u7ed3\u679c\uff0c\u7528\u4e8e\u540e\u7eed\u5e94\u7528\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u62a5\u544a\u751f\u6210 (<code>generate_final_report<\/code>)<\/strong>:\n<ul>\n<li>\u6c47\u603b\u573a\u666f\u5316\u8425\u9500\u548c\u884c\u4e3a\u9884\u6d4b\u7684\u5206\u6790\u7ed3\u679c\u3002<\/li>\n\n\n\n<li>\u63cf\u8ff0\u4e86\u91c7\u7528\u7684\u65b9\u6cd5\u3001\u5173\u952e\u53d1\u73b0\u548c\u6a21\u578b\u6027\u80fd\u3002<\/li>\n\n\n\n<li>\u63d0\u51fa\u4e86\u57fa\u4e8e\u5206\u6790\u7ed3\u679c\u7684\u603b\u7ed3\u548c\u4e1a\u52a1\u5efa\u8bae\u3002<\/li>\n\n\n\n<li>\u5c06\u6240\u6709\u5185\u5bb9\u6574\u5408\u5230\u4e00\u4e2a&nbsp;<code>.txt<\/code>&nbsp;\u6587\u672c\u62a5\u544a\u4e2d\u3002<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>\u4e3b\u51fd\u6570 (<code>main<\/code>)<\/strong>:\n<ul>\n<li>\u6309\u987a\u5e8f\u8c03\u7528\u6570\u636e\u751f\u6210\u3001\u573a\u666f\u5316\u8425\u9500\u3001\u884c\u4e3a\u9884\u6d4b\u548c\u62a5\u544a\u751f\u6210\u51fd\u6570\uff0c\u5b8c\u6210\u6574\u4e2a\u5206\u6790\u6d41\u7a0b\u3002<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import pandas as pd\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport random\nfrom datetime import datetime, timedelta\n\n# --- \u914d\u7f6e ---\nNUM_USERS = 2000\nNUM_PRODUCTS = 100\nNUM_INTERACTIONS = 10000\nREPORT_PREFIX = '\u7535\u5546\u573a\u666f\u5316\u8425\u9500\u4e0e\u884c\u4e3a\u9884\u6d4b\u62a5\u544a'\nRANDOM_SEED = 42\n\n# --- \u6570\u636e\u751f\u6210 ---\n\ndef generate_sample_data(n_users, n_products, n_interactions):\n    \"\"\"\u751f\u6210\u6a21\u62df\u7684\u7528\u6237-\u5546\u54c1\u4ea4\u4e92\u6570\u636e\"\"\"\n    print(\"--- \u6b63\u5728\u751f\u6210\u6a21\u62df\u7528\u6237\u884c\u4e3a\u6570\u636e ---\")\n    np.random.seed(RANDOM_SEED)\n    random.seed(RANDOM_SEED)\n    \n    # 1. \u751f\u6210\u57fa\u7840\u7528\u6237\u548c\u5546\u54c1\u4fe1\u606f\n    users = &#91;f'user_{i}' for i in range(1, n_users + 1)]\n    products = &#91;f'prod_{i}' for i in range(1, n_products + 1)]\n    categories = &#91;'Electronics', 'Books', 'Clothing', 'Home', 'Toys']\n    product_data = &#91;]\n    for prod in products:\n        cat = random.choice(categories)\n        # \u7b80\u5316\uff1a\u4ef7\u683c\u4e0e\u7c7b\u522b\u76f8\u5173\n        if cat == 'Electronics':\n            price = np.random.lognormal(9, 0.5)\n        elif cat == 'Books':\n            price = np.random.lognormal(6, 0.3)\n        else:\n            price = np.random.lognormal(7, 0.4)\n        product_data.append({'product_id': prod, 'category': cat, 'price': round(price, 2)})\n    df_products = pd.DataFrame(product_data)\n    \n    # 2. \u751f\u6210\u7528\u6237\u753b\u50cf\n    user_profiles = &#91;]\n    for user in users:\n        # \u7528\u6237\u4ef7\u503c\u5206\u7fa4\n        segment = np.random.choice(&#91;'Low Value', 'Medium Value', 'High Value'], p=&#91;0.5, 0.3, 0.2])\n        # \u5e74\u9f84 (\u7b80\u5316\u4e3a\u5e74\u9f84\u6bb5)\n        age_group = np.random.choice(&#91;'18-25', '26-35', '36-45', '46+'], p=&#91;0.3, 0.4, 0.2, 0.1])\n        # \u6027\u522b\n        gender = np.random.choice(&#91;'M', 'F'], p=&#91;0.5, 0.5])\n        user_profiles.append({'user_id': user, 'segment': segment, 'age_group': age_group, 'gender': gender})\n    df_users = pd.DataFrame(user_profiles)\n\n    # 3. \u751f\u6210\u4ea4\u4e92\u6570\u636e (\u6d4f\u89c8, \u52a0\u8d2d, \u8d2d\u4e70)\n    interactions = &#91;]\n    for _ in range(n_interactions):\n        user = random.choice(users)\n        product = random.choice(products)\n        # \u7b80\u5355\u6a21\u62df\uff1a\u7528\u6237\u66f4\u53ef\u80fd\u4e0e\u540c\u7c7b\u522b\u6216\u540c\u4ef7\u4f4d\u5546\u54c1\u4ea4\u4e92\n        user_segment = df_users&#91;df_users&#91;'user_id'] == user]&#91;'segment'].iloc&#91;0]\n        user_age = df_users&#91;df_users&#91;'user_id'] == user]&#91;'age_group'].iloc&#91;0]\n        prod_cat = df_products&#91;df_products&#91;'product_id'] == product]&#91;'category'].iloc&#91;0]\n        prod_price = df_products&#91;df_products&#91;'product_id'] == product]&#91;'price'].iloc&#91;0]\n        \n        # \u4ea4\u4e92\u7c7b\u578b\u53ca\u6982\u7387 (\u53d7\u7528\u6237\u548c\u5546\u54c1\u5c5e\u6027\u5f71\u54cd)\n        # \u9ad8\u4ef7\u503c\u7528\u6237\u8d2d\u4e70\u6982\u7387\u66f4\u9ad8\n        base_prob_purchase = 0.05\n        if user_segment == 'High Value': base_prob_purchase += 0.05\n        elif user_segment == 'Low Value': base_prob_purchase -= 0.02\n            \n        # \u4ef7\u683c\u5f71\u54cd (\u4ef7\u683c\u9002\u4e2d\u8d2d\u4e70\u7387\u9ad8)\n        if 50 &lt; prod_price &lt; 500: base_prob_purchase += 0.02\n        elif prod_price &gt; 1000: base_prob_purchase -= 0.03\n            \n        prob_view = 0.7\n        prob_cart = base_prob_purchase * 2 # \u52a0\u8d2d\u6982\u7387\u662f\u8d2d\u4e70\u7684\u4e24\u500d\n        \n        rand = random.random()\n        action = 'view'\n        if rand &lt; prob_cart:\n            action = 'add_to_cart'\n        if rand &lt; base_prob_purchase:\n            action = 'purchase'\n            \n        timestamp = datetime.now() - timedelta(days=random.randint(0, 365))\n        \n        interactions.append({\n            'user_id': user,\n            'product_id': product,\n            'action': action,\n            'timestamp': timestamp,\n            'product_category': prod_cat,\n            'product_price': prod_price,\n            'user_segment': user_segment,\n            'user_age_group': user_age\n        })\n    \n    df_interactions = pd.DataFrame(interactions)\n    \n    # \u4fdd\u5b58\u539f\u59cb\u6570\u636e\n    df_users.to_csv(f'{REPORT_PREFIX}_\u7528\u6237\u6570\u636e.csv', index=False, encoding='utf-8-sig')\n    df_products.to_csv(f'{REPORT_PREFIX}_\u5546\u54c1\u6570\u636e.csv', index=False, encoding='utf-8-sig')\n    df_interactions.to_csv(f'{REPORT_PREFIX}_\u4ea4\u4e92\u6570\u636e.csv', index=False, encoding='utf-8-sig')\n    print(\"\u6a21\u62df\u6570\u636e\u5df2\u751f\u6210\u5e76\u4fdd\u5b58\u3002\")\n    return df_users, df_products, df_interactions\n\n# --- \u573a\u666f\u5316\u8425\u9500 ---\n\ndef scenario_based_marketing(df_interactions, df_products, target_category='Electronics'):\n    \"\"\"\u57fa\u4e8e\u573a\u666f\u7684\u7b80\u5355\u8425\u9500\u63a8\u8350\"\"\"\n    print(f\"\\n--- \u573a\u666f\u5316\u8425\u9500\u793a\u4f8b (\u9488\u5bf9 {target_category} \u7c7b\u522b) ---\")\n    \n    # \u573a\u666f\uff1a\u7528\u6237\u6700\u8fd1\u6d4f\u89c8\/\u52a0\u8d2d\u4e86\u7535\u5b50\u4ea7\u54c1\u4f46\u672a\u8d2d\u4e70\n    # 1. \u627e\u51fa\u4e0e\u76ee\u6807\u7c7b\u522b\u76f8\u5173\u7684\u4ea4\u4e92\n    relevant_interactions = df_interactions&#91;df_interactions&#91;'product_category'] == target_category].copy()\n    \n    # 2. \u627e\u51fa\u6709'view'\u6216'add_to_cart'\u4f46\u6ca1\u6709'purchase'\u7684\u7528\u6237\n    user_actions = relevant_interactions.groupby(&#91;'user_id', 'action']).size().unstack(fill_value=0)\n    user_actions&#91;'has_viewed_or_carted'] = (user_actions&#91;'view'] &gt; 0) | (user_actions&#91;'add_to_cart'] &gt; 0)\n    user_actions&#91;'has_purchased'] = user_actions&#91;'purchase'] &gt; 0\n    users_to_target = user_actions&#91;\n        (user_actions&#91;'has_viewed_or_carted']) &amp; (~user_actions&#91;'has_purchased'])\n    ].index.tolist()\n    \n    print(f\"\u8bc6\u522b\u51fa {len(users_to_target)} \u540d\u5bf9 {target_category} \u611f\u5174\u8da3\u4f46\u672a\u8d2d\u4e70\u7684\u6f5c\u5728\u7528\u6237\u3002\")\n    \n    if not users_to_target:\n        print(\"\u5f53\u524d\u6570\u636e\u4e2d\u6ca1\u6709\u7b26\u5408\u6b64\u573a\u666f\u7684\u7528\u6237\u3002\")\n        return pd.DataFrame() # \u8fd4\u56de\u7a7aDataFrame\n\n    # 3. \u4e3a\u8fd9\u4e9b\u7528\u6237\u63a8\u8350\u540c\u7c7b\u522b\u7684\u5176\u4ed6\u5546\u54c1 (\u7b80\u5316\uff1a\u968f\u673a\u63a8\u8350\u540c\u4e00\u7c7b\u522b\u4e14\u4ef7\u683c\u76f8\u8fd1\u7684\u5546\u54c1)\n    recommendations = &#91;]\n    target_products = df_products&#91;df_products&#91;'category'] == target_category]&#91;'product_id'].tolist()\n    \n    for user in users_to_target&#91;:10]: # \u4ec5\u4e3a\u524d10\u540d\u7528\u6237\u751f\u6210\u793a\u4f8b\u63a8\u8350\n        # \u627e\u5230\u7528\u6237\u4ea4\u4e92\u8fc7\u7684\u540c\u7c7b\u5546\u54c1\u53ca\u5176\u4ef7\u683c\n        user_target_items = relevant_interactions&#91;relevant_interactions&#91;'user_id'] == user]&#91;'product_id'].unique()\n        if len(user_target_items) &gt; 0:\n            avg_price = df_products&#91;df_products&#91;'product_id'].isin(user_target_items)]&#91;'price'].mean()\n            # \u63a8\u8350\u540c\u4e00\u7c7b\u522b\u4f46\u7528\u6237\u672a\u4ea4\u4e92\u8fc7\u7684\u5546\u54c1\uff0c\u4e14\u4ef7\u683c\u63a5\u8fd1\n            candidate_prods = df_products&#91;\n                (df_products&#91;'category'] == target_category) &amp; \n                (~df_products&#91;'product_id'].isin(user_target_items)) &amp;\n                (df_products&#91;'price'].between(avg_price * 0.8, avg_price * 1.2))\n            ]&#91;'product_id'].tolist()\n            \n            if candidate_prods:\n                recommended_prod = random.choice(candidate_prods)\n                recommendations.append({\n                    'user_id': user,\n                    'recommended_product': recommended_prod,\n                    'reason': f'\u6d4f\u89c8\/\u52a0\u8d2d\u4e86{target_category}\u4f46\u672a\u8d2d\u4e70'\n                })\n            else:\n                # \u5982\u679c\u6ca1\u6709\u4ef7\u683c\u76f8\u8fd1\u7684\uff0c\u5c31\u968f\u673a\u63a8\u8350\u4e00\u4e2a\u540c\u7c7b\u5546\u54c1\n                other_prods = &#91;p for p in target_products if p not in user_target_items]\n                if other_prods:\n                     recommended_prod = random.choice(other_prods)\n                     recommendations.append({\n                        'user_id': user,\n                        'recommended_product': recommended_prod,\n                        'reason': f'\u6d4f\u89c8\/\u52a0\u8d2d\u4e86{target_category}\u4f46\u672a\u8d2d\u4e70 (\u65e0\u4ef7\u683c\u5339\u914d\u9879)'\n                    })\n    \n    df_recommendations = pd.DataFrame(recommendations)\n    if not df_recommendations.empty:\n        print(\"\u751f\u6210\u7684\u573a\u666f\u5316\u8425\u9500\u63a8\u8350\u793a\u4f8b:\")\n        print(df_recommendations.to_string(index=False))\n        df_recommendations.to_csv(f'{REPORT_PREFIX}_\u573a\u666f\u5316\u63a8\u8350\u793a\u4f8b.csv', index=False, encoding='utf-8-sig')\n    else:\n        print(\"\u672a\u80fd\u4e3a\u7528\u6237\u751f\u6210\u63a8\u8350\u3002\")\n        \n    return df_recommendations\n\n# --- \u7528\u6237\u884c\u4e3a\u9884\u6d4b ---\n\ndef predict_user_behavior(df_interactions, df_users, target_action='purchase'):\n    \"\"\"\u9884\u6d4b\u7528\u6237\u662f\u5426\u4f1a\u8fdb\u884c\u7279\u5b9a\u884c\u4e3a (\u5982\u8d2d\u4e70)\"\"\"\n    print(f\"\\n--- \u7528\u6237\u884c\u4e3a\u9884\u6d4b ({target_action}) ---\")\n    \n    # 1. \u7279\u5f81\u5de5\u7a0b\n    # \u7528\u6237\u7279\u5f81\n    user_features = df_users.copy()\n    le_segment = LabelEncoder()\n    le_age = LabelEncoder()\n    user_features&#91;'segment_encoded'] = le_segment.fit_transform(user_features&#91;'segment'])\n    user_features&#91;'age_group_encoded'] = le_age.fit_transform(user_features&#91;'age_group'])\n    user_features.drop(&#91;'segment', 'age_group'], axis=1, inplace=True)\n    \n    # \u884c\u4e3a\u7279\u5f81 (\u8fc7\u53bb30\u5929)\n    recent_date = df_interactions&#91;'timestamp'].max()\n    df_recent = df_interactions&#91;df_interactions&#91;'timestamp'] &gt; (recent_date - timedelta(days=30))]\n    \n    behavior_features = df_recent.groupby('user_id').agg(\n        total_views=('action', lambda x: sum(x == 'view')),\n        total_carts=('action', lambda x: sum(x == 'add_to_cart')),\n        total_purchases=('action', lambda x: sum(x == 'purchase')),\n        distinct_products_viewed=('product_id', 'nunique'),\n        avg_product_price_viewed=('product_price', 'mean')\n    ).reset_index()\n    behavior_features&#91;'avg_product_price_viewed'].fillna(0, inplace=True)\n    \n    # \u5408\u5e76\u7279\u5f81\n    df_model = pd.merge(user_features, behavior_features, on='user_id', how='left')\n    df_model.fillna(0, inplace=True) # \u586b\u5145\u6ca1\u6709\u8fd1\u671f\u884c\u4e3a\u7684\u7528\u6237\n    \n    # 2. \u6807\u7b7e\u6784\u5efa (\u7528\u6237\u5728\u672a\u6765\u4e00\u6bb5\u65f6\u95f4\u662f\u5426\u8d2d\u4e70)\n    # \u7b80\u5316\uff1a\u5982\u679c\u7528\u6237\u5728\u6570\u636e\u96c6\u4e2d\u6709\u4efb\u4f55\u8d2d\u4e70\u8bb0\u5f55\uff0c\u5219\u6807\u7b7e\u4e3a1\n    # \u5728\u66f4\u771f\u5b9e\u7684\u573a\u666f\u4e2d\uff0c\u4f1a\u5212\u5206\u8bad\u7ec3\/\u6d4b\u8bd5\u65f6\u95f4\u7a97\u53e3\n    user_purchase_counts = df_interactions&#91;df_interactions&#91;'action'] == target_action].groupby('user_id').size()\n    df_model&#91;'will_purchase'] = df_model&#91;'user_id'].isin(user_purchase_counts&#91;user_purchase_counts &gt; 0].index).astype(int)\n    \n    print(f\"\u6b63\u6837\u672c (\u4f1a{target_action}) \u6570\u91cf: {df_model&#91;'will_purchase'].sum()}\")\n    print(f\"\u8d1f\u6837\u672c (\u4e0d\u4f1a{target_action}) \u6570\u91cf: {(df_model&#91;'will_purchase'] == 0).sum()}\")\n    \n    # 3. \u51c6\u5907\u6a21\u578b\u6570\u636e\n    feature_cols = &#91;col for col in df_model.columns if col not in &#91;'user_id', 'will_purchase', 'gender']]\n    X = df_model&#91;feature_cols]\n    y = df_model&#91;'will_purchase']\n    \n    # \u5212\u5206\u8bad\u7ec3\u96c6\u548c\u6d4b\u8bd5\u96c6\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=RANDOM_SEED, stratify=y)\n    \n    # \u7279\u5f81\u7f29\u653e\n    scaler = StandardScaler()\n    X_train_scaled = scaler.fit_transform(X_train)\n    X_test_scaled = scaler.transform(X_test)\n    \n    # 4. \u8bad\u7ec3\u6a21\u578b (\u903b\u8f91\u56de\u5f52)\n    model = LogisticRegression(random_state=RANDOM_SEED, max_iter=1000)\n    model.fit(X_train_scaled, y_train)\n    \n    # 5. \u9884\u6d4b\u4e0e\u8bc4\u4f30\n    y_pred = model.predict(X_test_scaled)\n    y_pred_proba = model.predict_proba(X_test_scaled)&#91;:, 1] # \u83b7\u53d6\u6b63\u7c7b\u6982\u7387\n    \n    accuracy = accuracy_score(y_test, y_pred)\n    print(f\"\u6a21\u578b\u51c6\u786e\u7387: {accuracy:.4f}\")\n    print(\"\\n\u5206\u7c7b\u62a5\u544a:\")\n    print(classification_report(y_test, y_pred, target_names=&#91;'Will Not Purchase', 'Will Purchase']))\n    \n    # \u7ed8\u5236\u6df7\u6dc6\u77e9\u9635\n    cm = confusion_matrix(y_test, y_pred)\n    plt.figure(figsize=(8, 6))\n    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', \n                xticklabels=&#91;'Will Not Purchase', 'Will Purchase'], \n                yticklabels=&#91;'Will Not Purchase', 'Will Purchase'])\n    plt.title('\u7528\u6237\u8d2d\u4e70\u884c\u4e3a\u9884\u6d4b - \u6df7\u6dc6\u77e9\u9635')\n    plt.xlabel('\u9884\u6d4b\u6807\u7b7e')\n    plt.ylabel('\u771f\u5b9e\u6807\u7b7e')\n    cm_path = f'{REPORT_PREFIX}_\u6df7\u6dc6\u77e9\u9635.png'\n    plt.savefig(cm_path)\n    plt.close()\n    print(f\"\u6df7\u6dc6\u77e9\u9635\u56fe\u8868\u5df2\u4fdd\u5b58\u81f3: {cm_path}\")\n    \n    # 6. \u7279\u5f81\u91cd\u8981\u6027 (\u903b\u8f91\u56de\u5f52\u7cfb\u6570)\n    feature_importance = pd.DataFrame({\n        'feature': feature_cols,\n        'coefficient': model.coef_&#91;0]\n    }).sort_values(by='coefficient', key=abs, ascending=False)\n    \n    print(\"\\n\u7279\u5f81\u91cd\u8981\u6027 (\u903b\u8f91\u56de\u5f52\u7cfb\u6570):\")\n    print(feature_importance.to_string(index=False))\n    \n    plt.figure(figsize=(10, 6))\n    sns.barplot(data=feature_importance.head(10), x='coefficient', y='feature', palette='viridis')\n    plt.title('\u7528\u6237\u8d2d\u4e70\u884c\u4e3a\u9884\u6d4b - TOP 10 \u7279\u5f81\u91cd\u8981\u6027 (\u903b\u8f91\u56de\u5f52\u7cfb\u6570)')\n    plt.xlabel('\u7cfb\u6570\u503c')\n    plt.tight_layout()\n    feat_imp_path = f'{REPORT_PREFIX}_\u7279\u5f81\u91cd\u8981\u6027.png'\n    plt.savefig(feat_imp_path)\n    plt.close()\n    print(f\"\u7279\u5f81\u91cd\u8981\u6027\u56fe\u8868\u5df2\u4fdd\u5b58\u81f3: {feat_imp_path}\")\n    \n    return model, scaler, le_segment, le_age, feature_cols, accuracy, cm_path, feat_imp_path\n\n# --- \u62a5\u544a\u751f\u6210 ---\n\ndef generate_final_report(target_category, df_recommendations, model_accuracy, cm_chart, feat_imp_chart):\n    \"\"\"\u751f\u6210\u6700\u7ec8\u5206\u6790\u62a5\u544a\"\"\"\n    print(\"\\n--- \u6b63\u5728\u751f\u6210\u6700\u7ec8\u5206\u6790\u62a5\u544a ---\")\n    from datetime import datetime\n    report_filename = f\"{REPORT_PREFIX}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt\"\n    \n    with open(report_filename, 'w', encoding='utf-8') as f:\n        f.write(\"=\" * 50 + \"\\n\")\n        f.write(\"        \u7535\u5546\u5e73\u53f0\u573a\u666f\u5316\u8425\u9500\u4e0e\u7528\u6237\u884c\u4e3a\u9884\u6d4b\u62a5\u544a\\n\")\n        f.write(f\"        \u751f\u6210\u65f6\u95f4: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\\n\")\n        f.write(\"=\" * 50 + \"\\n\\n\")\n\n        f.write(\"--- 1. \u573a\u666f\u5316\u8425\u9500\u5206\u6790 ---\\n\")\n        f.write(f\"\u573a\u666f\u5b9a\u4e49: \u8bc6\u522b\u51fa\u5bf9 '{target_category}' \u7c7b\u522b\u611f\u5174\u8da3\uff08\u901a\u8fc7\u6d4f\u89c8\u6216\u52a0\u8d2d\uff09\u4f46\u5c1a\u672a\u8d2d\u4e70\u7684\u7528\u6237\u3002\\n\")\n        f.write(f\"\u8bc6\u522b\u7ed3\u679c: \u5171\u627e\u5230 {len(df_recommendations)} \u540d\u6f5c\u5728\u76ee\u6807\u7528\u6237 (\u793a\u4f8b\u5c55\u793a\u4e86\u524d10\u540d)\u3002\\n\")\n        f.write(\"\u8425\u9500\u7b56\u7565: \u9488\u5bf9\u8fd9\u4e9b\u7528\u6237\uff0c\u63a8\u8350\u540c\u4e00\u7c7b\u522b\u4e0b\u4ed6\u4eec\u672a\u6d4f\u89c8\/\u8d2d\u4e70\u8fc7\u4e14\u4ef7\u683c\u76f8\u8fd1\u7684\u5546\u54c1\uff0c\u4ee5\u4fc3\u8fdb\u8f6c\u5316\u3002\\n\")\n        f.write(\"\u793a\u4f8b\u63a8\u8350\u5217\u8868\u5df2\u4fdd\u5b58\u81f3 CSV \u6587\u4ef6\u3002\\n\\n\")\n\n        f.write(\"--- 2. \u7528\u6237\u884c\u4e3a\u9884\u6d4b\u6a21\u578b ---\\n\")\n        f.write(\"\u6a21\u578b\u76ee\u6807: \u9884\u6d4b\u7528\u6237\u5728\u672a\u6765\u662f\u5426\u4f1a\u8fdb\u884c\u8d2d\u4e70\u884c\u4e3a\u3002\\n\")\n        f.write(\"\u6a21\u578b\u7b97\u6cd5: \u903b\u8f91\u56de\u5f52 (Logistic Regression)\u3002\\n\")\n        f.write(\"\u6a21\u578b\u8f93\u5165\u7279\u5f81: \u7528\u6237\u5206\u7fa4\u3001\u5e74\u9f84\u3001\u8fd1\u671f\u6d4f\u89c8\/\u52a0\u8d2d\/\u8d2d\u4e70\u6b21\u6570\u3001\u6d4f\u89c8\u5546\u54c1\u7684\u5e73\u5747\u4ef7\u683c\u7b49\u3002\\n\")\n        f.write(f\"\u6a21\u578b\u5728\u6d4b\u8bd5\u96c6\u4e0a\u7684\u51c6\u786e\u7387: {model_accuracy:.4f}\\n\")\n        f.write(\"\u6a21\u578b\u8bc4\u4f30: \u8bf7\u7ed3\u5408\u5206\u7c7b\u62a5\u544a\u548c\u6df7\u6dc6\u77e9\u9635\u8fdb\u884c\u8be6\u7ec6\u5206\u6790\u3002\\n\")\n        f.write(f\"\u6df7\u6dc6\u77e9\u9635\u56fe\u8868: {cm_chart}\\n\")\n        f.write(f\"\u7279\u5f81\u91cd\u8981\u6027\u56fe\u8868: {feat_imp_chart}\\n\")\n        f.write(\"\u6a21\u578b\u5e94\u7528: \u53ef\u4ee5\u8ba1\u7b97\u6240\u6709\u7528\u6237\u7684\u8d2d\u4e70\u6982\u7387\uff0c\u5bf9\u9ad8\u6982\u7387\u7528\u6237\u8fdb\u884c\u7cbe\u51c6\u8425\u9500\uff0c\u5bf9\u4f4e\u6982\u7387\u7528\u6237\u5206\u6790\u539f\u56e0\u6216\u5c1d\u8bd5\u6fc0\u6d3b\u3002\\n\\n\")\n\n        f.write(\"--- 3. \u603b\u7ed3\u4e0e\u5efa\u8bae ---\\n\")\n        f.write(\"1. \u573a\u666f\u5316\u8425\u9500: \u901a\u8fc7\u8bc6\u522b\u7528\u6237\u7684\u5177\u4f53\u884c\u4e3a\u573a\u666f\uff08\u5982\u6d4f\u89c8\u672a\u8d2d\uff09\uff0c\u53ef\u4ee5\u63d0\u4f9b\u66f4\u53ca\u65f6\u548c\u76f8\u5173\u7684\u63a8\u8350\uff0c\u63d0\u9ad8\u8f6c\u5316\u7387\u3002\\n\")\n        f.write(\"2. \u884c\u4e3a\u9884\u6d4b: \u673a\u5668\u5b66\u4e60\u6a21\u578b\u80fd\u591f\u91cf\u5316\u7528\u6237\u8d2d\u4e70\u7684\u53ef\u80fd\u6027\uff0c\u4e3a\u8425\u9500\u8d44\u6e90\u5206\u914d\u548c\u7528\u6237\u5206\u5c42\u8fd0\u8425\u63d0\u4f9b\u6570\u636e\u652f\u6301\u3002\\n\")\n        f.write(\"3. \u6570\u636e\u9a71\u52a8: \u6301\u7eed\u6536\u96c6\u548c\u5206\u6790\u7528\u6237\u884c\u4e3a\u6570\u636e\u662f\u4f18\u5316\u8425\u9500\u7b56\u7565\u548c\u63d0\u5347\u9884\u6d4b\u6a21\u578b\u6548\u679c\u7684\u5173\u952e\u3002\\n\")\n        f.write(\"4. \u6a21\u578b\u8fed\u4ee3: \u968f\u7740\u4e1a\u52a1\u53d1\u5c55\u548c\u6570\u636e\u79ef\u7d2f\uff0c\u5e94\u5b9a\u671f\u91cd\u65b0\u8bad\u7ec3\u548c\u8bc4\u4f30\u9884\u6d4b\u6a21\u578b\uff0c\u4ee5\u4fdd\u6301\u5176\u51c6\u786e\u6027\u3002\\n\\n\")\n\n        f.write(\"=\" * 50 + \"\\n\")\n        f.write(\"                    \u62a5\u544a\u7ed3\u675f\\n\")\n        f.write(\"=\" * 50 + \"\\n\")\n\n    print(f\"\u6700\u7ec8\u5206\u6790\u62a5\u544a\u5df2\u751f\u6210: {report_filename}\")\n\n# --- \u4e3b\u51fd\u6570 ---\n\ndef main():\n    \"\"\"\u4e3b\u51fd\u6570\"\"\"\n    # 1. \u751f\u6210\u6570\u636e\n    df_users, df_products, df_interactions = generate_sample_data(NUM_USERS, NUM_PRODUCTS, NUM_INTERACTIONS)\n    \n    # 2. \u573a\u666f\u5316\u8425\u9500\n    target_category = 'Electronics'\n    df_recommendations = scenario_based_marketing(df_interactions, df_products, target_category)\n    \n    # 3. \u7528\u6237\u884c\u4e3a\u9884\u6d4b\n    model, scaler, le_segment, le_age, feature_cols, accuracy, cm_path, feat_imp_path = predict_user_behavior(df_interactions, df_users)\n    \n    # 4. \u751f\u6210\u62a5\u544a\n    generate_final_report(target_category, df_recommendations, accuracy, cm_path, feat_imp_path)\n    \n    print(\"\\n\u5206\u6790\u6d41\u7a0b\u5b8c\u6210\u3002\")\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5f00\u53d1\u601d\u8def:\u7ed3\u5408\u7528\u6237\u753b\u50cf\uff08\u5206\u7fa4\u3001\u5e74\u9f84\uff09\u548c\u8fd1\u671f\u884c\u4e3a\uff08\u6d4f\u89c8\u3001\u52a0\u8d2d\u3001\u8d2d\u4e70\u6b21\u6570\uff0c\u6d4f\u89c8\u5546\u54c1\u5747\u4ef7\u7b49\uff09\u6784\u5efa\u7279\u5f81,\u6c47\u603b&hellip; <a href=\"http:\/\/viplao.com\/index.php\/2025\/09\/13\/%e3%80%90python%e5%ae%9e%e8%b7%b5%e6%a1%88%e4%be%8b%e3%80%91%e7%94%b5%e5%95%86%e5%b9%b3%e5%8f%b0%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e5%92%8c%e6%8c%96%e6%8e%98-%e7%94%a8%e6%88%b7%e8%a1%8c%e4%b8%ba-2\/\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">\u3010Python\u5b9e\u8df5\u6848\u4f8b\u3011\u7535\u5546\u5e73\u53f0\u6570\u636e\u5206\u6790\u548c\u6316\u6398 &#8211;  \u7528\u6237\u884c\u4e3a\u9884\u6d4b<\/span><i class=\"fa fa-arrow-right\"><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[28],"views":423,"_links":{"self":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/3893"}],"collection":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/comments?post=3893"}],"version-history":[{"count":2,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/3893\/revisions"}],"predecessor-version":[{"id":3911,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/3893\/revisions\/3911"}],"wp:attachment":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/media?parent=3893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/categories?post=3893"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/tags?post=3893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}