資料驅動決策已從企業的競爭優勢轉變為生存必備能力,在數位轉型浪潮下各行各業都面臨資料爆炸與決策複雜化的挑戰。傳統的經驗判斷與直覺決策難以應對快速變化的市場環境與日益細分的客戶需求,企業迫切需要建立系統性的資料分析能力將海量資料轉化為可行動的洞察。零售業作為資料密集型產業具有豐富的應用場景,商店績效評估需要整合銷售財務運營客戶等多維度資料建構全面的KPI體系,客戶分群透過行為特徵與偏好差異實現精準行銷提升轉換率與客戶終身價值,市場趨勢分析預測需求變化指導庫存管理與產品開發,價格優化平衡利潤最大化與市場競爭力,促銷效果評估透過A/B測試量化投資回報。然而多數企業在資料科學應用上面臨障礙包含資料孤島導致資訊分散難以整合,資料品質低落影響分析可信度,缺乏資料科學人才限制能力建設,業務與技術脫節分析結果無法落地,以及組織文化抗拒改變偏好傳統決策模式。

商店績效綜合評估的指標體系與分析框架

商店績效評估需要建立多層次的指標體系涵蓋財務運營客戶與成長等面向。財務指標是最直接的績效衡量包含營業額評估總收入規模反映市場地位,毛利率計算收入減去銷售成本後的比例衡量獲利能力,淨利率扣除所有營運成本與費用後的利潤率反映最終盈利,投資報酬率評估資本運用效率指導資源配置,現金流量監控資金週轉健康度確保營運穩定。運營指標反映日常管理效率包含坪效計算單位面積的營業額評估空間利用效率,人效測量單位人力的產出評估人力配置合理性,庫存周轉率評估庫存流動速度過高代表缺貨風險過低代表積壓,缺貨率監控產品斷貨頻率影響客戶體驗與銷售機會,平均交易時間評估收銀效率影響客戶等待體驗。

客戶指標衡量市場吸引力與忠誠度包含客戶數量追蹤活躍客戶規模反映市場滲透率,客戶獲取成本計算獲得新客戶的行銷與銷售投入評估增長效率,客戶留存率測量回購比例反映滿意度與忠誠度,客戶終身價值預測單一客戶在整個關係週期的貢獻指導獲客投資決策,淨推薦值透過客戶推薦意願評估品牌健康度。成長指標評估長期發展潛力包含同店銷售增長率剔除新店影響反映既有店面的有機增長,市場佔有率評估相對競爭者的地位識別市場機會與威脅,新產品貢獻率測量創新對營收的貢獻評估產品策略成效,品類增長率分析不同產品類別的增長趨勢指導品類管理,通路增長率比較線上線下等不同通路的表現優化通路組合。

指標之間存在複雜的關聯與權衡需要綜合評估而非單一追求。高營業額可能伴隨低毛利率如採用薄利多銷策略,提升客戶滿意度可能增加服務成本影響短期利潤,快速擴張新店可能稀釋管理資源影響既有店面表現,促銷活動提升銷量但壓縮利潤空間且可能培養價格敏感度。因此需要建立平衡計分卡整合多維度指標並設定優先順序與權重,根據企業戰略與發展階段調整關注重點如成長期重視市場佔有率成熟期重視盈利能力,透過對標分析比較業界標竿與歷史趨勢識別改善空間,使用因果分析理解指標間的驅動關係如客戶滿意度對留存率的影響,並建立預警機制當關鍵指標偏離目標時觸發調查與干預。

# 商店績效綜合分析系統
# 提供多維度KPI計算、對標分析、趨勢預測與視覺化

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime, timedelta
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import warnings
warnings.filterwarnings('ignore')

# 設定繁體中文顯示
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei']
plt.rcParams['axes.unicode_minus'] = False

