mcpField
S
strategic-sourcing

strategic-sourcing

github.com/kishorkukrejaその他8472 回インストール3 週間前に更新
リポジトリ

strategic-sourcing について

調達・カテゴリー管理チーム向けの戦略的ソーシングスキルです。カテゴリー分析から市場評価、サプライヤー選定、契約までを整理し、Kraljic分析や価値向上策、コストモデルを扱います。

主な機能

  1. 017段階のソーシングプロセス
  2. 02Kraljicポートフォリオ分析
  3. 03価値向上策の特定
  4. 04製品・サービスのコストモデリング
  5. 05RFxと電子入札の管理

活用シーン

  1. 01カテゴリー戦略と調達方針の策定
  2. 02サプライヤー市場とリスクの評価
  3. 03提案の比較と交渉計画
  4. 04製品・サービスのコスト構造分析

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kishorkukreja/awesome-supply-chain --skill strategic-sourcing

インストール後、Claude Code で/strategic-sourcingを入力して読み込まれたか確認します。

詳細

戦略的ソーシング

戦略的ソーシングとカテゴリー管理の専門家として、サプライヤーとの関係、市場に関する洞察、分析の厳密さを通じて持続可能な価値をもたらす、包括的なカテゴリー戦略の策定と実行を支援します。

初期評価

ソーシング戦略を策定する前に、以下を把握します。

  1. カテゴリーの背景

    • どのカテゴリーまたは商品ですか?(直接材、間接材、サービス)
    • 年間支出額はどの程度ですか?
    • 戦略的重要性はどの程度ですか?(重要、レバレッジ、ボトルネック、非重要)
    • 現在のソーシングの取り組みはどのようなものですか?
  2. ビジネス要件

    • ビジネス目標は何ですか?(コスト、イノベーション、リスク、サステナビリティ)
    • ステークホルダーのニーズは何ですか?
    • 技術仕様は何ですか?
    • 需要量の予測はどのようなものですか?
  3. 市場動向

    • 供給市場の特徴は何ですか?
    • サプライヤーの数はどの程度ですか?
    • 競争環境はどのようなものですか?
    • 技術トレンドは何ですか?
    • 価格の動向はどのようなものですか?
  4. 現状

    • 既存のサプライヤーはどこですか?
    • 契約条件はどのようなものですか?
    • 既知の問題や機会はありますか?
    • 過去の支出パターンはどのようなものですか?

戦略的ソーシングのフレームワーク

7 ステップのソーシングプロセス

1. カテゴリーの特性を把握する

  • 社内要件を理解する
  • 現在の支出を分析する
  • ステークホルダーを特定する
  • 仕様を定義する

2. 供給市場を評価する

  • サプライヤー環境の分析
  • 市場のトレンドと動向
  • 技術革新
  • リスク要因

3. ソーシング戦略を策定する

  • クラリッチ・マトリックスによる位置付け
  • 価値向上の手段を特定する
  • サプライヤー戦略(単一/複数)
  • 交渉の進め方

4. サプライヤー候補を洗い出す

  • 既存サプライヤーの評価
  • 新規サプライヤーの特定
  • 認定基準
  • ロングリストの作成

5. サプライヤーを選定する

  • RFx プロセスの実施
  • 提案の評価
  • 交渉
  • 最終選定

6. 交渉と契約

  • 条件の最終決定
  • 法務レビュー
  • 契約の締結
  • ステークホルダーとの調整

7. 導入と改善

  • 導入計画の策定
  • サプライヤーのオンボーディング
  • パフォーマンス管理
  • 継続的改善

カテゴリー管理

クラリッチ・ポートフォリオ分析

以下の基準に基づいてカテゴリーを分類します。

  • 供給リスク:入手可能性、サプライヤーの集中度、代替可能性
  • 利益への影響:支出額、コスト/品質への影響

4 つの象限:

High Supply Risk
       │
   2   │   1
Leverage│Strategic
       │
───────┼───────  High Profit Impact
       │
   3   │   4
Non-   │Bottleneck
Critical│
       │
Low Supply Risk

1. 戦略的(高リスク、高影響)

  • 例:重要部品、専門サービス
  • 戦略:長期的なパートナーシップ、共同開発、リスク軽減
  • アプローチ:関係管理、イノベーション重視

2. レバレッジ(低リスク、高影響)

  • 例:複数のサプライヤーがある標準資材
  • 戦略:競争入札、調達量の集約、積極的な交渉
  • アプローチ:購買力を最大限に活用する

3. 非重要(低リスク、低影響)

  • 例:事務用品、基本的な MRO
  • 戦略:プロセスの簡素化、自動化、集約
  • アプローチ:効率的な取引、電子カタログ

