Skip to content

📊 工数試算の実践ガイド

工数試算は、プロジェクトの成功を左右する重要な経営スキルです。適切な工数試算により、現実的なスケジュールと予算を設定し、ステークホルダーの信頼を獲得できます。

問題のある状況:

PM: 「この機能、いつまでにできますか?」
開発者: 「うーん、3日くらいかな...」
(実際には1週間かかった)
問題点影響コスト
🎯 見積もりが不正確スケジュール遅延💰 予算超過
⏰ 計画性の欠如チーム負荷増加😰 ストレス増大
🤝 信頼関係の悪化ステークホルダー離れ📉 プロジェクト失敗

改善された状況:

適切な工数試算により:
✨ 見積もりが正確
📅 スケジュールが守られる
💰 予算が管理できる
🤝 ステークホルダーの信頼向上
メリット効果価値
🎯 現実的なスケジュール計画通りの進行📈 成功確率向上
💰 適切な予算管理コスト最適化💎 ROI向上
👥 リソース最適配置効率的な作業⚡ 生産性向上
単位定義計算式用途
👤 人時1人が1時間で完了する作業量基本単位細かいタスク
📅 人日1人が1日で完了する作業量8時間一般的な見積もり
📆 人月1人が1ヶ月で完了する作業量20人日 = 160時間プロジェクト全体

💡 実働時間の考慮:

const workingHours = {
perDay: 8, // 1日8時間
perMonth: 20, // 月20営業日
efficiency: 0.8 // 実効率80%(会議・休憩等を考慮)
};
// 実際の作業時間
const actualWorkingHours = {
perDay: workingHours.perDay * workingHours.efficiency, // 6.4時間
perMonth: workingHours.perMonth * workingHours.perDay * workingHours.efficiency // 128時間
};
フェーズ内容割合目安特徴
📋 設計要件定義、詳細設計20-25%🧠 思考集約的
💻 実装コーディング、単体テスト40-50%⚡ 作業集約的
🧪 テスト結合・システムテスト15-20%🔍 品質保証
🐛 デバッグバグ修正、リファクタリング10-15%🔧 問題解決
📖 ドキュメント設計書、マニュアル5-10%📝 知識共有
項目内容時間割合対策
🗣️ 会議定例会議、レビュー10-15%📊 効率化必須
💬 コミュニケーションメール、チャット5-10%🚀 ツール活用
📚 学習技術調査、勉強会5-10%🎯 計画的実施
🏖️ その他休暇、病欠5-10%📅 事前計画

📝 定義: タスクを細かく分解し、各タスクの工数を見積もって合計する方法

👍 メリット👎 デメリット
✅ 詳細な見積もりが可能⏰ 時間がかかる
📊 各タスクの工数が明確🔍 細かすぎると複雑
📈 進捗管理が容易🌳 木を見て森を見ず

💻 実践例:

interface Task {
id: string;
name: string;
subtasks: Subtask[];
estimatedHours: number;
confidence: 'high' | 'medium' | 'low';
}
// 🔐 ユーザー認証機能の開発例
const userAuthTask: Task = {
id: 'TASK-001',
name: '🔐 ユーザー認証機能の開発',
subtasks: [
{ id: 'ST-001', name: '🖥️ ログイン画面の実装', estimatedHours: 8, confidence: 'high' },
{ id: 'ST-002', name: '🔌 認証APIの実装', estimatedHours: 16, confidence: 'medium' },
{ id: 'ST-003', name: '🍪 セッション管理の実装', estimatedHours: 8, confidence: 'high' },
{ id: 'ST-004', name: '🧪 単体テストの作成', estimatedHours: 8, confidence: 'high' },
{ id: 'ST-005', name: '🔗 結合テストの実施', estimatedHours: 4, confidence: 'medium' },
{ id: 'ST-006', name: '🐛 バグ修正バッファ', estimatedHours: 8, confidence: 'low' },
],
estimatedHours: 52, // 📊 合計: 6.5人日
confidence: 'medium'
};

📝 定義: プロジェクト全体の工数を見積もり、それを各タスクに配分する方法

👍 メリット👎 デメリット
⚡ 迅速に見積もりが可能🔍 詳細な見積もりが困難
🌍 プロジェクト全体の把握が容易❓ 各タスクの工数が不明確
📊 予算計画に適している🎯 精度が低い場合がある

📊 実践例:

// 🏗️ プロジェクト全体の工数配分
const projectEstimate = {
totalDays: 100,
phases: {
'📋 要件定義': { days: 10, percentage: 10 },
'🎨 設計': { days: 20, percentage: 20 },
'💻 開発': { days: 50, percentage: 50 },
'🧪 テスト': { days: 15, percentage: 15 },
'🚀 デプロイ': { days: 5, percentage: 5 }
}
};
// 🎯 機能別配分
const featureAllocation = {
'🔐 ユーザー認証': 10, // 10%
'📦 商品管理': 25, // 25%
'🛒 注文処理': 30, // 30%
'💳 決済機能': 20, // 20%
'📊 管理画面': 15 // 15%
};

3. 🔄 類推見積もり(アナロジー法)

Section titled “3. 🔄 類推見積もり(アナロジー法)”

📝 定義: 過去の類似プロジェクトの実績を基に工数を見積もる方法

👍 メリット👎 デメリット
📈 過去の実績を活用📊 実績データが必要
⚡ 比較的迅速🔍 プロジェクトの違いを考慮必要
🎯 現実的な見積もり📉 新技術には不向き

📊 実践例:

interface ProjectHistory {
name: string;
features: string[];
actualDays: number;
complexity: 'low' | 'medium' | 'high';
teamSize: number;
}
const pastProjects: ProjectHistory[] = [
{
name: '🛒 ECサイト(小規模)',
features: ['商品一覧', 'カート', '決済'],
actualDays: 60,
complexity: 'low',
teamSize: 3
},
{
name: '🏢 ECサイト(中規模)',
features: ['商品一覧', 'カート', '決済', '会員管理', '管理画面'],
actualDays: 120,
complexity: 'medium',
teamSize: 5
}
];
// 🎯 類推による見積もり
function estimateByAnalogy(
newFeatures: string[],
pastProjects: ProjectHistory[]
): number {
const similarProject = findMostSimilar(newFeatures, pastProjects);
const complexityFactor = calculateComplexityFactor(newFeatures, similarProject);
return similarProject.actualDays * complexityFactor;
}

📝 定義: 楽観値、悲観値、最頻値の3つの値から工数を算出する方法

👍 メリット👎 デメリット
🎯 不確実性を考慮🔢 3つの値の見積もりが必要
⚖️ リスクを考慮した見積もり🧮 計算が複雑
📊 統計的に信頼性が高い🤔 経験が必要

🧮 PERT計算式:

見積もり工数 = (楽観値 + 4 × 最頻値 + 悲観値) ÷ 6

💻 実践例:

interface ThreePointEstimate {
optimistic: number; // 😊 楽観値(最良のケース)
pessimistic: number; // 😰 悲観値(最悪のケース)
mostLikely: number; // 🎯 最頻値(最も可能性が高い)
}
function calculatePERT(estimate: ThreePointEstimate): {
expected: number;
standardDeviation: number;
confidence90: number;
} {
const expected = (
estimate.optimistic +
4 * estimate.mostLikely +
estimate.pessimistic
) / 6;
const standardDeviation = (estimate.pessimistic - estimate.optimistic) / 6;
const confidence90 = expected + 1.645 * standardDeviation; // 90%信頼区間
return { expected, standardDeviation, confidence90 };
}
// 🔐 ユーザー認証機能の例
const userAuthEstimate: ThreePointEstimate = {
optimistic: 4, // 😊 4人日(すべて順調)
pessimistic: 12, // 😰 12人日(問題多発)
mostLikely: 7 // 🎯 7人日(通常ケース)
};
const result = calculatePERT(userAuthEstimate);
// 📊 結果: 期待値 7.3人日、90%信頼区間 9.1人日
🎯 機能🎨 設計💻 開発🧪 テスト📝 ドキュメント🔄 合計💰 コスト
🔐 ユーザー認証1日4日1日0.5日6.5日¥520,000
📦 商品管理2日6日2日1日11日¥880,000
🛒 カート機能2日8日2日1日13日¥1,040,000
💳 決済処理3日12日3日2日20日¥1,600,000
📊 管理画面3日10日2日2日17日¥1,360,000
📱 レスポンシブ対応1日5日2日0.5日8.5日¥680,000
🎯 合計12日45日12日7日76日¥6,080,000

💡 単価: ¥80,000/人日で計算