class StorePerformanceAnalyzer:
    """
    商店績效綜合分析器
    提供KPI計算、績效評估、對標分析與視覺化功能
    """
    
    def __init__(self):
        """初始化分析器"""
        self.store_data = None
        self.kpi_metrics = {}
        
        print("商店績效綜合分析器已初始化")
    
    def generate_sample_data(self, n_stores=50, n_months=12):
        """
        生成範例商店績效資料
        模擬多家商店在多個月份的營運資料
        
        參數:
            n_stores: 商店數量
            n_months: 月份數量
            
        回傳:
            store_data: 商店績效DataFrame
        """
        print(f"\n生成範例資料...")
        print(f"  商店數量: {n_stores}")
        print(f"  月份數量: {n_months}")
        
        np.random.seed(42)
        
        # 生成日期範圍
        end_date = datetime.now()
        start_date = end_date - timedelta(days=30*n_months)
        dates = pd.date_range(start=start_date, end=end_date, periods=n_months)
        
        # 為每家商店生成基本屬性
        store_attributes = {}
        for store_id in range(1, n_stores + 1):
            store_attributes[store_id] = {
                'region': np.random.choice(['北部', '中部', '南部']),
                'type': np.random.choice(['大型店', '中型店', '小型店'], 
                                        p=[0.2, 0.5, 0.3]),
                'open_year': np.random.randint(2015, 2023),
                'area_sqm': np.random.randint(100, 1000)  # 坪數
            }
        
        # 生成每個商店每個月的績效資料
        records = []
        
        for store_id in range(1, n_stores + 1):
            attrs = store_attributes[store_id]
            
            # 店面規模影響基礎營收
            if attrs['type'] == '大型店':
                base_revenue = np.random.uniform(3000000, 5000000)
            elif attrs['type'] == '中型店':
                base_revenue = np.random.uniform(1000000, 3000000)
            else:
                base_revenue = np.random.uniform(300000, 1000000)
            
            # 地區影響營收(北部較高)
            region_multiplier = {
                '北部': 1.2, '中部': 1.0, '南部': 0.9
            }[attrs['region']]
            
            # 開店年資影響(較新的店可能還在成長期)
            years_open = 2024 - attrs['open_year']
            maturity_factor = min(1.0, 0.5 + years_open * 0.1)
            
            for month_idx, date in enumerate(dates):
                # 添加季節性效應
                month = date.month
                seasonal_factor = 1.0 + 0.2 * np.sin(2 * np.pi * month / 12)
                
                # 添加趨勢(逐月微幅成長)
                trend_factor = 1.0 + month_idx * 0.01
                
                # 添加隨機波動
                random_factor = np.random.uniform(0.9, 1.1)
                
                # 計算月營業額
                revenue = (base_revenue * region_multiplier * maturity_factor * 
                          seasonal_factor * trend_factor * random_factor)
                
                # 計算成本與利潤
                cogs_rate = np.random.uniform(0.55, 0.65)  # 銷貨成本率
                cogs = revenue * cogs_rate  # 銷貨成本
                gross_profit = revenue - cogs  # 毛利
                
                # 營運費用(固定+變動)
                fixed_costs = attrs['area_sqm'] * 1000  # 租金等固定成本
                variable_costs = revenue * 0.15  # 人力等變動成本
                operating_expenses = fixed_costs + variable_costs
                
                # 淨利
                net_profit = gross_profit - operating_expenses
                
                # 客戶指標
                avg_transaction = np.random.uniform(500, 1500)  # 平均客單價
                customer_count = int(revenue / avg_transaction)  # 客戶數量
                returning_rate = np.random.uniform(0.3, 0.7)  # 回購率
                
                # 運營指標
                employee_count = max(3, int(attrs['area_sqm'] / 50))  # 員工數
                inventory_turnover = np.random.uniform(6, 12)  # 庫存周轉率
                stockout_rate = np.random.uniform(0.01, 0.05)  # 缺貨率
                
                # 客戶滿意度(影響回購率)
                satisfaction_score = np.random.uniform(70, 98)
                
                # 成長率(與前一個月比較)
                if month_idx == 0:
                    growth_rate = 0
                else:
                    prev_revenue = records[-1]['revenue'] if records[-1]['store_id'] == store_id else revenue
                    growth_rate = (revenue - prev_revenue) / prev_revenue
                
                record = {
                    'store_id': store_id,
                    'date': date,
                    'year': date.year,
                    'month': date.month,
                    'region': attrs['region'],
                    'store_type': attrs['type'],
                    'area_sqm': attrs['area_sqm'],
                    'revenue': revenue,
                    'cogs': cogs,
                    'gross_profit': gross_profit,
                    'operating_expenses': operating_expenses,
                    'net_profit': net_profit,
                    'customer_count': customer_count,
                    'avg_transaction': avg_transaction,
                    'returning_rate': returning_rate,
                    'employee_count': employee_count,
                    'inventory_turnover': inventory_turnover,
                    'stockout_rate': stockout_rate,
                    'satisfaction_score': satisfaction_score,
                    'growth_rate': growth_rate
                }
                
                records.append(record)
        
        self.store_data = pd.DataFrame(records)
        
        # 計算衍生KPI
        self.store_data['gross_margin'] = (
            self.store_data['gross_profit'] / self.store_data['revenue'] * 100
        )
        self.store_data['net_margin'] = (
            self.store_data['net_profit'] / self.store_data['revenue'] * 100
        )
        self.store_data['revenue_per_sqm'] = (
            self.store_data['revenue'] / self.store_data['area_sqm']
        )
        self.store_data['revenue_per_employee'] = (
            self.store_data['revenue'] / self.store_data['employee_count']
        )
        
        print(f"\n資料生成完成!")
        print(f"資料形狀: {self.store_data.shape}")
        
        return self.store_data
    
    def calculate_kpis(self):
        """
        計算綜合KPI指標
        輸出各維度的關鍵績效指標
        """
        if self.store_data is None:
            print("錯誤: 尚未載入資料")
            return
        
        print("\n" + "="*70)
        print("綜合KPI指標計算")
        print("="*70)
        
        # 整體績效指標
        print("\n整體績效指標:")
        print(f"  總營業額: NT$ {self.store_data['revenue'].sum():,.0f}")
        print(f"  平均月營業額: NT$ {self.store_data['revenue'].mean():,.0f}")
        print(f"  總淨利: NT$ {self.store_data['net_profit'].sum():,.0f}")
        print(f"  平均毛利率: {self.store_data['gross_margin'].mean():.2f}%")
        print(f"  平均淨利率: {self.store_data['net_margin'].mean():.2f}%")
        
        # 運營效率指標
        print("\n運營效率指標:")
        print(f"  平均坪效: NT$ {self.store_data['revenue_per_sqm'].mean():,.0f}")
        print(f"  平均人效: NT$ {self.store_data['revenue_per_employee'].mean():,.0f}")
        print(f"  平均庫存周轉率: {self.store_data['inventory_turnover'].mean():.2f}")
        print(f"  平均缺貨率: {self.store_data['stockout_rate'].mean():.2%}")
        
        # 客戶指標
        print("\n客戶指標:")
        total_customers = self.store_data['customer_count'].sum()
        print(f"  總客戶數: {total_customers:,}")
        print(f"  平均客單價: NT$ {self.store_data['avg_transaction'].mean():,.0f}")
        print(f"  平均回購率: {self.store_data['returning_rate'].mean():.2%}")
        print(f"  平均客戶滿意度: {self.store_data['satisfaction_score'].mean():.2f}")
        
        # 成長指標
        print("\n成長指標:")
        latest_data = self.store_data[
            self.store_data['date'] == self.store_data['date'].max()
        ]
        print(f"  最新月份平均成長率: {latest_data['growth_rate'].mean():.2%}")
        
        # 地區比較
        print("\n地區比較:")
        region_kpi = self.store_data.groupby('region').agg({
            'revenue': 'mean',
            'net_margin': 'mean',
            'satisfaction_score': 'mean'
        }).round(2)
        region_kpi.columns = ['平均營業額', '平均淨利率%', '平均滿意度']
        print(region_kpi.to_string())
        
        # 店型比較
        print("\n店型比較:")
        type_kpi = self.store_data.groupby('store_type').agg({
            'revenue': 'mean',
            'revenue_per_sqm': 'mean',
            'revenue_per_employee': 'mean'
        }).round(0)
        type_kpi.columns = ['平均營業額', '平均坪效', '平均人效']
        print(type_kpi.to_string())
        
        # 儲存KPI指標供後續使用
        self.kpi_metrics = {
            'overall': {
                'total_revenue': self.store_data['revenue'].sum(),
                'avg_revenue': self.store_data['revenue'].mean(),
                'avg_gross_margin': self.store_data['gross_margin'].mean(),
                'avg_net_margin': self.store_data['net_margin'].mean()
            },
            'operational': {
                'avg_revenue_per_sqm': self.store_data['revenue_per_sqm'].mean(),
                'avg_revenue_per_employee': self.store_data['revenue_per_employee'].mean(),
                'avg_inventory_turnover': self.store_data['inventory_turnover'].mean()
            },
            'customer': {
                'total_customers': total_customers,
                'avg_transaction': self.store_data['avg_transaction'].mean(),
                'avg_returning_rate': self.store_data['returning_rate'].mean(),
                'avg_satisfaction': self.store_data['satisfaction_score'].mean()
            }
        }
    
    def benchmark_analysis(self, top_percentile=0.2):
        """
        對標分析
        比較各商店與前段班的績效差距
        
        參數:
            top_percentile: 前段班百分比(例如0.2代表前20%)
        """
        if self.store_data is None:
            print("錯誤: 尚未載入資料")
            return
        
        print("\n" + "="*70)
        print(f"對標分析(對比前{int(top_percentile*100)}%商店)")
        print("="*70)
        
        # 計算各商店的平均績效
        store_avg = self.store_data.groupby('store_id').agg({
            'revenue': 'mean',
            'net_margin': 'mean',
            'revenue_per_sqm': 'mean',
            'satisfaction_score': 'mean'
        }).round(2)
        
        # 識別前段班商店(以營業額為準)
        threshold = store_avg['revenue'].quantile(1 - top_percentile)
        top_stores = store_avg[store_avg['revenue'] >= threshold]
        
        print(f"\n{int(top_percentile*100)}%商店數量: {len(top_stores)}")
        print(f"營業額門檻: NT$ {threshold:,.0f}")
        
        # 比較前段班與整體的平均值
        print("\n前段班 vs 整體平均比較:")
        comparison = pd.DataFrame({
            '前段班平均': [
                top_stores['revenue'].mean(),
                top_stores['net_margin'].mean(),
                top_stores['revenue_per_sqm'].mean(),
                top_stores['satisfaction_score'].mean()
            ],
            '整體平均': [
                store_avg['revenue'].mean(),
                store_avg['net_margin'].mean(),
                store_avg['revenue_per_sqm'].mean(),
                store_avg['satisfaction_score'].mean()
            ]
        }, index=['平均營業額', '平均淨利率%', '平均坪效', '平均滿意度'])
        
        comparison['差距%'] = (
            (comparison['前段班平均'] - comparison['整體平均']) / 
            comparison['整體平均'] * 100
        ).round(1)
        
        print(comparison.to_string())
        
        # 識別表現不佳的商店(後段班)
        bottom_threshold = store_avg['revenue'].quantile(top_percentile)
        bottom_stores = store_avg[store_avg['revenue'] <= bottom_threshold]
        
        print(f"\n{int(top_percentile*100)}%商店數量: {len(bottom_stores)}")
        print(f"需要改善的關鍵指標:")
        
        for metric in ['net_margin', 'revenue_per_sqm', 'satisfaction_score']:
            gap = top_stores[metric].mean() - bottom_stores[metric].mean()
            print(f"  {metric}: 差距 {gap:.2f}")
        
        return top_stores, bottom_stores
    
    def visualize_performance(self):
        """
        視覺化商店績效
        生成多維度分析圖表
        """
        if self.store_data is None:
            print("錯誤: 尚未載入資料")
            return
        
        print("\n生成績效視覺化圖表...")
        
        fig = plt.figure(figsize=(18, 12))
        
        # 子圖1: 各月總營業額趨勢
        ax1 = plt.subplot(3, 3, 1)
        monthly_revenue = self.store_data.groupby('date')['revenue'].sum()
        
        ax1.plot(monthly_revenue.index, monthly_revenue.values,
                marker='o', linewidth=2, markersize=6, color='steelblue')
        ax1.set_xlabel('月份', fontsize=10)
        ax1.set_ylabel('總營業額 (NT$)', fontsize=10)
        ax1.set_title('各月總營業額趨勢', fontsize=12, fontweight='bold')
        ax1.grid(alpha=0.3)
        ax1.tick_params(axis='x', rotation=45)
        
        # 子圖2: 地區營業額比較
        ax2 = plt.subplot(3, 3, 2)
        region_revenue = self.store_data.groupby('region')['revenue'].sum().sort_values()
        
        bars = ax2.barh(range(len(region_revenue)), region_revenue.values,
                       color='coral', edgecolor='black')
        ax2.set_yticks(range(len(region_revenue)))
        ax2.set_yticklabels(region_revenue.index)
        ax2.set_xlabel('總營業額 (NT$)', fontsize=10)
        ax2.set_title('地區營業額比較', fontsize=12, fontweight='bold')
        ax2.grid(axis='x', alpha=0.3)
        
        for i, (bar, value) in enumerate(zip(bars, region_revenue.values)):
            ax2.text(value + max(region_revenue.values) * 0.02, i,
                    f'NT$ {value:,.0f}', va='center', fontsize=9)
        
        # 子圖3: 店型營業額分佈
        ax3 = plt.subplot(3, 3, 3)
        type_data = [
            self.store_data[self.store_data['store_type'] == t]['revenue'].values
            for t in ['小型店', '中型店', '大型店']
        ]
        
        bp = ax3.boxplot(type_data, labels=['小型店', '中型店', '大型店'],
                        patch_artist=True, showmeans=True)
        
        colors = ['lightblue', 'lightgreen', 'lightcoral']
        for patch, color in zip(bp['boxes'], colors):
            patch.set_facecolor(color)
        
        ax3.set_ylabel('營業額 (NT$)', fontsize=10)
        ax3.set_title('店型營業額分佈', fontsize=12, fontweight='bold')
        ax3.grid(axis='y', alpha=0.3)
        
        # 子圖4: 毛利率與淨利率比較
        ax4 = plt.subplot(3, 3, 4)
        store_margins = self.store_data.groupby('store_id').agg({
            'gross_margin': 'mean',
            'net_margin': 'mean'
        })
        
        ax4.scatter(store_margins['gross_margin'], store_margins['net_margin'],
                   alpha=0.5, s=50, c='purple', edgecolors='black')
        ax4.set_xlabel('平均毛利率 (%)', fontsize=10)
        ax4.set_ylabel('平均淨利率 (%)', fontsize=10)
        ax4.set_title('毛利率與淨利率關係', fontsize=12, fontweight='bold')
        ax4.grid(alpha=0.3)
        
        # 子圖5: 坪效分佈
        ax5 = plt.subplot(3, 3, 5)
        ax5.hist(self.store_data['revenue_per_sqm'], bins=30,
                color='lightgreen', edgecolor='black', alpha=0.7)
        ax5.set_xlabel('坪效 (NT$/坪)', fontsize=10)
        ax5.set_ylabel('商店數量', fontsize=10)
        ax5.set_title('坪效分佈', fontsize=12, fontweight='bold')
        ax5.grid(axis='y', alpha=0.3)
        
        # 子圖6: 客戶滿意度與回購率關係
        ax6 = plt.subplot(3, 3, 6)
        store_customer = self.store_data.groupby('store_id').agg({
            'satisfaction_score': 'mean',
            'returning_rate': 'mean'
        })
        
        ax6.scatter(store_customer['satisfaction_score'],
                   store_customer['returning_rate'] * 100,
                   alpha=0.5, s=50, c='orange', edgecolors='black')
        ax6.set_xlabel('平均滿意度', fontsize=10)
        ax6.set_ylabel('平均回購率 (%)', fontsize=10)
        ax6.set_title('滿意度與回購率關係', fontsize=12, fontweight='bold')
        ax6.grid(alpha=0.3)
        
        # 子圖7: 庫存周轉率分佈
        ax7 = plt.subplot(3, 3, 7)
        turnover_by_type = self.store_data.groupby('store_type')['inventory_turnover'].mean().sort_values()
        
        bars = ax7.bar(range(len(turnover_by_type)), turnover_by_type.values,
                      color='steelblue', edgecolor='black')
        ax7.set_xticks(range(len(turnover_by_type)))
        ax7.set_xticklabels(turnover_by_type.index)
        ax7.set_ylabel('平均庫存周轉率', fontsize=10)
        ax7.set_title('各店型庫存周轉率', fontsize=12, fontweight='bold')
        ax7.grid(axis='y', alpha=0.3)
        
        for bar, value in zip(bars, turnover_by_type.values):
            height = bar.get_height()
            ax7.text(bar.get_x() + bar.get_width()/2., height,
                    f'{value:.2f}', ha='center', va='bottom', fontsize=10)
        
        # 子圖8: 成長率趨勢
        ax8 = plt.subplot(3, 3, 8)
        monthly_growth = self.store_data.groupby('date')['growth_rate'].mean() * 100
        
        ax8.plot(monthly_growth.index, monthly_growth.values,
                marker='s', linewidth=2, markersize=5, color='green')
        ax8.axhline(y=0, color='red', linestyle='--', linewidth=1, alpha=0.5)
        ax8.set_xlabel('月份', fontsize=10)
        ax8.set_ylabel('平均成長率 (%)', fontsize=10)
        ax8.set_title('各月平均成長率趨勢', fontsize=12, fontweight='bold')
        ax8.grid(alpha=0.3)
        ax8.tick_params(axis='x', rotation=45)
        
        # 子圖9: 前10名商店排名
        ax9 = plt.subplot(3, 3, 9)
        top10_stores = self.store_data.groupby('store_id')['revenue'].mean().sort_values(ascending=True).tail(10)
        
        bars = ax9.barh(range(len(top10_stores)), top10_stores.values,
                       color='gold', edgecolor='black')
        ax9.set_yticks(range(len(top10_stores)))
        ax9.set_yticklabels([f'商店 {sid}' for sid in top10_stores.index])
        ax9.set_xlabel('平均營業額 (NT$)', fontsize=10)
        ax9.set_title('前10名商店排名', fontsize=12, fontweight='bold')
        ax9.grid(axis='x', alpha=0.3)
        
        plt.tight_layout()
        plt.show()
        
        print("視覺化圖表生成完成!")
    
    def segment_stores(self, n_clusters=4):
        """
        商店分群分析
        基於績效特徵進行分群
        
        參數:
            n_clusters: 群組數量
        """
        if self.store_data is None:
            print("錯誤: 尚未載入資料")
            return
        
        print(f"\n執行商店分群分析({n_clusters}個群組)...")
        
        # 計算各商店的平均績效特徵
        store_features = self.store_data.groupby('store_id').agg({
            'revenue': 'mean',
            'net_margin': 'mean',
            'revenue_per_sqm': 'mean',
            'satisfaction_score': 'mean',
            'returning_rate': 'mean'
        })
        
        # 標準化特徵
        scaler = StandardScaler()
        features_scaled = scaler.fit_transform(store_features)
        
        # K-means分群
        kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
        clusters = kmeans.fit_predict(features_scaled)
        
        store_features['cluster'] = clusters
        
        # 分析各群組特徵
        print("\n各群組特徵分析:")
        print("="*70)
        
        cluster_summary = store_features.groupby('cluster').agg({
            'revenue': 'mean',
            'net_margin': 'mean',
            'revenue_per_sqm': 'mean',
            'satisfaction_score': 'mean',
            'returning_rate': 'mean'
        }).round(2)
        
        cluster_summary.index = [f'群組{i+1}' for i in cluster_summary.index]
        cluster_summary.columns = ['平均營業額', '平均淨利率%', 
                                   '平均坪效', '平均滿意度', '平均回購率']
        
        # 計算各群組的商店數量
        cluster_counts = store_features['cluster'].value_counts().sort_index()
        cluster_summary['商店數量'] = [cluster_counts[i] for i in range(n_clusters)]
        
        print(cluster_summary.to_string())
        
        # 為群組命名
        print("\n群組特徵描述:")
        for i in range(n_clusters):
            group = cluster_summary.iloc[i]
            print(f"\n群組{i+1}{int(group['商店數量'])}家商店):")
            
            # 根據特徵給予描述
            if group['平均營業額'] > cluster_summary['平均營業額'].median():
                if group['平均淨利率%'] > cluster_summary['平均淨利率%'].median():
                    print("  類型: 高營收高獲利明星店")
                else:
                    print("  類型: 高營收低獲利成長店")
            else:
                if group['平均淨利率%'] > cluster_summary['平均淨利率%'].median():
                    print("  類型: 穩健獲利潛力店")
                else:
                    print("  類型: 需改善輔導店")
            
            print(f"  建議策略: ", end="")
            if group['平均滿意度'] < 80:
                print("優先提升客戶滿意度")
            elif group['平均坪效'] < cluster_summary['平均坪效'].median():
                print("優化商品組合與陳列")
            elif group['平均回購率'] < 0.5:
                print("強化會員經營與忠誠計畫")
            else:
                print("維持優勢並持續創新")
        
        return store_features