4. ボトルネック(高リスク、低影響)

  • 例:特殊品目、ニッチなサービス
  • 戦略:供給の確保、複雑さの軽減、標準化
  • アプローチ:入手可能性の確保、長期契約
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

class KraljicAnalysis:
    """Kraljic portfolio positioning for categories"""

    def __init__(self, categories_df):
        """
        categories_df: DataFrame with category, spend, supply_risk, profit_impact
        """
        self.categories = categories_df

    def classify_category(self, supply_risk, profit_impact):
        """Classify category into Kraljic quadrant"""

        if supply_risk >= 50 and profit_impact >= 50:
            return 'Strategic'
        elif supply_risk < 50 and profit_impact >= 50:
            return 'Leverage'
        elif supply_risk < 50 and profit_impact < 50:
            return 'Non-Critical'
        else:  # supply_risk >= 50 and profit_impact < 50
            return 'Bottleneck'

    def add_classifications(self):
        """Add Kraljic classification to categories"""

        self.categories['kraljic_quadrant'] = self.categories.apply(
            lambda row: self.classify_category(
                row['supply_risk'],
                row['profit_impact']
            ),
            axis=1
        )

        return self.categories

    def plot_portfolio(self):
        """Create Kraljic portfolio matrix visualization"""

        fig, ax = plt.subplots(figsize=(12, 8))

        # Color by quadrant
        colors = {
            'Strategic': 'red',
            'Leverage': 'green',
            'Bottleneck': 'orange',
            'Non-Critical': 'blue'
        }

        for quadrant in colors:
            data = self.categories[self.categories['kraljic_quadrant'] == quadrant]

            ax.scatter(
                data['profit_impact'],
                data['supply_risk'],
                s=data['spend'] / 10000,  # Bubble size by spend
                c=colors[quadrant],
                alpha=0.6,
                label=quadrant
            )

            # Add category labels
            for _, row in data.iterrows():
                ax.annotate(
                    row['category'],
                    (row['profit_impact'], row['supply_risk']),
                    fontsize=8,
                    ha='center'
                )

        # Quadrant lines
        ax.axvline(50, color='gray', linestyle='--', alpha=0.5)
        ax.axhline(50, color='gray', linestyle='--', alpha=0.5)

        # Labels
        ax.set_xlabel('Profit Impact (Spend, Cost Criticality)', fontsize=12)
        ax.set_ylabel('Supply Risk (Availability, Complexity)', fontsize=12)
        ax.set_title('Kraljic Portfolio Matrix', fontsize=14, weight='bold')
        ax.set_xlim(0, 100)
        ax.set_ylim(0, 100)
        ax.legend()
        ax.grid(True, alpha=0.3)

        # Quadrant labels
        ax.text(75, 75, 'Strategic', ha='center', fontsize=11, weight='bold')
        ax.text(25, 75, 'Bottleneck', ha='center', fontsize=11, weight='bold')
        ax.text(75, 25, 'Leverage', ha='center', fontsize=11, weight='bold')
        ax.text(25, 25, 'Non-Critical', ha='center', fontsize=11, weight='bold')

        plt.tight_layout()
        return fig


# Example usage
categories = pd.DataFrame({
    'category': ['IT Hardware', 'Office Supplies', 'Specialized Components',
                'Raw Materials', 'Consulting', 'MRO'],
    'spend': [2000000, 500000, 800000, 5000000, 1500000, 300000],
    'supply_risk': [30, 20, 80, 40, 60, 75],  # 0-100
    'profit_impact': [70, 40, 35, 90, 80, 25]  # 0-100
})

kraljic = KraljicAnalysis(categories)
classified = kraljic.add_classifications()

print("\nKraljic Classification:")
print(classified[['category', 'kraljic_quadrant', 'spend']])

# fig = kraljic.plot_portfolio()
# plt.show()

戦略的ソーシングの価値向上の手段

価値向上の手段のフレームワーク

1. 価格/レートの引き下げ

  • 競争入札
  • 市場価格のベンチマーク
  • 調達量の集約
  • グローバルソーシング
  • 電子オークション

2. 需要管理

  • 仕様の最適化
  • 標準化
  • 使用量の削減
  • 代替
  • 内製か外部調達かの分析

3. プロセス効率

  • プロセスの自動化(P2P)
  • サプライヤーの集約
  • 取引効率の向上
  • セルフサービスツール
  • 支払いの最適化

4. 総コスト管理

  • 総保有コスト(TCO)
  • ロジスティクスの最適化
  • 品質の向上
  • 運転資本
  • ライフサイクルコスト

5. サプライヤーによる価値創出

  • イノベーションに向けた協業
  • 継続的改善
  • サプライヤー育成
  • 価値工学
  • 利益配分