interface ProjectPhase {
phase: string;
days: number;
percentage: number;
milestone: string;
deliverables: string[];
}
const projectPhases: ProjectPhase[] = [
{
phase: '📋 要件定義',
days: 8,
percentage: 10.5,
milestone: '要件確定',
deliverables: ['要件定義書', 'ユーザーストーリー', 'UI/UXデザイン']
},
{
phase: '🎨 基本設計',
days: 12,
percentage: 15.8,
milestone: '設計完了',
deliverables: ['システム設計書', 'DB設計書', 'API仕様書']
},
{
phase: '💻 開発実装',
days: 45,
percentage: 59.2,
milestone: '機能実装完了',
deliverables: ['各機能モジュール', '単体テスト', 'コードレビュー']
},
{
phase: '🧪 テスト',
days: 8,
percentage: 10.5,
milestone: 'テスト完了',
deliverables: ['テスト仕様書', 'テスト結果', 'バグ修正']
},
{
phase: '🚀 リリース',
days: 3,
percentage: 4.0,
milestone: '本番稼働',
deliverables: ['デプロイ', '運用手順書', '保守マニュアル']
}
];
👤 役割👥 人数💰 単価/日📊 稼働率🎯 主な担当
🎯 PM1名¥100,00050%プロジェクト管理、進捗管理
🏗️ アーキテクト1名¥120,00030%システム設計、技術選定
👨‍💻 シニア開発者2名¥100,000100%核心機能開発、レビュー
👩‍💻 ジュニア開発者2名¥60,000100%一般機能開発、テスト
🎨 デザイナー1名¥80,00040%UI/UX設計、フロントエンド
🧪 QAエンジニア1名¥80,00060%テスト設計、品質保証

💰 総人件費計算:

const teamCost = {
pm: 100000 * 0.5 * 76, // ¥3,800,000
architect: 120000 * 0.3 * 76, // ¥2,736,000
seniorDev: 100000 * 1.0 * 76 * 2, // ¥15,200,000
juniorDev: 60000 * 1.0 * 76 * 2, // ¥9,120,000
designer: 80000 * 0.4 * 76, // ¥2,432,000
qa: 80000 * 0.6 * 76 // ¥3,648,000
};
const totalCost = Object.values(teamCost).reduce((sum, cost) => sum + cost, 0);
// 💰 総額: ¥36,936,000
📊 プロジェクト複雑度🎯 推奨バッファ📈 適用ケース⚠️ 注意点
🟢 低複雑度5-10%既知技術、経験豊富チーム過小見積もりリスク
🟡 中複雑度15-25%新技術混在、標準チームバランス重要
🔴 高複雑度25-40%新技術、新チーム、新領域過大見積もりリスク
interface BufferStrategy {
baseEstimate: number;
complexity: 'low' | 'medium' | 'high';
teamExperience: 'junior' | 'mixed' | 'senior';
technologyRisk: 'low' | 'medium' | 'high';
bufferPercentage: number;
finalEstimate: number;
}
function calculateBuffer(
baseEstimate: number,
factors: {
complexity: 'low' | 'medium' | 'high';
teamExperience: 'junior' | 'mixed' | 'senior';
technologyRisk: 'low' | 'medium' | 'high';
}
): BufferStrategy {
const bufferMatrix = {
complexity: { low: 5, medium: 15, high: 25 },
teamExperience: { senior: 0, mixed: 10, junior: 20 },
technologyRisk: { low: 0, medium: 10, high: 20 }
};
const totalBuffer =
bufferMatrix.complexity[factors.complexity] +
bufferMatrix.teamExperience[factors.teamExperience] +
bufferMatrix.technologyRisk[factors.technologyRisk];
const cappedBuffer = Math.min(totalBuffer, 50); // 最大50%
const finalEstimate = baseEstimate * (1 + cappedBuffer / 100);
return {
baseEstimate,
...factors,
bufferPercentage: cappedBuffer,
finalEstimate
};
}
🎯 リスク要因📊 影響度🎲 発生確率🔢 リスクスコア🛡️ 対策
🆕 新技術採用4/530%1.2📚 事前学習、🧪 PoC実施
📝 要件変更3/550%1.5🔒 要件凍結、📋 変更管理
👥 リソース不足5/520%1.0🔄 代替要員、📈 スキルアップ
🔗 外部連携3/540%1.2🧪 早期テスト、📞 密な連携
🏢 承認遅延2/560%1.2⏰ 早期エスカレーション
interface RiskAssessment {
factor: string;
impact: number; // 1-5スケール
probability: number; // 0-1スケール
riskScore: number; // impact × probability
mitigation: string[];
contingency: string;
}
function assessProjectRisks(baseEstimate: number): {
risks: RiskAssessment[];
adjustedEstimate: number;
confidenceLevel: number;
} {
const risks: RiskAssessment[] = [
{
factor: '🆕 新技術採用',
impact: 4,
probability: 0.3,
riskScore: 1.2,
mitigation: ['事前学習', 'PoC実施', '専門家コンサル'],
contingency: '従来技術への切り替え'
},
{
factor: '📝 要件変更',
impact: 3,
probability: 0.5,
riskScore: 1.5,
mitigation: ['要件凍結', '変更管理プロセス', 'ステークホルダー合意'],
contingency: 'スコープ調整'
}
];
const totalRiskScore = risks.reduce((sum, risk) => sum + risk.riskScore, 0);
const riskAdjustment = 1 + (totalRiskScore / 10);
const adjustedEstimate = baseEstimate * riskAdjustment;
// 信頼度計算(リスクが低いほど高い)
const confidenceLevel = Math.max(0.6, 1 - (totalRiskScore / 20));
return {
risks,
adjustedEstimate,
confidenceLevel
};
}
📅 フェーズ🎯 精度📊 信頼区間🔍 根拠📈 改善アクション
🌱 初期構想±50%50-150%類推、経験則📋 要件明確化
📋 要件定義後±25%75-125%機能分解、WBS🎨 詳細設計
🎨 設計完了後±15%85-115%詳細タスク分解🧪 プロトタイプ
🧪 開発開始後±10%90-110%実績ベース📊 継続監視
interface EstimateEvolution {
phase: string;
accuracy: string;
confidenceRange: [number, number];
baseEstimate: number;
adjustedRange: [number, number];
basisOfEstimate: string[];
}
function evolveEstimate(
initialEstimate: number,
phase: 'concept' | 'requirements' | 'design' | 'development'
): EstimateEvolution {
const phaseData = {
concept: {
accuracy: '±50%',
confidenceRange: [0.5, 1.5] as [number, number],
basisOfEstimate: ['類推', '経験則', '概算']
},
requirements: {
accuracy: '±25%',
confidenceRange: [0.75, 1.25] as [number, number],
basisOfEstimate: ['機能分解', 'WBS', 'ユーザーストーリー']
},
design: {
accuracy: '±15%',
confidenceRange: [0.85, 1.15] as [number, number],
basisOfEstimate: ['詳細設計', 'タスク分解', 'アーキテクチャ']
},
development: {
accuracy: '±10%',
confidenceRange: [0.9, 1.1] as [number, number],
basisOfEstimate: ['実績データ', '進捗実測', 'ベロシティ']
}
};
const data = phaseData[phase];
return {
phase,
accuracy: data.accuracy,
confidenceRange: data.confidenceRange,
baseEstimate: initialEstimate,
adjustedRange: [
initialEstimate * data.confidenceRange[0],
initialEstimate * data.confidenceRange[1]
],
basisOfEstimate: data.basisOfEstimate
};
}