# 主程式執行
if __name__ == "__main__":
    print("="*70)
    print("商店績效綜合分析系統")
    print("="*70)
    
    # 初始化分析器
    analyzer = StorePerformanceAnalyzer()
    
    # 生成範例資料
    store_data = analyzer.generate_sample_data(n_stores=50, n_months=12)
    
    # 顯示前幾筆資料
    print("\n前5筆績效資料:")
    display_cols = ['store_id', 'date', 'region', 'revenue', 
                   'net_margin', 'satisfaction_score']
    print(store_data[display_cols].head().to_string())
    
    # 計算KPI指標
    analyzer.calculate_kpis()
    
    # 對標分析
    top_stores, bottom_stores = analyzer.benchmark_analysis(top_percentile=0.2)
    
    # 視覺化績效
    analyzer.visualize_performance()
    
    # 商店分群分析
    store_segments = analyzer.segment_stores(n_clusters=4)
    
    print("\n" + "="*70)
    print("分析完成!")
    print("="*70)

這段完整的商店績效分析系統展示了資料驅動決策的完整實踐流程。StorePerformanceAnalyzer類別封裝所有分析功能從資料模擬到深度洞察提取。資料生成功能模擬真實的零售業多店營運場景,考量地區差異北部營收較高反映消費能力,店型規模大型店基礎營收高但營運成本也高,開店年資新店處於成長期成熟店趨於穩定,季節性效應如年節購物旺季的銷售高峰,長期趨勢反映市場成長或衰退,以及隨機波動代表不可預測的市場變化。績效指標計算涵蓋財務面向的營業額毛利淨利與利潤率,運營面向的坪效人效庫存周轉,客戶面向的客戶數客單價回購率滿意度,以及成長面向的同店增長率。

