G.3Distributions
The middle figure hides the stall that is struggling, and so does a typical case. Here are the 5,000 simulated stalls of each type behind D.4, What the Hawker Earns per Hour, generated again from the same starting number (the seed), so the results match, and shown in tenths, quarters and averages. Put together, with each type counted by its real number of stalls, the middle stall makes $2,720 a month; one stall in four makes less than $1,568; and 29% make less than $1,760. ($1,760 is MOM's 2021 figure of $1,470 for hawkers who employ no one, in 2026 prices.)
The redraw is checked against results.json as it runs: each type's median, and the pooled median and share under the line, must match D.4 exactly. Every value below is Derived; the draws themselves rest on the Assumption ranges in the first table.
G.3.1The inputs and what they draw
Each input as the model draws it for a simulated stall, and the 10th, 50th and 90th percentiles (the level a given share of results stays below) it gives for the tendered stall, with the medians for two coffeeshop types. The download has all six types. g3-inputs.csv
| Input | Draw, as the code writes it | P10 | P50 | P90 | HDB P50 | Private P50 |
|---|---|---|---|---|---|---|
| plates_per_day | s.plates_per_day * math.exp(0.15 * z1) | 128 | 157 | 190 | 160 | 195 |
| ticket | s.ticket * math.exp(0.06 * rng.standard_normal()) | 4.16 | 4.50 | 4.86 | 5.20 | 5.50 |
| k_ing | tri(0.4, s.k_ing, 0.49) | 0.420 | 0.445 | 0.470 | 0.445 | 0.445 |
| manpower | s.manpower * tri(0.85, 1.0, 1.15) | 2,676 | 2,923 | 3,160 | 2,926 | 3,600 |
| utilities | s.utilities * tri(0.85, 1.0, 1.15) | 916 | 1,001 | 1,083 | 1,000 | 1,199 |
| hours_per_day | tri(11, s.hours_per_day, 15) | 11.92 | 13.00 | 14.12 | 13.00 | 13.01 |
| days_open | tri(24, 26, 28) | 24.87 | 25.99 | 27.09 | 25.99 | 26.02 |
| delivery_share | tri(0.0, s.delivery_share, 0.16) | 0.036 | 0.080 | 0.124 | 0.079 | 0.081 |
| delivery_commission | tri(0.25, s.delivery_commission, 0.35) | 0.271 | 0.299 | 0.328 | 0.300 | 0.300 |
| closure_days_year | tri(4, 10, 16) | 6.66 | 10.01 | 13.37 | 10.06 | 10.00 |
| elasticity | tri(-1.0, -0.5, -0.3) | -0.815 | -0.591 | -0.426 | -0.585 | -0.576 |
| pass_rent | tri(0.12, 0.35, 0.45) | 0.204 | 0.314 | 0.392 | 0.314 | 0.314 |
| pass_ing | tri(1.05, 1.25, 1.45) | 1.14 | 1.25 | 1.36 | 1.25 | 1.25 |
| capture | min(max(s.capture + rng.uniform(-0.1, 0.1), 0.0), 1.0) | 0.000 | 0.051 | 0.129 | 0.348 | 0.850 |
| rent | s.rent * math.exp(rent_sd * rz) | 1,071 | 1,252 | 1,463 | 3,405 | 5,994 |
| fees | s.fees * math.exp(0.25 * rng.standard_normal()) | 720 | 720 | 720 | 997 | 1,208 |
| turnover_rent | tri(0.2, 0.25, 0.3) | 0.000 | 0.000 | 0.000 | 0.000 | 0.000 |
G.3.2Net income
Quartiles (a quarter of a ranked list) and the mean, with the share under the $1,760 line and the share earning less an hour than the assistant's benchmark of $11.64. g3-net.csv
| Stall | P10 | P25 | P50 | P75 | P90 | Mean | Under $1,760 | Under $/h benchmark |
|---|---|---|---|---|---|---|---|---|
| NEA, subsidised | $1,658 | $2,391 | $3,301 | $4,373 | $5,406 | $3,461 | 12% | 63% |
| NEA, tendered | $1,328 | $2,106 | $3,179 | $4,282 | $5,384 | $3,279 | 17% | 66% |
| Operator-run | −$148 | $601 | $1,520 | $2,552 | $3,553 | $1,636 | 56% | 92% |
| HDB coffeeshop | $414 | $1,265 | $2,381 | $3,595 | $4,849 | $2,527 | 36% | 79% |
| Private coffeeshop | −$1,132 | $287 | $1,839 | $3,395 | $4,997 | $1,886 | 49% | 80% |
| Food court | $1,157 | $1,833 | $2,737 | $3,711 | $4,648 | $2,839 | 23% | 77% |
| All stalls, weighted by count | $495 | $1,568 | $2,720 | $3,933 | $5,140 | $2,759 | 29% | 73% |
| Net income, deciles | P10 | P20 | P30 | P40 | P50 | P60 | P70 | P80 | P90 |
|---|---|---|---|---|---|---|---|---|---|
| NEA, subsidised | $1,658 | $2,188 | $2,595 | $2,966 | $3,301 | $3,695 | $4,136 | $4,667 | $5,406 |
| NEA, tendered | $1,328 | $1,903 | $2,318 | $2,745 | $3,179 | $3,559 | $4,012 | $4,583 | $5,384 |
| Operator-run | −$148 | $399 | $791 | $1,174 | $1,520 | $1,886 | $2,301 | $2,828 | $3,553 |
| HDB coffeeshop | $414 | $1,022 | $1,476 | $1,923 | $2,381 | $2,839 | $3,349 | $3,900 | $4,849 |
| Private coffeeshop | −$1,132 | −$126 | $613 | $1,264 | $1,839 | $2,393 | $3,028 | $3,836 | $4,997 |
| Food court | $1,157 | $1,654 | $2,029 | $2,377 | $2,737 | $3,096 | $3,499 | $3,935 | $4,648 |
| All stalls, weighted by count | $495 | $1,281 | $1,822 | $2,269 | $2,720 | $3,179 | $3,657 | $4,247 | $5,140 |
G.3.3Hours and rent
Hours a day are the least measured number in the trade; the model draws them between 11 and 15 around the 13 that one interview study found. Rent is drawn around each type's base and rises with custom. g3-hours.csv g3-rent.csv
| Stall | P10 | P25 | P50 | P75 | P90 | Mean |
|---|---|---|---|---|---|---|
| NEA, subsidised | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| NEA, tendered | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| Operator-run | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| HDB coffeeshop | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| Private coffeeshop | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| Food court | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| All stalls, weighted by count | 11.9 | 12.4 | 13.0 | 13.6 | 14.1 | 13.0 |
| Stall | P10 | P25 | P50 | P75 | P90 | Mean |
|---|---|---|---|---|---|---|
| NEA, subsidised | $290 | $290 | $290 | $290 | $290 | $290 |
| NEA, tendered | $1,071 | $1,153 | $1,252 | $1,360 | $1,463 | $1,261 |
| Operator-run | $1,504 | $1,590 | $1,697 | $1,815 | $1,930 | $1,707 |
| HDB coffeeshop | $2,630 | $2,963 | $3,405 | $3,885 | $4,391 | $3,471 |
| Private coffeeshop | $4,179 | $4,918 | $5,994 | $7,348 | $8,852 | $6,294 |
| Food court | $0 | $0 | $0 | $0 | $0 | $0 |
| All stalls, weighted by count | $0 | $290 | $1,393 | $3,856 | $6,157 | $2,501 |