Assignment 3 — Spreadsheet simulation and decision model¶
Act as the analytics planner for a smart-thermostat launch: simulate twelve months of uncertain demand in Excel for two marketing strategies, freeze the simulation, chart both strategies' monthly profit in Tableau, and write a short executive report that recommends a strategy and explains why simulating uncertainty is safer than planning on a single number.
Adapted from the DATA 300 syllabus, Assignment 3 (Spreadsheet simulation and decision model). Brief rewritten for this classroom; the work is done in Microsoft Excel and Tableau, and this notebook adds optional checks.
Graded work: Assignment 3 (6%, CLO 3, 4 and 5)
- Set: Wednesday 18 November (Day 6), after the briefing in the lecture.
- Due: Sunday 22 November 2026, 23:59 China Standard Time.
- Submit: two files to the DATA 300: Assignment 3 drop-box on GAP (Moodle): your locked workbook
YourLastName_DATA300_Assignment3.xlsxand your reportYourLastName_Assignment3_Report.pdf.- Work: individual. Online support is available during the post-class week.
This notebook is the brief (read it all first) and a set of starter checks you can run on your own workbook. The graded work is the Excel file and the PDF report; you do not submit this notebook.
The scenario¶
You are an analytics planner at SmartHome Tech (a fictional company), which is about to launch an AI-powered thermostat. Earlier data mining by your team found two facts that the plan must respect:
- Baseline demand is about 1,000 units per month, but market volatility moves it up or down at random by up to 150 units in any month.
- Every thermostat sold earns a fixed profit margin of 100 US dollars.
Management must choose one of two marketing strategies for the first year:
| Strategy | Marketing cost | Effect on demand |
|---|---|---|
| A: Standard | 10,000 US dollars per month (fixed) | Baseline demand plus volatility |
| B: Aggressive | 25,000 US dollars per month (fixed) | 1.4 times the Standard demand |
Your simulation runs twelve months under the same random market conditions for both strategies, so that the comparison is fair.
What you must do¶
| Part | Tool | Task |
|---|---|---|
| 1 | Excel | Build the 12-month simulation, then lock the random numbers |
| 2 | Tableau | Chart both strategies' monthly profit as two lines; export the chart as an image |
| 3 | Word | Write a short executive report with the chart, answering two questions |
| 4 | GAP | Submit the locked workbook and the PDF report |
Part 1: The simulation in Excel¶
Open a blank workbook and save it straight away as YourLastName_DATA300_Assignment3.xlsx. Work on the first sheet and do not rename it (Tableau will show it as Sheet1, or 工作表1 in Chinese Excel).
Step 1: Headers¶
In row 1, from A1 to G1, type exactly: Month, Baseline_Demand, Market_Volatility, Standard_Demand, Aggressive_Demand, Standard_Profit, Aggressive_Profit. The underscores matter: Tableau uses these names as field names.
Step 2: Formulas¶
| Column | Rows 2–13 | What it means |
|---|---|---|
| A Month | Type 1 to 12 | The month of the first year |
| B Baseline_Demand | Type 1000 in every row |
The demand the data mining found |
| C Market_Volatility | In C2: =RANDBETWEEN(-150,150), then fill down to C13 |
A random monthly swing between −150 and +150 units |
| D Standard_Demand | In D2: =B2+C2, fill down |
Units sold with the Standard strategy |
| E Aggressive_Demand | In E2: =ROUND((B2+C2)*1.4,0), fill down |
1.4 times the Standard demand, rounded to whole units |
| F Standard_Profit | In F2: =(D2*100)-10000, fill down |
Units × 100 dollars margin − 10,000 dollars marketing |
| G Aggressive_Profit | In G2: =(E2*100)-25000, fill down |
Units × 100 dollars margin − 25,000 dollars marketing |
To fill a formula down, select the cell and double-click the small square at its bottom-right corner (the fill handle), or drag it to row 13. Press F9 a couple of times and watch columns C to G change: that is the simulation running.
Good practice (optional, not required for marks)
Day 5 taught you to keep inputs out of formulas. You may put the margin, the two marketing costs and the 1.4 multiplier in labelled cells to the right of the table (for example in column J) and refer to them with
$references. Keep columns A to G exactly as named above.
Step 3: Lock the simulation¶
RANDBETWEEN draws new numbers every time Excel recalculates. Tableau reads the values saved in the file, and your report must describe the same twelve months your chart shows, so you must freeze them:
- Select A1:G13 and copy (Ctrl + C).
- Without moving the selection, right-click A1 → Paste Special → Values (选择性粘贴 → 数值; the clipboard icon with 123).
- Click any cell in column C: the formula bar must now show a number, not
=RANDBETWEEN(…). - Save and close Excel.
Part 2: Decision chart in Tableau¶
- Open Tableau Desktop. Under Connect → To a File, click Microsoft Excel and open your workbook.
- Drag your sheet onto the canvas if it is not there already, then click the Sheet 1 worksheet tab at the bottom.
- Drag Month to the Columns shelf. Right-click the Month pill and choose Dimension, so that each month is a separate point instead of one sum.
- Drag Measure Values (at the bottom of the Data pane) to the Rows shelf.
- In the Measure Values card that appears below the Marks card, remove every measure except SUM(Standard Profit) and SUM(Aggressive Profit) (right-click → Remove).
- On the Marks card, change the mark type from Automatic to Line.
- Drag Measure Names onto Color in the Marks card, so each strategy has its own coloured line and a legend.
- Give the sheet a message title (double-click the title), label the y-axis with its unit (US dollars per month), and check that the colours are easy to tell apart.
- Worksheet → Export → Image…, save the picture as PNG or JPEG, and insert it into a blank Word document.
Part 3: The executive report¶
Write a short executive report (about one to two pages) for SmartHome Tech's management in the Word document that holds your Tableau chart. Put your name and student ID at the top. Lead with your recommendation, then answer the two questions in connected paragraphs, quoting numbers from your locked simulation with units.
| # | Question |
|---|---|
| 1 | Strategic decision. Using your Tableau chart, which marketing strategy gives the higher profit, and which gives the more consistent profit across the twelve months? In your simulation, was there any month in which the Aggressive strategy earned less than the Standard strategy because of its higher fixed cost in a weak month? Explain why this did or did not happen. |
| 2 | Why simulate? The model uses a random number generator (RANDBETWEEN) to represent the market volatility found by data mining. From a manager's point of view, why is a plan that includes this random risk safer than one that assumes exactly 1,000 units are sold every month? |
What a strong report does
- States the recommendation in the first sentence and quantifies it: total and average monthly profit of each strategy, and the difference, for your twelve months.
- Judges consistency with a number, not only by eye: the range (highest minus lowest month) or the standard deviation (
=STDEV.S(F2:F13)) of each strategy's monthly profit. Think about whether a larger spread in dollars means a riskier strategy here.- Answers "did Aggressive ever lose to Standard?" from the data and from the formulas: how weak would a month have to be?
- Names the limits: one simulated year of 12 months; volatility assumed even between −150 and +150; the 1.4 multiplier and the fixed margin taken as certain.
- Cites any source you use (APA style), including the course materials.
Part 4: Submit¶
| Step | What to do | File name |
|---|---|---|
| 1 | Check the workbook is locked (column C holds numbers, not formulas) and saved | YourLastName_DATA300_Assignment3.xlsx |
| 2 | Save the Word report, with the Tableau chart inside it, as PDF: File → Save As → PDF | YourLastName_Assignment3_Report.pdf |
| 3 | Log in to GAP (Moodle), open the DATA 300: Assignment 3 drop-box, upload both files and click Submit before the deadline |
Insert the chart into the Word document before saving, so the report is one PDF. If you exported the chart as a PDF instead, combine the files as shown in Combining PDFs without internet.
How it is marked¶
The assignment is marked out of 100 with the course's Assignment 3 rubric, then scaled to its 6% weight.
| Criterion | Points | What earns them here |
|---|---|---|
| CLO 3: computational problem-solving with data | 25 | A correct, complete simulation: exact headers, working formulas, twelve months, values locked |
| CLO 4: predictive models and spreadsheet simulation | 25 | Demand and profit modelled correctly for both strategies; results read correctly from the simulation, with numbers |
| CLO 5: evaluating BI tools in a case; managerial reporting with ethical and societal context | 30 | A clear, justified recommendation; consistency judged with evidence; a convincing explanation of why simulating uncertainty protects the organisation and the people who depend on it; limits named |
| Professional formatting | 10 | A clean report with the Tableau chart, correct file names, APA-style citations where used |
| Academic writing | 10 | Clear, organised paragraphs for managers; correct terms |
Each criterion is judged on a scale from exemplary (full points) through excellent, proficient, developing and unsatisfactory; a missing submission scores 0.
Starter checks (optional)¶
The cells below are optional helpers. Run them with Shift + Enter in JupyterLab.
1. A reference simulation¶
This cell runs the same model in Python with a fixed seed, so you can see what a correct table looks like. Your numbers will be different, because Excel has no seed; only the structure and the relationships between columns should match. Do not copy these numbers into your report.
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from openpyxl import load_workbook
from pathlib import Path
BLUE, ORANGE = "#2a78d6", "#eb6834"
pd.set_option("display.width", 120)
MARGIN, COST_STANDARD, COST_AGGRESSIVE, MULTIPLIER = 100, 10_000, 25_000, 1.4
def simulate(volatility):
"""The assignment's model for a given list of 12 monthly volatility values."""
sim = pd.DataFrame({"Month": range(1, 13), "Baseline_Demand": 1000, "Market_Volatility": volatility})
sim["Standard_Demand"] = sim["Baseline_Demand"] + sim["Market_Volatility"]
# Excel's ROUND rounds halves away from zero; 1.4 x a whole number never ends in .5, so np.round agrees here
sim["Aggressive_Demand"] = np.round(sim["Standard_Demand"] * MULTIPLIER).astype(int)
sim["Standard_Profit"] = sim["Standard_Demand"] * MARGIN - COST_STANDARD
sim["Aggressive_Profit"] = sim["Aggressive_Demand"] * MARGIN - COST_AGGRESSIVE
return sim
rng = np.random.default_rng(seed=322)
reference = simulate(rng.integers(-150, 151, 12)) # = RANDBETWEEN(-150, 150)
print("Reference simulation (fixed seed): same structure as your locked sheet")
print(reference.to_string(index=False))
Reference simulation (fixed seed): same structure as your locked sheet
Month Baseline_Demand Market_Volatility Standard_Demand Aggressive_Demand Standard_Profit Aggressive_Profit
1 1000 -121 879 1231 77900 98100
2 1000 -58 942 1319 84200 106900
3 1000 -62 938 1313 83800 106300
4 1000 -7 993 1390 89300 114000
5 1000 -99 901 1261 80100 101100
6 1000 -68 932 1305 83200 105500
7 1000 -46 954 1336 85400 108600
8 1000 -72 928 1299 82800 104900
9 1000 102 1102 1543 100200 129300
10 1000 24 1024 1434 92400 118400
11 1000 31 1031 1443 93100 119300
12 1000 -94 906 1268 80600 101800
2. Check your locked workbook¶
Save your locked workbook in the same folder as this notebook, type your file name in the first line of the next cell, and run it. The check reads your sheet and reports:
- whether the seven headers are exactly right;
- whether any formula is left (the simulation is not locked if
RANDBETWEENis still there); - whether every row follows the model's rules (for example D = B + C, and G = E × 100 − 25,000).
If the file is not found, the cell says so and does nothing else.
MY_FILE = "YourLastName_DATA300_Assignment3.xlsx" # change to your file name
HEADERS = ["Month", "Baseline_Demand", "Market_Volatility", "Standard_Demand",
"Aggressive_Demand", "Standard_Profit", "Aggressive_Profit"]
def check_workbook(path):
"""Check headers, locking and the model's rules in a student's Assignment 3 workbook."""
path = Path(path)
if not path.exists():
print(f"{path.name} was not found next to this notebook. Save your workbook here and try again.")
return None
sheet = load_workbook(path, data_only=False).worksheets[0]
formulas = [c.coordinate for row in sheet.iter_rows(min_row=1, max_row=13, max_col=7) for c in row
if isinstance(c.value, str) and c.value.startswith("=")]
data = pd.read_excel(path, sheet_name=0, usecols="A:G", nrows=12)
print(f"Sheet checked: {sheet.title}")
print("Headers:", "OK" if list(data.columns) == HEADERS else f"expected {HEADERS}, found {list(data.columns)}")
print("Locked: ", "OK, no formulas left" if not formulas else f"NOT locked, formulas in {formulas[:5]}...")
if list(data.columns) != HEADERS or data.isna().any().any():
print("Some headers are wrong or some cells are empty: fix them, lock the values in Excel, save, and run this again.")
return data
expected = simulate(data["Market_Volatility"].tolist())
wrong = [col for col in HEADERS if not (data[col] == expected[col]).all()]
print("Rules: ", "OK, every row follows the model" if not wrong else f"check the columns {wrong}")
return data
my_sim = check_workbook(MY_FILE)
YourLastName_DATA300_Assignment3.xlsx was not found next to this notebook. Save your workbook here and try again.
3. A quick chart to compare with Tableau¶
This chart uses your workbook if the check above found it, and the reference simulation otherwise. Your Tableau chart should show the same two lines. Use Tableau's chart, not this one, in your report.
data = my_sim if isinstance(my_sim, pd.DataFrame) and "Standard_Profit" in my_sim else reference
source = "your workbook" if data is not reference else "the reference simulation"
fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(data["Month"], data["Standard_Profit"], marker="o", color=BLUE, linewidth=2.5, label="Standard profit")
ax.plot(data["Month"], data["Aggressive_Profit"], marker="o", color=ORANGE, linewidth=2.5, label="Aggressive profit")
ax.set_title(f"Monthly profit of the two strategies ({source})", loc="left", fontweight="bold")
ax.set_xlabel("Month")
ax.set_ylabel("Profit (US dollars per month)")
ax.set_xticks(range(1, 13))
ax.legend(frameon=False)
ax.grid(alpha=0.3)
plt.show()

Final checklist¶
- Row 1 has the seven headers exactly; rows 2–13 hold months 1 to 12.
- The formulas were correct before locking (D = B + C; E rounded 1.4 × D; F and G subtract the right marketing cost).
- The simulation is locked: column C holds numbers, not
RANDBETWEEN. - The Tableau chart shows two lines, one per strategy, by month, with a legend and a message title.
- The report leads with a recommendation, answers both questions with numbers from my simulation, and names the limits.
- Two files uploaded to GAP by Sunday 22 November, 23:59 China Standard Time:
YourLastName_DATA300_Assignment3.xlsxandYourLastName_Assignment3_Report.pdf.