KPI計算功能提供多層次的績效視圖,整體層面掌握全公司的經營狀況,地區與店型層面識別結構性差異,單店層面評估個別表現與排名。對標分析將商店分為前段班與後段班量化績效差距,前段班代表最佳實踐標竿可供其他店學習,後段班需要改善輔導資源投入,差距分析識別關鍵改善領域如淨利率坪效或滿意度。視覺化功能生成九個子圖提供全方位洞察,時間序列趨勢圖追蹤營收成長軌跡,地區與店型比較識別市場機會,散佈圖探索指標間的關聯如滿意度與回購率,分佈圖理解變異與離群值,排名圖標示績效領先與落後者。商店分群使用K-means演算法基於多維度特徵將商店分為四個群組,明星店高營收高獲利需維持優勢,成長店高營收低獲利需優化成本結構,潛力店穩健獲利待擴大規模,輔導店需全面改善提升競爭力。

@startuml
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 120

title 資料驅動決策完整架構

package "資料基礎層" {
  [交易系統] as TXN
  [客戶系統] as CRM
  [庫存系統] as INV
  [財務系統] as FIN
  [外部資料] as EXT
  database "資料倉儲" as DW
}

package "資料處理層" {
  [ETL流程] as ETL
  [資料清洗] as CLEAN
  [資料整合] as INTEGRATE
  [特徵工程] as FEATURE
}