🏆 工数試算のベストプラクティス

Section titled “🏆 工数試算のベストプラクティス”

📈 過去実績データの戦略的活用

Section titled “📈 過去実績データの戦略的活用”
interface HistoricalMetrics {
project: string;
feature: string;
estimatedDays: number;
actualDays: number;
variance: number; // 差異率
complexity: 'low' | 'medium' | 'high';
teamProductivity: number; // 生産性係数
lessons: string[];
}
class EstimationDatabase {
private history: HistoricalMetrics[] = [];
// 📊 調整係数の計算
calculateAdjustmentFactor(
feature: string,
complexity: 'low' | 'medium' | 'high'
): number {
const relevantData = this.history.filter(
h => h.feature === feature && h.complexity === complexity
);
if (relevantData.length === 0) return 1.0;
const avgVariance = relevantData.reduce(
(sum, data) => sum + data.variance, 0
) / relevantData.length;
return 1 + (avgVariance / 100);
}
// 🎯 信頼度の計算
getConfidenceLevel(feature: string): number {
const dataPoints = this.history.filter(h => h.feature === feature).length;
if (dataPoints >= 10) return 0.9; // 高信頼度
if (dataPoints >= 5) return 0.75; // 中信頼度
if (dataPoints >= 2) return 0.6; // 低信頼度
return 0.4; // 非常に低い
}
}
👤 経験レベル🎯 生産性係数📊 品質係数🔄 学習コスト💡 最適配置
🌟 シニア1.3-1.5x1.2x🏗️ アーキテクチャ、🔍 レビュー
👨‍💻 ミドル1.0x1.0x💻 核心機能、🧪 テスト設計
🌱 ジュニア0.6-0.8x0.8x🎨 UI実装、📝 ドキュメント
interface TeamProductivity {
member: string;
level: 'junior' | 'middle' | 'senior';
productivity: number;
qualityFactor: number;
learningCost: number;
specialties: string[];
}
function calculateTeamEfficiency(team: TeamProductivity[]): {
averageProductivity: number;
qualityAdjustment: number;
learningOverhead: number;
} {
const totalProductivity = team.reduce((sum, member) =>
sum + member.productivity, 0) / team.length;
const qualityAdjustment = team.reduce((sum, member) =>
sum + member.qualityFactor, 0) / team.length;
const learningOverhead = team.reduce((sum, member) =>
sum + member.learningCost, 0) / team.length;
return {
averageProductivity: totalProductivity,
qualityAdjustment,
learningOverhead
};
}
graph TD
A[🌱 初期見積もり] --> B[📋 要件明確化]
B --> C[🎨 詳細設計]
C --> D[🧪 プロトタイプ]
D --> E[📊 最終見積もり]
A -.-> F[±50% 精度]
B -.-> G[±25% 精度]
C -.-> H[±15% 精度]
D -.-> I[±10% 精度]
E -.-> J[±5% 精度]