class ValueLevers:
    """Identify and quantify value levers for category"""

    def __init__(self, category, baseline_spend):
        self.category = category
        self.baseline_spend = baseline_spend
        self.levers = []

    def add_price_reduction(self, current_price, target_price, volume,
                           confidence=0.8, timeline_months=6):
        """Add price reduction lever"""

        savings_per_unit = current_price - target_price
        annual_savings = savings_per_unit * volume
        risk_adjusted = annual_savings * confidence

        self.levers.append({
            'lever_type': 'Price Reduction',
            'description': f'Negotiate price from ${current_price} to ${target_price}',
            'gross_savings': annual_savings,
            'confidence_%': confidence * 100,
            'risk_adjusted_savings': risk_adjusted,
            'implementation_timeline': timeline_months,
            'implementation_effort': 'Medium'
        })

    def add_demand_reduction(self, reduction_pct, rationale,
                            confidence=0.6, timeline_months=12):
        """Add demand management lever"""

        annual_savings = self.baseline_spend * reduction_pct
        risk_adjusted = annual_savings * confidence

        self.levers.append({
            'lever_type': 'Demand Management',
            'description': rationale,
            'gross_savings': annual_savings,
            'confidence_%': confidence * 100,
            'risk_adjusted_savings': risk_adjusted,
            'implementation_timeline': timeline_months,
            'implementation_effort': 'High'
        })

    def add_specification_change(self, savings_amount, description,
                                confidence=0.7, timeline_months=9):
        """Add specification optimization lever"""

        risk_adjusted = savings_amount * confidence

        self.levers.append({
            'lever_type': 'Specification Change',
            'description': description,
            'gross_savings': savings_amount,
            'confidence_%': confidence * 100,
            'risk_adjusted_savings': risk_adjusted,
            'implementation_timeline': timeline_months,
            'implementation_effort': 'High'
        })

    def add_process_improvement(self, savings_amount, description,
                               confidence=0.9, timeline_months=3):
        """Add process efficiency lever"""

        risk_adjusted = savings_amount * confidence

        self.levers.append({
            'lever_type': 'Process Improvement',
            'description': description,
            'gross_savings': savings_amount,
            'confidence_%': confidence * 100,
            'risk_adjusted_savings': risk_adjusted,
            'implementation_timeline': timeline_months,
            'implementation_effort': 'Medium'
        })

    def add_supplier_consolidation(self, expected_discount, description,
                                  confidence=0.75, timeline_months=6):
        """Add supplier consolidation lever"""

        annual_savings = self.baseline_spend * expected_discount
        risk_adjusted = annual_savings * confidence

        self.levers.append({
            'lever_type': 'Supplier Consolidation',
            'description': description,
            'gross_savings': annual_savings,
            'confidence_%': confidence * 100,
            'risk_adjusted_savings': risk_adjusted,
            'implementation_timeline': timeline_months,
            'implementation_effort': 'High'
        })

    def get_value_lever_summary(self):
        """Get prioritized value lever summary"""

        if not self.levers:
            return None

        df = pd.DataFrame(self.levers)
        df = df.sort_values('risk_adjusted_savings', ascending=False)

        # Add cumulative savings
        df['cumulative_savings'] = df['risk_adjusted_savings'].cumsum()

        total_gross = df['gross_savings'].sum()
        total_risk_adjusted = df['risk_adjusted_savings'].sum()

        return {
            'category': self.category,
            'baseline_spend': self.baseline_spend,
            'total_gross_savings': total_gross,
            'total_risk_adjusted_savings': total_risk_adjusted,
            'savings_pct': (total_risk_adjusted / self.baseline_spend * 100),
            'num_levers': len(df),
            'levers': df
        }


# Example: IT Hardware category
it_hardware = ValueLevers(category='IT Hardware', baseline_spend=2000000)

it_hardware.add_price_reduction(
    current_price=1200,
    target_price=1100,
    volume=1500,
    confidence=0.85,
    timeline_months=3
)

it_hardware.add_supplier_consolidation(
    expected_discount=0.05,
    description='Consolidate from 8 suppliers to 3',
    confidence=0.75,
    timeline_months=6
)

it_hardware.add_specification_change(
    savings_amount=80000,
    description='Standardize to fewer SKUs',
    confidence=0.70,
    timeline_months=9
)

it_hardware.add_process_improvement(
    savings_amount=40000,
    description='Implement e-procurement for efficiency',
    confidence=0.90,
    timeline_months=3
)

summary = it_hardware.get_value_lever_summary()