package "分析引擎層" {
  [描述性分析] as DESC
  [診斷性分析] as DIAG
  [預測性分析] as PRED
  [規範性分析] as PRESC
}

package "模型庫" {
  [客戶分群模型] as SEGMENT
  [流失預測模型] as CHURN
  [需求預測模型] as DEMAND
  [價格優化模型] as PRICE
  [推薦引擎] as RECOMMEND
}

package "視覺化層" {
  [KPI儀表板] as DASHBOARD
  [趨勢報表] as TREND
  [對標分析] as BENCHMARK
  [異常監控] as ANOMALY
}

package "決策支援層" {
  [策略建議] as STRATEGY
  [行動方案] as ACTION
  [效果追蹤] as TRACKING
  [A/B測試] as AB_TEST
}

actor "高階主管" as EXEC
actor "營運經理" as OPS_MGR
actor "門市經理" as STORE_MGR
actor "行銷人員" as MARKETING
actor "資料科學家" as DS

TXN --> ETL : 銷售資料
CRM --> ETL : 客戶資料
INV --> ETL : 庫存資料
FIN --> ETL : 財務資料
EXT --> ETL : 市場資料

ETL --> CLEAN : 原始資料
CLEAN --> INTEGRATE : 清洗資料
INTEGRATE --> DW : 整合資料
DW --> FEATURE : 分析資料

