{"id":4223,"date":"2026-03-01T10:13:17","date_gmt":"2026-03-01T02:13:17","guid":{"rendered":"http:\/\/viplao.com\/?p=4223"},"modified":"2026-03-01T10:13:19","modified_gmt":"2026-03-01T02:13:19","slug":"%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90","status":"publish","type":"post","link":"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/","title":{"rendered":"\u6570\u636e\u6280\u80fd\uff08SKILLS\uff09 \uff1aDay 5\uff1a\u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\u4e0eRFM\u5206\u6790"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_71 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u6587\u7ae0\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/#%E8%AF%BE%E7%A8%8B%E7%9B%AE%E6%A0%87\" title=\"\u8bfe\u7a0b\u76ee\u6807\">\u8bfe\u7a0b\u76ee\u6807<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/#%E6%A0%B8%E5%BF%83%E6%8A%80%E8%83%BD\" title=\"\u6838\u5fc3\u6280\u80fd\">\u6838\u5fc3\u6280\u80fd<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/#%E8%AF%BE%E4%BB%B6%E5%86%85%E5%AE%B9\" title=\"\u8bfe\u4ef6\u5185\u5bb9\">\u8bfe\u4ef6\u5185\u5bb9<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/#1_%E7%94%B5%E5%95%86%E6%A0%B8%E5%BF%83%E6%8C%87%E6%A0%87%E8%AE%A1%E7%AE%97\" title=\"1. \u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\">1. \u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/#%E5%AE%89%E8%A3%85%E8%A6%81%E6%B1%82\" title=\"\u5b89\u88c5\u8981\u6c42\">\u5b89\u88c5\u8981\u6c42<\/a><\/li><\/ul><\/nav><\/div>\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E8%AF%BE%E7%A8%8B%E7%9B%AE%E6%A0%87\"><\/span><strong>\u8bfe\u7a0b\u76ee\u6807<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>\u638c\u63e1\u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\u3001\u7528\u6237\u4ef7\u503cRFM\u5206\u6790\u3001\u9500\u552e\u6f0f\u6597\u5206\u6790\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E6%A0%B8%E5%BF%83%E6%8A%80%E8%83%BD\"><\/span><strong>\u6838\u5fc3\u6280\u80fd<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul>\n<li>\u7535\u5546\u6838\u5fc3KPI\u8ba1\u7b97\uff08GMV\u3001\u8f6c\u5316\u7387\u3001\u5ba2\u5355\u4ef7\u7b49\uff09<\/li>\n\n\n\n<li>RFM\u7528\u6237\u4ef7\u503c\u5206\u5c42<\/li>\n\n\n\n<li>\u9500\u552e\u6f0f\u6597\u5206\u6790<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E8%AF%BE%E4%BB%B6%E5%86%85%E5%AE%B9\"><\/span><strong>\u8bfe\u4ef6\u5185\u5bb9<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<h4 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_%E7%94%B5%E5%95%86%E6%A0%B8%E5%BF%83%E6%8C%87%E6%A0%87%E8%AE%A1%E7%AE%97\"><\/span><strong>1. \u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\">python<code># \u5b89\u88c5\u4f9d\u8d56\uff1apip install pandas numpy matplotlib seaborn\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nfrom datetime import datetime, timedelta\n\nclass EcommerceMetrics:\n    def __init__(self, order_data, user_data=None, product_data=None):\n        \"\"\"\n        \u521d\u59cb\u5316\u7535\u5546\u6307\u6807\u8ba1\u7b97\u5668\n        \n        \u53c2\u6570:\n        order_data: \u8ba2\u5355\u6570\u636e\n        user_data: \u7528\u6237\u6570\u636e\uff08\u53ef\u9009\uff09\n        product_data: \u5546\u54c1\u6570\u636e\uff08\u53ef\u9009\uff09\n        \"\"\"\n        self.order_data = order_data.copy()\n        self.user_data = user_data.copy() if user_data is not None else None\n        self.product_data = product_data.copy() if product_data is not None else None\n        \n        # \u9884\u5904\u7406\uff1a\u786e\u4fdd\u65e5\u671f\u683c\u5f0f\n        if 'order_date' in self.order_data.columns:\n            self.order_data['order_date'] = pd.to_datetime(self.order_data['order_date'])\n        \n        # \u8ba1\u7b97\u8ba2\u5355\u91d1\u989d\n        if 'quantity' in self.order_data.columns and 'unit_price' in self.order_data.columns:\n            self.order_data['order_amount'] = self.order_data['quantity'] * self.order_data['unit_price']\n    \n    def calculate_basic_metrics(self, start_date=None, end_date=None):\n        \"\"\"\u8ba1\u7b97\u57fa\u7840\u7535\u5546\u6307\u6807\"\"\"\n        # \u8fc7\u6ee4\u65f6\u95f4\u8303\u56f4\n        if start_date and end_date:\n            mask = (self.order_data['order_date'] &gt;= pd.to_datetime(start_date)) &amp; \\\n                   (self.order_data['order_date'] &lt;= pd.to_datetime(end_date))\n            filtered_data = self.order_data[mask]\n        else:\n            filtered_data = self.order_data\n        \n        # \u786e\u4fdd\u6709\u8ba2\u5355\u91d1\u989d\u5217\n        if 'order_amount' not in filtered_data.columns:\n            if 'quantity' in filtered_data.columns and 'unit_price' in filtered_data.columns:\n                filtered_data['order_amount'] = filtered_data['quantity'] * filtered_data['unit_price']\n            else:\n                raise ValueError(\"\u8ba2\u5355\u6570\u636e\u9700\u8981\u5305\u542bquantity\u548cunit_price\u5217\u6765\u8ba1\u7b97\u91d1\u989d\")\n        \n        metrics = {}\n        \n        # 1. GMV\uff08\u603b\u4ea4\u6613\u989d\uff09\n        metrics['gmv'] = filtered_data['order_amount'].sum()\n        \n        # 2. \u8ba2\u5355\u6570\u91cf\n        metrics['order_count'] = len(filtered_data)\n        \n        # 3. \u7528\u6237\u6570\u91cf\uff08\u53bb\u91cd\uff09\n        if 'user_id' in filtered_data.columns:\n            metrics['user_count'] = filtered_data['user_id'].nunique()\n        else:\n            metrics['user_count'] = None\n        \n        # 4. \u5ba2\u5355\u4ef7\uff08\u5e73\u5747\u8ba2\u5355\u91d1\u989d\uff09\n        metrics['avg_order_value'] = metrics['gmv'] \/ metrics['order_count'] if metrics['order_count'] &gt; 0 else 0\n        \n        # 5. \u4eba\u5747\u8ba2\u5355\u6570\n        if metrics['user_count']:\n            metrics['orders_per_user'] = metrics['order_count'] \/ metrics['user_count']\n        else:\n            metrics['orders_per_user'] = None\n        \n        # 6. \u8f6c\u5316\u7387\uff08\u5982\u679c\u6709\u8bbf\u95ee\u6570\u636e\uff09\n        # \u8fd9\u91cc\u5047\u8bbe\u6709\u8bbf\u95ee\u6570\u636e\uff0c\u5b9e\u9645\u4e2d\u9700\u8981\u7ed3\u5408UV\u6570\u636e\n        \n        # 7. \u9000\u8d27\u7387\uff08\u5982\u679c\u6709\u9000\u8d27\u72b6\u6001\uff09\n        if 'order_status' in filtered_data.columns:\n            returned_orders = filtered_data[filtered_data['order_status'].str.contains('\u9000\u8d27|\u9000\u6b3e', na=False)]\n            metrics['return_rate'] = len(returned_orders) \/ metrics['order_count'] if metrics['order_count'] &gt; 0 else 0\n        else:\n            metrics['return_rate'] = None\n        \n        # 8. \u70ed\u95e8\u5546\u54c1\n        if 'product_id' in filtered_data.columns:\n            product_stats = filtered_data.groupby('product_id').agg({\n                'order_amount': 'sum',\n                'quantity': 'sum',\n                'order_id': 'count'\n            }).rename(columns={\n                'order_amount': 'sales_amount',\n                'quantity': 'sales_quantity',\n                'order_id': 'order_count'\n            }).sort_values('sales_amount', ascending=False)\n            metrics['top_products'] = product_stats.head(10)\n        \n        # 9. \u9500\u552e\u8d8b\u52bf\n        if 'order_date' in filtered_data.columns:\n            daily_sales = filtered_data.groupby(filtered_data['order_date'].dt.date).agg({\n                'order_amount': 'sum',\n                'order_id': 'count'\n            }).rename(columns={\n                'order_amount': 'daily_gmv',\n                'order_id': 'daily_orders'\n            })\n            metrics['daily_trend'] = daily_sales\n        \n        return metrics\n    \n    def calculate_rfm_metrics(self, analysis_date=None):\n        \"\"\"\u8ba1\u7b97RFM\u6307\u6807\"\"\"\n        if analysis_date is None:\n            analysis_date = self.order_data['order_date'].max()\n        else:\n            analysis_date = pd.to_datetime(analysis_date)\n        \n        # \u786e\u4fdd\u6709user_id\u548corder_amount\n        required_cols = ['user_id', 'order_date', 'order_amount']\n        for col in required_cols:\n            if col not in self.order_data.columns:\n                raise ValueError(f\"\u8ba2\u5355\u6570\u636e\u9700\u8981\u5305\u542b{col}\u5217\u6765\u8ba1\u7b97RFM\")\n        \n        # \u6309\u7528\u6237\u805a\u5408\n        user_stats = self.order_data.groupby('user_id').agg({\n            'order_date': lambda x: (analysis_date - x.max()).days,  # R: \u6700\u8fd1\u8d2d\u4e70\u5929\u6570\n            'order_id': 'count',  # F: \u8d2d\u4e70\u9891\u7387\n            'order_amount': 'sum'  # M: \u8d2d\u4e70\u91d1\u989d\n        }).rename(columns={\n            'order_date': 'recency',\n            'order_id': 'frequency',\n            'order_amount': 'monetary'\n        }).reset_index()\n        \n        # RFM\u6253\u5206\uff081-5\u5206\uff0c5\u5206\u6700\u597d\uff09\n        # R\u503c\uff1a\u6700\u8fd1\u8d2d\u4e70\u5929\u6570\u8d8a\u5c0f\u8d8a\u597d\n        user_stats['R_score'] = pd.qcut(user_stats['recency'], 5, labels=[5, 4, 3, 2, 1])\n        \n        # F\u503c\uff1a\u8d2d\u4e70\u9891\u7387\u8d8a\u9ad8\u8d8a\u597d\n        user_stats['F_score'] = pd.qcut(user_stats['frequency'], 5, labels=[1, 2, 3, 4, 5])\n        \n        # M\u503c\uff1a\u8d2d\u4e70\u91d1\u989d\u8d8a\u9ad8\u8d8a\u597d\n        user_stats['M_score'] = pd.qcut(user_stats['monetary'], 5, labels=[1, 2, 3, 4, 5])\n        \n        # \u8f6c\u6362\u4e3a\u6570\u503c\u578b\n        user_stats['R_score'] = user_stats['R_score'].astype(int)\n        user_stats['F_score'] = user_stats['F_score'].astype(int)\n        user_stats['M_score'] = user_stats['M_score'].astype(int)\n        \n        # \u8ba1\u7b97RFM\u603b\u5206\n        user_stats['RFM_score'] = user_stats['R_score'] + user_stats['F_score'] + user_stats['M_score']\n        \n        # RFM\u5206\u6bb5\n        def segment_rfm(row):\n            if row['R_score'] &gt;= 4 and row['F_score'] &gt;= 4 and row['M_score'] &gt;= 4:\n                return '\u91cd\u8981\u4ef7\u503c\u5ba2\u6237'\n            elif row['R_score'] &gt;= 4 and row['F_score'] &lt; 4 and row['M_score'] &gt;= 4:\n                return '\u91cd\u8981\u53d1\u5c55\u5ba2\u6237'\n            elif row['R_score'] &lt; 4 and row['F_score'] &gt;= 4 and row['M_score'] &gt;= 4:\n                return '\u91cd\u8981\u4fdd\u6301\u5ba2\u6237'\n            elif row['R_score'] &lt; 4 and row['F_score'] &lt; 4 and row['M_score'] &gt;= 4:\n                return '\u91cd\u8981\u633d\u7559\u5ba2\u6237'\n            elif row['R_score'] &gt;= 4 and row['F_score'] &gt;= 4 and row['M_score'] &lt; 4:\n                return '\u4e00\u822c\u4ef7\u503c\u5ba2\u6237'\n            elif row['R_score'] &gt;= 4 and row['F_score'] &lt; 4 and row['M_score'] &lt; 4:\n                return '\u4e00\u822c\u53d1\u5c55\u5ba2\u6237'\n            elif row['R_score'] &lt; 4 and row['F_score'] &gt;= 4 and row['M_score'] &lt; 4:\n                return '\u4e00\u822c\u4fdd\u6301\u5ba2\u6237'\n            else:\n                return '\u4e00\u822c\u633d\u7559\u5ba2\u6237'\n        \n        user_stats['RFM_segment'] = user_stats.apply(segment_rfm, axis=1)\n        \n        return user_stats\n    \n    def analyze_sales_funnel(self, funnel_stages=None):\n        \"\"\"\u5206\u6790\u9500\u552e\u6f0f\u6597\"\"\"\n        if funnel_stages is None:\n            # \u9ed8\u8ba4\u6f0f\u6597\u9636\u6bb5\n            funnel_stages = {\n                '\u6d4f\u89c8\u5546\u54c1': 10000,  # \u5047\u8bbe\u6570\u636e\n                '\u52a0\u5165\u8d2d\u7269\u8f66': 5000,\n                '\u751f\u6210\u8ba2\u5355': 3000,\n                '\u5b8c\u6210\u652f\u4ed8': 2500,\n                '\u786e\u8ba4\u6536\u8d27': 2300\n            }\n        \n        funnel_data = pd.DataFrame({\n            'stage': list(funnel_stages.keys()),\n            'count': list(funnel_stages.values())\n        })\n        \n        # \u8ba1\u7b97\u8f6c\u5316\u7387\n        funnel_data['conversion_rate'] = (funnel_data['count'] \/ funnel_data['count'].iloc[0] * 100).round(2)\n        funnel_data['stage_conversion'] = (funnel_data['count'].shift(-1) \/ funnel_data['count'] * 100).round(2)\n        funnel_data.loc[len(funnel_data)-1, 'stage_conversion'] = 100  # \u6700\u540e\u9636\u6bb5\n        \n        return funnel_data\n    \n    def visualize_metrics(self, metrics):\n        \"\"\"\u53ef\u89c6\u5316\u6307\u6807\"\"\"\n        fig, axes = plt.subplots(2, 2, figsize=(15, 10))\n        \n        # 1. \u9500\u552e\u8d8b\u52bf\u56fe\n        if 'daily_trend' in metrics:\n            ax1 = axes[0, 0]\n            metrics['daily_trend']['daily_gmv'].plot(ax=ax1, color='blue', marker='o')\n            ax1.set_title('\u6bcf\u65e5GMV\u8d8b\u52bf', fontsize=12, fontweight='bold')\n            ax1.set_xlabel('\u65e5\u671f')\n            ax1.set_ylabel('GMV')\n            ax1.grid(True, alpha=0.3)\n        \n        # 2. \u70ed\u95e8\u5546\u54c1\n        if 'top_products' in metrics:\n            ax2 = axes[0, 1]\n            metrics['top_products'].head(5)['sales_amount'].plot(\n                kind='bar', ax=ax2, color='green'\n            )\n            ax2.set_title('Top 5\u5546\u54c1\u9500\u552e\u989d', fontsize=12, fontweight='bold')\n            ax2.set_xlabel('\u5546\u54c1ID')\n            ax2.set_ylabel('\u9500\u552e\u989d')\n            ax2.tick_params(axis='x', rotation=45)\n        \n        # 3. RFM\u5206\u5e03\n        if hasattr(self, 'rfm_data'):\n            ax3 = axes[1, 0]\n            segment_counts = self.rfm_data['RFM_segment'].value_counts()\n            segment_counts.plot(kind='pie', ax=ax3, autopct='%1.1f%%')\n            ax3.set_title('RFM\u7528\u6237\u5206\u7fa4\u5206\u5e03', fontsize=12, fontweight='bold')\n            ax3.set_ylabel('')\n        \n        # 4. \u6f0f\u6597\u56fe\n        if hasattr(self, 'funnel_data'):\n            ax4 = axes[1, 1]\n            stages = self.funnel_data['stage']\n            rates = self.funnel_data['conversion_rate']\n            \n            ax4.barh(stages, rates, color='orange')\n            ax4.set_title('\u9500\u552e\u6f0f\u6597\u8f6c\u5316\u7387', fontsize=12, fontweight='bold')\n            ax4.set_xlabel('\u8f6c\u5316\u7387 (%)')\n            \n            # \u6dfb\u52a0\u6570\u503c\u6807\u7b7e\n            for i, v in enumerate(rates):\n                ax4.text(v + 1, i, f'{v}%', va='center')\n        \n        plt.tight_layout()\n        plt.show()\n    \n    def generate_report(self, start_date=None, end_date=None):\n        \"\"\"\u751f\u6210\u5b8c\u6574\u5206\u6790\u62a5\u544a\"\"\"\n        print(\"=\"*60)\n        print(\"\u7535\u5546\u6570\u636e\u5206\u6790\u62a5\u544a\")\n        print(\"=\"*60)\n        \n        # \u8ba1\u7b97\u57fa\u7840\u6307\u6807\n        print(\"\\n1. \u6838\u5fc3\u4e1a\u52a1\u6307\u6807:\")\n        print(\"-\"*40)\n        metrics = self.calculate_basic_metrics(start_date, end_date)\n        \n        print(f\"\ud83d\udcca GMV\uff08\u603b\u4ea4\u6613\u989d\uff09: \u00a5{metrics['gmv']:,.2f}\")\n        print(f\"\ud83d\udce6 \u8ba2\u5355\u6570\u91cf: {metrics['order_count']:,}\")\n        print(f\"\ud83d\udc65 \u7528\u6237\u6570\u91cf: {metrics['user_count']:,}\")\n        print(f\"\ud83d\udcb0 \u5ba2\u5355\u4ef7: \u00a5{metrics['avg_order_value']:,.2f}\")\n        \n        if metrics['orders_per_user']:\n            print(f\"\ud83d\uded2 \u4eba\u5747\u8ba2\u5355\u6570: {metrics['orders_per_user']:.2f}\")\n        \n        if metrics['return_rate']:\n            print(f\"\u21a9\ufe0f  \u9000\u8d27\u7387: {metrics['return_rate']:.2%}\")\n        \n        # RFM\u5206\u6790\n        print(\"\\n2. RFM\u7528\u6237\u4ef7\u503c\u5206\u6790:\")\n        print(\"-\"*40)\n        rfm_data = self.calculate_rfm_metrics()\n        self.rfm_data = rfm_data\n        \n        segment_dist = rfm_data['RFM_segment'].value_counts()\n        print(\"\u7528\u6237\u5206\u7fa4\u5206\u5e03:\")\n        for segment, count in segment_dist.items():\n            percentage = (count \/ len(rfm_data) * 100)\n            print(f\"  {segment}: {count}\u4eba ({percentage:.1f}%)\")\n        \n        # \u9500\u552e\u6f0f\u6597\n        print(\"\\n3. \u9500\u552e\u6f0f\u6597\u5206\u6790:\")\n        print(\"-\"*40)\n        funnel_data = self.analyze_sales_funnel()\n        self.funnel_data = funnel_data\n        \n        for _, row in funnel_data.iterrows():\n            print(f\"  {row['stage']}: {row['count']}\u4eba | \"\n                  f\"\u603b\u4f53\u8f6c\u5316\u7387: {row['conversion_rate']}% | \"\n                  f\"\u9636\u6bb5\u8f6c\u5316\u7387: {row['stage_conversion']}%\")\n        \n        # \u53ef\u89c6\u5316\n        print(\"\\n4. \u6570\u636e\u53ef\u89c6\u5316\u751f\u6210\u4e2d...\")\n        self.visualize_metrics(metrics)\n        \n        return {\n            'basic_metrics': metrics,\n            'rfm_data': rfm_data,\n            'funnel_data': funnel_data\n        }\n\n# \u6848\u4f8b\u6570\u636e\u811a\u672c\ndef create_ecommerce_sample_data():\n    \"\"\"\u751f\u6210\u7535\u5546\u5206\u6790\u793a\u4f8b\u6570\u636e\"\"\"\n    np.random.seed(42)\n    \n    # \u751f\u6210\u66f4\u4e30\u5bcc\u7684\u8ba2\u5355\u6570\u636e\n    n_orders = 1000\n    user_ids = np.random.choice(range(1001, 1101), n_orders)\n    product_ids = np.random.choice(['P001', 'P002', 'P003', 'P004', 'P005', \n                                   'P006', 'P007', 'P008', 'P009', 'P010'], n_orders)\n    \n    order_data = pd.DataFrame({\n        'order_id': range(10001, 10001 + n_orders),\n        'user_id': user_ids,\n        'order_date': pd.date_range('2024-01-01', periods=n_orders, freq='H'),\n        'product_id': product_ids,\n        'quantity': np.random.randint(1, 5, n_orders),\n        'unit_price': np.random.uniform(50, 2000, n_orders).round(2),\n        'order_status': np.random.choice(['\u5df2\u5b8c\u6210', '\u5df2\u53d1\u8d27', '\u5f85\u4ed8\u6b3e', '\u5df2\u53d6\u6d88', '\u5df2\u9000\u8d27'], \n                                        n_orders, p=[0.7, 0.15, 0.05, 0.05, 0.05])\n    })\n    \n    # \u6253\u4e71\u65e5\u671f\n    order_data['order_date'] = order_data['order_date'].sample(frac=1).reset_index(drop=True)\n    \n    # \u7528\u6237\u6570\u636e\n    user_data = pd.DataFrame({\n        'user_id': range(1001, 1101),\n        'registration_date': pd.date_range('2023-06-01', periods=100),\n        'user_level': np.random.choice(['\u9752\u94dc', '\u767d\u94f6', '\u9ec4\u91d1', '\u94c2\u91d1', '\u94bb\u77f3'], 100, \n                                      p=[0.3, 0.25, 0.2, 0.15, 0.1]),\n        'city': np.random.choice(['\u5317\u4eac', '\u4e0a\u6d77', '\u5e7f\u5dde', '\u6df1\u5733', '\u676d\u5dde', '\u6210\u90fd', '\u6b66\u6c49', '\u5357\u4eac'], 100)\n    })\n    \n    # \u5546\u54c1\u6570\u636e\n    product_data = pd.DataFrame({\n        'product_id': [f'P{str(i).zfill(3)}' for i in range(1, 11)],\n        'product_name': ['\u667a\u80fd\u624b\u673a', '\u7b14\u8bb0\u672c\u7535\u8111', '\u65e0\u7ebf\u8033\u673a', '\u667a\u80fd\u624b\u8868', '\u5e73\u677f\u7535\u8111',\n                        '\u6570\u7801\u76f8\u673a', '\u6e38\u620f\u4e3b\u673a', '\u663e\u793a\u5668', '\u952e\u76d8\u9f20\u6807', '\u79fb\u52a8\u786c\u76d8'],\n        'category': ['\u7535\u5b50\u4ea7\u54c1', '\u7535\u5b50\u4ea7\u54c1', '\u914d\u4ef6', '\u7535\u5b50\u4ea7\u54c1', '\u7535\u5b50\u4ea7\u54c1',\n                    '\u7535\u5b50\u4ea7\u54c1', '\u7535\u5b50\u4ea7\u54c1', '\u914d\u4ef6', '\u914d\u4ef6', '\u914d\u4ef6'],\n        'brand': ['\u54c1\u724cA', '\u54c1\u724cB', '\u54c1\u724cC', '\u54c1\u724cD', '\u54c1\u724cE',\n                 '\u54c1\u724cF', '\u54c1\u724cG', '\u54c1\u724cH', '\u54c1\u724cI', '\u54c1\u724cJ'],\n        'cost_price': [1999, 5999, 299, 1299, 2999, 3999, 3499, 899, 199, 499],\n        'market_price': [2499, 6999, 399, 1599, 3499, 4999, 3999, 1299, 299, 699]\n    })\n    \n    # \u4fdd\u5b58\u6570\u636e\n    order_data.to_csv('ecommerce_orders.csv', index=False, encoding='utf-8')\n    user_data.to_csv('ecommerce_users.csv', index=False, encoding='utf-8')\n    product_data.to_csv('ecommerce_products.csv', index=False, encoding='utf-8')\n    \n    print(\"\u2705 \u7535\u5546\u793a\u4f8b\u6570\u636e\u5df2\u751f\u6210:\")\n    print(f\"  \u8ba2\u5355\u6570\u636e: {order_data.shape}\")\n    print(f\"  \u7528\u6237\u6570\u636e: {user_data.shape}\")\n    print(f\"  \u5546\u54c1\u6570\u636e: {product_data.shape}\")\n    \n    return order_data, user_data, product_data\n\n# \u8fd0\u884c\u793a\u4f8b\nif __name__ == \"__main__\":\n    print(\"=\"*60)\n    print(\"Day 5: \u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\u4e0eRFM\u5206\u6790\")\n    print(\"=\"*60)\n    \n    # 1. \u751f\u6210\u793a\u4f8b\u6570\u636e\n    print(\"\\n\u6b65\u9aa41: \u751f\u6210\u7535\u5546\u793a\u4f8b\u6570\u636e...\")\n    order_df, user_df, product_df = create_ecommerce_sample_data()\n    \n    # 2. \u521d\u59cb\u5316\u5206\u6790\u5668\n    print(\"\\n\u6b65\u9aa42: \u521d\u59cb\u5316\u7535\u5546\u6307\u6807\u5206\u6790\u5668...\")\n    analyzer = EcommerceMetrics(order_df, user_df, product_df)\n    \n    # 3. \u751f\u6210\u5206\u6790\u62a5\u544a\n    print(\"\\n\u6b65\u9aa43: \u751f\u6210\u5b8c\u6574\u5206\u6790\u62a5\u544a...\")\n    report = analyzer.generate_report(\n        start_date='2024-01-01',\n        end_date='2024-03-31'\n    )\n    \n    # 4. \u4fdd\u5b58RFM\u7ed3\u679c\n    print(\"\\n\u6b65\u9aa44: \u4fdd\u5b58\u5206\u6790\u7ed3\u679c...\")\n    report['rfm_data'].to_csv('rfm_analysis_result.csv', index=False, encoding='utf-8')\n    report['funnel_data'].to_csv('funnel_analysis_result.csv', index=False, encoding='utf-8')\n    \n    print(\"\\n\u2705 \u5206\u6790\u5b8c\u6210\uff01\u7ed3\u679c\u5df2\u4fdd\u5b58\u5230:\")\n    print(\"  - rfm_analysis_result.csv\")\n    print(\"  - funnel_analysis_result.csv\")\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%AE%89%E8%A3%85%E8%A6%81%E6%B1%82\"><\/span><strong>\u5b89\u88c5\u8981\u6c42<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">bash<code># \u57fa\u7840\u4f9d\u8d56\npip install pandas==1.5.3 numpy==1.24.3 matplotlib==3.7.1 seaborn==0.12.2\n\n# \u53ef\u9009\uff1a\u66f4\u7f8e\u89c2\u7684\u56fe\u8868\npip install plotly==5.15.0\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u8bfe\u7a0b\u76ee\u6807 \u638c\u63e1\u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\u3001\u7528\u6237\u4ef7\u503cRFM\u5206\u6790\u3001\u9500\u552e\u6f0f\u6597\u5206\u6790\u3002 \u6838\u5fc3\u6280\u80fd \u8bfe\u4ef6\u5185\u5bb9 1. \u7535\u5546\u6838&hellip; <a href=\"http:\/\/viplao.com\/index.php\/2026\/03\/01\/%e6%95%b0%e6%8d%ae%e6%8a%80%e8%83%bd%ef%bc%88skills%ef%bc%89-%ef%bc%9aday-5%ef%bc%9a%e7%94%b5%e5%95%86%e6%a0%b8%e5%bf%83%e6%8c%87%e6%a0%87%e8%ae%a1%e7%ae%97%e4%b8%8erfm%e5%88%86%e6%9e%90\/\" class=\"more-link read-more\" rel=\"bookmark\">\u7ee7\u7eed\u9605\u8bfb <span class=\"screen-reader-text\">\u6570\u636e\u6280\u80fd\uff08SKILLS\uff09 \uff1aDay 5\uff1a\u7535\u5546\u6838\u5fc3\u6307\u6807\u8ba1\u7b97\u4e0eRFM\u5206\u6790<\/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":151,"_links":{"self":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/4223"}],"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=4223"}],"version-history":[{"count":1,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/4223\/revisions"}],"predecessor-version":[{"id":4224,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/posts\/4223\/revisions\/4224"}],"wp:attachment":[{"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/media?parent=4223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/categories?post=4223"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/viplao.com\/index.php\/wp-json\/wp\/v2\/tags?post=4223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}