- マネジメント
EVMの計算方法 PV・EV・ACからSPI・CPIを例題とExcelで
EVM(Earned Value Management、出来高管理)とは、計画した作業量(PV)・完了した作業量(EV)・かかったコスト(AC)の3つを同じ単位(金額や工数)にそろえ、進み具合とコストの効率を数値で表す方法です。 3つの値さえ集まれば、あとは引き算と割り算だけで、遅れ・超過・完成時の見込みまで出せます。
この記事では、計算式と判定基準を1枚の早見表にまとめたうえで、10タスク・8週間の題材を使って第1週から第8週までの値を途中計算つきで追います。同じ表を表計算ソフトの数式(SUMIFS・SUMPRODUCT)で作る手順、Pythonでの検算、EVの計上ルールによる値の違い、例題10問も載せました。
確認環境:Python 3.11.2(標準ライブラリのみ)/表計算の数式は LibreOffice Calc 24.2.7 のヘッドレス実行で再計算し、Pythonの結果と一致することを確認(Excel用の xlsx 形式で保存したファイルを使用)。金額の単位はすべて万円です。
EVMの計算式と判定基準の早見表
| 指標 | 読み方・意味 | 計算式 | 判定の目安 |
|---|---|---|---|
| BAC | 完成時総予算 | 全タスクの予算の合計 | 基準値(計画時に決める) |
| PV | 計画価値。その時点までに終わっているはずの作業の予算 | 各タスクの予算 × 計画上の進捗率 の合計 | 基準値 |
| EV | 出来高。その時点までに完了した作業の予算 | 各タスクの予算 × 進捗率 の合計 | PV・ACと比べて使う |
| AC | 実コスト。その時点までに実際にかかったコスト | 実コストの累計 | EVと比べて使う |
| SV | スケジュール差異 | EV − PV | 正:前倒し/0:計画どおり/負:遅れ |
| CV | コスト差異 | EV − AC | 正:予算内/0:計画どおり/負:超過 |
| SPI | スケジュール効率指数 | EV ÷ PV | 1超:前倒し/1:計画どおり/1未満:遅れ |
| CPI | コスト効率指数 | EV ÷ AC | 1超:予算内/1:計画どおり/1未満:超過 |
| EAC ① | 完成時総コスト見積り(今の効率が続く) | BAC ÷ CPI | BACより大きければ超過の見込み |
| EAC ② | 同(残りは計画どおりの効率で進む) | AC + (BAC − EV) | ずれが一時的なときに使う |
| EAC ③ | 同(コストと日程の両方の効率が影響する) | AC + (BAC − EV) ÷ (CPI × SPI) | 納期が固定で遅れを取り戻す必要があるときに使う |
| EAC ④ | 同(残作業を見積もり直す) | AC + 再見積もりしたETC | 当初の計画の前提が変わったときに使う |
| ETC | 残作業コスト見積り | EAC − AC | 残りに必要なコスト |
| VAC | 完成時コスト差異 | BAC − EAC | 正:予算が余る見込み/負:超過の見込み |
| TCPI | 残作業効率指数(BAC基準) | (BAC − EV) ÷ (BAC − AC) | 1超:今後は今より高い効率が必要/1以下:余裕あり |
| TCPI | 同(EAC基準) | (BAC − EV) ÷ (EAC − AC) | 新しい目標額に収めるために必要な効率 |
覚え方は「差異はEVから引く、指数はEVを割る」 です。SVもCVも「EV − ○」、SPIもCPIも「EV ÷ ○」で、相手がPVならスケジュール、ACならコストを表します。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「EVMの計算方法 PV・EV・ACからSPI・CPIを例題とExcelで」
PV・EV・ACの3つを集める
EVMの計算はすべて、次の3つの値から始まります。
| 値 | 答える問い | 集める元 |
|---|---|---|
| PV | 今日までに、いくら分の作業が終わっている計画だったか | WBS(作業の分解)とスケジュール、タスクごとの予算 |
| EV | 今日までに、いくら分の作業が終わったか | タスクごとの進捗率(計上ルールは後述) |
| AC | 今日までに、いくら使ったか | 作業時間の記録 × 単価、外部への支払い |
EVは「かかったコスト」ではなく、完了した作業を「計画時の予算」で数えた値です。予算40万円のタスクが半分終われば、実際にいくらかかっていてもEVは20万円です。この「予算の物差しで出来高を数える」点が、EVMの中心にある考え方です。
題材:備品予約システムの開発(10タスク・8週間)
架空の「社内備品予約システム」を8週間で作る計画を題材にします。予算の合計(BAC)は500万円です。PVは、タスクの予算を計画期間の各週に均等に割り振って求めます。
計画(タスクと予算)
| ID | タスク | 予算 | 開始週 | 終了週 |
|---|---|---|---|---|
| T01 | 要件整理 | 40 | 1 | 1 |
| T02 | 画面設計 | 60 | 1 | 2 |
| T03 | DB設計 | 40 | 2 | 3 |
| T04 | 予約登録機能 | 80 | 3 | 4 |
| T05 | 予約一覧機能 | 60 | 3 | 5 |
| T06 | 管理画面 | 60 | 4 | 5 |
| T07 | 通知機能 | 40 | 5 | 6 |
| T08 | 結合テスト | 60 | 6 | 7 |
| T09 | 利用手引き | 20 | 7 | 7 |
| T10 | リリース準備 | 40 | 8 | 8 |
表計算ソフトに貼るときは次のタブ区切りを使えます。
ID タスク 予算 開始週 終了週
T01 要件整理 40 1 1
T02 画面設計 60 1 2
T03 DB設計 40 2 3
T04 予約登録機能 80 3 4
T05 予約一覧機能 60 3 5
T06 管理画面 60 4 5
T07 通知機能 40 5 6
T08 結合テスト 60 6 7
T09 利用手引き 20 7 7
T10 リリース準備 40 8 8
週ごとの記録(進捗率と実コスト)
毎週末に、動きのあったタスクだけ「累計の進捗率」と「その週にかかった実コスト」を1行ずつ記録します。
週 ID 累計進捗率 実コスト
1 T01 100 45
1 T02 40 28
2 T02 90 32
2 T03 30 15
3 T02 100 8
3 T03 100 30
3 T04 30 30
3 T05 10 8
4 T04 70 40
4 T05 40 20
4 T06 20 15
5 T04 100 30
5 T05 80 25
5 T06 60 25
5 T07 20 10
6 T05 100 12
6 T06 100 25
6 T07 80 25
6 T08 30 20
7 T07 100 8
7 T08 80 32
7 T09 100 20
8 T08 100 14
8 T10 100 42
週ごとのPV・EV・ACを途中計算つきで出す
各週の値を、どのタスクがいくら寄与しているかがわかる形で書きます。完了したタスク(計画上または記録上100%)は予算をそのまま足します。
| 週 | PV(計画) | EV(出来高) | AC(実コストの累計) |
|---|---|---|---|
| 1 | T01 40 + T02 60×1/2=30 = 70 | T01 40 + T02 60×40%=24 = 64 | 0 + (45+28) = 73 |
| 2 | T01 40 + T02 60 + T03 40×1/2=20 = 120 | T01 40 + T02 60×90%=54 + T03 40×30%=12 = 106 | 73 + (32+15) = 120 |
| 3 | T01〜T03 140 + T04 80×1/2=40 + T05 60×1/3=20 = 200 | T01〜T03 140 + T04 80×30%=24 + T05 60×10%=6 = 170 | 120 + (8+30+30+8) = 196 |
| 4 | T01〜T04 220 + T05 60×2/3=40 + T06 60×1/2=30 = 290 | T01〜T03 140 + T04 80×70%=56 + T05 60×40%=24 + T06 60×20%=12 = 232 | 196 + (40+20+15) = 271 |
| 5 | T01〜T06 340 + T07 40×1/2=20 = 360 | T01〜T04 220 + T05 60×80%=48 + T06 60×60%=36 + T07 40×20%=8 = 312 | 271 + (30+25+25+10) = 361 |
| 6 | T01〜T07 380 + T08 60×1/2=30 = 410 | T01〜T06 340 + T07 40×80%=32 + T08 60×30%=18 = 390 | 361 + (12+25+25+20) = 443 |
| 7 | T01〜T09 460 | T01〜T07 380 + T08 60×80%=48 + T09 20 = 448 | 443 + (8+32+20) = 503 |
| 8 | T01〜T10 500 | T01〜T10 500 | 503 + (14+42) = 559 |
SV・CV・SPI・CPIから完成時の見込みまで(第4週を例に)
第4週末の値(PV=290、EV=232、AC=271、BAC=500)を使って、すべての指標を順に計算します。
| 指標 | 途中計算 | 結果 | 読み取り |
|---|---|---|---|
| SV | 232 − 290 | −58 | 58万円分の作業が計画より遅れている |
| CV | 232 − 271 | −39 | 完了した作業に対して39万円多くかかっている |
| SPI | 232 ÷ 290 | 0.80 | 計画の80%の速さで進んでいる |
| CPI | 232 ÷ 271 | 0.86 | 1万円使って0.86万円分の作業が終わっている |
| EAC ① | 500 ÷ 0.8561 | 584.1 | 今の効率が続くと完成時は584万円 |
| EAC ② | 271 + (500 − 232) | 539.0 | 残りを計画どおりの効率で進められれば539万円 |
| EAC ③ | 271 + 268 ÷ (0.8561 × 0.80) | 662.3 | 遅れを取り戻すコストも見込むと662万円 |
| EAC ④ | 271 + 310(残作業を見積もり直した値) | 581.0 | 再見積もりを積み上げると581万円 |
| ETC | 584.1 − 271(EAC ①を使用) | 313.1 | 残りに313万円かかる見込み |
| VAC | 500 − 584.1 | −84.1 | 完成時に84万円の超過の見込み |
| TCPI(BAC基準) | (500 − 232) ÷ (500 − 271) = 268 ÷ 229 | 1.17 | 予算500万円に収めるには、残りを効率1.17で進める必要がある |
| TCPI(EAC基準) | (500 − 232) ÷ (550 − 271) = 268 ÷ 279 | 0.96 | 目標を550万円に改めた場合は、効率0.96で届く |
EAC ④の「310」は、残っているタスクを担当者が見積もり直して合計した値という想定です。
TCPIはCPIと並べて読みます。 第4週のCPIは0.86で、BAC基準のTCPIは1.17です。これまで0.86だった効率を、残りの期間は1.17まで上げる必要があるという意味になり、差が大きいほど当初の予算に収めるのが難しいことを示します。目標額を550万円に改めるとTCPIは0.96になり、今の効率(0.86)との差が縮まります。
EACの4通りはどれを使うか
| 状況 | 使う式 | 第4週の値 |
|---|---|---|
| これまでの効率が今後も続きそう | ① BAC ÷ CPI | 584.1 |
| ずれの原因が一時的で、すでに解消した | ② AC + (BAC − EV) | 539.0 |
| 納期を動かせず、遅れの回復にもコストがかかる | ③ AC + (BAC − EV) ÷ (CPI × SPI) | 662.3 |
| 計画の前提(範囲・体制・方式)が変わった | ④ AC + 再見積もりしたETC | 581.0 |
同じ時点でも539万円から662万円まで幅があります。報告では「どの式で出したEACか」を必ず添えると、数字の受け取り方がそろいます。
第1週〜第8週の全指標(Pythonの実行結果)
8週分をまとめて計算した結果です。EACは①〜③、ETCとVACはEAC ①、TCPIはBAC基準で出しています。
BAC = 500
週 PV EV AC SV CV SPI CPI EAC1 EAC2 EAC3 ETC VAC TCPI
1 70 64 73 -6 -9 0.91 0.88 570.3 509.0 616.9 497.3 -70.3 1.02
2 120 106 120 -14 -14 0.88 0.88 566.0 514.0 624.9 446.0 -66.0 1.04
3 200 170 196 -30 -26 0.85 0.87 576.5 526.0 643.6 380.5 -76.5 1.09
4 290 232 271 -58 -39 0.80 0.86 584.1 539.0 662.3 313.1 -84.1 1.17
5 360 312 361 -48 -49 0.87 0.86 578.5 549.0 612.0 217.5 -78.5 1.35
6 410 390 443 -20 -53 0.95 0.88 567.9 553.0 574.4 124.9 -67.9 1.93
7 460 448 503 -12 -55 0.97 0.89 561.4 555.0 562.9 58.4 -61.4 予算超過
8 500 500 559 0 -59 1.00 0.89 559.0 559.0 559.0 0.0 -59.0 予算超過
この表から読み取れることを4つ挙げます。
- CPIは0.86〜0.89でほぼ一定です。そのため EAC ①(BAC ÷ CPI)は第1週から560〜585万円の範囲に収まり、最終的な実コスト559万円に近い値を早い段階から示していました。
- SPIは第4週の0.80を底に、完了へ向けて1.00に戻ります。 完了時は必ず EV = PV = BAC になるため、SPIは終盤になるほど遅れを表しにくくなります。終盤の日程は、SPIに加えて残タスクの完了予定日でも確認します。
- BAC基準のTCPIは第6週に1.93まで上がりました。残り57万円の予算で110万円分の作業を終える必要がある、という状態です。CPIが0.88のままTCPIが2に近づいたら、目標額(EAC)を改めてEAC基準のTCPIに切り替える合図になります。
- 第7週以降はACがBACを超えたため、BAC基準のTCPIは計算の意味がなくなります(分母が0以下)。表では「予算超過」と表示しています。
折れ線グラフにするなら、横軸を週、縦軸を万円にしてPV・EV・ACの3本を引きます。EVがPVの下にあれば遅れ、ACがEVの上にあれば超過です。
Pythonで計算するコード(コピーして実行できます)
上の実行結果を出したコードの全体です。python3 evm.py で実行します。
# evm.py : 10タスク・8週間のEVMを計算する(Python 3.11、標準ライブラリのみ)
TASKS = [ # ID, 名称, 予算(万円), 開始週, 終了週
("T01", "要件整理", 40, 1, 1),
("T02", "画面設計", 60, 1, 2),
("T03", "DB設計", 40, 2, 3),
("T04", "予約登録機能", 80, 3, 4),
("T05", "予約一覧機能", 60, 3, 5),
("T06", "管理画面", 60, 4, 5),
("T07", "通知機能", 40, 5, 6),
("T08", "結合テスト", 60, 6, 7),
("T09", "利用手引き", 20, 7, 7),
("T10", "リリース準備", 40, 8, 8),
]
RECORDS = [ # 週, タスクID, 累計進捗率(%), その週の実コスト(万円)
(1, "T01", 100, 45), (1, "T02", 40, 28),
(2, "T02", 90, 32), (2, "T03", 30, 15),
(3, "T02", 100, 8), (3, "T03", 100, 30), (3, "T04", 30, 30), (3, "T05", 10, 8),
(4, "T04", 70, 40), (4, "T05", 40, 20), (4, "T06", 20, 15),
(5, "T04", 100, 30), (5, "T05", 80, 25), (5, "T06", 60, 25), (5, "T07", 20, 10),
(6, "T05", 100, 12), (6, "T06", 100, 25), (6, "T07", 80, 25), (6, "T08", 30, 20),
(7, "T07", 100, 8), (7, "T08", 80, 32), (7, "T09", 100, 20),
(8, "T08", 100, 14), (8, "T10", 100, 42),
]
BAC = sum(t[2] for t in TASKS)
def pv(week):
total = 0
for _id, _name, budget, start, end in TASKS:
if week >= end:
total += budget
elif week >= start:
total += budget * (week - start + 1) / (end - start + 1)
return total
def progress(task_id, week):
return max([p for w, t, p, _c in RECORDS if t == task_id and w <= week], default=0)
def ev(week, rule="percent"):
total = 0
for tid, _name, budget, _s, _e in TASKS:
p = progress(tid, week)
if rule == "percent": # 実際の進捗率
rate = p / 100
elif rule == "0-100": # 完了したら100%
rate = 1 if p == 100 else 0
elif rule == "50-50": # 着手で50%、完了で100%
rate = 1 if p == 100 else (0.5 if p > 0 else 0)
elif rule == "milestone": # 作成完了30%・レビュー完了70%・承認100%
rate = 1 if p == 100 else (0.7 if p >= 80 else (0.3 if p >= 50 else 0))
total += budget * rate
return total
def ac(week):
return sum(c for w, _t, _p, c in RECORDS if w <= week)
if __name__ == "__main__":
print(f"BAC = {BAC}")
print("週 PV EV AC SV CV SPI CPI EAC1 EAC2 EAC3 ETC VAC TCPI")
for w in range(1, 9):
p, e, a = pv(w), ev(w), ac(w)
spi, cpi = e / p, e / a
eac1 = BAC / cpi
eac2 = a + (BAC - e)
eac3 = a + (BAC - e) / (cpi * spi)
etc = eac1 - a
vac = BAC - eac1
tcpi = f"{(BAC - e) / (BAC - a):>5.2f}" if BAC > a else "予算超過"
print(f"{w:>2} {p:>4.0f} {e:>4.0f} {a:>4.0f} {e-p:>4.0f} {e-a:>4.0f} "
f"{spi:>5.2f} {cpi:>5.2f} {eac1:>6.1f} {eac2:>6.1f} {eac3:>6.1f} "
f"{etc:>5.1f} {vac:>5.1f} {tcpi}")
print()
print("週 実際の進捗率 0-100 50-50 マイルストーン")
for w in range(1, 9):
print(f"{w:>2} {ev(w):>10.0f} {ev(w,'0-100'):>8.0f} {ev(w,'50-50'):>6.0f} {ev(w,'milestone'):>10.0f}")
後半の出力(計上ルールの比較)は、次の「EVの計上ルール」で使います。
Excelの数式で同じ表を作る(SUMIFS・SUMPRODUCT)
シートを3枚用意します。数式はExcel用のxlsxファイルに書き込み、LibreOffice Calcで再計算して、8週分のPV・EV・ACがPythonの結果と一致することを確かめています。
| シート名 | 内容 | 範囲 |
|---|---|---|
| 計画 | 上の「計画」の表(A列:ID、B列:タスク、C列:予算、D列:開始週、E列:終了週) | A1:E11 |
| 記録 | 上の「週ごとの記録」(A列:週、B列:ID、C列:累計進捗率、D列:実コスト) | A1:D25(数式は200行目まで参照) |
| EVM | 1行目に見出し、A2〜A9に週(1〜8)、B列以降に数式 | A1:O9 |
EVMシートの2行目に次の数式を入れ、9行目までコピーします。
| セル | 指標 | 数式 |
|---|---|---|
| O2 | BAC | =SUM(計画!$C$2:$C$11) |
| B2 | PV | 下のコードブロック参照 |
| C2 | EV | 下のコードブロック参照 |
| D2 | AC | =SUMIFS(記録!$D$2:$D$200,記録!$A$2:$A$200,"<="&A2) |
| E2 | SV | =C2-B2 |
| F2 | CV | =C2-D2 |
| G2 | SPI | =C2/B2 |
| H2 | CPI | =C2/D2 |
| I2 | EAC ① | =O2/H2 |
| J2 | EAC ② | =D2+(O2-C2) |
| K2 | EAC ③ | =D2+(O2-C2)/(H2*G2) |
| L2 | ETC | =I2-D2 |
| M2 | VAC | =O2-I2 |
| N2 | TCPI | =IF(O2>D2,(O2-C2)/(O2-D2),"予算超過") |
PV(B2)は、SUMPRODUCTで「予算 × 計画上の進捗率」を全タスク分合計します。
=SUMPRODUCT(計画!$C$2:$C$11,
(計画!$D$2:$D$11<=A2)*(計画!$E$2:$E$11>A2)*(A2-計画!$D$2:$D$11+1)/(計画!$E$2:$E$11-計画!$D$2:$D$11+1)
+(計画!$E$2:$E$11<=A2))
(開始週<=A2)*(終了週>A2)は「作業の途中」のタスクだけ1になり、経過週数 ÷ 計画週数を掛けます。(終了週<=A2)は「計画上は完了済み」のタスクで1になり、予算の全額を足します。
EV(C2)は、MAXIFSで「その週までの最大の累計進捗率」をタスクごとに取り出し、SUMPRODUCTで予算と掛け合わせます。
=SUMPRODUCT(計画!$C$2:$C$11,
MAXIFS(記録!$C$2:$C$200,記録!$B$2:$B$200,計画!$A$2:$A$11,記録!$A$2:$A$200,"<="&A2))/100
MAXIFSは、Microsoftのサポートページによると Excel 2019 以降と Microsoft 365 で使える関数です。記録のないタスクは0が返るので、未着手のタスクは自動的にEV 0として扱われます。
再計算後の値(EVMシート、小数第2位で表示)は次のとおりで、Pythonの出力と同じです。
週 PV EV AC SV CV SPI CPI EAC① EAC② EAC③ ETC VAC TCPI
1 70 64 73 -6 -9 0.91 0.88 570.31 509 616.94 497.31 -70.31 1.02
2 120 106 120 -14 -14 0.88 0.88 566.04 514 624.95 446.04 -66.04 1.04
3 200 170 196 -30 -26 0.85 0.87 576.47 526 643.61 380.47 -76.47 1.09
4 290 232 271 -58 -39 0.80 0.86 584.05 539 662.31 313.05 -84.05 1.17
5 360 312 361 -48 -49 0.87 0.86 578.53 549 611.99 217.53 -78.53 1.35
6 410 390 443 -20 -53 0.95 0.88 567.95 553 574.36 124.95 -67.95 1.93
7 460 448 503 -12 -55 0.97 0.89 561.38 555 562.95 58.38 -61.38 予算超過
8 500 500 559 0 -59 1.00 0.89 559.00 559 559.00 0.00 -59.00 予算超過
EVの計上ルールで値はどう変わるか
進捗率は担当者の感覚に左右されやすいため、EVをいつ・いくら計上するかをルールで決めておく方法があります。代表的な4つを同じ記録に当てはめて比べます。
| ルール | 計上のしかた | 向いているタスク |
|---|---|---|
| 0-100 | 完了した時点で予算の100%を計上(途中は0) | 1〜2週間で終わる短いタスク |
| 50-50 | 着手で50%、完了で残り50%を計上 | 数週間のタスクで、進捗率を測りにくいもの |
| 重み付けマイルストーン | 途中の到達点ごとに決めた割合を計上 | 長いタスクで、成果物の区切りがはっきりしているもの |
| 実際の進捗率 | 報告された進捗率 × 予算を計上 | 数量で進み具合を測れるもの(画面数、テスト項目数など) |
重み付けマイルストーンは、この例では「作成完了(進捗率50%以上)で30%、レビュー完了(80%以上)で70%、承認(100%)で100%」と決めました。
第4週の時点でのタスク別EV
| ID | 予算 | 進捗率 | 実際の進捗率 | 0-100 | 50-50 | マイルストーン |
|---|---|---|---|---|---|---|
| T01 | 40 | 100 | 40 | 40 | 40 | 40 |
| T02 | 60 | 100 | 60 | 60 | 60 | 60 |
| T03 | 40 | 100 | 40 | 40 | 40 | 40 |
| T04 | 80 | 70 | 56 | 0 | 40 | 24 |
| T05 | 60 | 40 | 24 | 0 | 30 | 0 |
| T06 | 60 | 20 | 12 | 0 | 30 | 0 |
| T07〜T10 | 160 | 0 | 0 | 0 | 0 | 0 |
| 合計 | 500 | 232 | 140 | 240 | 164 |
同じ第4週でも、EVは140〜240万円まで変わります。PVは290、ACは271で共通なので、SPIとCPIは次のようになります。
| ルール | EV | SPI(EV÷290) | CPI(EV÷271) |
|---|---|---|---|
| 実際の進捗率 | 232 | 0.80 | 0.86 |
| 0-100 | 140 | 0.48 | 0.52 |
| 50-50 | 240 | 0.83 | 0.89 |
| 重み付けマイルストーン | 164 | 0.57 | 0.61 |
8週間の推移
evm.py の後半の出力です。
週 実際の進捗率 0-100 50-50 マイルストーン
1 64 40 70 40
2 106 40 90 82
3 170 140 210 140
4 232 140 240 164
5 312 220 300 280
6 390 340 390 368
7 448 400 430 442
8 500 500 500 500
- 0-100は最も控えめで、タスクが終わるまでEVが増えません。タスクを短く切っておくほど、ほかのルールとの差が小さくなります。
- 50-50は着手しただけで半分が入るため、第3週のように実際の進捗率より大きく出る週があります。着手だけして止まっているタスクが多いときは、値が高めに見えます。
- 最終週はどのルールでも500です。ルールで変わるのは途中の見え方だけなので、期間の途中でルールを切り替えないことが大切です。
表計算ソフトでは、基準週をB1セルに入れ、タスクごとの行(A列:ID、B列:予算)に次の数式を置きます。LibreOffice Calcで再計算した合計は 232/140/240/164 で、上の表と同じでした。
| 列 | 内容 | 数式(3行目) |
|---|---|---|
| C | 進捗率 | =MAXIFS(記録!$C$2:$C$200,記録!$B$2:$B$200,A3,記録!$A$2:$A$200,"<="&$B$1) |
| D | 実際の進捗率 | =B3*C3/100 |
| E | 0-100 | =B3*(C3=100) |
| F | 50-50 | =B3*((C3>0)*0.5+(C3=100)*0.5) |
| G | マイルストーン | =B3*IF(C3=100,1,IF(C3>=80,0.7,IF(C3>=50,0.3,0))) |
判定基準としきい値の決め方
SPI・CPIは「1より上か下か」が基本の判定です。そのうえで、どこから対応を始めるかの線は、プロジェクトごとに計画段階で決めておきます。下は決め方の一例です。
| SPI・CPIの範囲(例) | 状態 | 対応の例 |
|---|---|---|
| 1.00以上 | 計画どおり、または計画より良い | 継続。大きく上回る場合は見積もりや計上のしかたを確認 |
| 0.90以上1.00未満 | 小さなずれ | 原因を記録し、翌週の値を見る |
| 0.80以上0.90未満 | 対応が必要なずれ | 原因の分析、EACの出し直し、関係者への報告 |
| 0.80未満 | 計画の見直しが必要 | 範囲・体制・納期・予算の再調整を相談 |
SPIとCPIの組み合わせでも状況を整理できます。
| CPI 1以上 | CPI 1未満 | |
|---|---|---|
| SPI 1以上 | 日程・コストともに順調 | 進んでいるがコストがかかっている(人を多く投入した場合など) |
| SPI 1未満 | コストは収まっているが遅れている(着手できていない作業がある場合など) | 日程・コストの両方に対応が必要 |
題材の第4週はSPI 0.80・CPI 0.86で右下にあたります。
例題10問(解答つき)
問1〜問6は共通の条件(BAC=1,000、PV=400、EV=360、AC=450)を使います。単位は万円です。
| 問 | 問題 |
|---|---|
| 1 | SVとCVを求めてください。 |
| 2 | SPIとCPIを求めてください。 |
| 3 | 今の効率が続くとしたときのEAC、ETC、VACを求めてください。 |
| 4 | 残りは計画どおりの効率で進むとしたときのEACを求めてください。 |
| 5 | コストと日程の両方の効率が影響するとしたときのEACを求めてください。 |
| 6 | BAC基準のTCPIを求めてください。 |
| 7 | BAC=800、PV=500、EV=520、AC=480 のとき、SPI・CPI・EAC(BAC÷CPI)を求め、状態を判定してください。 |
| 8 | BAC=1,200、PV=600、EV=540、AC=540 のとき、SPI・CPIを求め、状態を判定してください。 |
| 9 | タスクA(予算100、完了)、B(予算200、進捗率60%)、C(予算100、進捗率10%)、D(予算100、着手前)があります。実際の進捗率・0-100・50-50の各ルールでEVを求めてください。 |
| 10 | BAC=300、PV=150、EV=120、AC=160 です。BAC基準のTCPIと、目標額を380に改めたときのEAC基準のTCPIを求めてください。 |
解答
| 問 | 途中計算 | 答え |
|---|---|---|
| 1 | SV = 360 − 400、CV = 360 − 450 | SV = −40、CV = −90 |
| 2 | SPI = 360 ÷ 400、CPI = 360 ÷ 450 | SPI = 0.90、CPI = 0.80 |
| 3 | EAC = 1,000 ÷ 0.80、ETC = 1,250 − 450、VAC = 1,000 − 1,250 | EAC = 1,250、ETC = 800、VAC = −250 |
| 4 | EAC = 450 + (1,000 − 360) | EAC = 1,090 |
| 5 | EAC = 450 + 640 ÷ (0.80 × 0.90) = 450 + 888.89 | EAC = 1,338.89 |
| 6 | TCPI = (1,000 − 360) ÷ (1,000 − 450) = 640 ÷ 550 | TCPI = 1.16 |
| 7 | SPI = 520 ÷ 500、CPI = 520 ÷ 480、EAC = 800 ÷ 1.0833 | SPI = 1.04、CPI = 1.08、EAC = 738.46。前倒しで予算内 |
| 8 | SPI = 540 ÷ 600、CPI = 540 ÷ 540 | SPI = 0.90、CPI = 1.00。コストは計画どおりで、日程が遅れている |
| 9 | 実際の進捗率:100 + 120 + 10 + 0/0-100:100 + 0 + 0 + 0/50-50:100 + 100 + 50 + 0 | 230/100/250 |
| 10 | BAC基準:(300 − 120) ÷ (300 − 160) = 180 ÷ 140/EAC基準:180 ÷ (380 − 160) = 180 ÷ 220 | 1.29/0.82 |
問8のように、CPIが1.00でもSPIが1未満なら遅れています。SPIとCPIは必ず両方を見ます。
つまずきやすい点と直し方
| つまずきやすい点 | こうなる | こうするとよい |
|---|---|---|
| EVを「使ったコスト」で計算する | EV = AC になり、CPIが常に1になる | EVは「予算 × 進捗率」で計算する |
| PV・EV・ACの単位が混ざる(金額と人日) | 差異や指数の意味がなくなる | 3つとも同じ単位(金額、または工数)にそろえる |
| 進捗率を「90%」のまま何週も報告する | EVが実際より大きく出る | 0-100や重み付けマイルストーンのように、完了の証拠で計上する |
| 途中でBAC(計画)を書き換える | 過去の週との比較ができなくなる | 変更は承認の記録を残し、変更前後のBACを分けて管理する |
| 終盤のSPIだけで日程を判断する | 完了が近づくとSPIが1に近づき、遅れが見えにくい | 残タスクの完了予定日と合わせて確認する |
| ACの集計が遅れて入る | その週だけCPIが高く出る | EVとACの締め日をそろえる |
よくある質問
Q. SPIが1.0なら日程は順調と言えますか? A. EVとPVの合計が等しいという意味で、個々のタスクの順番までは表しません。後回しにできる作業を先に進めてEVを積んでいる場合もSPIは1.0になります。納期に直結するタスク(クリティカルパス上のタスク)の完了予定日も合わせて確認すると確かです。
Q. 金額ではなく工数(人日・人時)でも計算できますか? A. できます。PV・EV・ACの3つを同じ単位にそろえれば、式はすべて同じです。工数で計算した場合、ACは「実際の工数」、EVは「予定工数 × 進捗率」になります。
Q. EACはどの式を使えばよいですか? A. これまでの効率が続くと見るなら BAC ÷ CPI、ずれが一時的なら AC + (BAC − EV)、納期を守るための追加コストも見込むなら AC + (BAC − EV) ÷ (CPI × SPI)、前提が変わったなら再見積もりの積み上げを使います。複数を並べて幅で示す方法も有効です。
Q. MAXIFSが使えない版のExcelではどうしますか?
A. 記録シートに、全タスクの累計進捗率を毎週1行ずつ(10タスク × 8週 = 80行)入力する形にすれば、EVの数式のMAXIFSをSUMIFSに置き換えられます。=SUMPRODUCT(計画!$C$2:$C$11,SUMIFS(記録!$C$2:$C$200,記録!$A$2:$A$200,A2,記録!$B$2:$B$200,計画!$A$2:$A$11))/100 をLibreOffice Calcで再計算したところ、8週分のEVは同じ値(64〜500)になりました。
まとめ
- EVMはPV・EV・ACの3つを同じ単位で集めれば、残りは引き算と割り算で出せます。
- 差異は「EV − ○」、指数は「EV ÷ ○」。 相手がPVなら日程、ACならコストを表します。
- EACは4通りあり、同じ時点でも値に幅が出ます。どの式で出したかを添えて報告します。
- TCPIはCPIと並べて読み、差が大きくなったら目標額を改めてEAC基準に切り替えます。
- SPIは完了時に必ず1.00に戻るため、終盤は残タスクの完了予定日も合わせて確認します。
- EVの計上ルール(0-100・50-50・重み付けマイルストーン・実際の進捗率)で途中の値は大きく変わります。 最初に決めて、途中で変えないことが大切です。
- 表計算ソフトではSUMPRODUCTでPVとEV、SUMIFSでACの累計を出せば、記録を1行足すだけで全指標が更新されます。
参考・出典
- PMI「Earned Value Management: Reading the Numbers」(SV・CV・SPI・CPI・EAC・TCPI・VACの式): https://www.pmi.org/blog/earned-value-management
- PMI「How to make earned value work on your project」(EACの3つの式、出来高の測り方): https://www.pmi.org/learning/library/make-earned-value-work-project-6001
- Microsoft サポート「MAXIFS 関数」(構文と対応する版): https://support.microsoft.com/ja-jp/office/maxifs-%E9%96%A2%E6%95%B0-dfd611e6-da2c-488a-919b-9b6376b28883
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「EVMの計算方法 PV・EV・ACからSPI・CPIを例題とExcelで」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。