FEATURE --> DESC : 特徵資料
DESC --> DIAG : 發現趨勢
DIAG --> PRED : 識別原因
PRED --> PRESC : 預測未來

FEATURE --> SEGMENT : 客戶資料
FEATURE --> CHURN : 行為資料
FEATURE --> DEMAND : 歷史資料
FEATURE --> PRICE : 市場資料
FEATURE --> RECOMMEND : 偏好資料

DESC --> DASHBOARD : 即時KPI
DIAG --> TREND : 歷史趨勢
DESC --> BENCHMARK : 對標資料
PRED --> ANOMALY : 異常偵測

DASHBOARD --> EXEC : 經營概況
TREND --> OPS_MGR : 營運分析
BENCHMARK --> STORE_MGR : 績效比較
ANOMALY --> OPS_MGR : 異常告警

SEGMENT --> MARKETING : 分群策略
CHURN --> MARKETING : 保留方案
DEMAND --> OPS_MGR : 補貨計畫
PRICE --> MARKETING : 定價建議
RECOMMEND --> MARKETING : 推薦商品

PRESC --> STRATEGY : 分析洞察
STRATEGY --> ACTION : 策略方案
ACTION --> TRACKING : 執行行動
TRACKING --> AB_TEST : 追蹤效果

AB_TEST --> DW : 實驗結果
DS --> SEGMENT : 模型開發
DS --> PRED : 演算法優化

