strategic-sourcing について
調達・カテゴリー管理チーム向けの戦略的ソーシングスキルです。カテゴリー分析から市場評価、サプライヤー選定、契約までを整理し、Kraljic分析や価値向上策、コストモデルを扱います。
主な機能
- 017段階のソーシングプロセス
- 02Kraljicポートフォリオ分析
- 03価値向上策の特定
- 04製品・サービスのコストモデリング
- 05RFxと電子入札の管理
活用シーン
- 01カテゴリー戦略と調達方針の策定
- 02サプライヤー市場とリスクの評価
- 03提案の比較と交渉計画
- 04製品・サービスのコスト構造分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kishorkukreja/ awesome-supply-chain --skill strategic-sourcingインストール後、Claude Code で/strategic-sourcingを入力して読み込まれたか確認します。
詳細
戦略的ソーシング
戦略的ソーシングとカテゴリー管理の専門家として、サプライヤーとの関係、市場に関する洞察、分析の厳密さを通じて持続可能な価値をもたらす、包括的なカテゴリー戦略の策定と実行を支援します。
初期評価
ソーシング戦略を策定する前に、以下を把握します。
-
カテゴリーの背景
- どのカテゴリーまたは商品ですか?(直接材、間接材、サービス)
- 年間支出額はどの程度ですか?
- 戦略的重要性はどの程度ですか?(重要、レバレッジ、ボトルネック、非重要)
- 現在のソーシングの取り組みはどのようなものですか?
-
ビジネス要件
- ビジネス目標は何ですか?(コスト、イノベーション、リスク、サステナビリティ)
- ステークホルダーのニーズは何ですか?
- 技術仕様は何ですか?
- 需要量の予測はどのようなものですか?
-
市場動向
- 供給市場の特徴は何ですか?
- サプライヤーの数はどの程度ですか?
- 競争環境はどのようなものですか?
- 技術トレンドは何ですか?
- 価格の動向はどのようなものですか?
-
現状
- 既存のサプライヤーはどこですか?
- 契約条件はどのようなものですか?
- 既知の問題や機会はありますか?
- 過去の支出パターンはどのようなものですか?
戦略的ソーシングのフレームワーク
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% |
| サプライヤー数 | 8 | 2 | -75% |
| 標準化された SKU | 200以上 | 25 | -88% |
| 平均単価 | $1,200 | $1,100 | -8.3% |
| 支払条件 | Net 30 | Net 45 | +15日 |
| 納期遵守率 | 92% | 98% | +6ポイント |
確認事項
さらに詳しい情報が必要な場合:
- 戦略策定が必要なカテゴリーは何ですか?
- 年間支出額はいくらですか?
- 現在の調達方法と課題は何ですか?
- 主なステークホルダーは誰で、どのような優先事項がありますか?
- 供給市場について、どのような情報がわかっていますか?
- 既存のサプライヤーはいますか?その実績はどうですか?
- どのような制約がありますか?(技術、規制、地域)
- 主な目的は何ですか?(コスト、イノベーション、リスク、サステナビリティ)
- 新しい戦略を実施するまでのスケジュールはどのくらいですか?
- 調達イニシアチブにどのようなリソースを利用できますか?
関連スキル
- supplier-selection:サプライヤー選定プロセスの実行用
- spend-analysis:カテゴリーの支出分析用
- procurement-optimization:発注配分とロットサイズの最適化用
- contract-management:契約の交渉と管理用
- supplier-risk-management:サプライヤーのリスク評価用
- supply-chain-analytics:パフォーマンス追跡と KPI 用