🎯 見積もり品質チェックリスト

Section titled “🎯 見積もり品質チェックリスト”
✅ チェック項目🎯 基準📊 重要度🔍 確認方法
📋 要件の明確性90%以上明確🔴 高ステークホルダー確認
🏗️ WBS完成度レベル3まで分解🔴 高タスク粒度チェック
📊 過去実績参照類似プロジェクト3件以上🟡 中データベース検索
👥 チーム確定80%以上確定🟡 中リソース計画確認
⚠️ リスク評価主要リスク5件以上特定🟡 中リスクレジスター
🛡️ バッファ設定適切な%設定🟢 低複雑度マトリクス
interface EstimationQuality {
requirementClarity: number; // 0-1
wbsCompleteness: number; // 0-1
historicalDataUsage: boolean;
teamConfirmation: number; // 0-1
riskAssessment: number; // 0-1
bufferAppropriateness: boolean;
}
function assessEstimationQuality(quality: EstimationQuality): {
score: number;
grade: 'A' | 'B' | 'C' | 'D';
recommendations: string[];
} {
const weights = {
requirementClarity: 0.3,
wbsCompleteness: 0.25,
historicalDataUsage: 0.15,
teamConfirmation: 0.15,
riskAssessment: 0.1,
bufferAppropriateness: 0.05
};
const score =
quality.requirementClarity * weights.requirementClarity +
quality.wbsCompleteness * weights.wbsCompleteness +
(quality.historicalDataUsage ? 1 : 0) * weights.historicalDataUsage +
quality.teamConfirmation * weights.teamConfirmation +
quality.riskAssessment * weights.riskAssessment +
(quality.bufferAppropriateness ? 1 : 0) * weights.bufferAppropriateness;
let grade: 'A' | 'B' | 'C' | 'D';
if (score >= 0.9) grade = 'A';
else if (score >= 0.8) grade = 'B';
else if (score >= 0.7) grade = 'C';
else grade = 'D';
const recommendations = [];
if (quality.requirementClarity < 0.8) {
recommendations.push('📋 要件をより明確にする');
}
if (quality.wbsCompleteness < 0.8) {
recommendations.push('🏗️ WBSをより詳細に分解する');
}
if (!quality.historicalDataUsage) {
recommendations.push('📊 過去実績データを活用する');
}
return { score, grade, recommendations };
}

📊 まとめ:成功する工数試算の要点

Section titled “📊 まとめ:成功する工数試算の要点”
📈 要因💡 ポイント🎯 目標
🔍 精度向上段階的な見積もり精度向上±10%以内
⚖️ リスク管理適切なバッファとリスク対策90%以上の成功率
👥 チーム考慮生産性と経験レベルの反映現実的な計画
📊 データ活用過去実績の戦略的活用継続的改善
🔄 プロセス改善見積もりプロセスの標準化組織的成熟
  1. 📊 データベース構築 - 過去プロジェクトの実績収集
  2. 🛠️ ツール導入 - 見積もりツールとテンプレート整備
  3. 👥 チーム教育 - 見積もり手法の標準化とトレーニング
  4. 🔄 継続改善 - 定期的な見積もり精度レビューと改善

適切な工数試算により、プロジェクトの成功確率を大幅に向上させ、ステークホルダーとの信頼関係を構築できます。