note right of DESC
  描述性分析:
  - 發生了什麼
  - KPI儀表板
  - 趨勢報表
  - 對標分析
end note

note right of DIAG
  診斷性分析:
  - 為什麼發生
  - 相關性分析
  - 歸因分析
  - 異常檢測
end note

note right of PRED
  預測性分析:
  - 將會發生什麼
  - 時間序列預測
  - 機器學習模型
  - 情境模擬
end note

note right of PRESC
  規範性分析:
  - 應該做什麼
  - 優化演算法
  - 決策模擬
  - 建議系統
end note

@enduml

這張資料驅動決策架構圖完整呈現從資料收集到決策執行的端到端流程。資料基礎層整合多個來源系統,交易系統記錄每筆銷售的詳細資訊包含商品數量金額時間地點,客戶系統儲存會員資料購買歷史偏好與回饋,庫存系統追蹤商品庫存水位補貨需求與周轉效率,財務系統管理收入成本利潤與現金流,外部資料補充市場趨勢競爭情報與經濟指標。這些異質資料透過ETL流程提取轉換與載入到資料倉儲建立統一的分析基礎。

資料處理層確保資料品質與可用性。ETL流程從各系統定期抽取資料支援批次與即時更新,資料清洗處理遺失值異常值與格式不一致確保分析可靠性,資料整合建立跨系統的關聯如交易與客戶的對應關係,特徵工程創造有預測力的變數如RFM指標時間特徵與聚合統計。分析引擎層提供四個層次的分析能力逐步深化洞察。描述性分析回答發生了什麼透過KPI儀表板趨勢報表與對標分析呈現當前狀態,診斷性分析探究為什麼發生透過相關性分析歸因分析與異常檢測識別根本原因,預測性分析預見將會發生什麼運用時間序列預測與機器學習模型評估未來趨勢,規範性分析建議應該做什麼透過優化演算法與決策模擬提供行動方案。