print(f"\nCategory: {summary['category']}")
print(f"Baseline Spend: ${summary['baseline_spend']:,.0f}")
print(f"Total Savings: ${summary['total_risk_adjusted_savings']:,.0f} ({summary['savings_pct']:.1f}%)")
print(f"\nValue Levers:")
print(summary['levers'][['lever_type', 'description', 'risk_adjusted_savings', 'implementation_timeline']])

目標原価分析

コスト内訳のモデル化

サプライヤーのコスト構造を把握します:

  • 原材料
  • 直接労務費
  • 製造間接費
  • 販売費・一般管理費(SG&A)
  • 利益率
class ShouldCostModel:
    """Build should-cost model for products/services"""

    def __init__(self, product_name):
        self.product_name = product_name
        self.cost_components = {}

    def add_material_cost(self, material, quantity, unit_cost):
        """Add material cost component"""

        total_cost = quantity * unit_cost

        if 'materials' not in self.cost_components:
            self.cost_components['materials'] = []

        self.cost_components['materials'].append({
            'material': material,
            'quantity': quantity,
            'unit_cost': unit_cost,
            'total_cost': total_cost
        })

    def add_labor_cost(self, operation, hours, hourly_rate):
        """Add labor cost component"""

        total_cost = hours * hourly_rate

        if 'labor' not in self.cost_components:
            self.cost_components['labor'] = []

        self.cost_components['labor'].append({
            'operation': operation,
            'hours': hours,
            'hourly_rate': hourly_rate,
            'total_cost': total_cost
        })

    def add_overhead(self, overhead_rate):
        """Add overhead as % of labor"""

        if 'labor' not in self.cost_components:
            return

        labor_cost = sum(item['total_cost']
                        for item in self.cost_components['labor'])

        self.cost_components['overhead'] = labor_cost * overhead_rate

    def add_profit_margin(self, margin_rate):
        """Add profit margin"""

        self.margin_rate = margin_rate

    def calculate_should_cost(self):
        """Calculate total should-cost"""

        # Materials
        material_cost = sum(
            item['total_cost']
            for item in self.cost_components.get('materials', [])
        )

        # Labor
        labor_cost = sum(
            item['total_cost']
            for item in self.cost_components.get('labor', [])
        )

        # Overhead
        overhead_cost = self.cost_components.get('overhead', 0)

        # Manufacturing cost
        manufacturing_cost = material_cost + labor_cost + overhead_cost

        # SG&A (typically 10-15% of manufacturing)
        sga_cost = manufacturing_cost * 0.12

        # Total cost before profit
        total_cost = manufacturing_cost + sga_cost

        # Add profit margin
        margin_rate = getattr(self, 'margin_rate', 0.15)
        profit = total_cost * margin_rate

        # Should-cost price
        should_cost_price = total_cost + profit

        return {
            'product': self.product_name,
            'cost_breakdown': {
                'materials': round(material_cost, 2),
                'labor': round(labor_cost, 2),
                'overhead': round(overhead_cost, 2),
                'sga': round(sga_cost, 2),
                'subtotal': round(total_cost, 2),
                'profit_margin': round(profit, 2)
            },
            'should_cost_price': round(should_cost_price, 2),
            'cost_percentages': {
                'materials_%': round(material_cost / should_cost_price * 100, 1),
                'labor_%': round(labor_cost / should_cost_price * 100, 1),
                'overhead_%': round(overhead_cost / should_cost_price * 100, 1),
                'sga_%': round(sga_cost / should_cost_price * 100, 1),
                'profit_%': round(profit / should_cost_price * 100, 1)
            }
        }

    def compare_to_quoted_price(self, quoted_price):
        """Compare should-cost to quoted price"""

        should_cost = self.calculate_should_cost()
        should_cost_price = should_cost['should_cost_price']

        variance = quoted_price - should_cost_price
        variance_pct = (variance / should_cost_price) * 100

        return {
            **should_cost,
            'quoted_price': quoted_price,
            'variance': round(variance, 2),
            'variance_%': round(variance_pct, 1),
            'assessment': 'Over-priced' if variance > 0 else 'Fair' if abs(variance_pct) < 5 else 'Under-priced'
        }


# Example: Metal bracket manufacturing
bracket = ShouldCostModel('Metal Bracket Assembly')

# Materials
bracket.add_material_cost('Steel sheet', quantity=0.5, unit_cost=2.00)  # kg
bracket.add_material_cost('Bolts', quantity=4, unit_cost=0.15)
bracket.add_material_cost('Paint', quantity=0.1, unit_cost=5.00)  # liters

# Labor
bracket.add_labor_cost('Cutting', hours=0.2, hourly_rate=25.00)
bracket.add_labor_cost('Forming', hours=0.3, hourly_rate=28.00)
bracket.add_labor_cost('Assembly', hours=0.25, hourly_rate=22.00)

