One way is to use the paclet "TriesWithFrequencies":
PacletInstall["AntonAntonov/TriesWithFrequencies"];
Needs["AntonAntonov`TriesWithFrequencies`"];
combs = Flatten[Outer[List, {"On Time", "Late"}, {"On Time", "Late"}], 1];
seqs = Flatten[MapThread[Table, {combs, {7*7, 7*3, 3*7, 3*3}}], 1];
tr = TrieCreate[seqs];
TrieForm[tr]
TrieForm[TrieNodeProbabilities[tr]]
