PMP試験に出てくるEVM計算をやってみよう！

# EVM(Earned Value Management)とは
プロジェクトが計画した通りに進んでいるかを管理する進捗管理のツールである！

## 基本指標
|略語|正式名称|内容|
|:-:|:--|:--|
|BAC|Budget At Completion|最初の予算！|
|EV|Earned Value|計測時点で得られた成果！(予算*進捗率)|
|PV|Planned Value|計測時点で得る予定だった成果！(予算*計画進捗率)|
|AC|Actual Cost|計測時点で使ったお金！|

## 分析指標
|略語|正式名称|数式|内容|
|:-:|:--|:--|:--|
|SV|Schedule Variance|SV = EV - PV|計画差|
|CV|Cost Variance|CV = EV - AC|コスト差|
|SPI|Schedule Performance Index|SPI = EV / PV|計画パフォーマンス指標|
|CPI|Cost Performance Index|CPI = EV / AC|コストパフォーマンス指標|
|EAC|Estimate At Completion|EAC = BAC / CPI |完了時コスト予測|
|ETC|Estimate To Complete|ETC = EAC - AC|残り費用の予測|
|TCPI(BAC)|To-complete performance index(BAC)|( BAC - EV ) / ( BAC - AC )|BAC達成に必要なコストパフォーマンス|
|TCPI(EAC)|To-complete performance index(EAC)|( BAC - EV ) / ( EAC - AC )|EAC達成に必要なコストパフォーマンス|
|VAC|Variance At Completion|VAC = BAC - EAC|完了時コスト差|


## EVM計算ツール実行環境
```bash
$ python3 -V
Python 3.7.3
```
## EVM計算ツール
```skt-pmp-evm.py
# -*- coding: utf-8 -*-


class ProjectSnapshot:
    bac = 0  # Budget At Completion
    pv = 0  # Planned Value
    ev = 0  # Earned Value
    ac = 0  # Actual Cost

    sv = 0  # Schedule Variance
    cv = 0  # Cost Variance
    cpi = 0  # Cost Performance Index
    spi = 0  # Schedule Performance Index
    eac = 0  # Estimate At Completion
    etc = 0  # Estimate To Complete
    tcpi_bac = 0  # To-complete performance index (BAC)
    tcpi_eac = 0  # To-complete performance index (EAC)
    vac = 0  # Variance At Completion

    def __init__(self, bac, pv, ev, ac):
        self.bac = float(bac)
        self.pv = float(pv)
        self.ev = float(ev)
        self.ac = float(ac)

    def compute_evm(self):
        self.sv = self.ev - self.pv
        self.cv = self.ev - self.ac
        self.cpi = self.ev / self.ac
        self.spi = self.ev / self.pv
        self.eac = self.bac / self.cpi
        self.etc = self.eac - self.ac
        self.tcpi_bac = (self.bac - self.ev) / (self.bac - self.ac)
        self.tcpi_eac = (self.bac - self.ev) / (self.eac - self.ac)
        self.vac = self.bac - self.eac

    def print_status(self):
        print("----")
        print("BAC:" + str(self.bac))
        print("PV:" + str(self.pv))
        print("EV:" + str(self.ev))
        print("AC:" + str(self.ac))
        print("----")
        print("SV:" + str(self.sv))
        print("CV:" + str(self.cv))
        print("CPI:" + str(self.cpi))
        print("SPI:" + str(self.spi))
        print("EAC:" + str(self.eac))
        print("ETC:" + str(self.etc))
        print("TCPI_BAC:" + str(self.tcpi_bac))
        print("TCPI_EAC:" + str(self.tcpi_eac))
        print("VAC:" + str(self.vac))

if __name__ == "__main__":

    bac = input("Please Input [Budget At Completion]:")  # Budget At Completion
    pv = input("Please Input [Planned Value]:")  # Planned Value
    ev = input("Please Input [Earned Value]:")  # Earned Value
    ac = input("Please Input [Actual Cost]:")  # Actual Cost

    p = ProjectSnapshot(bac, pv, ev, ac)
    p.compute_evm()
    p.print_status()
```

## EVM計算ツールをgithubからcloneする
```bash
$ git clone https://github.com/Yumenoshima/skt-pmp-evm.git
Cloning into 'skt-pmp-evm'...
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.

$ cd skt-pmp-evm
```

## EVM計算ツールを使ってみる
```
$ python3 skt-pmp-evm.py 

Please Input [Budget At Completion]:1200
Please Input [Planned Value]:600
Please Input [Earned Value]:400
Please Input [Actual Cost]:500
----
BAC:1200.0
PV:600.0
EV:400.0
AC:500.0
----
SV:-200.0
CV:-100.0
CPI:0.8
SPI:0.6666666666666666
EAC:1500.0
ETC:1000.0
TCPI_BAC:1.1428571428571428
TCPI_EAC:0.8
VAC:-300.0
```

## 結果を分析
- 入力内容
    - BAC 当初予算1200ドル
    - PV 予定進捗600ドル分
    - EV 実際進捗400ドル分
    - AC かかった費用500ドル
- 分析結果
    - SV (EV-PV) 予定と実際の差 -200ドル （遅れている！)
    - CV (EV-AC) かかったコストと得られた効果の差 -100ドル (開発効率悪いよ！)
    - CPI (EV/AC) 得られた効果とかかったコストの割合 0.8 (開発コスト効率80%!) 
    - SPI (EV/PV) 得られた効果と予定の割合 0.66 (予定達成率66%!)
    - EAC (BAC/CPI) 完了時コスト予測 1500ドル (500ドル予算オーバー見込み！)
    - ETC (EAC-AC) 残コスト予測 1000ドル (あと1000ドルの費用で完了見込み!)
    - TCPI_BAC (BAC-EV)/(BAC-AC) 当初予算達成に必要なコスパ 1.14 (今後114%のパフォを出せば当初予算で終わるリカバリーが可能に！)
    - TCPI_EAC (BAC-EV)/(EAC-AC) コスト予測をキープするために必要なコスパ 0.8 (開発コスト効率80%維持でコスト予測通りになる！)
    - VAC （BAC-EAC） 完了時コスト差 -300ドル (完了時に300ドル予算オーバー見込み!)

----
おしまい