# Overhead (150% of labor)
bracket.add_overhead(overhead_rate=1.5)

# Profit margin (15%)
bracket.add_profit_margin(margin_rate=0.15)

# Calculate should-cost and compare to quote
result = bracket.compare_to_quoted_price(quoted_price=45.00)

print(f"\nShould-Cost Analysis: {result['product']}")
print(f"\nCost Breakdown:")
for component, cost in result['cost_breakdown'].items():
    print(f"  {component.capitalize()}: ${cost}")

print(f"\nShould-Cost Price: ${result['should_cost_price']}")
print(f"Quoted Price: ${result['quoted_price']}")
print(f"Variance: ${result['variance']} ({result['variance_%']}%)")
print(f"Assessment: {result['assessment']}")

RFx 管理と電子調達

電子調達イベントの種類

1. RFI(情報提供依頼)

  • 目的:市場情報、サプライヤーの能力
  • 使用する場面:市場や新しいカテゴリーを調査する場合
  • 成果:サプライヤーの候補リスト

2. RFP(提案依頼)

  • 目的:包括的な評価(価格、品質、サービス)
  • 使用する場面:要件が複雑で、複数の要素を考慮する場合
  • 成果:詳細な提案、サプライヤーの選定

3. RFQ(見積依頼)

  • 目的:定義済みの仕様に基づく価格比較
  • 使用する場面:標準製品を対象とし、価格を重視する場合
  • 成果:価格見積もり、コスト比較

4. 電子オークション(リバースオークション)

  • 目的:動的な価格競争
  • 使用する場面:標準化された商品を対象とし、複数の適格なサプライヤーがいる場合
  • 成果:最低価格での契約
class EAuctionSimulator:
    """Simulate e-auction bidding dynamics"""

    def __init__(self, starting_price, reserve_price, num_suppliers):
        self.starting_price = starting_price
        self.reserve_price = reserve_price
        self.num_suppliers = num_suppliers
        self.current_price = starting_price
        self.bids = []
        self.round = 0

    def simulate_round(self):
        """Simulate one bidding round"""

        self.round += 1

        # Each supplier decides whether to bid
        for supplier_id in range(self.num_suppliers):

            # Probability of bidding decreases as price approaches reserve
            price_gap = self.current_price - self.reserve_price
            bid_probability = min(0.9, price_gap / self.starting_price)

            if np.random.random() < bid_probability:
                # Bid reduction (0.5% to 2% of current price)
                reduction_pct = np.random.uniform(0.005, 0.02)
                new_bid = self.current_price * (1 - reduction_pct)
                new_bid = max(new_bid, self.reserve_price)

                self.bids.append({
                    'round': self.round,
                    'supplier': f'Supplier_{supplier_id+1}',
                    'bid': round(new_bid, 2)
                })

                # Update current price to lowest bid
                if new_bid < self.current_price:
                    self.current_price = new_bid

    def run_auction(self, max_rounds=10):
        """Run complete auction"""

        for _ in range(max_rounds):
            self.simulate_round()

            # Stop if no bids in last two rounds
            recent_bids = [b for b in self.bids if b['round'] >= self.round - 1]
            if len(recent_bids) == 0:
                break

        return {
            'starting_price': self.starting_price,
            'final_price': self.current_price,
            'savings': self.starting_price - self.current_price,
            'savings_%': ((self.starting_price - self.current_price) /
                         self.starting_price * 100),
            'total_rounds': self.round,
            'total_bids': len(self.bids),
            'bid_history': pd.DataFrame(self.bids)
        }


# Example: E-auction for IT hardware
auction = EAuctionSimulator(
    starting_price=1200,
    reserve_price=1050,
    num_suppliers=5
)

results = auction.run_auction(max_rounds=15)

print(f"\nE-Auction Results:")
print(f"Starting Price: ${results['starting_price']}")
print(f"Final Price: ${results['final_price']}")
print(f"Savings: ${results['savings']} ({results['savings_%']:.1f}%)")
print(f"Total Rounds: {results['total_rounds']}")
print(f"Total Bids: {results['total_bids']}")

# print("\nBid History:")
# print(results['bid_history'].tail(10))

カテゴリー戦略の策定

