(***********************************************************************
Mathematica-Compatible Notebook
This notebook can be used on any computer system with Mathematica 4.0,
MathReader 4.0, or any compatible application. The data for the notebook
starts with the line containing stars above.
To get the notebook into a Mathematica-compatible application, do one of
the following:
* Save the data starting with the line of stars above into a file
with a name ending in .nb, then open the file inside the application;
* Copy the data starting with the line of stars above to the
clipboard, then use the Paste menu command inside the application.
Data for notebooks contains only printable 7-bit ASCII and can be
sent directly in email or through ftp in text mode. Newlines can be
CR, LF or CRLF (Unix, Macintosh or MS-DOS style).
NOTE: If you modify the data for this notebook not in a Mathematica-
compatible application, you must delete the line below containing the
word CacheID, otherwise Mathematica-compatible applications may try to
use invalid cache data.
For more information on notebooks and Mathematica-compatible
applications, contact Wolfram Research:
web: http://www.wolfram.com
email: info@wolfram.com
phone: +1-217-398-0700 (U.S.)
Notebook reader applications are available free of charge from
Wolfram Research.
***********************************************************************)
(*CacheID: 232*)
(*NotebookFileLineBreakTest
NotebookFileLineBreakTest*)
(*NotebookOptionsPosition[ 162143, 4513]*)
(*NotebookOutlinePosition[ 182451, 5242]*)
(* CellTagsIndexPosition[ 181985, 5224]*)
(*WindowFrame->Normal*)
Notebook[{
Cell[CellGroupData[{
Cell[TextData[{
"Speci\[FiLigature]cation-led design\n",
StyleBox["for interface simulation, collecting use-data, interactive help, \
writing manuals, analysis, comparing alternative designs, ",
FontSize->16],
StyleBox["etc",
FontSize->16,
FontSlant->"Italic"],
StyleBox[".\n",
FontSize->16],
"\n",
StyleBox["Appeared in ",
FontFamily->"Palatino",
FontSize->16],
StyleBox["Personal Technologies",
FontFamily->"Palatino",
FontSize->16,
FontSlant->"Italic"],
StyleBox[", ",
FontFamily->"Palatino",
FontSize->16],
StyleBox["4",
FontFamily->"Palatino",
FontSize->16,
FontWeight->"Plain"],
StyleBox["(2):241\[Dash]254, 1999.",
FontFamily->"Palatino",
FontSize->16],
StyleBox["\n",
FontSize->16,
FontSlant->"Italic"]
}], "Title"],
Cell[CellGroupData[{
Cell[TextData[{
StyleBox["Harold Thimbleby",
FontSlant->"Italic"],
"\nMiddlesex University\nLONDON\nN11 2NQ\n\n",
StyleBox["URL: http://www.cs.mdx.ac.uk/harold",
FontSize->11]
}], "SectionFirst",
FontSize->16],
Cell[CellGroupData[{
Cell["Abstract", "Subtitle"],
Cell["\<\
This paper shows how to combine a substantial part of the product \
development cycle of interactive devices into a single, co-ordinated \
approach. Much can be derived automatically from a suitable specification of \
the interactive device, and it can be derived automatically. Normal product \
development has a device specified and built, then has its manuals written, \
then it is used and tested. At this late stage design problems may be \
identified, but it is now too late: usability studies become academic in so \
far as the particular product is concerned, since it is already effectively \
in production. It would be better if the testing and manual writing could \
rapidly be obtained from the initial specification, before any investment has \
been made in fabrication. This paper offers a design approach that achieves \
this, and it shows how the various views of the design can be used help \
improve each other \[LongDash] for instance, the automatically generated user \
manual can be fed back to suggest improvements in the design. \
\>", "Text"],
Cell[TextData[{
"A microwave cooker is used as a real example. However, this paper provides \
full and unabridged details of everything it discusses by using ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" as a rapid prototyping environment. Any similar device can be analysed in \
the same way, directly from the paper. "
}], "Text"],
Cell["Introduction", "Section"],
Cell[TextData[
"This paper shows that the definition of a device, its simulation, its \
usability analysis, and its user manuals in any language (and interactive \
help, if required), can all be worked on directly and efficiently in a \
suitable design environment. If part of the design process suggests \
improvements, say that the user manual has an obscurity, then it can be \
changed directly by modifying the specification; and the new specification \
will update all other parts of the product, the analysis, the simulation, and \
so on. Importantly, the approach only has one definition of the device; thus \
changes \[LongDash] as occur during iterative design and product revision \
\[LongDash] immediately and automatically affect all parts of the development \
process: the analysis, the simulation, the help (and even the hardware). \
Specification-led design is so efficient that it is effectively concurrent \
engineering. "], "Text"],
Cell[TextData[
"The importance of the approach is that many components of a product are \
derived efficiently and automatically, almost at once. In normal design \
methods, there is a sequential (and costly) progression from specification, \
through fabrication, to manual writing, and finally usage. Only at later \
stages, then, will many usability problems be identified \[LongDash] but by \
then, the product is already fabricated, and many of the usability insights \
would be very hard to take back to the specification, even it was still \
available."], "Text"],
Cell[TextData[{
"For this paper, to illustrate our approach we have used the symbolic \
mathematical system, ",
StyleBox["Mathematica ",
FontSlant->"Italic"],
"(",
ButtonBox["Wolfram, 1996",
ButtonData:>"wolfram",
ButtonStyle->"Hyperlink"],
"). ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" is sufficiently powerful that everything described in this paper is \
completely and fully specified here. Many popular system development \
environments, especially those aimed at providing visual realism, would have \
been inappropriate because they never explicitly 'know' what the device \
specification is, and none of the automatic benefits discussed here could \
have been be obtained. This paper was developed and printed entirely within ",
StyleBox["Mathematica",
FontSlant->"Italic"],
": all the examples are genuine, and have not been re-keyed or fudged in \
any way. Stylistically, this does have the disadvantage for this paper that \
explaining the method is interleaved with potentially distracting explanation \
of the ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" code. If desired, the approach could be packaged (e.g., in Java) in such \
a way that none of the technical details would be visible to a designer. \
However, we felt that for the purposes of this paper, being able to see that \
the method works, and giving completely open details was more important. Not \
only does this paper claim that specification-led design is a useful \
approach, but it provides ",
StyleBox["complete",
FontSlant->"Italic"],
" details for anyone to copy the approach."
}], "Text"],
Cell[TextData[{
"As a running example, we shall use the definition of a microwave cooker, \
as given in Jonathan Sharp's PhD thesis (",
ButtonBox["Sharp, 1998",
ButtonData:>"sharp98",
ButtonStyle->"Hyperlink"],
"). As a deliberate decision, we used Sharp's ",
StyleBox["exact",
FontSlant->"Italic"],
" definition, to try and emphasise the generality of the approach (we \
didn't choose this definition to fit the needs of the paper)."
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Preliminaries", "Section"],
Cell[TextData[{
"Since this paper ",
StyleBox["is",
FontSize->12,
FontWeight->"Bold"],
" the ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" definition of everything the paper talks about, it has to start with some \
",
StyleBox["Mathematica",
FontSlant->"Italic"],
" preliminaries. This section can be skipped, as they say, on first reading \
\[LongDash] though it also provides some examples of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" being used, to explain the formatting conventions this paper uses. A \
stylistic consequence of this paper also being a ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" document is the rather frequent use of backward references in the text to \
earlier definitions \[LongDash] they have to be earlier, else they wouldn't \
work where they are needed!"
}], "Text"],
Cell[TextData[{
"We start by loading the standard ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" package for combinatorics (to load a shortest path function, which we \
will need for calculating the designer's optimal transition matrix), and a \
basic utility routine."
}], "Text"],
Cell[BoxData[
\(<< DiscreteMath`Combinatorica`; \n\t\t\n
vector_\ \[SuchThat] \ element_\ := \
\(Position[vector, element]\)\[LeftDoubleBracket]1, 1
\[RightDoubleBracket]\)], "Input",
CellLabel->"In[1]:=",
InitializationCell->True],
Cell[TextData[{
"The function \[SuchThat] (pronounced 'such that,' defined above) gives the \
numerical index into a vector such that the element would be selected. (It \
uses the built-in function ",
StyleBox["Position",
FontFamily->"Courier"],
", which produces a general result, which in turn requires the ",
StyleBox["1,1",
FontFamily->"Courier"],
" subscript.) Here is how it is used:"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(exampleVector = {firstElement, secondElement, thirdElement}; \n\n
exampleVector \[SuchThat] \ secondElement\)], "Input",
CellLabel->"In[2]:=",
InitializationCell->True],
Cell[BoxData[
\(2\)], "Output",
CellLabel->"Out[2]="]
}, Open ]],
Cell[TextData[{
"Here we see an example of ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" output: ",
StyleBox["secondElement",
FontFamily->"Courier"],
" is to be found at position 2 in the example vector. And, working the \
other way round, the 2 can be used to select the second element of the \
vector:"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(exampleVector\[LeftDoubleBracket]2\[RightDoubleBracket]\)], "Input",
CellLabel->"In[3]:="],
Cell[BoxData[
\(secondElement\)], "Output",
CellLabel->"Out[3]="]
}, Open ]],
Cell[TextData[{
"In all cases in this paper, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" code precedes the output from running the code. The cases where no output \
is shown are either straight-forward definitions, or are stated in the text \
as not being run (for example, to save space, we did not run the ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" code to generate the ",
StyleBox["entire",
FontSlant->"Italic"],
" user manual). "
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Device definition", "Section"],
Cell[TextData[{
StyleBox["Mathematica",
FontSlant->"Italic"],
" shows how easy reusable development is to do. By making minor changes to \
the definitions here, other devices can be developed in the same way."
}], "Text"],
Cell[TextData[{
"Here is Jonathan Sharp's definition of his microwave cooker. Because we \
decided to use ",
StyleBox["exactly",
FontSlant->"Italic"],
" his definition (for reasons given above), the function \[SuchThat] \
(defined above) is used frequently to convert between names and numbers; had \
Sharp defined his device directly in terms of state numbers this would not \
have been necessary. (Instead, we might have defined each button and state as \
a numerical constant; but the approach we have used makes the device \
definition easier to read and less error-prone.)"
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(device = {\n\t\t{clock, \ clock, \ clock, \ clock, \ clock, \ clock}, \n
\t\t{quickDefrost, \ quickDefrost, quickDefrost, \ quickDefrost, \
quickDefrost, \ quickDefrost},
\ {timer1, \ timer1, \ timer2, \ timer1, \ timer2, \ timer1}, \n
\t\t{clock, \ clock, \ clock, \ clock, \ clock, \ clock}, \n
\t\t{clock, quickDefrost, \ power1, \ power2, \ power1, \ power2}\n};
\n\nbuttonNames = {clock, \ quickDefrost, \ time, \ clear, \ power}; \n
stateNames = {clock, quickDefrost, timer1, timer2, power1, power2}; \n\n
numberOfStates = Length@stateNames; \n
numberOfButtons = Length@buttonNames; \)], "Input",
CellLabel->"In[2]:=",
InitializationCell->True],
Cell[BoxData[
\(General::"spell1" \( : \ \)
"Possible spelling error: new symbol name \"\!\(clear\)\" is similar to \
existing symbol \"\!\(Clear\)\"."\)], "Message"],
Cell[BoxData[
\(General::"spell1" \( : \ \)
"Possible spelling error: new symbol name \"\!\(power\)\" is similar to \
existing symbol \"\!\(Power\)\"."\)], "Message"]
}, Closed]],
Cell[TextData[{
"The five parts of the device specification, here represented by five \
variables (",
StyleBox["buttonNames",
FontFamily->"Courier"],
", ",
StyleBox["numberOfButtons",
FontFamily->"Courier"],
", ",
StyleBox["etc",
FontSlant->"Italic"],
".), can be encapsulated into a single structure, and for actual \
development work this would have been preferable, rather than proliferating \
five variables per design. ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" provides various ways to do this (packages, object-oriented programming, \
",
StyleBox["etc",
FontSlant->"Italic"],
".), but for such a brief paper as this, to do so would introduce \
unnecessary technical detail."
}], "Text"],
Cell[TextData[{
"Sharp didn't write his specification in ",
StyleBox["Mathematica",
FontSlant->"Italic"],
"! ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" can, however, print the specification above quite closely to the style \
that Sharp used; in fact, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" provides an extensible user interface to make the entry of tabular data \
as easy as using a spreadsheet."
}], "Text"],
Cell[TextData[{
"We define a function ",
StyleBox["neatTable",
FontFamily->"Courier"],
" to make a reasonably neat tabular presentation of any device. It is \
probably clear from the intricacy of this code that almost any typographical \
details can be accommodated."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(neatTable[title_, device_, stateNames_, buttonNames_] := \n\t
With[{heading =
StyleBox[#, FontFamily \[Rule] "\",
FontSize \[Rule] 10, FontWeight \[Rule] "\"]&,
subHeading = StyleBox[#, FontWeight \[Rule] "\"]&},
StyleBox[
GridBox[{{
FrameBox@
GridBox[{{
GridBox[
Transpose@{
Join[{heading["\"], \ "\<\>"},
subHeading/@buttonNames]},
ColumnAlignments \[Rule] Right],
GridBox[
\ {{heading[
"\<\[LongDash] States \[LongDash]\>"]}, {
GridBox[
Join[{subHeading/@stateNames}, device],
ColumnLines \[Rule] True,
RowLines \[Rule] {True, False}]}}]}},
ColumnLines \[Rule] True]}, {heading[title]}}],
FontFamily \[Rule] "\", FontSize \[Rule] 9,
FontWeight \[Rule] "\"] // DisplayForm]; \n\n
neatTable["\", \ device, stateNames,
buttonNames]\)], "Input",
CellLabel->"In[3]:="],
Cell[BoxData[
TagBox[
StyleBox[GridBox[{
{
FrameBox[GridBox[{
{GridBox[{
{
StyleBox["Buttons",
FontFamily->"Helvetica",
FontSize->10,
FontWeight->"Bold"]},
{""},
{
StyleBox["clock",
FontWeight->"Bold"]},
{
StyleBox["quickDefrost",
FontWeight->"Bold"]},
{
StyleBox["time",
FontWeight->"Bold"]},
{
StyleBox["clear",
FontWeight->"Bold"]},
{
StyleBox["power",
FontWeight->"Bold"]}
},
ColumnAlignments->{Right}], GridBox[{
{
StyleBox[\(\[LongDash]\ States\ \[LongDash]\),
FontFamily->"Helvetica",
FontSize->10,
FontWeight->"Bold"]},
{GridBox[{
{
StyleBox["clock",
FontWeight->"Bold"],
StyleBox["quickDefrost",
FontWeight->"Bold"],
StyleBox["timer1",
FontWeight->"Bold"],
StyleBox["timer2",
FontWeight->"Bold"],
StyleBox["power1",
FontWeight->"Bold"],
StyleBox["power2",
FontWeight->"Bold"]},
{"clock", "clock", "clock", "clock", "clock",
"clock"},
{"quickDefrost", "quickDefrost",
"quickDefrost", "quickDefrost",
"quickDefrost", "quickDefrost"},
{"timer1", "timer1", "timer2", "timer1",
"timer2", "timer1"},
{"clock", "clock", "clock", "clock", "clock",
"clock"},
{"clock", "quickDefrost", "power1", "power2",
"power1", "power2"}
},
RowLines->{True, False},
ColumnLines->True]}
}]}
},
ColumnLines->True]]},
{
StyleBox[\(Sharp' s\ Microwave\ cooker\),
FontFamily->"Helvetica",
FontSize->10,
FontWeight->"Bold"]}
}],
FontFamily->"Palatino",
FontSize->9,
FontWeight->"Plain"],
DisplayForm]], "Output",
CellLabel->"Out[3]//DisplayForm="]
}, Open ]],
Cell["\<\
The table is read as follows: choose the column according to the \
current state of the device, then read off the next state of the device from \
the row corresponding to the button pressed. \
\>", "Text"],
Cell[TextData[{
"If we hadn't wanted all the typographical details just so, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" could have printed the specification in a basic form, just with ",
StyleBox["TableForm[device]",
FontFamily->"Courier"],
"."
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Simulating the user interface", "Section"],
Cell[TextData[{
"To simulate the device, we use a global variable to keep track of the \
changing state of the device as buttons are pressed. We will start the device \
in state 1, which happens to be ",
StyleBox["clock",
FontFamily->"Courier"],
". Arguably, a device definition should specify its initial state \
\[LongDash] the state a device is in as soon as it is used: for many devices, \
this state will be its being off."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(state\ = \ stateNames\[LeftDoubleBracket]1\[RightDoubleBracket]\)],
"Input",
CellLabel->"In[6]:=",
InitializationCell->True],
Cell[BoxData[
\(clock\)], "Output",
CellLabel->"Out[6]="]
}, Open ]],
Cell["\<\
The definitions given in this section merely show the name of the \
current state in the display. It is possible to display anything, not just \
plain text, but to do so would take us beyond the scope of this paper.\
\>",
"Text"],
Cell[TextData[{
"When a button on the simulation is pressed, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" will arrange for the function ",
StyleBox["press",
FontFamily->"Courier"],
" to be called, with the button as a parameter. "
}], "Text"],
Cell[BoxData[
\(press[theButton_] :=
Module[{nb\ = \ ButtonNotebook[]}, \n\t\t
collectStatistics[theButton, state]; \n\t\t
state = \
device\[LeftDoubleBracket]buttonNames \[SuchThat] theButton,
stateNames \[SuchThat] state\[RightDoubleBracket]; \n\t\t
NotebookFind[\ nb, "\", All, CellTags]; \ \n\t\t
SelectionMove[nb, All, \ CellContents]; \n\t\t
NotebookWrite[nb, Cell[ToString@state]]\n\t]\)], "Input",
CellLabel->"In[5]:=",
InitializationCell->True],
Cell[TextData[{
"After collecting any useful statistics, this function uses the ",
StyleBox["device",
FontFamily->"Courier"],
" specification to determine the next state. The next few lines of the \
function locate the device's display cell in the current ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" notebook (",
StyleBox["Mathematica",
FontSlant->"Italic"],
" can have several notebooks \[LongDash] that is, windows \[LongDash] \
running together, which is why the variable ",
StyleBox["nb",
FontFamily->"Courier"],
" is required); the text displayed in that cell is selected and replaced \
with the name of the new state. "
}], "Text"],
Cell[TextData[{
"By defining ",
StyleBox["collectStatistics",
FontFamily->"Courier"],
", we make ",
StyleBox["press",
FontFamily->"Courier"],
" collect empirical statistics as the simulation is used. For simplicity, \
we will just collect state transition counts:"
}], "Text"],
Cell[BoxData[
RowBox[{
\(statistics = Table[0, {numberOfButtons}, {numberOfStates}]\), ";",
"\n", "\n",
RowBox[{\(collectStatistics[theButton_, state_]\), ":=",
RowBox[{"++",
RowBox[{
StyleBox["statistics",
FontFamily->"Courier"],
StyleBox["\[LeftDoubleBracket]",
FontFamily->"Courier"],
StyleBox[\(buttonNames \[SuchThat] theButton,
stateNames \[SuchThat] state\),
FontFamily->"Courier"], "\[RightDoubleBracket]"}]}]}]}]],
"Input",
CellLabel->"In[6]:=",
InitializationCell->True],
Cell["\<\
The following code is the definition of a row of buttons to \
control the device. \
\>", "Text"],
Cell["\<\
Cell[BoxData[
RowBox[{
ButtonBox[\"Clock\",
ButtonFunction:>press[clock],
ButtonEvaluator->Automatic],
ButtonBox[\"Quick defrost\",
ButtonFunction:>press[quickDefrost],
ButtonEvaluator->Automatic],
ButtonBox[\"Time\",
ButtonFunction:>press[time],
ButtonEvaluator->Automatic],
ButtonBox[\"Clear\",
ButtonFunction:>press[clear],
ButtonEvaluator->Automatic],
ButtonBox[\"Power\",
ButtonFunction:>press[power],
ButtonEvaluator->Automatic]}]],
Active->True]\
\>", "Input",
Active->True],
Cell[TextData[{
"To use the buttons, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" would change the display mode of the definition, and show a row (by \
default) of actual buttons:"
}], "Text"],
Cell[BoxData[
RowBox[{
ButtonBox["Clock",
ButtonFunction:>press[ clock],
ButtonEvaluator->Automatic],
ButtonBox[\(Quick\ defrost\),
ButtonFunction:>press[ quickDefrost],
ButtonEvaluator->Automatic],
ButtonBox["Time",
ButtonFunction:>press[ time],
ButtonEvaluator->Automatic],
ButtonBox["Clear",
ButtonFunction:>press[ clear],
ButtonEvaluator->Automatic],
ButtonBox["Power",
ButtonFunction:>press[ power],
ButtonEvaluator->Automatic]}]],
CellLabel->"In[319]:=",
CellDingbat->None,
Active->True,
TextAlignment->Center],
Cell[TextData[{
"The device's simulated display is a simple ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" 'cell' (shown below) with an appropriate name so that the ",
StyleBox["press",
FontFamily->"Courier"],
" function can locate it. In its simplest form it could be just ",
StyleBox["Cell[\"\",",
FontFamily->"Courier"],
" ",
StyleBox["CellTags ",
FontFamily->"Courier"],
"\[Rule] ",
StyleBox["\"display\"]",
FontFamily->"Courier"],
". "
}], "Text"],
Cell[TextData[{
"If desired, ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" allows cells and buttons to contain further 'typographical' details, such \
as their font, size and colour. For example, the device's display can easily \
be made to look more like a typical LED display of green text on a black \
background, by providing options (such as, ",
StyleBox["FontFamily ",
FontFamily->"Courier"],
"\[Rule] ",
StyleBox["\"Courier\",",
FontFamily->"Courier"],
" ",
StyleBox["FontColor ",
FontFamily->"Courier"],
"\[Rule] ",
StyleBox["RGBColor[0, 1, 0], Background ",
FontFamily->"Courier"],
"\[Rule] ",
StyleBox["GrayLevel[0]",
FontFamily->"Courier"],
", and its correct dimensions",
StyleBox[")",
FontFamily->"Courier"],
" in the definition of the cell:"
}], "Text"],
Cell["clock", "Text",
CellMargins->{{126, 156.812}, {Inherited, Inherited}},
TextAlignment->Center,
FontFamily->"Courier",
FontSize->24,
FontWeight->"Bold",
FontColor->RGBColor[0, 1, 0],
Background->GrayLevel[0],
CellTags->"display"],
Cell[TextData[{
"In a running ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" session, pressing the buttons makes this display work, as well as collect \
data on the users' behaviour with the simulation."
}], "Text"]
}, Open ]],
Cell[TextData[{
StyleBox["Mathematica",
FontSlant->"Italic"],
" can itself generate button definitions from ",
StyleBox["any",
FontSlant->"Italic"],
" device specification, and one can extend the definition to include \
explicit sizes, positions and so forth. (We will give an example below.) \
Thus, the user interface itself can be defined by the ",
StyleBox["same",
FontSlant->"Italic"],
" device specification. This is very important to make the analysis \
\[LongDash] both mathematical and empirical \[LongDash] use consistent \
specifications; they can be edited easily and only in ",
StyleBox["one",
FontSlant->"Italic"],
" place. "
}], "Text"],
Cell[CellGroupData[{
Cell["Analysis and graph drawing", "Section"],
Cell["\<\
For illustrative purposes, we now do a Markov analysis of the \
device, which is a good way of estimating how a user, making random errors, \
would perform using the device. It should be noted that this approach is a \
'keystroke level model' but which allows for errors. In particular, we will \
be able to draw a graph of a user's task performance against how accurately \
(how error-free) or how well they know how to do the task perfectly. \
\>",
"Text"],
Cell[TextData[{
"A working paper, available from the author, is available to describe the \
particular benefits, and many further details, of the approach (",
ButtonBox["Cairns, Jones & Thimbleby, 1998",
ButtonData:>"cairns",
ButtonStyle->"Hyperlink"],
"). Published papers further explaining the motivation for such analyses \
are",
ButtonBox[" Thimbleby & Witten (1993)",
ButtonData:>"witten",
ButtonStyle->"Hyperlink"],
" and ",
ButtonBox["Thimbleby (1994)",
ButtonData:>"thimbleby94",
ButtonStyle->"Hyperlink"],
"."
}], "Text"],
Cell[TextData[{
"We will analyse the user task of getting from state ",
StyleBox["power1",
FontFamily->"Courier"],
" to state ",
StyleBox["power2",
FontFamily->"Courier"],
". To consider a particular task, we do need to know the appropriate state \
names. Alternatively, it is possible to analyse all pairs of states (hence, \
all tasks the device supports) and obtain statistics, which would typically \
be weighted by the relevance or importance of the tasks to users. However, \
for the purposes of this paper, analysing just one task is sufficient."
}], "Text"],
Cell[BoxData[
\(start = stateNames \[SuchThat] power1; \n
goal = \ stateNames \[SuchThat] power2; \)], "Input",
CellLabel->"In[7]:=",
InitializationCell->True],
Cell["We now convert Sharp's definition into a stochastic matrix:", "Text"],
Cell[BoxData[
\(randomUser = Table[0, {numberOfStates}, {numberOfStates}]; \n\n
Do[randomUser\[LeftDoubleBracket]i,
stateNames \[SuchThat]
device\[LeftDoubleBracket]b, i
\[RightDoubleBracket]\[RightDoubleBracket] += \
1/numberOfButtons, \n\t\ {b, numberOfButtons}, {i, numberOfStates}];
\)], "Input",
CellLabel->"In[8]:=",
InitializationCell->True],
Cell["\<\
Here is the matrix displayed in traditional mathematical \
notation:\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(randomUser // TraditionalForm\)], "Input",
CellLabel->"In[9]:=",
InitializationCell->True],
Cell[BoxData[
FormBox[
RowBox[{"(", GridBox[{
{\(3\/5\), \(1\/5\), \(1\/5\), "0", "0", "0"},
{\(2\/5\), \(2\/5\), \(1\/5\), "0", "0", "0"},
{\(2\/5\), \(1\/5\), "0", \(1\/5\), \(1\/5\), "0"},
{\(2\/5\), \(1\/5\), \(1\/5\), "0", "0", \(1\/5\)},
{\(2\/5\), \(1\/5\), "0", \(1\/5\), \(1\/5\), "0"},
{\(2\/5\), \(1\/5\), \(1\/5\), "0", "0", \(1\/5\)}
},
ColumnAlignments->{Decimal}], ")"}], TraditionalForm]], "Output",
CellLabel->"Out[9]//TraditionalForm="]
}, Open ]],
Cell["\<\
Each row gives the probability that the user will change the state; \
thus, if the device is in state 1, the user will change it to state 2 with \
probability 1/5 (i.e., first row, second column). \
\>", "Text"],
Cell["\<\
This matrix will be used for the analysis. The assumption is that \
each button on the device is pressed with equal probability. (There are five \
buttons, so all the probabilities are so-many fifths.) The user interface \
simulation can give empirically-based probabilities, and we will analyse them \
below.\
\>", "Text"],
Cell["\<\
Here we give the definition of the mean first passage time in its \
most direct form (our associated paper gives a full derivation of the \
relevant formula). The mean first passage time represents a user's difficulty \
with performing a task.\
\>", "Text"],
Cell[BoxData[
\(ZeroRowCol[matrix_, \ rc_] := \n\t\t
Table[If[\ i\ == \ rc\ || \ j\ == \ rc, \ 0, \
matrix\[LeftDoubleBracket]i, j\[RightDoubleBracket]], \n
\t\t{i, \ Length@matrix}, \ {j, \ \ \ Length@matrix}]; \n\n
One\ = \ Table[1, \ {numberOfStates}]; \n
Id\ = \ IdentityMatrix[numberOfStates]; \n\n
meanFirstPassage[matrix_, \ start_, \ goal_]\ :=
\((Inverse[Id - ZeroRowCol[matrix, \ goal]]\ \ . \ One)
\)\[LeftDoubleBracket]start\[RightDoubleBracket]; \)], "Input",
CellLabel->"In[10]:=",
InitializationCell->True],
Cell["Here is how the function can be used:", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(meanFirstPassage[randomUser, \ \ start, \ goal]\)], "Input",
CellLabel->"In[11]:=",
InitializationCell->True],
Cell[BoxData[
\(120\)], "Output",
CellLabel->"Out[11]="]
}, Open ]],
Cell[TextData[{
"Thus, the expected time to perform the task, to get from the start state \
(",
StyleBox["power1",
FontFamily->"Courier"],
") to the goal state (",
StyleBox["power2",
FontFamily->"Courier"],
"), is 120 button presses. Of course, the Markov model doesn't \"know\" how \
to use the microwave, which is why the number seems so high. But the \
designers of devices should know how to use them! We now create a designer's \
matrix, which represents optimal use for any task, based on the optimal route \
from the start to the goal states. (The random user matrix is converted to a \
",
StyleBox["Graph",
FontFamily->"Courier"],
" type to find shortest paths; it can be done conveniently \[LongDash] and \
correctly! \[LongDash] from the ",
StyleBox["randomUser",
FontFamily->"Courier"],
" matrix, since exactly its non-zero elements are device transitions.)"
}], "Text"],
Cell[BoxData[
\(designer = Table[0, {numberOfStates}, {numberOfStates}]; \n\n
Do[Module[{p = ShortestPath[Graph[randomUser, {}], i, goal]},
designer\[LeftDoubleBracket]i,
If[\ Length[p]\ > \ 1,
p\[LeftDoubleBracket]2\[RightDoubleBracket], i]
\[RightDoubleBracket] = 1], \ {i, numberOfStates}]; \)], "Input",\
CellLabel->"In[161]:=",
InitializationCell->True],
Cell["We should check that this designer knows how to do the task!", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(meanFirstPassage[designer, \ start, goal]\)], "Input",
CellLabel->"In[162]:=",
InitializationCell->True],
Cell[BoxData[
\(2\)], "Output",
CellLabel->"Out[162]="]
}, Open ]],
Cell["\<\
Evidently, the more knowledge the easier the device is to use. A \
graph of difficulty of use against knowledge can be plotted:\
\>", "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(\(Plot[
meanFirstPassage[x\ designer\ + \ \((1 - x)\)\ randomUser, start,
goal], \ {x, 0, 1}, \
AxesLabel \[Rule] {"\", "\"}]; \)\)], "Input",
CellLabel->"In[163]:=",
InitializationCell->True],
Cell[GraphicsData["PostScript", "\<\
%!
%%Creator: Mathematica
%%AspectRatio: .61803
MathPictureStart
/Mabs {
Mgmatrix idtransform
Mtmatrix dtransform
} bind def
/Mabsadd { Mabs
3 -1 roll add
3 1 roll add
exch } bind def
%% Graphics
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10 scalefont setfont
% Scaling calculations
0.0238095 0.952381 0.0147151 0.00490503 [
[.21429 .00222 -9 -9 ]
[.21429 .00222 9 0 ]
[.40476 .00222 -9 -9 ]
[.40476 .00222 9 0 ]
[.59524 .00222 -9 -9 ]
[.59524 .00222 9 0 ]
[.78571 .00222 -9 -9 ]
[.78571 .00222 9 0 ]
[.97619 .00222 -3 -9 ]
[.97619 .00222 3 0 ]
[1.025 .01472 0 -6 ]
[1.025 .01472 58 6 ]
[.01131 .11282 -12 -4.5 ]
[.01131 .11282 0 4.5 ]
[.01131 .21092 -12 -4.5 ]
[.01131 .21092 0 4.5 ]
[.01131 .30902 -12 -4.5 ]
[.01131 .30902 0 4.5 ]
[.01131 .40712 -12 -4.5 ]
[.01131 .40712 0 4.5 ]
[.01131 .50522 -18 -4.5 ]
[.01131 .50522 0 4.5 ]
[.01131 .60332 -18 -4.5 ]
[.01131 .60332 0 4.5 ]
[.02381 .64303 -14 0 ]
[.02381 .64303 14 12 ]
[ 0 0 0 0 ]
[ 1 .61803 0 0 ]
] MathScale
% Start of Graphics
1 setlinecap
1 setlinejoin
newpath
0 g
.25 Mabswid
[ ] 0 setdash
.21429 .01472 m
.21429 .02097 L
s
[(0.2)] .21429 .00222 0 1 Mshowa
.40476 .01472 m
.40476 .02097 L
s
[(0.4)] .40476 .00222 0 1 Mshowa
.59524 .01472 m
.59524 .02097 L
s
[(0.6)] .59524 .00222 0 1 Mshowa
.78571 .01472 m
.78571 .02097 L
s
[(0.8)] .78571 .00222 0 1 Mshowa
.97619 .01472 m
.97619 .02097 L
s
[(1)] .97619 .00222 0 1 Mshowa
.125 Mabswid
.07143 .01472 m
.07143 .01847 L
s
.11905 .01472 m
.11905 .01847 L
s
.16667 .01472 m
.16667 .01847 L
s
.2619 .01472 m
.2619 .01847 L
s
.30952 .01472 m
.30952 .01847 L
s
.35714 .01472 m
.35714 .01847 L
s
.45238 .01472 m
.45238 .01847 L
s
.5 .01472 m
.5 .01847 L
s
.54762 .01472 m
.54762 .01847 L
s
.64286 .01472 m
.64286 .01847 L
s
.69048 .01472 m
.69048 .01847 L
s
.7381 .01472 m
.7381 .01847 L
s
.83333 .01472 m
.83333 .01847 L
s
.88095 .01472 m
.88095 .01847 L
s
.92857 .01472 m
.92857 .01847 L
s
.25 Mabswid
0 .01472 m
1 .01472 L
s
gsave
1.025 .01472 -61 -10 Mabsadd m
1 1 Mabs scale
currentpoint translate
0 20 translate 1 -1 scale
gsave
0.000000 0.000000 0.000000 setrgbcolor
1.000000 setlinewidth
gsave
newpath
61.000000 16.000000 moveto
541.000000 16.000000 lineto
541.000000 4.000000 lineto
61.000000 4.000000 lineto
61.000000 16.000000 lineto
closepath
clip newpath
63.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
0.000000 0.000000 rmoveto
63.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
(Knowledge) show
117.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
0.000000 0.000000 rmoveto
1.000000 setlinewidth
grestore
grestore
%%DocumentNeededResources: font Courier
%%DocumentSuppliedResources:
%%DocumentNeededFonts: Courier
%%DocumentSuppliedFonts:
%%DocumentFonts: font Courier
grestore
.02381 .11282 m
.03006 .11282 L
s
[(20)] .01131 .11282 1 0 Mshowa
.02381 .21092 m
.03006 .21092 L
s
[(40)] .01131 .21092 1 0 Mshowa
.02381 .30902 m
.03006 .30902 L
s
[(60)] .01131 .30902 1 0 Mshowa
.02381 .40712 m
.03006 .40712 L
s
[(80)] .01131 .40712 1 0 Mshowa
.02381 .50522 m
.03006 .50522 L
s
[(100)] .01131 .50522 1 0 Mshowa
.02381 .60332 m
.03006 .60332 L
s
[(120)] .01131 .60332 1 0 Mshowa
.125 Mabswid
.02381 .03924 m
.02756 .03924 L
s
.02381 .06377 m
.02756 .06377 L
s
.02381 .08829 m
.02756 .08829 L
s
.02381 .13734 m
.02756 .13734 L
s
.02381 .16187 m
.02756 .16187 L
s
.02381 .18639 m
.02756 .18639 L
s
.02381 .23544 m
.02756 .23544 L
s
.02381 .25997 m
.02756 .25997 L
s
.02381 .28449 m
.02756 .28449 L
s
.02381 .33354 m
.02756 .33354 L
s
.02381 .35807 m
.02756 .35807 L
s
.02381 .38259 m
.02756 .38259 L
s
.02381 .43164 m
.02756 .43164 L
s
.02381 .45617 m
.02756 .45617 L
s
.02381 .48069 m
.02756 .48069 L
s
.02381 .52974 m
.02756 .52974 L
s
.02381 .55427 m
.02756 .55427 L
s
.02381 .57879 m
.02756 .57879 L
s
.25 Mabswid
.02381 0 m
.02381 .61803 L
s
gsave
.02381 .64303 -75 -4 Mabsadd m
1 1 Mabs scale
currentpoint translate
0 20 translate 1 -1 scale
gsave
0.000000 0.000000 0.000000 setrgbcolor
1.000000 setlinewidth
gsave
newpath
61.000000 16.000000 moveto
541.000000 16.000000 lineto
541.000000 4.000000 lineto
61.000000 4.000000 lineto
61.000000 16.000000 lineto
closepath
clip newpath
63.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
0.000000 0.000000 rmoveto
63.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
(Cost) show
87.000000 13.000000 moveto
%%IncludeResource: font Courier
%%IncludeFont: Courier
/Courier findfont 10.000000 scalefont
[1 0 0 -1 0 0 ] makefont setfont
0.000000 0.000000 0.000000 setrgbcolor
0.000000 0.000000 rmoveto
1.000000 setlinewidth
grestore
grestore
%%DocumentNeededResources: font Courier
%%DocumentSuppliedResources:
%%DocumentNeededFonts: Courier
%%DocumentSuppliedFonts:
%%DocumentFonts: font Courier
grestore
0 0 m
1 0 L
1 .61803 L
0 .61803 L
closepath
clip
newpath
.5 Mabswid
.02381 .60332 m
.04262 .49179 L
.06244 .40365 L
.08255 .33583 L
.10458 .27911 L
.12415 .23983 L
.14509 .20633 L
.16496 .18068 L
.18653 .15801 L
.22646 .1263 L
.26733 .10328 L
.30668 .08703 L
.34452 .07516 L
.3848 .06539 L
.42358 .05801 L
.4648 .05176 L
.50451 .04691 L
.5427 .04308 L
.58335 .0397 L
.62248 .03698 L
.66406 .03455 L
.70413 .03256 L
.74268 .03091 L
.78368 .0294 L
.82317 .02814 L
.86114 .02707 L
.90156 .02607 L
.94047 .02522 L
.97619 .02453 L
s
% End of Graphics
MathPictureEnd
\
\>"], "Graphics",
CellLabel->"From In[163]:=",
ImageSize->{401, 247.75},
ImageMargins->{{35, 0}, {0, 0}},
ImageRegion->{{0, 1}, {0, 1}},
ImageCache->GraphicsData["Bitmap", "\<\
CF5dJ6E]HGAYHf4PAg9QL6QYHggYjN[Vi^OShn03ooeGooj[ooonIgYjN[Vi^OShn03o
oclo?ginO[fm_Oclo5D00:X00?l00?l0VOl0I_l0CXf=SLcCXf=SLcII03=VoalO7eiN
GYfMWMcLg02Z020001Ol0003o00/01?lh0005o`000?l03003od<000?o0000FP0005`000Go0000
o`0?0003o`0003H000Go0000o`0<0003o`3o03P000Go0000o`0;0003o`0003T000Go0000o`0;0005
o`000?l0@P000ol0001J0000G0001Ol0003o00/000Go0000o`0h0005o`000?l03@02ocP000Go0000
o`0<0003o`0003P000Go0000o`0;0005o`000?l0@P000ol0001J0000G@03o`d00olj00?o3`000ol0
000g00?o3P03ocP00ol=00?o@@03oe`0000K0003o`000?l0bP04o`X0000K0003o`000?l0cP000ol0
000700006`000ol0003o0@000ol0003o09`0000K0003o`0003P000?o0000o`2M00006`000ol0
000g0003o`000?l0WP0001/000?o0000=P000ol0003o09l0000K0003o`0003D000?o0000o`2P0000
6`000ol0000e0003o`000?l0X00001/00old0003o`000?l0X@0001/000?o0000<`000ol0003o0:80
000K0003o`00038000?o0000o`2S00006`000ol0000a0003o`000?l0Y00001/000?o0000<@000ol0
003o0:@0000K0003o`00030000?o0000o`2U00006`000ol0000_0003o`000?l0YP0000T00ol400?o
20000ol0000^0003o`000?l0Y`0000X000?o00000P001Ol0003o00L000?o0000;@000ol0003o0:P0
000700Go0`001Ol0003o00L000?o0000;@000ol0003o0:P000070004o`00o`@000Go0000o`0700?o
;0000ol0003o0:T000080003o`3o00@000Go0000o`070003o`0002/000?o0000o`2Z000020000ol0
o`040005o`000?l01`000ol0000[0003o`000?l0ZP0000T00_l40005o`000?l01`000ol0000Z0003
o`000?l0Z`0000X000?o00000`03o`P000?o0000:P000ol0003o0:/0000K0003o`0002T000?o0000
o`2/00006`000ol0000X0003o`000?l0[@0001/000?o0000:0000ol0003o0:d0000K0003o`0002L0
00?o0000o`2^00006`03obL000?o0000o`2^00006`000ol0000V0003o`000?l0[`0001/000?o0000
9@000ol0003o0;00000K0003o`0002D000?o0000o`2`00006`000ol0000T0003o`000?l0/@0001/0
00?o000090000ol0003o0;40000K0003o`0002<000?o0000o`2b00006`000ol0000S0003o`000?l0
/P0001/000?o00008P000ol0003o0;<0000K0003o`00028000?o0000o`2c00006`03ob4000?o0000
o`2d00006`000ol0000Q0003o`000?l0]00001/000?o000080000ol0003o0;D0000K0003o`000200
00?o0000o`2e00006`000ol0000O0003o`000?l0]P0001/000?o00007`000ol0003o0;H0000K0003
o`0001h000?o0000o`2g00006`000ol0000N0003o`000?l0]`0001/000?o00007@000ol0003o0;P0
000K0003o`0001d000?o0000o`2h00006`03oa`000?o0000o`2i00006`000ol0000L0003o`000?l0
^@0001/000?o000070000ol0003o0;T0000K0003o`0001/000?o0000o`2j00006`000ol0000K0003
o`000?l0^P0001/000?o00006P000ol0003o0;/0000K0003o`0001X000?o0000o`2k00002003o`D0
0ol80003o`0001X000?o0000o`2k00001`001Ol0003o00<000Go0000o`070003o`0001T000?o0000
o`2l00001`001Ol0003o00<000Go0000o`070003o`0001T000?o0000o`2l00001`001Ol0003o00<0
00Go0000o`0700?o60000ol0003o0;d0000700Co10001Ol0003o00L000?o000060000ol0003o0;d0
00070003o`0000D000Go0000o`070003o`0001P000?o0000o`2m000020000ol000040005o`000?l0
1`000ol0000G0003o`000?l0_P0000T00ol400?o20000ol0000G0003o`000?l0_P0001/000?o0000
5`000ol0003o0;h0000K0003o`0001H000?o0000o`2o00006`000ol0000F0003o`000?l0_`0001/0
00?o00005@000ol0003o0<00000K0003o`0001D000?o0000o`3000006`03oaD000?o0000o`300000
6`000ol0000D0003o`000?l0`@0001/000?o000050000ol0003o0<40000K0003o`0001@000?o0000
o`3100006`000ol0000C0003o`000?l0`P0001/000?o00004`000ol0003o0<80000K0003o`0001<0
00?o0000o`3200006`000ol0000B0003o`000?l0``0001/000?o00004P000ol0003o0<<0000K00?o
4P000ol0003o0<<0000K0003o`00014000?o0000o`3400006`000ol0000A0003o`000?l0a00001/0
00?o00004@000ol0003o0<@0000K0003o`00014000?o0000o`3400006`000ol0000@0003o`000?l0
a@0001/000?o000040000ol0003o00003o`000?l0a`0001/000?o00003P000ol0003o000006`000ol0
00070003o`000?l0cP0001/000?o00001`000ol0003o00000
6`000ol000060003o`000?l0c`0001/000?o00001P000ol0003o0"],
ImageRangeCache->{{{0, 500.25}, {308.688, 0}} -> {-0.0722258, -14.9802,
0.00328311, 0.637463}}]
}, Open ]],
Cell[TextData[{
"This shows that as a user learns more about the device (the larger ",
StyleBox["x",
FontFamily->"Courier"],
"), until they know as much about it as the designer (",
StyleBox["x",
FontFamily->"Courier"],
"=1), their performance improves. In particular, if the user doesn't know \
much (where the graph is steep), then even a little help can have a dramatic \
improvement on their performance. We don't have enough space to do this sort \
of graph justice, except to point out different device designs (which can \
easily be explored) have different shaped curves, and hence this approach \
gives useful insight into design trade-offs."
}], "Text"],
Cell[TextData[{
"Many other sorts of analysis are possible. See",
ButtonBox[" Thimbleby (1994)",
ButtonData:>"thimbleby94",
ButtonStyle->"Hyperlink"],
", a general approach, and ",
ButtonBox["Thimbleby (1997)",
ButtonData:>"thimbleby97",
ButtonStyle->"Hyperlink"],
", the analysis of a particular device, for further examples. Below, we \
shall show that it is possible to generate user manuals from specifications: \
the structure of manuals can be analysed (without anyone ever having to ",
StyleBox["see",
FontSlant->"Italic"],
" them) \[LongDash] for example, to identify the hardest (e.g., most \
lengthy) parts of them, and then to redesign the device so that awkward parts \
are simplified. ",
ButtonBox["Thimbleby & Addison (1994)",
ButtonData:>"thimblebyaddison94",
ButtonStyle->"Hyperlink"],
" show how to use flow analysis, arguing that user manual design should \
follow program design best practice."
}], "Text"]
}, Open ]],
Cell[CellGroupData[{
Cell["Looking at empirical statistics of use", "Section"],
Cell[TextData[{
"The statistics of use collected could be used directly in link analysis \
and with other conventional design techniques (",
ButtonBox["Stanton, 1998",
ButtonData:>"stanton",
ButtonStyle->"Hyperlink"],
"), but we shall continue with the Markov analysis. We could use the \
function ",
StyleBox["neatTable",
FontFamily->"Courier"],
", defined above, to print out the statistics in a neat form."
}], "Text"],
Cell[TextData[{
"The actual statistics data used to calculate the information in this \
section is shown below. (In fact, the numbers here were originally printed by \
asking ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" for the value of ",
StyleBox["statistics",
FontFamily->"Courier"],
" during a session.) The ",
StyleBox["Mathematica",
FontSlant->"Italic"],
" code below can be run to initialised the variable ",
StyleBox["statistics",
FontFamily->"Courier"],
" (e.g., during a live demonstration of this paper)."
}], "Text"],
Cell[CellGroupData[{
Cell[BoxData[
\(statistics\ =
\ {{2, 4, 1, 1, 0, 0}, {5, 2, 1, 2, 1, 0}, {8, 3, 6, 0, 0, 1}, {4, 2,
2, 2, 1, 0}, {6, 1, 2, 1, 0, 0}}; \n\n
neatTable["\