Module 10 · Project Management Fundamentals
"Final project: the depot's week 10 review"
Plan your final project, a complete project review for the steering committee, with the schedule, earned value, forecast, risks and change decisions brought together into a status report and recommendations.
About 20 minutes
The problem
The steering committee meets at the end of week 10. They want one report: where the depot project stands, whether it will open by 30 September, what it will cost, what could still go wrong, and what they need to decide today. Your final project is that report, with the analysis behind it.
The concept
The parts of the review
| Part | Built in |
|---|---|
| Scope and WBS check | lessons 1 and 2 |
| Estimates and the baseline schedule with its critical path | lessons 3 and 4 |
| The probability of meeting the deadline | lesson 5 |
| Earned value and the cost forecast | lesson 6 |
| The forecast from progress and the RAG status | lesson 7 |
| Risks, responses and contingency | lesson 8 |
| Change decisions | lesson 9 |
One page first
Busy sponsors read the first page. Put the status, the forecast date and cost, and the decisions needed at the top; put the analysis behind it.
Example
The headline figures, recalculated in one place:
import numpy as np
import pandas as pd
base = "https://academy.cloudtechanalytics.com/datasets/project/"
tasks = pd.read_csv(base + "tasks.csv").fillna({"predecessors": ""}).set_index("task_id")
status = pd.read_csv(base + "weekly_status.csv")
risks = pd.read_csv(base + "risks.csv")
now = status[status["week"] == 10].set_index("task_id")
tasks["budget"] = tasks["likely_days"] * tasks["daily_cost_ngn"]
es, ef = {}, {}
for t, row in tasks.iterrows():
preds = [p for p in row["predecessors"].split(";") if p]
es[t] = max((ef[p] for p in preds), default=0)
ef[t] = es[t] + row["likely_days"]
pv = (tasks["budget"] * ((50 - pd.Series(es)) / tasks["likely_days"]).clip(0, 1)).sum()
ev = (tasks["budget"] * now["percent_complete"].reindex(tasks.index).fillna(0) / 100).sum()
ac = now["actual_cost_ngn"].sum()
bac = tasks["budget"].sum()
contingency = (risks["probability"] * risks["impact_ngn"]).sum()
summary = pd.Series({
"Tasks finished": f"{int((now['percent_complete'] == 100).sum())} of {len(tasks)}",
"SPI": f"{ev / pv:.2f}",
"CPI": f"{ev / ac:.2f}",
"Budget (BAC)": f"₦{bac:,.0f}",
"Forecast cost (EAC)": f"₦{bac / (ev / ac):,.0f}",
"Contingency (risk EMV)": f"₦{contingency:,.0f}",
"Budget plus contingency": f"₦{bac + contingency:,.0f}",
})
summaryTasks finished 12 of 23
SPI 0.80
CPI 0.77
Budget (BAC) ₦81,530,000
Forecast cost (EAC) ₦105,583,319
Contingency (risk EMV) ₦11,250,000
Budget plus contingency ₦92,780,000
dtype: objectThe forecast cost is above the budget and above budget plus contingency, even at the kinder estimate from lesson 6 (about ₦94.7 million). So the committee has two decisions, not one: how to protect the opening date (lesson 9), and whether to approve more money or find savings. The contingency was sized for risks that hadn't happened yet; two of them already have.
Walkthrough
- Build the full review: every part in the table above.
- Write the one-page summary first, then check every number in it against your analysis.
- List the decisions needed today, with your recommendation for each.
- Open the project brief on the course page and plan the write-up.
Practice
Practice
How many of the 23 tasks are finished at the end of week 10?
Task
10 minWrite the one-page summary for the steering committee (100 to 200 words): status with RAG, the forecast opening (with a probability or both forecasts), the forecast cost against budget and contingency, the top risks, and the decisions needed today with your recommendations.
Your work is checked for
- A RAG status
- A forecast date
- Cost against budget and contingency
- Risks named
- Decisions with recommendations
- Between 100 and 200 words
Check your understanding
Answer every question to check.