戦略テンプレート
class CategoryStrategy:
    """Comprehensive category strategy framework"""

    def __init__(self, category_name, annual_spend):
        self.category = category_name
        self.annual_spend = annual_spend
        self.strategy_elements = {}

    def set_positioning(self, kraljic_quadrant, rationale):
        """Set Kraljic positioning"""
        self.strategy_elements['positioning'] = {
            'quadrant': kraljic_quadrant,
            'rationale': rationale
        }

    def set_objectives(self, primary, secondary=None):
        """Set strategic objectives"""
        self.strategy_elements['objectives'] = {
            'primary': primary,
            'secondary': secondary or []
        }

    def set_sourcing_strategy(self, approach, num_suppliers, contract_term):
        """
        Define sourcing strategy

        approach: 'Single source', 'Dual source', 'Multiple suppliers'
        """
        self.strategy_elements['sourcing'] = {
            'approach': approach,
            'target_suppliers': num_suppliers,
            'contract_term_years': contract_term
        }

    def set_value_levers(self, levers):
        """
        Set prioritized value levers

        levers: list of dicts with lever details
        """
        self.strategy_elements['value_levers'] = levers

    def set_implementation_plan(self, milestones):
        """
        Set implementation milestones

        milestones: list of dicts with milestone, timeline, owner
        """
        self.strategy_elements['implementation'] = milestones

    def set_risks_mitigation(self, risks):
        """
        Set risks and mitigation plans

        risks: list of dicts with risk, impact, mitigation
        """
        self.strategy_elements['risks'] = risks

    def generate_strategy_document(self):
        """Generate comprehensive strategy document"""

        doc = []
        doc.append("=" * 80)
        doc.append(f"CATEGORY STRATEGY: {self.category.upper()}")
        doc.append("=" * 80)
        doc.append(f"Annual Spend: ${self.annual_spend:,.0f}")
        doc.append("")

        # Positioning
        if 'positioning' in self.strategy_elements:
            pos = self.strategy_elements['positioning']
            doc.append("STRATEGIC POSITIONING")
            doc.append("-" * 80)
            doc.append(f"Kraljic Quadrant: {pos['quadrant']}")
            doc.append(f"Rationale: {pos['rationale']}")
            doc.append("")

        # Objectives
        if 'objectives' in self.strategy_elements:
            obj = self.strategy_elements['objectives']
            doc.append("STRATEGIC OBJECTIVES")
            doc.append("-" * 80)
            doc.append(f"Primary: {obj['primary']}")
            if obj['secondary']:
                doc.append("Secondary:")
                for sec in obj['secondary']:
                    doc.append(f"  - {sec}")
            doc.append("")

        # Sourcing Strategy
        if 'sourcing' in self.strategy_elements:
            src = self.strategy_elements['sourcing']
            doc.append("SOURCING STRATEGY")
            doc.append("-" * 80)
            doc.append(f"Approach: {src['approach']}")
            doc.append(f"Target Number of Suppliers: {src['target_suppliers']}")
            doc.append(f"Contract Term: {src['contract_term_years']} years")
            doc.append("")

        # Value Levers
        if 'value_levers' in self.strategy_elements:
            doc.append("VALUE LEVERS & SAVINGS TARGETS")
            doc.append("-" * 80)
            total_savings = 0
            for i, lever in enumerate(self.strategy_elements['value_levers'], 1):
                doc.append(f"\n{i}. {lever['lever']}")
                doc.append(f"   Target Savings: ${lever['savings']:,.0f}")
                doc.append(f"   Timeline: {lever['timeline']}")
                total_savings += lever['savings']
            doc.append(f"\nTotal Target Savings: ${total_savings:,.0f} ({total_savings/self.annual_spend*100:.1f}%)")
            doc.append("")

        # Implementation Plan
        if 'implementation' in self.strategy_elements:
            doc.append("IMPLEMENTATION PLAN")
            doc.append("-" * 80)
            for milestone in self.strategy_elements['implementation']:
                doc.append(f"\n{milestone['milestone']}")
                doc.append(f"  Timeline: {milestone['timeline']}")
                doc.append(f"  Owner: {milestone['owner']}")
            doc.append("")

        # Risks
        if 'risks' in self.strategy_elements:
            doc.append("RISKS & MITIGATION")
            doc.append("-" * 80)
            for risk in self.strategy_elements['risks']:
                doc.append(f"\nRisk: {risk['risk']}")
                doc.append(f"  Impact: {risk['impact']}")
                doc.append(f"  Mitigation: {risk['mitigation']}")
            doc.append("")

        return "\n".join(doc)


# Example: IT Hardware category strategy
strategy = CategoryStrategy(category='IT Hardware', annual_spend=2000000)

strategy.set_positioning(
    kraljic_quadrant='Leverage',
    rationale='Multiple qualified suppliers, high spend volume'
)

strategy.set_objectives(
    primary='Reduce costs by 8-10% while maintaining quality',
    secondary=[
        'Consolidate supplier base from 8 to 3',
        'Standardize specifications',
        'Improve payment terms'
    ]
)

strategy.set_sourcing_strategy(
    approach='Dual source',
    num_suppliers=2,
    contract_term=2
)