模型庫包含針對不同業務場景的專用模型。客戶分群模型使用聚類演算法將客戶劃分為高價值常客價格敏感型潛在流失等群組支援差異化行銷,流失預測模型識別高風險客戶提前採取保留措施,需求預測模型預測未來銷量指導補貨與生產計畫,價格優化模型平衡利潤最大化與市場競爭力動態調整定價,推薦引擎根據個人偏好與協同過濾推送商品提升轉換率。視覺化層將分析結果轉化為易懂的圖表與報表,KPI儀表板提供即時的經營概況,趨勢報表展示歷史演變軌跡,對標分析比較與標竿的差距,異常監控及時標示偏離常態的指標。

決策支援層將洞察轉化為具體行動。策略建議基於分析結果提出改善方向如優化商品組合強化會員經營或調整門市布局,行動方案細化為可執行的計畫包含時間表負責人與資源配置,效果追蹤監控實施進度與成效評估投資回報,A/B測試透過對照實驗驗證策略有效性並持續優化。不同角色使用系統的方式不同,高階主管關注整體經營概況與策略方向,營運經理監控日常營運指標與異常處理,門市經理比較個別店面表現識別改善機會,行銷人員根據客戶洞察設計活動,資料科學家開發與優化模型持續提升分析能力。

資料驅動決策的成功實施需要技術工具組織文化與人才能力的綜合支撐。技術層面建立完整的資料基礎設施包含資料收集管道資料倉儲分析平台與視覺化工具,工具層面選擇適合的技術棧如Python生態系用於資料處理與建模Tableau或Power BI用於視覺化雲端平台提供彈性的運算與儲存資源。組織層面建立跨職能協作機制促進業務與技術的溝通,明確資料治理政策確保資料品質與安全,設立資料科學團隊提供專業支援,培養全員的資料素養讓每個人都能理解與應用資料。文化層面鼓勵實驗與學習容忍失敗並從中汲取教訓,基於事實而非意見進行討論與決策,持續優化的心態不斷尋求改進機會,並建立快速反應機制將洞察迅速轉化為行動。透過系統性的能力建設企業能夠從資料中持續創造價值在競爭激烈的市場中保持優勢並實現可持續增長。