strategy.set_value_levers([
    {'lever': 'Competitive bidding via RFP',
     'savings': 150000, 'timeline': 'Q1 2026'},
    {'lever': 'Supplier consolidation',
     'savings': 80000, 'timeline': 'Q2 2026'},
    {'lever': 'Specification standardization',
     'savings': 60000, 'timeline': 'Q3 2026'},
    {'lever': 'Payment terms optimization',
     'savings': 20000, 'timeline': 'Q1 2026'}
])

strategy.set_implementation_plan([
    {'milestone': 'Complete RFP and supplier selection',
     'timeline': 'Q1 2026', 'owner': 'Category Manager'},
    {'milestone': 'Negotiate contracts with selected suppliers',
     'timeline': 'Q2 2026', 'owner': 'Procurement Director'},
    {'milestone': 'Implement standardized specs across business units',
     'timeline': 'Q3 2026', 'owner': 'IT Director'},
    {'milestone': 'Monitor savings realization',
     'timeline': 'Ongoing', 'owner': 'Category Manager'}
])

strategy.set_risks_mitigation([
    {'risk': 'Supplier capacity constraints during transition',
     'impact': 'Medium',
     'mitigation': 'Phased transition, maintain backup supplier'},
    {'risk': 'Stakeholder resistance to standardization',
     'impact': 'High',
     'mitigation': 'Executive sponsorship, value communication'},
    {'risk': 'Market price increases',
     'impact': 'Low',
     'mitigation': 'Fixed pricing in contracts, 2-year term'}
])

print(strategy.generate_strategy_document())

ツールとライブラリ

Python ライブラリ

分析:

  • pandas:データ分析
  • numpy:数値計算
  • scipy:統計分析
  • scikit-learn:分析のための機械学習

最適化:

  • pulp:サプライヤー配分の最適化
  • cvxpy:凸最適化

可視化:

  • matplotlib、seaborn:グラフと分析
  • plotly:インタラクティブなダッシュボード
商用ソフトウェア

戦略的調達プラットフォーム:

  • SAP Ariba:調達と購買
  • Coupa:ソース・トゥ・ペイプラットフォーム
  • Jaggaer:戦略的調達スイート
  • GEP SMART:統合調達
  • Ivalua:ソース・トゥ・ペイ
  • Zycus:調達と購買
  • Keelvar:調達の最適化

電子調達ツール:

  • Ariba Sourcing:RFx とオークション
  • Coupa Sourcing:イベント管理
  • Scout RFP:RFP 管理
  • BidNet:公共部門の調達

カテゴリーインテリジェンス:

  • SpendHQ:支出と市場のインテリジェンス
  • Beroe:調達インテリジェンス
  • Market Dojo:調達とサプライヤー管理

よくある課題と解決策

課題:ステークホルダーの抵抗

問題:

  • 事業部門が既存のサプライヤーを好む
  • 「自社の要件は独特だ」
  • 供給途絶への懸念
  • 関係性への懸念

解決策:

  • ステークホルダーの早期関与
  • 価値(コスト削減、品質、サービス)を示す
  • 協力的な事業部門でパイロットプログラムを実施
  • 経営幹部の支援を得る
  • 懸念に先回りして対応する
  • 透明性の高いコミュニケーション
課題:カテゴリーに関する知識不足

問題:

  • 技術的な専門知識の不足
  • 供給市場を理解していない
  • サプライヤーの能力を評価できない
  • 仕様書の作成が難しい

解決策:

  • 分野の専門家(SME)を活用する
  • 現地訪問やサプライヤーとの面談
  • 業界団体の調査
  • コンサルタントやアドバイザーの支援
  • 市場情報を得るための RFI プロセス
  • 部門横断型のカテゴリー担当チーム
課題:サプライヤーの選択肢が限られている

問題:

  • 単一の調達先、またはサプライヤーが限られている
  • 地理的な制約
  • 専門的な要件
  • サプライヤーの寡占

解決策:

  • グローバル調達の拡大
  • 代替先を利用できるよう仕様を変更する
  • サプライヤー育成プログラム
  • 内製か外部調達かの分析
  • リスクを分担する長期的なパートナーシップ
  • 先行購入や在庫バッファー
課題:要件が複雑

問題:

  • 異なるニーズを持つ複数のステークホルダー
  • 要件の衝突
  • 仕様の定義が難しい
  • 提案の比較が難しい

解決策:

  • 要件の整理ワークショップ
  • 必須要件と望ましい要件に優先順位を付ける
  • 可能な範囲で標準化する
  • モジュール式の仕様
  • 評価に加重スコアリングを用いる
  • 概念実証または試験導入
課題:削減額の測定と追跡

問題:

  • ベースラインをめぐる議論
  • 帰属に関する疑問
  • 価格と数量の変化
  • 一時的か継続的か

解決策:

  • ベースラインを明確に定義する(調達開始前)
  • 価格の変化を数量と分けて追跡する
  • 第三者による検証
  • 削減額のガバナンスプロセス
  • 定期的な削減額監査
  • 透明性の高い報告

出力形式

カテゴリー戦略文書

エグゼクティブサマリー:

  • カテゴリーの概要と戦略的重要性
  • 分析から得られた主な知見
  • 推奨戦略と削減目標
  • 実施アプローチ

カテゴリー概要:

属性詳細
カテゴリーIT ハードウェア(ノートパソコン、デスクトップ、モニター)
年間支出額$2.0M
総支出に占める割合3.5%
Kraljic のクアドラントレバレッジ
現在のサプライヤー8社(取引中)
上位3社への集中度65%
サービス対象の事業部門全部門(5拠点)

供給市場分析:

  • 市場動向:競争が激しく、複数の Tier 1 サプライヤーが存在
  • 供給リスク:低い(供給が豊富で、適格な供給元が複数存在)
  • 価格動向:横ばいから下落傾向(コモディティ圧力)
  • 技術動向:クラウド/シンクライアントへの移行、更新サイクルの長期化
  • 主なサプライヤー:Dell、HP、Lenovo、Apple(OEM)、CDW、Insight(再販業者)

現状評価:

強み:

  • 主要 OEM との関係が確立されている
  • 品質と信頼性が良好
  • 納品実績は十分

弱み:

  • サプライヤー基盤が分散している(8社で条件に一貫性がない)
  • 仕様が標準化されていない(SKU のバリエーションが200以上)
  • 価格が市場ベンチマークを8~12%上回る
  • 支払条件と割引に一貫性がない

機会:

  • 2~3社の戦略的サプライヤーに集約する
  • 構成を標準化する(SKU を20~30種類に削減)
  • ボリュームを活用して価格を改善する
  • 支払条件を Net 45 に延長する

脅威:

  • 部品不足(チップ、ディスプレイ)
  • 技術の陳腐化リスク
  • 標準化に対する事業部門の抵抗

戦略的提案:

調達戦略:二社購買(70/30の配分)

  • 主力サプライヤー(70%):優先再販業者経由の Dell または HP
  • 副次サプライヤー(30%):競争性確保のための Lenovo または代替サプライヤー
  • 契約期間:2年間、1年間の延長オプション付き

価値提案:

  • 総削減目標:年間 $180K(支出額の9%)
  • サービスレベルと標準化の改善
  • 二社購買によるリスク軽減

実施ロードマップ:

Phase 1 (Months 1-3): RFP & Selection
  - Finalize requirements with stakeholders
  - Issue RFP to qualified suppliers
  - Evaluate proposals and select winners
  - Negotiate contracts

Phase 2 (Months 4-6): Transition & Onboarding
  - Establish catalogs and ordering process
  - Train stakeholders on new procedures
  - Transition volumes to new suppliers
  - Phase out non-strategic suppliers

Phase 3 (Months 7-12): Optimization
  - Monitor performance and compliance
  - Quarterly business reviews with suppliers
  - Track savings realization
  - Continuous improvement initiatives

期待される成果:

指標現状目標改善
年間総支出額$2.0M$1.82M-9%
サプライヤー数82-75%
標準化された SKU200以上25-88%
平均単価$1,200$1,100-8.3%
支払条件Net 30Net 45+15日
納期遵守率92%98%+6ポイント

確認事項

さらに詳しい情報が必要な場合:

  1. 戦略策定が必要なカテゴリーは何ですか?
  2. 年間支出額はいくらですか?
  3. 現在の調達方法と課題は何ですか?
  4. 主なステークホルダーは誰で、どのような優先事項がありますか?
  5. 供給市場について、どのような情報がわかっていますか?
  6. 既存のサプライヤーはいますか?その実績はどうですか?
  7. どのような制約がありますか?(技術、規制、地域)
  8. 主な目的は何ですか?(コスト、イノベーション、リスク、サステナビリティ)
  9. 新しい戦略を実施するまでのスケジュールはどのくらいですか?
  10. 調達イニシアチブにどのようなリソースを利用できますか?

関連スキル

  • supplier-selection:サプライヤー選定プロセスの実行用
  • spend-analysis:カテゴリーの支出分析用
  • procurement-optimization:発注配分とロットサイズの最適化用
  • contract-management:契約の交渉と管理用
  • supplier-risk-management:サプライヤーのリスク評価用
  • supply-chain-analytics:パフォーマンス追跡と KPI 用

コメント