next up previous


Ein wiederbelebbares Buch zur Statistik

Version: 1.0, Oktober 1997

H. P. Wolf

Statistik und Informatik
Fakultät für Wirtschaftswissenschaften
Universität Bielefeld


Contents

Vorbemerkung

Zielsetzung und Idee.

Konzept:
Wie lernt ein Fahrschüler das Autofahren? Nach den bei uns gültigen Gesetzen muß er in einer Fahrschule einen Unterricht besuchen, er muß Fahrstunden nehmen -- dabei sind besondere unter speziellen Bedingungen zu absolvieren -- und er muß eine theoretische und eine praktische Prüfung bestehen. Jeder, der Autofahren gelernt hat, wird bestätigen, daß damit der Lernprozeß noch lange nicht abgeschlossen ist. Auch nach bestandener Prüfung sollte man weiter bereit sein, fremde und eigene Erfahrungen anzusammeln und einzusetzen.

Wie bekommt man einen Führerschein für statistische Werkzeuge? Leider (?) gibt es so einen Schein bei uns noch nicht, und es gibt demzufolge auch keine allgemeinen gesetzlichen Regelungen, wie ein solcher zu erlangen ist. Dennoch benötigt man für einen geeigneten Umgang mit statistischen Werkzeugen sowohl theoretisches Grundwissen wie auch praktische Erfahrung. Wird nur Theorie vermittelt, wird der Studierende in realen Problemsituationen die Übertragungsleistung nicht bewältigen können und kapitulieren müssen. Lernt er an Beispielen, Kochrezepte einzusetzen, bleiben Zusammenhänge wie auch die Bedeutung von Annahmen unreflektiert, so daß eine adäquate Interpretation der Ergebnisse unterbleiben wird. Ziel der statistischen Ausbildung muß es also sein, statistische Konzepte theoretisch wie auch in ihrer Anwendung zu vermitteln.

Die klassische Vorlesung begleitet von Kleingruppenübungen kann die Einführung in das theoretische Gebäude leisten. Auch können an kleinen Beispielen die Konzepte verdeutlicht werden. Reale Problemfälle, die in der Regel mit größeren Datenmengen verbunden sind, lassen sich aber ohne weiteres nicht diskutieren. Hierfür wird eine Unterstützung durch Rechner mit statistischer Software notwendig, die aber nicht für Ausbildungssituationen geschaffen sind. Mit diesem vorliegenden elektronischen Buch, dem revbook , wird ein Versuch gemacht, den beschriebenen Mangel zu mildern. Durch dieses Buch, das in gespeicherter Form auf Rechnern vielerlei Funktionalitäten bietet, erhält der Lernende ein neues Medium, mit dem und in dem er werkeln und erfahren kann.

Um Erfahrungen an einem konkreten Gegenstand zu machen, beginnen die Gedanken dieser Abhandlung in einem realen Problembereich. In diesem werden Fragen aufgeworfen und unter Einsatz von statistischen Konzepten und Werkzeugen beantwortet.

Praxis:
Als interessantes Problemfeld dient die Belastung eines WWW-Servers. Dieses ist ein (virtueller) Rechner, der das Internet neben einigen anderen Diensten auf Anforderung mit Dateien versorgt. Durch die enormen Wachstumsprozesse des Internets ergeben sich verschiedene Fragen, die sich um die Belastung des Servers drehen: Wie mißt man Belastung? Wann ist die Belastung am größten? Worauf müssen wir uns in der Zukunft einstellen?
Konzept:
Zur Motivation werden in jedem Kapitel einige Fragen aufgelistet und Daten bereitgestellt. Mit Hilfe der in diesem Buch verfügbaren Werkzeuge entdeckt der aktive Leser dann eine Reihe von Antworten. Dabei werden wieder neue Fragen aufgeworfen, die tiefer in die Statistik hineinführen und zu den folgenden Kapiteln überleiten. Die Fragen sind von ihrer Natur her auf sehr viele andere Bereiche übertragbar, so daß sich die Relevanz der Ausführungen nicht nur auf das Feld des Internet beschränkt.

Dieses Buch dient damit zwei unterschiedlichen Zielen:

1.
Erfahrungsbildung durch Einsatz von Werkzeugen der Statistik an Beispieldatensätzen,
2.
Beantwortung von Fragen eines realen Problembereiches unter Anwendung statistischer Werkzeuge.

Das Buch soll als zusätzliches Angebot eine Einführungsvorlesung begleiten. Deshalb werden nicht alle Grundkonzepte der Statistik hier eingeführt. So erfährt zum Beispiel der Wahrscheinlichkeitsbegriff keine nähere Problematisierung, sondern es wird davon ausgegangen, daß solche theoretischen Konzepte an anderer Stelle vertieft erklärt werden. Zur Unterstützung enthält der Text aber Literaturhinweise.

Ebenso findet keine Einführung in S-PLUS statt. S-PLUS ist die Software, die dieses elektronische Buch als Fundament hat. Für einen Anfänger dürfte die Sprache S-PLUS sehr viele kleine technische Probleme aufwerfen, die ihn von der eigentlichen Auseinandersetzung ablenken können. Deshalb ist von der Beherrschung der Sprache vorsetzlich auch nicht ausgegangen worden. Alle S-PLUS-Anweisungsfolgen sind für ihre Benutzung zu Modulen, von denen der Anfänger nur die satzähnlichen Namen erfährt, zusammengefaßt. Module können direkt und zum Teil auch über Menüs angesprochen werden. Der Kenner von S-PLUS kann natürlich von seinem Wissen profitieren, und der Neugierige kann stöbern und die Inhalte der Module herausfinden.

Einige Bemerkungen zur Technik

Konzept:
In diesem Abschnitt werden einige Hinweise zur eingesetzten Technik gegeben.

Lesen des REVBOOK-Buches

Praxis:
Eine ausgedruckte Version dieses Buches kann wie ein Buch gelesen werden. Gedanken, Verfahrensaufrufe, Ergebnisse und Interpretationen sind so aufgeschrieben, daß sie einen geschlossenen Gedankengang ergeben (sollen). Wenn im Rechner das Buch als Postscript-Datei abgelegt ist, kann es mit einem Postscript-Dateien-Betrachtungsprogramm betrachtet werden. Unter dem Betriebssystem UNIX könnte der Aufruf dann so aussehen:
ghostview revbook.ps

Jedoch ist das Lesen eines Buches an einem Bildschirm eine Zumutung und auch hier nicht angestrebt. Hauptanliegen der Rechnerversion besteht darin, interaktiv mit dem Buch arbeiten zu können. Dazu läßt sich das Buch als Abfolge von Textstücken (text chunks) und Anweisungsblöcken (code chunks) auffassen. Die Texte sind für den menschlichen Leser bestimmt und beinhalten, wie gesagt, Gedanken, Ergebnisse und Interpretationen. Die Anweisungsblöcke, die in den verschiedenen Kapiteln auftauchen, bestehen im wesentlichen aus Modulaufrufen, deren Definitionen über die eingetragenen Referenznummern im Anhang zu finden sind.

Voraussetzungen für die interaktive Arbeit

Voraussetzung für das oben skizzierte Tun sind unter UNIX die Statistik-Software S-PLUS sowie die Bibliothek revbook . In dieser library befindet sich ein Verzeichnis mit speziellen Funktionen, die zu diesem Buch gehören, eine Datei, in der in aufbereiteter Form die Anweisungen dieses Buches abgelegt sind, sowie eine S-PLUS-Funktion, mit der die Module (Teile dieser Datei) aktiviert werden können.

Start der interaktiven Arbeit mit dem Buch

Die genaue Form des Starts kann von Version zu Version etwas unterschiedlich sein. Zur Zeit der Erstellung dieser Zeilen waren unter UNIX folgende Schritte nötig.
1.
Als User auf UNIX-Anlage einloggen.
2.
S-PLUS aus einem Terminalfenster heraus starten -- üblicherweise durch:
Splus

S-PLUS meldet sich dann mit dem Eingabeaufforderungszeichen (Prompt) > .
3.
Ein graphisches Fenster öffnen. In vielen S-PLUS-Implementationen geht das wie folgt:
> motif()

Hiernach ist das neue Graphik-Fenster das aktive Fenster.
4.
Aktivierung des Eingabe-Fensters von S-PLUS. In der Regel wird dieses durch Positionierung des Maus-Zeigers in den Bereich des Eingabe-Fenster sowie einem Klick auf die linke Maustaste bewirkt.
5.
Herstellung einer Verbindung zu dem Aktivierungsprogramm:
> library(revive)

6.
Optional: Wer sich das revbook in einem Fenster ansehen will, kann dieses mittels
> show.revbook()

umsetzen. Hierdurch wird das schon oben erwähnte Programm ghostview

mit passender Input-Datei gestartet. ( ghostview wird mit einem Druck auf die Taste Q wieder geschlossen.)

7.
Starten des Aktivierungsprogramms revive mit der zum revbook zugehörigen Datei:
> open.revbook()

Nun müssen einige Initialisierungen ablaufen, die einige Meldungen ausgeben. Andernfalls ist ein Fehler aufgetreten, den es zu beheben gilt.

Einige dieser oder alle Schritte können auch automatisch ablaufen, wenn jemand dieses so vorbereitet hat.

Die interaktive Arbeit

Das elektronische Buch enthält eine ganze Reihe von Anweisungen zur Aktivierung statistischer Verfahren. Diese können selektiv ausgewählt und gestartet werden. Mit ein wenig Geschick (und etwas S-PLUS-Wissen) lassen sie sich auch nach eigenen Wünschen modifizieren. Ohne weiteres Wissen sind die eingebauten Auswahlmenus zu starten. Bei der Arbeit mit dem elektronischen Buch lassen sich fünf Haupttätigkeiten unterscheiden:
1.
Menü-Steuerung, die auch automatisch zu Beginn aktiviert wird, starten: Hierzu muß der Bediener nach der Eingabeaufforderung von revive (z.B.: revive.. 9 -: ) das Kommando s (für select section) mit der Spezifikation MENU eingeben:
revive.. 9 -: s MENU

Hiernach wird das Hauptmenu angezeigt. Mit diesem kann der Bediener zu bestimmten Punkten im Buch gelangen oder spezielle Menüs einzelner Kapitel aktivieren.
2.
In einem Menü ein bestimmtes Item auswählen: In späteren Versionen wird die Auswahl vielleicht mittels Mausklick umgesetzt werden, in den derzeitigen durch Eingabe eines Buchstabens.
3.
Anweisungen zur Aktivierung gezielt auswählen: Hierfür muß der Bediener das Kommando s gefolgt von der Nummer, die zu dem gewünschten Modul gehört, eingeben. Ist diese Nummer 10, so ergibt sich:
revive.. 9 -: s 10

Die Nummer des Moduls findet man im revbook auf dem linken Rand neben dem gewünschten Anweisungsblock.
4.
Eingabetaste ohne weitere Tastendrücke drücken: Dann wird der nächste Anweisungsblock aktiviert. Die Nummer des zuletzt ausgeführten Blocks (code chunk) wird übrigens immer eingeblendet. In den letzten Beispielen war dies die Nummer 9 für code chunk Nummer 9 zuletzt ausgewertet.
5.
Eigene S-PLUS-Anweisungen umsetzen. Dieses erfordert neben einigen S-PLUS-Kenntnissen das revive -Kommando > oder < . Der Wunsch ist diesen als Spezifikation mitzugeben:
revive.. 9 -: > 1+1

liefert erwartungsgemäß 2.
Darüber hinaus verlangt das System an den verschiedensten Stellen Zahleneingaben, Texteingaben oder sogar graphische Eingaben. Für weitere Möglichkeiten sei hingewiesen auf [P. Wolf, 1995].

Zur Information folgt ein Abdruck des zentralen Menüs:

------------------------------
   Abk.:    lange Bezeichnung:
------------------------------
items:
 a          Abbruch
 b MENU     allgemeines Menu
 c start.mz Kapitel Masszahlen
 d start.gr Kapitel Graphische Beschreibungstechniken
 e start.mu Kapitel Multivariate Beschreibungstechniken
 f start.mo Kapitel Modellierungsschritte
 g start.nv Kapitel Normalverteilung
 h v.bern   Abschnitt Bernoulli-Verteilung
 i v.binom  Abschnitt Binomial-Verteilung
 j v.geom   Abschnitt geometrische Verteilung
 k v.exp    Abschnitt Exponentialverteilung
 l v.pois   Abschnitt Poisson-Verteilung
 m menu.mz  Menue Masszahlen
 n menu.gr  Menue Graphische Beschreibungstechniken
 o menu.mu  Menue Multivariate Beschreibungstechniken
 p menu.mo  Menue Modellierungsschritte
Selection:

Beendigung der interaktiven Arbeit

Unter UNIX werden durch ein Verabschieden als User ( logout -Prozeß) auch revive und S-PLUS beendet sowie alle graphischen S-PLUS-Fenster geschlossen. Dieses entspricht dem letzten Punkt in der folgenden Aufzählung. Mehr braucht ein Anfänger eigentlich nicht zu wissen. Geordneter ist es aber, Schritt für Schritt alle geöffneten Fenster und Anwendungen zu schließen:
1.
Verlasse gegebenenfalls einen aufgerufenen Editor.
2.
Verlasse gegebenenfalls ein aktives Menü.
3.
Mache gegebenenfalls das S-PLUS-Fenster zum aktiven Fenster.
4.
Unterbreche gegebenenfalls noch laufende Berechnungen durch Drücken der Taste KTRL oder STRG sowie der Taste C .
5.
Beende revive durch Eingabe des Befehls q .
6.
Beende S-PLUS durch Aufruf von q() .
7.
Beende die Sitzung durch einen geordneten Logout-Prozeß. Dieses kann durch ein Anklicken des Schalters EXIT eingeleitet werden.

Gliederungsprinzip

Konzept:
Der Inhalt ist primär nach statistischen Elementen gegliedert, da dieses Suchprozesse beim zweiten Lesen und auch sprunghafte Arbeitsstile besser unterstützt. Im kleinen tauchen die drei Hinweiswörter Konzept, Praxis und Technik auf. Hierdurch soll dem Leser angedeutet werden, daß die folgenden Gedanken entweder mehr allgemeiner, abstrakter, konzeptionell oder aber speziell, am Beispiel orientiert sind oder zum dritten sich eher auf rein technische Belange beziehen.

Literatur

Autorenkollektiv, ohne Jahr: Grundausbildung in Statistik für Wirtschaftswissenschaftler,
FU Berlin, Universität Bielefeld, TU Hannover, Ruck-Zuck-Druck, Bielefeld.

BAMBERG, G., BAUR, F., 1980: Statistik,
Oldenbourg Verlag, München/Wien.

CHAMBERS, J.M., CLEVELAND, W.S., KLEINER, B., TUKEY, P.A., 1983:
Graphical Methods for Data Analysis, Duxbury Press, Boston.

HOAGLIN, D.C., MOSTELLER, F., TUKEY, J.W., (EDS.), 1982:
Understanding Robust & Exploratory Data Analysis.
John Wiley & Sons, New York.

LANG, L., WOLF, H.P., 1995: Ein Spidery WEB System für SPLUS.
Diskussionspapier Nr. 296, der Fakultät für Wirtschaftswissenschaften
der Universität Bielefeld, Bielefeld.

SCHLITTGEN, R., 1990: Einführung in die Statistik,
Oldenbourg Verlag, München/Wien.

VENABLES, W.N., RIPLEY, B.D., 1994: Modern Applied Statistics with S-Plus,
Springer-Verlag, New York/Berlin.

BECKER, R.A., CHAMBERS, J.M., WILKS, A.R., 1980: The new S Language,
Wadsworth & Brooks/Cole, Pacific Grove.

WOLF, P., 1995: Eine Reportschmiede für den Datenanalytiker.
Diskussionspapier Nr. 301 der Fakultät für Wirtschaftswissenschaften
der Universität Bielefeld, Bielefeld.

Noch nicht enthalten

Noch mehr Experimente, Behandlung von kategoriellen Daten, Kapitel Schätzen, Kapitel Testen, Kapitel Regression, Diskussion der Fehlbenutzung statistischer Werkzeuge, weitere spezielle Lernwerkzeuge.

Ein Problemfeld

Fragen

Praxis:
Mit dem vielgerühmten neuen Instrument Internet handeln sich deren Bediener auch Probleme ein. Neben der Anschaffung von Hardware und Software müssen verschiedene Pflegedienste erledigt werden. Dazu gehören das Beschließen und Umsetzen von organisatorischen Maßnahmen wie auch die Planung von Kapazitäten. Notwendig ist hierfür eine gute Abschätzung der zukünftigen Belastung, die eine Kenntnis der aktuellen voraussetzt. Dadurch stellen sich zum Beispiel folgende Belastungsfragen ein: Solche Fragen sind schnell formuliert. Ihre Beantwortung erfordert jedoch statistischen Sachverstand, einiges aus der Wahrscheinlichkeitstheorie und zunächst die Definition dessen, was unter Belastung verstanden werden soll.

Daten

Praxis:
Wir wollen uns auf einen realen WWW-Server konzentrieren und die Belastung dieses Servers anhand der Zugriffe, die von außen kommen, studieren. Eine hohe Anzahl von Zugriffen (pro Zeiteinheit) wie auch große Übertragungsmengen sind als hohe Belastung zu deuten. Eine Erhebung hat für den 03.02.1997 und für den 17.02.1997 die Zugriffszeitpunkte (in Sekunden seit Monatsbeginn) mit den jeweiligen Übertragungsmengen (in Bytes) hervorgebracht. Damit stehen für die erste Analyse ausreichend Daten zur Verfügung.

Relevanz

Konzept:
Zwei Bemerkungen seien zur Relevanz der Diskussion angefügt:
1.
Führt die Analyse des Datenmaterials zu brauchbaren Erkenntnissen, läßt sich die Methodik auf ähnliche Datensätze anwenden. Damit wird zum Beispiel die Analyse der Server-Daten eines anderen Tages auch gelingen.
2.
Kapazitätsfragen sind an vielen Stellen in der Welt relevant. Man denke nur an unsere zunehmend verstopften Autobahnen. Aber auch für die Planung betrieblicher Ressourcen spielen zufällig eintretende Ereignisse (wie eintreffende Kunden, Aufträge, Produktionsausfälle) und Belastungsfragen (zum Beispiel bei der Planung eines Lagers oder von Bearbeitungs- und Abfertigungsstellen) eine erhebliche Rolle. Insofern lassen sich viele der hier gewonnenen methodischen Erkenntnisse auf ganz andere Bereiche übertragen. Diese Übertragung erfordert einen Abstraktionsprozeß, der dem zukünftigen Problemlöser aber nicht abgenommen werden kann.
Technik:
Es sei darauf hingewiesen, daß auf den Variablen zeitpunkte.03.02.1997 und mengen.03.02.1997 die Zugriffszeitpunkte sowie die Datenmengen vom 03.02.1997 abgelegt sind, dzeitpunkte.03.02.1997 hält die Zeitdifferenzen zwischen den Zeitpunkten. Die Zeitpunkte vom 17.02.1997 sind der Variablen zeitpunkte.17.02.1997 , die zugehörigen Mengen mengen.17.02.1997 und die Zwischenzeiten dzeitpunkte.17.02.1997 zu entnehmen. Dieser Hinweis ist für S-PLUS-Kenner gedacht. Mit diesem revbook

kann aber auch über die Auswahlmenus auf diese Daten zugegriffen werden. Hierfür ist es nicht erforderlich, die Namen der Variablen zu kennen.

Maßzahlen zur Beschreibung von Lage und Variabilität

Technik:
Am Ende dieses Absatzes befindet sich die erste Stelle, die vom Rechner gelesen werden kann. Solche Stellen sind, wie oben beschrieben, mit einer laufenden Nummer versehen. So findet man neben dem ersten Block die Zahl 1. Die Zeichen $\langle$* $1\rangle$+$\equiv$ zeigen den Beginn des Anweisungsblockes an. Der Anweisungsblock selbst besteht aus einer Anweisung zum Ausdruck einer Überschrift, die für die Orientierung hilfreich sein soll. Es finden also noch keine weiteren Berechnungen statt.


[1:]

<<*>>=
cat("Revbook:1.a:start.mz:Kapitel Masszahlen\n")
Zum Literaturstudium sei hingewiesen auf: [Autorenkollektiv: Abschnitte über Lokalisationsmaße und Maßzahlen der Variabilität], [Bamberg, Baur: Abschnitte über Lageparameter und Streuungsparameter], [Schlittgen: Abschnitte über Lageparameter und Streuungsparameter].

Konzept:
Die ersten beiden Fragen des letzten Kapitels lauteten: Wie groß ist die Belastung? und Wie stark schwanken die Belastungen? Zur Beantwortung müssen die Begriffe groß und schwanken mit Bedeutung gefüllt und präzisiert werden. Hierzu bietet die Statistik die vagen Begriffe Lage und Variabilität sowie verschiedene Maßzahlen zu deren Formalisierung an. In diesem Abschnitt werden solche Maßzahlen zur Lage und zur Variabilität behandelt.

Konzept:
Durch den Übergang zur Maßzahl versucht der Statistiker, einen Datensatz bezüglich eines speziellen Aspektes maximal zu verdichten (Datenreduktion). Hierdurch erhofft man sich einen klaren Blick auf die gesuchte Information. Jedoch ist die Definition von Maßzahlen nicht unproblematisch. Dieser Abschnitt zeigt verschiedene Festlegungen und ihre Probleme auf und soll ein vertieftes Methoden-Verständnis fördern.

Die treibenden Fragen in allgemeiner Formulierung zu diesem Kapitel sind:

Maßzahlen können Beiträge zu den ersten drei Fragen beisteuern. Für die weiteren sei auf den Abschnitt über graphische Werkzeuge verwiesen. Zuerst werden das Mittel, der Median und Verwandte, die als Lageparameter Verwendung finden, eingesetzt. Dann werden Maße zur Charakterisierung der Streuung betrachtet. Abschließend werden Box-Cox-Transformationen diskutiert, die in vielen Fällen das Datenmaterial symmetrischer machen können.

Für die zulässige Anwendung eines Werkzeuges müssen im allgemeinen bestimmte Bedingungen erfüllt sein. Dies gilt auch für Werkzeuge der Statistik. So kann man nicht jedes Datenmaterial mit jedem Werkzeug bearbeiten und dann die resultierenden Rechenergebnisse interpretieren. Statistische Verfahren, in denen mit Daten gerechnet wird, erwarten, daß die Rechenoperationen für die Daten geeignet sind. Für die Beobachtungen männlich und weiblich ist die Addition keine geeignete Operation, da für eine Addition ein nominales Skalenniveau nicht ausreicht. Auch geordnete Größenklassen erfüllen diese Forderung nicht (Beispiel hierfür: winzig, klein, normal, groß, riesig). Erst eine metrisch skalierte Variable erlaubt Summation und Durchschnittsbildung; hier lassen sich auch Differenzen der Beobachtungen sinnvoll interpretieren. Für die im folgenden eingesetzten Operationen wird implizit die Zulässigkeit unterstellt. Fragen der Metrik werden nicht näher diskutiert. Hierzu sei auf die Literatur verwiesen.

Praxis:
Woran läßt sich die Server-Belastung festmachen? Ein Aspekt von Belastung kann an den Zeiten zwischen den Zugriffsereignissen abgelesen werden. Sind die Zeiten zwischen zwei Zugriffsereignissen klein, dann ist die Belastung groß, sind sie groß, dann ist die Belastung klein. Wir wollen in diesem Kapitel die Zwischenzeiten vom 03.02.97 näher unter die Lupe nehmen. Für diese Daten lassen sich die fünf Fragen übersetzen in:
Technik.
Zunächst legen wir die Zwischenzeiten vom 03.02.97, unsere Urliste, auf der Variablen x ab. Hierdurch können alle möglichen Operationen mit x durchgeführt werden, ohne daß der Originaldatensatz verloren gehen kann. Da alle Verfahrensbeschreibungen dieses Kapitels auf x zugreifen, können so durch Neubelegung von x alle eingesetzten Verfahren auf den neuen Datensatz angewendet werden.
Zusätzlich drucken wir die Daten, da es nicht zu viele sind, einmal aus.


[2:]

<<*>>=
<<lege Zwischenzeiten vom 03.02.97 auf {\tt x} ab>>
<<drucke {\tt x} aus>>
Praxis:
Wir erhalten:
  [1]  1077  4862 24449   554   164  1667    67  3670   639   350    83   524
 [13]  2236   403   240     6   131     2     1    44   351   615    14    12
 [25]     8   106   312  1183   697  1021   771    46   153    29   672   516
 [37]   116   285    73    15   120    14   490   788   600   117  2772   197
 [49]     6    11     2     1    19    21   503  1374   133   337   320  1754
 [61]   119    44   433   718   158    46   712    58   139    40   165   344
 [73]  1378   588   455   870  2409  1021   547    10     1     8    40    67
 [85]   166  1145   778   260  1515   540  1281  1965   207  1913  2330   174
 [97]   573  1702    49   107   290   362  1381

Maße zur Charakterisierung der Lage

Konzept:
Die Frage nach der Größe der Belastung ist eine Niveaufrage. Denkt man sich eine Achse, auf der sich Belastungen abtragen lassen, so wird nach der Stelle der Achse gefragt, die die allgemeine Belastung charakterisiert. Es wird also die Lage gesucht: Wo liegt die Stelle der typischen Belastung auf der Belastungsachse?

Praxis:
Die Frage kann zum Beispiel zur mittleren Zwischenzeit als Indikator führen. Bei der Übertragung auf die Zwischenzeiten darf natürlich der inverse Zusammenhang zwischen Belastung und Zwischenzeiten nicht vergessen werden.

Konzept:
Als erste Variante einer charakterisierenden Zahl wird fast immer der Mittelwert vorgeschlagen. Also berechnen wir zunächst das arithmetische Mittel $\sum_{i=1}^n x_i/n$ der n Beobachtungen $(x_1, \ldots, x_n)$.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
mean(x)}
 --- arithmeti...
 ...\tt{}
mean(x) == }
} \mbox{{\tt{}
sum(x)/n}
}\end{displaymath}}
\end{minipage}}
Technik:
An sich dürfte hier, da allgemein bekannt, eine formale Definition des Mittelwertes nicht nötig sein. Jedoch zeigt der Kasten, daß S-PLUS auch als Notationsinstrument eingesetzt werden kann. sum(x) ist eine S-PLUS-Anweisung, die die Summe der auf x

abgelegten Zahlen berechnet. / steht für Division, + , - und *

für Addition, Substraktion und Multiplikation. Außerdem sei noch bemerkt, daß S-PLUS die Funktion mean() kennt, die das arithmetische Mittel der ihr übergebenen Variablen berechnet. Hier ist das Modul zur Mittelwertberechnung von x :


[3:]

<<*>>=
<<berechne Mittelwert von {\tt x}>>
Praxis:
Wir erhalten:
Mittelwert
[1] 823.8
Da die Daten als Einheit Sekunden haben, beträgt die durchschnittliche Wartezeit auf den nächsten Zugriff eine knappe Viertelstunde. Das scheint nicht sehr viel zu sein.

Konzept:
Alternativ kann man zur Charakterisierung der Lage die Stelle berechnen, die den Datensatz bezüglich der Anzahlen in zwei gleich große Teile teilt. Diese Stelle heißt (bekanntlich) Median.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
median(x)}
 --- Median
...
 ...ath}Hierbei ist $x_{(i)}$\space die i-t kleinste Beobachtung.
}
\end{minipage}}
Technik:
Der S-PLUS-Aufruf median(x) berechnet den Median von x . Um auch für Nicht-S-PLUS-Fans verständlich zu sein und nicht zu sehr abzulenken, wird im Anweisungsblock zur Berechnung des Medians ein Modulaufruf verwendet. Aus diesem Grund tauchen in den Kapiteln des revbook fast nur Modulaufrufe auf. Die Anweisungen der Module sind über die kleine Referenznummer hinter dem Modulnamen im Anhang zu finden.


[4:]

<<*>>=
<<berechne Median von {\tt x}>>
Praxis:
Wir erhalten:
Median
[1] 312
Fast jedes zweite Mal beträgt also der Abstand zwischen zwei Zugriffsversuchen weniger als 6 Minuten. Damit erscheint die Belastung viel höher zu sein, als das Mittel vermuten ließ.

Konzept:
Irrt eine der beiden Maßzahlen? Wann liefern Mittel und Median gleiche Werte? Für die drei Werte 200, 300, 400 sind Mittel und Median gleich (300). Für 200, 300, 1900 erhalten wir wieder einen Median von 300, jedoch ein Mittel von 800. 800 ist übrigens gerade die Stelle des Schwerpunkts eines physikalischen Systems, bei dem sich an den Stellen 200, 300 und 1900 gleich große Massen befinden.
=7mm
\begin{picture}
(20,5)
\put(0,3.5){\line(1,0){20}}
\put(2,4){\circle{.5}}
\put(3...
 ...300}}
\put(19,1){\makebox(0,0){1900}}
\put(8,1){\makebox(0,0){800}}\end{picture}
Wie man sieht, haben Extremwerte, die eventuell auf Fehlern beruhen, einen erheblichen Einfluß auf das Mittel, der Median bleibt von ihnen unberührt. Wir wollen die Extremwerte aufspüren.


[5:]

<<*>>=
<<berechne Extrema von {\tt x}>>
Praxis:
Maximum
[1] 24449
Minimum
[1] 1
In der Tat weicht der größte Wert erheblich von dem Bereich (bis 1000) ab, in dem sich die bisher berechneten Lageparameter befinden. Damit wird klar, daß man das Mittel in dem vorliegenden Fall nicht ohne weiteres als Argument für Belastungsfragen heranziehen darf.
Konzept:
Auch die Berechnung der Mitte der Extremwerte -- genannt Midrange -- als Lagemaß weist denselben Defekt auf.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { --- Midrange
von {\tt{}
x}
 $...
 ...math}
\mbox{{\tt{}
0.5 * (min(x) + max(x))}
}\end{displaymath}}
\end{minipage}}
Technik:
Die S-PLUS-Funktionen min() und max() berechnen Minimum und Maximum eines Datensatzes.
Praxis:
Unser Modul mit dem sprechenden Namen folgt:


[6:]

<<*>>=
<<berechne Midrange von {\tt x}>>
Midrange
[1] 12225
Konzept:
Nun wird noch eine Alternative zum arithmetischen Mittel und zu x0.5 präsentiert, die die Auswirkung der Ausreißer entschärft:

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { ---
$\alpha$-getrimmtes Mitte...
 ...at\uml urlich nur weniger als 50 \% an jedem Ende entfernen!)
}
\end{minipage}}
Technik:
Das Modul zur Berechnung des getrimmten Mittels fragt nach dem Prozentsatz der an jeder Seite zu entfernenden Werte. Die Frage ist durch Eingabe einer Prozentzahl zu beantworten. (Für absolute Rechnerneulinge: Für den Wunsch 10 % erst die beiden Tasten 1 und 0 einmal drücken, dann die Eingabetaste.)


[7:]

<<*>>=
<<berechne getrimmtes Mittel von {\tt x}>>
Praxis:
Hier das Musterbeispiel:
getrimmtes Mittel
Wieviel Prozent sollen an jeder Seite enfernt werden?
  Eingabe:
[1] 10
    ergibt:
[1] 439.11
Das getrimmte Mittel liegt offensichtlich dem Median viel näher als das nicht getrimmte. Haben Sie hierfür eine Erklärung?

Konzept:
Es gibt natürlich weitere Vorschläge, die Lage durch eine Statistik auszudrücken. Stellvertretend sei deshalb noch das Trimean vorgestellt. Dieses berechnet sich als gewogenes Mittel von Median und den Quartilen. Dafür benötigen wir die Berechnungsvorschrift von Quartilen, die wieder auf die der Quantile zurückgeführt wird. Das Trimean selbst ist relativ unüblich, führt uns aber zu den wichtigen Konzepten Quartile und Quantile. (Siehe auch [Hoaglin et al.].)

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
quantile(x,p)}
 --- das...
 ...er
als die verbleibenden (100$-p\times100$) \% Beobachtungen.
}
\end{minipage}}

(Die Definition eines empirischen Quantils ist nicht genormt, so daß kleine Unterschiede auftreten können. Diese spielen für größere Stichprobenumfänge kaum eine Rolle. Werden jedoch von verschiedenen Software-Produkte unterschiedliche Werte ermittelt, kann das auf unterschiedliche Definitionen zurückzuführen sein. S-PLUS sieht die Welt so: Das p-Quantil ist gegeben durch g-1(p), wobei g-1 die Umkehrfunktion von g(x) ist; g(x) ist die Funktion, die sich aus dem Polygonzug der Punkte (x(i), (i-1)/(n-1)) ergibt. x(i) ist dabei der i-te Wert der Rangwertreihe (sortierte Folge der Werte).)

Technik:
quantile(x,p) berechnet das p-Quantil von x . Für p ist dabei der gewünschte Anteil einzusetzen. Quartile sind besondere Quantile. Sie teilen den Datensatz in vier ungefähr gleich große Teile.
Konzept:

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Quartile
von {\tt{}
x}
 $= (x_...
 ...ob
dem Median aller Beobachtungen oberhalb des Gesamtmedians.
}
\end{minipage}}

Auch diese Begriffe sind nicht genormt.

Technik:
quantile(x,0.25) berechnet also das untere Quartil von x , quantile(x,0.75) das obere.
Konzept:
Nun läßt sich das Trimean, das Mittel aus dem Median und dem Mittel aus erstem und drittem Quartil, festlegen.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { --- Trimean
von {\tt{}
x}
 $=...
 ...median(x),mean(quantile(x,c(0.25,0.75)))))}
}\end{displaymath}}
\end{minipage}}
Technik:
Die Notation deutet darauf hin, daß innerhalb von S-PLUS Funktionsaufrufe ineinander verschachtelt werden könne. Die Funktion c()

verkettet mehrere Dinge zu einer großen Einheit.


[8:]

<<*>>=
<<berechne Trimean von {\tt x}>>
Praxis:
Der Datensatz x besitzt ein Trimean von
Trimean
[1] 357.75
Der Leser kann sich nun überlegen, welche Vorteile das Trimean aufweist.

Konzept:
Einzelne Lagemaße vermögen nur etwas über die Lage zu mitzuteilen. Mit Hilfe von mehreren Maßen lassen sich schon weitere Aspekte aufspüren. Neben der Lage wird in der Statistik als zweite Frage die nach der Variabilität gestellt. Mit dieser beschäftigt sich der nächste Abschnitt.

Maße zur Charakterisierung der Variabilität

Praxis:
Wenn im Mittel alle 15 Minuten ein Zugriff auf den Server durchgeführt wird, ist damit noch nicht klar, ob Zwischenzeiten typischerweise im Intervall von [14,16], von [10,20] oder gar von [0,100] anzutreffen sind. Sind die beobachteten Zwischenzeiten alle fast gleich, oder wenn sie eher unterschiedlich sind, wie unterschiedlich sind sie? Diese Fragen haben etwas mit Variabilität zu tun. Der Variabilität der Zwischenzeiten dzeiten.03.02.97 wollen wir nun nachgehen.

Konzept:
Wenn die Lage (z.B. durch das Mittel) bekannt ist, ist damit noch nicht klar, in welchem Bereich die einzelnen Daten streuen. Die Stärke, in der die Beobachtungen streuen, wird durch Maße der Variabilität beschrieben. Im Prinzip ist im letzten Abschnitt schon ein Variabilitäts-Maß aufgeführt worden: die Spannweite, die sich als Differenz zwischen Maximum und Minimum ergibt.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { --- Spannweite
von {\tt{}
x}
...
 ...{displaymath}
\mbox{{\tt{}
max(x) - min(x)}
}\end{displaymath}}
\end{minipage}}


[9:]

<<*>>=
<<berechne Spannweite von {\tt x}>>
Praxis:
Spannweite
[1] 24448
24448 Sekunden sind ungefähr 400 Minuten oder 6 Stunden und 40 Minuten. Die Wartezeiten auf den nächsten Serverzugriff schwanken also erheblich. Wie schon oben festgestellt wurde, kann es sein, daß man nur 1 Sekunde auf den nächsten Zugriff warten muß. Jedoch gab es auch eine Phase von über 6 Stunden Länge, in der keine Tätigkeit stattfand. Könnten solche Schwankungen zufällig entstanden sein oder gibt Erklärungen? Überlegen Sie einmal, inwieweit sich Lebensgewohnheiten auf die Serverbelastung auswirken könnten! (Übrigens können Serverbelastungen auch auf die zu zahlenden Telefongebühren zurückwirken!)

Konzept:
Gegen die Spannweite spricht, daß sie von zwei extremen Werten festgelegt werden kann, die für den Datensatz keine große Repräsentativität zu haben brauchen. Deshalb findet man in der Regel als ersten Vorschlag die Stichprobenvarianz sowie deren Wurzel, die Standardabweichung. Diese Maßzahlen gründen sich auf folgenden Gedanken. Wird von jedem Datum das berechnete Mittel abgezogen, erhält man Werte, aus denen man Streuungseigenschaften ermitteln kann. Durch Summation ihrer Quadrate erhält man einen Indikator, der noch von der Anzahl der Daten stark beeinflußt wird. (Die Summation der Abweichung selbst ergibt immer 0 und ist deshalb ungeeignet.) Sind die Daten durch $x_1, \ldots,x_n$ gegeben, gelangt man zu der bekannten Formel der Stichprobenvarianz: $s^2=\sum_{i=1}^{n} (x_i- \bar x)^2/(n-1)$.
\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
var(x)}
 --- Stichprobe...
 ...{{\tt{}
var(x) == sum((x-mean(x))^2)/(n-1)}
}\end{displaymath}}
\end{minipage}}
Technik:
Die Funktion var() berechnet die Stichprobenvarianz.
Konzept:
Für die Standardabweichung folgt:

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { --- Standardabweichung
von {\...
 ...begin{displaymath}
\mbox{{\tt{}
var(x)^0.5}
}\end{displaymath}}
\end{minipage}}
Technik:
Die Operation x^y bedeutet: xy (Exponentiation) und x^0.5 ist die Wurzel aus x .
Konzept:
Die Standardabweichung besitzt den Vorteil, daß ihre Dimension mit der der Daten übereinstimmt, so daß sie unmittelbar interpretiert werden kann. Vom Informationsgehalt her ist die Stichprobenvarianz gleichwertig. (Übrigens sei darauf hingewiesen, daß in obiger Formel nicht durch die Anzahl der Beobachtungen, sondern nur durch (n-1) dividiert wird. Dieses dürfte beim Lernenden der Statistik Verwunderung erzeugen. Doch besitzt die Festlegung angenehme theoretische Eigenschaften und ist gegenüber der mittleren quadratischen Abweichung -- $d^2=s^2(n-1)/n=\sum_{i=1}^{n} (x_i- \bar x)^2/n $ -- mehr verbreitet.

Praxis:
Was ergibt sich für die Beispieldaten?


[10:]

<<*>>=
<<berechne Stichprobenvarianz von {\tt x}>>
Stichprobenvarianz
[1] 6187227
Diese Zahl erzeugt wirklich Interpretationsprobleme.


[11:]

<<*>>=
<<berechne Standardabweichung von {\tt x}>>
Stichprobenstandardabweichung
[1] 2487.4
Hiermit läßt sich vielleicht vermuten, daß sehr viele Beobachtungen in einem Bereich von [ mean(x)-2500 , mean(x)+2500 ] anzutreffen sind. Überlegen Sie, welche Datenkonstellationen zu einer Stichprobenstandardabweichung von 2500 führen.
Konzept:
Eine Inspektion der Formeln zeigt, daß beide Vorschläge noch stärker auf Ausreißer reagieren als das arithmetische Mittel. Vor dem Einsatz sollte man offensichtliche Ausreißer entfernen. Dennoch ist eine getrimmte Standardabweichung unüblich. Sicher auch deswegen, weil es wieder unempfindlichere Maße gibt. Hier soll nur noch der Quartilsabstand genannt werden, der sich als Differenz des 0.75- und des 0.25-Quantils ergibt.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Der Interquartils-Abstand
von ...
 ...x{{\tt{}
quantile(x,0.75)-quantile(x,0.25)}
}\end{displaymath}}
\end{minipage}}


[12:]

<<*>>=
<<berechne Inter-Quartilsabstand von {\tt x}>>
Praxis:
Inter-Quartilsabstand
[1] 682
Der Größenordnung nach paßt dieses Ergebnis besser zu den Lokalisationsmaßen Median und getrimmtes arithmetisches Mittel.

Als Antwort auf die Belastungsfragen können wir formulieren: Jede zweite Zwischenzeit zwischen zwei Zugriffszeitpunkten liegt in etwa unter 6 Minuten. 50 % der Zeitabstände liegen in einem Intervall mit einer Länge von etwas weniger als 11 Minuten.

Weitere Überlegungen

Technik:
Es ist ein wenig langweilig, die verschiedenen Maßzahlen einzeln zu berechnen. Deshalb lassen sich eine Reihe charakteristischer Werte mit folgendem Modul ermitteln. Betrachten wir das Beispiel:


[13:]

<<*>>=
<<berechne zusammenfassende Statistiken von {\tt x}>>
Praxis:
Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu.  Max. Std.Dev.   n
    1    62.5    312 823.8   744.5 24450   2487.4 103
Wir sehen die Extremwerte, den Mittelwert, den Median und die beiden Quartile. Außerdem werden die Stichprobenstandardabweichung ( Std.Dev. ) und der Stichprobenumfang mit ausgegeben. Damit wird der Datensatz auf acht Zahlen reduziert, aus denen vieles bezüglich Lage und Variabilität abzulesen ist. Mit diesen Zahlen ist der Datensatz recht gut beschrieben. Im besonderen erkennt man, daß die Daten asymmetrisch verteilt sind. Median und Mittel stimmen nicht gut überein und beide liegen nicht in der Mitte zwischen den Extremwerten. (Übrigens werden manchmal zur Datenanalyse sogenannte Letter-Value-Diagramme erstellt. Diese zeigen den Median, die Extremwerte und die Quartile sowie den Stichprobenumfang in tabellarischer Form. Versuchen Sie, in der Literatur Beispiele zu finden! Überlegen Sie den Gebrauchswert dieser Diagramme!)

Konzept:
Verteilungen mit solchen Eigenschaften werden in der Statistik als schief bezeichnet. Natürlich gibt es auch Maßzahlen, um die Schiefe zu beschreiben. Solche werden hier nicht näher betrachtet. Es sei jedoch darauf hingewiesen, daß schiefe Verteilungen für weitergehende Analysen problematischer sein können als symmetrische. Deshalb findet man Transformationsvorschläge, mit denen Datensätze in weniger asymmetrische überführbar sind.

Eine Klasse von Transformationen ist durch die Box-Cox-Transformationen gegeben.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Box-Cox-Transformationen $T(x)...
 ...\  \ln(x) & \lambda = 0
 \end{array} \right.\end{displaymath}}
\end{minipage}}

Je nach Wahl des Parameters $\lambda$ ergibt sich eine andere Transformation.

Praxis:
Damit stellt sich die Frage, welches in einer spezifischen Datensatzsituation der passende Wert für $\lambda$ ist. Sie können nun verschiedene Werte ausprobieren. Häufig wird empfohlen, nacheinander $\cdots, 3, 2, 1, 0.5, 0, -0.5, -1, -2, \cdots$ auszuprobieren.
Technik:
Der gewünschte Wert für $\lambda$ ( lambda ) wird erfragt. Außerdem wird der Bediener gefragt, ob er mit den transformierten Werten die alten x -Werten überschreiben möchte.


[14:]

<<*>>=
<<transformiere {\tt x} mittels Box-Cox-Transformation, zeige Statistiken>>
Praxis:
Mit $\lambda=0$ erhält man schon eher symmetrisch zu nennende transformierte Daten, zum Beispiel das neue Mittel recht gut in der Mitte zwischen den Extremwerten liegt:
Statistiken der transformierten Daten
[1] "Bitte lambda eingeben:"
1: 0
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.   n
    0   4.133  5.743 5.265   6.612 10.1   2.0082 103

Offene Fragen

Praxis:
Nachdem wir nun in der Lage sind, bestimmte Eigenschaften durch Maßzahlen einzufangen, bleiben aber noch viele Fragen übrig.

Aufgaben

Praxis:
Die folgenden Aufgaben sollen mittels der Operationsmöglichkeiten, die mit dem folgenden Menü-Modul bereitgestellt werden, bearbeitet werden.


[15:]

<<*>>=
cat("Revbook:1.m:menu.mz:Menue Masszahlen\n")
<<Auswahl zu den Aufgaben des ersten Kapitels>>
Zur Information wird das Auswahlmenü präsentiert:
Revbook:1.m:menu.mz:Menue Masszahlen
items:
 a Abbruch/Ende
 b lege Daten auf  x  ab
 c zeige  x  an
 d zeige Rangwertreihe von  x  an
 e berechne Mittelwert
 f berechne Median
 g berechne Extrema
 h berechne Midrange
 i berechne getrimmtes Mittel
 j berechne Trimean
 k berechne Stichprobenvarianz
 l berechne Standardabweichung
 m berechne Inter-Quartilsabstand
 n berechne zusammenfassende Statistiken
 o transformiere mittels Box-Cox-Transformation
Selection:

a)
Welche allgemeinen Erwartungen haben Sie bezüglich Lage und Variabilität von Zwischenzeiten entwickelt? Formulieren Sie diese und überprüfen Sie Ihre Einschätzung mit Hilfe der Daten vom 17.02.97! Aktivieren Sie dazu den geeigneten Code!
b)
Hängt Ihrer Meinung nach die Belastung auch von den transportierten Mengen ab? Wenn ja, warum? Was erwarten Sie? Überprüfen Sie Ihre Ansichten mit den Mengen, die für den 3.02.97 festgestellt wurden!

c)
Die letzte Übung sollten Sie mit den Mengen vom 17.02.97 wiederholen. Falls Ihnen die Verteilung unsymmetrisch erscheint, sollten Sie versuchen, durch Transformation dieses zu beheben.

d)
Weitere Experimente können Sie anstellen, wenn Sie die transportierten Mengen durch die Zwischenzeiten dividieren. Hierdurch erhalten Sie einen neuen Ansatz, um die Belastung zu erfassen. Was spricht für diese Idee? Welche Lage und welche Variabilität besitzen die Quotienten?

e)
Auch hier lassen sich die Ergebnisse mittels des zweiten Datensatzes validieren.

Graphische Beschreibungstechniken

Technik:
Das Kapitel beginnt wieder mit einer Anweisung für die Menüsteuerung, mit deren Hilfe der Leser am Rechner sofort zum Start dieses Kapitels springen kann. Es sei daran erinnert, daß der Leser mit: s MENU die Menüsteuerung starten kann.


[16:]

<<*>>=
cat("Revbook:2.a:start.gr:Kapitel Graphische Beschreibungstechniken\n")
Zum Literaturstudium sei hingewiesen auf: [Autorenkollektiv: Abschnitt über Graphische Darstellungen des Inhalts von Häufigkeitstabellen sowie Abschnitt über empirische Verteilungsfunktionen], [Bamberg, Baur: Kapitel über Auswertungsmethoden für eindimensionales Datenmaterial], [Schlittgen: Kapitel über Darstellung eindimensionaler Datensätze].

Konzept:
So schön wie der Versuch ist, einen großen Datensatz mit wenigen Statistiken zu beschreiben, ist er aber auch gleichzeitig sehr unbefriedigend. Man möchte einen Eindruck von den Daten gewinnen und sich nicht mit wenigen zusammenfassenden Werten abspeisen lassen. Am liebsten möchte man die Daten sehen. Deshalb ist nichts naheliegender, als graphische Antworten auf seine Fragen zu bekommen. So könnte dieser Abschnitt überschrieben werden mit: Eine Lanze für graphische Analysewerkzeuge. Maßzahlen besitzen zwar den Vorteil, daß man deren Eigenschaften formal beschreiben und mit ihnen leicht Vergleiche anstellen kann. Demgegenüber besteht allerdings der Nachteil, daß besondere Charakteristika der Daten übersehen werden können. Bei einer exploratorischen Analyse gilt es jedoch beispielsweise, auch Besonderheiten von Datensätzen festzustellen. Dieses geht mit graphischen Methoden viel leichter. Leider waren viele dieser Methoden in der Zeit, in denen es noch keine Rechner mit geeigneter Software gab, nur mühsam anzuwenden. In der heutigen Zeit mit ihren neuen Instrumenten ist dieses Problem (fast) verschwunden, so daß exploratorische Vorgehensweisen großen Rückenwind erhalten. In diesem Kapitel sollen Möglichkeiten graphischer Methoden für eindimensionale Datensätze aufgezeigt werden, aber mit dem Hinweis, daß gedankenloses Ausprobieren nicht unter die Überschrift Statistik fällt.

Zu den oben aufgeführten allgemeinen Fragen

kommen hinzu

Im folgenden werden die zum Teil um den Einsatz konkurrienden Instrumente Boxplot, Jitterplot, Stabdiagramm, Stem-and-Leaf-Diagramm, Histogramm, Dichtespur und der Plot der empirischen Verteilungsfunktion vorgestellt.

Praxis:
Gegenstand bildet wieder der Datensatz dzeitpunkte.17.02.97

zusammen mit den oben gestellten Fragen zur Serverbelastung.

Technik:
Damit die Modulstruktur dieses Kapitels zu der des letzten paßt, legen wir die Zwischenzeiten auf den Variablen x ab.


[17:]

<<*>>=
<<lege Zwischen-Zeitpunkte vom 03.02.97 auf {\tt x} ab>>

Der Boxplot als verbesserte graphische
5-Zahlen-Zusammenfassung

Konzept:
Die fünf Größen Minimum, unteres und oberes Quartil, Median, Maximum werden gern unter Angabe der Werteanzahl als 5-Zahlen-Zusammenfassung bezeichnet. Wie lassen sich diese den Datensatz beschreibende Zahlen für den Analytiker visualisieren?

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Graphische 5-Zahlen-Zusammenfa...
 ...ndungslinien ein,
um die Zusammengeh\uml origkeit anzudeuten.
}
\end{minipage}}

Die Zahlen von eins bis fünf besitzen die Extrema eins und fünf, den Median drei und die Quartile zwei und vier. Als graphische 5-Zahlen-Zusammenfassung ergibt sich mit dem Modul:


[18:]

<<*>>=
<<erstelle graphische 5-Zahlen-Zusammenfassung von 1, 2, 3, 4, 5>>
... folgendes Bild:

\psfig {figure=rvb0.ps,height=6cm,width=6cm}

Praxis:
Wir wollen den entsprechenden Plot zu unserem Datensatz sehen.


[19:]

<<*>>=
<<erstelle graphische 5-Zahlen-Zusammenfassung von {\tt x}>>
\psfig {figure=rvb1.ps,height=6cm,width=6cm}

Die Box, in der 50 % der Daten liegen sollen, ist nicht mehr als Box zu erkennen. Sie befindet sich im unteren Bereich des Bildes, fast zu einem Strich degeneriert. Der größte Teil der Daten muß unter 1000 gesucht werden. Damit hat man eine grobe Vorstellung von der Lage der Daten. Besonders auffällig ist die starke Asymmetrie des Datensatzes, für die das obere Viertel der Werte verantwortlich zu sein scheint. Diese großen Werte beanspruchen soviel von dem gesamten Darstellungsbereich, daß sich selbst das Minimum nicht mehr von der Box abhebt. Für eine präzisere Antwort auf die Lagefrage müßte man eine Ausschnittsvergrößerung betrachten.

Konzept:
Solche Plots sollen einen ersten Gesamteindruck vermitteln. Zu dem ersten Eindruck gehören Hinweise darüber, wie stark die Werte streuen. Hierzu lassen sich die Ausmaße der Box und die Lage der Extremwerte betrachten. Der Beispielplot sollte übrigens nicht als Gegenbeispiel gewertet werden, denn er hat doch wohl einen deutlichen Eindruck hervorgerufen. Wer hat sich nach dem letzten Kapitel eine Vorstellung von dem Datensatz gebildet, die mit dem Eindruck aufgrund des letzten Plots übereinstimmt?

Werden die vertikalen Linien (whiskers), die von der Box ausgehen, höchstens eine standardisierte Spanne lang und weiter entfernt liegende Werte isoliert gezeichnet, erhält man den Boxplot.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Boxplot
\begin{enumerate}
\ite...
 ...zen liegenden Punkte durch horizontale
Striche.\end{enumerate}}
\end{minipage}}
Praxis:
Ein Boxplot kann vielleicht das Viertel der größeren Werte etwas aufsplitten. Wir wollen den Boxplot erstellen.


[20:]

<<*>>=
<<erstelle Boxplot zu {\tt x}>>

\psfig {figure=rvb3.ps,height=8cm,width=8cm}

Wesentlich wirkt sich auf das Erscheinungsbild wieder der größte Beobachtungswert aus. Dieser liegt weit von den übrigen Werten entfernt. Man erahnt den Einfluß der großen Zwischenzeiten auf Mittel (Schwerpunkt) und Stichprobenvarianz. Möglicherweise sind mehrere Werte von der Größe 24449 vorhanden. Wir wollen uns die 10 größten und die 10 kleinsten Werte (das sind die ersten und die letzten 10 Werte der Rangwertreihe) ausdrucken.


[21:]

<<*>>=
<<zeige die 10 kleinsten und die 10 gr\"o{\ss}ten Werte von {\tt x} an>>
10 kleinsten Werte von x:
 [1]  1  1  1  2  2  6  6  8  8 10
10 groessten Werte von x:
 [1] 24449  4862  3670  2772  2409  2330  2236  1965  1913  1754
Offensichtlich gibt es nur einen Wert der Größe 24449. Der zweitgrößte ist von dem Maximum schon erheblich entfernt. Weiter sieht man, daß die Abstände zwischen den anderen großen Werten noch um ein Vielfaches größer sind als die Abstände zwischen den kleinsten Werten.

Die enorme Asymmetrie unseres Datensatzes kann vielleicht durch eine Transformation gemildert werden. Versuchen wir das Logarithmieren. Wir wollen deshalb einen Boxplot der logarithmierten Daten erstellen.


[22:]

<<*>>=
<<erstelle Boxplot zu {\tt log(x)}>>

\psfig {figure=rvb2.ps,height=8cm,width=8cm}

In der Tat ist das Erscheinungsbild jetzt deutlich symmetrischer. Das logarithmierte Minimum wird isoliert als möglicher Ausreißer dargestellt. Der horizontale Strich markiert übrigens gleich drei Beobachtungen (vgl. oben die kleinsten 10 Werte).

Wir wollen das Maximum als Ausreißer einstufen und für die weiteren Betrachtungen aus dem Datensatz x entfernen.

Konzept:
Eine Beobachtung wird nicht durch eine technische Definition zu einem Ausreißer, sondern durch eine vorsetzliche Einstufung. Insofern liefert ein Boxplot höchstens Indizien auf eventuell als Ausreißer einzustufende Werte. Große Werte können auf Verarbeitungsfehler zurückgehen und damit falsche Werte sein, sie können aber auch sehr wohl korrekt und von großer Bedeutung sein. Werden Wasserstände untersucht, darf man das Hochwasser, das hinter einem sehr großen Wert steht, nicht einfach ignorieren.

Technik:
Das folgende Modul zur Festlegung eines Datenausschnitts erfragt Grenzen, jenseits derer Beobachtungen ausgesondert werden sollen. Durch geeignete Eingaben wird nur das Maximum 24449 entfernt.


[23:]

<<*>>=
<<bilde Ausschnitt der Daten {\tt x}>>
Wir wollen den Boxplot für die verbleibenden Daten erstellen.


[24:]

<<*>>=
<<erstelle Boxplot zu {\tt x}>>
Wir erhalten:

\psfig {figure=rvb4.ps,height=8cm,width=8cm}

Dieser Boxplot erscheint für die Belastungsfragen eher geeignet zu sein. Wir sehen, daß 75 % der Daten unterhalb von ca. 800 liegen, mehr als 50 % liegen unter 500. Zum Maximum hin dünnen die Werte immer mehr aus. Das Minimum liegt nicht weit vom Zentrum der Daten entfernt.

Konzept:
Ein Boxplot zeigt Lage und Variabilität eines Datensatzes, wir erkennen die Schiefe der Verteilung und das Verhalten an den Enden (Schwänzen) der Verteilung. Mögliche Ausreißer (gemäß einer technischen Festlegung) werden besonders hervorgehoben. Damit ist ein Boxplot einfach, informativ und ermöglicht übrigens auch schnell Vergleiche zwischen Datensätzen.

Praxis:
Wer noch ein wenig Erfahrungen mit dem Instrument Boxplot sammeln möchte, für den steht ein Boxplot-Erfahrungs-Sammel-Modul zur Verfügung. Hier gilt: Probieren geht über Studieren.


[25:]

<<*>>=
<<starte Erfahrungssammelfunktion zum Boxplot>>
Praxis:
Zu dem Werkzeug Boxplot soll noch bemerkt werden, daß die Grenzen der Box unterschiedlich definiert werden, manchmal auch mittels sogenannter hinges (Fourths, Angeln). Deren Definition weicht ein wenig von unserer Festlegung der Quartile ab. Hier wollen wir nicht näher auf die geringen Unterschiede eingehen, die sich im wesentlichen bei sehr kleinen Datensätzen zeigen. Für weitere Fragen sei verwiesen auf [Hoaglin et al.]. Boxplots, die mit anderen Programmen erstellt werden, können deshalb etwas voneinander abweichen. Auch läßt sich oft das genaue Erscheinungsbild der Boxplots über weitere Parameter beeinflussen, so daß die Diskussion hier noch fortgeführt werden könnte. Wir wollen uns jedoch lieber anderen graphischen Instrumenten zuwenden.

Der Jitterplot zur vollständigen Darstellung

Konzept:
Der Zweck von graphischen Werkzeugen liegt natürlich nicht nur darin, Verdichtungsergebnisse (zusammenfassende Statistiken) zu visualisieren, sondern es besteht auch die Chance, alle Daten sprechen zu lassen, zum Beispiel mit einem Jitterplot. Ziel eines Jitterplots ist es, alle Beobachtungen mit Hinweisen auf unterschiedliche Datendichte darzustellen.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
jitterplot(x)}
 --- Jit...
 ...erplot werden Zufalls\-zahlen gegen Beobachtungen abgetragen.
}
\end{minipage}}

Zufallszahlen haben Eigenschaften wie Zahlen, die zufällig ausgewählt werden. Die Zufallszahlen übermitteln keine weiteren Informationen, ihre Bedeutung liegt nur in der Generierung des Erscheinungsbildes, wie es in der nächsten Abbildung zu sehen ist.


[26:]

<<*>>=
<<erstelle Jitterplot zu {\tt x}>>
Praxis:
\psfig {figure=rvj1.ps,height=8cm,width=8cm}

In diesem Plot sind alle noch auf x befindlichen Beobachtungen abgedruckt.

Durch die zufälligen y-Werte wirkt das Ergebnis wie ein Mückenschwarm oder die Bestandteile eines Gases, wobei die Dichte am linken Bildrand am größten zu sein scheint. Die bisherigen Ergebnisse bezüglich der Lage werden unterstützt.

Konzept:
Die den Daten innewohnende Variabilität wird offensichtlich. Auch dürfte noch einmal deutlich werden, daß eine einzige Zahl nicht als Antwort auf die gestellten Belastungsfragen ausreicht.

Stab- und Balkendiagramm als graphisches Zählergebnis

Konzept:
Neben den Darstellungen, in denen Beobachtungen als einzelne Punkte auftauchen, gibt es Vorschläge, die Daten für bestimmte Fragen aufzubereiten. Ein einfaches Werkzeug ist das Stabdiagramm, an dem abgelesen werden kann, wie häufig eine bestimmte Merkmalsausprägung beobachtet worden ist.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Stabdiagramm\ [1ex]
Im Stabdi...
 ...t\uml abe \uml uber den jeweiligen Beobachtungen
dargestellt.
}
\end{minipage}}
Technik:
Damit aufgrund des Bildes schnell absolute Häufigkeiten ermittelt werden können, sind auf der vertikalen Achse ganze Zahlen notiert. Werden diese gemäß der Achsenbeschriftung mit 1/101 multipliziert, erhält man die relativen Häufigkeiten.


[27:]

<<*>>=
<<erstelle Stabdiagramm zu {\tt x}>>
Praxis:

\psfig {figure=rvst1.ps,height=8cm,width=8cm}

Im wesentlichen werden die Eindrücke aus dem Jitterplot bestätigt. Bezüglich Fragen der Dichtheit stellt das Stabdiagramm gegenüber dem Jitterplot keine Verbesserung dar. Wir sehen, daß die meisten Werte nur einzeln vorkommen, einige Ausprägungen wurden doppelt getroffen und eine trat dreifach auf. Zum Überprüfung läßt sich schnell die Häufigkeitstabelle berechnen.


[28:]

<<*>>=
<<erstelle H\"aufigkeitstabelle zu {\tt x}>>
 1 2 6 8 10 11 12 14 15 19 21 29 40 44 46 49 58 67 73 83 106 107 116 117 119
 3 2 2 2  1  1  1  2  1  1  1  1  2  2  2  1  1  2  1  1   1   1   1   1   1

 120 131 133 139 153 158 164 165 166 174 197 207 240 260 285 290 312 320 337
   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

 344 350 351 362 403 433 455 490 503 516 524 540 547 554 573 588 600 615 639
   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1

 672 697 712 718 771 778 788 870 1021 1145 1183 1281 1374 1378 1381 1515 1667
   1   1   1   1   1   1   1   1    2    1    1    1    1    1    1    1    1

 1702 1754 1913 1965 2236 2330 2409 2772 3670 4862
    1    1    1    1    1    1    1    1    1    1
Ein Stabdiagramm ist für den Problembereich der Zeitdifferenzen offensichtlich nicht besonders hilfreich. Eher interessiert die Frage, wie häufig sich Ausprägungen in bestimmten Abschnitten oder Intervallen eingestellt haben.

Praxis:
Zur Ermittlung, wie viele Vorkommnisse in den Klassen 0..100, 100..200, 200..300, ..., 1000..5000 liegen, kann ein aggregiertes Diagramm, nennen wir es Balkendiagramm, hilfreich sein. (Ein solcher Plot ist allgemein unüblich und dient hier nur zu didaktischen Zwecken.)


[29:]

<<*>>=
<<erstelle spezielles Balkendiagramm zu {\tt x}>>
\psfig {figure=rvba1.ps,height=8cm,width=8cm}

Konzept:
Neben der Bestätigung bisheriger Erkenntnisse lassen sich die Anzahlen in den einzelnen Klassen leicht ablesen. Man muß jedoch beachten, daß die Klassen unterschiedliche Breiten aufweisen. Dadurch könnte es zu Fehlinterpretationen kommen. Der Stem-and-Leaf-Plot und das Histogramm als Modifikation dieser Balkengraphik sind von solchen Problemen befreit.

An dieser Stelle soll noch einmal die Problematik des Stabdiagramms reflektiert werden. Denn die mangelnde Eignung des Diagramms liegt nicht in den speziellen Werten des Datensatzes begründet, sondern darin, daß das Merkmal Zeitdifferenzen als ein kontinuierliches Merkmal einzustufen ist. Alle Punkte aus einem Zeitintervall sind nämlich als Realisation denkbar. Bei solchen Gegebenheiten geht man in der Regel zur Betrachtung, Darstellung (siehe zum Beispiel Histogramm) und Interpretation von Intervallen über. Lassen sich nur Ausprägungen vorstellen, die nicht zu Intervallen zusammengefaßt werden können, spricht man naheliegenderweise von diskreten Merkmalen. Bei diesen kann ein Stabdiagramm sehr sinnvoll sein. Dazu denke man nur an die Realisationen von 100 Würfelwürfen, bei denen die relative Häufigkeit der möglichen Ausprägungen $\{1, 2, 3, 4, 5, 6\}$ sehr wohl interessiert. Es könnte jetzt eingewendet werden, daß die Zeiten und Zeitdifferenzen nur in ganzen Sekunden erhoben worden sind und damit ein diskretes Merkmal zugrundeliegt. Dem ist zu entgegnen, daß zum ersten auch Zwischenwerte interpretierbar sind und zum zweiten diskrete Merkmale mit sehr vielen Ausprägungen oft wie kontinuierliche Merkmale behandelt werden.

Der Stem-and-Leaf-Plot als numerisches Balkendiagramm

Konzept:
Der Stem-and-Leaf-Plot versucht, Bereiche unterschiedlicher Datendichte aufzudecken. Damit lassen sich Häufigkeiten (der Belastung) eher erkennen als mit einem Boxplot, einem Jitterplot oder einem Stabdiagramm.

Dieser aus Textzeichen aufgebaute Plot zeigt Beobachtungsanzahl, Median, Quartile und ein numerisches Balkendiagramm, eventuell gefolgt von einigen speziellen Werten.

Praxis:
Betrachten wir ein Beispiel:


[30:]

<<*>>=
<<erstelle Stem-and-Leaf-Plot zu {\tt x}>>
Es sei daran erinnert, daß von x der extrem große Wert 24449 entfernt worden war.
N = 102   Median = 301
Quartiles = 58, 718

Decimal point is 2 places to the right of the colon

    0 : 000001111111111223444455567778
    1 : 112222334566677
    2 : 014689
    3 : 1244556
    4 : 0359
    5 : 02245579
    6 : 0147
    7 : 012789
    8 : 7
    9 :
   10 : 228
   11 : 48
   12 : 8
   13 : 788
   14 :
   15 : 1
   16 : 7
   17 : 05
   18 :
   19 : 16

High:   2236   2330   2409   2772   3670   4862
Konzept:

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Stem-and-Leaf-Diagramm\ [1ex]...
 ...ml urden; sie sind eventu{}ell
als Ausrei{\ss}er einzustufen.
}
\end{minipage}}
Praxis:
Mit diesem Plot erhalten wir zum ersten Mal eine Abschätzung der Datendichte in den verschiedenen Bereichen. Es sieht so aus, daß die Klassenhäufigkeiten mit der Intervallänge kontinuierlich abnehmen. Sehr kleine Zwischenzeiten sind am häufigsten.

Letzteres ist deshalb bemerkenswert, weil bei kleinen Zwischenzeiten zwischen Zugriffen die Belastung am größten ist. Den WEB-Master dürfte diese Erkenntnis nicht zu sehr erfreuen oder doch?

Konzept:
Schwierig ist beim Stem-and-Leaf-Plot die Festlegung der Klassenanzahl und damit der Klassenbreiten. Als Vorteile des Diagramms ergeben sich: Es kann relativ schnell per Hand erstellt werden, wenn der Datenumfang nicht zu groß ist. Es erfordert keine hochauflösende Graphik. Es ist aussagekräfig bezüglich Lage, Variabilität, Schiefe und möglicher Ausreißer. Es eignet sich auch zum Ordnen der Werte.

In gewisser Weise ist das Histogramm, obwohl älter, eine optische, aber nicht unbedingt qualitative Weiterentwicklung des Stem-and-Leaf-Diagramms. Es versucht, die im Jitterplot gesehene Dichtheit der Daten mit Hilfe relativer Häufigkeiten darzustellen.

Das Histogramm zur Abschätzung der Dichte

Konzept:
Das Histogramm ist eine Darstellung der relativen Häufigkeiten von klassierten Daten.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Histogramm\ [1ex]
Zun\uml ach...
 ... Fl\uml acheninhalt der relativen H\uml aufigkeit entspricht.
}
\end{minipage}}

Damit wird die Dichtevorstellung, die der Jitterplot implizit geliefert hat, explizit darstellt.

Praxis:
Aus dem Datensatz x wird folgendes Bild erstellt.


[31:]

<<*>>=
<<erstelle Histogramm zu {\tt x}>>
\psfig {figure=rvhi1.ps,height=8cm,width=8cm}

Wir können an diesem Diagramm ablesen, daß in 0.0012*500 = 60 % aller Fälle die Zeitdifferenzen kleiner als 500 waren (Höhe des ersten Rechtecks: 0.0012, Rechteckbreite: 500). Die Klassengrenzen wurden automatisch gewählt. Sie können aber auch vorgegeben werden.


[32:]

<<*>>=
<<erstelle Histogramm zu {\tt x} mit Grenzen 0, 200, 400, ..., 5000>>
Dieses Modul liefert folgendes Bild:

\psfig {figure=rvhi2.ps,height=8cm,width=8cm}

Wir wollen noch ein Modul bereitstellen, mit dem Klassengrenzen per Hand eingegeben werden können.


[33:]

<<*>>=
<<erstelle Histogramm von {\tt x} mit manueller Wahl der Grenzen>>
Das folgende Histogramm erhält man für die Eingabe der Grenzen: 0, 100, 200, 300, 500, 700, 1000, 1500, 3000, 5000.

\psfig {figure=rvhi3.ps,height=8cm,width=8cm}

Konzept:
Die Wahl der Klassengrenzen ist auch für die Zweckmäßigkeit des Histogramms entscheidend. Werden die Klassen noch enger gewählt, wird das Erscheinungsbild noch zittriger und dem Stabdiagramm ähnlicher werden. Gibt es zu wenige Klassen, wird zuviel Information weggeglättet. Die beste Lösung dürfte, wie häufig, in der Mitte liegen.

Es sei darauf hingewiesen, daß bei kontinuierlichen Merkmalen das Histogramm die Zwecke erfüllt, für die im diskreten Fall das Stabdiagramm herangezogen wird.

Unzufriedenheit mit dem Histogramm führt zu Dichtespuren:

Dichtespuren als Alternativen zu Histogrammen

Konzept:
Histogramme lassen sich über Häufigkeitstabellen schnell erstellen. Das ist ein Vorteil. Sie besitzen eckige Silhouetten. Das ist für den Betrachter ein Nachteil. Denn man hat das Gefühl (siehe Jitterplot), daß die rechteckige Struktur nicht zu rechtfertigen ist. Dichtespuren stellen hier eine Antwort dar. Der kleine Nachteil des erhöhten Rechenaufwandes wird durch die heutigen Rechner relativiert. Beim Histogramm werden Klassen festgesetzt, in denen dann die zugehörigen Beobachtungen gezählt werden. Zur Berechnung der Dichtespur geht man ähnlich vor, nur daß zu jeder Stelle der x-Achse eine eigene Klasse oder besser Umgebung festgelegt wird und die darin gefundenen Beobachtungen gewichtet verarbeitet werden.
Man sollte sich nicht durch die folgende Formel abschrecken lassen. Die wesentlichen Aspekte sind folgende: Es werden zu einer Stelle y die Abstände zu den Beobachtungen ermittelt und verarbeitet. Die Funktion $K(\cdot)$ -- auch Kernel genannt -- gewichtet nah zu y liegende Beobachtungen stark und weit entfernte schwach. Die Gewichtungsergebnisse werden zusammengezählt und durch n dividiert, wie wir dies von der Durchschnittsbildung her kennen. Weitere Details sollen uns hier nicht näher interessieren.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
density(x,w)}
 --- Dich...
 ...{\tt{}
 == (8/(w*pi))^0.5*exp(-(4*t)^2/w^2)}
\end{displaymath}}
\end{minipage}}
Technik:
Das folgende Modul erstellt eine Dichtespur. Die Fensterbreite wird dabei erfragt.


[34:]

<<*>>=
<<erstelle Dichtespur zu {\tt x}>>
Praxis:
Mit einer Fensterbreite, die ein Zehntel der Spannweite umfaßt, erhält man folgende Dichtespur:

\psfig {figure=rvden1.ps,height=8cm,width=8cm}

Man erkennt sehr schön, wie $\hat f$ sein Maximum nahe bei 0 hat und dann allmählich nach rechts abfällt.

Konzept:
Eine Verkleinerung der Fensterbreite führt zu einem zitterigen Bild, eine vergrößerte Breite verstärkt die Glättung. Um ein angemessenes w zu finden, muß man in der Regel Versuche mit verschiedenen Fensterbreiten anstellen.

Praxis:
Deshalb erhalten Sie nun die Möglichkeit, die Fensterbreite beliebig zu variieren.
Technik:
Dabei müssen die Fensterbreiten als Anteil der Spannweite fixiert werden. Zusätzlich gestattet das Instrument die Wirkung verschiedener Box-Cox-Transformationen zu studieren.


[35:]

<<*>>=
<<aktiviere interaktives Dichtespur-Sektion zu {\tt x}>>
Technik:
Das Modul erzeugt eine dreigeteilte Graphik. Im oberen Drittel sieht man einen Jitterplot zusammen mit einem Boxplot der transformierten Daten. In der Mitte folgt die Dichtespur. Sie hängt von der gewählten Transformation und der gewählten Fensterbreite ab. Am Anfang sieht das Bild so aus (Zu sehen ist hier das Erscheinungsbild. Am Bildschirm sind die Details deutlicher zu erkennen als im Druck. Besonders dann, wenn man das graphische Fenster vergrößert ( -> Vollbild).):

\psfig {figure=rvden2.ps,height=8cm,width=8cm}

Zum Verlassen dieses kleinen Programms muß man mit der Maus EXIT anklicken (Mauszeiger auf EXIT bewegen und linke Maustaste drücken). Eine andere Fensterbreite kann durch einen Mausklick direkt über der Linie, unter der rel.width steht, gewählt werden. Ganz links ist die Fensterbreite 0 zugeordnet, ganz rechts 100 % der Spanneweite. Mit dem zweiten Schieberegler (unterste horizontale Linie) läßt sich ein $\lambda$ für die Box-Cox-Transformation wählen, mit der der ursprüngliche Datensatz x

transformiert werden sollen.

Konzept:
Ziel des interaktiven Moduls ist es, ein Gespür für die Auswirkung der Fensterbreite und des Transformationsparameters zu bekommen. Im Rahmen einer Datenanalyse sind übrigens Parameter erstrebenswert, für die eine Interpretation gefunden werden kann. Dieses bedeutet, daß dort zu krumme $\lambda$-Werte auf jeden Fall unbrauchbar sind. Daneben gibt es auch Einsatzfelder für Box-Cox-Transformationen, bei denen es nicht unbedingt auf eine Interpretation von $\lambda$ ankommt. Dann versucht man manchmal, den Wert zu finden, der zu den besten transformierten Daten gemäß eines vorgegebenen Kriteriums führt.

Praxis:
Nach einigen Modifikation kann sich als Resultat ($\lambda=0.431$, w=0.111)

\psfig {figure=rvden3.ps,height=8cm,width=8cm}

oder ($\lambda=0.287$, w=0.141)

\psfig {figure=rvden4.ps,height=8cm,width=8cm}

ergeben.

Konzept:
Das Histogramm gibt Antworten darüber, wie groß die relativen Häufigkeiten pro Einheit der x-Achse sind. Es beantwortet nicht Fragen, die sich auf beliebige Intervalle beziehen. Solche Fragen lassen sich mit Hilfe der empirischen Verteilungsfunktion beantworten.

Die empirische Verteilungsfunktion

Konzept:
Das Histogramm stellt einen Versuch dar, die unterschiedlichen Klassenhäufigkeiten explizit darzustellen. Damit bekommt man einen Eindruck, in welchen Bereichen mehr Beobachtungen anzutreffen sind und in welchen Bereichen weniger. Es lassen sich aber nicht direkt Fragen der folgenden Art beantworten. Die Fragen beziehen sich offensichtlich auf Flächen, die sich über Teile des Histogramms finden ließen. Direkt lassen sich Antworten mit dem Histogramm aber nicht geben. Günstiger ist es, die empirische Verteilungsfunktion zu heranzuziehen. Sie zeigt zu jedem Wert x die relative Anzahl $\hat F(x)$ der Beobachtungen an, die nicht größer als x sind.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Empirische Verteilungsfunktion...
 ... $x$}
 }{
 \mbox{Anzahl der Beobachtungen}
 }\end{displaymath}}
\end{minipage}}

Verteilungsfunktionen sind für den Statistiker besonders statistische Instrumente. An dieser Stelle wollen wir aber keine tiefere Diskussion anstellen.

Praxis:


[36:]

<<*>>=
<<erstelle F.dach von {\tt x}>>
Wir bekommen folgendes Bild aufgrund der Daten x .

\psfig {figure=rvF1.ps,height=8cm,width=8cm}

Konzept:
Geht man von klassierten Daten oder von der Information aus, die in einem Histogramm enthalten ist, so werden die ursprünglichen Beobachtungen innerhalb jeder Klasse als gleichverteilt angenommen. Dieses führt zu abschnittsweise linearen Verläufen.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {Empirische Verteilungsfunktion...
 ...tive H\uml aufigkeit von Beobachtungen in der $j$-ten Klasse.
}
\end{minipage}}


[37:]

<<*>>=
<<erstelle F.dach f\"ur klassierte Daten  zu {\tt x}>>
Praxis:
Die Klassengrenzen 0, 40, 80, ..., 5000 führen zu folgendem Bild:

\psfig {figure=rvF2.ps,height=8cm,width=8cm}

Mit Hilfe dieser Graphiken lassen sich die Fragen nach Anteilen und Häufigkeiten von Bereichen beantworten. Man sieht, bei zirka 300 wird der Datensatz halbiert ($\hat F(300)\approx 0.5$). 20 % aller Zwischenzeiten liegen unterhalb von 50 Sekunden (sehen ist hier etwas übertrieben). Hiervon ausgehend dürfte ein Experte für den Serverbetrieb bei wachsender Belastung Engpässe erwarten.

Wir wollen die Möglichkeit der selbständigen Wahl der Grenzen anbieten:


[38:]

<<*>>=
<<erstelle emp. Verteilungsfunktion mit manueller Wahl der Grenzen zu {\tt x}>>
Das folgende Bild erhält man für die Eingabe der Grenzen: 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 500, 1000, 2000, 3000, 5000

\psfig {figure=rvF3.ps,height=8cm,width=8cm}

Für genauere Abschätzungen soll der Zugriff auf die Verteilungsfunktion auch graphisch unterstützt werden. Dazu kann man mit der Maus zwei Punkte im Verteilungsfunktionsplot anklicken. Probieren geht hier über Studieren!


[39:]

<<*>>=
<<befrage F.dach zu {\tt x} graphisch>>
Ein mögliches Bild könnte folgendes sein:

\psfig {figure=rvF4.ps,height=8cm,width=8cm}

Dies führt zu dem numerischen Ergebnis:

[1] "bitte zweimal Punkt im F.dach-Plot anklicken!"
  x1 F.dach(x1) 1-F.dach(x1)       x2 F.dach(x2) 1-F.dach(x2)
 158  0.4019608    0.5980392 1011.577  0.7941176    0.2058824
 F.dach(x2)-F.dach(x1)
             0.3921569
Für Zugriffsfragen mit Hilfe der Verteilungsfunktion sei hier an den Satz 16 aus dem Kapitel 2 des Skriptes [Autorenkollektiv] erinnert.

Offene Fragen

Konzept:
Die graphischen Werkzeuge erlauben es, zusammenfassende Statistiken wie auch die Einzeldaten zu visualisieren, ausreißerverdächtige Beobachtungen zu erkennen und Häufigkeiten einzelner Ausprägungen sowie Häufigkeiten der Realisationen in bestimmten Intervallen festzustellen.
Praxis:
Für die Serverproblematik wurde herausgefunden, daß kleine Zwischenzeiten zwischen aufeinanderfolgenden Zugriffen sehr häufig sind und damit für die Belastungseinschätzung eine erhebliche Bedeutung haben. Weitere Belastungsaspekte werden im folgenden Aufgabenabschnitt angesprochen. Jedoch lassen sich folgende Fragen noch nicht beantworten: Die Fragen zeigen, daß es für die nächsten Kapitel noch einiges zu tun gibt.

Aufgaben

Praxis:
Die Aufgaben sollen mit den Operationen des folgenden Angebotes bearbeitet werden.


[40:]

<<*>>=
cat("Revbook:2.m:menu.gr:Menue Graphische Beschreibungstechniken\n")
<<Auswahl zu den Aufgaben des Kapitels \"uber Graphiken>>
Zur Information wird das Auswahlmenü gezeigt:
items:
 a Abbruch/Ende
 b lege Daten auf x ab
 c bilde Ausschnitt der Daten
 d erstelle graphische 5-Zahlen-Zusammenfassung
 e erstelle Boxplot
 f erstelle Jitterplot
 g erstelle Stabdiagramm
 h erstelle Haeufigkeitstabelle
 i erstelle Stem-and-Leaf-Plot
 j erstelle Histogramm
 k erstelle Histogramm mit manuellen Grenzen
 l erstelle Dichtespur
 m aktiviere interaktives Dichtespur-Sektion
 n erstelle F.dach
 o erstelle F.dach mit manuellen Grenzen
 p befrage F.dach graphisch
 q transformiere mittels Box-Cox-Transformation
Selection:
a)
Erstellen Sie zu den Mengen der am 17.02.97 übertragenen Daten verschiedene Graphiken. Beschreiben Sie den Datensatz verbal aufgrund Ihrer Beobachtungen.
b)
Erstellen Sie zu den logarithmierten Mengen der am 17.02.97 übertragenen Daten verschiedene Graphiken. Hat die Transformation Ihrer Meinung nach einen symmetrischen Datensatz hervorgebracht?

c)
Transformieren Sie den Datensatz so, daß ein möglichst symmetrisches Ergebnis entsteht.

d)
Stellen Sie Vermutungen über die Mengen vom 3.02.97 an. Schreiben Sie diese nieder. Überprüfen Sie diese dann mit Hilfe der graphischen Werkzeuge.

e)
Was vermuten Sie, wie die Verteilung der Zugriffs-Zeitpunkte vom 17.2.97 aussehen wird. Begründen Sie Ihre Vermutung. Erstellen Sie dann von diesen einen Jitterplot, ein Stabdiagramm und ein Histogramm.

f)
Zeigen die Zeitpunkte vom 3.02.97 andere Eigenschaften? Wann ist die Belastung am größten: nachts, morgens, mittags, nachmittags oder abends? Suchen Sie Gründe für die Gestalt der Verteilung der Zugriffszeitpunkte.

g)
Besitzen die Zeitdifferenzen vom 3.02.97 unerwartete Eigenschaften?

h)
Menge pro Zeitdifferenz könnte auch ein Belastungsmaß sein. Experimentieren Sie mit diesem!

Multivariate Beschreibungstechniken


[41:]

<<*>>=
cat("Revbook:3.a:start.mu:Kapitel Multivariate Beschreibungstechniken\n")
Zum Literaturstudium sei hingewiesen auf: [Bamberg, Baur: Kapitel über Auswertungsmethoden für mehrdimensionales Datenmaterial], [Chambers et al., Kapitel: Comparing Data Distributions, Studying Two-Dimensional Data, Plotting Mulitvariate Data], [Schlittgen: Kapitel über Darstellung multivariater Datensätze].

Konzept:
In den ersten Kapiteln sind nur eindimensionale Datensätze Gegenstand der Betrachtung gewesen. Interessante Probleme führen jedoch meistens zu mehrdimensionalen Fragestellungen, so daß die multivariate Statistik eine äußerst große Bedeutung besitzt. Als Voraussetzung für angemessene multivariate Analysen müssen die wesentlichen Konzepte der eindimensionalen Statistik verstanden worden sein. Deshalb beschäftigen sich die ersten Diskussionen in einer statistischen Grundausbildung hauptsächlich mit eindimensionalen Problemen. Bevor wir die einfachen Beschreibungstechniken verlassen, wollen wir jedoch einen kurzen Einblick in Multivariate Beschreibungstechniken geben.
Praxis:
Auch in unserem Problemfeld erkennt man multivariate Fragestellungen:
1.
Sind Belastungen verschiedener Tage als sehr ähnlich anzusehen oder unterscheiden sie sich deutlich?
2.
Ist die Belastung innerhalb eines Tages gleichmäßig verteilt oder verändert sie sich im Zeitablauf?
3.
Besteht ein Zusammenhang zwischen den Zwischenzeiten und den übertragenen Mengen?
Konzept:
Die Situation zur Frage 1 führt zu dem Vergleich (zweier) inhaltlich vergleichbarer aber als unabhängig anzunehmender Datensätze. Diese Frage gehört in die Klasse: Das Zweistichprobenproblem für unabhängige Stichproben. Die einzelnen Beobachtungen der beiden Datensätze stehen in keiner Beziehung zueinander.

Demgegenüber sind in der Situation der Frage 3 die Daten der Merkmale Zwischenzeiten und übertragene Mengen über Zugriffsereignisse miteinander verbunden. Man kann sich vorstellen, daß die Beobachtungen zur Frage 3 in Form von Paaren (Wartezeit, nach der Wartezeit übertragene Menge) vorliegen. Der Statistiker vergleicht in der Situation der ersten Frage Statistiken der einzelnen Datensätze und die Gestalten der empirischen Verteilungen anhand von geeigneten Graphiken. In der verbundenen Situation wird zunächst die Vermutung der Unabhängigkeit untersucht. Eine Ablehnung der Vermutung führt dann zur Beschreibung der Abhängigkeiten. (Für Interessierte sei an dieser Stelle auf die Kapitel über Regressionsanalyse in der Einführungsliteratur hingewiesen.)

Die Klassifikation der zweiten Frage hängt von ihrer Umsetzung ab. Eine Möglichkeit besteht darin, die Zwischenzeiten eines Tages bezüglich der Anzahl von Ereignissen in gleich große Teile zu zerlegen und die Teilstichproben zu vergleichen. Die laufende Nummer kann dann als Bindungsmerkmal interpretiert werden. Dann lassen sich die jeweils i-ten Beobachtungen der einzelnen Teile gegenüberstellen. Werden die Belastungsdaten jedoch in gleich große Zeitklassen -- wie: nachts, morgens, nachmittags und abends -- eingeteilt, so ergeben sich neue, kleinere Datensätze, deren Beobachtungen als unverbunden angesehen werden müssen. Als drittes bietet es sich an, die Zugriffszeitpunkte einer Inspektion zu unterziehen; dieser Weg wird zu eindimensionalen Techniken zurückführen.

Anhand der Fragen wird der Leser in diesem Kapitel mit Techniken vertraut gemacht, die zur Beantwortung der gestellten Fragen hilfreich sind. Zu diesen gehören: vergleichende Boxplots, Vergleichsplot der empirischen Verteilungsfunktionen, Scatterplots mit konvexen Hüllen, Draftsman's Displays. Zusätzlich wird die Idee von Bootstrap-Verfahren vorgestellt.

Technik:
Datensätze, die in diesem Kapitel als Input dienen, werden auf der Variablen xy abgelegt. An dem Variablennamen soll auch optisch sichtbar werden, daß die nicht eindimensional sind. Für S-PLUS-Kenner sei darauf hingewiesen, daß xy ein Listenobjekt ist.

Vergleichende Boxplots

Praxis:
Betrachten wir die erste Frage: Sind Belastungen verschiedener Tage als sehr ähnlich anzusehen oder unterscheiden sie sich deutlich? Das Merkmal Belastungen muß zunächst mit Inhalt gefüllt werden. Wir wollen für die Belastungen wieder die Zwischenzeiten heranziehen. Da uns die Zwischenzeiten vom 03.02.97 und vom 17.02.97 vorliegen, werden wir mit diesen unser Glück versuchen.

Technik:
Die Datensätze, die zu den beiden Tagen gehören, kombinieren wir zu dem Objekt xy .


[42:]

<<*>>=
<<lege Zwischenzeiten vom 03.02.97 und vom 17.02.97 auf {\tt xy} ab>>
Konzept:
Wenn die Vergleichs-Frage zwischen den Tagen nur auf die Lage der Datensätze abzielt, können wir für beide Datensätze die Mediane oder Mittelwerte berechnen und vergleichen. Interessiert daneben auch die Gestalt der Verteilung, empfehlen sich graphische Darstellungen.
Praxis:
Da keine weiteren Hinweise zu den beiden Referenztagen vorliegen, vermuten wir sicher eine ähnliche Lage, eine ähnliche Variabilität und eine ähnliche Gestalt. Berechnen wir zunächst die zusammenfassenden Statistiken.


[43:]

<<*>>=
<<berechne zusammenfassende Statistiken zu {\tt xy}>>
$dz.03.02.97:
 Min. 1st Qu. Median  Mean 3rd Qu.  Max. Std.Dev.   n
    1    62.5    312 823.8   744.5 24450   2487.4 103

$dz.17.02.97:
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.  n
    1      85    428 970.9    1356 8513   1415.5 87
Die Quartile und das Mittel vom 17.02.97 sind größer als die entsprechenden Größen vom 03.02.97. Dagegen gehört das Gesamtmaximum zu den Daten vom 03.02.97. Damit deuten sich Unterschiede zwischen den Tagen an.

Konzept:
Vergleichende Boxplots entstehen dadurch, daß mehrere Boxplots mit einer gemeinsamen Achse nebeneinander gezeichnet werden. Die einzelnen Boxplots zeigen sowohl einige Statistiken (Welche sind das noch? Wer sich nicht mehr genau erinnert, sollte unbedingt zurückblättern.) wie auch die grobe Gestalt der Verteilungen an.


[44:]

<<*>>=
<<erstelle Boxplot zu {\tt xy}>>
Praxis:
Plot Output:

\psfig {figure=rvmulti1.ps,height=6cm,width=9cm}

Wieder einmal wird der Gesamteindruck erheblich von den möglichen Ausreißern beherrscht. Deshalb wollen wir die Werte oberhalb von 5000 entfernen und den Plot wiederholen.


[45:]

<<*>>=
<<bilde Ausschnitte der Komponenten von {\tt xy}>>
[1] "Komponente:  dz.03.02.97"
[1] "Die Werte der 1 -ten Komponente liegen in"
[1]     1 24449
[1] "Bis zu welcher Untergrenze sollen Werte von der"
[1] "1 -ten Komponente entfernt werden?"
1: 0
[1] "Ab welcher Obergrenze sollen Werte von der"
[1] "1 -ten Komponente entfernt werden?"
1: 5000
[1] "Komponente:  dz.17.02.97"
[1] "Die Werte der 2 -ten Komponente liegen in"
[1]    1 8513
[1] "Bis zu welcher Untergrenze sollen Werte von der"
[1] "2 -ten Komponente entfernt werden?"
1: 0
[1] "Ab welcher Obergrenze sollen Werte von der"
[1] "2 -ten Komponente entfernt werden?"
1: 5000
Die so definierten Ausschnitte führen mit dem Modul ...


[46:]

<<*>>=
<<erstelle Boxplot zu {\tt xy}>>
... zu den Boxplots:

\psfig {figure=rvmulti2.ps,height=7cm,width=9cm}

Jetzt lassen sich die Verteilungen schon besser vergleichen. Die Mediane und der Bereich unterhalb des Medians sind nicht sehr unterschiedlich. Der Teil der Verteilungen zwischen Median und drittem Quartil ist für den 17.02.97 stärker auseinandergezogen. Die stark unterschiedliche Lage der dritten Quartile konnte natürlich schon den zusammenfassenden Statistiken entnommen werden.

Histogramme

Praxis:
Zur Unterstützung wollen wir die Histogramme betrachten.
Technik:
Um die Vergleichbarkeit zu erhöhen, werden sich die horizontalen Achsen entsprechen. Die Anzahl der gewünschten Klassen muß eingegeben werden.


[47:]

<<*>>=
<<zeichne Histogramme zu {\tt xy}>>
Für zehn Klassen erhält man folgendes Bild.

\psfig {figure=rvmulti3.ps,height=11cm,width=15cm}

Unterschiede sind wieder nur im rechten Bereich der Verteilungen zu erkennen. Für den Vergleich bestimmter Intervalle helfen die Histogramme nicht sehr weiter.

Verteilungsfunktionen und Dichtespuren

Hier können vielleicht die in einem Plot eingetragenen empirischen Verteilungsfunktionen oder Dichtespuren mehr leisten.
Technik:
Für die Dichtespur ist die Fensterbreite anzugeben.


[48:]

<<*>>=
<<zeichne zu {\tt xy} F.dach und f.dach>>
Praxis:
Für die Eingabe 500 als Fensterbreite erhalten wir die folgende Graphiken.

\psfig {figure=rvmulti4.ps,height=11cm,width=15cm}

Das Bild hat nicht viel mehr Aussagekraft als die vergleichenden Boxplots. Für die Daten vom 03.02.97 (durchgezogene Linie) werden im Intervall von 0 bis zirka 300 jedoch erhöhte Häufigkeiten ausgewiesen. Die lokalen Maxima sollten nicht überinterpretiert werden.

Der QQ-Plot

Konzept:
Als letztes Werkzeug zu der Frage des Vergleichs zwischen Tagen wird noch der QQ-Plot vorgestellt. Mit diesem Plot wird versucht, zentrale Informationen zweier empirischer Verteilungsfunktionen in einer Darstellung zusammenzufassen. Dazu werden die zugehörigen zwei Prozentpunkte zu vorgegebenen Funktionswerten der empirischen Verteilungsfunktionen gegeneinander abgetragen. Das bedeutet für zwei gleich große Datensätze, daß die kleinste Beobachtung des einen gegen die kleinste Beobachtung des anderen, die zweitkleinste Beobachtung des einen gegen die zweitkleinste Beobachtung des anderen usw. abgetragen wird. Bei verschieden großen Umfängen kommen Interpolationsverfahren zum Einsatz. Sind die beiden Stichproben (fast) identisch, ergeben sich Punktepaare, die (fast) auf der Diametralen (f(x)=x) liegen.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: { --- QQ-Plot zu {\tt{}
x}
 $= ...
 ...antile
$y_p$\space gegen die Quantile $x_p$\space abgetragen.
}
\end{minipage}}


[49:]

<<*>>=
<<erstelle zu den ersten beiden Elementen von {\tt xy} einen QQ-Plot>>
Praxis:

\psfig {figure=rvmulti5.ps,height=7cm,width=9cm}

Deutlich weichen die Punkte von der Diametralen ab. Dies kann als ein Indiz für eine unterschiedliche Verteilung angesehen werden.

Konzept:
Liegen die Punkte des QQ-Plots auf einer zur Diametralen parallelen Geraden, so weist dies auf eine Lage-Verschiebung hin. Eine von Eins verschiedene Steigung zeigt, daß die relativen Häufigkeiten in den zugehörigen Abschnitten unterschiedlich sind (Dies kann zum Beispiel an unterschiedlichen Skalierungsfaktoren liegen -- Beispiel: ein ähnlicher Sachverhalt ist einmal in cm und einmal in inch gemessen worden.).
Praxis:
Hier sehen wir, daß der Datensatz vom 03.02.97 (bis zirka 800) mehr kleinere Beobachtungen besitzt, denn die Punkte entfernen sich von (0, 0) ausgehend zunächst von der Diametralen nach oben. Dann verlaufen die Punkte bis zirka 2000 fast auf einer Parallelen zur Referenzlinie. Der rechte Schwanz des Datensatzes vom 03.02.97 ist also im Vergleich zu dem vom 17.02.97 etwas in Richtung kleinerer Werte verschoben. Die größten Werte liegen wieder gut auf der gezeichneten Geraden.

Damit sind Unterschiede erkennbar geworden. Es ist jedoch noch nicht klar, ob man sie als bemerkenswert einstufen darf oder ob sie sich auch aufgrund von Zufalls-Schwankungen einstellen würden.

Bootstrap-Verfahren

Konzept:
Bevor wir uns der nächsten der drei oben gestellten Fragen zuwenden, wollen wir herausfinden, in welchem Umfang der Zufall Schwankungen, wie im letzten Absatz erwähnt, hervorrufen kann. Dazu wollen wir ein sogenanntes Bootstrap-Experiment durchführen.

Praxis:
Das Experiment nimmt die auf xy abgelegten Datensätze als Grundgesamtheiten an. Dann werden aus ihnen jeweils n -mal Stichproben nach dem Prinzip Ziehen mit Zurücklegen gezogen. Jeder ursprüngliche Datensatz und jede zugehörige Stichprobe wird in Form eines Boxplots dargestellt.
Technik:
Die Anzahl n ist anzugeben. Für das Experiment ist außerdem ein Startpunkt für den eingebauten Zufallszahlengenerator in Form einer ganzen Zahl zwischen 0 und 1000 einzugeben. Verschiedene Zufallsstarts führen zu verschiedenen Ergebnissen.


[50:]

<<*>>=
<<zeige Bootstrap-Stichprobenverteilungen mit {\tt xy}>>
Praxis:
Mit den Setzungen n=5 und ZZ=13 erhält man

\psfig {figure=rvmulti6.ps,height=11cm,width=15cm}

Die ursprünglichen Datensätze werden durch Zahlen markiert, die Boxplots der zugehörigen Bootstrap-Stichproben folgen jeweils rechts daneben und sind durch kleine Buchstaben gekennzeichnet. Alle dritten Quartile der Wiederholungen zu dem zweiten Datensatz 2

(das sieht man an den fünf rechten Boxplots) sind größer als diejenigen des ersten Datensatzes. Für die Mediane ist eine solch klare Aussage nicht zu treffen.

Konzept:
Verfahren, bei denen wie im durchgeführten Experiment aus einem gegebenen Datensatz neue Stichproben gezogen werden, heißen Bootstrap-Verfahren. Mit ihnen lassen sich Variabilitäten von Stichproben und aus Stichproben berechneten Größen (Statistiken) studieren.
Praxis:
Um letzteres beispielhaft zu demonstrieren, können mit dem folgenden Modul zu jedem Datensatz Boxplots erstellt werden, die die Realisationen einer gewählten Statistik in den einzelnen Bootstrap-Stichproben zusammenfassend darstellen.
Technik:
In dem folgenden Experimentier-Modul eine Statistik ausgewählt werden. Als Alternativen werden angeboten: median , mean , 3. Quartil , 1. Quartil , s , var , Interquartils-Abstand

eine ausgewählt werden.


[51:]

<<*>>=
<<zeige Verteilung einer Statistik von Bootstrap-Stichproben aus {\tt xy}>>
Praxis:
Für n=10 und die Wahl 3. Quartil erhält man das überzeugende Ergebnis:

\psfig {figure=rvmulti7.ps,height=7cm,width=9cm}

Die dritten Quartile der Stichproben zu dem Datensatz vom 17.02.97 sind alle größer als die der anderen Stichproben. Damit erscheint ein zufälliger Unterschied eher unwahrscheinlich.

Konzept:
Übrigens sei erwähnt, daß man unter dem Stichwort Zwei-Stichproben-Problem für unabhängige Stichproben in der Regel zur Abteilung Testen geschickt wird. Dort findet man dann Testprozeduren, die zum Beispiel unter bestimmten Annahmen die Unterschiedlichkeit der Mittel der zugehörigen Grundgesamtheiten oder ihrer Verteilungsfunktionen mit einer bestimmten Sicherheit herausfinden.

Praxis:
Bevor wir die Auseinandersetzung mit dem Tagesvergleich verlassen, sei darauf hingewiesen, daß die Summe der Zeitdifferenzen ungefähr 24 Stunden beträgt. Damit hängt das Mittel der Zeitdifferenzen fast nur noch von der Anzahl der gezählten Ereignisse ab.

Der Scatterplot

Mit der dritten Frage soll der Zusammenhang zwischen den Merkmalen Zwischenzeit und übertragene Menge geklärt werden: Besteht ein Zusammenhang zwischen den Zwischenzeiten und den übertragenen Mengen? Die Beobachtungen können -- wie oben bereits erwähnt -- in Form von Beobachtungspaaren angeordnet werden.

Technik:

Wir wollen diese Paare wieder auf xy ablegen. (Bei genauerer Überlegung könnte man zu dem Ergebnis kommen, daß die Anzahl der Zwischenzeiten um eins größer sein müßte als die Anzahl der Zwischenzeiten. Jedoch wurde als erste Wartezeit die Zeit von Tagesbeginn bis zum ersten Ereignis ergänzt.)


[52:]

<<*>>=
<<lege Zwischenzeiten und Mengen vom 03.02.97 auf {\tt xy} ab>>
Konzept:
Das naheliegendste Werkzeug für die Darstellung der beiden verbundenen Merkmale ist der Scatterplot (Streudiagramm).

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {--- Scatterplot eines zweidime...
 ...die Komponenten der Beobachtungspaare gegeneinander
geplottet.}
\end{minipage}}

In einem Scatterplot läßt sich erkennen, ob die Daten eher wie zufällig verteilt sind oder ob bestimmte Strukturen beziehungsweise Beziehungen zwischen den Merkmalen zu erkennen sind. So können sich die Punkte an bestimmten Stellen häufen oder sie können um eine Linie herum streuen. Strukturen irgendwelcher Form sprechen gegen eine Zufälligkeitsvermutung. In Fällen, in den es gelingt, aufgrund der Ausprägung des einen Merkmals Schlüsse für die Realisation des anderen zu ziehen, werden die Merkmale als nicht unabhängig, d.h. abhängig bezeichnet. Dann versucht man als nächstes, die Abhängigkeitsstrukturen zu beschreiben. Bei der Gegenüberstellung der Merkmale Körpergröße und Gewicht von Studierenden würde man zum Beispiel deutliche Abhängigkeitsstrukturen erkennen können.

Praxis:
Für eine Abhängigkeit der Merkmale Zwischenzeit und Menge lassen sich zwar nicht sofort Begründungen finden, doch würde ein negativer Zusammenhang für die effektive Serverbelastung von erheblicher Bedeutung sein. Deshalb wollen wir einen Blick auf die Daten werfen und dazu einen Scatterplot erstellen.


[53:]

<<*>>=
<<erstelle Scatterplot zu den ersten beiden Elementen von {\tt xy}>>
\psfig {figure=rvmulti8.ps,height=7cm,width=9cm}

Praxis:
Leider wird das Bild wieder durch die wenigen sehr großen Werte beherrscht, so daß die meisten Punkte sich in der linken unteren Ecke ballen. Wir wollen deshalb alle x- und y-Werte logarithmieren.
Konzept:
Solche Veränderungsoperationen heißen in der Statistik Transformationen. Sie dienen dazu, bestimmte Eigenschaften von Datensätzen stärker hervortreten zu lassen, oder zur Aufbereitung des Datenmaterials, um Bedingungen statistischer Verfahren, die man gerne einsetzen möchte, zu erfüllen. Durch Logarithmierung werden extrem große Werte näher an die übrigen Punkte herangeholt und eine Punktewolke kleiner Beobachtungen auseinandergezogen. Abhängigkeitsstrukturen, die im letzten Plot verdeckt waren, könnten hierdurch sichtbar werden.
Technik:
Technisch realisieren wir die Logarithmierung durch entsprechende Box-Cox-Transformationen. Das folgende Modul fragt die Transformationsparameter $\lambda$ ab. Für weitere Erklärungen blättere man zurück zum Ende des Kapitels über Maßzahlen.


[54:]

<<*>>=
<<transformiere Elemente von {\tt xy} mittels Box-Cox-Transformation>>
Durch zweimalige Eingabe von " 0 " logarithmiert das Modul die beiden Datensätze. Nun kann der Scatterplot wiederholt werden.


[55:]

<<*>>=
<<erstelle Scatterplot zu den ersten beiden Elementen von {\tt xy}>>
Praxis:

\psfig {figure=rvmulti9.ps,height=7cm,width=9cm}

Wir erkennen, daß die Wolke schön aufgelockert ist. Die weit entfernt liegenden Werte sind nun am Rand der Wolke zu finden. Besondere Strukturen, die als Abhängigkeiten der beiden Merkmale deutbar sein könnten, treten aber nicht hervor.

Konvexe Hüllen

Konzept:
Wir wollen noch einen Versuch der optischen Unterstützung unternehmen, indem wir den Plot mit konvexen Hüllen versehen.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {--- Konvexe H\uml ulle\ [1ex]...
 ...e
ist das kleinste die Punktewolke umschlie{\ss}ende Polygon.
}
\end{minipage}}

Notwendigerweise werden die Eckpunkte des Polygons durch Beobachtungspunkte definiert. Entfernt man die Datenpunkte, die zum Polygon gehören, aus dem Datensatz, läßt sich wieder die konvexe Hülle der verbliebenen Punkte finden. Nach dieser Melodie, auch data peeling genannt, kann man solange fortfahren, bis (fast) alle Punkte entfernt sind.

Praxis:
Wir wollen die Folge der konvexen Hüllen sehen.


[56:]

<<*>>=
<<erstelle Scatterplot zu {\tt xy} und zeichne konvexe H\"ullen>>
Praxis:
Wir erhalten damit dieses Bild:

\psfig {figure=rvmulti10.ps,height=7cm,width=9cm}

Allenfalls läßt sich ablesen, daß bei sehr kleinen Zeitdifferenzen nicht die größten Datenmengen transportiert werden. Eine Struktur nach dem Motto je größer das eine, umso größer (oder kleiner) das andere, ist nicht zu erkennen.

Der Korrelationskoeffizient

Konzept:
Zur Beschreibung der linearen Abhängigkeit lassen sich auch Maßzahlen heranziehen. Die bekannteste ist mit dem Korrelationskoeffizienten (genauer: Korrelationskoeffizienten von Bravais-Pearson) gegeben. Wir haben diese Maßzahl nur aus Gründen ihres häufigen Gebrauchs mit aufgenommen, wollen sie hier aber nicht umfassend diskutieren, da sie nicht ganz in das Kapitel über Graphiken paßt.

Konzept:
Das Formale:

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {{\tt{}
cor(x,y)}
 --- Korrelat...
 ..._i (x_i-\bar x)^2\times\sum_i(y_i-\bar y)^2}}\end{displaymath}}
\end{minipage}}

Ist der Korrelationskoeffizient nahe bei 0, liegt kein linearer Zusammenhang vor. Liegen alle Beobachtungen sehr nahe einer Geraden mit positiver (negativer) Steigung, so nimmt er Werte in der Nähe von +1 (-1) an.

Wie viele andere Maße auch, besitzt der Korrelationskoeffizient die Schwäche der Ausreißerempfindlichkeit. Außerdem mißt er, wie gesagt, nur den Grad des linearen Zusammenhangs, so daß zum Beispiel bei Punkten, die nahe einer Kreislinie liegen, die Abhängigkeitsstruktur nicht erkannt werden kann.

Praxis:
Wir wollen den Korrelationskoeffizienten berechnen. Vielleicht bestätigt der Korrelationskoeffizient unsere Einsichten.


[57:]

<<*>>=
<<berechne Korrelationskoeffizienten der ersten beiden Elementen von {\tt xy}>>
[1] 0.02028
Das Ergebnis weicht nicht wesentlich von 0 ab. Das haben wir auch nach dem letzten Bild erwartet, da sich dort auch kein linearer Zusammenhang gezeigt hat.

Praxis:
Wir können also zusammenfassen, daß zu der Frage: Besteht ein Zusammenhang zwischen den Zwischenzeiten und den übertragenen Mengen? kein Zusammenhang festgestellt werden konnte.

Um ein Beispiel zu zeigen, bei dem ein gewisser Zusammenhang zu erkennen ist, legen wir auf xy Kornerträge und festgestellte Niederschlagsmengen ab und setzen die letzten beiden Module noch einmal ein. Man kann sich schon vorstellen, daß es zwischen den beiden Merkmalen Regenmenge und Ertrag Zusammenhänge gibt. (Siehe [Becker et al., Datensatz corn , p. 647].)


[58:]

<<*>>=
<<lege Regenmengen und Kornertr\"age auf {\tt xy} ab>>
<<erstelle Scatterplot zu {\tt xy} und zeichne konvexe H\"ullen>>
<<berechne Korrelationskoeffizienten der ersten beiden Elementen von {\tt xy}>>
Wir erhalten:

\psfig {figure=rvmulti10a.ps,height=7cm,width=9cm}

Berechnung des Korrelationskoeffizienten zu xy
[1] 0.402629
Ein Wert von 0.40 zeigt nur einen sehr schwachen linearen Zusammenhang an. Jedoch ist aus dem Scatterplot abzulesen, daß bei großen Regenmengen keine kleinen Erträge beobachtet wurden. Die Hüllen haben auch alle eine gewisse Tendenz von links unten nach rechts oben, so daß wohl doch von einem Zusammenhang auszugehen ist.

Als zweites Beispiel seien zwei Datensätze vorgeführt, die Regendaten aus zwei verschiedenen Quellen, die sich beide auf New York und die gleichen Zeiträume beziehen, zeigen. (Siehe [Becker et al., Datensatz rain , p. 656].)


[59:]

<<*>>=
<<lege Regendatens\"atze auf {\tt xy} ab>>
<<erstelle Scatterplot zu {\tt xy} und zeichne konvexe H\"ullen>>
<<berechne Korrelationskoeffizienten der ersten beiden Elementen von {\tt xy}>>

\psfig {figure=rvmulti10b.ps,height=7cm,width=9cm}

Berechnung des Korrelationskoeffizienten zu xy
[1] 0.7133686
Hier ist der Korrelationskoeffizient schon größer und auch das Bild unterstützt die Abhängigkeitsvermutung. Es ist aber erstaunlich, daß sich die Abhängigkeit als nicht noch stärker erweist. Spürnasen können ja über die angegebene Literaturstelle weitere Forschungen anstellen.

Draftsman's Display

Praxis:
Zur zweiten Frage Ist die Belastung innerhalb eines Tages gleichmäßig verteilt oder verändert sie sich im Zeitablauf? wurden oben schon drei Vorgehensweisen angedeutet. Wir wollen diese ein wenig näher betrachten. Wenn wir fragen, was zu erwarten ist, dann dürften Antworten wie: in der Nacht wird die Belastung geringer ausfallen als am Tage oder eine relativ hohe Belastung ist mittags und vielleicht am frühen Abend zu erwarten anzutreffen sein. Wir wollen diesen Vermutungen nachgehen.

Kommen wir zum ersten Vorgehensvorschlag, bei dem die Daten anzahlenmäßig in gleich große Stücke geteilt werden. Damit steht über die laufende Nummer ein Bindungsmerkmal zur Verfügung, mittels dessen Gegenüberstellungen vorgenommen werden können.

Zunächst führen wir die Aufteilung durch.


[60:]

<<*>>=
<<lege Zwischenzeiten vom 03.02.97 auf {\tt xy} ab>>
<<ordne Daten von {\tt xy} in {\tt anz} gleich gro{\ss}e Klassen ein: {\tt xy}>>
Technik:
Die Anzahl anz wird erfragt. Für die Übereinstimmung mit den abgedruckten Ergebnissen muß man anz auf 4 setzen.

Konzept:
Jetzt haben wir anz Stichproben von gleicher Länge vorliegen. Diese könnten wir uns im anz -dimensionalen Raum vorstellen, aber nicht zu Papier bringen. Jedoch ist eine Gegenüberstellung von jeweils zwei Stichproben in einem Scatterplot möglich. Damit ergeben sich 0.5*(anz-1)*anz verschiedene Scatterplots. Werden diese in einer bestimmten Weise angeordnet und dann noch an der gedachten Diagonalen von links oben nach rechts unten gespiegelt, erhält man einen sogenannten Draftsman's Display.

\fbox {
\begin{minipage}
{14cm}
\em Algorithmus: {--- Draftsman's Display der ve...
 ... $i$-ten Stichprobe und der $j$-ten Stichprobe zu finden ist.
}
\end{minipage}}

Hier ist ein Beispiel, das in der statistischen Literatur häufig diskutiert wird. (Siehe [Becker et al., Datensatz: iris , p. 650].)

\psfig {figure=rviris.ps,height=7cm,width=7cm}

Der Plot ist sicher hilfreich bei der Strukturensuche.

Praxis:
Die Bindung ist in erster Linie hier eine technische. Eine substanzielle Begründung ist bisher noch nicht gegeben worden. Jedoch ist klar, daß sich zum Beispiel ein Trend in den Daten an unterschiedlichen Achsenbereichen oder an bestimmten Strukturen innerhalb der Scatterplots zeigen würde. Wir wollen dieses Instrument, das in anderen Situationen viel wirkungsvoller ist, nun einsetzen.


[61:]

<<*>>=
<<erstelle Draftsman's Display zu {\tt xy}>>

\psfig {figure=rvmulti13.ps,height=11cm,width=15cm}

Das Auffälligste sind die unterschiedlichen Bereiche, in denen die Werte der einzelnen Teildatensätze liegen. Das erste Viertel der Daten beansprucht im wesentlichen einen Bereich von 0 bis zirka 5000 (Sekunden), wobei zusätzlich der Extremwert von knapp 25000 im Ausschnitt untergebracht ist. Das Fenster des zweiten Viertels geht von 0 bis knapp unter 3000, das des nächsten bis etwas über 1500 und das des vierten bis 2500. Betrachtet man die größten Zeitdifferenzen als Indikator, so zeigen diese die größten Zugriffspausen an und lassen damit Folgerungen für die Belastung zu, die in Richtung der oben angestellten Vermutungen gehen. Sehr überzeugend ist diese Argumentation aber nicht, da die meisten Beobachtungen (Bildpunkte) nicht verarbeitet worden sind und die Zeit nur implizit aus dem graphischen Ergebnis zu erkennen ist.

In den kleinen Plots ist übrigens keine Beziehung zwischen den vier Vierteln zu erkennen. Wir wollen an dieser Stelle weitere Gedanken dem Leser/Experimentator überlassen und uns dem zweiten Weg widmen. Immerhin hat uns der erste Versuch das Werkzeug Draftsman's Display beschert.

Noch einmal vergleichende Boxplots

Konzept:
Der zweite Weg besteht darin, den Tag in verschiedene, zeitlich gleichlange Zeitabschnitte zu teilen, um dann die Beobachtungen der einzelnen Abschnitte zu vergleichen. Wird der gesamte Datensatz in anz Abschnitte eingeteilt, ergeben sich anz neue Datensätze, die mit oben dargestellten Techniken verarbeitet werden können.
Praxis:
Wir wollen die Zwischenzeiten vom 03.02.97 gemäß den zugehörigen Zeitpunkten in anz Klassen einteilen.
Technik:
Die Anzahl der Abschnitte wird erfragt.


[62:]

<<*>>=
<<lege Zwischenzeiten und Zeiten vom 03.02.97 auf {\tt xy} ab>>
<<ordne {\tt xy[1] }gem\"a{\ss} {\tt xy[2] }in {\tt anz} Klassen ein: {\tt xy}>>
Praxis:
Nun können wir mit Leichtigkeit vergleichende Boxplots zu den vier Zeitabschnitten erstellen.


[63:]

<<*>>=
<<erstelle Boxplot zu {\tt xy}>>
Für vier zeitlich gleich große Teile erhalten wir:

\psfig {figure=rvmulti11.ps,height=7cm,width=9cm}

Jeder Boxplot repräsentiert 6 Stunden des Tages 03.02.97. Auf den ersten Blick sehen die vier einzelnen Plots recht ähnlich aus. Doch besteht der erste nur aus einer Box, deren Niveau über den anderen drei Boxen liegt. Der zweite Teildatensatz beinhaltet die größte Zwischenzeit, die knapp unter 25000 Sekunden abgebildet ist. Der dritte und der vierte Datensatz scheinen sich von der Struktur her nicht zu sehr zu unterscheiden. Jetzt haben wir zwar eine zeitgemäße Zerteilung der Daten vorgenommen, doch fördert das gewählte Instrument Boxplots Unterschiede nicht sehr deutlich zu Tage. Wir wollen mit QQ-Plots die vier generierten Datensätze gegenüberstellen.

QQ-Plots, paarweise

Oben haben wir zum direkten Vergleich verschiedener Stichproben QQ-Plots kennengelernt. Wir wollen nun zum Vergleich der vier Teildatensätze QQ-Plots erstellen und wie beim Draftsman's Display schachbrettartig anordnen.


[64:]

<<*>>=
<<erstelle zum paarweisen Vergleich der Datens\"atze von {\tt xy} QQ-Plots>>

\psfig {figure=rvmulti12.ps,height=11cm,width=15cm}

Die sicher etwas zu kleinen Bilder der ersten Bilderspalte unterstützen die erste Vermutung: Der Plot oben links zeigt den QQ-Plot der Zwischenankunftszeiten, die den ersten sechs Stunden zuzurechnen sind, mit sich selbst. Es sind nur zwei Punkte in dem Plot zu erkennen. Die vier Plots in der Süd-Ost-Ecke der Gesamtgraphik weisen dagegen eine Vielzahl von Punkten auf. Mit den unterschiedlichen Punktezahlen ist offensichtlich eine unterschiedliche Zugriffsintensität belegt.

Zur Bestätigung wollen wir die Anzahlen der einzelnen Teildatensätze genau berechnen.


[65:]

<<*>>=
<<errechne Anzahlen der Stichproben von {\tt xy}>>
Wir erhalten:
Anzahlen der Stichproben von xy
$"1":
[1] 2

$"2":
[1] 25

$"3":
[1] 48

$"4":
[1] 28
Die größte Belastung herrscht demnach im Zeitraum zwischen 12.00 und 18.00. Weiter zeigen die Teildatensätze drei und vier recht ähnliche Strukturen. Vergleiche mit dem zweiten Plot lassen sich aufgrund des Ausreißers nicht gut anstellen. Wir wollen zum Abschluß versuchen, mögliche Belastungsunterschiede, die sich im Laufe eines Tages einstellen, deutlicher zusammenhängend darzustellen. Dazu wollen wir uns nur bekannter Instrumente bedienen.

Jitterplot, F.dach und f.dach

Praxis:
Der dritte Vorschlag bestand darin, nicht die Zwischenzeiten, sondern die Zugriffszeiten selbst zu untersuchen.


[66:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt xy} ab>>
Zunächst erstellen wir einen Jitterplot der Zugriffszeitpunkte.


[67:]

<<*>>=
<<zeichne Jitterplot zu {\tt xy}>>
Wir erhalten:

\psfig {figure=rvmulti17.ps,height=7cm,width=9cm}

Jetzt sieht man den Belastungsunterschied schon sehr deutlich. Um eine quantitative Vorstellung zu bekommen, hilft uns die empirische Verteilungsfunktion weiter.

Konzept:
Aus der empirischen Verteilungsfunktion läßt sich ermitteln, in welchen Intervallen welche Anteile von Beobachtungen liegen.

Praxis:
Wir wollen das Instrument einsetzen, um die Anteile der Zugriffszeitpunkte zu betrachten, die vor einem beliebigen Zeitpunkt x liegen. Damit läßt sich aus dem Bild ablesen, in welchen Bereichen erhöhte Nachfrage geherrscht hat.


[68:]

<<*>>=
<<zeichne {\tt F.dach} zu {\tt xy}>>
Die empirische Verteilungsfunktion zeigt eine klare Zweiteilung. Im ersten Teil des Bildes steigt die Kurve kaum an, im zweiten dafür um so kräftiger.

\psfig {figure=rvmulti14.ps,height=7cm,width=9cm}

Damit ist die Vermutung untermauert, daß die Belastung in der Nacht erheblich geringer ist als am Tage. Spitzenbelastungen, die mit einem starken Anstieg der Kurve einhergehen, lassen sich jedoch nur vage abschätzen.

Zur Ermittlung der dichtesten Bereiche empfehlen sich Dichtespuren als Instrument. Na, dann auf!


[69:]

<<*>>=
<<zeichne Dichtespuren zu {\tt xy}>>
Für die nach einigen Versuchen gewählte Fensterbreite von 15000 erhält man:

\psfig {figure=rvmulti15.ps,height=7cm,width=9cm}

Nun haben wir wirklich eine plastische Vorstellung von der Belastung im Tagesablauf bekommen. Es muß natürlich bei der Interpretation berücksichtigt werden, daß die Kurve am rechten Rand fallen muß, da jenseits der Tagesgrenze keine Werte eingegangen sind. Kritisch ist auch anzumerken, daß für eine Präsentation die Achsenbeschriftung nicht sehr geeignet ist. Wer kann schon 180000 Sekunden in Kopf umrechnen (180000 Sekunden = 3000 Minuten = 50 Stunden = 2 Tage und 2 Stunden, entsprechend: 216000 Sekunden = 3600 Minuten = 60 Stunden = 2 Tage und 12 Stunden)?

Technik:
Eine Rechenhilfe könnte für Umrechnungen helfen -- sie funktioniert leider nur am Rechner.


[70:]

<<*>>=
<<rechne Sekunden in Tage, Stunden und Minuten um>>
Konzept:
Es ist festzustellen, daß nicht immer noch mehr Instrumente her müssen, sondern daß es viel wichtiger ist, die bekannten geschickt einzusetzen.

Dichtespur über den ganzen Monat

Die Belastungsfragen und die Strukturensuche ist noch lange nicht ausgereizt. Doch erscheint an dieser Stelle eine Unterbrechung angebracht zu sein. Als Zugabe wird noch eine Graphik präsentiert, die eine Dichtespur über die ersten 18 Tage des Februars zeigt. Die einzelnen Tagesgrenzen sind durch senkrechte Linien hervorgehoben. Als Input wurden die Zeitpunkte der Serverzugriffe verwendet. Deutlich sieht man, daß an jedem Tag ein lokales Maximum anzutreffen ist. Außerdem erkennt man ohne weiteres die Wochenstruktur. Zur Erinnerung sei gesagt: der Tag 01.02.97 war ein Samstag.

\psfig {figure=rvmulti16.ps,height=11cm,width=15cm}

Leider ist die Achsenbeschriftung in einem unschönen Format. Da die einzelnen Werte hier aber keine Rolle spielen, ist keine zusätzliche Mühe zur Verschönerung aufgewendet worden. Zur Vermeidung von Mißverständnissen sei am Beispiel erklärt, daß 1.5*10^6 =$1.5\times 10^6$= 1 500 000.

Was haben wir gelernt?

Konzept:
Auf der einen Seite wurde eine ganze Reihe statistischer Werkzeuge vorgestellt, mit denen man im Rahmen des Übungsteil noch viele Versuche anstellen kann.

Praxis:
Auf der anderen haben wir zur Serverbelastung gelernt, daß die Belastungen verschiedener Tage in der Beziehung Ähnlichkeiten aufweisen, als daß zu Tagesbeginn eine geringe Last vorherrscht. Die Hauptbelastungen dürften nachmittags anzutreffen sein. Wie das letzte Bild zeigt, hängt das Niveau der Last stark vom Wochentag ab. Der Unterschied zwischen dem 03.02.97 und dem 17.02.97 fiel nicht so groß aus, da es sich in beiden Fällen um einen Montag gehandelt hat. Ein Zusammenhang zwischen dem Merkmal Mengen und der Zeit oder der durch kurze Zwischenzeiten gemessenen Belastung konnte nicht festgestellt werden.

Offene Fragen

Als offene Fragen können angeführt werden: Das folgende Kapitel befaßt sich deshalb mit Modellierungsfragen.

Kontingenztabellen

Viele Datensätze haben nur ein ordinales oder auch nur ein nominales Meßniveau. Für solche sind die oben beschriebenen Techniken wohl nicht geeignet. Dieser Abschnitt soll daran erinnern, daß man dann nach anderen als den hier beschriebenen Methoden Ausschau halten muß. Als Tropfen auf den heißen Stein ist im Auswahlmenue zu diesem Kapitel ein Punkt zu finden, mit dem man Kontingenztabelle ein wenig untersuchen kann.

Aufgaben

Die Aufgaben sollen mit folgenden unterstützenden Möglichkeiten bearbeitet werden.


[71:]

<<*>>=
cat("Revbook:3.m:menu.mu:Menue Multivariate Beschreibungstechniken\n")
<<Auswahl zu den Aufgaben des Kapitels \"uber multivariate Graphiken>>
Zur Information wird wieder das Auswahlmenü gezeigt:
items:
 a Abbruch/Ende
 b lege Datensaetze zur Bearbeitung auf xy ab
 c modifiziere Datensaetze xy
 d lege einen Datensatz von xy auf x ab
 e ermittle einige Ma{\ss}zahlen zu xy
 f erstelle Boxplot zu xy
 g erstelle Jitterplot zu xy
 h zeichne Histogramme zu xy
 i zeichne Dichtespuren zu xy
 j zeichne F.dach zu xy
 k zeichne zu xy F.dach und f.dach
 l erstelle Scatterplot zu den ersten beiden Elementen von xy
 m erstelle Scatterplot zu xy und zeichne konvexe Huellen
 n erstelle zu xy[1:2] einen QQ-Plot
 o erstelle Draftsmans Display zu xy
 p erstelle zum paarweisen Vergleich von xy QQ-Plots
 q mache mit xy Bootstrap-Experimente
 r Kontingenztabellenfunktion mit xy
Selection:
a.)
Erstellen Sie für die übertragenen Datenmengen vom 03.02.97 und 17.02.97 vergleichende Boxplots! Dazu müssen Sie zunächst die entsprechenden Daten auf dem Arbeitsobjekt xy ablegen. Versuchen Sie, Ausreißer zu entfernen (oder die Daten zu logarithmieren) und das Bild zu wiederholen. Scheinen Ihnen die Verteilungen sehr unterschiedlich zu sein?
b.)
Erstellen Sie Histogramme für die übertragenen Datenmengen vom 03.02.97 und 17.02.97, nachdem vorher die Ausreißer entfernt worden sind. Bei welcher Klassenanzahl sehen die Verteilungen sehr ähnlich aus, bei welcher sehr unterschiedlich?
c.)
Versuchen Sie, mit den Daten der letzten Übung verschiedene Dichtespuren zu erstellen. Welche Fensterbreite führt Ihrer Meinung nach zu einem brauchbaren Ergebnis?
d.)
Was lesen Sie aus dem QQ-Plot der Daten aus b.) ab? (Wieso ist übrigens ein Scatterplot nicht geeignet/möglich?)
e.)
Legen Sie auf dem Arbeitsobjekt xy einen der Datensätze doppelt ab. Modifizieren Sie eine Komponente von xy durch eine Box-Cox-Transformation. Wie wirken sich verschiedene Parameter der Box-Cox-Transformationen auf das Erscheinungsbild der QQ-Plots aus?
f.)
Wiederholen Sie das geschilderte Bootstrap-Experiment für die entsprechenden Daten vom 17.02.97!
g.)
Geben Sie manuell x -Werte und y -Werte mit dem Ziel ein, einen Korrelationskoeffizienten von 0, von 0.5, von -0.99, von 0.90 zu erhalten!
h.)
Wiederholen Sie die Analyse der Belastung im Tagesablauf mit den Daten des Tages 17.02.97! Weist der 17.02.97 viele Ähnlichkeiten auf? Sehen Sie Unterschiede? regen.ertrag auf xy ab. Dieser Datensatz besteht aus
i.)
Legen Sie Auto1 auf xy ab. Dieser Datensatz besteht aus drei Komponenten, die sich auf Autos beziehen. Die erste enthält die Anzahl der Tage seit dem Kauf des Autos, die zweite die Anzahl der gefahrenen Meilen zwischen den letzten beiden Tankstellenbesuchen und die dritte die zuletzt getankte Menge in Gallonen. Die untersuchten Autos waren Neuwagen aus dem Jahr 1974, ([Becker et al., Datensatz car , p. 645]). Erstellen Sie einen Draftsman's Display und interpretieren Sie ihn!
j.)
Legen Sie Auto2 auf xy ab. Dieser Datensatz besteht aus drei Komponenten, die sich auf Autos beziehen. Ihre Bedeutung ist: Preis, Verbrauch, Gewicht, Länge, Wendekreis. Die Daten beziehen sich auf verschiedene Automodelle. Analysieren Sie die Daten! ([Becker et al., Datensatz auto , p. 644]).

Modellierungsschritte


[72:]

<<*>>=
cat("Revbook:4.a:start.mo:Kapitel Modellierungsschritte\n")
Zum Literaturstudium sei hingewiesen auf: [Autorenkollektiv: Abschnitt über das Verteilungsmodell], [Bamberg, Baur: Kapitel über Zufallsvariablen und ihre Verteilungen], [Schlittgen: Kapitel über diskrete Verteilungsmodelle und über stetige Verteilungsmodelle].

Motivation -- noch unbeantwortete Fragen

Konzept:
Die ersten Kapitel dieses Buches beschäftigen sich mit Verfahren zur Beschreibung von Datensätzen. Diese Verfahren wurden zugleich dafür benutzt, in den Problembereich Belastung eines WWW-Servers auf eine Reihe von Fragen Antworten zu finden. Beschreibende Verfahren stoßen aber an ihre Grenzen, wenn noch nicht eingetretene Phänomene abgeschätzt werden sollen. Dann müssen Erwartungen und Wahrscheinlichkeitsaussagen begründet abgeleitet werden. Der Statistiker muß für solche weitergehenden Wünsche die vorliegenden Gegebenheiten unter Berücksichtigung der Zielsetzung modellieren. Bei der Rückübertragung der Modell-Ergebnisse in den ursprünglichen Problembereich sind etwaige Verstöße gegen Modellannahmen zu berücksichtigen. In diesem Kapitel sollen typische Fragestellungen mit dazu passenden einfachen Modellen vorgestellt und anhand der Serverproblematik demonstriert werden.

Der Gedankengang dieses Kapitels wird durch folgende Fragen geleitet.

Praxis:
Konzept:
Zur Beantwortung dieser Fragen werden die Bernoulli-Verteilung, die Binomial-Verteilung, die geometrische Verteilung, die Exponential-Verteilung und die Poisson-Verteilung vorgestellt und eingesetzt. Es werden Werkzeuge angegeben, mit denen man Stichproben aus diesen Modellen ziehen und die Eignung der Modelle prüfen kann. Zusätzlich werden Kalkulatoren bereitgestellt, mit denen sich konkrete Fragen an die Modelle beantworten lassen.

Die Bernoulli-Verteilung -- Wie groß ist die Wahrscheinlichkeit, daß in der nächsten Minute ein Server-Zugriff stattfindet?


[73:]

<<*>>=
cat("Revbook:4.d1:v.bern:Abschnitt Bernoulli-Verteilung\n")
Konzept:
Wieviel würden Sie darauf wetten, daß in der nächsten Minute ein Serverzugriff stattfindet? Das hängt sicher von der Wahrscheinlichkeit ab, mit der in der nächsten Minute auf den Server zugriffen wird. Leider ist diese Wahrscheinlichkeit unbekannt. Um diese abzuschätzen, muß ein passendes (Verteilungs-)Modell ausgewählt und eingesetzt werden. Die Frage hier führt uns zur Bernoulli-Verteilung bzw. zum Bernoulli-Prozeß. Im folgenden werden Bernoulli-Experimente durchgeführt, eine Abschätzung der gewünschten Wahrscheinlichkeit vorgeschlagen und die Übertragbarkeit auf unsere Server-Probleme überlegt.

Konzept:
Wir wollen von der vorliegenden Situation abstrahieren. Die Überschrift erinnert an die Frage: Wie groß ist die Chance, daß eine zufällig geworfene Münze mit seiner Zahl nach oben landet? und damit an das einfachste Experiment des Statistikers, das Bernoulli-Experiment.
\fbox {
\begin{minipage}
{14cm}
\em Bernoulli-Experiment \ [1ex]
Ein Experiment...
 ...olg} $q=1-p$\space betr\uml agt, hei{\ss}t Bernoulli-Experiment.\end{minipage}}
Mit einem Bernoulli-Experiment läßt sich der Wurf einer Münze modellieren. Von einer fairen Münze wird man p=0.5 fordern. Die Zufallsvariable, die den möglichen Ausgang eines Bernoulli-Experimentes beschreibt, heißt Bernoulli-verteilt:
\fbox {
\begin{minipage}
{14cm}
\em Bernoulli-Verteilung \ [1ex]
$X$\space hei{...
 ...ernoulli$(p)$\space und es gilt:
E$(X)=p$\space und Var$(X)=pq$.\end{minipage}}
E(X) ist der Erwartungswert von X und Var(X) seine Varianz. Hinweis: In diesem Kapitel wird keine ausführliche Einführung in die Wahrscheinlichkeitstheorie gegeben. Alle abgedruckten diesbezüglichen Definitionen, Sätze usw. dienen der Erinnerung und können eine gründliche Einführung nicht ersetzen.

Konzept:
Zur Überprüfung, ob eine Münze fair ist, würde man sie wiederholt werfen und die Ergebnisse untersuchen.

Praxis:
Ob in der nächsten Minute ein Serverzugriff stattfindet oder nicht, kann als Bernoulli-Experiment angesehen werden. Ein Zugriff werde als Erfolg angesehen (X=1), kein Zugriff in der nächsten Minute als Mißerfolg (X=0). Die gesuchte Wahrscheinlichkeit entspricht dann dem Parameter p der Bernoulli-Verteilung:

\begin{displaymath}
P(\mbox{Zugriff in der n\uml achsten Minute})=P(X=1)=p\end{displaymath}

Konzept:
Welches ist ein geeigneter Vorschlag für p? Um einen Eindruck von den Gegebenheiten zu bekommen, empfiehlt sich zunächst eine Datenbeschau. Dann werden wir nach einem passendem p Ausschau halten, indem wir Eigenschaften des realen Datensatzes mit denen von Modelldaten gegeneinanderstellen.
Praxis:
Für die ersten Minuten des 03.02.97 läßt sich herausfinden, ob Serverzugriffe durchgeführt worden sind (Ergebnis: X=1) oder nicht (Ergebnis: X=0):


[74:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
<<zeige die ersten Werte von {\tt x} an>>
Dieses liefert:
Wie viele Minuten sollen untersucht werden (Default=100)?
1: 100
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Es zeigen sich viele 0-Ergebnisse. Das zugehörige p dürfte wohl von 0.5 verschieden sein. Aber welcher Wert ist geeignet? Wir wollen die Auswirkung verschiedener p-Werte experimentell untersuchen.

Realisierte Bernoulli-Prozesse

Konzept:

Entsprechend zu solchen realen 0-1-Ergebnissen läßt sich ein Bernoulli-Experiment wiederholt durchführen. Falls sich die einzelnen Bernoulli-Experimente nicht beeinflussen und der Parameter p konstant bleibt, heißt eine solche Abfolge von Experimenten Bernoulli-Prozeß.

Wir wollen computergestützt Bernoulli-Prozesse mit vorgegebenen p realisieren und studieren, ob das p wiederentdeckt werden kann.

Praxis:
Wir wollen zuerst Experimentierbedingungen festsetzen, dann die einzelnen Experimente ablaufen lassen und zum Schluß die Ergebnisse untersuchen.

Technik:
Als Experimentierbedingungen sind die Anzahl der Bernoulli-Experimente ( n ), die Erfolgswahrscheinlichkeit ( p ) sowie der Start des internen Zufallszahlengenerators ( ZZ ) festzulegen. Unterschiedliche Zufallszahlengenerator-Starts (durch ZZ ausgelöst) führen zu unterschiedlichen Ausgangssituationen, so daß in Abhängigkeit von ZZ unterschiedliche 0-1-Ergebnisfolgen resultieren. Nach der Festlegung der Parameter werden die Experimente durchgeführt.


[75:]

<<*>>=
<<lege Parameter {\tt p,n,ZZ} f\"ur wiederholte Bernoulli-Experimente fest>>
<<starte Bernoulli-Experimente, Bedingungen: {\tt n, p, ZZ}, Ergebnis: {\tt x}>>
Praxis:
Wir wollen die folgenden Festlegungen, die mit den Default-Vorschlägen (das sind die voreingestellten Werte für leere Eingaben) übereinstimmen, ausprobieren:
Festlegung der Bedingungen fuer wiederholte Bernoulli-Experimente
Legen Sie die Erfolgswahrscheinlichkeit p fest (Default: 0.5): p=?
[1] 0.5
Legen Sie die Anzahl n der Bernoulli-Experimente fest
(Default: 200): n=?
[1] 200
Zufallsstart: Geben Sie eine ganze Zahl zwischen 0 und 1000 ein
(Default: 17): ZZ=?
[1] 17

Nun können wir die erzeugte 0-1-Folge ( x ) mit den deskriptiven Techniken der Statistik beschreiben. Ein Stabdiagramm zeigt die relative Häufigkeit der beiden Ergebnisse an.


[76:]

<<*>>=
<<erstelle Stabdiagramm zu {\tt x}>>
Für die oben abgedruckten Setzungen erhält man das Stabdiagramm:

\psfig {figure=rvmod1.ps,height=6cm,width=6cm}

Die relative Häufigkeit für einen Erfolg beträgt nicht ganz 50 %.

Konzept:
Eine genaue Übereinstimmung mit p=0.5 wird sicher auch niemand erwartet haben, da Zufallsergebnisse und Zufallsstichproben eben von Zufällen abhängen. Andererseits liegt der realisierte Erfolgsanteil ziemlich nah an der vorgegebenen Wahrscheinlichkeit p. Dieses erscheint durchaus plausibel zu sein und führt zu dem Vorschlag, die Wahrscheinlichkeit durch das empirische Gegenstück, die relative Häufigkeit, abzuschätzen.

Der Mittelwert der Ergebnisse gleicht übrigens der relativen Häufigkeit oder dem Anteil der Erfolgsausgänge. Warum ist das so?

$\bar x=\sum_i x_i/n= (0\times$Anzahl der Nullen$+1\times$Anzahl der Einsen)/n = Anteil der Einsen
Praxis:
Wir wollen den Erfolgsanteil bzw. Mittelwert genau berechnen.


[77:]

<<*>>=
<<berechne Mittelwert von {\tt x}>>
Wir berechnen aus den Ergebnissen der Bernoulli-Experimente den
Mittelwert
[1] 0.495
und können dies als Schätzvorschlag in die Diskussion einbringen.

Entwicklung von Durchschnitten

Konzept:
Jedoch sollten wir Genauigkeitsfragen bedenken. Intuitiv erwartet man genauere Ergebnisse mit wachsendem n.
Praxis:
Dieses läßt sich dadurch überprüfen, daß man den Durchschnitt der ersten k Ergebnisse gegen k abträgt. Auf geht's.


[78:]

<<*>>=
<<plotte Durchschnitte f\"ur die ersten $k$ Elemente von {\tt x} gegen $k$>>
Aufgrund der Daten der Bernoulli-Experimente erhalten wir folgende Durchschnittskurve:

\psfig {figure=rvmod2.ps,height=8cm,width=15cm}

Die Folge der Mittel schwanken mit wachsendem n immer weniger und ihr Pfad in der Darstellung strebt wohl gegen p=0.5. Die relative Häufigkeit geht gegen die vorher festgesetzte Wahrscheinlichkeit. Würde man den zutreffenden Parameter p nicht kennen, könnte man auch aufgrund dieses Bildes p=0.495 oder gerundet p=0.5 schätzen.

Konzept:
Das vorgeschlagene Schätzverfahren läßt sich auch unter der Überschrift Methode der Momente einführen, denn es wurde, wie folgt, vorgegangen: Setze das empirische Moment $\bar x$ in eine Beziehung ein, in der sowohl das theoretische Moment E(X) als auch der unbekannte Parameter vorkommen, und löse diese nach dem gesuchten Parameter auf:

\begin{displaymath}
\mbox{E}(X)=p \quad \Rightarrow \quad
p=\mbox{E}(X) \quad \Rightarrow \quad
p_{\mbox{gesch\uml atzt}}=\bar x.\end{displaymath}

Praxis:
Aus der Graphik läßt sich auch die Qualität der Schätzung erahnen. Für kleine Stichprobenumfänge (n<20) ist der Plot noch sehr unruhig. Damit wirkt ein entsprechender Schätzvorschlag nicht sehr vertrauensvoll. Erst mit größer werdenden n wird die Kurve glatter.

Konzept:
In der allgemeinen Situation ist p unbekannt. Dann will man wissen, wie gut ein Schätzvorschlag ist. Die Genauigkeit läßt sich durch die w-fache Wiederholung des beschriebenen Vorgehens demonstrieren.
Praxis:
Dazu läßt sich das letzte Experiment w -mal wiederholen. Für das folgende Bild erhielt w den Wert 20 und die anderen Parameter wurden wie oben festgesetzt.


[79:]

<<*>>=
<<lege Parameter {\tt p,n,ZZ} f\"ur wiederholte Bernoulli-Experimente fest>>
<<lege Wiederholungsanzahl {\tt w} fest>>
<<ziehe Stichprobe, zeichne Durchschnittskurven und ermittle Statistiken>>
Festlegung der Bedingungen fuer wiederholte Bernoulli-Experimente
Legen Sie die Erfolgswahrscheinlichkeit p fest (Default: 0.5): p=?
[1] 0.5
Legen Sie die Anzahl n der Bernoulli-Experimente fest
(Default: 200): n=?
[1] 200
Zufallsstart: Geben Sie eine ganze Zahl zwischen 0 und 1000 ein
(Default: 17): ZZ=?
[1] 17
Legen Sie die Anzahl w der Wiederholungen der n Versuche fest
(Default: 20): w=?
[1] 20

Mit diesen Setzungen erhalten wir w+1= 21 Pfade:

\psfig {figure=rvmod3.ps,height=8cm,width=15cm}

und außerdem für die Stelle k=200 die zusammenfassenden Statistiken:

  Min. 1st Qu. Median Mean 3rd Qu. Max.   Std.Dev.  n
 0.445    0.48    0.5  0.5    0.52 0.57 0.03365264 21

Konzept:
Der Plot zeigt die unvermeidliche Variabilität, die Stichproben innewohnt. Die einzelnen Pfade scheinen alle in etwa gegen das gemeinsame Ziel 0.5 zu streben. Jedoch ist für eine kleine Abweichung von p=0.5 schon ein erheblicher Stichprobenumfang einzusetzen. Die 21 berechneten durchschnittlichen Erfolgszahlen liegen in [0.445, 0.57] und erstrecken sich damit noch über einen recht großen Bereich. Zur näheren Untersuchung der Variabilität der Durchschnitte für ein festes k muß die Binomial-Verteilung herangezogen werden -- siehe dazu den nächsten Abschnitt. (Für $n\to \infty$ geht $p_{\mbox{gesch\uml atzt}}$ gegen p und die Variabilität gegen 0, so wie man es sich wünscht. Der Schätzer gehört in die Klasse der konsistenten Schätzer -- man wird diese Klasse im weiteren Verlauf der Statistik-Ausbildung kennenlernen.)

Serverdaten

Praxis:
Wir wollen uns jetzt wieder -- gestärkt durch eine Reihe von Erfahrungen mit Bernoulli-Experimenten -- den vorliegenden Daten zuwenden. Zunächst wollen wir p durch das Mittel der Minutendaten abschätzen.


[80:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
<<berechne zusammenfassende Statistiken von {\tt x}>>
Wir erhalten:
 Min. 1st Qu. Median    Mean 3rd Qu. Max.  Std.Dev.    n
    0       0      0 0.05972       0    1 0.2370538 1440
und können als Wert für den Parameter p den Wert 0.06 vorschlagen. Mit diesem p , mit n=1440=24*60 , mit ZZ=17 und mit w=20

können wir das letzte Bild wiederholen.

Wir erhalten dann als graphisches Ergebnis den linken der beiden folgenden Plots. (Die Bedeutung des rechten Plots wird etwas weiter unten dargelegt.)

\psfig {figure=rvmod4.ps,height=8cm,width=7.5cm}
\psfig {figure=rvmod5.ps,height=8cm,width=7.5cm}

Als Berechnungsergebnisse erhalten wir:

    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    Std.Dev.  n
 0.04931 0.05625 0.05972 0.06214 0.06597 0.08333 0.008569059 21

Die Pfade streben im Mittel einem Wert von ungefähr 6 % entgegen, wobei selbst für den großen Stichprobenumfang (n=1440) die errechneten Durchschnitte noch zwischen zirka 0.05 und 0.08 schwanken.

Konzept:
Die Wahrscheinlichkeit beträgt 6 %! oder Die Wahrscheinlichkeit liegt zwischen 0.05 und 0.08! kann nun auf die gestellte Frage Wie groß ist die Wahrscheinlichkeit, daß in der nächsten Minute ein Server-Zugriff stattfindet? geantwortet werden. Wir wollen jedoch noch untersuchen, ob die Modellierung durch wiederholte Bernoulli-Experiment mit konstantem p haltbar ist.

Praxis:
Dazu wollen wir den Pfad zeichnen, der sich aus den vorliegenden Daten ergibt, und mit den Pfaden aus dem letzten Experiment vergleichen. Zum besseren Vergleich ist dieser Plot schon rechts neben dem vorherigen abgedruckt worden. Hier folgen die notwendigen Anweisungen.


[81:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
<<plotte Durchschnitte f\"ur die ersten $k$ Elemente von {\tt x} gegen $k$>>
Gegenüber der Antwort müssen wir aufgrund des letzten Bildes einige Vorbehalte anmelden. Erstens zeigt das Bild bei genauer Inspektion einen Anstieg der Kurve ab k=500. Dieses stimmt mit der Beobachtung aus dem letzten Kapitel überein, daß die Verteilung der Belastung über den Tag hinweg nicht gleichmäßig ist. Ein p-Wert für morgens wird sich von einem für nachmittags oder abends unterscheiden. Damit ist die Modellierung der Minuten eines ganzen Tages mit Hilfe eines Bernoulli-Prozesses mit konstantem p nicht sehr geeignet. Zweitens dürften sich von Tag zu Tag Schwankungen ergeben, so daß nicht das Phänomen der Variabilität zwischen verschiedenen Tagen übersehen werden darf. Auf die gestellte Frage ist darum die Gegenfrage nach Tag und Uhrzeit berechtigt. Erhält man keine zusätzlichen Hinweise, muß man sich mit der dargestellten Modellierung zufrieden geben. Erst mit genaueren Angaben könnten bessere Daten(ausschnitte) ausgewählt und ein tages- und stundenspezifisches p vorgeschlagen werden.

Wenden wir uns nun der zweiten Frage dieses Kapitels zu. Damit erhalten wir nebenbei ein Instrumentarium zur Quantifizierung der Variabilitäten der Schätzungen.

Die Binomial-Verteilung -- In wie vielen Minuten einer Stunde ist mit Serverzugriffen zu rechnen?


[82:]

<<*>>=
cat("Revbook:4.d2:v.binom:Abschnitt Binomial-Verteilung\n")
Konzept:
Die Binomial-Verteilung liefert die Wahrscheinlichkeiten dafür, daß bei einer festen Anzahl n von unabhängigen Bernoulli-Experimenten mit gleichem p genau x Erfolge eintreten. Werden die Zufallsexperimente Servertätigkeit in der Minute $1, 2, \ldots$ durch Bernoulli-Experimente modelliert und wird zunächst unterstellt, daß diese unabhängig sind und sich der Parameter p nicht ändert, so führt die Frage der Überschrift zur Binomial-Verteilung. In diesem Abschnitt werden experimentell einige Eigenschaften der Binomial-Verteilung erkundet, und es wird dargestellt, welche Antwort sich ergeben würde, wenn die Minuten mit Serverzugriffen durch einen Bernoulli-Prozeß beschreibbar wären. Dann werden wieder Abweichungen zur realen Situation diskutiert. Zum Schluß werden noch einige Überlegung zu Schätzgenauigkeiten angestellt, wobei ein Kalkulator für Binomial-Verteilungen wertvolle Dienste leistet.

Praxis:
Die Bilder des letzten Abschnitts, in denen verschiedene Pfade eingezeichnet sind, weisen einen Weg zur Beantwortung der gestellten Frage. Eine Stunde hat 60 Minuten. Betrachtet man in den Pfadbildern jeweils die Stelle k=60, so sieht man für das gewählte p realisierte Anteile (in der Semantik des Beispiels: Anzahl der Minuten mit Zugriff / 60 Minuten). Die Anzahlen der Minuten -- und hiernach wird gefragt -- ergeben sich durch Multiplikation mit 60.

Konzept:
Solche Anzahlen sind unter gewissen Bedingungen binomialverteilt. Hier ist der Steckbrief der Binomial-Verteilung:
\fbox {
\begin{minipage}
{14cm}
\em Binomial-Verteilung \ [1ex]
Sind die Zufall...
 ...nd{displaymath}und es gilt E$(S_n)=np$\space und Var$(S_n)=npq$.\end{minipage}}

Stichproben aus dem Binomial-Modell

Wir wollen zunächst einige Erfahrungen mit der Binomial-Verteilung sammeln und dann zu der gestellten Frage zurückkommen. Bei 60 Bernoulli-Experimenten werden für p=0.5 ungefähr $np=60\times0.5=30$ Experimente mit Erfolg ausgehen. Doch mit wie starken Abweichungen muß gerechnet werden?

Praxis:
Wir wollen diese Frage wieder experimentell untersuchen. Dazu ziehen wir eine Stichprobe aus einer Binomial-Verteilung mit n=60 und p=0.5 . Die Stichprobe können wir mit uns schon vertrauten Beschreibungstechniken darstellen.


[83:]

<<*>>=
<<ziehe {\tt r} binomialverteilte Zufallszahlen mit {\tt n} und {\tt p}: {\tt x}>>
Praxis:
Wir wollen folgende Einstellungen wählen.
Stichprobe aus Binomial-Verteilung
[1] "Wie gross soll der Parameter n sein (Default: n=1)?"
1: 60
[1] "Wie gross soll der Parameter p sein (Default: p=0.5)?"
1: 0.5
[1] "Wie viele Zufallszahlen wollen Sie (Default: r=100)?"
1: 1000
[1] "Zufallsstartgeneratorstart (Default: ZZ=17)?"
1: 17

Wir ermitteln die Übersichtsstatistiken und erstellen Graphiken: Jitterplot, Boxplot, Stabdiagramm und die empirische Verteilungsfunktion.


[84:]

<<*>>=
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>
Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.    n
   17      28     30 30.08      33   41 3.867178 1000

Zu den oben genannten Experimentbedingungen erhält man die Graphik:

\psfig {figure=rvmod6.ps,height=10cm,width=15cm}

Die Verteilung scheint sehr symmetrisch zu sein. Die mittlere Erfolgsanzahl liegt (wie erwartet) bei 30 Erfolgen. Extreme Ausreißer scheinen nicht aufzutreten. Die meisten Realisationen liegen grob zwischen 20 und 40.

Nach dieser Vorübung steht ein auf unsere Situation angepaßtes Experiment auf der Tagesordnung. Eine Stichprobe aus einer Binomial-Verteilung mit n=60 und p=0.06, dem festgestellten Anteil von Minuten mit Serverzugriffen, führt zu folgendem Übersichtsplot.

Technik:
Dazu müssen natürlich die letzten zwei Sektionen geeignet wiederholt werden.

Praxis:

\psfig {figure=rvmod7.ps,height=8cm,width=15cm}

Im Unterschied zu den Ergebnissen mit p=0.5 zeigt der Boxplot eine gewisse Asymmetrie, wie dem Stabdiagramm zu entnehmen ist. Mittel und Median dürften deshalb auch deutlich voneinander abweichen.

Hier sind die Zahlen:

Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.    n
    0       2    3.5 3.621       5   12 1.825566 1000
Der Mittelwert und der Median sind fast gleich, dies ist eher ein Zeichen für Symmetrie. Da der Median genau in der Mitte zwischen den Quartilen liegt, geht die angedeutete Asymmetrie wesentlich auf die Schwänze der Verteilung zurück. Weiter läßt sich feststellen, daß die Spanne zwischen den Quartilen 3 beträgt, bei dem Experiment mit p=0.5 dagegen 6. Die Stichprobenstreuungen unterscheiden sich um einen Faktor größer als 2.

Konzept:
Kurzes Nachrechnen belegt, daß für p=0.5 die Wurzel aus der Varianz

\begin{displaymath}
\sqrt{np(1-p)}=\sqrt{60\times0.5\times0.5}=3.873\end{displaymath}

ergibt, für p=0.06 stellt sich dagegen nur

\begin{displaymath}
\sqrt{np(1-p)}=\sqrt{60\times0.06\times0.94}=1.840\end{displaymath}

ein. Damit ist die unterschiedliche Variabilität erklärlich.

Praxis:
Aus dem Stabdiagramm ist zu ersehen, daß die häufigsten Ergebnisse im Bereich von 1 bis 6 liegen. Überträgt man dieses auf das Serverproblem, so müßte eine zufällig gewählte Stunde zirka eine Minute bis 6 Minuten mit Servertätigkeit besitzen. Hierbei ist dann angenommen, daß p=0.06 der wahre Wert des Parameters ist, sich nicht ändert und keine Abhängigkeiten bestehen. Unter diesen Bedingungen stellen sich im Durchschnitt 3.6 Zugriffe pro Stunde ein.

Serverdaten

Wir wollen sehen, wie gut die Wirklichkeit damit erfaßt ist. Dazu werden wir die 24 Stunden vom 03.02.97 betrachten. Jede der 24 Stunden, die eine beobachtbare Anzahl der Minuten mit Servertätigkeit hervorbringt, kann als ein empirisches Experiment angesehen werden. Die Ergebnisse dieser Experimente lassen sich wie oben die Stichprobe aus der Binomial-Verteilung darstellen.


[85:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<berechne und plotte Minuten mit Zugriffen der Stunden von {\tt x}>>
Praxis:
Wir erhalten
Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.  n
    0    0.75    3.5 3.583       5   13 3.437854 24
sowie

\psfig {figure=rvmod8.ps,height=8cm,width=15cm}

Die Realität sieht -- wie wir schon erwartet haben -- wieder einmal etwas anders aus als die Theorie. Zwar gehören die Ergebnisse von 1 bis 6 zu den häufigeren Ergebnissen, jedoch ist das Ergebnis 0 extrem oft vertreten, und es gibt drei Stunden mit mehr als 8 Minuten, in denen Zugriffe stattfanden. Bis auf die Streuung belegen die berechneten Statistiken dagegen den Unterschied nicht.

Es könnte der Hinweis kommen, daß für einen fairen Vergleich die Anzahl der Wiederholungen r

im letzten Experiment mit der Stichprobe aus einer Binomial-Verteilung auf 24 festgesetzt werden muß. Deshalb wollen wir auch noch ein Bild und die zusammenfassenden Statistiken einer Stichprobe vom Umfang 24 aus Binomial(60,0.06) beisteuern.

\psfig {figure=rvmod10.ps,height=8cm,width=15cm}

Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.  n
    1       3      4 3.875       5    7 1.676241 24

In dem Bild ist gar kein Ergebnis mit 0 oder mehr als 7 Erfolgen zu erkennen. Damit ist die Spanne viel kleiner als bei den realen Daten, die ja auch verglichen mit dem Binomial-Verteilungsmodell eine viel zu große Streuung besitzen. Gibt es dafür eine Erklärung?

Konzept:
Durch ein Gedankenexperiment läßt sich ein Erklärungsversuch entwickeln. Wenn in jeder Stunde eines Tages der Parameter p einen unterschiedlichen Wert annehmen würde, so ergäben sich 24 Realisationen aus 24 verschiedenen Binomial-Verteilungen. Die unterschiedlichen Parameter und damit auch die unterschiedlichen Erwartungswerte der beteiligten Binomial-Verteilungen führen zu einer erhöhten Variabilität für die Mischung und wahrscheinlich auch für die konkrete Stichprobe. Dieses könnte sich in einem weiter auseinandergezogenen Stabdiagramm und einer erhöhten Stichprobenstreuung zeigen. Damit sind genau die Phänomene zu erwarten, die oben aufgedeckt worden sind. Sind die verschiedenen p-Werte sehr unterschiedlich, ist die Binomial-Verteilung kein gutes Modell. Jedoch in Phasen, in denen sich der Parameter p nicht oder kaum ändert, kann sie zur Beantwortung von Fragen über Wahrscheinlichkeiten für Erfolgsanzahlen eingesetzt werden. Auf die Diskussion der Unabhängigkeitsannahme wird an dieser Stelle verzichtet.

Konzept:
Wir wollen zum Abschluß dieses Abschnitts noch ein wenig über Genauigkeiten von Abschätzungen nachdenken. Hierdurch soll die oben aufgeworfene Frage zur Genauigkeit der Anteilsschätzung mit beantwortet werden. Anteile ergaben sich aus den Erfolgsanzahlen durch eine Division durch n. Die Erfolgsanzahlen sind bei Gültigkeit der Voraussetzungen binomialverteilt und besitzen eine Varianz von np(1-p). Da gilt: $ \mbox{Var}(aX)=a^2\mbox{Var}(X) $ ist die Varianz der Anteile gegeben durch

\begin{displaymath}
\sigma_A^2 =
\mbox{Var(Anteile)}=
\mbox{Var(Erfolgsanzahlen/{\tt{}
n}
)}=
np(1-p)/n^2 = p(1-p)/n\end{displaymath}

Als interpretierbares Maß ist die Standardabweichung $\sigma_A$, die Wurzel aus der Varianz, besser geeignet: $\sigma_A=\sqrt{p(1-p)/n}$.

Praxis:
Für n=200 -- wie in den ersten Graphiken -- und p=0.06 erhalten wir gerundet einen Wert von $\sigma_A=0.0168$.
Konzept:
Sehr viele Realisationen werden innerhalb des Intervalls $p\pm2\sigma_A$ liegen. (Diese Konstruktion ist ein durchaus üblicher Vorschlag.)
Praxis:
Für n=200 erhält man damit das Intervall (0.0264,0.0936) und für n=1440 (0.0475,0.0725). An diesen Zahlen läßt sich auch ablesen, daß man für eine hohe Genauigkeit (kleine Intervalle) einen großen Stichprobenumfang benötigt.

Ein Kalkulator für die Binomial-Verteilung

Technik:
Mit dem Werkzeug binomial.calculator lassen sich solche Berechnungen nachrechnen. Versuchen Sie, die Zahlen des letzten Absatzes zu verifizieren. (Vielleicht ist es eine Hilfe zu bemerken, daß der Kehrwert von 1440 ungefähr 0.0006944444 beträgt.)


[86:]

<<*>>=
<<aktiviere {\tt binomial.calculator}>>
Praxis:
Mit diesem Werkzeug läßt sich natürlich auch ermitteln, wie groß die Wahrscheinlichkeit dafür ist, daß für n=60 und p=0.06 eine Realisation von 0 oder größer als 6 zustande kommt. Der folgende Report soll das verdeutlichen:
[1] "binomial.calculator"
[1] "Bitte n eingeben! (Default: n=1) n=?"
1: 60
[1] "Bitte p eingeben! (Default: p=0.5) p=?"
1: 0.06
 E(X) Var(X)     sigma  E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
  3.6  3.384 1.8395652 -0.079130332  1.7604348  5.4395652   7.2791303
[1] "Auswahl von binomial.calculator"
items:
 a Ende
 b n eingeben
 c p eingeben
 d f(x) und F(x) berechnen
 e Quantile berechnen
 f Statistiken von a*X berechnen
 g Plot erstellen
Selection: d
[1] "Bitte x eingeben! x=?"
1: 0 6
3:
[1] "Werte der Wahrscheinlichkeitsfunktion:"
     x        f(x)
[1,] 0 0.024415814
[2,] 6 0.082667714
[1] "Werte der Verteilungsfunktion:"
     x        F(x)
[1,] 0 0.024415814
[2,] 6 0.932863863
[1] "Auswahl von binomial.calculator"
items:
 a Ende
 b n eingeben
 c p eingeben
 d f(x) und F(x) berechnen
 e Quantile berechnen
 f Statistiken von a*X berechnen
 g Plot erstellen
Selection: a
Die Wahrscheinlichkeit der Realisation 0 beträgt also ungefähr 2.5 % und die von einem Ergebnis größer 6 ungefähr 6.7 %.

Praxis:
Wir wollen die erarbeiteten Antworten kurz zusammenfassen. Wenn man nichts über den genauen Zeitpunkt der Stunde und über den Wochentag weiß, wird man zur Beantwortung der Frage In wie vielen Minuten einer Stunde ist mit Serverzugriffen zu rechnen? eine Binomial-Verteilung mit den Parametern p=0.06 und n=60 heranziehen. Mit diesem Modell kommt man zu der Antwort, daß ungefähr 3.6 Minuten mit Serverzugriffen zu erwarten sind. In über 90 % der Fälle wird sich bei Richtigkeit des Modells ein Ergebnis zwischen einer und sechs Minuten einstellen. Weiß man mehr über die fragliche Stunde, kann man ein verbessertes p wählen und wird zu besseren Ergebnissen kommen.

Konzept:
Die Binomial-Verteilung hat sich im letzten Teil der Ausführung als Instrument zur Abschätzung von der Qualität der Schätzung von p entpuppt. Weitergehende Gedanken sind aber im Rahmen dieser Einführung nicht vorgesehen.

Die geometrische Verteilung -- Wie viele Minuten muß man auf den nächsten Serverzugriff warten?


[87:]

<<*>>=
cat("Revbook:4.d3:v.geom:Abschnitt geometrische Verteilung\n")
Konzept:
Vom Mensch-ärgere-Dich-nicht-Spiel her kennt jeder die Frage: Wann kommt denn endlich die (nächste) Sechs? Andere Situationen -- wie: sechs Richtige beim Lotto, ein Sonnentag im Urlaub, der nächste Aktienkursanstieg, die erste Einladung zum Vorstellungsgespräch, der erste Nichtausfall eines Formel-1-Rennwagens, das Bestehen einer schweren Klausur, der erste männliche Nachwuchs und so weiter -- führen auch zu solchen Wartefragen. Deshalb ist die Beschäftigung mit Warteproblemen an sich überaus praxisrelevant. Wir wollen in diesem Abschnitt einige Eigenschaften der geometrischen Verteilung, die als erstes bei Fragen nach der Anzahl von Fehlversuchen bis zum ersten Erfolg ins Spiel gebracht wird, aufdecken und dann zu einer Antwort auf die Frage der Überschrift kommen. Im Rahmen der Diskussion wird ein Geometrischer Verteilungs-Kalkulator und ein Werkzeug zur optischen Prüfung der Verteilungsannahme zur Verfügung gestellt.

In der einfachsten Form der Wartezeitmodellierung wird die Zeit in Versuchen gemessen, und es wird für die Versuche ein Bernoulli-Prozeß unterstellt. In diesem Fall ist Wartezeit bis zum nächsten Erfolg geometrisch verteilt.

\fbox {
\begin{minipage}
{14cm}
\em Geometrische Verteilung \ [1ex]
Sind die Zu...
 ...d{displaymath}und es gilt E$(W)=q/p$\space und Var$(W)=q/{p^2}$.\end{minipage}}

Für p=0.5 müssen wir im Durchschnitt mit einem Fehlversuch (q/p=1) rechnen. Ist p=0.1, folgt: E(W)=q/p=0.9/0.1=9 und wir müssen uns auf eine Wartezeit von im Mittel 9 einstellen.

Stichproben aus geometrisch verteilten Grundgesamtheiten

Praxis:
Wir wollen zunächst für die Erfahrungssammlung Realisationen aus einer geometrisch verteilten Grundgesamtheit erzeugen und untersuchen. Dazu betrachten wir ein kleines graphisches Experiment, bei dem die Erfolgswahrscheinlichkeit p , die Anzahl der Wiederholungen n und der Start des Zufallszahlengenerators ZZ

gewählt werden müssen. Wir wollen im Rahmen der bisherigen Überlegungen p=0.06 sowie die Defaultwerte ZZ=17 und n=100 wählen.


[88:]

<<*>>=
<<ziehe {\tt n} geometrisch verteilte Zufallszahlen mit {\tt p}: {\tt x}>>
Nun lassen sich die Wartezeiten als horizontale Linien darstellen.


[89:]

<<*>>=
<<plotte {\tt x} als horizontale St\"abe>>

\psfig {figure=rvmod11.ps,height=6cm,width=9cm}

Zur Darstellung der simulierten Verteilung helfen einige schon eingesetzte Anweisungen.


[90:]

<<*>>=
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>

\psfig {figure=rvmod12.ps,height=8cm,width=15cm}

Mit Hilfe der zusammenfassenden Statistiken bekommen wir einen quantitativen Zugang.

Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.   n
    0       4     10 15.52      19  143 19.22513 100
Zunächst fällt die starke Asymmetrie der simulierten Verteilung ins Auge. Sowohl Boxplot als auch Jitterplot und Stabdiagramm sprechen eine eindeutige Sprache. In ganz wenigen Fällen muß man sehr lange warten. Da der Median 10 ist, liegt in 50 % die Wartezeit unter 11 Versuchen. Die Differenz zwischen Mittel und Median ist beträchtlich und ist zum Teil dem Ausreißer (?) 143 anzulasten. An dieser Stelle sei daran erinnert, daß die Darstellungen der Zwischenzugriffszeiten zu verwandten Bildern geführt haben. Wir werden darauf zurückkommen.

Falls die Annahmen des Modells zutreffen, kommen wir aufgrund der Simulationen zu der Antwort: Im Durchschnitt müssen wir ungefähr 16 Minuten warten, bis eine Minute mit einem Serverzugriff eintritt. In ungefähr 25 % der Fälle wird die Wartezeit jedoch weniger als 5 Minuten betragen.

Konzept:
Ob die Annahme des Verteilungsmodells gerechtfertigt ist, läßt sich einerseits an der Gegenüberstellung von simulierten und empirischen Plots begutachten. Andererseits können dazu spezielle Werkzeuge eingesetzt werden (siehe unten).

Serverdaten

Praxis:
Wie im vorherigen Abschnitt wollen wir zunächst schauen, wie die empirischen Gegenstücke zu den letzten Plots aussehen.


[91:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<berechne aus {\tt x} Wartezeiten in Minuten: {\tt x}>>
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>
Wir erhalten:

\psfig {figure=rvmod13.ps,height=8cm,width=15cm}

Zusammenfassende Statistiken
 Min. 1st Qu. Median  Mean 3rd Qu. Max. Std.Dev.  n
    0       1      6 15.44      13  407 45.21758 85

Die Grundstruktur stimmt in etwa. Jedoch ist die Variabilität doch noch um einiges größer als im Modell. Im besonderen ist das Maximum erheblich vom Zentrum der Daten entfernt.

Konzept:
Geht man von p=0.06 aus, so folgt für die Wahrscheinlichkeit einer Wartezeit von 407 Minuten:

\begin{displaymath}
P(W=407 \mid p=0.06) = p (1-p)^{407}= 0.00000000365\end{displaymath}

Dieses relativiert die Brauchbarkeit des Modells wieder ein wenig. Trotzdem wollen wir die geometrische Verteilung noch ein wenig näher studieren.

Da jedoch jedes passendere Modell auch komplizierter werden wird, wollen wir die geometrische Verteilung noch näher studieren.

Ein Kalkulator für die geometrische Verteilung

Technik:
Für Wahrscheinlichkeits-Berechnungen wie im letzten Absatz wollen wir wieder ein Kalkulationsprogramm anbieten. Probieren geht hier über studieren!


[92:]

<<*>>=
<<aktiviere {\tt geometric.calculator}>>

Ein Erkennungsplot zur geometrischen Verteilung

Konzept:
Als Alternative zur Überprüfung, ob das geometrische Verteilungsmodell paßt, wollen wir noch ein Werkzeug vorstellen. Für dieses verwenden wir zum einen eine interessante Eigenschaft der geometrischen Verteilung:
Die geometrische Verteilung besitzt kein Gedächtnis!
Bei dieser Aussage handelt es sich um eine verbale Interpretation eines formalen Zusammenhangs, denn für die geometrische Verteilung gilt für $x\ge x_0$:

Wenn man also schon x0-1 Versuche erfolglos gewartet hat, ist die Wahrscheinlichkeit, weniger als weitere x-x0 Versuche warten zu müssen, genauso groß wie die Wahrscheinlichkeit, ohne Bedingung x-x0 Versuche zu warten.

Zum anderen gilt:

\begin{displaymath}
P(W=x)=pq^x \quad
 \Rightarrow \quad
 \ln(P(W=x)) =
 \ln (p) + \ln(1-p)*x\end{displaymath}

Hiernach müßten die logarithmierten relativen Häufigkeiten, berechnet aus einer Stichprobe einer geometrisch verteilten Grundgesamtheit, gegen die Anzahl der Fehlversuche x geplottet um eine Gerade mit dem Achsenabschnitt $a=\log(p)$ und der Steigung $b=\log(1-p)$ streuen. Anhand des Plots können damit schon völlig zur geometrischen Verteilung unpassende Datensätze aussortiert werden.

Entfernt man dann die Wartezeitbeobachtungen, die kleiner als ein vorgegebener Wert x0 sind, so muß sich für den Rest nach Verschiebung um x0 wieder ein in etwa ähnliches Bild mit einer ähnlich gelagerten Geraden ergeben.

Praxis:
Wir wollen dieses Verfahren zuerst auf Daten mit bekannten Eigenschaften anwenden. Dazu ziehen wir eine Stichprobe vom Umfang n aus einer geometrisch verteilten Grundgesamtheit mit dem Parameter p , erstellen den beschriebenen Plot und schätzen aus dem Plot p ab. Dann wollen wir die Überschreitung der Wartezeit x.0 betrachten und Plot und Abschätzung wiederholen. Es müßte im wesentlichen dasselbe herauskommen.

Technik:
Die Experimentparameter n , p , x.0 und ZZ werden bei Ausführung der folgenden Anweisungen erfragt.


[93:]

<<*>>=
<<bereite Ged\"achnisexperiment vor und f\"uhre es durch>>
Praxis:
Mit den Setzungen
Stichprobe aus geometrischer Verteilung
[1] "Welches p wuenschen Sie (Default=0.5)? p=?"
1: .06
[1] "Welche Wiederholungsanzahl n wuenschen Sie (Default=100)? n=?"
1: 5000
[1] "Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?"
1: 17
[1] "Wie gross soll x.0 sein (Default: x.0=5)?"
1: 5

erhalten wir folgende Ergebnisse:

\psfig {figure=rvmod14.ps,height=6cm,width=9cm}

[1] "Plot und Daten aufgrund der Stichprobe"
 p aus Achsenabschnitt p aus Steigung
            0.05957634     0.05932194
[1] "Plot und Daten nach Modifikation"
 p aus Achsenabschnitt p aus Steigung
            0.05901169     0.05779475

Zum ersten Plot läßt sich feststellen, daß sehr viele Punkte ganz gut in der Nähe einer Geraden liegen. Dies kann als Beleg der Eignung des geometrischen Modells für die Stichprobendaten gelten. Im Bereich kleiner Wartezeiten streuen die Punkte weniger als in demjenigem großer Zeiten. Die Schätzungen aus dem ersten Plot kommen dem vorgegebenen p sehr nahe.

Die Ergebnisse zu dem zweiten Plot sind qualitativ nicht von den ersten zu unterscheiden. Also auch zu der modifizierten Stichprobe paßt -- wie erwartet -- ein geometrisches Modell und die Schätzungen des unbekannten Parameters fallen sehr ähnlich aus.

Serverdaten

Konzept:
Mit diesem Werkzeug wollen wir zum Abschluß der Diskussion der geometrischen Verteilung prüfen, wie gut die Wartezeit in Minuten auf die nächste Minute mit Serverzugriff zum geometrischen Modell paßt.
Praxis:


[94:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<berechne aus {\tt x} Wartezeiten in Minuten: {\tt x}>>
<<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>
\psfig {figure=rvmod15.ps,height=5cm,width=9cm}

[1] "Plot und Daten aufgrund der Stichprobe"
 p aus Achsenabschnitt p aus Steigung
           0.083944023    0.082995951
Die Punkte liegen nicht sehr überzeugend auf einer Geraden. Besonders der Ausreißer jenseits 400 paßt nicht ins Bild. Er wird natürlich wieder durch die lange Nachtpause verursacht.

Konzept:
Es sei angemerkt, daß sich die gewählte Prozedur zur Plazierung der Geraden von den Ausreißern nicht beeinflussen läßt. Bei dem oben verwendeten Vorschlag p=0.06 ging die lange Wartezeit jedoch ein, so daß hier das etwas größere Ergebnis 0.084 durchaus plausibel ist.

Praxis:
Nun wollen wir die Datenreduktions-Idee umsetzen.


[95:]

<<*>>=
<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>
<<berechne aus {\tt x} Wartezeiten in Minuten: {\tt x}>>
<<erfrage {\tt x.0}>>
<<ermittle und verschiebe die Werte von {\tt x} gr\"o{\ss}er {\tt x.0}: {\tt x}>>
<<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>
Wie man schnell durch Probieren herausfindet, macht nur ein kleiner x.0 -Wert Sinn. Für die Wahl x.0=2 :
Zeitpunkte vom 03.02.97 auf x ablegen
Serverzugriff pro Minute ermitteln
[1] "Welchen Wert fuer x.0 wuenschen Sie?"
1: 2

erhalten wir

\psfig {figure=rvmod16.ps,height=5cm,width=9cm}

sowie

Erkennungsplot fuer geometrische Verteilung
[1] "Plot und Daten aufgrund der Stichprobe"
 p aus Achsenabschnitt p aus Steigung
           0.049628984    0.025023162

Das Verfahren errechnet jetzt ganz andere Werte. Damit ist wieder eine gewisse Skepsis gegen die Modellierung mittels einer geometrischen Verteilung angebracht. Es sollte bei weitergehenden Interpretationen berücksichtigt werden, daß im Simulationsexperiment ein Stichprobenumfang von 5000 gewählt werden konnte, nach der Modifikation mit x.0=2 für den letzten Plot aber nur noch 63 Daten zur Verfügung stehen.

Besonders die letzten beiden Bilder regen sicher dazu an, die Modellierung zu verbessern. Wenn man sich vor Augen hält, daß die ursprünglichen Sekunden-Daten in Minuteninformationen überführt worden sind, könnte eine Modellierung mit feineren Zeiteinteilungen Verbesserungen bringen. Im nächsten Abschnitt wird diese Idee durch Unterstellung einer kontinuierlichen Zeit umgesetzt. Damit entfällt dann auch das Problem, mehrere (Zugriffs-)Ereignisse in einem Intervall nicht auswerten zu können.

In diesem Abschnitt wurde verschiedenes Material zur geometrischen Verteilung zur Verfügung gestellt. Mit diesem lassen sich geometrisch verteilte Zufallszahlen erzeugen und darstellen. Der geometric.calculator

ermöglicht Berechnungen rund um die geometrische Verteilung. Ein graphisches Werkzeug zur Prüfung des Verteilungsmodells wurde vorgestellt. Zur Frage der Überschrift Wie viele Minuten muß man auf den nächsten Serverzugriff warten? läßt sich antworten: Nach dem angepaßten Modell im Mittel etwas mehr als eine Viertelstunde, wobei in 50 % der Fälle 10 Minuten ausreichen sollten. Diese Ergebnisse werden dadurch relativiert, daß die Daten zum Teil erheblich unterschiedlicher Eigenschaften aufweisen als aus einer geometrischen Verteilung gezogene Daten.

Die Exponentialverteilung -- Wie lange muß man auf den nächsten Zugriff warten?


[96:]

<<*>>=
cat("Revbook:4.d4:v.exp:Abschnitt Exponentialverteilung\n")
Konzept:
Die Frage der Überschrift zwingt uns zur Auseinandersetzung mit einem kontinuierlichen Zeitbegriff. Wurde im letzten Abschnitt Zeit als eine Abfolge von Minuten aufgefaßt, wird sie nun als kontinuierliche Größe angenommen. Dieses führt formal zu einem Wechsel von diskreten zu stetigen Verteilungen.

In diesem Abschnitt wird als Pendant zur geometrischen Verteilung die Exponentialverteilung vorgestellt. Diese Verteilung eignet sich dazu, Wartezeitsituation zu modellieren, für die einige einfache Bedingungen erfüllt sind. Zunächst wird die Exponentialverteilung motiviert, dann werden Stichproben aus exponentialverteilten Grundgesamtheiten untersucht und ein Kalkulator für die Exponentialverteilung angeboten. Für die Zwischenzeiten des Servers wird untersucht, inwieweit eine Modellierung mit Hilfe der Exponentialverteilung angemessen ist und was letztlich auf die gestellte Frage geantwortet werden kann.

Die geometrische Verteilung zeichnet sich durch zwei sich bedingende Eigenschaften aus:

1.
Die Wahrscheinlichkeiten der geometrischen Verteilung bilden eine geometrische Folge.
2.
Die geometrische Verteilung besitzt kein Gedächnis.
Eine stetige Verteilung mit entsprechenden Eigenschaften könnte ein geeignetes Modell zur Modellierung von Wartezeiten sein. Wir wollen eine solche Verteilung aufspüren. Aus der Umformung

\begin{displaymath}
pq^x = pe^{\ln q^x} = pe^{x \ln q} = p e^{d x}\end{displaymath}

erkennt man, daß die Wahrscheinlichkeiten der geometrischen Verteilung auf einer Exponentialfunktion liegen. Es ist naheliegend, als Dichte f(x)=p ed x zu probieren. Damit f(x) eine Dichte ist, muß gelten:

\begin{displaymath}
\int_0^\infty f(x) dx = 1 \qquad \Rightarrow \qquad
p \gt 0\quad \mbox{und}\quad d =-p\end{displaymath}

Verwenden wir statt der Konstanten c den griechischen Buchstaben $\lambda$, so erhalten wir die übliche Schreibweise der Dichte der Exponentialverteilung.
\fbox {
\begin{minipage}
{14cm}
\em Exponentialverteilung \ [1ex]
Eine Zufallsv...
 ...^{-\lambda x}$, E$(X)=1/\lambda$\space und Var$(X)=1/\lambda^2$.\end{minipage}}
Wir wollen prüfen, ob diese Verteilung auch kein Gedächnis besitzt. Für x>x0 ergibt sich:

Damit besitzt die Exponentialverteilung die gewünschten Eigenschaften.

Stichproben aus dem Exponential-Modell

Praxis:
Wir wollen zunächst eine Stichprobe aus einer exponentialverteilten Grundgesamtheit ziehen und untersuchen.


[97:]

<<*>>=
<<ziehe Stichprobe aus einer Exponentialverteilung mit $\lambda$: {\tt x}>>
Mit den Setzungen
Stichprobenziehung -- Exponentialverteilung
[1] "Welches lambda wuenschen Sie (Default=1)? lambda=?"
[1] 1
[1] "Welchen Stichprobenumfang n wuenschen Sie (Default=100)? n=?"
[1] 100
[1] "Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?"
[1] 17
erhalten wir aufgrund der Anweisungen


[98:]

<<*>>=
<<plotte {\tt x} als horizontale St\"abe>>
den Plot Output:

\psfig {figure=rvmod17.ps,height=6cm,width=9cm}

Zur ersten Untersuchung der Stichprobe lassen sich bereits bekannte Anweisungen verwenden.


[99:]

<<*>>=
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- kontinuierlich>>
Wir erhalten als
Zusammenfassende Statistiken
      Min. 1st Qu. Median   Mean 3rd Qu.  Max. Std.Dev.   n
 0.0001549  0.2668 0.6735 0.9914   1.225 8.872 1.188518 100

und als Plot:

\psfig {figure=rvmod18.ps,height=11cm,width=15cm}

Ein Kalkulator für die Exponentialverteilung

Für Berechnungen rund um die Exponentialverteilung ist ein Werkzeug wünschenswert, mit dem sich Kalkulationen anstellen lassen. Hier ist es.


[100:]

<<*>>=
<<aktiviere {\tt exponential.calculator}>>
Die Auswahlpunkte, die dieses Werkzeug bietet, lassen sich aus folgendem Protokoll entnehmen.
[1] "exponential.calculator start"
[1] "Bitte lambda eingeben! (Default: lambda=1) lambda=?"
1: 10
E(X) Var(X) sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
 0.1   0.01   0.1        -0.1          0        0.2         0.3
[1] "Auswahl von exponential.calculator"
items:
 a Ende
 b lambda eingeben
 c f(x) und F(x) berechnen
 d Quantile berechnen
 e Statistiken berechnen
 f Plot erstellen
Selection: c
[1] "Bitte x eingeben! x=?"
1: 0.1 0.5 1
4:
[1] "Werte der Dichtefunktion und der Verteilungsfunktion:"
       x          f(x)       F(x)
[1,] 0.1 3.6787944e+00 0.63212056
[2,] 0.5 6.7379470e-02 0.99326205
[3,] 1.0 4.5399930e-04 0.99995460
[1] "Auswahl von exponential.calculator"
items:
 a Ende
 b lambda eingeben
 c f(x) und F(x) berechnen
 d Quantile berechnen
 e Statistiken berechnen
 f Plot erstellen
Selection: f
Die letzte Anweisung liefert eine Darstellung der Dichte.

\psfig {figure=rvmod22.ps,height=6cm,width=9cm}

Ein Erkennungsplot zur Exponentialverteilung

Konzept:
Nachdem wir uns mit dem bisherigen Angebot einen Eindruck von dem Verteilungsmodell und von Stichproben aus exponentialverteilten Grundgesamtheiten verschaffen konnten, wollen wir schauen, ob die Exponentialverteilung ein geeignetes Modell für die Zwischenzugriffszeiten vom 03.02.97 darstellt. Aufgrund der folgenden Umformungen erhalten wir ein Instrument für diese Fragen.

\begin{displaymath}
F(x)=1-e^{-\lambda x}
\quad \Rightarrow \quad
1-F(x)=e^{-\lambda x}
\quad \Rightarrow \quad
-\ln(1-F(x))={\lambda x}\end{displaymath}

Setzt man für F(x) die empirische Verteilungsfunktion ein und plottet die linke Seite gegen x, also $-\log(1-\hat F(x))$ gegen die sortierten Beobachtungen, so werden bei Eignung der Exponentialverteilung die Punkte nahe einer Geraden liegen. Die Steigung der Gerade sollte in etwa $\lambda$ entsprechen.

Serverdaten

Praxis:
In Anlehnung an diesen Gedankengang können wir mit den folgenden Anweisungen einen Erkennungsplot für die Zwischenzeiten vom 03.02.97 erstellen. Dabei werden für die Geradenschätzung nur die 80 % kleineren Beobachtungen verwendet.


[101:]

<<*>>=
<<lege Zwischenzeiten vom 03.02.97 auf {\tt x} ab>>
<<erstelle f\"ur {\tt x} Erkennungsplot zur Exponentialverteilung>>
Die Anweisungen führen zu dem Bild:

\psfig {figure=rvmod19.ps,height=11cm,width=15cm}

sowie einem Vorschlag für $\lambda$:

Exponential-Erkennungsplot
 lambda.dach
  0.001908848

Wieder sehen wir ein Bild, bei dem der bekannte Ausreißer eine gute Ausnutzung der Darstellungsfläche verhindert. Die Punkte liegen zum großen Teil in der Nähe der eingezeichneten Geraden.

Konzept:
Wir wollen den vorgeschlagenen Wert für $\lambda$ näher unter die Lupe nehmen. $\lambda$ läßt sich als Rate, als durchschnittliche Anzahl von Ereignissen interpretieren, die pro Zeiteinheit eintreten. Die kleine Größenordnung der Zahlen sollte übrigens keine Bedenken erregen, da eine Umskalierung der Zeitachse Abhilfe schaffen kann. Würden wir als Einheit Stunden wählen, so erhielten wir z.B. die Steigungen $3600\times 0.0019=6.84$.Bei $\lambda=6.84$ sind 6.84 Ereignisse pro Zeiteinheit (Stunde) zu erwarten. Als Wartezeit ist der Kehrwert der Rate $\lambda$ zu erwarten: 1/0.0019=526.32 Sekunden = 8.77 Minuten. Ist $\lambda$ groß, muß man in der Regel nur kurz auf das nächste Ereignis warten. Ist $\lambda$ klein, muß man eher länger warten und die Anzahl von eintreffenden Ereignissen pro Zeiteinheit ist eher klein. Über den ganzen Tag gesehen erhalten wir also ein Rate von knapp 7 Ereignissen pro Stunde. Hierbei sind -- wie oben erwähnt -- die 20 % längsten Pausen außer acht gelassen worden.

Nach den letzten Überlegungen müßte der Durchschnitt der Wartezeiten in dem Bereich um 500 Sekunden liegen. Wir wollen deshalb schnell noch einmal die wesentlichen Statistiken zu den Zwischenzeiten vom 03.02.97 auflisten.


[102:]

<<*>>=
<<berechne zusammenfassende Statistiken von {\tt x}>>
 Min. 1st Qu. Median  Mean 3rd Qu.  Max. Std.Dev.   n
    1    62.5    312 823.8   744.5 24450 2487.414 103
In der Tat liegt der oben berechnete Wert zwischen dem Median und dem Mittel des Datensatzes. Berechnet man umgekehrt den Kehrwert des Mittels, so erhält man 1/823.8=0.0012. Zur Rate 0.0012 gehört also eine durchschnittliche Wartezeit von 823.8 Sekunden oder zirka 13.7 Minuten. Über das Mittel aller Zwischenzeiten würde man also eine Rate 0.0012 vorschlagen.

Die Erkenntnis, die hinter den Berechnungen steckt, mag als eine Wiederholung schon bekannter Dinge angesehen werden. Jedoch können wir nun begrifflich besser mit den Phänomenen umgehen. Die Belastungsrate verkörpert die konzentrierte Antwort auf die zugrundeliegende Belastungsfrage.

Mit einem Exponential-Modell und einer Belastungsrate von $\lambda$=0.0019 können wir die Daten (bezogen auf Sekunden) einigermaßen beschreiben. Leider befriedigt dieses noch nicht völlig, da die Unterschiedlichkeit der Belastung über den Tag hinweg noch nicht faßbar wird. Verfeinerungen könnten darin bestehen, eine kompliziertere Verteilung heranzuziehen oder aber die Erkenntnis umzusetzen, daß es über einen Tag hinweg verschiedene Belastungsraten gibt. Wir wollen den zweiten dieser beiden Wege gehen und die Belastungsrate im Zeitablauf abschätzen.

Um sich verändernde Raten zu ermitteln, benötigen wir noch ein weiteres Instrument. Der hier angebotene Vorschlag geht nach folgenden Schritten vor:

1.
Betrachte anz aufeinanderfolgende Zugriffszeitpunkte.
2.
Ermittle die Zeitspanne vom ersten bis zum anz -ten Ereignis.
3.
Berechne hieraus eine Belastungsrate als Kehrwert der Zeitspanne.
4.
Wende die ersten drei Punkte auf alle möglichen Mengen von anz

aufeinanderfolgenden Zugriffszeitpunkten an.

5.
Wiederhole die ersten vier Punkte für unterschiedliche anz -Werte.
Die Idee wird in den folgenden Anweisungen umgesetzt. Die gewünschten Anzahlen anz sind einzugeben. Die berechneten Belastungen werden dann graphisch dargestellt.


[103:]

<<*>>=
<<ermittele Belastung anhand zusammenh\"angender Zugriffszeitpunkte>>
Praxis:
Mit den folgenden, systematisch variierten Anzahlen:
Belastungsrate im Zeitablauf
[1] "Geben Sie die Zahl der Ereignisse an, die zusammen betrachtet"
[1] "werden sollen! Es duerfen auch mehrere Werte (maximal 9 Werte)"
[1] "Zahlen eingegeben werden. (Default: 5 10 20)"
1: 4 7 10 15 20 25 35 45 55
erhalten wir 9 Plots:

\psfig {figure=rvmod21.ps,height=11cm,width=15cm}

Konzept:
Die Plots zeigen Belastungsschätzungen im Zeitablauf an. Wir sehen, daß die Anzahl der berücksichtigten Ereignisse einen großen Einfluß auf das Ergebnis hat. Je geringer die Anzahl anz , desto spitzer und höher werden die Spitzen. Je größer die Anzahl anz

gewählt wird, umso glatter und flacher wird der Plot. Wird sie zu klein gewählt, wird das Bild von zufällig nahe beieinanderliegenden Ereignissen beherrscht. Ist die Anzahl zu groß, werden Belastungswechsel verdeckt. Leider scheint es keine ausgezeichnete oder richtige Anzahl zu geben.

An dieser Stelle könnte das Werkzeug noch weiteren Verbesserungen unterzogen und es könnte auch ein Bezug zum Dichteschätzinstrument am Ende des Kapitels über multivariate Beschreibungstechniken gezogen werden. Dieses würde jedoch zu umfangreich sein und unterbleibt deshalb.

Praxis:
Wir wollen zum Abschluß dieses Abschnitts die gestellte Frage beantworten: Wie lange muß man auf den nächsten Zugriff warten? Aufgrund des Datenmaterials vom 03.02.97 läßt sich zunächst entgegnen, daß die Belastung und damit die Wartezeit stark von der Tageszeit abhängt. Unterbleibt eine nähere Zeitangabe, lautet die Antwort im Mittel 13.7 Minuten. Wird nach der Spitzenbelastung, also nach der Belastung zur Mittagszeit gefragt, kommen wir auf ein $\lambda=0.0035$ und damit auf eine durchschnittliche Wartezeit von $\lambda^{-1}=285$ Sekunden oder 4 Minuten und 45 Sekunden.

Die Poisson-Verteilung -- Wie viele Zugriffe werden sich in den nächsten 60 Minuten einstellen?


[104:]

<<*>>=
cat("Revbook:4.d5:v.pois:Abschnitt Poisson-Verteilung\n")
Für einen Systemverwalter ist die Frage nach der Wartezeit bis zum nächsten Ereignis höchstens eine vorgelagerte Frage. Wichtiger ist ihm, in welchen Zeiträumen sich wieviel tut. Anhand der Belastungsrate im Zeitablauf kann man schon stark belastete Zeiten ausmachen. Jedoch fehlt noch die Abschätzung für die Stärke der Beanspruchung oder spezieller für Ereignishäufigkeiten in vorgegebenen Zeitintervallen.

Schaut man zurück, so stellt man fest, daß in dem Abschnitt zur Binomial-Verteilung eine entsprechende Frage beantwortet wurde. Die Binomial-Verteilung liefert Wahrscheinlichkeiten für die Anzahlen von Erfolgen bei einer festen Anzahl von Versuchen. Hier interessieren wir uns für die Wahrscheinlichkeiten der Anzahlen von Ereignissen in einem festen Zeitintervall. Die gesuchte Verteilung müßte sich also wie folgt ergeben:

1.
Zerlege das Zeitintervall in kleinere Intervalle,
2.
Ermittele Erfolgswahrscheinlichkeiten für die kleineren Intervalle,
3.
Bestimme Wahrscheinlichkeit für die Erfolgsanzahl,
4.
Lasse die Länge der kleineren Intervalle gegen 0 gehen.

Bei diesem Prozeß wächst in der üblichen Symbolik der Binomial-Verteilung n an. Entsprechend muß pn, die Wahrscheinlichkeit, in einem kleinen Intervall ein Ereignis anzutreffen, kleiner werden. Da npn die erwartete Anzahl der Erfolge im Gesamtintervall ist, wollen wir sie auf $\lambda$ festsetzen. Dann folgt formal $p_n=\lambda/n$ und

Geht jetzt $n\to \infty$, folgt:

Insgesamt erhält man also:

\begin{displaymath}
\lim_{n\to \infty, p_n\to 0, np_n \to \lambda}
{n \choose x} p_n^x (1-p_n)^{n-x}
=
 \frac{\lambda^x}{x!}
 e^{-\lambda}\end{displaymath}

Dieses ist die Wahrscheinlichkeitsfunktion der Poisson-Verteilung.

\fbox {
\begin{minipage}
{14cm}
\em Poisson-Verteilung \ [1ex]
Eine Zufallsvari...
 ...\lambda$. \ Es gilt: E$(X)=\lambda$\space und Var$(X)=\lambda$.\end{minipage}}

Sind die Zwischenankunftszeiten exponentialverteilt mit dem Parameter $\lambda$, so lassen sich die Wahrscheinlichkeiten für die Anzahl von Ereignissen in einem Zeitintervall mit Hilfe der Poisson-Verteilung mit Parameter $\lambda$ berechnen. Dabei ist die Länge des Zeitintervalls durch das Intervall vorgegeben, auf das sich die Rate der Exponentialverteilung bezieht.

Stichproben aus dem Poisson-Modell

Auch hier wollen wir die Möglichkeit geben, Stichproben aus dem vorgestellten Modell zu ziehen.


[105:]

<<*>>=
<<ziehe Stichprobe aus einer Poisson-Verteilung mit $\lambda$: {\tt x}>>
Wir wollen im Anschluß an obige Diskussionen einmal einen großen Wert für $\lambda$ wählen und die Auswirkungen verfolgen. Genauer wähle man:
Stichprobenziehung -- Poisson-Verteilung
[1] "Welches lambda wuenschen Sie (Default=1)? lambda=?"
1: 10
[1] "Welchen Stichprobenumfang n wuenschen Sie (Default=100)? n=?"
1: 200
[1] "Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?"
1: 17

Zur Untersuchung der Stichprobe hilft:


[106:]

<<*>>=
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>
Diese Anweisungen liefern:

 Min. 1st Qu. Median Mean 3rd Qu. Max. Std.Dev.   n
    3       8     10 10.2      12   21 3.188701 200

und das Bild:

\psfig {figure=rvmod23.ps,height=9cm,width=10cm}

Der Mittelwert ist mit 10.195 dem Erwartungswert von 10 sehr nah. Die Verteilung wirkt fast symmetrisch, doch sind im Boxplot zwei Ausreißer ausgewiesen, die beide auf einer Seite liegen. Die relativen Häufigkeiten führen im Gegensatz zur empirischen Verteilungsfunktion der simulierten Daten nicht zu einem so gleichmäßigen Stabdiagramm, wie man das aufgrund der Wahrscheinlichkeitsfunktion vermutet kann (siehe dazu unten: poisson.calculator ).

Ein Erkennungsplot zur Poisson-Verteilung

Mit den Umformungen

läßt sich wieder von einer Stichprobe ausgehend ein Plot erstellen, in dem bei Eignung der Poisson-Verteilung die Punkte nahe der Geraden mit dem Achsenabschnitt $-\lambda$ und der Steigung $\ln\lambda$ liegen.

Hier sind die zugehörigen Anweisungen.


[107:]

<<*>>=
<<erstelle f\"ur {\tt x} Erkennungsplot zur Poisson-Verteilung>>
Wir erhalten für die Stichprobe aus der Poisson-Verteilung:

\psfig {figure=rvmod24.ps,height=6cm,width=9cm}

sowie

Poisson-Erkennungsplot
 lambda.dach1 lambda.dach2
    10.124575    10.141854
Für die Stichprobe finden wir den uns ja bekannten Parameter ziemlich genau wieder.

Ein Kalkulator für die Poisson-Verteilung

Zur Beantwortung der Frage, die diesem Abschnitt voransteht, benötigen wir einen Kalkulator zur Poisson-Verteilung. Dieser wird hier zur Verfügung gestellt. Sein Funktionsumfang entspricht dem der bisher vorgestellten Kalkulatoren.


[108:]

<<*>>=
<<aktiviere {\tt poisson.calculator}>>
Gehen wir einmal von der hohen Belastungsrate $\lambda=10$ (10 zu erwartende Ereignisse pro Stunde) aus, so erhalten wir folgende Wahrscheinlichkeiten.
[1] "poisson.calculator start"
[1] "Bitte lambda eingeben! (Default: lambda=1) lambda=?"
1: 10
 E(X) Var(X)    sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
   10     10 3.162278    3.675445   6.837722   13.16228    16.32456
[1] "Auswahl von poisson.calculator"
items:
 a Ende
 b lambda eingeben
 c f(x) und F(x) berechnen
 d Quantile berechnen
 e Statistiken berechnen
 f Plot erstellen
 Selection: c
[1] "Bitte x eingeben! x=?"
1:
[1] "Werte der Wahrscheinlichkeits- und der Verteilungsfunktion:"
       x        f(x)        F(x)
 [1,]  3 0.007566655 0.010336051
 [2,]  4 0.018916637 0.029252688
 [3,]  5 0.037833275 0.067085963
 [4,]  6 0.063055458 0.130141421
 [5,]  7 0.090079226 0.220220647
 [6,]  8 0.112599032 0.332819679
 [7,]  9 0.125110036 0.457929714
 [8,] 10 0.125110036 0.583039750
 [9,] 11 0.113736396 0.696776146
[10,] 12 0.094780330 0.791556476
[11,] 13 0.072907946 0.864464423
[12,] 14 0.052077104 0.916541527
[13,] 15 0.034718070 0.951259597
[14,] 16 0.021698794 0.972958390
[15,] 17 0.012763996 0.985722386
[16,] 18 0.007091109 0.992813495
[1] "Auswahl von poisson.calculator"
items:
 a Ende
 b lambda eingeben
 c f(x) und F(x) berechnen
 d Quantile berechnen
 e Statistiken berechnen
 f Plot erstellen
Selection: f

Der erstellte Plot sieht schon sehr normal aus ...

\psfig {figure=rvmod25.ps,height=5cm,width=9cm}

... Normal in dem Sinn, daß die Gestalt sehr stark der von der Normalverteilung entspricht. Mehr zur Normalverteilung erfahren Sie im nächsten Kapitel.

Serverdaten

Mit diesen Instrumenten kann der WWW-Server-Verwalter mit einem seiner Meinung nach geeigneten $\lambda$ eigene Berechnungen anstellen und die Frage beantworten: Wie viele Zugriffe werden sich in den nächsten 60 Minuten einstellen?

QQ-Plots

Konzept:
Es verwundert ein wenig, daß zum Vergleich von Datensätzen QQ-Plots eingeführt worden sind, in diesem Kapitel aber noch keinen Einsatz erfahren haben. Mit diesen läßt sich doch wohl auch prüfen, ob ein Datensatz zu einer bestimmten Verteilung paßt. In einem solchen QQ-Plot werden die empirischen Quantile ihren theoretischen Entsprechungen gegenübergestellt und als Punkte in einem Scatterplot dargestellt.

Praxis:
Wir wollen dieses Versäumnis nachholen und hierzu zum Abschluß des Kapitels ein Modul anbieten. Das Modul wird nach der gewünschten Verteilung fragen. Geeignete Parameter werden aus den Daten geschätzt, da sie in der Regel unbekannt sind.
Technik:
Ist das Modell vollkommen unpassend, kann es übrigens auch zu einem Fehler kommen, der hoffentlich keine weiteren Schwierigkeiten verursacht.


[109:]

<<*>>=
<<lege Zwischenzeiten vom 03.02.97 auf {\tt x} ab>>
<<erstelle zu {\tt x} einen QQ-Plot zur Modellpr\"ufung>>
Hier ist der Plot zu unserem Datensatz, der bei der Wahl Exponentialverteilung entsteht.

\psfig {figure=qqexp.ps,height=7cm,width=7cm}

Das entstandene Bild sieht dem Erkennungs-Plot aus dem Abschnitt zur Exponentialverteilung äußerst ähnlich. Warum ist das wohl so?

Aufgaben

Die Aufgaben sollen im wesentlichen unterstützt mit den Angeboten folgender Auswahl bearbeitet werden.


[110:]

<<*>>=
cat("Revbook:4.m:menu.mo:Menue Modellierungsschritte\n")
<<Auswahl zu den Aufgaben des Kapitels Modelle>>
Zur Information wieder das Auswahlmenü:
items:
 a Abbruch
 b lege Datensaetze zur Bearbeitung auf x ab
 c erzeuge Stichprobe x
 d modifiziere Datensaetze x
 e zeige x an, berechne Statistiken, stelle x dar
 f aktiviere Verteilungskalkulator
 g erstelle Verteilungs-Erkennungsplots
 h erstelle QQ-Plots zur Modellueberpruefung
 i erstelle Durchschnittskurven
 j ermittle Belastung im Zeitablauf
Selection:

a)
Berechnen Sie mit dem Binomial-Kalkulator die Wahrscheinlichkeit dafür, daß bei 10 Münzwürfen genau 5 mal Kopf fällt, daß bei 3 Würfelwürfen keine 6 erscheint und daß von 100 gebraucht gekauften Disketten höchstens 10 defekt sind, wenn eine einzelne mit einer Wahrscheinlichkeit von p=0.90 gebrauchsfähig ist.
b)
Wie viele Versuche benötigen Sie im Durchschnitt beim Mensch-ärgere-Dich-nicht-Spiel, um eine 6 zu bekommen. Wie groß ist die Wahrscheinlichkeit, länger als 3 Runden pausieren zu müssen.
c)
Telefongespräche treten mit einer Rate von $\lambda=5$ pro Stunde ein. Wie lange müssen Sie bis zum nächsten Anruf in 90 % der Fälle höchstens warten?
d)
Ein Skript habe im Schnitt 5 Druckfehler pro Seite. Wie groß ist die Wahrscheinlichkeit, eine fehlerfreie Seite zu bekommen? Wie viele fehlerfreie Seiten erwarten Sie für ein Skript vom Umfang 100 Seiten? Wie groß ist die Wahrscheinlichkeit, maximal 5 fehlerfreie Seiten zu bekommen?
e)
Ziehen Sie wiederholt Stichproben aus einer geometrischen Verteilung vom Umfang 100 mit dem Parameter p=0.5 und berechnen Sie jeweils die durchschnittlichen Fehlversuchsanzahlen. Berechnen Sie das Mittel dieser Durchschnitte. Liefert der zuletzt berechnete Durchschnitt einen Hinweis auf den Parameter p? Wieso? Welches p würden Sie vorschlagen?
f)
Ziehen Sie eine Stichprobe vom Umfang 1000 aus einer binomialverteilten Grundgesamtheit mit n=100 und p=0.7. Welche der drei Verteilungsmodelle: Geometrische Verteilung, Exponentialverteilung, Poisson-Verteilung paßt Ihrer Meinung nach am besten zu der Stichprobe. Fällt Ihnen auch eine Begründung ein?
g)
Ziehen Sie eine Stichprobe aus einer Exponentialverteilung mit $\lambda=0.1$.Zeichnen Sie einen Graphen, in dem die Durchschnitte bis einschließlich des k-ten Elementes der Stichprobe dargestellt werden (Durchschnittskurve). Gegen welchen Wert strebt Ihr gezeichneter Pfad? Warum? Variieren Sie den Stichprobenumfang, Zufallsstart und $\lambda$.Machen Sie einen Vorschlag für den erforderlichen Stichprobenumfang, wenn aus dem Durchschnitt der Stichprobenwerte $\lambda$ ermittelt werden soll.
h)
Wiederholen Sie mit den Daten vom 17.02.97 möglichst viele der Schritte, die in diesem Kapitel mit den Daten vom 03.02.97 vorgeführt wurden. Sammeln Sie Punkte der Bestätigung wie auch abweichende Erkenntnisse.
i)
Zählen Sie die Autos, die sich in 20 verschiedenen Rotphasen vor einer Ampel sammeln. Halten Sie außerdem die Zwischenzeiten zwischen den Ankünften fest. Welche Verteilung ist für die Anzahlen angemessen? Welche für die Wartezeiten auf das nächste Auto? Machen Sie Vorschläge für die Parameter.

Experimente zur Normalverteilung


[111:]

<<*>>=
cat("Revbook:5.a:start.nv:Kapitel Normalverteilung\n")
Zum Literaturstudium sei hingewiesen auf: [Autorenkollektiv: Kapitel 6], [Bamberg, Baur: Abschnitte über Binomialverteilung, Normalverteilung, den zentralen Grenzwertsatz], [Schlittgen: Kapitel über die Normalverteilung].

Konzept:
In diesem Kapitel wird nicht auf die Serverdaten zurückgegriffen, da im wesentlichen abstraktere Zusammenhänge den Gegenstand bilden.

Konzept:
Was wäre die Statistik ohne die Normalverteilung? Anders und wahrscheinlich ärmer! Wir wollen in diesem Abschnitt einige Argumente für ihre herausragende Rolle präsentieren und mit Hilfe von Experimenten demonstrieren.

Die Normalverteilung zur Approximation der Binomialverteilung

Praxis:
Stellen Sie sich vor, Sie würden das nächste Jahr jede Woche zwei Lottotips abgeben. Was meinen Sie, wie groß die Anzahl Ihrer Gewinne sein wird? Wie groß wird sie für 5 Jahre sein?
Konzept:
Da die Gewinnchance p für einen Tip ungefähr 0.02 beträgt, können Sie im Prinzip alle Fragen mit der Binomial(n=104,p=0.02)-Verteilung bzw. der Binomial(n=520,p=0.02)-Verteilung beantworten. (Sie können die folgenden Überlegungen gern mit einem genaueren Wert für p durchführen, den Sie dazu aber erst bestimmen müssen. Viel Spaß!) Ohne Rechner dürfte das jedoch schon einige Schwierigkeiten bereiten. Man benötigt dann ein Approximationswerkzeug. Mit der Normalverteilung steht ein solches zur Verfügung:
Theorem (De Moivre-Laplace): Es sei Xn binomialverteilt mit den Parametern n und p. Dann geht für $n\to \infty$ die Verteilung von

\begin{displaymath}
Y_n=\frac{X_n-np}{\sqrt{np(1-p)}} \end{displaymath}

gegen die Standardnormalverteilung:

\begin{displaymath}
P(Y_n\le x) \to \Phi(x) \qquad \mbox{f\uml ur alle }x\in {\cal R}
 \end{displaymath}

Der Quotient $\frac{X_n-np}{\sqrt{np(1-p)}}$ ist also approximativ N(0,1)-verteilt.
Damit ist die Anzahl der Gewinntips approximativ normalverteilt mit den Parametern $\mu=n\cdot p=1.04$ und $\sigma^2=n\cdot p(1-p)=1.02$.

Praxis:
Als nächstes sei daran erinnert, daß im Zusammenhang mit den Pfadplots des letzten Kapitels auf die Binomialverteilung verwiesen wurde. In einem solchen Plot wurden die durchschnittlichen Erfolgsanzahlen gegen die Anzahl der durchgeführten Bernoulli-Experimente als Linienzug abgetragen. Wiederholungen von Experimenten führten zu einer Vielzahl von Pfaden, die dann die Variabilität der Erfolgsquote visualisierten.

Konzept:
Es wurde argumentiert, daß zur Abschätzung der Variabilität der Erfolgsquote für ein bestimmtes n die Binomialverteilung hilfreich wäre. Dies gilt auch für die Beantwortung der Frage, wie groß n gewählt werden muß, um ein unbekanntes p ausreichend genau abschätzen zu können. Da bei solchen Fragestellungen das fragliche n relativ groß werden kann, ist die Approximation durch die Normalverteilung interessant.

Praxis:
Für den Anwender ist es sehr wichtig zu wissen, wie gut eigentlich die Approximation ist. Deshalb wollen wir hier ein Demonstrationsexperiment anbieten.
Technik:
In dem Experiment lassen sich die Parameter n und p der Binomialverteilung setzen. Dann werden die Wahrscheinlichkeitsfunktion der Binomialverteilung und der Dichtefunktion der Normalverteilung N($np,\sqrt{np(1-p)}$) in einer Graphik gezeigt. In einem zweiten Plot werden die Differenzen zwischen der Binomialverteilung und der Normalverteilung als senkrechte Stäbe visualisiert. Zwar macht das Theorem eine Aussage über Verteilungsfunktionen, doch sind verschiedene Betrachtungen auf der Ebene der Wahrscheinlichkeitsfunktion bzw. Dichte anschaulicher. Deshalb sind im ersten Plot nicht die Verteilungsfunktionen abgebildet worden. Für einen korrekten Vergleich muß man einen Stab der Wahrscheinlichkeitsfunktion (an der Stelle x0) mit der Fläche eines Streifens der Dichtefunktion (der von x0-1 bis x0 reicht) vergleichen. Für große Werte von np unterscheiden sich übrigens die Flächen der Streifen nicht sonderlich von den Werten der Dichtefunktion, so daß man durchaus den Fit von Wahrscheinlichkeitsfunktion und Dichtefunktion betrachten kann. In dem zweiten Plot sind die Differenzen zwischen den Stäben und den zugehörigen Streifen als vertikale Linien dargestellt. Zusätzlich ist im zweiten Plot durch Punkte eingetragen worden, welcher Fehler sich an den entsprechenden Stellen zwischen den Verteilungsfunktionen einstellt. Dieser Fehler ergibt sich aus Kumulation der einzelnen Fehler.


[112:]

<<*>>=
<<aktiviere Experiment zur Approximation von {\em Binom(n,p)} durch NV>>
Praxis:
Zu dem Beispiel mit n=104 und p=0.02 erhalten wir den folgenden graphischen Output.

\psfig {figure=nv1.ps,width=12cm,height=6cm}

Die Approximation könnte besser sein. Diese Erkenntnis steht nicht im Widerspruch zu allgemeinen Empfehlungen. Zum Beispiel werden im Statistik-Skript die Approximationsvoraussetzungen $np\ge 10$ und $n(1-p)\ge 10$ genannt. Offensichtlich ist die erste nicht erfüllt. Für 5 Jahre ist die Bedingung erfüllt und könnte verwendet werden. Dieses sollte der Leser am Rechner tun. Wie man schnell prüfen kann, führen p-Werte nahe 0.5 zu viel besseren Ergebnissen. Für n=104 und p=0.5 würde man zum Beispiel erhalten:

\psfig {figure=nv2.ps,width=12cm,height=6cm}

Konzept:
Binomialverteilungen mit p=0.5 besitzen Wahrscheinlichkeitsfunktionen, die um die Stelle x=np symmetrisch sind. Für gegebenes n ist die Verteilung um so asymmetrischer je weiter p von 0.5 entfernt liegt. Außerdem gilt, daß für einen festen Wert von p mit wachsendem n weniger asymmetrische Verteilungen resultieren. Hierdurch wird verständlich, daß für sehr kleine p-Werte für eine gute Approximation ein großes n erforderlich ist. Zum Schluß sei erwähnt, daß die Approximation durch eine sogenannte Stetigkeitskorrektur noch ein wenig verbessert werden kann. Was es damit auf sich hat, sei dem Leser als Literaturstudiums-Aufgabe gestellt.

Zur standardisierten Summe von Zufallsvariablen

Konzept:
Wenn man die Normalverteilung nur zur Approximation der Binomialverteilung verwenden könnte, wäre sie sicher nicht als Motiv für den 10-DM-Schein ausgesucht worden. Sie besitzt natürlich noch wichtigere Eigenschaften. Dazu stellen wir folgende Überlegung an: Eine binomialverteilte Zufallsvariable kann als Summe von Bernoulli-verteilten Zufallsvariablen aufgefaßt werden. Damit läßt sich mit der Normalverteilung die Verteilung einer Summe von speziellen Zufallsvariablen annähern. Hieraus ergibt sich die Frage, ob auch für andere Zufallsvariablen ein solcher Zusammenhang gefunden werden kann. Die Antwort liefert der zentrale Grenzwertsatz:
Theorem (Zentraler Grenzwertsatz): Es seien $X_1, X_2, \ldots, X_n$ identisch verteilte, unabhängige Zufallsvariablen mit E(Xi)=a und Var(Xi)=b2. Dann gilt:

\begin{displaymath}
\lim_{n\rightarrow\infty} P(Z\le z) =\Phi(z) \end{displaymath}

mit

\begin{displaymath}
Z=\frac{\sum X_i-na}{b\sqrt{n}}
 =\frac{1}{\sqrt{n}}\sum
 \frac{X_i-a}{b}
 =\frac{\bar X-a}{b/\sqrt{n}};\end{displaymath}

es konvergiert also die Verteilungsfunktion der standardisierten Summe bzw. des standardisierten Mittels dieser Zufallsvariablen mit steigender Summandenzahl gegen die Verteilungsfunktion der standardisierten Normalverteilung.
Die Prämissen dieses Satzes sind äußerst allgemein. Außerdem gibt es in der Statistik viele Situationen (wie zum Beispiel in der Testtheorie), in denen eine Frage auf die Summe von unabhängigen und identisch verteilten Zufallsvariablen zurückgeführt werden kann. Die Normalverteilung erlangt aus diesem Grund über den zentralen Grenzwertsatz aber auch aufgrund ihrer mathematischen Eigenschaften ihre herausragende Bedeutung.

Praxis:
In praktischen Situationen kann der zentrale Grenzwertsatz wieder als Approximationswerkzeug dienen. Stellen Sie sich vor, daß ein ordentlicher Buchhalter nach jedem Tanken die getankte Benzinmenge ordentlich in sein Fahrtenbuch schreibt, jedoch leider immer auf ganze Liter rundet. Nach 48 Tankvorgängen möchte er gern wissen, wie stark sich wohl die getankte Menge von der Summe seiner Volumeneinträgen unterscheidet, wie groß also der Fehler ist. Einzelne Fehler können mit einer Gleichverteilung modelliert werden, deren Erwartungswert als 0 und deren Varianz als 1/12 angenommen werden kann. Nach diesen Angaben läßt sich für die Summe der 48 Einzelfehler eine Normalverteilung mit Erwartung 0 und Standardabweichung 2 verwenden.

Die Qualität der Approximation hängt vom Stichprobenumfang wie auch von der Verteilung der Stichprobenvariablen ab. Um hierfür ein Gespür zu bekommen, folgt nun ein Experiment, in dem diese beiden Einflußgrößen gewählt werden können.

Technik:
Der Grundgedanke des Experimentes besteht darin, zu der gewählten Verteilung wiederholt Stichproben zu generieren und dann die empirische Verteilungsfunktion der standardisierten Stichprobenmittel und die Verteilungsfunktion der Standardnormalverteilung $\Phi$ in einem Plot darzustellen. In einem zweiten Plot werden zu den einzelnen Stichproben (aber höchstens 15) die Entwicklungen der Mittel dargestellt. Dazu wird zu jeder Stichprobe $X_1,\ldots,X_n$ jeweils $\sum_{j=1}^i X_j/i$ gegen i abgetragen. Auf diese Weise erhält man zu jeder Stichprobe einen Pfad. Aus der Menge der Pfade lassen sich Genauigkeitsvorstellungen entwickeln. Hier ist das Modul:


[113:]

<<*>>=
<<aktiviere Experiment zum zentralen Grenzwertsatz>>
Praxis:
Zu der Situation mit den Tankfüllungen ergibt sich als Dialog und Resultat:
Demonstration der Approximation von standardisierten
Stichprobenmitteln durch die Normalverteilung
Modell / Aus welcher Verteilung sollen
Stichproben gezogen werden (Default: Normalverteilung)?
items:
 a Abbruch/Ende
 b Normalverteilung
 c Exponentialverteilung
 d Gleichverteilung
 e Cauchy-Verteilung
 f Binomialverteilung
 g Poisson-Verteilung
Selection: d
Bitte Untergrenze der Gleichverteilung eingeben (Default: 0)!
1: -0.5
Bitte Obergrenze eingeben (Default: 1)!
1: 0.5
Bitte Umfang der einzelnen Stichproben eingeben! (Default: 5)
1: 48
Bitte Umfang der Wiederholungen eingeben! (Default: 100)
1: 100
Bitte Start des Zufallszahlengenerators eingeben! (Default: 13)
1: 13
...

\psfig {figure=nv3.ps,width=12cm,height=6cm}

Die empirische Verteilungsfunktion (durch Punkte markiert) liegt sehr nahe bei der von der Standardnormalverteilung (durchgezogene Linie). Daß dieses bei Verletzung der Annahmen des Satzes nicht so ist, zeigt der Plot, der sich bei der Cauchy-Verteilung mit zum Beispiel folgenden Setzungen ergibt:

Bitte Zentrum der Cauchy-Verteilung eingeben (Default: 0)!
1: 0
Bitte Skalenparameter eingeben (Default: 1)!
1: 1
Bitte Umfang der einzelnen Stichproben eingeben! (Default: 5)
1: 200
Bitte Umfang der Wiederholungen eingeben! (Default: 100)
1: 100
Bitte Start des Zufallszahlengenerators eingeben! (Default: 13)
1: 13
...

\psfig {figure=nv4.ps,width=12cm,height=6cm}

Man sieht, daß die Pfade immer wieder wie durch einen Impuls Sprünge machen. Am Plot der Verteilungsfunktionen erkennt man, daß sich besonders die Schwänze unterscheiden. Dazu sei angemerkt, daß bei vielen realen Problemsituationen den Schwänzen der Verteilungen eine besondere Bedeutung zukommt. Zum Beispiel werden sich die zentralen Überlegungen beim Testen von Hypothesen ausschließlich auf die Randbereiche von Verteilungen beziehen, so daß die Qualitäten einer Approximation wesentlich an den Schwanzenden festgemacht werden sollten.

Wir wollen es bei dieser Demonstration belassen und keine weiteren theoretischen Ausführungen anstellen. Es empfiehlt sich, Versuche mit der Exponenentialverteilung und kleinen Stichprobenumfängen und auch den diskreten Verteilungen mit kleineren und größeren Umfängen anzustellen.

Ein Normalverteilungskalkulator

Technik:
In diesem Abschnitt wollen wir ein Instrument bereitstellen, mit dem einige Berechnungen rund um die Normalverteilung durchgeführt werden können. Dieses Instrument wird mit dem folgenden Modul bereitgestellt. Zunächst sind Mittel und Standardabweichung/Varianz festzulegen, worauf ein kurzer Steckbrief des gewählten Modells ausgegeben wird. Danach kann man die Parameter neu wählen, Dichte- und Verteilungsfunktionswerte zu vorgegebenen x-Werten ermitteln, Quantile berechnen lassen oder das gewählte Modell verschieben oder skalieren. Im graphischen Fenster wird dabei immer der Zusammenhang zwischen dem gewählten Modell und der Standardnormalverteilung dargestellt. Die oberen beiden Graphiken beziehen sich auf das gewählte Normalverteilungsmodell, die unteren beiden auf die Standardnormalverteilung. In der Mitte wird der Transformationsprozeß visualisiert.


[114:]

<<*>>=
<<aktiviere Normalverteilungskalkulator>>
Praxis:
Als Beispiel wird im folgenden der Dialog gezeigt, der zu der Frage der Anzahl der zu erwartenden Gewinntips entstehen könnte. Dabei wurde auf eine Normalverteilung mit den Parametern $\mu=np=2.08$ und $\sigma^2=np(1-p)=2.04$ verwiesen. (Zwar ist unter diesen Bedingungen eine Normalapproximation schlecht, doch stört das hier nicht die Verwendung als Beispiel.)
[1] "normal.calculator start"
[1] "Bitte Mittel eingeben! (Default: mu=0) mu=?"
1:  2.08
[1] "sigma ist festzulegen!"
[1] "Wenn Sie"
[1] "  Standardabweichung eingeben wollen, bitte 0 eingeben,"
[1] "  Varianz            eingeben wollen, bitte 1 eingeben!"
[1] "  (Default -- leere Eingabe: 0)"
1:  1
[1] "Bitte VARIANZ festlegen! (Default: 1) sigma^2=?"
1:  2.04
 E(X) Var(X)    sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
 2.08   2.04 1.428286  -0.7765714  0.6517143   3.508286    4.936571
[1] "Auswahl von normal.calculator"
items:
 a Ende
 b Mittel festsetzen
 c Variabilitaet festlegen
 d f(x), F(x), (1-F(x)) berechnen
 e Quantile berechnen
 f X verschieben
 g X skalieren
Selection: d
[1] "Bitte x eingeben! x=?"
1:  1
 E(X) Var(X)    sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
 2.08   2.04 1.428286  -0.7765714  0.6517143   3.508286    4.936571
[1] "Dichte- und Verteilungsfunktion:"
     x     f(x)      F(x)    1-F(x)
[1,] 1 0.209864 0.2247793 0.7752207
[1] "Auswahl von normal.calculator"
In dem Dialog wurde zuerst das Modell fixiert. Dann wurde ermittelt, wie groß die Wahrscheinlichkeit ist, ein Gewinnlos zu bekommen. Der Kalkulator berechnete einen Wert von zirka 78 %. Das zugehörige Bild sieht wie folgt aus:

\psfig {figure=nv5.ps,width=10cm,height=10cm}

Es wurde oben schon deutlich, daß die Approximation nicht allzu gut ist. Natürlich sollte man bei dieser Konstellation nicht zur Approximation greifen. Genauere Ergebnisse bekommt man hier mit dem Binomial-Kalkulator. Der Fall Gewinnlose in 5 Jahren bleibt wieder dem Leser überlassen.

Für das Beispiel mit den Tankmengenfehlern ist eine Normalverteilung mit den Parameter $\mu=0$ und $\sigma=2$ zu verwenden. Mit dem folgenden Dialog wurde festgestellt, daß sich in 90 % aller Fälle der Fehler grob zwischen -3.3 und 3.3 bewegen wird.

[1] "normal.calculator start"
[1] "Bitte Mittel eingeben! (Default: mu=0) mu=?"
1:  0
[1] "sigma ist festzulegen!"
[1] "Wenn Sie"
[1] "  Standardabweichung eingeben wollen, bitte 0 eingeben,"
[1] "  Varianz            eingeben wollen, bitte 1 eingeben!"
[1] "  (Default -- leere Eingabe: 0)"
1: 0
[1] "Bitte STANDARDABWEICHUNG festlegen! (Default: 1) sigma=?"
1:  2
 E(X) Var(X) sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
    0      4     2          -4         -2          2           4
[1] "Auswahl von normal.calculator"
items:
 a Ende
 b Mittel festsetzen
 c Variabilitaet festlegen
 d f(x), F(x), (1-F(x)) berechnen
 e Quantile berechnen
 f X verschieben
 g X skalieren
Selection: e
[1] "Bitte Wahrscheinlichkeiten eingeben! F(x)=?"
[1] 0.05 0.95
 E(X) Var(X) sigma E(X)-2sigma E(X)-sigma E(X)+sigma E(X)+2sigma
    0      4     2          -4         -2          2           4
[1] "Quantile:"
     F(x)         x
[1,] 0.05 -3.289707
[2,] 0.95  3.289707
[1] "Auswahl von normal.calculator"
...
Dazu gehört das folgende Bild:

\psfig {figure=nv6.ps,width=10cm,height=10cm}

Aufgaben

Der aufmerksame Leser hat sicher schon verschiedene Aufgaben im Text entdeckt. Außerdem wimmelt es in den Lehrbüchern zur Statistik von Aufgaben zur Normalverteilung, so daß dem hier nichts mehr hinzuzufügen ist. Da in diesem Kapitel nur drei Module eingesetzt wurden, erscheint auch eine eigene Auswahlfunktion ein wenig übertrieben zu sein. So endet das Kapitel hier nun etwas abrupt.

Anhang

Menüaufruf, Endehinweis und Initialisierungsstart


[115:]

<<*>>=
cat("Revbook:0:MENU:allgemeines Menu\n")
cat("------------------------------\n")
cat("   Abk.:    lange Bezeichnung:\n")
cat("------------------------------\n")
activate.jump(menu.jump)


[116:]

<<*>>=
cat("------------------------------------\n")
cat(" Sie sind am Ende angekommen!")
cat(" Waehlen Sie einen neuen Startpunkt! \n")
cmds<-"sMENU"


[117:]

<<start>>=
print("Start der revbook-Initialisierung")
init.revbook()
revbook.obj.flag<-T
if(dev.cur()==1){
   if(exists("win.graph")) win.graph() else motif()
}
synchronize()

Anhang -- Maßzahlen


[118:]

<<start>>=
print("Start der Initialisierung - Kapitel Masszahlen - 2.10.97")


[119:]

<<lege Zwischenzeiten vom 03.02.97 auf {\tt x} ab>>=
cat("x <- dzeitpunkte.03.02.97\n")
x<-dzeitpunkte.03.02.97


[120:]

<<drucke {\tt x} aus>>=
cat("x ausdrucken\n")
print(x)


[121:]

<<berechne Mittelwert von {\tt x}>>=
cat("Mittelwert\n")
print(mean(x))


[122:]

<<berechne Median von {\tt x}>>=
cat("Median\n")
print(median(x))


[123:]

<<berechne Extrema von {\tt x}>>=
cat("Maximum\n")
print(max(x))
cat("Minimum\n")
print(min(x))


[124:]

<<berechne Midrange von {\tt x}>>=
cat("Midrange\n")
print((min(x)+max(x))/2)


[125:]

<<berechne getrimmtes Mittel von {\tt x}>>=
cat("getrimmtes Mittel\n")
cat("Wieviel Prozent sollen an jeder Seite enfernt werden?\n")
cat("  Eingabe:\n")
result<-mean(x,trim=min(.5,.01*c(scan(,0,n=1),0)[1]))
cat("  ergibt:\n")
print(result)


[126:]

<<berechne Trimean von {\tt x}>>=
cat("Trimean\n")
print(sum(c(0.25,0.5,0.25)*quantile(x,c(0.25,0.5,0.75))))


[127:]

<<berechne Spannweite von {\tt x}>>=
cat("Spannweite\n")
print(max(x)-min(x))


[128:]

<<berechne Stichprobenvarianz von {\tt x}>>=
cat("Stichprobenvarianz\n")
print(var(x))


[129:]

<<berechne Standardabweichung von {\tt x}>>=
cat("Stichprobenstandardabweichung\n")
print(var(x)^0.5)


[130:]

<<berechne Inter-Quartilsabstand von {\tt x}>>=
cat("Inter-Quartilsabstand\n")
print(as.vector(quantile(x,0.75)-quantile(x,0.25)))


[131:]

<<berechne zusammenfassende Statistiken von {\tt x}>>=
cat("Zusammenfassende Statistiken\n")
print(summary.stats(x))


[132:]

<<transformiere {\tt x} mittels Box-Cox-Transformation, zeige Statistiken>>=
cat("Statistiken der transformierten Daten\n")
xtrans<-box.cox.transformation(x)
print(summary.stats(xtrans))
print("Wollen Sie das Transformationsergebnis auf x ablegen (j/n)?")
if(readline()[1]=="j") x<-xtrans


[133:]

<<Auswahl zu den Aufgaben des ersten Kapitels>>=
auswahl.masszahlen()


[134:]

<<start>>=
<<initialisiere Auswahl zu den Aufgaben des Kapitels Ma{\ss}zahlen>>
print("Ende  der Initialisierung - Kapitel Masszahlen")

Anhang -- Graphiken


[135:]

<<start>>=
print("Start der Initialisierung - Kapitel Graphiken - 22.9.97")


[136:]

<<lege Zwischen-Zeitpunkte vom 03.02.97 auf {\tt x} ab>>=
cat("Zwischen-Zeitpunkte vom 03.02.97 als Daten -> x\n")
x<-dzeitpunkte.03.02.97


[137:]

<<erstelle graphische 5-Zahlen-Zusammenfassung von 1, 2, 3, 4, 5>>=
cat("Graphische 5-Zahlen-Zusammenfassung\n")
boxplot(1:5,range=0)


[138:]

<<erstelle graphische 5-Zahlen-Zusammenfassung von {\tt x}>>=
cat("Graphische 5-Zahlen-Zusammenfassung\n")
boxplot(x,range=0)


[139:]

<<erstelle Boxplot zu {\tt log(x)}>>=
cat("Boxplot der logarithmierten Daten\n")
boxplot(log(x))


[140:]

<<erstelle Boxplot zu {\tt x}>>=
cat("Boxplot\n")
boxplot(x)


[141:]

<<zeige die 10 kleinsten und die 10 gr\"o{\ss}ten Werte von {\tt x} an>>=
cat("10 kleinsten Werte von x:\n")
print(sort(x)[1:10])
cat("10 groessten Werte von x:\n")
print(rev(sort(x))[1:10])


[142:]

<<bilde Ausschnitt der Daten {\tt x}>>=
cat("Entfernung extremer Werte\n")
x<-remove.extreme.values(x)


[143:]

<<starte Erfahrungssammelfunktion zum Boxplot>>=
boxplotexp()


[144:]

<<erstelle Jitterplot zu {\tt x}>>=
cat("Jitterplot\n")
jitterplot(x)


[145:]

<<erstelle Stabdiagramm zu {\tt x}>>=
cat("Stabdiagramm\n")
stabdiagramm(x)


[146:]

<<erstelle H\"aufigkeitstabelle zu {\tt x}>>=
cat("Haeufigkeitstabelle von x\n")
print(table(x))


[147:]

<<erstelle spezielles Balkendiagramm zu {\tt x}>>=
cat("spezielles Balkendiagramm\n")
balkendiagramm(x,c(0,100,200,300,400,500,600,700,800,900,1000,5000))


[148:]

<<erstelle Stem-and-Leaf-Plot zu {\tt x}>>=
cat("Stem-and-Leaf-Plot\n")
stem.and.leaf(x)


[149:]

<<erstelle Histogramm zu {\tt x}>>=
cat("Histogramm\n")
histogramm(x)


[150:]

<<erstelle Histogramm zu {\tt x} mit Grenzen 0, 200, 400, ..., 5000>>=
cat("Histogramm\n")
hxh<-pmin(5000,pmax(0,x))
if(length(hxh)!=length(x))
    cat("Warnung: Werte wurden auf den Bereich [0,5000] reduziert!\n")
histogramm(hxh,breaks=seq(from=0,to=5000,by=200))


[151:]

<<erstelle Histogramm von {\tt x} mit manueller Wahl der Grenzen>>=
cat("Histogramm mit manuell eingegebenen Klassengrenzen")
print("Grenzen nach einander eingeben")
print("Nach Eingabe der letzten Klasse noch einmal: -> ENTER")
print("Hinweis: Alle Werte muessen sich innerhalb der Grenzen befinden!")
histogramm(x,breaks=sort(scan(,0)))


[152:]

<<erstelle Dichtespur zu {\tt x}>>=
cat("Dichtespur\n")
dichtespur(x)


[153:]

<<aktiviere interaktives Dichtespur-Sektion zu {\tt x}>>=
cat("interaktive Dichtespur\n")
dichtespur.interaktiv(x)


[154:]

<<erstelle F.dach von {\tt x}>>=
cat("Verteilungsfunktion\n")
F.dach(x)


[155:]

<<erstelle F.dach f\"ur klassierte Daten  zu {\tt x}>>=
cat("Empirischen Verteilungsfunktion -- klassierte Daten\n")
F.dach(x,breaks=seq(from=0,to=5000,by=40))


[156:]

<<erstelle emp. Verteilungsfunktion mit manueller Wahl der Grenzen zu {\tt x}>>=
cat("emp. Vtlgsfktn mit manuell eingegebenen Klassengrenzen")
print("Grenzen nach einander eingeben")
print("Nach Eingabe der letzten Klasse noch einmal: -> ENTER")
F.dach(x,breaks=sort(scan(,0)))


[157:]

<<befrage F.dach zu {\tt x} graphisch>>=
cat("Graphische Befragung der empirischen Verteilungsfunktion\n")
F.dach(x)
F.dach.look.up(x)


[158:]

<<Auswahl zu den Aufgaben des Kapitels \"uber Graphiken>>=
auswahl.graphiken()


[159:]

<<erstelle Box-Cox-Transformation f\"ur {\tt x}>>=
cat("Statistiken der transformierten Daten\n")
xtrans<-box.cox.transformation(x)
print(summary(xtrans))
print("Wollen Sie das Transformationsergebnis auf x ablegen (j/n)?")
if(readline()[1]=="j") x<-xtrans


[160:]

<<start>>=
<<initialisiere Auswahl zu den Aufgaben des Kapitels Graphiken>>
print("Ende  der Initialisierung - Kapitel Graphiken")

Anhang -- multivariate Beschreibungstechniken


[161:]

<<start>>=
print("Start der Initialisierung - Kapitel multivariate Graphiken - 5.8.97")


[162:]

<<lege Zwischenzeiten vom 03.02.97 und vom 17.02.97 auf {\tt xy} ab>>=
cat("Zusammenfassung von dzeitpunkte vom 03.02.97 und 17.02.97 auf xy\n")
xy<-list(dz.03.02.97=dzeitpunkte.03.02.97,
         dz.17.02.97=dzeitpunkte.17.02.97)


[163:]

<<berechne zusammenfassende Statistiken zu {\tt xy}>>=
cat("Berechnung der zusammenfassenden Statistiken von xy\n")
print(summary.stats(xy))


[164:]

<<erstelle Boxplot zu {\tt xy}>>=
cat("Boxplots zu xy\n")
boxplot(xy)


[165:]

<<bilde Ausschnitte der Komponenten von {\tt xy}>>=
cat("Entfernung extremer Werte\n")
xy<-remove.extreme.values(xy)


[166:]

<<zeichne Histogramme zu {\tt xy}>>=
cat("Histogramme zu xy\n")
print("Wie viele Klassen sind sollen gebildet werden?")
nclass<-c(scan(,0,n=1),7)[1]
histogramm(xy,nclass=nclass)


[167:]

<<zeichne zu {\tt xy} F.dach und f.dach>>=
cat("F.dach und f.dach zu xy[1:2]\n")
OLDPAR<-par(); par(mfrow=2:1)
<<zeichne {\tt F.dach} zu {\tt xy}>>
<<zeichne Dichtespuren zu {\tt xy}>>
par(OLDPAR)


[168:]

<<erstelle zu den ersten beiden Elementen von {\tt xy} einen QQ-Plot>>=
cat("QQ-Plot von xy[1:2]\n")
qqplot(xy{\tt 1},xy{\tt 2},xlab=getnames(xy)[1],ylab=getnames(xy)[2])
abline(0,1)


[169:]

<<zeige Bootstrap-Stichprobenverteilungen mit {\tt xy}>>=
cat("Bootstrap-Stichprobenverteilungen mit xy\n")
bootstrap.experiment(xy)


[170:]

<<zeige Verteilung einer Statistik von Bootstrap-Stichproben aus {\tt xy}>>=
bootstrap.experiment(xy,type="?")


[171:]

<<lege Zwischenzeiten und Mengen vom 03.02.97 auf {\tt xy} ab>>=
cat("Speicherung der dzeitpunkte und Mengen vom 03.02.97 auf xy\n")
xy<-cbind(dz.03.02.97=dzeitpunkte.03.02.97,m.03.02.97=mengen.03.02.97)
xy<-split(xy,col(xy))


[172:]

<<erstelle Scatterplot zu den ersten beiden Elementen von {\tt xy}>>=
cat("Scatterplot zu xy\n")
scatter(xy)


[173:]

<<transformiere Elemente von {\tt xy} mittels Box-Cox-Transformation>>=
cat("Box-Cox-Transformation von xy\n")
xy<-box.cox.transformation(xy)


[174:]

<<erstelle Scatterplot zu {\tt xy} und zeichne konvexe H\"ullen>>=
cat("Scatterplot von xy mit Huellen\n")
scatter(xy, hull=100)


[175:]

<<berechne Korrelationskoeffizienten der ersten beiden Elementen von {\tt xy}>>=
cat("Berechnung des Korrelationskoeffizienten zu xy\n")
print(cor(xy{\tt 1},xy{\tt 2}))


[176:]

<<lege Regenmengen und Kornertr\"age auf {\tt xy} ab>>=
cat("Regen- und Ertragsdaten auf xy ablegen\n")
xy<-list("Regen"=corn.rain,"Ertrag"=corn.yield)


[177:]

<<lege Regendatens\"atze auf {\tt xy} ab>>=
cat("Regendatensaetze auf xy ablegen\n")
xy<-list("Regen 1"=rain.nyc1,"Regen 2"=rain.nyc2)


[178:]

<<lege Zwischenzeiten vom 03.02.97 auf {\tt xy} ab>>=
cat("Zwischenzeiten vom 03.02.97 auf xy ablegen\n")
xy<-list(dzeitpunkte.03.02.97)


[179:]

<<ordne Daten von {\tt xy} in {\tt anz} gleich gro{\ss}e Klassen ein: {\tt xy}>>=
cat("xy in gleich grosse Klassen einteilen: xy\n")
xy<-split.in.eq.classes(xy)


[180:]

<<erstelle Draftsman's Display zu {\tt xy}>>=
pairs(matrix(unlist(xy),ncol=length(xy)),labels=as.character(1:length(xy)))


[181:]

<<lege Zwischenzeiten und Zeiten vom 03.02.97 auf {\tt xy} ab>>=
cat("Zwischenzeiten und Zeiten auf xy ablegen\n")
xy<-list(dzeitpunkte.03.02.97, zeitpunkte.03.02.97)


[182:]

<<ordne {\tt xy[1] }gem\"a{\ss} {\tt xy[2] }in {\tt anz} Klassen ein: {\tt xy}>>=
cat(paste(getnames(xy)[1],"gemaess",getnames(xy)[2]))
cat("in anz Klassen einteilen\n")
xy<-split.x.by.y(xy{\tt 1},xy{\tt 2})


[183:]

<<erstelle zum paarweisen Vergleich der Datens\"atze von {\tt xy} QQ-Plots>>=
cat("QQ-Plots zwischen den einzelnen Datensaetzen von xy\n")
qqpairsplot(xy)


[184:]

<<errechne Anzahlen der Stichproben von {\tt xy}>>=
cat("Anzahlen der Stichproben von xy\n")
print(lapply(xy,length))


[185:]

<<lege Zeitpunkte vom 03.02.97 auf {\tt xy} ab>>=
cat("Zeitpunkte vom 03.02.97 auf xy ablegen\n")
xy<-list(zeitpunkte.03.02.97)


[186:]

<<zeichne Jitterplot zu {\tt xy}>>=
jitterplot(xy)


[187:]

<<zeichne {\tt F.dach} zu {\tt xy}>>=
cat("F.dach zu xy zeichnen\n")
F.dach(xy)


[188:]

<<zeichne Dichtespuren zu {\tt xy}>>=
cat("Dichtespuren zu xy\n")
dichtespur(xy)


[189:]

<<rechne Sekunden in Tage, Stunden und Minuten um>>=
cat("Umrechnung von Sekunden in Tage, Stunden usw.")
print("Geben Sie die Sekunden ein!")
h<-c(scan(,0,n=1),0)[1]; ta<-floor(h/86400); h<-h%%86400;
st<-floor(h/3600); h<-h%%3600; mi<-floor(h/60); h<-h%%60
print(paste(ta,"Tage",st,"Stunden",mi,"Minuten",h,"Sekunden"))


[190:]

<<Auswahl zu den Aufgaben des Kapitels \"uber multivariate Graphiken>>=
auswahl.mgraphiken()


[191:]

<<begrenze Werte von {\tt xy}>>=
cat("Begrenzung extremer Werte von xy\n")
xy<-limit.values(xy)


[192:]

<<lege Datensatz von {\tt xy} auf {\tt x} ab>>=
cat("Speicherung einer Komponente auf x\n")
print("Der Datensatz besitzt die Komponenten")
print(getnames(xy))
print("Geben Sie die Nummer der Komponente an,")
print("die auf x abgelegt werden soll.")
n<-floor(c(scan(,0,n=1),0)[1])
if(1<=n&n<=length(xy)) x<-xy{\tt n}


[193:]

<<mache mit {\tt xy} Bootstrap-Experimente>>=
cat("Bootstrap-Experimente mit xy\n")
bootstrap.experiment(xy,type="?")


[194:]

<<entferne eine Komponenten aus {\tt xy}>>=
cat("Komponente von xy entfernen\n")
print(paste("xy besitzt",length(xy),"Komponenten"))
print("Welche Komponente soll entfernt werden?")
h<-c(scan(,0,n=1),0)[1]
xy{\tt h}<-NULL


[195:]

<<start>>=
<<initialisiere Auswahl zu den Aufgaben des Kapitels multivariate Graphiken>>
print("Ende  der Initialisierung - Kapitel multivariate Graphiken")

Anhang -- Modelle


[196:]

<<start>>=
print("Start der Initialisierung - Kapitel Modelle - 27.9.97")


[197:]

<<lege Zeitpunkte vom 03.02.97 auf {\tt x} ab>>=
cat("Zeitpunkte vom 03.02.97 auf x ablegen\n")
x<-zeitpunkte.03.02.97
Ein normaler Tag hat eine Länge von 86400 Sekunden.


[198:]

<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>=
cat("Aktivitaet pro Minute aus Sekundendaten ermitteln\n")
x<-(x%%86400)/60
x<-pmin(1,as.vector(table(cut(x,0:1440))))


[199:]

<<zeige die ersten Werte von {\tt x} an>>=
cat("Anfang von x anzeigen\n")
print("Wie viele Werte von x sollen angezeigt werden (Default=100)?")
print(x[1:c(scan(,0,n=1),min(100,length(x)))[1})


[200:]

<<lege Parameter {\tt p,n,ZZ} f\"ur wiederholte Bernoulli-Experimente fest>>=
cat("Festlegung der Bedingungen fuer wiederholte Bernoulli-Experimente\n")
cat("Legen Sie die Erfolgswahrscheinlichkeit p fest (Default: 0.5): p=?\n")
p<-c(scan(,0,n=1),0.5)[1]
cat("Legen Sie die Anzahl n der Bernoulli-Experimente fest\n")
cat("(Default: 200): n=?\n")
n<-c(scan(,0,n=1),200)[1]
cat("Zufallsstart: Geben Sie eine ganze Zahl zwischen 0 und 1000 ein\n")
cat("(Default: 17): ZZ=?\n")
ZZ<-c(scan(,0,n=1),17)[1]


[201:]

<<starte Bernoulli-Experimente, Bedingungen: {\tt n, p, ZZ}, Ergebnis: {\tt x}>>=
cat("Realisation von wiederholten Bernoulli-Experimenten\n")
set.seed(ZZ)
x<-rbinom(n,1,p)


[202:]

<<plotte Durchschnitte f\"ur die ersten $k$ Elemente von {\tt x} gegen $k$>>=
cat("Plot der Durchschnitte der ersten k Elemente gegen k\n")
h<-cumsum(x)/(1:length(x))
plot(c(1,length(x)),c(max(1,max(h)),min(0,min(h))),
     type="n",xlab="k",ylab="Durchschnitte")
lines(1:length(x), h)


[203:]

<<ziehe Stichprobe, zeichne Durchschnittskurven und ermittle Statistiken>>=
cat("Stichprobenziehung\n")
set.seed(ZZ)
x<-matrix(rbinom(n*(w+1),1,p),(w+1),n)
cat("(w+1)-facher Plot der Durchschnitte der ersten k Elemente gegen k\n")
plot(c(1,n),c(max(1,max(x)),0),type="n",xlab="k",ylab="Durchschnitte")
for(i in 1:(w+1)) lines(1:n, cumsum(x[i,])/(1:n))
cat("Berechnung der zusammenfassender Statistiken\n")
print(summary.stats(apply(x,1,sum)/n))


[204:]

<<lege Wiederholungsanzahl {\tt w} fest>>=
cat("Festlegung der Wiederholungsanzahl w\n")
cat("Legen Sie die Anzahl w der Wiederholungen der n Versuche fest\n")
cat("(Default: 20): w=?\n")
w<-c(scan(,0,n=1),20)[1]


[205:]

<<ermittle Anteil der Minuten mit Zugriffe, Ergebnis: {\tt p}>>=
cat("Ermittlung Anteil der Minuten mit Zugriffe\n")
p<-sum(x)/length(x)
cat(paste("Anteil der Minuten mit Zugriffsaktivitaet:",signif(p,3),"\n"))


[206:]

<<ziehe {\tt r} binomialverteilte Zufallszahlen mit {\tt n} und {\tt p}: {\tt x}>>=
cat("Stichprobe aus Binomial-Verteilung\n")
print("Wie gross soll der Parameter n sein (Default: n=1)?")
n<-c(scan(,0,n=1),1)[1]
print("Wie gross soll der Parameter p sein (Default: p=0.5)?")
p<-c(scan(,0,n=1),0.5)[1]
print("Wie viele Zufallszahlen wollen Sie (Default: r=100)?")
r<-c(scan(,0,n=1),100)[1]
print("Zufallsstartgeneratorstart (Default: ZZ=17)?")
ZZ<-c(scan(,0,n=1),17)[1]
set.seed(ZZ)
x<-rbinom(r,n,p)


[207:]

<<erstelle Jitterplot, Boxplot, Stabdiagramm und emp. Vtlsfkt zu {\tt x}>>=
par(mfrow=c(2,2))
<<erstelle Jitterplot zu {\tt x}>>
<<erstelle Boxplot zu {\tt x}>>
<<erstelle Stabdiagramm zu {\tt x}>>
<<erstelle F.dach von {\tt x}>>
par(mfrow=c(1,1))


[208:]

<<berechne und plotte Minuten mit Zugriffen der Stunden von {\tt x}>>=
<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
x<-apply(matrix(x,60,24),2,sum)
<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>


[209:]

<<aktiviere {\tt binomial.calculator}>>=
cat("Binomial-Kalkulator\n")
binomial.calculator()

Da die geometrische Zufallszahlen mit Hilfe von runif berechnet werden, sollte der Zufallszahlengeneratorstart von 13 verschieden sein. Andernfalls erhält man einen monotonen Jitterplot, bei dem der Start auch auf 13 gesetzt wird.


[210:]

<<ziehe {\tt n} geometrisch verteilte Zufallszahlen mit {\tt p}: {\tt x}>>=
cat("Stichprobe aus geometrischer Verteilung\n")
print("Welches p wuenschen Sie (Default=0.5)? p=?")
p<-c(scan(,0,n=1),.5)[1]
print("Welche Wiederholungsanzahl n wuenschen Sie (Default=100)? n=?")
n<-c(scan(,0,n=1),100)[1]
print("Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?")
ZZ<-c(scan(,0,n=1),17)[1]
set.seed(ZZ)
x<-rgeom(n,p)


[211:]

<<plotte {\tt x} als horizontale St\"abe>>=
cat("Plot von x als Staebe\n")
h<-length(x)
plot(c(0,max(x)+1),c(0,h), type="n",xlab="x",ylab="Index")
segments(0,1:h,x,1:h)


[212:]

<<berechne aus {\tt x} Wartezeiten in Minuten: {\tt x}>>=
<<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
<<ermittle aus {\tt x} Fehlversuche bis Erfolg {\tt ->x}>>


[213:]

<<ermittle aus {\tt x} Fehlversuche bis Erfolg {\tt ->x}>>=
x<-diff((1:length(x))[x==1])-1


[214:]

<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>=
<<erstelle Jitterplot, Boxplot, Stabdiagramm und emp. Vtlsfkt zu {\tt x}>>
<<berechne zusammenfassende Statistiken von {\tt x}>>


[215:]

<<aktiviere {\tt geometric.calculator}>>=
cat("geometrischer Kalkulator\n")
geometric.calculator()


[216:]

<<bereite Ged\"achnisexperiment vor und f\"uhre es durch>>=
<<ziehe {\tt n} geometrisch verteilte Zufallszahlen mit {\tt p}: {\tt x}>>
<<erfrage {\tt x.0}>>
par(mfrow=2:1)
<<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>
<<ermittle und verschiebe die Werte von {\tt x} gr\"o{\ss}er {\tt x.0}: {\tt x}>>
print("Plot und Daten nach Modifikation")
<<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>
par(mfrow=c(1,1))


[217:]

<<erfrage {\tt x.0}>>=
print("Wie gross soll x.0 sein (Default: x.0=5)?")
x.0<-c(scan(,0,n=1),5)[1]


[218:]

<<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>=
cat("Erkennungsplot fuer geometrische Verteilung\n")
print("Plot und Daten aufgrund der Stichprobe")
print(geom.p.est(x))


[219:]

<<ermittle und verschiebe die Werte von {\tt x} gr\"o{\ss}er {\tt x.0}: {\tt x}>>=
x_x[x>=x.0] - x.0


[220:]

<<ziehe Stichprobe aus einer Exponentialverteilung mit $\lambda$: {\tt x}>>=
cat("Stichprobenziehung -- Exponentialverteilung\n")
print("Welches lambda wuenschen Sie (Default=1)? lambda=?")
lambda<-c(scan(,0,n=1),1)[1]
print("Welchen Stichprobenumfang n wuenschen Sie (Default=100)? n=?")
n<-c(scan(,0,n=1),100)[1]
print("Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?")
ZZ<-c(scan(,0,n=1),17)[1]
set.seed(ZZ)
x<-rexp(n,lambda)


[221:]

<<plotte Stichprobe, berechne Statistiken zu {\tt x} --- kontinuierlich>>=
<<erstelle Jitterplot, Boxplot, Histogramm und emp. Vtlsfkt zu {\tt x}>>
<<berechne zusammenfassende Statistiken von {\tt x}>>


[222:]

<<erstelle Jitterplot, Boxplot, Histogramm und emp. Vtlsfkt zu {\tt x}>>=
par(mfrow=c(2,2))
<<erstelle Jitterplot zu {\tt x}>>
<<erstelle Boxplot zu {\tt x}>>
<<erstelle Histogramm zu {\tt x}>>
<<erstelle F.dach von {\tt x}>>
par(mfrow=c(1,1))


[223:]

<<aktiviere {\tt exponential.calculator}>>=
cat("Exponential-Kalkulator\n")
exponential.calculator()


[224:]

<<erstelle f\"ur {\tt x} Erkennungsplot zur Exponentialverteilung>>=
cat("Exponential-Erkennungsplot\n")
print(identify.exp(x))


[225:]

<<ermittele Belastung anhand zusammenh\"angender Zugriffszeitpunkte>>=
interval.est.lambda(x)


[226:]

<<ziehe Stichprobe aus einer Poisson-Verteilung mit $\lambda$: {\tt x}>>=
cat("Stichprobenziehung -- Poisson-Verteilung\n")
print("Welches lambda wuenschen Sie (Default=1)? lambda=?")
lambda<-c(scan(,0,n=1),1)[1]
print("Welchen Stichprobenumfang n wuenschen Sie (Default=100)? n=?")
n<-c(scan(,0,n=1),100)[1]
print("Welchen Zufallsgeneratorstart ZZ wuenschen Sie (Default=17)? ZZ=?")
ZZ<-c(scan(,0,n=1),17)[1]
set.seed(ZZ)
x<-rpois(n,lambda)


[227:]

<<erstelle f\"ur {\tt x} Erkennungsplot zur Poisson-Verteilung>>=
cat("Poisson-Erkennungsplot\n")
print(identify.pois(x))


[228:]

<<aktiviere {\tt poisson.calculator}>>=
cat("Poisson-Kalkulator\n")
poisson.calculator()


[229:]

<<erstelle zu {\tt x} einen QQ-Plot zur Modellpr\"ufung>>=
cat("QQ-Plot\n")
qq.x.model(x)


[230:]

<<Auswahl zu den Aufgaben des Kapitels Modelle>>=
auswahl.modelle()


[231:]

<<start>>=
<<initialisiere Auswahl zu den Aufgaben des Kapitels Modelle>>
print("Ende  der Initialisierung - Kapitel Modelle")

Anhang -- Normalverteilung


[232:]

<<start>>=
print("Start der Initialisierung - Kapitel Normalverteilung - 2.10.97")


[233:]

<<aktiviere Experiment zur Approximation von {\em Binom(n,p)} durch NV>>=
cat("Demonstration der Approximation der Binomialverteilung durch\n")
cat("die Normalverteilung\n")
demo.Laplace()


[234:]

<<aktiviere Experiment zum zentralen Grenzwertsatz>>=
cat("Demonstration der Approximation von standardisierten\n")
cat("Stichprobenmitteln durch die Normalverteilung\n")
demo.zgws()


[235:]

<<aktiviere Normalverteilungskalkulator>>=
cat("Aktivierung des Normalverteilungskalkulators\n")
normal.calculator()


[236:]

<<start>>=
print("Ende  der Initialisierung - Kapitel Normalverteilung")

Auswahlfunktion zum Kapitel Maßzahlen


[237:]

<<initialisiere Auswahl zu den Aufgaben des Kapitels Ma{\ss}zahlen>>=
auswahl.masszahlen<-function(){
 eval(local=sys.parent(),expression=parse(text=
  'repeat{
    switch(Menu(
                c(
                  "Abbruch/Ende",
                  "lege Daten auf  x  ab",
                  "zeige  x  an",
                  "zeige Rangwertreihe von  x  an",
                  "berechne Mittelwert",
                  "berechne Median",
                  "berechne Extrema",
                  "berechne Midrange",
                  "berechne getrimmtes Mittel",
                  "berechne Trimean",
                  "berechne Stichprobenvarianz",
                  "berechne Standardabweichung",
                  "berechne Inter-Quartilsabstand",
                  "berechne zusammenfassende Statistiken",
                  "transformiere mittels Box-Cox-Transformation"),
                report=T),
             { break
           },{ <<lege Daten auf {\tt x} ab>>
           },{ <<zeige x an>>
           },{ <<zeige Rangwertreihe von x an>>
           },{ <<berechne Mittelwert von {\tt x}>>
           },{ <<berechne Median von {\tt x}>>
           },{ <<berechne Extrema von {\tt x}>>
           },{ <<berechne Midrange von {\tt x}>>
           },{ <<berechne getrimmtes Mittel von {\tt x}>>
           },{ <<berechne Trimean von {\tt x}>>
           },{ <<berechne Stichprobenvarianz von {\tt x}>>
           },{ <<berechne Standardabweichung von {\tt x}>>
           },{ <<berechne Inter-Quartilsabstand von {\tt x}>>
           },{ <<berechne zusammenfassende Statistiken von {\tt x}>>
           },{
     <<transformiere {\tt x} mittels Box-Cox-Transformation, zeige Statistiken>>
           }
    )
   }'))
}


[238:]

<<lege Daten auf {\tt x} ab>>=
    switch(Menu(
                c("Abbruch/Ende",
                  "Zeitdifferenzen vom 03.02.97",
                  "Zeitdifferenzen vom 17.02.97",
                  "Datenmengen vom 03.02.97",
                  "Datenmengen vom 17.02.97",
                  "Datenmengen/Zeitdifferenzen vom 03.02.97",
                  "Datenmengen/Zeitdifferenzen vom 17.02.97",
                  "Merkmal aus Studentenumfrage 1995",
                  "Merkmal aus Studentenumfrage 1996",
                  "Merkmal aus Studentenumfrage 1997"
                 )
           ),
           "",
           x<-dzeitpunkte.03.02.97,
           x<-dzeitpunkte.17.02.97,
           x<-mengen.03.02.97,
           x<-mengen.17.02.97,
           x<-mengen.03.02.97/dzeitpunkte.03.02.97,
           x<-mengen.17.02.97/dzeitpunkte.17.02.97,
           x<-select.spalte(frabo95),
           x<-select.spalte(frabo96),
           x<-select.spalte(frabo97)
    )


[239:]

<<zeige x an>>=
cat("Daten x: \n")
print(x)
outin()


[240:]

<<zeige Rangwertreihe von x an>>=
cat("Rangwertreihe von x: \n")
print(sort(x))
outin()

Auswahlfunktion zum Kapitel Graphiken


[241:]

<<initialisiere Auswahl zu den Aufgaben des Kapitels Graphiken>>=
auswahl.graphiken<-function(){
 eval(local=sys.parent(),expression=parse(text=
 'repeat{
     switch(Menu(
              c("Abbruch/Ende",
                "lege Daten auf {\tt x} ab",
                "bilde Ausschnitt der Daten",
                "erstelle graphische 5-Zahlen-Zusammenfassung",
                "erstelle Boxplot",
                "erstelle Jitterplot",
                "erstelle Stabdiagramm",
                "erstelle Haeufigkeitstabelle",
                "erstelle Stem-and-Leaf-Plot",
                "erstelle Histogramm",
                "erstelle Histogramm mit manuellen Grenzen",
                "erstelle Dichtespur",
                "aktiviere interaktives Dichtespur-Sektion",
                "erstelle F.dach",
                "erstelle F.dach mit manuellen Grenzen",
                "befrage F.dach graphisch",
                "transformiere mittels Box-Cox-Transformation"),
              report=T ),
             { break
           },{ <<lege Daten f\"ur Kapitel Graphiken auf {\tt x} ab>>
           },{ <<bilde Ausschnitt der Daten {\tt x}>>
           },{ <<erstelle graphische 5-Zahlen-Zusammenfassung von {\tt x}>>
           },{ <<erstelle Boxplot zu {\tt x}>>
           },{ <<erstelle Jitterplot zu {\tt x}>>
           },{ <<erstelle Stabdiagramm zu {\tt x}>>
           },{ <<erstelle H\"aufigkeitstabelle zu {\tt x}>>
               outin()
           },{ <<erstelle Stem-and-Leaf-Plot zu {\tt x}>>
               outin()
           },{ <<erstelle Histogramm zu {\tt x}>>
           },{ <<erstelle Histogramm von {\tt x} mit manueller Wahl der Grenzen>>
           },{ <<erstelle Dichtespur zu {\tt x}>>
           },{ <<aktiviere interaktives Dichtespur-Sektion zu {\tt x}>>
           },{ <<erstelle F.dach von {\tt x}>>
           },{
 <<erstelle emp. Verteilungsfunktion mit manueller Wahl der Grenzen zu {\tt x}>>
           },{ <<befrage F.dach zu {\tt x} graphisch>>
           },{ <<erstelle Box-Cox-Transformation f\"ur {\tt x}>>
           } )
 }'))
}


[242:]

<<lege Daten f\"ur Kapitel Graphiken auf {\tt x} ab>>=
    switch(Menu(
                c("Abbruch/Ende",
                  "Zeitdifferenzen vom 03.02.97",
                  "Zeitdifferenzen vom 17.02.97",
                  "logarithmierte Datenmengen vom 03.02.97",
                  "logarithmierte Datenmengen vom 17.02.97",
                  "Datenmengen vom 03.02.97",
                  "Datenmengen vom 17.02.97",
                  "Datenmengen/Zeitdifferenzen vom 03.02.97",
                  "Datenmengen/Zeitdifferenzen vom 17.02.97",
                  "Merkmal aus Studentenumfrage 1995",
                  "Merkmal aus Studentenumfrage 1996",
                  "Merkmal aus Studentenumfrage 1997"
                  )
           ),
           "",
           x<-dzeitpunkte.03.02.97,
           x<-dzeitpunkte.17.02.97,
           x<-log(mengen.03.02.97),
           x<-log(mengen.17.02.97),
           x<-mengen.03.02.97,
           x<-mengen.17.02.97,
           x<-mengen.03.02.97/dzeitpunkte.03.02.97,
           x<-mengen.17.02.97/dzeitpunkte.17.02.97,
           x<-select.spalte(frabo95),
           x<-select.spalte(frabo96),
           x<-select.spalte(frabo97)
    )

Auswahlfunktion zum Kapitel Multivariate Beschreibungstechniken


[243:]

<<initialisiere Auswahl zu den Aufgaben des Kapitels multivariate Graphiken>>=
a<-auswahl.mgraphiken<-function(){
 eval(local=sys.parent(),expression=parse(text=
 'repeat{
     switch(Menu(
              c(
                 "Abbruch/Ende",
                 "lege Datensaetze zur Bearbeitung auf xy ab",
                 "modifiziere Datensaetze xy",
                 "lege einen Datensatz von xy auf x ab",
                 "ermittle einige Ma{\ss}zahlen zu xy",
                 "erstelle Boxplot zu xy",
                 "erstelle Jitterplot zu xy",
                 "zeichne Histogramme zu xy",
                 "zeichne Dichtespuren zu xy",
                 "zeichne F.dach zu xy",
                 "zeichne zu xy F.dach und f.dach",
                 "erstelle Scatterplot zu den ersten beiden Elementen von xy",
                 "erstelle Scatterplot zu xy und zeichne konvexe Huellen",
                 "erstelle zu xy[1:2] einen QQ-Plot",
                 "erstelle Draftsmans Display zu xy",
                 "erstelle zum paarweisen Vergleich von xy QQ-Plots",
                 "mache mit xy Bootstrap-Experimente",
                 "Kontingenztabellenfunktion mit xy"
                 ),
              report=T ),
     { break
   },{ <<lege Daten f\"ur Kapitel multivariate Graphiken auf {\tt xy} ab>>
   },{ <<modifiziere Daten {\tt xy}>>
   },{ <<lege Datensatz von {\tt xy} auf {\tt x} ab>>
   },{ <<ermittle einige Ma{\ss}zahlen zu {\tt xy}>>
       out.in()
   },{ <<erstelle Boxplot zu {\tt xy}>>
   },{ <<zeichne Jitterplot zu {\tt xy}>>
   },{ <<zeichne Histogramme zu {\tt xy}>>
   },{ <<zeichne Dichtespuren zu {\tt xy}>>
   },{ <<zeichne {\tt F.dach} zu {\tt xy}>>
   },{ <<zeichne zu {\tt xy} F.dach und f.dach>>
   },{ <<erstelle Scatterplot zu den ersten beiden Elementen von {\tt xy}>>
   },{ <<erstelle Scatterplot zu {\tt xy} und zeichne konvexe H\"ullen>>
   },{ <<erstelle zu den ersten beiden Elementen von {\tt xy} einen QQ-Plot>>
   },{ <<erstelle Draftsman's Display zu {\tt xy}>>
   },{ <<erstelle zum paarweisen Vergleich der Datens\"atze von {\tt xy} QQ-Plots>>
   },{ <<mache mit {\tt xy} Bootstrap-Experimente>>
   },{ <<aktiviere Kontingenztabellenfunktion mit {\tt xy}>>
   } )
 }'))
}


[244:]

<<modifiziere Daten {\tt xy}>>=
switch(Menu(
            c(
              "Abbruch/Ende",
              "Komponente entfernen",
              "Ausschnitte der Komponenten bilden",
              "Werte einer Komponente begrenzen",
              "Box-Cox-Transformationen durchfuehren",
              "xy in anz gleich umfangreiche Klassen teilen",
              "xy[1] gemaess xy[2] in anz Klassen teilen")
       ),
     { " "
   },{ <<entferne eine Komponenten aus {\tt xy}>>
   },{ <<bilde Ausschnitte der Komponenten von {\tt xy}>>
   },{ <<begrenze Werte von {\tt xy}>>
   },{ <<transformiere Elemente von {\tt xy} mittels Box-Cox-Transformation>>
   },{ <<ordne Daten von {\tt xy} in {\tt anz} gleich gro{\ss}e Klassen ein: {\tt xy}>>
   },{ <<ordne {\tt xy[1] }gem\"a{\ss} {\tt xy[2] }in {\tt anz} Klassen ein: {\tt xy}>>
   }
)


[245:]

<<lege Daten f\"ur Kapitel multivariate Graphiken auf {\tt xy} ab>>=
cat("Sollen die Daten von xy geloescht werden? (j/n)\n")
r<-c(scan(,"",n=1),"n")[1]
r<-substring(r,1,1)
if(exists("xy")){ if(r=="j" | r=="J") xy<-NULL } else xy <- NULL
repeat{
    cat("Welche Datensaetze sollen an xy angefuegt werden?\n")
    switch(Menu(
                c("Abbruch/Ende",
                  "Zeitdifferenzen vom 03.02.97",
                  "Zeitdifferenzen vom 17.02.97",
                  "Datenmengen vom 03.02.97",
                  "Datenmengen vom 17.02.97",
                  "Zeiten vom 03.02.97",
                  "Zeiten vom 17.02.97",
                  "Regen-Getreideertraege",
                  "Auto1",
                  "Auto2",
                  "Name einer Splus-Variablen",
                  "eigene Daten, selbst einzugeben",
                  "Merkmal aus Studentenumfrage 1995",
                  "Merkmal aus Studentenumfrage 1996",
                  "Merkmal aus Studentenumfrage 1997"
                 )
           ),
           break,
           xy<-c(xy,dz.03.02=list(dzeitpunkte.03.02.97)),
           xy<-c(xy,dz.17.02=list(dzeitpunkte.17.02.97)),
           xy<-c(xy,m.03.02=list(mengen.03.02.97)),
           xy<-c(xy,m.17.02=list(mengen.17.02.97)),
           xy<-c(xy,z.03.02=list(zeitpunkte.03.02.97)),
           xy<-c(xy,z.17.02=list(zeitpunkte.17.02.97)),
           xy<-c(xy,list(corn.rain,corn.yield)),
           xy<-c(xy,list(car.time,car.miles,car.gals)),
           xy<-c(xy,list(auto.stats[,1],
                         auto.stats[,2],
                         auto.stats[,8],
                         auto.stats[,9],
                         auto.stats[,10])),
           {cat("Bitte S-Plus-Namen eingeben\n")
           xy<-c(xy,list(eval(parse(text=scan(,"",n=1)))))},
           {cat("Bitte Werte einzeln eingeben\n")
           xy<-c(xy,list(scan(,0))) },
           xy<-select.and.split(frabo95),
           xy<-select.and.split(frabo96),
           xy<-select.and.split(frabo97)
    )
}


[246:]

<<ermittle einige Ma{\ss}zahlen zu {\tt xy}>>=
    switch(Menu(
                c(
                  "Abbruch/Ende",
                  "zusammenfassende Statistiken",
                  "Anzahlen der einzelnen Datensaetze",
                  "Korrelationskoeffizienten")
           ),
             { break
           },{ <<berechne zusammenfassende Statistiken zu {\tt xy}>>
           },{ <<errechne Anzahlen der Stichproben von {\tt xy}>>
           },{
<<berechne Korrelationskoeffizienten der ersten beiden Elementen von {\tt xy}>>
           }
    )


[247:]

<<aktiviere Kontingenztabellenfunktion mit {\tt xy}>>=
cat("Bearbeitung von Kontingenztabellen\n")
cat("Handelt es sich bei den Daten xy bereits um eine\n")
cat("Kontingenztabelle? (j=ja)\n")
kt.work(xy,is.xy.kt=("j"==readline()))

Auswahlfunktion zum Kapitel Modelle


[248:]

<<initialisiere Auswahl zu den Aufgaben des Kapitels Modelle>>=
a<-auswahl.modelle<-function(){
 eval(local=sys.parent(),expression=parse(text=
 'repeat{
     switch(Menu(
              c( "Abbruch",
                 "lege Datensaetze zur Bearbeitung auf x ab",
                 "erzeuge Stichprobe x",
                 "modifiziere Datensaetze x",
                 "zeige x an, berechne Statistiken, stelle x dar",
                 "aktiviere Verteilungskalkulator",
                 "erstelle Verteilungs-Erkennungsplots",
                 "erstelle QQ-Plots zur Modellueberpruefung",
                 "erstelle Durchschnittskurven",
                 "ermittle Belastung im Zeitablauf"
               ),
              report=T
  ),
     { break
   },{ <<lege Datensatz auf {\tt x} ab>>
   },{ <<lege Stichprobe auf {\tt x} ab>>
   },{ <<modifiziere Daten {\tt x}>>
   },{ <<stelle {\tt x} dar, zeige {\tt x} an, berechne Statistiken>>
   },{ <<aktiviere Kalkulator>>
   },{ <<erstelle Verteilungs-Erkennungsplot zu {\tt x}>>
   },{ <<erstelle zu {\tt x} einen QQ-Plot zur Modellpr\"ufung>>
   },{ <<plotte Durchschnitte f\"ur die ersten $k$ Elemente von {\tt x} gegen $k$>>
   },{ <<ermittele Belastung anhand zusammenh\"angender Zugriffszeitpunkte>>
   }
  )
 }'))
}


[249:]

<<lege Datensatz auf {\tt x} ab>>=
cat("Datensatz auswaehlen!\n")
switch(Menu(c(
                  "keine neue Belegung von x",
                  "Zeitdifferenzen vom 03.02.97",
                  "Zeitdifferenzen vom 17.02.97",
                  "Datenmengen vom 03.02.97",
                  "Datenmengen vom 17.02.97",
                  "Zeiten vom 03.02.97",
                  "Zeiten vom 17.02.97",
                  "Name einer Splus-Variablen",
                  "eigene Daten, selbst einzugeben")
           ),
           x<-x,
           x<-c(dz.03.02=dzeitpunkte.03.02.97),
           x<-c(dz.17.02=dzeitpunkte.17.02.97),
           x<-c(m.03.02=mengen.03.02.97),
           x<-c(m.17.02=mengen.17.02.97),
           x<-c(z.03.02=zeitpunkte.03.02.97),
           x<-c(z.17.02=zeitpunkte.17.02.97),
           {cat("Bitte S-Plus-Namen eingeben\n")
           x<-c(eval(parse(text=scan(,"",n=1))))},
           {cat("Bitte Werte einzeln eingeben\n")
           x<-c(scan(,0))}
)


[250:]

<<lege Stichprobe auf {\tt x} ab>>=
    switch(Menu( c( "keine neue Belegung von x",
                  "Binomial-Verteilung",
                  "geometrische Verteilung",
                  "Exponentialverteilung",
                  "Poisson-Verteilung" )
      ),{
               x<-x
      },{
<<ziehe {\tt r} binomialverteilte Zufallszahlen mit {\tt n} und {\tt p}: {\tt x}>>
 },{ <<ziehe {\tt n} geometrisch verteilte Zufallszahlen mit {\tt p}: {\tt x}>>
 },{ <<ziehe Stichprobe aus einer Exponentialverteilung mit $\lambda$: {\tt x}>>
 },{ <<ziehe Stichprobe aus einer Poisson-Verteilung mit $\lambda$: {\tt x}>>
 }
)


[251:]

<<modifiziere Daten {\tt x}>>=
switch(Menu(c("Abbruch: keine Modifikation von x",
              "Ausschnitt aus x bilden",
              "Differenzen von x auf x ablegen",
              "Box-Cox-Transformationen durchfuehren",
              "Minuten mit Zugriff bei Sekundendaten ermitteln",
              "Fehlversuche bis Erfolg ermitteln",
              "Wartezeiten x jenseits x.0 auf x ablegen" )
   ),{ x<-x
   },{ <<bilde Ausschnitt der Daten {\tt x}>>
   },{ if(all(x==sort(x))) x<-diff(x) else print("x fuer diff ungeeignet!")
   },{
   <<transformiere {\tt x} mittels Box-Cox-Transformation, zeige Statistiken>>
   },{ <<ermittle aus Sekundendaten {\tt x} Minuten mit Aktivit\"at {\tt ->x}>>
   },{ <<ermittle aus {\tt x} Fehlversuche bis Erfolg {\tt ->x}>>
   },{ <<ermittle und verschiebe die Werte von {\tt x} gr\"o{\ss}er {\tt x.0}: {\tt x}>>
   }
)


[252:]

<<stelle {\tt x} dar, zeige {\tt x} an, berechne Statistiken>>=
    switch(Menu(c("Abbruch: keine Darstellung",
                  "Daten anzeigen",
                  "Statistiken berechnen",
                  "horizontale Staebe zeichnen",
                  "Darstellung von Beobachtungen, diskret",
                  "Darstellung von Beobachtungen, kontinuierlich" )
   ),{ x<-x
   },{ <<zeige die ersten Werte von {\tt x} an>>
       outin()
   },{ <<berechne zusammenfassende Statistiken von {\tt x}>>
       outin()
   },{ <<plotte {\tt x} als horizontale St\"abe>>
   },{ <<plotte Stichprobe, berechne Statistiken zu {\tt x} --- diskret>>
   },{ <<plotte Stichprobe, berechne Statistiken zu {\tt x} --- kontinuierlich>>
   }
)


[253:]

<<aktiviere Kalkulator>>=
    switch(Menu(c("Abbruch: keinen Kalkulator aktivieren",
                  "Binomial-Verteilung",
                  "geometrische Verteilung",
                  "Exponentialverteilung",
                  "Poisson-Verteilung",
                  "Normal-Verteilung"
                  )
      ),{ x<-x
      },{ <<aktiviere {\tt binomial.calculator}>>
      },{ <<aktiviere {\tt geometric.calculator}>>
      },{ <<aktiviere {\tt exponential.calculator}>>
      },{ <<aktiviere {\tt poisson.calculator}>>
      },{ <<aktiviere Normalverteilungskalkulator>>
      }
)


[254:]

<<erstelle Verteilungs-Erkennungsplot zu {\tt x}>>=
    switch(Menu(c("Abbruch: keinen Erkennungsplot zeichnen",
                  "geometrische Verteilung",
                  "Exponentialverteilung",
                  "Poisson-Verteilung" )
      ),{ x<-x
      },{ <<zeichne Erkennungsplot f\"ur die geometrische Verteilung>>
      },{ <<erstelle f\"ur {\tt x} Erkennungsplot zur Exponentialverteilung>>
      },{ <<erstelle f\"ur {\tt x} Erkennungsplot zur Poisson-Verteilung>>
      }
)

Abschluß der Initialisierungsbefehle


[255:]

<<start>>=
menu.jump<-look.act.points.up()
cat("------------------------------\n")
cat("   Abk.:    lange Bezeichnung:\n")
cat("------------------------------\n")
activate.jump(menu.jump)

Anhang -- Funktions- und Variablendefinitionen

Übersicht

In diesem File werden allgemein notwendige Funktionen definiert. Ihre Splus-Versionen gehören in das Verzeichnis _Revbook . Es reicht, den File revobj.sch zu sourcen, der durch make obj erstellt wird. Jedoch werden nicht mehr benötigte Objekte des Verzeichnisses _Revbook nicht gelöscht.


[256:]

<<*>>=
print("Funktionen zum Revbook definieren")
attach("_Revbook",pos=1)
<<lese Zeitpunkte vom 03.02.1997 ein>>
<<lese Mengen vom 03.02.1997 ein>>
<<lese Zeitpunkte vom 17.02.1997 ein>>
<<lese Mengen vom 17.02.1997 ein>>
<<lese Daten zu den Aufgaben ein>>
<<lese alte Frageb\"ogen ein>>
<<lese neuen Fragebogen ein>>
<<lese Daten zum Skript ein>>
<<initialisiere einige Funktionen>>
synchronize()
detach("_Revbook")
attach("_Revbook")
print("Definition erfolgreich beendet - 02.6.97")

Serverdaten


[257:]

<<lese Zeitpunkte vom 03.02.1997 ein>>=
zeitpunkte.03.02.97<-
c(173877, 178739, 203188, 203742, 203906, 205573, 205640, 209310, 209949,
  210299, 210382, 210906, 213142, 213545, 213785, 213791, 213922, 213924,
  213925, 213969, 214320, 214935, 214949, 214961, 214969, 215075, 215387,
  216570, 217267, 218288, 219059, 219105, 219258, 219287, 219959, 220475,
  220591, 220876, 220949, 220964, 221084, 221098, 221588, 222376, 222976,
  223093, 225865, 226062, 226068, 226079, 226081, 226082, 226101, 226122,
  226625, 227999, 228132, 228469, 228789, 230543, 230662, 230706, 231139,
  231857, 232015, 232061, 232773, 232831, 232970, 233010, 233175, 233519,
  234897, 235485, 235940, 236810, 239219, 240240, 240787, 240797, 240798,
  240806, 240846, 240913, 241079, 242224, 243002, 243262, 244777, 245317,
  246598, 248563, 248770, 250683, 253013, 253187, 253760, 255462, 255511,
  255618, 255908, 256270, 257651)
dzeitpunkte.03.02.97<-c(zeitpunkte.03.02.97[1]%%(3600*24),
                        diff(zeitpunkte.03.02.97))


[258:]

<<lese Mengen vom 03.02.1997 ein>>=
mengen.03.02.97<-
c(14101,105563,   1866, 11505,   216, 19391, 35340, 10746, 205246,  8192,
 124667, 25467,  23819, 49226,  2450,  5520,  1646,  2471,  12301,  3431,
   1646, 15560,   9287,  5105,  7070, 32116,  1363,  3190,   1548, 12851,
   1395,  1001,  16418,  3431, 20106, 35024,  5113, 10395,1589837, 57965,
 200133, 98082,  57314,  5113,  1007, 16418, 45354, 18606,   3705,   711,
  16418,  1275,    708, 18868, 28354, 92723, 14101, 19533,  25741, 20445,
  12671,150325,   4107, 20867,  1434,305118, 23719, 13756,  14101,   345,
  25300,  6515,   3406,109591, 14640,197070,   216,  1434,  15747,  1434,
  12301, 12451,  15251,  8130,  8687, 19391,   800,  2587,  23719,   345,
    836,  4107,1594950, 15871, 10746,140075,  1650,   129,  15688,   561,
 122754,   216,  14640)


[259:]

<<lese Zeitpunkte vom 17.02.1997 ein>>=
zeitpunkte.17.02.97<-
c(1382822, 1384215, 1384346, 1384788, 1387047, 1388561, 1388822, 1394377,
  1395438, 1403951, 1406572, 1407042, 1412097, 1414932, 1415151, 1415161,
  1416757, 1416849, 1418675, 1419331, 1419391, 1421413, 1422235, 1422257,
  1422303, 1422368, 1422608, 1422906, 1423487, 1423547, 1424076, 1424318,
  1425637, 1425819, 1427253, 1427281, 1427302, 1427307, 1427326, 1427682,
  1427765, 1428085, 1428687, 1429426, 1430373, 1430374, 1430375, 1430443,
  1430530, 1430958, 1430977, 1430992, 1430995, 1431731, 1432460, 1432784,
  1434197, 1434355, 1434378, 1434676, 1435392, 1435413, 1436708, 1439140,
  1440101, 1440637, 1441413, 1441456, 1442088, 1442378, 1445136, 1447472,
  1448909, 1449247, 1449544, 1452266, 1454031, 1454319, 1454503, 1456332,
  1459823, 1459830, 1460204, 1461119, 1461847, 1461906, 1466870)
dzeitpunkte.17.02.97<-c(zeitpunkte.17.02.97[1]%%(3600*24),
                        diff(zeitpunkte.17.02.97))


[260:]

<<lese Mengen vom 17.02.1997 ein>>=
mengen.17.02.97<-
c(20760,  2034, 65218,  7526,  6944,  3481, 14115,  1448,  9985, 14115,
   1448, 14115, 30273,  1448,  1448, 13012, 18688,  7572,  1551, 18688,
  34890,  9723,  2285,  7283,  1448,  1969,  6739,129898, 38348, 14115,
  14115, 52438, 38517,  1448, 29969, 10749,  3287,   324, 29140,  8346,
  14115, 32836, 14115, 16418,  4024,   445, 10533,  6021, 41378,  1448,
   2910,  4051, 29140, 19473,  8346,   345, 27785,  8564,  4425,478920,
  30533, 16418, 29083, 14115,   868, 27852, 19473, 12322,  4273,207117,
   1448, 12515,  1001,  5519, 87888, 16721, 33964, 22307,  9078, 78540,
  14115,  4262, 11289, 18688,  1448,   870, 36422)

Daten zu verschieden Aufgaben


[261:]

<<lese Daten zu den Aufgaben ein>>=
# Kuckuckseier
a13<-list(
     .1*c(220,239,209,238,250,240,217,238,228,231,231,235,230,230),
     .1*c(218,230,233,224,224,230,230,230,239,223,220,226,220,221,211,230),
     .1*c(198,221,215,209,220,210,223,210,203,209,220,200,208,212,210))
# SO4 1976
a10<-c( 4.8,7.4,3.7,2.7,3.8,8.4,1.6,2.5,7.6,1.6,1.5,1.4,5.8,4.0,5.1,5.1,1.5,
        2.8,3.0,0.7,2.1,1.9, 1.6,5.5,1.6,5.8,1.4,1.6,2.2  )
# SO4 1976, 1977, 1978
a11<-list(a10,
          c( 6.50,7.60,4.20,2.70,3.70,9.10,2.60,2.70,9.10,2.40,1.30,1.60,6.20,
             3.90,5.70,5.80,1.50,1.70,1.90,1.80,1.90,1.90,1.50,5.90,1.60,6.90,
             1.00,1.40,2.30),
          c( 4.6,6.8,3.3,2.3,3.6,8.8,1.8,2.8,9.6,2.6,1.9,1.8,5.9,4.9,5.4,5.0,
             1.4,1.9,1.5,1.5,1.3,1.5,1.7,5.7,1.4,5.9,0.6,1.0,2.2))
# Datensatz zu den norwegischen Seen
norwegen<-
list("1976" = structure(.Data = c(432,497,458,472,453,496,531,542,487,
        587,627,667,538,560,493,597,623,615,482,542,531,599,488,
        485,597,605,643,629,564,480,740,370,270,380,840,160,250,
        760,160,150,140,580,400,510,510,150,280,300,70,210,190,
        160,550,160,580,140,160,220,29000,29000,16000,18000,17000,
        38000,5000,32000,13000,9000,1000,2000,5000,3000,7000,6000,
        5000,10000,10000,4000,2000,1000,14000,9000,6000,5000,3000,
        4000,4000,52,203,66,59,51,222,53,69,222,78,115,247,210,
        186,145,219,156,200,44,32,69,69,36,170,83,291,144,173,
        118),.Dim = c(29,4)),"1977" = structure(.Data = c(423,474,455,481,
        470,535,514,515,476,595,628,644,532,610,494,602,634,623,
        477,482,577,610,499,465,582,597,637,679,570,650,760,420,
        270,370,910,260,270,910,240,130,160,620,390,570,580,150,
        170,190,180,190,190,150,590,160,690,100,140,230,57000,
        41000,39000,17000,12000,59000,10000,13000,13000,12000,2000,
        3000,12000,5000,11000,13000,6000,3000,15000,36000,9000,4000,
        13000,14000,19000,10000,8000,4000,4000,62,195,52,50,46,288,
        66,62,228,104,97,114,220,224,156,228,153,96,36,55,57,76,
        22,165,91,279,111,239,93),.Dim = c(29,4)),"1978" = structure(
        .Data = c(440,498,457,483,464,554,491,523,487,559,617,628,
        533,557,491,571,620,607,509,534,560,599,486,477,590,578,
        640,648,577,460,680,330,230,360,880,180,280,960,260,190,
        180,590,490,540,500,140,190,150,150,130,150,170,570,140,
        590,60,100,220,29500,18000,20000,6000,17000,35000,6000,13000,
        12500,18500,1500,1000,4500,16500,8000,5000,2000,1500,10000,
        6000,2000,1000,16500,15000,6500,7000,2000,8000,2500,55,195,
        44,43,49,267,47,66,230,105,114,118,194,225,144,206,186,
        204,41,58,66,80,33,165,96,264,70,147,116),.Dim = c(29,4)),
        "1981" = structure(.Data = c(449,521,469,490,454,575,543,519,
        490,602,625,667,521,598,493,567,629,568,545,554,555,613,
        492,484,617,575,598,672,529,360,560,290,210,380,870,150,
        290,760,200,170,180,540,430,430,420,160,180,170,150,160,
        170,190,480,180,580,200,200,210,22000,12000,11000,7000,
        20000,37000,5000,16000,12000,6000,1000,1000,5000,6000,7000,
        5000,4000,20000,10000,5000,1000,1000,13000,16000,4000,5000,
        1000,3000,1000,47,164,51,39,45,252,67,66,187,78,104,234,
        179,218,126,185,154,268,32,48,64,66,25,130,89,124,116,
        267,79),.Dim = c(29,4)))
norwegen<-lapply(norwegen,"*",0.01)
# Stahlhaerte in Rockwell-Einheiten
a15<-c(58,49,58,57,50,60,64,65,64,59,65,65,45,54,52,59,65,57,63,54,
       65,60,61,47,60,52,63,61,54,63,62,56,56,65,56,64,65,55,59,65,
       64,49,65,50,65,61,64,61,59,63,58,57,65,60,55,64,65,59,62,65,
       64,54,56,58,40,85,53,61,56,65,58,58,55,52,65,60,65,63,64,63,
       60,61,61,65,56,62,65,54,64,63,57,64,62,58,60,52,53,62,56,65)
a17<-c(4,1,18,3,4)
a18<-c(11,5,6,9,3,8)
# 50 Ausspielungen des Lottospiels 6 aus 49
a20<-t(matrix(
 c(45,33,31,11,34, 5,,25,48,17,38, 2, 3,,13,47,46,35,26,33,,23,15, 9, 5,38,20,,
   17,41,31,33,38, 1,,37,48,11,35,26,30,,26,22, 7,32,10,36,, 3,49,31,18,47,27,,
   44,48,32, 6,43,25,,13,25,39,11,22, 7,,28, 5, 3,17,13,29,,10,11,46,19,16,45,,
   30,38,34,17, 6,42,,44,25,33,10,18,21,, 2,18,11, 1,33, 9,,19,26,41,24,23,21,,
   49,45,22,19,36,33,,45,24,43,29,13, 4,,12,36,23,39,15,48,,33,16,39,34, 3,23,,
    8,13,26, 3,15,42,,15,10,40,16,48,14,,10,20,33,18,19,42,,43,11,18,26,39,45,,
   33,10, 6,29,23,16,, 9,15,35,34,47,11,,44, 9,34,26,24,47,,48,39,34,38,28,29,,
   28,49,15,39,41,24,,14, 7,11,12,36,15,,13, 4,45,37, 8,49,,17,15, 7,22,49,14,,
   32,33, 3,24,26,28,,37,15,26, 1,32,21,,42, 9,34,30,40,13,,46, 6,14,36, 1,27,,
   45,26,37,36,40,49,,48,38,13,30,44,41,, 7,34,24,43,21,48,,46, 4,31, 6, 1,29,,
   25,30,36,18, 7,11,,47,39,48,11,35,38,,36,33,40, 7,43,13,, 7,48,23, 4,18, 5,,
   22,12,17,39, 3,14,,43,21, 4, 1,47, 5,,22, 2,13,43,15,16,,16,46, 5,10, 2, 4,,
   23,12,26,44,18, 6,,21, 9,29,44,20,17) ,6,50))
# verkaufte Stueckzahlen im letzten Monat
a21<-c(10,8,14,22,7,10,11,14,15,9,20,12,19,11,16,10,17,8,24,15,11,22,11,14,19)
# Haeufigkeit der Zahlen beim Lotto 6 aus 49
a22<-c(223,227,225,207,213,224,211,203,229,213,214,216,175,216,213,215,228,211,
       233,218,248,226,219,195,220,229,226,195,210,214,231,249,234,198,215,224,
       219,249,223,221,216,228,216,212,218,228,210,238,242)
names(a22)<-as.character(1:49)
# Warten auf das erste Tor bei Fussballspielen
a23<-c(40,65,11,43,34,41,3,1,43,9,21,4,12,41,9,46,14,30,41,7,31,43,25,20,16)
# Betriebe und Flaeche
a24<-matrix(c(488196,385680,335489,301493,164578, 26051,  7502,
               528.4,1281.2,2428.2,4243.3,4839.1,1719.6,2978.3),7,2)
# Todesjahr und Alter
a27<-list(1800+c(27,84,95,108,114,118,124,128,136,141,164,165,177),
          c(13,83,34,1,11,16,68,13,77,74,87,65,83))
# Steuerkriminalitaet
a28<-matrix(c(2,26,7,,13,11,6,,9,15,5,,9,9,3),3,4)
# PS und SH
a31<-list(c(40,45,47,45,45,60,55,48,60,50,75,60,53,75,75,50,55,60,
            50,55,53,72,60,64,75,64,75,60,88,68,75,105,75,102,120),
          c(41,52,56,67,72,69,73,73,65,78,65,72,78,73,70,70,81,82,
            82,73,87,91,94,92,86,86,88,88,88,94,113,96,110,109,130))
# Personen pro Zeitspanne
a34<-c(65,137,140,85,48,18,7)
# Kinobesuche
a36<-list(0:6,
          c(6,8,8,11,14,11,2),
          c(5,7,12,12,12,7,5))
# radioaktiver Zerfall
a39<-list(0:14,
          c(57,203,383,525,532,408,273,139,45,27,10,4,0,1,1))
# Kriege
a41<-list(0:4,c(223,142,48,15,4))
# Verpackungsmaschinen - Tueten
a43<-matrix(c(5,15,30,40,10,,36,60,56,32,16),5,2)
# Wahrscheinlichkeitsfunktion 2-Dim.
a89<-0.01*matrix(c(2,6,7,7,,5,6,6,9,,10,8,6,5,,12,7,2,2),4,4)

Fragebögen von 1995, 1996 und 1997


[262:]

<<lese alte Frageb\"ogen ein>>=
"frabo95"<-
structure(.Data = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
        18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,
        36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,
        54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,
        72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,
        90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,
        106,107,108,109,110,111,112,113,114,115,116,117,118,119,
        120,121,122,123,124,125,126,127,128,129,130,131,132,133,
        134,135,136,137,138,139,140,141,142,143,144,145,146,147,
        148,149,150,151,152,153,154,155,156,157,158,159,160,161,
        162,163,164,165,166,167,168,169,170,171,172,173,174,175,
        176,177,178,179,180,181,182,183,184,185,186,187,188,189,
        190,191,192,193,194,195,196,197,198,199,200,201,202,203,
        204,205,206,207,208,209,210,211,212,213,214,215,216,217,
        218,219,220,221,222,223,224,225,226,227,228,229,230,231,
        232,233,234,235,236,237,238,239,240,241,242,243,244,245,
        246,247,248,249,250,251,1,2,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,
        1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,
        1,1,1,1,1,2,1,1,1,1,3,1,1,1,1,2,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,2,1,1,1,1,1,3,1,1,1,1,1,1,1,1,2,
        1,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,1,2,1,1,1,
        2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,1,1,1,2,
        2,2,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,
        0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,
        1,1,0,0,0,0,1,1,1,1,1,1,1,0,1,0,0,-1,0,0,0,0,0,0,
        1,0,0,0,0,1,0,1,1,0,0,1,1,1,0,1,1,1,1,0,0,0,0,1,
        1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,
        0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
        0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,
        1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,
        0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,
        1,1,1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,
        0,0,0,0,0,0,0,0,20,21,21,21,22,21,21,21,27,21,22,21,
        23,20,22,21,23,21,22,22,22,20,20,20,20,20,22,19,19,23,
        24,22,22,23,21,22,23,19,23,22,20,23,23,22,20,20,22,24,
        23,22,24,19,24,22,20,21,22,21,22,20,21,20,19,19,24,19,
        22,24,19,19,20,21,24,24,19,19,21,21,19,21,19,22,26,-1,
        24,19,19,20,23,22,19,22,24,20,20,21,19,22,21,20,21,22,
        20,20,19,20,20,19,20,20,19,20,23,22,18,22,22,24,20,19,
        20,19,21,20,21,19,22,20,22,21,22,19,22,20,23,20,22,22,
        20,22,21,20,23,20,19,21,20,19,23,25,21,23,19,22,23,21,
        20,20,23,23,22,22,23,22,21,19,22,21,21,21,21,20,21,20,
        20,20,23,23,20,21,21,20,23,22,21,20,20,22,30,20,21,21,
        22,26,21,26,27,23,21,24,21,19,19,22,21,21,22,24,21,23,
        22,21,22,21,27,25,21,22,20,19,25,21,22,20,19,21,20,23,
        23,21,19,21,23,21,22,18,20,20,21,23,22,20,23,21,20,28,
        22,24,28,27,20,165,176,191,181,175,169,191,163,189,170,
        185,164,175,186,187,185,198,174,186,180,192,185,181,189,
        182,182,175,172,165,184,184,180,180,164,175,176,154,175,
        167,165,190,169,180,172,182,180,182,186,188,190,172,170,
        183,185,191,186,190,165,164,163,183,178,170,181,168,179,
        168,183,160,165,185,176,198,193,165,160,168,175,-1,174,
        175,162,180,184,194,176,189,185,193,192,181,169,178,154,
        165,178,178,182,182,189,194,162,175,180,184,180,163,179,
        185,190,170,170,183,183,172,180,183,180,180,180,185,190,
        175,192,169,184,191,187,182,195,178,178,187,195,179,181,
        198,187,177,176,175,184,184,176,194,170,165,179,192,188,
        170,172,180,170,183,184,-1,180,179,180,184,182,193,181,
        172,167,193,183,186,167,172,193,195,173,179,162,195,178,
        178,177,182,203,178,180,177,185,180,178,180,187,197,188,
        184,184,188,186,189,-1,185,187,187,176,174,163,176,187,
        187,162,168,196,188,184,175,184,174,185,183,196,168,174,
        163,173,170,182,183,176,168,170,185,177,192,171,180,191,
        170,182,179,165,174,165,175,174,185,186,195,184,168,190,
        194,166,190,60,68,75,62,70,56,81,54,84,59,85,47,59,73,
        80,80,71,60,84,65,85,73,72,95,67,76,70,52,50,82,74,75,
        82,62,62,76,46,58,55,63,78,47,65,60,65,63,90,65,85,68,
        70,53,77,78,73,85,90,60,55,52,70,72,54,67,63,80,55,83,
        48,53,80,70,90,83,54,58,60,65,-1,65,55,48,82,72,92,58,
        88,75,80,88,84,60,72,-1,55,70,79,73,75,84,89,50,55,62,
        80,80,60,78,78,76,63,62,79,85,60,80,77,78,81,72,79,80,
        67,78,57,100,97,86,68,85,75,64,70,88,72,65,96,70,76,71,
        66,82,87,81,79,55,60,60,95,98,67,64,78,63,85,84,-1,90,
        73,70,85,83,92,82,70,52,81,76,105,58,58,80,80,67,71,55,
        89,78,89,67,80,97,64,68,73,72,70,69,100,112,70,78,75,
        88,80,80,80,-1,103,78,84,64,72,75,61,73,75,57,60,68,78,
        77,87,82,72,90,86,105,45,75,-1,72,60,60,56,60,63,65,78,
        75,90,56,75,80,66,68,76,53,64,47,70,57,80,71,88,80,69,
        80,84,64,80,1,0,1,1,2,1,1,2,2,1,0,1,1,1,1,1,7,1,0,
        2,2,1,1,6,3,0,1,1,3,2,1,2,1,2,2,1,6,2,1,1,0,1,1,
        0,1,1,0,0,2,1,0,1,1,2,1,0,1,3,2,1,3,5,1,3,1,3,1,
        1,1,1,0,3,0,0,2,1,1,1,0,0,1,1,1,2,3,0,1,1,3,0,0,
        2,3,5,2,0,2,1,0,1,2,0,1,4,3,3,1,3,1,0,0,1,0,1,2,
        1,1,8,0,1,0,4,1,0,-1,1,1,1,2,1,1,2,1,3,4,3,1,1,1,
        2,1,1,1,0,1,1,1,2,1,1,4,3,1,1,1,1,2,1,2,2,0,1,1,
        1,2,2,1,1,2,2,2,0,1,2,0,0,2,0,0,1,0,0,2,1,3,1,0,
        0,0,0,1,0,2,0,0,1,1,1,3,1,2,1,1,1,3,1,1,1,4,0,1,
        1,1,4,1,1,0,1,2,0,0,1,2,3,1,2,2,1,1,1,1,1,3,3,4,
        1,2,3,4,2,0,1,0,0,1,0,1,1,1,4,1,1,1,1,1,0,1,0,1,
        1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,
        0,0,0,1,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,
        0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,
        0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,
        0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,1,0,1,0,1,0,
        0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,1,
        0,1,1,0,1,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,0,0,0,0,
        0,0,0,0,0,0,1,0,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,1,
        1,0,0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,1,
        0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1,1,0,1,1,0,
        0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,
        1,1,1,1,1,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,1,0,
        0,0,1,1,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0,0,
        0,0,0,0,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,0,0,1,0,0,
        0,0,1,0,0,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,
        0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,1,0,1,0,1,1,1,0,0,
        0,0,1,1,0,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,
        1,1,0,1,1,0,1,1,1,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,
        0,1,1,0,0,1,1,0,0,0,0,1,1,0,0,0,0,1,1,1,0,1,1,0,
        0,0,1,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,0,0,0,0,0,0,
        0,1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,0,0,1,1,1,0,0,0,
        1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,1,1,0,1,
        0,1,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,
        0,0,1,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,0,0,1,
        1,1,0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,
        0,1,1,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,1,0,1,1,1,1,
        0,0,1,0,0,0,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,1,1,
        0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,1,1,1,1,0,1,0,
        0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1,0,1,
        0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,1,1,0,
        0,0,1,0,0,1,0,0,0,0,0,0,1,0,1,1,1,1,1,0,1,1,1,0,
        0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,1,1,0,1,1,0,1,1,1,
        1,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,1,1,1,0,1,0,
        1,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1,1,0,
        1,0,0,1,1,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,
        0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,1,
        1,1,1,0,1,0,1,0,0,0,0,0,1,0,1,1,1,1,1,0,0,0,1,0,
        0,0,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1,1,
        0,0,1,1,0,0,1,0,1,0,1,1,1,1,0,1,0,1,0,0,0,0,1,1,
        1,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,
        1,1,1,1,0,1,0,0,0,1,1,1,0,0,1,1,0,1,1,1,0,1,1,0,
        1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,
        1,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,
        0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
        0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,1,0,1,1,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,
        1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,
        0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
        0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,
        0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,
        1,0,0,1,1,0,1,1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,
        1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,0,
        0,0,1,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1,1,
        0,1,0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,0,1,1,0,1,1,1,
        1,1,0,1,0,0,1,0,1,0,1,0,0,1,0,1,0,0,0,0,0,1,0,1,
        0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,1,
        1,0,1,1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,1,0,0,1,0,0,
        1,1,0,1,0,1,0,0,1,1,1,1,0,1,0,1,0,0,0,0,1,0,0,1,
        1,0,1,0,1,0,1,0,1,1,1,0,0,0,0,0,0,0,1,1,0,1,0,1,
        0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,-1,4,3,
        4,4,2.3999999999999999,3,-1,3,3,-1,2,3,3,3,5,2,4,3,3,4,
        3,3,3,3,1,3,3,3,4,4,1,2,4,4,4,2,3,3,5,4,2,3,3,3,
        2,3,2,2,2,2,2,3,4,2,1,3,4,2,2,3,1,3,2,4,1,3,3,5,
        4,3,3,3,4,5,4,2,3,2,3,2,4,3,4,3,2,4,5,4,3,2,3,1,
        -1
        ,2,2,3,3,3,3,-1,2,4,4,3,3,2,2,2,2,2,3,3,3,2,1,3,
        4,1,4,1,3,3,1,2,3,-1,-1,3,4,3,2,4,3,-1,1,2,3,2,4,
        4,3,2,3,3,4,1,3,4,3,4,4,3,2,4,3,3,3,3,4,3,3,-1,3,
        5,3,2,-1,2,-1,1,3,4,3,4,2,2,4,1,1,2,5,4,2,5,3,2,
        4,3,3,3,3,3,2,4,3,1,-1,3,4,3,1,3,3,4,1,2,4,3,3,2,
        3,3,3,3,4,4,2,2,4,3,5,3,2,1,1,3,-1,3,2,5,2,3,3,5,
        2,-1,4,3,2,2,2,-1,3,3,-1,2,4,3,-1,3,1,1,1,4,2,1,
        -1,7,3,1,1,-1,7,2,4,1,7,1,1,1,1,4,4,8,1,4,4,8,2,
        8,1,1,1,4,8,8,3,1,1,1,4,4,1,1,3,6,1,1,1,4,4,4,1,
        1,1,4,2,2,1,-1,1,1,1,1,3,7,1,8,7,7,1,1,-1,1,7,1,
        6,7,1,4,1,1,8,4,2,3,2,6,6,1,1,1,1,-1,2,4,-1,1,8,
        3,4,8,2,2,2,-1,6,2,8,1,1,4,7,7,8,1,1,1,1,1,2,2,8,
        1,1,8,8,8,1,1,1,7,2,3,4,3,1,8,1,1,4,4,1,1,4,8,4,
        1,8,1,-1,7,4,1,4,8,7,1,4,4,6,7,4,4,4,8,8,4,3,4,4,
        7,7,-1,2,-1,8,3,3,8,2,1,8,4,3,8,8,1,2,1,1,1,1,1,
        1,1,4,7,1,1,8,6,8,8,1,8,1,4,6,7,7,1,1,1,-1,7,1,1,
        8,8,4,1,8,3,1,4,7,-1,1,2,8,8,4,4,2,1,2,2,8,8,2,2,
        1,1,1,1,4,1,4,8,1),.Dim = c(251,16),.Dimnames = list(
        character(0),c("1:lfd.Nr","2:Fach","3:Geschlecht","4:Alter",
        "5:Groesse","6:Gewicht","7:Geschwister","8:Rauchen","9:bei Eltern",
        "10:Auto->Uni","11:Bus->Uni","12:Fahrrad->Uni","13:Fuss->Uni",
        "14:Mathe.LKurs","15:Abi.Note","16:Partei")))


"frabo96"<-
structure(.Data = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
        18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,
        36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,
        54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,
        72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,
        90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,
        106,107,108,109,110,111,112,113,114,115,116,117,118,119,
        120,121,122,123,124,125,126,127,128,129,130,131,132,133,
        134,135,136,137,138,139,140,141,142,143,144,145,146,147,
        148,149,150,151,152,153,154,155,156,157,158,159,160,161,
        162,163,164,165,166,167,168,169,170,171,172,173,174,175,
        176,177,178,179,180,181,182,183,184,185,186,187,188,189,
        190,191,192,193,194,195,196,197,198,199,200,201,202,203,
        204,205,206,207,208,209,210,211,212,213,214,215,216,217,
        218,219,220,221,222,223,224,225,226,227,228,229,230,231,
        232,233,234,235,236,237,238,239,240,241,242,243,244,245,
        246,247,248,249,250,251,252,253,254,255,256,257,258,259,
        260,261,262,263,264,265,1,1,1,1,1,1,4,4,2,1,1,1,4,4,
        4,4,1,1,1,1,1,2,1,1,1,1,1,4,1,1,1,1,1,1,-1,1,1,2,
        1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,2,1,1,2,2,1,1,1,1,1,1,1,2,1,1,1,1,1,2,
        1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
        1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,1,2,2,1,2,1,
        1,1,1,1,1,1,1,1,1,1,2,1,1,1,-1,1,1,1,1,1,1,2,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,
        1,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,1,1,1,1,2,
        1,2,1,1,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,1,1,2,2,1,
        1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,
        4,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,-1,0,1,0,0,1,1,0,
        1,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,-1,0,1,
        1,0,0,1,1,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,
        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,
        0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,1,0,1,0,1,1,0,1,
        1,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,
        0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,0,1,1,1,0,0,
        0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,0,1,1,0,0,0,1,1,1,
        0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
        1,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,
        0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,1,
        0,0,0,1,0,0,0,0,0,0,1,0,23,21,22,19,20,21,21,22,20,
        20,22,21,20,20,19,26,21,20,25,26,22,19,21,20,20,19,23,
        20,21,22,20,21,18,21,20,24,24,19,23,24,20,20,20,21,19,
        20,23,20,20,21,20,20,24,19,21,20,28,24,20,20,23,21,20,
        21,19,21,21,20,23,20,22,21,23,19,20,23,21,21,21,20,21,
        23,20,22,21,28,21,22,23,22,22,20,22,21,19,19,19,20,20,
        21,24,19,22,20,23,20,21,22,23,20,23,20,18,21,21,24,23,
        21,21,20,20,24,19,23,22,21,20,24,21,19,21,20,23,20,20,
        20,22,20,20,20,20,21,20,21,21,20,20,22,23,19,20,20,19,
        23,27,21,21,24,27,20,21,21,20,19,19,19,21,19,22,19,20,
        24,21,20,23,21,21,27,20,18,19,20,24,20,29,26,25,22,24,
        26,30,20,20,23,21,20,22,22,21,25,22,20,21,22,20,19,19,
        22,23,20,19,19,20,20,19,22,20,27,27,20,24,21,20,21,20,
        24,22,23,23,20,20,21,21,21,20,22,19,19,19,23,20,23,21,
        23,21,20,20,19,21,24,20,20,20,20,21,20,20,20,21,19,22,
        21,20,20,22,171,173,176,170,168,175,198,170,177,198,170,
        173,201,168,205,176,184,183,184,180,190,180,172,182,176,
        168,176,180,184,190,188,177,172,160,186,184,168,168,183,
        180,166,180,171,170,175,175,180,180,191,176,165,184,186,
        180,164,180,182,178,183,178,178,188,170,179,180,182,165,
        182,197,193,181,178,180,183,175,179,182,188,183,173,175,
        176,182,178,171,173,190,180,178,180,187,170,186,181,165,
        190,174,177,180,192,175,169,187,165,193,181,180,182,163,
        169,183,182,170,175,184,159,178,176,180,190,175,180,170,
        173,185,183,187,186,168,170,175,181,180,182,180,175,186,
        170,185,168,185,191,192,160,182,185,161,185,182,170,170,
        180,160,173,164,170,187,190,180,192,187,186,168,167,163,
        175,194,164,170,177,190,185,176,175,167,179,195,180,180,
        166,174,180,190,160,186,184,182,185,180,180,181,182,172,
        166,185,178,183,183,180,177,191,196,187,183,196,170,164,
        196,167,192,178,176,169,182,196,170,180,169,184,182,185,
        183,177,185,179,175,176,180,183,188,188,175,172,180,170,
        185,172,165,183,175,185,160,188,186,171,178,182,185,188,
        194,180,165,161,180,185,188,178,176,178,175,192,171,190,
        171,169,60,66,68,70,60,69,84,55,63,85,59,63,93,62,130,
        69,72,78,74,70,92,55,60,76,55,59,63,65,67,82,75,74,65,
        55,80,78,68,62,75,80,57,70,59,65,-1,-1,70,70,155,74,54,
        83,83,90,68,78,73,70,75,74,73,83,85,70,71,90,60,75,107,
        96,65,71,73,75,73,62,75,88,92,58,60,73,78,78,62,68,86,
        71,80,65,72,50,73,77,53,81,62,55,75,100,60,51,86,55,81,
        63,67,79,50,57,76,70,60,69,95,52,79,65,78,75,72,75,55,
        55,79,79,75,72,57,65,64,73,80,85,78,60,80,67,66,67,75,
        84,130,52,80,80,49,76,82,60,52,67,54,63,54,55,91,93,76,
        83,78,74,64,58,51,55,80,58,55,63,82,75,64,56,75,71,81,
        74,56,55,65,72,87,53,72,80,61,75,67,70,73,91,75,56,76,
        62,88,87,75,75,85,95,75,80,76,70,52,95,48,90,80,69,68,
        60,88,75,72,62,76,79,75,77,85,77,69,70,65,78,73,86,74,
        60,77,65,65,80,62,54,63,65,69,60,86,80,58,60,81,62,82,
        82,74,53,57,77,75,77,63,80,61,75,78,65,83,60,70,41,41,
        41,40,38,41,46,49,41,46,39,39,48,39,50,43,44,42,43,43,
        45,40,40,43,42,39,42,42,43,44,43,42,42,38,43,45,39,39,
        43,41,39,41,39,42,-1,-1,42,42,49,43,39,45,44,45,39,43,
        44,42,45,42,42,44,41,42,44,45,41,-1,48,46,42,42,43,45,
        43,43,43,46,43,40,41,43,44,44,42,41,44,42,42,43,43,38,
        43,44,37,45,39,38,43,46,41,38,43,39,46,40,39,44,37,39,
        43,43,38,43,44,37,44,42,43,45,42,44,42,37,43,44,45,42,
        38,41,41,44,44,40,44,42,43,42,44,40,43,44,46,37,44,45,
        38,45,44,40,38,42,40,41,37,39,46,46,43,46,43,44,41,38,
        37,39,43,39,39,43,45,-1,43,38,38,42,45,43,40,38,38,43,
        45,38,42,43,42,43,42,-1,-1,44,42,39,46,43,45,45,43,43,
        45,49,45,45,46,42,36,45,36,45,42,42,42,42,45,42,42,40,
        44,41,43,45,45,45,43,43,42,43,42,44,46,42,42,41,39,42,
        40,39,42,41,45,37,43,45,40,43,45,44,46,45,43,38,37,43,
        43,42,39,43,43,43,43,41,44,-1,39,1,1,1,1,1,4,1,2,1,
        1,4,0,3,2,1,1,6,1,2,1,0,0,1,1,0,0,2,1,2,1,0,0,2,
        3,0,1,1,1,0,1,0,1,1,1,1,2,2,1,1,1,3,4,3,1,2,2,3,
        0,1,1,2,2,0,2,3,7,3,1,1,1,2,3,1,1,1,3,0,1,1,0,2,
        0,3,1,1,1,0,1,1,4,1,3,1,3,1,1,5,3,3,2,1,1,2,1,2,
        1,1,3,2,2,-1,0,0,1,1,1,1,1,0,1,4,2,2,0,1,0,1,3,1,
        1,1,3,0,1,1,1,1,1,3,2,2,0,2,3,1,1,1,1,0,1,1,1,3,
        0,0,3,4,1,1,2,0,0,5,3,1,2,2,1,0,3,1,1,2,1,0,1,1,
        1,1,2,2,2,1,3,1,0,1,1,0,1,4,0,1,0,1,1,1,4,1,4,2,
        1,1,1,1,2,1,1,0,1,1,5,2,0,2,5,2,1,3,1,1,4,4,1,0,
        3,1,1,1,1,1,1,1,3,0,1,2,3,0,1,0,1,1,3,0,0,3,2,0,
        1,1,4,4,2,0,1,3,3,2,0,1,2,2,0,1,2,2,2,1,1,1,1,1,
        1,2,5,1,1,1,2,1,1,1,2,2,1,1,1,1,1,1,1,2,1,1,1,1,
        1,2,1,3,1,2,1,1,1,2,1,1,-1,-1,3,2,1,1,3,1,3,2,2,
        3,1,1,1,1,3,2,1,3,1,8,3,1,3,2,3,3,2,1,2,1,1,1,2,
        1,2,1,1,1,2,1,1,1,2,5,2,4,1,3,1,1,6,4,3,2,2,2,1,
        1,3,1,1,1,3,3,-1,1,1,2,1,2,1,2,1,1,4,2,3,1,1,1,2,
        3,2,2,1,2,1,1,1,2,1,1,1,1,1,1,2,4,1,2,1,2,2,2,2,
        2,1,1,1,2,4,2,1,1,1,1,5,4,2,3,1,2,1,2,2,1,1,1,1,
        2,1,1,1,1,3,1,1,1,2,1,1,2,1,1,1,1,1,1,2,2,1,5,2,
        1,2,1,1,1,1,1,2,1,1,1,1,3,3,1,3,5,3,1,3,1,2,5,4,
        2,1,3,1,2,1,1,1,1,2,1,1,1,1,1,1,2,1,2,2,1,1,1,1,
        3,1,2,2,3,4,1,1,2,2,4,1,1,2,1,2,1,2,0,0,0,0,0,0,
        0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,
        1,0,1,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,
        1,0,1,1,1,1,0,0,1,0,1,1,0,0,0,0,1,0,0,1,0,0,1,0,
        0,0,0,1,1,0,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,0,0,0,
        0,1,0,1,0,1,0,1,0,1,0,1,1,0,0,1,1,0,0,0,0,1,1,1,
        1,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,
        1,1,0,1,1,0,1,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,0,0,
        0,1,1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,1,1,0,
        1,1,1,0,0,0,1,0,1,0,1,1,0,0,0,1,0,1,1,1,1,1,1,1,
        1,1,0,1,0,0,0,0,0,1,1,1,0,1,0,0,1,1,0,0,1,0,0,0,
        1,0,0,0,1,1,1,0,1,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,
        0,1,0,1,0,0,0,1,0,1,0,1,1,0,0,0,1,0,1,1,0,0,0,1,
        0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,
        0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,
        1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,0,1,0,1,
        1,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,
        1,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,0,0,1,1,
        0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,
        1,0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,0,0,1,1,1,0,1,1,
        1,1,0,1,1,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,0,0,0,1,
        0,1,0,1,0,0,1,0,1,1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,
        0,0,0,0,0,1,1,1,0,0,1,0,1,1,1,0,1,0,0,0,2,1,3,2,
        2,2,2,1,2,2,2,4,1,1,2,2,1,1,2,2,1,1,2,1,1,3,1,3,
        1,1,1,2,4,1,1,2,2,1,1,1,2,1,3,1,4,4,2,2,1,1,2,2,
        1,1,2,1,1,1,1,3,5,2,1,2,1,2,4,1,1,1,3,3,3,2,2,4,
        1,2,1,2,2,1,1,1,1,2,1,4,1,1,2,4,1,1,1,2,2,3,1,2,
        1,1,2,2,1,1,1,4,1,4,2,1,2,2,2,4,4,2,1,1,2,1,1,1,
        2,2,1,1,1,2,2,2,2,1,2,2,2,2,1,1,1,3,3,1,2,1,2,1,
        3,1,1,1,1,1,1,2,2,2,1,1,1,2,1,4,2,2,2,2,1,2,3,2,
        2,1,1,1,1,2,1,2,1,2,1,1,1,1,2,4,1,4,2,1,2,1,1,1,
        2,2,2,2,1,1,1,1,1,2,4,1,1,1,2,1,2,2,1,1,1,1,1,4,
        1,2,1,3,1,1,4,1,1,2,1,1,1,2,2,1,2,2,1,1,2,2,1,1,
        1,1,1,2,2,2,1,1,1,1,1,1,4,2,1,1,1,2,1,1,1,1,1,1,
        0,1,0,0,1,1,1,0,1,0,0,0,-1,0,1,0,0,1,0,1,1,1,0,0,
        0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,
        0,1,1,0,1,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,0,
        0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,1,1,0,0,1,
        1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,1,
        1,1,0,1,1,1,0,1,1,1,1,0,0,0,0,1,0,1,1,1,0,0,1,1,
        1,1,0,1,1,0,1,1,0,0,1,1,0,1,1,1,0,0,0,0,0,1,0,0,
        0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,1,1,0,1,1,1,1,1,
        1,0,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,0,0,1,1,1,
        0,1,0,1,0,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,0,1,
        1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,1,0,1,0,1,1,1,100,
        25,100,42,40,5,100,0,40,40,0,40,60,15,45,999,30,35,60,
        -1
        ,150,90,15,120,80,20,0,10,78,38,93,100,38,0,5,35,35,
        20,0,700,3,20,20,0,8,0,0,10,60,50,20,30,45,10,6,200,
        -1
        ,2,50,90,60,60,700,20,70,86,42,120,80,50,40,55,300,170,
        0,0,50,40,200,50,0,60,270,4,40,120,120,150,70,15,80,0,
        10,0,30,20,30,3,300,50,10,15,8,10,60,15,30,50,20,15,0,
        40,110,10,150,100,50,70,60,50,123,50,40,40,50,200,60,
        100,20,40,40,34,40,200,25,30,25,3,90,70,10,130,130,8,
        -1,20,10,130,50,30,100,140,55,60,50,150,160,40,50,50,70,
        30,40,3,30,20,50,40,80,30,20,143,200,35,20,40,50,40,50,
        32,40,50,270,0,30,100,30,25,25,200,200,150,50,25,80,65,
        30,150,80,300,50,200,60,30,150,100,10,8,20,100,60,150,
        30,200,40,0,93,0,60,40,65,12,13,70,50,250,220,45,500,
        80,150,30,130,160,100,80,30,30,20,150,75,70,100,30,120,
        450,30,20,50,100,50,0,20,170,150,25,50,15,112,45,350,0,
        40,60,40,6.8499999999999996,8.5999999999999996,10,
        2.3399999999999999,3.1499999999999999,7.8300000000000001,
        7.4299999999999997,0,22,4.4000000000000004,3.2400000000000002,
        8.5600000000000005,9.0600000000000005,20,6.2699999999999996,
        8.2300000000000004,9.0999999999999996,5.9500000000000002,10,10,2,
        21.300000000000001,13.41,22.710000000000001,9.0800000000000001,
        7.8300000000000001,2.0499999999999998,4,3.2200000000000002,3.23,
        6.2999999999999998,14.720000000000001,5.8700000000000001,21,1.05,
        9.5,6,-1,-1,8.4000000000000004,9.0399999999999991,2,-1,
        0.050000000000000003,-1,-1,2,21.16,25.66,20,2,
        5.7000000000000002,4.5,8.8000000000000007,7.2599999999999998,
        0.10000000000000001,9.75,9.2200000000000006,52,7.2999999999999998,
        -1
        ,20,8.9100000000000001,9.7300000000000004,4.8200000000000003,
        8.6199999999999992,3,6.0999999999999996,10.609999999999999,13.42,
        1.5700000000000001,4.2800000000000002,7.0599999999999996,20,
        6.4000000000000004,5,4.2999999999999998,7.3499999999999996,7,10,2,
        10,9,4.5,5.5999999999999996,5.4100000000000001,4.7599999999999998,
        3.5,12.5,3.4300000000000002,7.1399999999999997,6,
        6.0800000000000001,3,2.9500000000000002,20,1.6000000000000001,-1,
        2.8999999999999999,7.5,7.71,7,6.5,4.2999999999999998,
        6.0199999999999996,8.9000000000000004,12,10.09,4.0499999999999998,
        5,-1,7.1200000000000001,7.5999999999999996,9.6500000000000004,7,
        0.46000000000000002,8.5800000000000001,21.539999999999999,8.75,9,
        3.8300000000000001,7.0800000000000001,8.3499999999999996,12.73,
        11.43,6.3499999999999996,4.7999999999999998,6.96,-1,
        8.1799999999999997,4.6500000000000004,15,18,2,3.7999999999999998,
        7,1,4,7.0599999999999996,7,7.96,4.3799999999999999,
        7.4800000000000004,5,8.2200000000000006,5.2000000000000002,10,2.5,
        7,9.1999999999999993,13,0.45000000000000001,0,5,10,15.74,19.43,
        12,7,20,10,20,1,7.6200000000000001,9,12,0.5,
        5.5499999999999998,4.4699999999999998,14,12.5,9.5999999999999996,
        13,5,6.5,22.32,17,3.3700000000000001,20,0.59999999999999998,15,
        11.199999999999999,8.5500000000000007,5.3499999999999996,16.75,
        7.7400000000000002,6.2000000000000002,2.7599999999999998,
        3.3999999999999999,10,3.1000000000000001,0.90000000000000002,
        0.94999999999999996,5,5.4000000000000004,4.7400000000000002,3.5,
        3.25,8.3499999999999996,14.800000000000001,8,14,6,
        4.2000000000000002,2.5,13.449999999999999,4.5,5,5,
        12.640000000000001,5.0999999999999996,10.5,6,4.9000000000000004,4,
        0.10000000000000001,1.8,0,10.300000000000001,6,8.7200000000000006,
        7.7000000000000002,15,7,9,11.99,0.33000000000000002,19,7,13.73,
        7,25,7,4.5,6.7400000000000002,16.829999999999998,7,
        4.6799999999999997,4.6900000000000004,5,13,2.6200000000000001,0.01,
        15,11.960000000000001,2,20,6,3.1299999999999999,12,9,9,
        10.300000000000001,9.4000000000000004,7.5,5,3,27,20,5,
        7.3300000000000001,15,6.4199999999999999,5.3799999999999999,
        5.2999999999999998,2,1,2,2,3,1,2,1,3,2,2,2,1,1,2,1,2,
        2,3,1,1,3,1,1,2,4,1,3,2,2,2,2,2,2,3,3,3,3,2,1,5,
        3,2,2,2,2,3,2,2,1,3,2,3,1,2,2,5,4,1,2,2,1,2,2,2,
        2,2,1,2,2,1,3,2,3,2,5,2,4,1,2,2,1,1,2,2,4,2,3,2,
        2,1,1,2,3,2,2,2,4,5,1,1,3,3,2,3,3,3,1,2,3,3,1,2,
        1,2,5,3,2,3,1,2,1,1,2,2,2,1,1,4,3,2,3,2,2,3,2,2,
        1,1,1,3,2,2,2,2,1,3,2,2,3,2,2,3,2,3,1,3,2,3,3,2,
        5,2,2,2,2,2,4,3,3,1,2,1,3,3,5,1,1,3,2,1,1,1,3,3,
        1,3,1,3,2,3,2,3,2,2,3,2,1,1,2,1,2,1,1,1,1,2,2,1,
        3,2,2,3,2,3,1,3,1,2,2,2,1,2,1,4,4,2,2,5,2,5,1,2,
        4,3,2,2,3,1,1,2,3,3,2,2,2,3,4,2,2,2,1,1,2,1,5,2,
        1,2,2,1,1,1,4,2,1,0,1,0,0,1,1,0,1,0,0,0,1,1,0,-1,
        0,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,1,0,
        1,0,0,0,1,1,1,1,1,1,0,0,0,1,0,1,0,0,1,1,1,0,1,1,
        0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,
        0,1,1,1,1,0,1,0,0,1,1,0,0,1,1,1,0,0,1,0,0,0,0,0,
        0,1,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1,0,1,1,0,0,0,1,
        1,1,0,0,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,1,1,
        0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,0,
        1,1,0,1,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,
        0,0,1,1,0,0,1,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,
        0,0,1,0,1,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,
        0,1,1,0,1,0,0,0,1,2,2,4,1.3,3,-1,1,4,
        3.2999999999999998,3,3,3.2999999999999998,2,2,1,-1,3,2.5,5,
        -1,5,4,3,4,3,4,5,1,1,4,4.2999999999999998,
        3.2999999999999998,2,4,-1,3,4,3.2999999999999998,5,5,1.3,3,1,
        2,1,-1,-1,3,4,4,1.7,3,3,1,4,4,3,5,2,2,3,2,
        3.2999999999999998,2,3,2.2999999999999998,4,5,2,3,1,3,3,6,3,
        -1,-1,4,1,2.7000000000000002,2,4,-1,2,3,-1,3,3,3,4,1,
        2.7000000000000002,3,3,3,2,3,1.7,4,4,2,1.3,
        2.2000000000000002,1,4,3,1.7,3,4,3,3,4.2999999999999998,3,3,
        4,3,3,4,3,4.7000000000000002,4,-1,4,3,2,5,2,-1,
        3.2999999999999998,2,3.7000000000000002,2.7000000000000002,-1,4,3,
        1,1.7,4,4,3,1.3,4,2,6,2.2999999999999998,3,4,3,-1,
        3.7000000000000002,3,4,3,3,-1,3,4,2,3,3,2.7000000000000002,
        2.2999999999999998,2,3,3,-1,3,1.3,2.7000000000000002,
        2.2999999999999998,1.3,2.2999999999999998,2.2999999999999998,1.7,3,
        2,5,4,-1,-1,3,1,-1,1,1,2,1,3,-1,1.5,-1,2,
        3.7000000000000002,3,3.2999999999999998,4,2,-1,3,4,3,4,-1,2,
        2,3,3,-1,3,3,4,3.7000000000000002,6,1,2,4.7000000000000002,
        2.2999999999999998,-1,-1,6,4,1.3,5,2.7000000000000002,1.3,
        3.2999999999999998,4,-1,4,-1,3,4,3,3,1.7,5,3,2,
        3.7000000000000002,3.2999999999999998,1.7,2,3,3,1,3,
        4.2999999999999998,4,2.2999999999999998,3,4,2.2999999999999998,3,
        2.7000000000000002,2.7000000000000002,1.3,2.7000000000000002,
        3.7000000000000002,4,3,5,3,3,5,3,2.1000000000000001,
        2.2000000000000002,2.8999999999999999,2.7000000000000002,
        2.6000000000000001,2.8999999999999999,1.3,3.3999999999999999,2,3,
        3.2999999999999998,2,1.8999999999999999,2.7000000000000002,
        2.2999999999999998,-1,2.7999999999999998,2.5,3.1000000000000001,
        3.2999999999999998,3,2,2.8999999999999999,3,2.6000000000000001,
        2.2000000000000002,3.6000000000000001,1.3,2.6000000000000001,
        3.2999999999999998,3.2000000000000002,2.5,2.3999999999999999,
        3.3999999999999999,3.3999999999999999,2,2.7000000000000002,
        2.1000000000000001,3.5,2.5,1.5,2.8999999999999999,1.5,3,-1,-1,
        -1
        ,2.6000000000000001,3,3.7999999999999998,2.7000000000000002,
        2.2000000000000002,3,1.5,3,2.5,3,3.1000000000000001,
        2.7999999999999998,2.6000000000000001,3.2000000000000002,
        2.2000000000000002,3.2999999999999998,1.3,2.8999999999999999,
        3.6000000000000001,3.3999999999999999,3.6000000000000001,3,
        2.7000000000000002,1.2,2.5,3,3,3.1000000000000001,-1,3.5,
        2.2000000000000002,3,3.2999999999999998,-1,3.2000000000000002,3,
        2.6000000000000001,2.5,3.2000000000000002,3.3999999999999999,
        2.2999999999999998,3.1000000000000001,2.8999999999999999,1.3,
        2.7999999999999998,2.7999999999999998,2.7000000000000002,
        2.7000000000000002,1.8999999999999999,2.6000000000000001,
        1.6000000000000001,3.5,2.8999999999999999,3,1.8,2.3999999999999999,
        1.8,2,2.8999999999999999,2.2000000000000002,2.6000000000000001,
        2.8999999999999999,2.8999999999999999,3.2000000000000002,
        3.7000000000000002,2.1000000000000001,3,3.3999999999999999,
        3.7000000000000002,3.5,3.6000000000000001,2.2999999999999998,
        2.7999999999999998,3,3.5,3.3999999999999999,3.2000000000000002,
        2.2999999999999998,3.2999999999999998,3.2999999999999998,3,
        2.6000000000000001,2.5,2.7999999999999998,2.7000000000000002,
        2.7999999999999998,3.2000000000000002,3,1.3,2.6000000000000001,
        3.3999999999999999,2.5,3.7000000000000002,1.7,3.2999999999999998,
        3.3999999999999999,2.8999999999999999,2.5,2.7999999999999998,
        2.1000000000000001,2.5,2.2999999999999998,2.7000000000000002,
        3.1000000000000001,3.2999999999999998,2.1000000000000001,
        2.8999999999999999,1.6000000000000001,3,3.5,2.3999999999999999,2.5,
        2.8999999999999999,2.7000000000000002,1.8,1.7,2.7999999999999998,3,
        2.2000000000000002,3.1000000000000001,1.6000000000000001,
        3.2999999999999998,2.1000000000000001,1.8999999999999999,
        2.6000000000000001,2.7000000000000002,3.2999999999999998,
        2.7000000000000002,2.2999999999999998,3.2000000000000002,4,
        2.8999999999999999,2.7000000000000002,2.7999999999999998,1.7,
        3.3999999999999999,1.3,2,2.2999999999999998,1.6000000000000001,3,
        2.7999999999999998,1.2,3.6000000000000001,2,3.2000000000000002,
        2.7000000000000002,2.7000000000000002,2.2999999999999998,3,
        2.2000000000000002,2.7000000000000002,3.1000000000000001,
        2.8999999999999999,3.2999999999999998,2.2000000000000002,2,
        2.2999999999999998,2.2000000000000002,3.2999999999999998,
        2.1000000000000001,3,3,3,3.2999999999999998,3.2999999999999998,
        1.8999999999999999,2.7999999999999998,3.2999999999999998,
        3.3999999999999999,2.5,3.2000000000000002,2.7999999999999998,
        2.7000000000000002,3,3.5,3.2000000000000002,2.2999999999999998,3,
        3.6000000000000001,3.3999999999999999,2.8999999999999999,
        2.6000000000000001,3.5,3.5,3.2000000000000002,3.6000000000000001,2,
        3.6000000000000001,2.7999999999999998,1.8999999999999999,
        2.1000000000000001,3.1000000000000001,2.2000000000000002,2,
        3.3999999999999999,3.1000000000000001,2.7999999999999998,
        2.6000000000000001,3.2000000000000002,2.7999999999999998,2.5,
        2.7000000000000002,2.2999999999999998,3.2999999999999998,3,
        3.2999999999999998,2.7999999999999998,3.2999999999999998,
        2.7000000000000002,3.2000000000000002,2.7999999999999998,
        3.2999999999999998,2.6000000000000001,2.8999999999999999,
        3.2999999999999998,3.2999999999999998,3.2999999999999998,1,0,0,0,
        0,1,1,0,1,0,0,1,1,1,1,-1,1,1,1,1,1,1,0,1,1,0,0,1,
        1,0,0,0,1,0,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,0,0,0,
        1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,1,0,0,0,
        0,1,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,0,1,0,1,1,1,0,
        0,1,0,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,0,1,0,0,1,
        1,1,1,1,1,1,1,0,0,1,0,1,0,0,1,1,0,1,1,0,1,1,0,1,
        0,0,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,
        1,1,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,1,
        1,1,1,1,0,1,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,1,0,
        1,0,1,0,1,1,0,1,1,1,0,1,1,0,0,1,0,0,0,1,1,0,0,0,
        0,1,1,0,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1,1,0,0,0,0,
        0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,-1,1,0,0,1,1,
        1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,-1,1,1,0,0,
        0,-1,-1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,
        1,0,0,1,0,0,0,1,1,1,1,1,1,0,-1,1,0,0,0,0,1,0,0,0,
        0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,0,1,0,1,0,0,
        1,0,1,1,0,0,-1,-1,0,1,0,1,0,0,0,0,1,0,0,0,0,1,-1,
        0,-1,0,1,1,0,0,0,0,0,0,0,1,-1,0,-1,1,1,0,1,0,0,0,
        1,0,1,-1,1,-1,-1,1,1,0,-1,0,0,1,1,0,0,1,0,0,0,0,0,
        -1,0,0,-1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,
        0,1,1,-1,0,0,0,1,1,0,1,0,0,1,0,1,0,1,1,1,0,0,0,0,
        0,0,1,1,-1,0,1,1,0,-1,1,0,0,-1,1,0,0,0,0,1,0,1,0,
        1,1,0,0,1,2,5,3,-1,1,3,1,1,1,2,3,2,3,2,1,-1,1,1,
        1,1,-1,2,2,2,4,1,5,3,2,3,2,2,2,2,2,1,1,1,1,3,3,2,
        4,2,1,-1,2,2,3,1,2,-1,-1,2,1,3,1,1,1,5,1,2,2,2,3,
        2,3,1,2,3,4,2,2,2,3,1,4,2,3,-1,1,2,2,3,2,1,1,-1,
        1,1,2,1,3,1,1,2,1,2,2,3,2,1,2,1,2,4,3,5,1,4,1,2,
        1,1,2,1,2,2,1,1,2,1,2,3,3,1,1,-1,-1,2,2,2,3,2,1,
        2,1,1,3,2,2,1,2,-1,2,2,2,3,2,1,3,1,2,3,1,1,2,-1,
        2,-1,4,2,2,3,1,1,3,2,5,2,3,1,-1,-1,2,3,1,-1,2,2,2,
        2,1,4,3,3,1,2,2,2,-1,1,1,-1,2,2,1,3,2,3,3,1,1,1,
        2,2,2,2,2,2,3,1,1,1,3,1,-1,1,1,2,2,2,1,1,2,3,3,1,
        2,1,1,2,3,2,3,1,3,2,3,1,2,-1,2,1,3,1,-1,3,2,1,-1,
        2,1,2,3,5,1,1,3,2,1,1,4,1,1,4,3,4,8,1,8,1,6,-1,8,
        1,8,7,2,4,1,4,1,8,1,8,1,2,2,6,1,4,8,3,8,1,7,8,7,
        7,8,8,1,1,8,8,3,2,8,8,8,1,2,2,7,7,7,2,8,1,8,4,8,
        8,4,8,8,8,2,1,6,2,1,4,8,8,7,1,1,-1,1,2,1,-1,7,7,
        4,1,3,2,3,1,2,4,3,8,1,7,7,7,2,3,1,2,7,1,2,7,1,1,
        4,3,4,1,4,1,8,3,3,2,8,4,1,7,4,8,8,4,4,1,4,2,8,8,
        1,1,8,2,7,3,8,8,1,8,3,4,4,2,2,1,8,1,8,1,7,7,2,1,
        4,1,7,7,1,1,4,4,7,-1,1,2,1,8,2,8,8,1,8,8,8,2,1,4,
        1,8,8,3,1,8,1,1,4,1,1,1,3,1,8,-1,3,3,4,2,8,3,1,1,
        8,8,1,1,1,1,1,2,1,8,2,2,2,2,2,8,4,7,3,2,3,1,1,7,
        2,7,4,1,1,8,8,3,3,1,2,2,4,2,2,8,3,1,2,1,2,3,4,7,
        8,4,4,8,4,4,2,7,7,4,1,7,7,4,4),.Dim = c(265,23),
        .Dimnames = list(c("1","2","3","4","5","6","7","8","9","10",
        "11","12","13","14","15","16","17","18","19","20","21","22",
        "23","24","25","26","27","28","29","30","31","32","33","34",
        "35","36","37","38","39","40","41","42","43","44","45","46",
        "47","48","49","50","51","52","53","54","55","56","57","58",
        "59","60","61","62","63","64","65","66","67","68","69","70",
        "71","72","73","74","75","76","77","78","79","80","81","82",
        "83","84","85","86","87","88","89","90","91","92","93","94",
        "95","96","97","98","99","100","101","102","103","104","105",
        "106","107","108","109","110","111","112","113","114","115",
        "116","117","118","119","120","121","122","123","124","125",
        "126","127","128","129","130","131","132","133","134","135",
        "136","137","138","139","140","141","142","143","144","145",
        "146","147","148","149","150","151","152","153","154","155",
        "156","157","158","159","160","161","162","163","164","165",
        "166","167","168","169","170","171","172","173","174","175",
        "176","177","178","179","180","181","182","183","184","185",
        "186","187","188","189","190","191","192","193","194","195",
        "196","197","198","199","200","201","202","203","204","205",
        "206","207","208","209","210","211","212","213","214","215",
        "216","217","218","219","220","221","222","223","224","225",
        "226","227","228","229","230","231","232","233","234","235",
        "236","237","238","239","240","241","242","243","244","245",
        "246","247","248","249","250","251","252","253","254","255",
        "256","257","258","259","260","261","262","263","264","265"),
        c("1:lfd.Nr","2:Fach","3:Geschlecht","4:Alter","5:Groesse",
        "6:Gewicht","7:Schuhgroesse","8:Geschwister","9:?te Kind",
        "10:Rauchen","11:bei Eltern","12:Art->Uni","13:Autobesitz","14:#CD",
        "15:Bargeld","16:Coca-Cola","17:Mathe.LKurs","18:Abi.Mathe.Note",
        "19:Abi.Note","20:Bi gewuenscht","21:Film","22:Film-Urteil",
        "23:Partei")),class = "matrix")
Fragebogenumfrage 1997:

Universität Bielefeld WS 1997/98
Fakultät für Wirtschaftswissenschaften
P. Wolf


Fragebogen zur Untersuchung von Merkmalen der Statistik-Hörer
(Hinweis: Ihre Angaben werden vertraulich behandelt.)

1. Allgemeine Merkmale

Geschlecht? 1 = weiblich, 2 = männlich

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Körpergröße in cm?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Gewicht in kg?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Alter in Jahren?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Haarfarbe? 1 = schwarz, 2 = braun, 3 = blond, 4 = rot, 5 = Sonstiges

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Geschätze Länge Ihres längsten Haupthaares in cm?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Schuhgröße?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Anzahl Ihrer Brüder?

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Anzahl Ihrer Schwestern?

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Ihre Glückszahl?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Rauchen Sie? 1 = ja, 2 = nein

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Wie viele km haben Sie in Ihrem letzten Urlaub zurückgelegt? (in hundert km)

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Wie viele Stunden haben Sie auf der WiWi-Fete verbracht?

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

2. Wohnungs- und Ausstattungsmerkmale

Wohnen Sie bei Ihren Eltern? 1 = ja, 2 = nein

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Haben Sie in Ihrer Wohnung einen PC zur Verfügung? 1 = ja, 2 = nein

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Wie viele m2 Wohnfläche haben Sie zu Ihrer Verfügung?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Wie viele Minuten benötigten Sie heute für den Weg zur Uni?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Wie viele Musik-CDs besitzen Sie?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Wie viele Bücher besitzen Sie?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Besitzen Sie ein Auto? 1 = ja, 2 = nein

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Welche der Zeitung lesen Sie am liebsten? 1 = FAZ, 2 = Focus, 3 = Frankfurter Rundschau, 4 = Handelsblatt, 5 = Neue Westfälische, 5 = Spiegel, 6 = Stadtblatt, 7 = Süddeutsche Zeitung, 8 = TAZ, 9 = Die Welt, 10 = Westfalen Blatt, 11 = Die Zeit

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

3. Schul- und studiumsbezogene Merkmale

Studiengang? 1 = BWL, 2 = VWL, 3 = WIMA, 4 = Sonstiges

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Durchschnittsnote Ihres Schulabschlußzeugnisses?

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Letzte Mathematiknote?

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Wie sind Sie heute hergekommen? 1 = zu Fuß, 2 = mit Fahrrad, 3 = mit Bus, 4 = mit Auto, 5 = Sonstiges

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

4. Erwartungen/Wünsche

Haben Sie sich Bielefeld als Studienort gewünscht? 1 = ja, 2 = nein

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}

Wie viele DM glauben Sie pro Monat als Student zu benötigen?

\framebox {\rule{12mm}{0mm}\rule{0mm}{3mm}}

Wie viele Stunden werden Sie wohl inclusive Vorlesungen pro Woche studieren müssen?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Wie viele Stunden werden Sie wohl pro Woche Geld verdienen (arbeiten) müssen?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Wie viele Stunden werden Sie wohl pro Woche TV schauen?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Wie hoch wird wohl Ihr Anfangsjahresgehalt nach dem Studium sein? (in tausend DM)

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Wie viele Semester werden Sie wohl studieren müssen?

\framebox {\rule{6mm}{0mm}\rule{0mm}{3mm}}

Wie viele Monate ist der jetzige Dekan der WiWi-Fakultät schätzungsweise alt?

\framebox {\rule{9mm}{0mm}\rule{0mm}{3mm}}

Welche Partei würden Sie wählen, wenn am nächsten Sonntag Wahl wäre? 1 = CDU/CSU, 2 = FDP, 3 = GRÜNE, 4 = PDS, 5 = SPD, 6 = sonstige, 7 = gar keine, 8 = ungültig, 9 = weiß nicht

\framebox {\rule{3mm}{0mm}\rule{0mm}{3mm}}


[263:]

<<lese neuen Fragebogen ein>>=
frabo97<-
structure(.Data = c(2,2,1,2,1,1,2,2,2,1,2,2,2,1,1,2,1,1,2,2,
        1,2,2,2,1,2,2,2,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,2,
        1,1,2,1,1,1,1,1,1,2,2,2,1,1,2,1,2,2,2,2,2,1,1,2,
        2,2,1,2,2,2,2,2,1,2,2,1,1,1,2,1,1,1,2,1,1,2,2,2,
        2,1,2,1,2,2,2,1,2,2,2,1,2,2,2,2,2,2,2,2,1,1,2,1,
        2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,1,2,1,2,2,2,2,1,1,
        2,2,2,2,2,2,1,2,2,2,1,2,1,2,2,2,2,1,1,1,2,2,1,1,
        1,1,2,2,2,2,2,1,2,2,2,2,2,1,1,2,1,1,1,2,2,1,1,2,
        2,2,2,2,2,2,2,188,185,176,182,135,170,172,175,183,167,
        173,174,175,160,167,180,170,170,186,175,173,180,179,187,
        165,181,186,165,179,161,180,182,183,173,182,187,180,180,
        176,181,180,185,183,180,165,164,178,170,165,172,171,167,
        175,185,207,193,165,165,185,172,183,185,188,180,186,180,
        168,176,180,176,180,168,191,194,185,172,165,182,170,173,
        163,169,181,161,164,178,178,160,165,186,187,182,178,160,
        181,174,195,182,191,170,184,190,184,163,175,188,185,180,
        175,175,178,186,159,165,170,162,175,190,188,184,180,170,
        170,154,170,180,180,174,171,181,180,163,178,160,175,180,
        184,0,169,170,168,182,180,176,177,175,170,183,195,190,182,
        190,163,187,188,183,178,160,175,169,184,178,172,175,164,
        175,182,180,184,185,185,170,193,176,197,183,182,171,168,
        183,167,170,178,175,174,170,168,188,188,180,183,171,180,
        175,183,68,75,63,85,47,63,70,85,98,50,71,67,63,56,56,
        75,53,52,76,70,59,100,56,86,46,79,83,50,70,48,100,69,
        65.5,60,70,80,72,70,68,73,73,83,70,78,57,66,72,57,54,
        61,60,56,57,75,118,80,54,50,72,70,77,72,90,73,75,75,52,
        70,85,67,70,52,94,79,87,75,60,67,69,69,62,53,75,53,56,
        53,60,60,58,82,98,70,74,57,74,65,90,78,73,0,83,80,77,
        49,65,83,80,70,65,75,65,74,55,53,76,49,80,75,65,78,63,
        60,65,74,62,57,66,68,80,72,76,49,76,55,73,78,75,0,57,
        63,60,72,78,67,71,70,65,78,73,85,68,79,45,95,83,65,65,
        53,58,70,70,70,58,68,50,67,65,68,85,85,85,70,78,75,110,
        94,70,60,56,76,57,60,70,80,65,64,53,55,90,58,72,69,67,
        60,90,20,22,26,21,21,21,29,22,21,22,22,22,23,19,25,31,
        20,19,20,20,19,32,29,20,19,21,21,19,22,21,24,21,20,19,
        19,20,22,20,20,20,21,22,23,25,22,19,20,23,20,19,20,19,
        20,19,21,21,20,19,20,22,25,24,24,21,22,22,22,22,21,20,
        20,22,20,27,26,22,35,21,25,20,21,20,22,20,19,26,20,22,
        19,21,22,23,23,30,21,22,22,22,29,20,21,22,20,20,20,21,
        21,20,22,21,22,21,19,20,23,23,24,20,20,24,20,19,22,23,
        20,20,20,19,20,23,26,19,21,26,28,23,20,20,21,19,20,22,
        20,21,21,21,19,22,20,20,21,20,21,27,20,20,21,20,20,20,
        21,22,21,19,21,21,20,21,21,30,21,20,22,24,21,24,21,22,
        20,26,23,19,19,20,20,21,21,21,21,21,21,21,20,22,19,2,
        3,3,3,2,2,1,1,1,2,2,5,2,2,3,3,2,2,3,2,3,3,3,4,3,
        3,3,1,3,2,2,3,2,3,3,2,2,2,2,3,2,3,2,2,2,3,1,3,2,
        2,2,3,2,5,3,2,2,3,3,5,3,1,3,3,3,3,4,3,1,2,2,1,2,
        2,3,3,3,3,2,3,3,3,3,2,3,3,2,3,3,4,3,2,2,2,2,2,3,
        2,5,3,3,2,5,2,5,2,3,2,2,3,3,2,2,2,1,3,2,3,2,2,2,
        2,3,3,1,1,1,2,3,3,2,2,2,3,1,2,3,3,3,2,2,3,3,3,3,
        2,3,2,5,3,2,3,2,2,2,2,2,3,2,4,3,3,2,2,2,2,2,5,2,
        2,3,5,2,2,2,3,2,2,3,3,2,3,2,1,1,3,2,3,1,2,2,1,3,
        2,2,2,5,80,5,50,50,10,7,15,40,25,2,3,20,30,3,35,40,
        6,25,40,43,6,8,50,0.20000000000000001,2,15,30,20,8,4,3,
        25,25,15,4,5,2,7,5,10,5,13,50,40,8,30,50,20,70,15,50,
        1,0.69999999999999996,5,65,12,25,40,4,8,5,2,10,10,40,8,8,
        20,40,8,5,3,1,5,25,5,12,25,20,20,7,60,60,20,2,22,30,
        8,15,10,6,50,1,20,5,0.59999999999999998,5,25,8,0.5,2,30,
        4,10,1,4,5,4,12,10,40,6,10,40,5,8,5,7,8,20,7,5,5,7,
        4,7,10,6,4,40,4,30,4,4,6,3,20,35,5,4,1.3999999999999999,
        5,3,10,20,7,3.5,10,10,8,25,10,5,7,15,64,25,50,3,
        0.59999999999999998,20,20,15,30,40,15,10,8,15,10,7,5,12,8,
        0.29999999999999999,4,20,5,20,22,40,5,5,10,30,10,3,8,10,
        7,12,19,10,42,43,40,41,38,39,42,42,45,37,42,42,42,38,
        39,45,38,37,43,42,41,43,42,47,38,44,45,40,39,38,43,44,
        43,40,41,44,43,45,43,44,43,43,43,42,39,39,43,39,37,40,
        40,38,39,43,49,45,39,38,44,39,43,43,44,43,46,43,39,42,
        43,43,40,41,45,46,45,40,39,44,42,40,38,37,45,39,38,39,
        38,39,38,45,46,42,43,36,42,40,47,42,42,39,46,45,44.5,
        37,42,43,43,46,42,42,43,44,38,38,41,37,44,46,44,43,43,
        41,41,44,42,42,42,42.5,42,42,45,38,43,37,42,43,45,42,
        38,39,40,43,46,41,45,44,42,44,47,43,42,45,39,46,45,42,
        42,37,40,40,43,42,40,42,38,42,45,42,44,44,46,40,44,43,
        48,45,43,40,38,43,37,39,40,43,41,40,39,43,45,40,41,41,
        42,42,43,0,0,2,0,0,0,1,0,0,1,1,1,2,0,0,2,1,0,0,0,
        1,0,1,2,0,1,1,2,0,1,0,3,1,2,0,0,1,0,1,0,1,3,1,1,
        1,0,2,0,0,0,0,1,2,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,
        1,1,0,2,0,1,0,1,1,0,1,1,1,1,2,0,1,0,0,0,0,0,0,0,
        0,0,0,2,0,1,1,1,1,1,1,0,0,3,1,0,1,0,2,0,1,1,2,1,
        2,1,0,1,1,2,0,0,1,6,1,0,1,1,1,1,1,1,2,0,1,0,1,1,
        0,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,1,0,0,0,1,
        0,2,1,3,0,1,0,1,1,0,0,0,0,1,1,1,3,0,0,1,0,1,0,1,
        3,0,2,1,0,0,1,1,1,1,1,2,5,2,3,0,1,0,0,0,0,1,1,0,
        0,0,2,1,0,0,0,0,0,0,1,0,1,0,0,0,3,2,0,0,1,1,0,2,
        1,1,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,1,1,1,0,
        0,1,0,1,0,1,0,1,0,3,0,1,2,1,1,1,0,0,3,1,1,1,1,1,
        2,0,1,0,0,2,3,1,1,1,0,0,0,1,0,1,0,1,0,1,0,2,1,5,
        1,2,0,0,0,0,0,2,0,1,1,1,1,0,1,0,2,0,0,0,0,1,0,0,
        1,0,1,1,0,1,0,0,3,2,0,1,0,0,1,1,0,0,1,1,0,0,0,0,
        1,1,0,1,1,0,0,1,0,0,0,0,0,1,1,2,2,0,0,1,1,0,1,2,
        2,1,0,1,1,0,3,0,1,0,17,7,3,4,0,28,8,23,9,7,8,5,1,
        3,7,13,16,5,24,7,7,2,12,7,7,0,3,25,3,12,0,5,5,7,0,
        5,0,25,0,7,66,6,7,17,5,13,23,492,6,14,7,21,13,6,9,7,
        2,2,0,0,17,47,21,0,5,13,6,0,6,11,8,6,7,
        3.1699999999999999,90,28,7,7,99,14,5,18,9,9,8,13,20,5,3,
        56,15,69,71,10,8,7,22,5,0,0,15,2604,6,28,0,8,9,13,0,
        24,7,13,2,777,0,0,13,15,7,16,5,318,3,0,2,31,3,7,0,4,
        4,7,1,7,11,0,16,3,7,13,0,13,666,13,1,1,0,13,23,9,7,
        2,7,7,0,9,16,22,1,16,7,21,13,7,17,0,0,
        3.1739999999999999,7,0,21,25,7,8,0,32,24,0,22,7,22,7,29,
        8,0,0,15,2,13,0,20,17,8,17,13,2,2,2,1,2,1,1,2,2,2,
        1,2,2,2,2,1,2,2,2,2,2,2,1,2,2,2,1,2,2,1,2,2,1,2,
        2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,2,2,2,2,1,2,2,2,2,
        2,2,1,1,2,2,1,1,2,2,2,2,2,2,1,1,1,1,1,1,2,1,2,2,
        1,2,2,2,2,1,1,2,1,1,1,1,2,1,2,1,1,1,1,1,2,1,1,1,
        2,1,2,1,2,2,2,2,1,1,2,1,2,1,2,1,2,2,2,2,2,1,1,2,
        2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,1,
        2,2,2,2,2,1,2,2,2,2,2,2,2,1,2,1,2,1,2,1,1,2,2,2,
        1,1,1,2,2,1,1,1,1,2,1,2,2,1,1,1,2,500,600,105,400,
        0,0,600,6800,5,24,4000,30,200,70,603,2000,500,100,450,80,
        480,170,1500,10,2300,600,200,600,30,0,2000,3000,2000,4000,
        0,80,10,3,10,5,10,2500,15,0.10000000000000001,0,1600,2000,
        600,800,4050,2000,12,7,2500,1700,31,420,1600,1600,0,1200,
        30,200,65,3000,25,3500,6,90,100,35,400,0,3,50,20,200,20,
        10,50,800,200,18,4000,4000,10,1400,2200,120,20000,500,30,
        28,60,100,800,25,38,4000,0,50,2200,24,2.6000000000000001,
        1500,280,20,250,0,100,80,40,2500,30,3000,7000,300,36,20,
        18,1000,800,0,0.14999999999999999,800,23,2000,80,180,25,0,
        4500,18,10,30,15,0,30,0,1900,500,20,300,5,800,2000,100,
        2,210,20,2000,2000,3000,2500,30,80,350,5000,700,25,100,9,
        1200,1000,12,1000,2500,3500,6,45,2000,30,0,3200,900,200,
        50,6000,5000,3000,30,25,50,2000,3000,15,8500,800,30,150,0,
        60,13,30,20,3,3,7,4,0,1,3,3,0,4.5,3,3,3,2,1,1,5,5,
        5,3,3,0,0,4,4,4,5,3,0,6,0,3,2,2,0,4,5,5,5,5,0,5,
        5,3,3,4,5,3,0,0,4,5,5,4,4,3,5,1,4,3,3,5,3,4,3,3,
        0,0,2,0,0,1,0,0,0,0,0,6,4,4,3,3,2,3,3,4,3,0,3,5,
        4,6,4,0,0,3,3,3,4,2,0,4,5.5,5,4,5,4,5,2,0,0,0,4,
        1,0,0,0,0,4,4,0,5,5,4,0,3,4,3,4,2,0,4,1,0,0,0,6,
        6,6,0,4,3,3,3,0,0,5,0,2,0,7,4,4,0,3,0,0,6,4,5,3,
        0,0,2.5,0,0,2,0,2,0,5,7,0,5,8,5,5,5,5,0,0,0,0,3,
        4,0,3,4,0,0,4,0,5,4,0,1,1,1,1,2,1,1,1,2,2,1,1,1,
        1,2,2,2,1,1,1,1,2,2,1,1,2,2,2,1,2,2,1,1,1,2,2,2,
        1,2,2,2,2,1,2,1,1,2,2,2,1,1,2,2,1,2,2,1,2,2,2,1,
        1,1,1,1,1,2,1,1,1,1,1,2,2,2,1,2,1,1,2,2,1,1,2,2,
        2,1,2,1,1,1,2,1,2,2,2,2,2,2,1,1,2,2,2,1,1,2,1,2,
        1,2,1,2,1,2,2,1,1,1,2,1,1,2,1,2,2,1,2,2,1,0,1,2,
        1,1,1,1,1,2,1,2,1,2,1,1,2,2,1,2,2,2,1,2,1,1,1,2,
        1,1,2,2,1,2,1,1,2,1,2,2,2,1,2,1,1,1,1,2,1,2,2,2,
        1,1,2,2,1,1,1,2,2,1,1,1,2,1,1,1,1,1,1,2,1,1,1,1,
        1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,2,2,1,2,1,1,1,1,
        2,1,1,1,1,1,1,1,1,2,2,1,1,1,2,1,1,2,2,1,1,1,2,2,
        1,1,1,1,1,1,1,2,1,1,1,1,2,1,1,2,1,1,2,1,2,2,2,2,
        1,2,1,1,1,2,1,1,2,1,1,2,2,2,2,2,2,1,1,1,2,1,1,1,
        2,1,2,1,1,1,2,1,1,1,1,2,1,1,1,1,1,1,2,2,1,1,1,1,
        1,1,1,1,2,2,1,1,2,2,1,1,2,1,1,2,1,1,1,2,2,1,1,1,
        1,1,2,2,2,1,1,1,1,2,1,2,1,1,1,1,1,2,1,1,2,2,1,1,
        1,1,1,1,2,2,1,1,2,1,1,2,1,2,1,1,1,39,12,78,26,25,
        15,100,15,50,38,60,25,15,17,20,22,26,20,12,0,40,70,66,
        20,58,26,21,40,40,48,70,40,110,35,60,15,20,35,36,48,40,
        12,9,65,12,18,25,55,20,100,25,25,25,30,18,18,20,30,50,
        54,120,50,25,60,20,20,43,20,30,8,30,20,23,100,50,20,60,
        30,35,20,63,25,25,20,20,27,100,20,20,50,15,19,18,120,
        22,35,52,21,80,25,10,45,21.390000000000001,24,30,30,23,30,
        25,50,18,17,19,26,50,60,40,40,40,48,20,20,35,12,35,20,
        15,21,25,78,80,15,30,50,65,50,0,30,0,30,25,7,22,95,
        120,20,20,30,23,20,32,24,40,60,24,20,64,40,15,40,30,60,
        68,30,60,21,30,29,34,60,45,15,14,35,14,35,22,15,28,54,
        25,30,30,25,54,32,94,70,25,20,25,90,20,90,40,60,35,30,
        40,30,25,25,15,50,50,20,18,60,95,25,10,15,30,13,25,30,
        25,20,90,7,20,30,30,45,10,30,15,20,20,5,5,20,8,25,10,
        120,25,40,40,20,30,5,15,25,25,30,20,15,39,3,7,10,17,
        15,20,50,50,45,45,20,10,25,30,30,56,30,20,8,40,20,90,
        20,10,25,15,35,45,5,10,10,5,30,40,25,22,100,35,20,20,
        30,50,15,30,5,20,90,10,35,10,50,10,10,60,20,45,5,35,
        10,55,10,60,30,30,20,15,20,3,15,40,20,45,20,35,40,10,
        45,75,20,20,50,90,20,40,25,30,25,50,25,40,35,20,15,60,
        34,15,5,30,15,95,50,60,95,60,20,20,30,60,90,100,90,40,
        45,10,18,10,20,40,26,4,45,30,6,50,10,90,45,40,45,10,
        10,120,30,45,20,30,20,18.5,25,2,20,100,40,86,54,80,3,
        300,12,50,80,40,20,30,40,40,50,30,30,20,180,25,190,30,
        32,50,300,160,40,80,50,350,20,25,10,30,50,40,150,40,50,
        15,3,30,70,5,20,50,100,20,10,120,35,15,233,450,220,20,
        30,35,15,20,200,250,10,90,15,160,40,30,500,15,15,91,300,
        50,150,25,50,50,30,30,130,160,0,6,15,40,40,20,120,50,
        100,68,100,20,100,25,50,40,30,60,100,152,40,25,150,40,
        20,0,40,30,25,0,35,0,40,0,150,50,200,50,120,80,300,10,
        20,200,10,30,70,60,15,20,150,90,40,40,0,50,10,60,40,
        180,100,63,0,50,30,20,35,30,50,10,100,30,100,55,25,4,
        40,30,150,20,20,25,50,280,8,20,100,100,30,0,60,81,50,
        20,20,20,10,100,30,10,12,30,60,30,20,20,0,1,1,100,100,
        60,80,180,200,300,0,30,150,80,300,150,20,10,60,30,40,30,
        150,150,400,0,200,0,800,20,100,100,50,5,400,200,40,150,
        30,30,0,100,30,80,25,100,30,12,80,10,30,100,21,100,100,
        30,500,40,50,63,70,30,70,50,40,45,15,350,220,50,300,25,
        120,100,60,60,40,40,0,300,50,500,200,100,25,20,200,300,
        50,30,0,40,50,180,25,200,20,20,120,3000,20,400,50,50,30,
        50,100,152,130,328,100,50,30,120,20,40,50,30,20,40,0,
        100,80,50,20,100,20,200,30,150,10,100,50,100,20,10,1500,
        40,100,50,250,60,10,0,0,70,80,60,120,150,300,0,300,20,
        100,20,60,100,30,60,80,75,600,200,20,300,200,50,30,100,
        60,20,50,50,70,50,400,120,100,200,2,50,50,200,50,30,50,
        100,50,6,25,20,100,15,5,30,0,100,50,100,80,1,2,1,1,2,
        1,2,1,1,2,1,1,1,1,2,1,2,1,2,2,2,1,2,1,1,1,2,2,2,
        2,1,1,2,2,2,1,1,1,1,1,2,2,2,1,2,1,2,1,2,2,2,2,1,
        1,2,1,2,1,2,1,1,1,1,2,1,2,2,2,2,2,2,1,1,1,1,2,1,
        1,1,1,1,1,1,2,1,1,1,2,2,1,2,1,1,1,2,1,2,2,2,2,1,
        1,2,2,2,1,2,2,2,1,2,1,2,1,2,1,1,2,1,1,1,1,1,1,2,
        2,1,2,1,1,1,1,1,1,1,2,2,2,2,1,2,2,1,1,1,2,1,1,2,
        1,1,1,2,2,2,1,1,2,2,1,2,1,1,2,2,2,2,2,1,1,1,2,1,
        1,1,1,2,1,2,2,2,2,1,1,1,1,1,1,2,1,1,2,1,1,1,5,5,
        2,1,0,5,5,5,2,2,2,10,10,5,1,5,1,2,5,2,5,5,6,5,5,
        5,5,5,5,5,2,5,5,5,2,5,5,2,2,1,5,2,10,2,2,2,2,5,2,
        5,5,2,1,5,2,5,11,5,5,2,5,11,5,2,10,2,11,9,5,5,5,5,
        2,5,11,2,11,2,2,9,5,2,2,2,5,11,4,2,2,9,11,5,7,2,5,
        5,4,4,5,5,3,2,5,5,5,3,2,9,9,1,2,2,5,5,5,2,2,5,5,
        5,5,5,2,4,10,1,5,2,3,5,0,9,3,5,5,10,5,7,2,5,1,5,
        2,10,5,5,5,2,2,5,4,5,5,2,10,10,6,2,5,1,11,1,2,9,2,
        1,6,4,7,6,1,5,5,5,5,5,5,5,4,2,8,1,2,2,2,2,10,5,9,
        2,1,5,5,1,5,1,1,1,1,1,1,2,1,1,1,1,1,1,2,3,2,1,1,
        1,2,1,1,4,1,1,1,1,1,2,1,1,2,2,2,1,1,1,1,2,1,1,1,
        1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,2,1,
        1,2,2,1,1,1,1,2,1,1,2,1,1,1,1,2,1,1,1,2,1,1,1,2,
        1,1,1,2,1,1,1,1,2,1,1,1,1,1,2,2,1,1,1,1,1,1,1,2,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,
        1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,
        1,2,1,1,2,2,1,1,1,1,1,1,1,2,1,1,1,1,2,1,2,1,1,1,
        1,1,1,1,1,1,1,1,2,1.8,2.7000000000000002,2,
        3.4000000000000004,0,3,3.2000000000000002,3,2,1,
        3.3000000000000003,2.8000000000000003,2,3,2,3,1.7000000000000002,
        3,2,3.1000000000000001,1,3,1.6000000000000001,3.1000000000000001,
        2.8000000000000003,3.9000000000000004,3,2.6000000000000001,1.5,
        2.6000000000000001,3,3,3,2.3000000000000003,2.7000000000000002,
        3.2000000000000002,3,3,3.3000000000000003,2.7000000000000002,
        2.7000000000000002,2.3000000000000003,2.2000000000000002,
        3.3000000000000003,2.4000000000000004,2.7000000000000002,3,3,3,2,
        2,2,2.1000000000000001,2.9000000000000004,2.6000000000000001,
        2.6000000000000001,2,1.9000000000000001,2.6000000000000001,
        2.8000000000000003,2,1,2,2.8000000000000003,3,3,1.8,3,3,2,2,
        2.5,3,1.4000000000000001,1.6000000000000001,3,2.8000000000000003,
        2.9000000000000004,2.3000000000000003,2.9000000000000004,2,2,3.5,
        2.7999999999999998,3.2000000000000002,2,3,2.2999999999999998,
        2.8999999999999999,1.7,3.5,3,2.7000000000000002,3,
        3.3999999999999999,1,1,1,3,3.3999999999999999,3,2,
        3.2999999999999998,2.6000000000000001,2.8999999999999999,
        2.7000000000000002,2.8999999999999999,3,2,3,3,3,
        2.7999999999999998,1.8999999999999999,3.2000000000000002,3,
        2.7999999999999998,2.8999999999999999,3,3,3,2.7000000000000002,3,
        2,3,2.8999999999999999,2.1000000000000001,3,3.2000000000000002,2,
        3,2,1.8999999999999999,3.3999999999999999,3,3,2.7000000000000002,
        0,3.7000000000000002,2.8999999999999999,2.6000000000000001,2,
        3.2000000000000002,3,2.7999999999999998,3.1000000000000001,2,3,3,
        1.8999999999999999,2,2.1000000000000001,2.7999999999999998,3,
        2.1000000000000001,2.3999999999999999,3,2.1000000000000001,1.3,3,
        1.8,1.3999999999999999,2,2.5,1,2.8999999999999999,1.8,
        3.2999999999999998,2.2999999999999998,2,1,2.8999999999999999,
        2.7999999999999998,3,3.2000000000000002,2,2,2.5,2.5,
        2.8999999999999999,2,1.8,2,3.1000000000000001,3.3999999999999999,
        3.1000000000000001,3,2,3,3.5,2,2.6000000000000001,2,0,
        3.3999999999999999,3,3,4,5,3,3,3,2,1,2,3,2,2,4,3,3,2,
        4,2,2,1,4,2,2,2,2,3,3,1,3,2,2,3,3,2,3,3,3,5,3,4,
        9,2,3,2,4,6,3,4,3,2,1,1,3,3,3,2,2,12,2,1,2,2,5,3,
        4,2,1,3,3,3,3,3,1,1,3,4,2,2,11,4,2,3,3,3,2,4,1,2,
        2,3,3,4,3,3,1,2,3,0,3,4,4,4,1,3,4,4,3,3,2,4,2,2,
        1.7,4,4,3,4,3,3,3,2,5,2,3,2,1,3,4,3,4,1,2,1,2,2,
        2,0,4,2,3,2,3,3,2,3,2,3,4,1,4,1.7,2,4,3,3,2,2,1,
        2,1.7,1,3,3.1000000000000001,1,3,1,2,2,2,1,3,2,4,4,3,1,
        4,1.7,3,3,2,2,2,4,4,2,2,4,4,2,2,3,0,3,3,4,1,4,4,
        3,4,4,4,4,4,4,4,4,3,4,4,4,2,3,4,4,3,4,4,4,3,3,3,
        3,4,4,5,4,4,2,4,4,4,3,5,3,4,4,3,3,1,4,3,4,3,4,4,
        4,1,4,1,4,4,4,0,4,4,4,4,4,3,3,3,3,3,4,4,4,4,3,4,
        4,5,1,4,4,4,3,3,1,4,3,3,4,5,3,3,4,2,4,3,3,3,3,4,
        4,3,4,3,1,1,4,3,4,1,4,1,4,3,5,3,4,4,1,4,4,1,4,3,
        3,4,3,3,4,4,5,4,4,3,3,3,3,3,3,3,3,1,3,3,3,4,4,3,
        4,2,4,3,5,3,3,5,4,4,4,3,5,3,5,5,3,3,3,4,5,4,1,4,
        4,4,4,3,4,4,5,5,4,4,4,4,5,4,4,4,4,4,4,4,1,4,1,1,
        1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,2,1,1,1,1,1,
        1,2,1,1,1,1,1,1,1,2,2,1,2,1,2,2,1,1,1,2,2,1,2,1,
        1,2,2,1,2,1,2,2,1,2,1,1,1,1,1,1,1,1,1,2,1,1,2,1,
        1,1,1,1,1,1,1,2,1,2,2,1,1,1,2,2,2,2,2,1,2,1,2,2,
        1,1,1,2,2,1,1,2,2,1,1,2,2,1,2,2,2,1,1,2,1,1,1,1,
        2,1,2,1,1,2,2,1,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,
        2,1,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,2,1,2,1,1,2,1,
        1,2,2,1,1,2,1,1,2,1,1,1,1,2,1,2,1,1,2,2,1,1,1,1,
        1,650,350,800,390,1000,1000,500,400,400,1000,500,900,1000,
        560,900,1000,800,400,300,700,500,0,2000,300,700,1200,400,
        700,500,700,2000,1000,500,400,500,1100,1000,900,1500,1000,
        800,700,400,1000,800,400,1000,1000,500,100,200,1100,1100,
        600,600,1000,100,1000,850,800,1500,1200,500,300,1000,1000,
        1700,100,500,100,500,500,1200,1000,2000,1000,2000,700,1500,
        800,800,300,300,1000,1000,600,700,860,400,400,1000,1500,
        500,2000,1000,600,1000,1000,1200,1000,1000,25,1000,1100,400,
        800,1000,500,1000,1500,1000,400,1000,250,2000,1500,1000,300,
        600,850,500,300,900,1000,1300,900,500,900,1000,600,600,
        1000,700,1000,1000,400,400,1200,1000,500,700,300,800,500,
        100,900,1500,800,900,1500,650,650,500,600,300,200,0,200,
        300,1000,1000,400,700,500,500,1000,1500,1100,1400,1400,500,
        800,500,1000,800,800,1000,800,800,1500,700,250,200,1600,
        1000,500,200,500,2000,1000,600,1500,600,1300,500,32,38,32,
        30,30,20,25,20,40,30,50,30,30,20,30,35,30,30,40,20,30,
        50,25,30,30,25,30,20,40,17,35,28,30,30,0,33,35,35,35,
        35,30,37,37,28,35,40,45,35,12,12,40,35,40,25,30,35,25,
        22,30,35,20,40,35,30,30,40,40,30,28,30,15,28,25,20,30,
        35,30,20,25,25,25,25,25,40,35,55,35,10,40,45,26,40,30,
        30,20,40,39,39,0,25,25,50,40,5,20,50,40,35,12,40,50,
        35,30,30,30,40,30,20,25,40,25,30,15,35,20,50,30,30,40,
        30,56,50,30,25,40,25,35,25,0,35,50,0,40,30,30,40,0,25,
        50,30,30,35,30,50,25,40,15,30,25,35,40,50,0,22,50,40,
        50,25,40,30,40,32,30,50,30,40,30,30,28,25,30,25,25,30,
        40,30,45,0,30,0,42,40,37,8,35,0,3,8,3,20,20,2,7,0,
        20,8,15,0,0,0,10,10,12,8,6,6,14,20,3,10,0,6,10,8,10,
        2,15,8,7,0,0,5,8,15,8,8,0,5,10,0,0,11,15,4,7,10,0,
        0,5,0,0,30,6,0,10,15,4,0,0,3.5,10,0,0,0,10,7,12,0,
        15,30,12.5,30,4,25,10,25,0,0,10,15,8,10,6,20,20,10,20,
        20,0,0,10,9,8,0,5,16,0,12,8,0,10,0,2,16,0,10,0,10,
        8,30,0,0,20,12,12,10,18,0,8,4,0,12,8,0,0,1,4,0,3,
        16,3,0,0,0,14,0,0,6,0,0,3,0,0,0,10,10,0,8,4,2,0,0,
        11,0,10,0,3,0,0,0,10,0,10,0,21,15,8,0,0,25,10,10,
        3.5,4,20,10,4,6,15,16,0,20,20,0,0,10,12,0,10,4,4,2,
        6,12,0,16,5,10,6,5,10,10,7,10,4,2,10,10,6,3,1,0,10,
        15,5,10,20,14,5,20,10,8,20,3,0,10,0,4,5,5,5,4,3,15,
        5,5,12,14,4,4,6,10,5,4,10,15,6,3,3,8,10,8,10,1,0,5,
        0,10,30,0,10,20,20,6,5,3,3,15,15,5,3,1,15,5,10,2,3,
        2,10,20,2,3,2,10,0,14,8,8,5,7.5,10,50,32,28,10,4,10,
        2,7,6,7,10,10,8,30,10,20,8,15,10,14,2,12,10,12,5,6,
        2,15,10,1,6,10,10,16,7,7,0,0,5,5,20,10,10,10,12,1.5,
        2,10,10,5,10,7,10,10,9,10,1,10,2,3,10,5,5,10,0,0,40,
        4,3,5,10,8,20,0,5,10,10,10,15,5,3,4,20,20,6,2,20,20,
        10,7,10,4,10,10,3599,60,60,2000,4000,4000,4000,4000,60,0,
        5000,0,3500,0,0,3000,3000,3000,2,3,3000,0,6,4,2500,2500,
        3,60,0,0,4,3000,2000,70,0,4.5,4,3,300,4,25,60,40,60,0,
        20,8000,36,36,0,1500,30,100,60,55,25,1500,2500,80,3800,4,
        38,80,20,3500,4,4300,2500,60,0,0,4000,8000,8,70,0,70,
        1000,60,5,3000,50,50000,4000,0,70,40,5000,20,60000,30,60,
        3,30,5000,4,70,75,5000,4,2500,80,60000,60,0,2.5,4,60,0,
        2000,4,4,5,30,10000,6000,5000,0,50,60000,50,0,0,80,5000,
        50,5000,5000,60,70,12,4000,4,5,5,4,5000,0,0,4000,4000,5,
        1.5,3000,3500,5000,70,1,4,5000,60,6100,3000,3000,4,4000,0,
        0,5000,3000,5000,70000,3000,5000,4000,50000,127000,72000,
        4500,70,60,60,80,3500,0,75,72,70000,65,3500,20,3000,3000,
        3.5,4000,0,60000,60000,30,25,70,800,4,2000,3500,10,10,10,
        11,14,14,10,10,13,12,13,10,10,10,10,10,9,10,10,10,11,
        0,8,9,11,10,10,10,9,12,9,8,10,8,8,10,10,10,10,11,9,
        11,9,11,9,9,10,12,10,10,10,9,8,9,10,12,10,10,11,11,
        10,9,10,8,8,10,9,12,12,9,5,10,9,9,9,12,10,10,10,12,
        8,8,10,13,11,10,10,10,10,8,10,10,12,12,12,8,8,8,10,
        10,9,8,10,10,12,10,10,9,9,10,10,10,10,10,10,10,10,12,
        12,10,11,10,10,10,8,8,10,9,10,10,8,10,10,10,12,11,10,
        8,13,9,11,9,9,10,15,10,8,10,10,10,9,10,10,8,12,11,0,
        10,9,11,9,12,10,10,10,10,16,10,9,12,9,11,9,20,9,9,9,
        8,9,11,12,10,9,8,14,10,9,10,12,12,10,8,8,4,9,620,45,
        45,0,0,99,45,720,720,0,0,0,175,0,0,500,480,480,480,700,
        60,0,600,480,35,600,600,720,600,50,12,600,50,600,0,480,
        480,0,500,500,40,20,500,600,0,600,738,607,500,605,660,
        615,600,612,600,625,600,660,500,4085,622,650,600,430,24,
        500,64,660,600,480,60,600,0,700,1200,0,720,20,550,500,
        500,56,52,744,550,200,400,55,0,660,63,600,500,600,600,
        540,660,660,0,0,150,650,720,720,999,550,650,600,0,90,50,
        630,60,600,0,600,50,48,480,630,500,636,630,48,50,0,50,
        45,600,480,100,600,600,480,550,480,650,0,0,0,50,44,720,
        500,600,800,0,50,500,600,540,50,600,600,36,10,45,0,600,
        300,60,60,0,1,1,540,700,610,620,666,60,45,674,648,0,600,
        600,480,587,650,3679,580,540,600,0,600,0,0,360,0,0,600,
        480,0,720,9,3,7,5,0,5,1,4,1,3,6,0,5,9,9,5,5,1,3,7,
        9,9,3,5,5,5,2,7,3,0,5,5,1,6,9,9,7,2,5,9,7,9,1,7,
        1,3,1,5,8,9,1,1,2,1,1,1,1,9,3,7,6,6,9,2,3,1,4,7,
        2,3,7,5,8,8,4,1,3,9,7,1,1,7,1,7,7,6,1,2,3,2,3,1,
        8,7,5,3,2,1,5,1,3,2,9,9,5,1,1,3,0,1,5,5,9,5,0,1,
        7,5,1,9,1,9,2,7,7,8,5,3,1,1,6,9,1,7,3,9,5,0,9,9,
        9,5,1,1,1,5,9,1,5,7,9,2,5,3,9,1,6,5,5,3,2,7,1,8,
        1,1,0,2,2,3,1,7,1,8,9,5,3,3,9,5,9,5,5,5,9,5,5,2,
        5,7,1,5,1,0,3),.Dim = c(195,34),.Dimnames = list(character(0),
        c("1:Geschlecht","2:Groesse","3:Gewicht","4:Alter","5:Haarfarbe",
        "6:Haarlaenge","7:Schuhgroesse","8:Brueder","9:Schwestern",
        "10:Glueckszahl","11:Rauchen","12:Urlaubs-km","13:Feten-Stunden",
        "14:Eltern-Wohnung","15:PC-Zugriff","16:Wohnflaeche",
        "17:Weg-Minuten","18:CDs","19:Buecher","20:Auto","21:Zeitung",
        "22:Studiengang","23:Abi-Note","24:Mathe-Note","25:Verkehrsmittel",
        "26:Wunschort","27:Ausgaben","28:Studierzeit","29:Verdienzeit",
        "30:TV-Zeit","31:Anfangsgehalt","32:Studiendauer","33:Dekansalter",
        "34:Partei")))

Daten zum Skript


[264:]

<<lese Daten zum Skript ein>>=
s165<-0.01*c(
172,51,66,414,292,14,97,157,10,441,9,467,168,193,27,311,179,87,154,11,
282,771,133,351,1313,323,428,432,133,129,468,97,213,441,539,452,48,22,115,103,
390,142,26,76,199,386,87,120,432,311,364,107,360,12,411,55,16,313,46,186,
423,157,106,460,817,259,215,38,4,162,258,51,805,201,598,178,97,34,63,44,
126,10,39,542,77,27,214,119,202,174,,105,315,23,459,228,238,347,170,174,84)
s166<-c(40,37,41,40,43,37,38,40,42,43,39,40,39,40,42,38,
        41,41,39,38,42,40,41,39,37,40,41,40,39,40,41,42)

init.revbook


[265:]

<<initialisiere einige Funktionen>>=
init.revbook<-function(){
        options(digits=5)
        assign("Menu",Menu,frame=1)
}

open.revbook , open.lotto , show.revbook , show.lotto


[266:]

<<initialisiere einige Funktionen>>=
open.revbook<-function(){
 # h<-unix("if [ -f revbookreport.rev ] ; then \n echo 'hallo' \n fi ")
 # if(length(h)>0){
 #      cat("Es existiert bereits eine Reportdatei.\n")
 #      cat("Soll diese geloescht werden ? (j=Datei loeschen)\n")
 #      if("j"==readline()) unix("rm revbookreport.rev",,F)
 # }
   h<-find("open.revbook")
   h<-substring(h,1,nchar(h)-5)
   if(exists("win.graph")){
       revive(paste(h,"revbook",sep="") ,editor="edit" )
   } else {
       revive(paste(h,"revbook",sep="") ,editor="vuepad" )
   }
}
open.lotto<-function(){
 # h<-unix("if [ -f revbookreport.rev ] ; then \n echo 'hallo' \n fi ")
 # if(length(h)>0){
 #      cat("Es existiert bereits eine Reportdatei.\n")
 #      cat("Soll diese geloescht werden ? (j=Datei loeschen)\n")
 #      if("j"==readline()) unix("rm revbookreport.rev",,F)
 # }
   h<-find("open.revbook")
   h<-substring(h,1,nchar(h)-5)
   if(exists("win.graph")){
       revive7(paste(h,"lotto",sep="") ,editor="edit" )
   } else {
       revive7(paste(h,"lotto",sep="") ,editor="vuepad" )
   }
}


[267:]

<<initialisiere einige Funktionen>>=
show.revbook<-function(){
   cat("Funktion zur Anzeige des revbook mit ghostview\n")
   cat(" Bitte haben Sie ein wenig Geduld!\n")
   h<-find("open.revbook")
   h<-substring(h,1,nchar(h)-5)
   gv<-unix("which ghostview")
   h<-paste(gv," ",h,"revbook.ps&",sep="")
   unix(h,,F)
   print("ghostview wird mit  q  beendet!")
   invisible()
}
show.lotto<-function(){
   cat("Funktion zur Anzeige des Lotto-Papiers mit ghostview\n")
   cat(" Bitte haben Sie ein wenig Geduld!\n")
   h<-find("open.revbook")
   h<-substring(h,1,nchar(h)-5)
   gv<-unix("which ghostview")
   h<-paste(gv," ",h,"lotto.ps&",sep="")
   unix(h,,F)
   print("ghostview wird mit  q  beendet!")
   invisible()
}

Menüsteuerung: Menu , look.act.points.up , activate.jump

Diese Menufunktion soll nicht nur ein Menu unterstützen, sondern falls ein Report läuft, auch bei Bedarf intern die Funktion revbook.report() aufrufen. Mit dieser können dann Plots in den Report kopiert werden und es können kleine manuelle Eingriffe von diesem vorgenommen werden. Fraglich ist noch, ob die Ausgabe in den Report der Menü selbst unterbunden werden soll.


[268:]

<<initialisiere einige Funktionen>>=
Menu<-function(auswahl, mess = "items:",la,title="",report=F ){
   l.cat<-
      function(..., file = "", sep = " ", fill = F, labels = NULL, append = F)
      .Internal(cat(..., file, sep, fill, labels, append), "S_cat", T, 0)
   if(missing(la)) la<- letters[1:length(auswahl)]
# ----- VORLAEUFIG ------
      report<-F
# ---- wegen der Sicherheit ---------
   if(report){
           auswahl<-c(auswahl,"Reportbearbeitung/Plot kopieren")
           la<-c(la,"R")
   }
   mess <- c(mess, paste("\n", la, auswahl), "\nSelection: ")
         if(exists("sinkname.r")) sink()
         if(0<nchar(title)) l.cat(title,"\n")
         l.cat(mess)
         if(exists("sinkname.r")) sink("sinkname.r")
      #  h<-unix("read h; echo \"$h\"")
         h<-readline()
         res <- match(substring(paste(h, " "), 1, 1), la)
         if(is.na(res))res<-0
         if(report && res==length(la)){
             assign("cmds",c(">revbook.report()","."),frame=w.frame.r)
             res<-1
         }
   return(res)
}
In dieser Sektion wird eine Funktion definiert, die die eingelesene sch -Datei auf Aktivierungspunktdefinitionen hin untersucht. Die Aktivierungspunkte müssen mit ihren Merkmalen nach festen Regeln in der rev -Quelldatei abgelegt sein. Ihre allgemeines Aussehen kann beschrieben werden durch:
$\langle$Suchschlüssel$\rangle$$\langle$Trennzeichen$\rangle$$\langle$Sortiertext$\rangle$$\langle$Trennzeichen$\rangle$$\langle$Variablenname$\rangle$$\langle$Trennzeichen$\rangle$$\langle$Text$\rangle$$\langle$Rest$\rangle$
Die vier Bestandteile einer Aktivierungspunktdefinitionen: Suchschlüssel, Sortiertext, Variablenname, Text müssen mittels eines Trennzeichens voneinander abgetrennt werden. Leerzeichen werden ernst genommen, so daß sie nicht willkürlich um Trennzeichen herum verteilt werden können. Der Suchschlüssel dient zum Auffinden der Aktivierungspunktdefinitionen. Der Sortiertext kann später zum Sortieren verwendet werden. Der Variablen mit dem gewählten Variablennamen wird die Sektionsnummer des Aktivierungspunktes zugewiesen. Der Text kann den Aktivierungspunkt zum Beispiel für ein Menu verbal näher beschreiben. Nach dem Text kann noch ein Rest fester Länge folgen, der während der Verarbeitung abgeschnitten wird.

Eine Aktivierungspunktdefinition muß jeweils als erste Zeile eines Modules ganz links in der Quelldatei stehen.

Ausgegeben wird eine Matrix mit vier Spalten: In der ersten Spalte stehen die Variablennamen, in der zweiten die Texte, in der dritten der Sortierindex und in der vierten die zugehörigen Sektionsnummern.

Mit dieser Basisinformation lassen sich ein Menu, das Texte für bestimmte Sprungstellen zeigt, sowie ein Sprungmechanismus zu der ausgewählten Sektion konstruieren (siehe dazu: activate.jump ). Zusätzlich werden die gefundenen Sektionsnummern im frame==1

abgelegt, wenn zwischen Suchwort und Trennzeichen Namen gefunden werden. Da manche Texte im Quelltext hinten ungeeignet aufhören, kann über die Variable end.skip die Anzahl der Zeichen angegeben werden, die hinten von den übergebenen Menupunkten abgeschnitten werden sollen.


[269:]

<<initialisiere einige Funktionen>>=
look.act.points.up<-function(key='cat("Revbook',trenn=":",end.skip=3){
   <<look.act.points.up: ermittle Zeilen mit  Aktivierungspunktdefinitionen>>
   <<look.act.points.up: ermittle Sektionsnummern>>
   <<look.act.points.up: ermittle Sortierindex, Text und Namen>>
   <<look.act.points.up: erstelle Ausgabe>>
}
Es werden die Zeilen mit Aktivierungspunktdefinitionen auf act.def

ohne Suchschlüssel und dem Rest abgelegt. zeilen hält die Orte der Definitionen fest.


[270:]

<<look.act.points.up: ermittle Zeilen mit  Aktivierungspunktdefinitionen>>=
sch.r  <-get("sch.r",frame=sys.parent())
act.def<-sch.r[zeilen<-(1:length(sch.r))[substring(sch.r,1,nchar(key))==key}
act.def<-substring(act.def,nchar(key)+2,nchar(act.def)-end.skip)
section.no merkt sich die Sektionsnummern.


[271:]

<<look.act.points.up: ermittle Sektionsnummern>>=
section.no<-substring(sch.r[zeilen-1],2,4)
section.no<-ifelse( substring(section.no,3,3)==":",
                    substring(section.no,1,2), section.no )
section.no<-ifelse( substring(section.no,2,2)==":",
                    substring(section.no,1,1), section.no )


[272:]

<<look.act.points.up: ermittle Sortierindex, Text und Namen>>=
act.text <-act.def
act.names<-act.index<-rep(" ",length(act.def))
for(i in 1:length(act.def)){
    h<-(1:nchar(act.def[i]))
    h<-h[substring(act.def[i],h,h)==trenn]
    if(length(h)==2){
        act.index[i]<-substring(act.def[i],1,h[1]-1)
        act.text[i] <-substring(act.def[i],h[2]+1)
        act.names[i]<-substring(act.def[i],h[1]+1,h[2]-1)
        h<-1:nchar(act.names[i])
        h<-substring(act.names[i],h,h)
        h<-paste(h[h!=" "],collapse="")
        if(nchar(h)>0) assign(h,section.no[i],frame=1)
    }
}
h<-max(nchar(act.names))
act.names<-paste(act.names,
                 substring("                   ",0,h-nchar(act.names)),sep="")
Zuerst die Variablennamen, dann die Texte, die Sortierindizes und zum Schluß die zugehörigen Sektionsnummern.


[273:]

<<look.act.points.up: erstelle Ausgabe>>=
h<-cbind(act.names,act.text,act.index,section.no)
return(h)
Die Funktion activate.jump bietet dem Aufrufer ein Menu an, mit dem er an vordefinierte Aktivierungspunkte springen kann. Als Input ist der Output von look.act.points.up vorgesehen. Die Matrix name.text.index.no enthält also als Spalten act.names,act.text,act.index,section.no . Hier ein Beispiel:
 <start-modul>=
 a<-look.act.points.up()
 ...
 <aufruf-module>=
 cat("Revbook:0.0:MENU:allgemeines Menu\n")
 activate.jump(a)


[274:]

<<initialisiere einige Funktionen>>=
activate.jump<-function(name.text.index.no){
        key.text<-paste(name.text.index.no[,1],name.text.index.no[,2],sep=" ")
        h<-name.text.index.no[,3]
        ord<-order(substring(h,2))
        section.no<-name.text.index.no[,4]
        h<-paste(rep(" ",nchar(name.text.index.no[1,1])),collapse="")
        wahl<-Menu(c(paste(h,"Abbruch",sep=" "),key.text[ord]))-1
        if(wahl>0){
                cmds<-paste("s",section.no[ord][wahl])
                assign("cmds",cmds,frame=sys.parent())
        }
}

outin - schreibt (RETURN), liest

Eine kleine Funktion


[275:]

<<initialisiere einige Funktionen>>=
outin<-function(Text="leer",endtext="BITTE RETURN"){
  if(!missing(Text)){cat(Text);cat("\n")}
  cat(endtext)
  cat("\n")
  h<-readline()
  h
}

boxplotexp - Boxplotlernfunktion

In diesem Abschnitt wird das Gerüst für eine S-Plus-Funktion gelegt, mit der ein Teilnehmer der Statistik-Grundausbildung das Instrument Boxplot etwas näher kennenlernen kann. Dieser Vorschlag geht zurück auf zwei Gruppen von Studierenden aus dem BI-Projekt W/97.

Die Grundstruktur der Funktion sieht so aus:


[276:]

<<initialisiere einige Funktionen>>=
boxplotexp<-function(){
        <<zeige Boxplot verschiedener Datens\"atze>>
        <<wiederhole Kerngedanken zum Boxplot>>
        <<gebe Hinweise zu den einzelnen Datens\"atzen>>
        <<suche Datensatz aus>>
        <<zeige Boxplot zu den gew\"ahlten Daten>>
        repeat{
              <<zeige Men\"u mit M\"oglichkeiten und erfrage Wunsch>>
              <<handle Wunsch ab>>
        }
}
Zunächst müssen einige Daten her.


[277:]

<<zeige Boxplot verschiedener Datens\"atze>>=
x1<-10:30
x2<-rep(10:30,4)
set.seed(15)
x3<-rnorm(100,20,10)
x4<-20+.5*x3
set.seed(15)
x5<-rexp(100,1/20)
x<-list("1"=x1,"2"=x2,"3"=x3,"4"=x4,"5"=x5)
boxplot(x)
Mit den Kerngedanken sollte der Benutzer eine kurze Einfuehrung in das Thema Boxplot erhalten. Wichtig sind in diesem Zusammenhang die inhaltliche Beantwortung von Fragen wie: was beschreibt der Boxplot? wodurch wird dies beschrieben? Lediglich beim 5. Boxplot schien eine weitergehende Erklaerung sinnvoll.


[278:]

<<wiederhole Kerngedanken zum Boxplot>>=
cat("Der Boxplot\n")
cat("-----------\n")
cat("Der Boxplot gibt dem Betrachter einen Eindruck von der Lage,\n")
cat("der Variabilitaet, der Symmetrie und den Randbereichen eines\n")
cat("Datensatzes. In dem jetzt sichtbaren Fenster sind die 5 Boxplots\n")
cat("von 5 verschiedenen Datensaetzen dargestellt. Im\n")
cat("mittleren Bereich ist deutlich eine Box mit einer horizontalen Linie\n")
cat("zu erkennen. Diese Linie markiert den Median. Die \n")
cat("auesseren Linien der Box stellen jeweils das untere resp. das obere\n")
cat("Quartil dar. Der vom unteren bis zum oberen Quartil reichende Kasten\n")
cat("symbolisiert die zentralen 50% der Daten.\n")
cat("Die aus optischen Gruenden durch Querstriche begrenzten Linien oben\n")
cat("und unten repraesentieren nochmals jeweils 25% der Daten; ihre Enden\n")
cat("markieren die Extrempunkte des Datensatzes, min(x) und max(x).\n")
Mit Hilfe des ersten Boxplots sollten die Kerngedanken (s.o.) mit Leben gefuellt werden. Hier werden zum ersten Mal konkrete Zahlen verwendet und den einzelnen Begriffen zugewiesen. Bei den nachfolgenden Boxplots kommt es mehr auf die Beschreibung von Besonderheiten denn auf die staendige Wiederholung der Grundgedanken an. Daher: Formulierung eines Fazits.


[279:]

<<gebe Hinweise zu den einzelnen Datens\"atzen>>=
repeat{
cat("Zu welchem Datensatz der 5 angebotenen wollen Sie weitere Hinweise?\n")
cat("Empfehlung: Zur ersten Orientierung bietet es sich an, \n")
cat("zuerst alle nacheinander anzuschauen.\n")
wunsch<-c(scan(,0,n=1),0)[1]
if(wunsch==0)break
if(wunsch==1){
   cat("Zum Datensatz 1:\n")
   cat("Der erste Datensatz besteht aus den Zahlen\n")
   cat("10,11,...,30. Er ist symmetrisch, die Extrema sind 10 und 30, also\n")
   cat("ist der Median gerade 20. Dies kann unmittelbar am Plot abgelesen\n")
   cat("werden. Die Box wird durch 15 und 25 begrenzt, diese Punkte grenzen\n")
   cat("das untere Viertel bzw. das obere Viertel vom Rest ab. In diesem \n")
   cat("Fall ist 15 das untere Quartil, 25 das obere. Auch diese \n")
   cat("Informationen sind einfach aus dem Boxplot abzulesen\n")
   cat("{siehe Graphik}.\n")

}
if(wunsch==2){
   cat("Zum Datensatz 2: \n")
   cat("Dieser Datensatz ist aus der viermaligen\n")
   cat("Wiederholung der Zahlen von 10 bis 30 (4xDatensatz 1) entstanden.\n")
   cat("Also hat auch er den Median 20. Da die anderen Statistiken\n")
   cat("ebenfalls mit dem ersten Datensatz uebereinstimmen, ergibt sich\n")
   cat("dasselbe Erscheinungsbild.\n")
   cat("Hinweis: vergleiche die Datensaetze!\n")
   cat("Ein Datensatz, den man durch Vervielf\"altigung eines\n")
   cat("bereits vorhandenen Datensatzes erhaelt, hat weiterhin das gleiche\n")
   cat("Erscheinungsbild.\n")
   cat("Merke\n")
   cat("Der Stichprobenumfang hat keinen Einfluss auf den Boxplot.\n")
   }
if(wunsch==3){
   cat("Zum Datensatz 3:\n")
   cat("Dieser Datensatz vom Umfang 100 ist eine Stichprobe aus\n")
   cat("einer symmetrischen Grundgesamtheit mit Mittel 20 und Streuung 10.\n")
   cat("Es ergibt sich ein symmetrischer Boxplot. Die Extrema (-5.18,46.98)\n")
   cat("sind weiter vom Zentrum entfernt als bei Datensatz 1. Die Box ist\n")
   cat("etwas laenger, jedoch deckt sie nur ca. ein Drittel des \n")
   cat("Datenbereiches ab.\n")
   cat("Allgemein kann man also sagen, dass die Boxlaenge nichts darueber \n")
   cat("aussagt, wieviel die Box vom Datenbereich abdeckt. \n")
   cat("Man sagt zwar, dass die Box 50% der Daten enthaelt,\n")
   cat("aber das heisst nicht, dass die Box auch 50% des Datenbereichs\n")
   cat("abdeckt. Man sieht, dass die Daten selbst einen grossen Einfluss\n")
   cat("auf das Erscheinungsbild haben, denn die Extrema sind dafuer\n")
   cat("verantwortlich, dass die Box bloss ein Drittel des Datenbereichs\n")
   cat("abdeckt.\n")
}
if(wunsch==4){
   cat("Zum Datensatz 4: Dieser Datensatz ist durch eine Stauchung (:2) und\n")
   cat("Verschiebung (+20) aus dem dritten Datensatz entstanden. Deshalb\n")
   cat("liegt der Median um 20 hoeher und die Spannweite wie\n")
   cat("auch die Boxgroesse haben sich halbiert.\n")
   cat("Merke:\n")
   cat("Addition einer Zahl z bewirkt eine Verschiebung des Boxplot\n")
   cat("nach oben (bei positiven Zahlen z) bzw.\n")
   cat("nach unten (bei negativen Zahlen z).\n")
   cat("Merke:\n")
   cat("Multiplikation mit einer Zahl z>1 bewirkt \n")
   cat("eine Streckung des Boxplots.\n")
   cat("Analog bewirkt die Division mit einer Zahl z\n")
   cat("eine Stauchung des Boxplots.\n")
}
if(wunsch==5){
   cat("Zum Datensatz 5: Dieser Datensatz ist aus einer asymmetrischen \n")
   cat("Grundgesamtheit mit dem Mittel 20 gezogen worden. Der wesentliche\n")
   cat("Teil der Daten liegt im Bereich zwischen 0 und 30. Nur ca. 25%\n")
   cat("sind im Bereich (25,100) verteilt.\n")
   cat("Die Box erstreckt sich von 3.92 (unteres Quartil) bis 26.19\n")
   cat("(oberes Quartil), d.h., dass 50% der Daten zwischen\n")
   cat("3.92 und 26.19 liegen. Die Extrema sind 0.28 und 97.74.\n")
   cat("Wie man sieht gibt es auf der einen Seite viele Daten, die\n")
   cat("sehr dicht zusammenliegen, auf der anderen Seite gibt es aber auch \n")
   cat("sog. Ausreisser. Das sind Daten, die weiter entfernt\n")
   cat("vom Zentrum liegen. Die Ausreisser bewirken,\n")
   cat("dass der Datenbereich links und rechts von der Box, der jeweils\n")
   cat("25% der Daten enthaelt, unterschiedlich lang ist. Anhand der\n")
   cat("Lage der Querstriche kann man erkennen, ob und in welchem Bereich\n")
   cat("es Ausreisser gibt.\n")
}
} # end of repeat


[280:]

<<suche Datensatz aus>>=
cat("Sie koennen jetzt einen Datensatz zur genaueren Analyse aussuchen.\n")
cat("Welchen Datensatz der 5 angebotenen waehlen Sie?\n")
wunsch<-c(scan(,0,n=1),0)[1]
if(wunsch==0) break
switch(wunsch,x<-x1,x<-x2,x<-x3,x<-x4,x<-x5)
x.all<-list("ODS"=x)


[281:]

<<zeige Men\"u mit M\"oglichkeiten und erfrage Wunsch>>=
cat("Sie koennen nun mit dem Datensatz operieren.\n")
cat("Was wollen Sie\n")
angebot<-c(
           "ENDE",
           "Datensatz anzeigen",
           "Zusammenfassende Statistiken berechnen",
           "Ausgangs-Datensatz um Konstante verschieben",
           "Ausgangs-Datensatz um Faktor strecken",
           "Ausgangs-Datensatz logarithmieren",
           "vorherigen Datensatz um Konstante verschieben",
           "vorherigen Datensatz um Faktor strecken",
           "vorherigen Datensatz logarithmieren",
           "Datensatz um weitere Daten ergaenzen",
           "Daten aus Datensatz entfernen",
           "neuen Datensatz eingeben",
           "Datensatz aus den 5 angebotenen aussuchen"
          )
wunsch<-menu(angebot)


[282:]

<<handle Wunsch ab>>=
switch(wunsch,
       {
         break
       },{
         print(x.all)
         cat("Bitte return!\n")
         readline()
       },{
         print(lapply(x.all,summary))
       },{
         cat("Um wieviel soll der Datensatz verschoben werden?\n")
         wunsch<-c(scan(,0,n=1),0)[1]
         h<-x+wunsch
         x.all<-c(x.all,list(h))
         new.name<-paste("ODS +",wunsch)
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Um wieviel soll der Datensatz gestreckt werden?\n")
         wunsch<-c(scan(,0,n=1),0)[1]
         h<-x*wunsch
         x.all<-c(x.all,list(h))
         new.name<-paste("ODS *",wunsch)
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Datensatz wird logarithmiert!\n")
         if(min(x)>0){
            h<-log(x)
            new.name<-"log(ODS)"
         } else {
            h<-x
            new.name<-"ODS"
            cat("Datensatz konnte nicht logarithmiert werden!\n")
         }
         x.all<-c(x.all,list(h))
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Um wieviel soll der vorherige Datensatz verschoben werden?\n")
         wunsch<-c(scan(,0,n=1),0)[1]
         h<-x.all{\tt length(x.all)}+wunsch
         x.all<-c(x.all,list(h))
         new.name<-paste("neuer DS +",wunsch)
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Um wieviel soll der vorherige Datensatz gestreckt werden?\n")
         wunsch<-c(scan(,0,n=1),0)[1]
         h<-x.all{\tt length(x.all)}*wunsch
         x.all<-c(x.all,list(h))
         new.name<-paste("neuer DS *",wunsch)
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("vorheriger Datensatz wird logarithmiert!\n")
         h<-x.all{\tt length(x.all)}
         if(min(h)>0){
             h<-log(h)
             new.name<-"log(neuer DS)"
         }else {
             h<-h
             new.name<-"neuer DS"
             cat("vorheriger Datensatz konnte nicht logarithmiert werden!\n")
         }
         x.all<-c(x.all,list(h))
         <<erweitere Namensliste>>
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Geben Sie weitere Daten ein!\n")
         cat("Eine leere Eingabe beendet !\n")
         h<-c(x,scan(,0))
         x.all<-c(x.all,list(h))
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Hier ist der Datensatz!\n")
         print(rbind(Index=1:length(x),Daten=x))
         cat("Geben Sie die Indizes der zu entfernenden Beobachtungen ein!\n")
         cat("Eine leere Eingabe beendet !\n")
         h<-x[-scan(,0)]
         x.all<-c(x.all,list(h))
         <<zeige alle Boxplots zu den gew\"ahlten Daten>>
       },{
         cat("Geben Sie die neuen Daten ein!\n")
         cat("Eine leere Eingabe beendet !\n")
         wunsch<-scan(,0)
         if(length(wunsch)>0) x<-wunsch
         x.all<-list(x)
         <<zeige Boxplot zu den gew\"ahlten Daten>>
       },{
         <<suche Datensatz aus>>
         <<zeige Boxplot zu den gew\"ahlten Daten>>
       }
)


[283:]

<<erweitere Namensliste>>=
names(x.all)<-c(names(x.all)[-length(x.all)],new.name)


[284:]

<<zeige Boxplot zu den gew\"ahlten Daten>>=
boxplot(x)
stats<-boxplot(x,plot=F)
par(usr=c(0,6,par()$usr[3:4]))
text(1,max(x),"Maximum")
text(1,stats$stats[2],"oberes Quartil")
text(1,stats$stats[3],"Median")
text(1,stats$stats[4],"unteres Quartil")
text(1,min(x),"Minimum")
text(5,min(x),as.character(min(x)))
text(5,stats$stats[4],as.character(stats$stats[4]))
text(5,stats$stats[3],as.character(stats$stats[3]))
text(5,stats$stats[2],as.character(stats$stats[2]))
text(5,max(x),as.character(max(x)))


[285:]

<<zeige alle Boxplots zu den gew\"ahlten Daten>>=
 boxplot(x.all)
#par(mfrow=c(1,length(x.all)))
#for(x in x.all) boxplot(x)
#par(mfrow=c(1,1))


[286:]

<<erweitere Namensliste>>=
names(x.all)<-c(names(x.all)[-length(x.all)],new.name)


[287:]

<<zeige Boxplot zu den gew\"ahlten Daten>>=
boxplot(x)
stats<-boxplot(x,plot=F)
par(usr=c(0,6,par()$usr[3:4]))
text(1,max(x),"Maximum")
text(1,stats$stats[2],"oberes Quartil")
text(1,stats$stats[3],"Median")
text(1,stats$stats[4],"unteres Quartil")
text(1,min(x),"Minimum")
text(5,min(x),as.character(min(x)))
text(5,stats$stats[4],as.character(stats$stats[4]))
text(5,stats$stats[3],as.character(stats$stats[3]))
text(5,stats$stats[2],as.character(stats$stats[2]))
text(5,max(x),as.character(max(x)))


[288:]

<<zeige alle Boxplots zu den gew\"ahlten Daten>>=
 boxplot(x.all)
#par(mfrow=c(1,length(x.all)))
#for(x in x.all) boxplot(x)
#par(mfrow=c(1,1))

Graphiken: jitterplot , stabdiagramm , balkendiagramm , stem.and.leaf ,
dichtespur.interaktiv , F.dach , F.dach.look.up , scatter , dichtespur ,
histogramm , qqpairsplot


[289:]

<<initialisiere einige Funktionen>>=
jitterplot<-function(x,xlim){
        x<-unlist(x)
        set.seed(13)
        zz<-runif(length(x))
        if(missing(xlim)) xlim<-range(pretty(x))
        plot(x,zz,ylab="",xlim=xlim)
}


[290:]

<<initialisiere einige Funktionen>>=
stabdiagramm<-function(x,xlim){
    if(missing(xlim)) xlim<-range(pretty(x))
    counts<-table(x)
    werte<-as.numeric(names(counts))
    plot(c(min(werte),max(werte)),c(0,max(counts)),xlim=xlim,
         type="n",xlab="x",ylab=paste("*1/",length(x),sep=""))
    segments(werte,0,werte,counts)
}


[291:]

<<initialisiere einige Funktionen>>=
balkendiagramm<-function(x,breaks){
    breaks<-sort(breaks)
    if(max(x)>breaks[length(breaks)]) breaks<-c(breaks,max(x))
    if(min(x)<=breaks[1])
        breaks<-c(min(x)-0.001*(max(x)-min(x)),breaks)
    counts<-table(cut(x,breaks))
    namen<-names(counts)
    for(i in 1:length(namen)){
        h1<-nchar(namen[i])
        h2<-(1:h1)[substring(namen[i],1:h1,1:h1)=="t"]
        namen[i]<-paste(substring(namen[i],1,h2-1),"..",
                        substring(namen[i],h2+4,h1),collapse="")
    }
    oldpar<-par(mar=c(5.1,12.1,4.1,2.1))
    barplot(counts,names=namen,horiz=T,xlab=paste("*1/",length(x),sep=""))
    par(oldpar)
}


[292:]

<<initialisiere einige Funktionen>>=
stem.and.leaf<-function(x){
    stem(x)
    if(exists("r.flag.r")&exists("out.file")){
       if(get("r.flag.r",frame=w.frame.r)&&
          get("out.file",frame=w.frame.r)!=F)print(stem(x))
    }
    invisible()
}


[293:]

<<initialisiere einige Funktionen>>=
dichtespur.interaktiv<-function(x){
      par(mfrow=c(3,1))
      w<-(quantile(x,.65)-quantile(x,.35))
      bjdpl<-function(x,rel.width=0.001){
        set.seed(13);                z<-1+runif(length(x))
        par(mfg=c(1,1,3,1));         xlim<-c(min(x),max(x))
        plot(x,z,ylim=c(0,2),xlab="",ylab="",xlim=xlim)
        bxpl.data<-boxplot(x,plot=F)
        if(length(bxpl.data$out)>0)
                segments(bxpl.data$out,0.2,bxpl.data$out,0.8)
        lines(c(bxpl.data$stats[3], bxpl.data$stats[4], bxpl.data$stats[4],
                bxpl.data$stats[2], bxpl.data$stats[2], bxpl.data$stats[3],
                bxpl.data$stats[3]), c(.2,.2,.8,.8,.2,.2,.8))
        segments(bxpl.data$stats[1],.2,bxpl.data$stats[1],.8)
        segments(bxpl.data$stats[5],.2,bxpl.data$stats[5],.8)
        segments(bxpl.data$stats[1],.5,bxpl.data$stats[2],.5)
        segments(bxpl.data$stats[5],.5,bxpl.data$stats[4],.5)
        h<-density(x,width=rel.width*(max(x)-min(x)),n=100,window="g")
        par(mfg=c(2,1,3,1)); plot(h,type="l",xlab="",ylab="",xlim=xlim)
        par(mfg=c(3,1,3,1))
      }
      frame()
      cat("Ende: EXIT in Graphik anklicken!\n")
      grin(par.matrix=rbind(lambda=c(-1,3,1,Inf),
                            rel.width   =c(0,1,.02,Inf)),
           expressions=c("xx<-if(lambda!=0)(x^lambda-1)/lambda else log(x)",
                         "bjdpl(xx,rel.width)"),
           center=cbind(.5,c(.2,.5,.8)),
           size= matrix(c(0.8,0.2),3,2,T),
           pic.del=T)
      par(mfrow=c(1,1))
}


[294:]

<<definiere lokale Funktion {\tt F.dach.local} von {\tt F.dach}>>=
F.dach.local<-function(x,breaks,xlim,...){
    if(is.null(breaks)){
        if(missing(xlim)) xlim<-range(x)
        x<-sort(x)
        n<-length(x)
        F.x<-(1:n)/n
        plot(0:1,0:1,type="n",xlim=xlim,xlab="x",ylab="F.dach")
        segments(c(x[-n],x[1],x[n]),      c(F.x[-n],0:1),
                 c(x[-1],par()$usr[1:2]), c(F.x[-n],0:1),...)
        points(unique(x),cumsum(table(x))/length(x),pch=4)
    } else {
        breaks<-sort(breaks)
        if(max(x)>breaks[length(breaks)]) breaks<-c(breaks,max(x))
        if(min(x)<=breaks[1])
          breaks<-c(min(x)-0.001*(max(x)-min(x)),breaks)
        counts<-table(cut(x,breaks))
        F.x<-cumsum(counts)/length(x)
        if(missing(xlim)) xlim<-range(breaks)
        plot(c(min(x),max(x)),0:1,type="n",xlim=xlim,xlab="x",ylab="F.dach")
        lines(breaks,c(0,F.x),...)
    }
}


[295:]

<<initialisiere einige Funktionen>>=
F.dach<-function(xy,breaks,xlim,...){
  <<definiere lokale Funktion {\tt F.dach.local} von {\tt F.dach}>>
  if(is.matrix(xy))     xy<-split(xy,col(xy))
  if(!is.recursive(xy)) xy<-list(xy)
  if(missing(breaks))   breaks<-NULL
  if(missing(xlim))     xlim<-range(pretty(unlist(xy)))
  i<- 0
  oldpar<-par()$lty
  for(el in xy){
    F.dach.local(el, breaks=breaks, xlim=xlim, lty=i<-i+1, ...)
    par(new=T)
  }
  par(lty=oldpar); par(new=F)
  if(i>1){
       namen<-names(xy)
       if(is.null(namen)) namen<-as.character(1:length(xy))
       legend(.3*xlim[1]+.7*xlim[2],.7,namen,lty=1:i)
  }
}
F.dach.look.up funktioniert nur für Treppenfunktionen.


[296:]

<<initialisiere einige Funktionen>>=
F.dach.look.up<-function(x){
   print("bitte zweimal Punkt im F.dach-Plot anklicken!")
   h<-function(x){
      xy<-unlist(locator(n=1))
      p1<-xy[2]; x1<-xy[1]
      p <-sum(x<=x1)/length(x)
      if(p>=p1){ p1<-p } else {
        x1<-sort(x)[max(1,ceiling(p1*length(x)))]
        p1<-sum(x<=x1)/length(x)
      }
      lines(c(par()$usr[1],x1,x1),c(p1,p1,par()$usr[3]))
      return(c(x1,p1))
   }
   xy<-rbind(h(x),h(x))
   dimnames(xy)<-NULL
   if(xy[1,1]>xy[2,1]) xy<-xy[2:1,]
   result<-c("x1"                   =  xy[1,1],
             "F.dach(x1)"           =  xy[1,2],
             "1-F.dach(x1)"         =1-xy[1,2],
             "x2"                   =  xy[2,1],
             "F.dach(x2)"           =  xy[2,2],
             "1-F.dach(x2)"         =1-xy[2,2],
             "F.dach(x2)-F.dach(x1)"=xy[2,2]-xy[1,2])
   print(result)
   invisible()
}


[297:]

<<initialisiere einige Funktionen>>=
scatter<-function(xy,xlim,ylim,hull=0,...){
  if(is.matrix(xy))     xy<-split(xy,col(xy))
  if(!is.recursive(xy)) xy<-list(xy)
  if(missing(xlim))     xlim<-range(pretty(unlist(xy[1])))
  if(missing(ylim))     ylim<-range(pretty(unlist(xy[2])))
  namen<-names(xy)[1:2]
  if(is.null(namen)) namen<-c("x","y")
  plot(xy{\tt 1},xy{\tt 2},xlim=xlim,ylim=ylim,xlab=namen[1],ylab=namen[2],...)
  if(hull>0){
      HULL<-function(xy,hull){
              h<-chull(xy{\tt 1},xy{\tt 2},peel=T)
              h<-split(h$hull,rep(seq(h$count),h$count))
              old<-par()$lty
              for(i in 1:min(hull,length(h))){
                 j<-h{\tt i}
                 if(length(j)>2) polygon(xy{\tt 1}[j],xy{\tt 2}[j],density=0,lty=i)
              }
              par(lty=old)
      }
      HULL(xy[1:2],hull)
  }
}


[298:]

<<initialisiere einige Funktionen>>=
dichtespur<-function(xy,xlim,width,...){
  if(is.matrix(xy))     xy<-split(xy,col(xy))
  if(!is.recursive(xy)) xy<-list(xy)
  if(missing(xlim))     xlim<-range(pretty(unlist(xy)))
  if(missing(width)){
       print(paste("der Bereich der x-Achse beginnt bei:",xlim[1]))
       print(paste("und endet bei:",xlim[2]))
       print("geben Sie die Fensterweite an:")
       width<-c(scan(,0,n=1),0.1*(xlim[2]-xlim[1]))[1]
  }
  h<-NULL; ymax<-0
  for(el in xy){
       hh<-density(el,width=width,n=100,window="g")
       .l<-hh$x>=xlim[1] & hh$x<=xlim[2]
       hh$x<-hh$x[.l];hh$y<-hh$y[.l]
       h <-c(h,list(hh))
       ymax<-max(ymax,hh$y)
  }
  plot(0:1,0:1,type="n",xlim=xlim,ylim=c(0,ymax),xlab="x",ylab="f.dach")
  oldpar<-par()$lty; i<- 0
  for(el in h){ lines(el$x,el$y,lty=i<-i+1) }
  par(lty=oldpar)
  if(i>1){
       namen<-names(xy)
       if(is.null(namen)) namen<-as.character(1:length(xy))
       legend(.3*xlim[1]+.7*xlim[2],.7*ymax,namen,lty=1:i)
  }
}


[299:]

<<initialisiere einige Funktionen>>=
histogramm<-function(xy,xlim,breaks,nclass ){
   if(missing(xlim)) xlim<-range(pretty(c(min(unlist(xy)),max(unlist(xy)))))
   if(missing(breaks)){
       if(missing(nclass)) nclass <- log(length(unlist(xy)), base = 2) + 1
       nclass<-ceiling(nclass)
       breaks<-xlim[1]+(0:nclass)/nclass*(xlim[2]-xlim[1])
   }
   if(is.list(xy)){
       OLDPAR<-par()
       par(mfrow=c(length(xy),1))
       for(i in 1:length(xy))
              hist(xy{\tt i}, breaks=breaks, xlim=xlim, probability=T,
                   xlab=getnames(xy)[i],ylab="f.dach")
       par(OLDPAR)
   } else hist(xy,xlim=xlim,breaks=breaks,probability=T,xlab="x",ylab="f.dach")
}


[300:]

<<initialisiere einige Funktionen>>=
qqpairsplot<-function(xy){
   OLDPAR<-par()
   par(mfrow=rep(length(xy),2))
   for(i in 1:length(xy))
      for(j in 1:length(xy)){
         qqplot(xy{\tt i},xy{\tt j}, xlab=getnames(xy)[i], ylab=getnames(xy)[j])
         abline(0,1)
      }
   par(OLDPAR)
}

Statistiken und andere Transformationen: summary.stats ,
box.cox.transformation , remove.extreme.values , limit.values ,
split.in.eq.classes , split.x.by.y


[301:]

<<initialisiere einige Funktionen>>=
summary.stats<-function(xy,xlim,...){
  l.summary<-function(x){
        options(digits=7)
        h<-c(summary(x),"Std.Dev."=var(x)^0.5,n=length(x))
        options(digits=5)
        return(h)
  }
  namen<-getnames(xy)
  if(is.matrix(xy)){
        xy<-split(xy,col(xy))
        names(xy)<-namen
  }
  if(!is.recursive(xy)) return(l.summary(xy)) else return(lapply(xy,l.summary))
}


[302:]

<<initialisiere einige Funktionen>>=
box.cox.transformation<-function(xy,lambda){
   if(is.list(xy))    n<-length(xy)  else n<-1
   if(is.matrix(xy))  n<-dim(xy)[2]
   if(missing(lambda)){
      if(n>1){
          print("Mit welchen lambdas sollen die Werte der Komponenten")
          print(getnames(xy))
          print("transformiert werden?")
          print(paste("bitte",n,"lambdas eingeben"))
      } else {
          print("Mit welchem lambda sollen die Werte von")
          print(getnames(xy))
          print("transformiert werden?")
      }
      lam<-c(scan(,0,n=n),rep(1,n))[1:n]
   }
   if(is.null(lam))lam<-1
   if(length(lam)<n) lam<-as.vector(matrix(lam,n,1))
   if(is.list(xy))
      for(i in 1:n)
         xy{\tt i}<-if(lam[i]==0){log(xy{\tt i})}else{(xy{\tt i}^lam[i]-1)/lam[i]}
   if(is.matrix(xy))
      for(i in 1:n)
         xy{\tt ,i}<-if(lam[i]==0){log(xy{\tt ,i})}else{(xy{\tt ,i}^lam[i]-1)/lam[i]}
   if(!(is.matrix(xy)|is.list(xy)))
         xy<-if(lam==0){log(xy)}else{(xy^lam-1)/lam}
   return(xy)
}


[303:]

<<initialisiere einige Funktionen>>=
remove.extreme.values<-function(xy){
   xy.is.list<-is.list(xy)
   xy.is.matrix<-is.matrix(xy)
   if(xy.is.matrix){xy.dim<-dim(xy); xy.names<-names(xy)}
   bak<-xy
   if(xy.is.list){
      for(i in 1:length(xy)){
         print(paste("Komponente: ",getnames(xy)[i]))
         print(paste("Die Werte der",i,"-ten Komponente liegen in"))
         print(range(xy{\tt i}))
         print("Bis zu welcher Untergrenze sollen Werte von der")
         print(paste(i,"-ten Komponente entfernt werden?"))
         ug<-c(scan(,0,n=1),min(xy{\tt i}))[1]
         print("Ab welcher Obergrenze sollen Werte von der")
         print(paste(i,"-ten Komponente entfernt werden?"))
         og<-c(scan(,0,n=1),max(xy{\tt i}))[1]
         h<-xy{\tt i}[ug<=xy{\tt i}&xy{\tt i}<=og]
         if(length(h)==0){
            cat("ERROR: Sie haetten alle Werte entfernt! Uebergangen!\n")
            next
         } else xy{\tt i}<-h
      }
   } else {
      print(paste("Die Werte liegen in"))
      print(range(xy))
      print("Bis zu welcher Untergrenze sollen Werte")
      print("entfernt werden?")
      ug<-c(scan(,0,n=1),min(xy))[1]
      print("Ab welcher Obergrenze sollen Werte")
      print("entfernt werden?")
      og<-c(scan(,0,n=1),max(xy))[1]
      if(xy.is.matrix){
         h<-xy[apply(xy<=ug,1,"|")&apply(xy<=og,1,"|"),]
      } else {
         h<-xy[ug<=xy&xy<=og]
      }
      if(length(h)==0){
         cat("ERROR: Sie haetten alle Werte entfernt! Abbruch\n")
         return(xy)
      } else xy<-h
   }
   xy
}


[304:]

<<initialisiere einige Funktionen>>=
limit.values<-function(xy){
   xy.is.matrix<-is.matrix(xy)
   if(xy.is.matrix){xy.dim<-dim(xy); xy.names<-names(xy)}
   xy.is.list<-is.list(xy)
   if(xy.is.list){
      for(i in 1:length(xy)){
         print(paste("Komponente: ",getnames(xy)[i]))
         print(paste("Die Werte der",i,"-ten Komponente liegen in"))
         print(range(xy{\tt i}))
         print("Bis zu welcher Untergrenze sollen KLEINE Werte von der")
         print(paste(i,"-ten Komponente angehoben werden?"))
         ug<-c(scan(,0,n=1),min(xy{\tt i}))[1]
         print("Bis zu welcher Obergrenze sollen GROSSE Werte gesenkt werden?")
         og<-c(scan(,0,n=1),max(xy{\tt i}))[1]
         xy{\tt i}<-pmin(og,pmax(ug,xy{\tt i}))
      }
   } else {
      print(paste("Die Werte liegen in"))
      print(range(xy))
      print("Bis zu welcher Untergrenze sollen KLEINE Werte von der")
      print("angehoben werden?")
      ug<-c(scan(,0,n=1),min(xy))[1]
      print("Bis zu welcher Obergrenze sollen GROSSE Werte gesenkt werden?")
      og<-c(scan(,0,n=1),max(xy))[1]
      xy<-pmin(og,pmax(ug,xy))
      if(xy.is.matrix){dim(xy)<-xy.dim; names(xy)<-xy.names}
   }
   xy
}


[305:]

<<initialisiere einige Funktionen>>=
split.in.eq.classes<-function(xy,anz=4){
   if(missing(anz)){
       print("Auf wie viele gleich grosse Klassen sollen")
       print("die Daten verteilt werden?")
       anz<-c(scan(,0,n=1),4)[1]
   }
   xy<-unlist(xy)
   xy<-matrix(xy[1:(floor(length(xy)/anz)*anz)],ncol=anz)
   xy<-split(xy,col(xy))
}


[306:]

<<initialisiere einige Funktionen>>=
split.x.by.y<-function(x,y,anz=4){
   if(missing(anz)){
       print("Wie viele Klassen sollen aus der zweiten")
       print("Variablen gebildet werden,")
       print("um danach die erste zu klassifizieren?")
       anz<-c(scan(,0,n=1),4)[1]
   }
   h<-quantile(range(y),(1:(anz-1))/anz )
   hh<-rep(1,length(y))
   for(i in h) hh<-hh+(y>i)
   if(length(x)<length(hh)) hh<-hh[1:length(x )]
   if(length(x)>length(hh)) x <-x [1:length(hh)]
   xy<-split(x,hh)
   xy
}

bootstrap.experiment


[307:]

<<initialisiere einige Funktionen>>=
bootstrap.experiment<-function(xy,n,ZZ,type){
  if(missing(n)){
     print("Wie gross soll n sein? n=")
     n <-c(scan(,0,n=1),3)[1]
  }
  if(missing(ZZ)){
     print("Zufallsgeneratorstart? ZZ=")
     set.seed(ZZ<-c(scan(,0,n=1),13)[1])
  }
  if(is.matrix(xy)) xy<-split(xy,col(xy))
  if(!is.list(xy))   xy<-list(xy)
  n.ds<-length(xy)
  stichproben<-NULL
  for(i in 1:n.ds){
     stichproben<-c(stichproben,list(xy{\tt i}))
     for(j in 1:n){
        stichproben<-c(stichproben,list(sample(xy{\tt i},replace=T)))
     }
  }
  if(missing(type)){
    h<-matrix(as.character(rbind(1:n.ds,matrix(letters[1:n],n,n.ds))),n+1,n.ds)
    boxplot(stichproben, names=h)
  } else {
     h<-c("median","mean","3. Quartil","1. Quartil", "s","var",
          "Interquartils-Abstand")
     if(type=="?"){
         print("Welche Statistik interessiert Sie?")
         wahl<-Menu(h)
     } else {
         wahl<-(1:7)[h==type]
     }
     fkt<-switch(wahl, median, mean, function(x)quantile(x,0.75),
                 function(x)quantile(x,0.25), function(x)var(x)^0.5,
                 var, function(x)quantile(x,0.75)-quantile(x,0.25) )
     result<-unlist(lapply(stichproben, fkt ))
     result<-matrix(result,n+1,n.ds)[-1,]
     boxplot(split(result,col(result)), names=as.character(1:n.ds))
  }
  stichproben
}

kt.work für Kontingenztabellen

Eine kleine Funktion zu dem Thema Kontingenztabellen.


[308:]

<<initialisiere einige Funktionen>>=
kt.work<-function(xy,is.xy.kt=F){
 <<initialisiere {\tt kt.work}>>
 repeat{
   <<Auswahl von {\tt kt.work}>>
   <<Umsetzung der Wahl von {\tt kt.work}>>
   outin()
 }
}


[309:]

<<initialisiere {\tt kt.work}>>=
if(missing(xy)) xy<-cbind(c(1,1,1,1,1,1,2,2,2,2,3,3,3,1,2,1,3,2,1),
                          c(1,2,1,2,2,1,2,1,1,1,1,2,2,2,1,2,1,2,2))
if(!is.xy.kt){
  <<erstelle aus Datenmatrix {\tt xy} Kontingenztabelle {\tt kt.rel}, {\tt kt.work}>>
}
kt.abs<-cbind(xy,sum=apply(xy,1,sum))
kt.abs<-rbind(kt.abs,sum=apply(kt.abs,2,sum))
kt.rel<-kt.abs/kt.abs[length(kt.abs)]
<<erstelle aus {\tt kt.rel} Kontingenztabelle bei Unabh\"angigkeit, {\tt kt.work}>>
<<berechne chi-square und kontingenz, {\tt kt.work}>>


[310:]

<<Auswahl von {\tt kt.work}>>=
cat("Auswahl:")
wahl<-menu(c("Abbruch/Ende",
             "Tabelle mit Anzahlen ausgeben",
             "Tabelle mit relative Haeufigkeiten ausgeben",
             "Tabelle (absolut) bei Unabhaengigkeit ausgeben",
             "Tabelle (relativ) bei Unabhaengigkeit ausgeben",
             "Kontingenzkoeffizienten berechnen",
             "Zeilenverteilung ausgeben",
             "Spaltenverteilung ausgeben"))


[311:]

<<Umsetzung der Wahl von {\tt kt.work}>>=
if(wahl==0)break
switch(wahl,
       break,
       {print("Tabelle mit absoluten Haeufigkeiten"); print(kt.abs)},
       {print("Tabelle mit relativen Haeufigkeiten"); print(kt.rel)},
       {print("Tabelle abs. Haeufigkeiten bei Unabhaengigkeit")
        print(kt.ind.abs)},
       {print("Tabelle rel. Haeufigkeiten bei Unabhaengigkeit")
        print(kt.ind.rel)},
       {print("Kontingenzkoeffizient")
        print(kontingenz.koef)
        print("Chisquare-Wert")
        print(chiq)},
       {
        <<berechne Zeilenverteilung, {\tt kt.work}>>
       },
       {
        <<berechne Spaltenverteilung, {\tt kt.work}>>
       }
)


[312:]

<<erstelle aus Datenmatrix {\tt xy} Kontingenztabelle {\tt kt.rel}, {\tt kt.work}>>=
if(is.list(xy)){
  xy<-table(xy{\tt 1},xy{\tt 2})
}else{
  if(is.matrix(xy)){
    xy<-table(xy[,1],xy[,2])
  } else { print("ERROR: Input ist keine Datenmatrix");break}
}


[313:]

<<erstelle aus {\tt kt.rel} Kontingenztabelle bei Unabh\"angigkeit, {\tt kt.work}>>=
kt.ind.rel<-outer(kt.rel[,ncol(kt.rel)],kt.rel[nrow(kt.rel),])
kt.ind.abs<-kt.ind.rel*kt.abs[length(kt.abs)]


[314:]

<<berechne chi-square und kontingenz, {\tt kt.work}>>=
h<-kt.ind.abs[-nrow(kt.rel),-ncol(kt.rel)]
chiq<-sum((kt.abs[-nrow(kt.rel),-ncol(kt.rel)]-h)^2/h)
kontingenz.koef<-(chiq/(kt.abs[length(kt.abs)]-chiq))^0.5


[315:]

<<berechne Zeilenverteilung, {\tt kt.work}>>=
print("Welche Zeile?")
i<-scan(,0,n=1)
cat("absolute Haeufigkeiten\n")
print(kt.abs[i,])
cat("relative Haeufigkeiten\n")
print(kt.rel[i,]/kt.rel[i,ncol(kt.rel)])


[316:]

<<berechne Spaltenverteilung, {\tt kt.work}>>=
print("Welche Spalte?")
j<-scan(,0,n=1)
cat("absolute Haeufigkeiten\n")
print(kt.abs[,j])
cat("relative Haeufigkeiten\n")
print(kt.rel[,j]/kt.rel[nrow(kt.rel),j])

getnames - ermittelt Spaltennamen u.ä.

Eine Funktion, die die Namen von Listenelementen oder von Spaltenüberschriften liefert. Wird kein Name gefunden, wird die Nummer ausgegeben.


[317:]

<<initialisiere einige Funktionen>>=
getnames<-function(xy){
  if(is.list(xy)){
     if(is.null(names(xy))){
        return(as.character(1:length(xy)))
     } else  return(names(xy))
  }
  if(is.matrix(xy)){
     if(is.null(dimnames(xy){\tt 2})){
        return(as.character(1:dim(xy)[2]))
     } else {
        return(dimnames(xy){\tt 2})
     }
  }
  return("x")
}

Kalkulatoren: binomial.calculator , geometric.calculator ,
exponential.calculator , poisson.calculator , normal.calculator

Mit dieser Funktion kann der Bediener einige Operationen rund um die Binomialverteilung durchführen.


[318:]

<<initialisiere einige Funktionen>>=
binomial.calculator<-function(x.F,n,p){
  <<checke Eingabe von {\tt binomial.calculator}>>
  <<erstelle erste Ausgabe von {\tt binomial.calculator}>>
  repeat{
      <<erfrage Wunsch, von {\tt binomial.calculator}>>
      <<setze Wunsch um, von {\tt binomial.calculator}>>
  }
}


[319:]

<<checke Eingabe von {\tt binomial.calculator}>>=
print("binomial.calculator start")
if(missing(n)){
        print("Bitte n eingeben! (Default: n=1) n=?")
        n<-c(scan(,0,n=1),1)[1]
}
if(missing(p)){
        print("Bitte p eingeben! (Default: p=0.5) p=?")
        p<-c(scan(,0,n=1),.5)[1]
}


[320:]

<<erstelle erste Ausgabe von {\tt binomial.calculator}>>=
if(missing(x.F)){
   a<-1
   <<berechne Statistiken von {\tt binomial.calculator}>>
} else {
   is.F.x<-T
   if(any(x.F>1)) is.F.x<-F
   if(all(floor(x.F)==x.F)) is.F.x <-F
   if(!is.F.x){
        x<-x.F
        print("Werte der Wahrscheinlichkeitsfunktion:")
        print(cbind(x=x,"f(x)"=dbinom(x,n,p)))
        print("Werte der Verteilungsfunktion:")
        print(cbind(x=x,"F(x)"=pbinom(x,n,p)))
   }
   if(is.F.x){
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qbinom(F.x,n,p)))
   }
}


[321:]

<<berechne Statistiken von {\tt binomial.calculator}>>=
if(a==1){ print( c("E(X)"=n*p, "Var(X)"=n*p*(1-p), sigma=(n*p*(1-p))^0.5,
                   "E(X)-2sigma"=n*p-2*(n*p*(1-p))^0.5,
                   "E(X)-sigma"=n*p-  (n*p*(1-p))^0.5,
                   "E(X)+sigma"=n*p+  (n*p*(1-p))^0.5,
                   "E(X)+2sigma"=n*p+2*(n*p*(1-p))^0.5) )
} else {  print( c("E(aX)"=n*p*a, "Var(aX)"=n*p*(1-p)*a^2,
                   sigma=(n*p*(1-p))^0.5*a,
                   "E(aX)-2sigma"=n*p*a-2*(n*p*(1-p))^0.5*a,
                   "E(aX)-sigma"=n*p*a-  (n*p*(1-p))^0.5*a,
                   "E(aX)+sigma"=n*p*a+  (n*p*(1-p))^0.5*a,
                   "E(aX)+2sigma"=n*p*a+2*(n*p*(1-p))^0.5*a) )
}


[322:]

<<erfrage Wunsch, von {\tt binomial.calculator}>>=
print("Auswahl von binomial.calculator")
auswahl<-c("Ende","n eingeben","p eingeben",
           "f(x) und F(x) berechnen","Quantile berechnen",
           "Statistiken von aX berechnen","Plot erstellen")
wahl<-Menu(auswahl)


[323:]

<<setze Wunsch um, von {\tt binomial.calculator}>>=
switch(wahl,
       break,
       {
        print("Bitte n eingeben! (Default: n=1) n=?")
        n<-c(scan(,0,n=1),1)[1]
       },
       {
        print("Bitte p eingeben! (Default: p=0.5) p=?")
        p<-c(scan(,0,n=1),.5)[1]
       },
       {
        print("Bitte x eingeben! x=?")
        x<-scan(,0,n=n+1); if(0==length(x)) x<-0:n
        print("Werte der Wahrscheinlichkeits- und der Verteilungsfunktion:")
        print(cbind(x=x,"f(x)"=dbinom(x,n,p),"F(x)"=pbinom(x,n,p)))
       },
       {
        print("Bitte Wahrscheinlichkeiten eingeben! F(x)=?")
        F.x<-scan(,0,n=n+1)
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qbinom(F.x,n,p)))
       },
       {
        print("Um welchen Faktor a soll die Zufallsvariable gestreckt werden?")
        print("(Default: 1)")
        a<-c(scan(,0,n=1),1)[1]
        <<berechne Statistiken von {\tt binomial.calculator}>>
       },
       {
        x<-0:n ; F.x<-dbinom(x,n,p)
        h<-F.x>.0001 ; x<-x[h] ; F.x<-F.x[h]
        plot(x,F.x,type="n",xlab="x",ylab="f(x)")
        segments(x,0,x,F.x)
       }
)

Mit dieser Funktion kann der Bediener einige Operationen rund um die geometrische Verteilung durchführen.


[324:]

<<initialisiere einige Funktionen>>=
geometric.calculator<-function(x.F,p){
  <<checke Eingabe von {\tt geometric.calculator}>>
  <<erstelle erste Ausgabe von {\tt geometric.calculator}>>
  repeat{
      <<erfrage Wunsch, von {\tt geometric.calculator}>>
      <<setze Wunsch um, von {\tt geometric.calculator}>>
  }
}


[325:]

<<checke Eingabe von {\tt geometric.calculator}>>=
print("geometric.calculator start")
if(missing(p)){
        print("Bitte p eingeben! (Default: p=0.5) p=?")
        p<-c(scan(,0,n=1),.5)[1]
}


[326:]

<<erstelle erste Ausgabe von {\tt geometric.calculator}>>=
if(missing(x.F)){
   <<berechne Statistiken von {\tt geometric.calculator}>>
} else {
   is.F.x<-T
   if(any(x.F>1)) is.F.x<-F
   if(all(floor(x.F)==x.F)) is.F.x <-F
   if(!is.F.x){
        x<-x.F
        print("Werte der Wahrscheinlichkeitsfunktion:")
        print(cbind(x=x,"f(x)"=dgeom(x,p)))
        print("Werte der Verteilungsfunktion:")
        print(cbind(x=x,"F(x)"=pgeom(x,p)))
   }
   if(is.F.x){
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qgeom(F.x,p)))
   }
}


[327:]

<<berechne Statistiken von {\tt geometric.calculator}>>=
          q<-1-p
          print( c("E(X)"=q/p, "Var(X)"=q/(p*p), sigma=q^0.5/p,
                   "E(X)-2sigma"=q/p-2*q^0.5/p,
                   "E(X)-sigma"=q/p-  q^0.5/p,
                   "E(X)+sigma"=q/p+  q^0.5/p,
                   "E(X)+2sigma"=q/p+2*q^0.5/p) )


[328:]

<<erfrage Wunsch, von {\tt geometric.calculator}>>=
print("Auswahl von geometric.calculator")
auswahl<-c("Ende","p eingeben",
           "f(x) und F(x) berechnen","Quantile berechnen",
           "Statistiken berechnen","Plot erstellen")
wahl<-Menu(auswahl)


[329:]

<<setze Wunsch um, von {\tt geometric.calculator}>>=
switch(wahl,
       break,
       {
        print("Bitte p eingeben! (Default: p=0.5) p=?")
        p<-c(scan(,0,n=1),.5)[1]
       },
       {
        print("Bitte x eingeben! x=?")
        n<-(1-p)/p+5*(1-p)^0.5/p
        x<-scan(,0,n=n+1); if(0==length(x)) x<-0:n
        print("Werte der Wahrscheinlichkeits- und der Verteilungsfunktion:")
        print(cbind(x=x,"f(x)"=dgeom(x,p),"F(x)"=pgeom(x,p)))
       },
       {
        print("Bitte Wahrscheinlichkeiten eingeben! F(x)=?")
        n<-(1-p)/p+3.5*(1-p)^0.5/p
        F.x<-scan(,0,n=n+1)
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qgeom(F.x,p)))
       },
       {
        <<berechne Statistiken von {\tt geometric.calculator}>>
       },
       {
        n<-(1-p)/p+5*(1-p)^0.5/p
        x<-0:n ; F.x<-dgeom(x,p)
        h<-F.x>.0001 ; x<-x[h] ; F.x<-F.x[h]
        plot(x,F.x,type="n",xlab="x",ylab="f(x)")
        segments(x,0,x,F.x)
       }
)
Mit dieser Funktion kann der Bediener einige Operationen rund um die Exponentialverteilung durchführen.


[330:]

<<initialisiere einige Funktionen>>=
exponential.calculator<-function(x.F,lambda){
  <<checke Eingabe von {\tt exponential.calculator}>>
  <<erstelle erste Ausgabe von {\tt exponential.calculator}>>
  repeat{
      <<erfrage Wunsch, von {\tt exponential.calculator}>>
      <<setze Wunsch um, von {\tt exponential.calculator}>>
  }
}


[331:]

<<checke Eingabe von {\tt exponential.calculator}>>=
print("exponential.calculator start")
if(missing(lambda)){
        print("Bitte lambda eingeben! (Default: lambda=1) lambda=?")
        lambda<-c(scan(,0,n=1),1)[1]
}


[332:]

<<erstelle erste Ausgabe von {\tt exponential.calculator}>>=
if(missing(x.F)){
   <<berechne Statistiken von {\tt exponential.calculator}>>
} else {
   is.F.x<-T
   if(any(x.F>1)) is.F.x<-F
   if(all(floor(x.F)==x.F)) is.F.x <-F
   if(!is.F.x){
        x<-x.F
        print("Werte der Dichtefunktion:")
        print(cbind(x=x,"f(x)"=dexp(x,lambda)))
        print("Werte der Verteilungsfunktion:")
        print(cbind(x=x,"F(x)"=pexp(x,lambda)))
   }
   if(is.F.x){
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qexp(F.x,lambda)))
   }
}


[333:]

<<berechne Statistiken von {\tt exponential.calculator}>>=
          print( c("E(X)"=1/lambda,
                   "Var(X)"=1/(lambda*lambda), sigma=1/lambda,
                   "E(X)-2sigma"=1/lambda-2*1/lambda,
                   "E(X)-sigma"=1/lambda-  1/lambda,
                   "E(X)+sigma"=1/lambda+  1/lambda,
                   "E(X)+2sigma"=1/lambda+2*1/lambda) )


[334:]

<<erfrage Wunsch, von {\tt exponential.calculator}>>=
print("Auswahl von exponential.calculator")
auswahl<-c("Ende","lambda eingeben",
           "f(x) und F(x) berechnen","Quantile berechnen",
           "Statistiken berechnen","Plot erstellen")
wahl<-Menu(auswahl)


[335:]

<<setze Wunsch um, von {\tt exponential.calculator}>>=
switch(wahl,
       break,
       {
        print("Bitte lambda eingeben! (Default: lambda=1) lambda=?")
        lambda<-c(scan(,0,n=1),1)[1]
       },
       {
        print("Bitte x eingeben! x=?")
        x<-scan(,0); if(0==length(x)) x<-(0:20)/20*(3/lambda)
        print("Werte der Dichtefunktion und der Verteilungsfunktion:")
        print(cbind(x=x,"f(x)"=dexp(x,lambda),"F(x)"=pexp(x,lambda)))
       },
       {
        print("Bitte Wahrscheinlichkeiten eingeben! F(x)=?")
        F.x<-scan(,0)
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qexp(F.x,lambda)))
       },
       {
        <<berechne Statistiken von {\tt exponential.calculator}>>
       },
       {
        x<-(1:200)/lambda/50 ; F.x<-dexp(x,lambda)
        h<-F.x>.0001 ; x<-x[h] ; F.x<-F.x[h]
        plot(x,F.x,type="l",xlab="x",ylab="f(x)")
       }
)
Mit dieser Funktion kann der Bediener einige Operationen rund um die Poissonverteilung durchführen.


[336:]

<<initialisiere einige Funktionen>>=
poisson.calculator<-function(x.F,lambda){
  <<checke Eingabe von {\tt poisson.calculator}>>
  <<erstelle erste Ausgabe von {\tt poisson.calculator}>>
  repeat{
      <<erfrage Wunsch, von {\tt poisson.calculator}>>
      <<setze Wunsch um, von {\tt poisson.calculator}>>
  }
}


[337:]

<<checke Eingabe von {\tt poisson.calculator}>>=
print("poisson.calculator start")
if(missing(lambda)){
        print("Bitte lambda eingeben! (Default: lambda=1) lambda=?")
        lambda<-c(scan(,0,n=1),1)[1]
}


[338:]

<<erstelle erste Ausgabe von {\tt poisson.calculator}>>=
if(missing(x.F)){
   <<berechne Statistiken von {\tt poisson.calculator}>>
} else {
   is.F.x<-T
   if(any(x.F>1)) is.F.x<-F
   if(all(floor(x.F)==x.F)) is.F.x <-F
   if(!is.F.x){
        x<-x.F
        print("Werte der Dichtefunktion:")
        print(cbind(x=x,"f(x)"=dpois(x,lambda)))
        print("Werte der Verteilungsfunktion:")
        print(cbind(x=x,"F(x)"=ppois(x,lambda)))
   }
   if(is.F.x){
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qpois(F.x,lambda)))
   }
}


[339:]

<<berechne Statistiken von {\tt poisson.calculator}>>=
          print( c("E(X)"=lambda,
                   "Var(X)"=lambda, sigma=lambda^0.5,
                   "E(X)-2sigma"=lambda-2*lambda^0.5,
                   "E(X)-sigma"=lambda-  lambda^0.5,
                   "E(X)+sigma"=lambda+  lambda^0.5,
                   "E(X)+2sigma"=lambda+2*lambda^0.5) )


[340:]

<<erfrage Wunsch, von {\tt poisson.calculator}>>=
print("Auswahl von poisson.calculator")
auswahl<-c("Ende","lambda eingeben",
           "f(x) und F(x) berechnen","Quantile berechnen",
           "Statistiken berechnen","Plot erstellen")
wahl<-Menu(auswahl)


[341:]

<<setze Wunsch um, von {\tt poisson.calculator}>>=
switch(wahl,
       break,
       {
        print("Bitte lambda eingeben! (Default: lambda=1) lambda=?")
        lambda<-c(scan(,0,n=1),1)[1]
       },
       {
        print("Bitte x eingeben! x=?")
        x<-scan(,0); if(0==length(x)) x<-qpois(.01,lambda):qpois(.99,lambda)
        print("Werte der Wahrscheinlichkeits- und der Verteilungsfunktion:")
        print(cbind(x=x,"f(x)"=dpois(x,lambda),"F(x)"=ppois(x,lambda)))
       },
       {
        print("Bitte Wahrscheinlichkeiten eingeben! F(x)=?")
        F.x<-scan(,0)
        print("Quantile:")
        print(cbind("eingegeben:F(x)"=F.x,x=qpois(F.x,lambda)))
       },
       {
        <<berechne Statistiken von {\tt poisson.calculator}>>
       },
       {
        x<-qpois(.01,lambda):qpois(.99,lambda); F.x<-dpois(x,lambda)
        h<-F.x>.00001 ; x<-x[h] ; F.x<-F.x[h]
        plot(x,F.x,type="n",xlab="x",ylab="f(x)")
        segments(x,F.x,x,0)
       }
)
Mit dieser Funktion kann der Bediener einige Operationen rund um die Normalverteilung durchführen und graphisch verfolgen.


[342:]

<<initialisiere einige Funktionen>>=
normal.calculator<-function(x.F,mu,sigma){
  <<checke Eingabe von {\tt normal.calculator}>>
  <<erstelle erste Ausgabe von {\tt normal.calculator}>>
  repeat{
      <<erfrage Wunsch, von {\tt normal.calculator}>>
      <<setze Wunsch um, von {\tt normal.calculator}>>
  }
}


[343:]

<<checke Eingabe von {\tt normal.calculator}>>=
print("normal.calculator start")
if(missing(mu)){
  <<setze Mittel; {\tt normal.calculator}>>
}
if(missing(sigma)){
  <<setze Variabilit\"at fest; {\tt normal.calculator}>>
}
if(missing(x.F)) x.F<-mu+(-3:3)*sigma


[344:]

<<setze Mittel; {\tt normal.calculator}>>=
        print("Bitte Mittel eingeben! (Default: mu=0) mu=?")
        mu<-c(scan(,0,n=1),0)[1]


[345:]

<<setze Variabilit\"at fest; {\tt normal.calculator}>>=
print("sigma ist festzulegen!")
print("Wenn Sie")
print("  Standardabweichung eingeben wollen, bitte 0 eingeben,")
print("  Varianz            eingeben wollen, bitte 1 eingeben!")
print("  (Default -- leere Eingabe: 0)")
h<-c(scan(,0,n=1),0)[1]
if(h!=1){
    print("Bitte STANDARDABWEICHUNG festlegen! (Default: 1) sigma=?")
    sigma<-abs(c(scan(,0,n=1),1)[1])
} else {
    print("Bitte VARIANZ festlegen! (Default: 1) sigma^2=?")
    sigma<-abs(c(scan(,0,n=1),1)[1])^0.5
}


[346:]

<<erstelle erste Ausgabe von {\tt normal.calculator}>>=
if(missing(x.F)){
   <<berechne Statistiken von {\tt normal.calculator}>>
   <<zeige Plots: {\tt normal.calculator}>>
} else {
   is.F.x<-T
   if(any(x.F>1)) is.F.x<-F
   if(all(floor(x.F)==x.F)) is.F.x <-F
   if(!is.F.x){
        x<-x.F
        print("Werte der Dichtefunktion und der Verteilungsfunktion:")
        print(cbind(x=x,"f(x)"=dnorm(x,mu,sigma),"F(x)"=pnorm(x,mu,sigma)))
   }
   if(is.F.x){
        print("Quantile:")
        print(cbind("F(x)"=x.F,x=qnorm(x.F,mu,sigma)))
   }
}


[347:]

<<berechne Statistiken von {\tt normal.calculator}>>=
print( c("E(X)"=mu, "Var(X)"=sigma^2, sigma=sigma,
                   "E(X)-2sigma"=mu-2*sigma,
                   "E(X)-sigma"=mu-   sigma,
                   "E(X)+sigma"=mu+   sigma,
                   "E(X)+2sigma"=mu+2*sigma) )


[348:]

<<erfrage Wunsch, von {\tt normal.calculator}>>=
print("Auswahl von normal.calculator")
auswahl<-c("Ende","Mittel festsetzen","Variabilitaet festlegen",
           "f(x), F(x), (1-F(x)) berechnen","Quantile berechnen",
           "X verschieben", "X skalieren")
wahl<-Menu(auswahl)


[349:]

<<setze Wunsch um, von {\tt normal.calculator}>>=
switch(wahl,
       break,
       {
         <<setze Mittel; {\tt normal.calculator}>>
         <<berechne Statistiken von {\tt normal.calculator}>>
         <<zeige Plots: {\tt normal.calculator}>>
       },
       {
         <<setze Variabilit\"at fest; {\tt normal.calculator}>>
         <<berechne Statistiken von {\tt normal.calculator}>>
         <<zeige Plots: {\tt normal.calculator}>>
       },
       {
        print("Bitte x eingeben! x=?")
        x.F<-scan(,0)
        if(0==length(x.F)) x.F<-mu+(-3:3)*sigma
        <<berechne Statistiken von {\tt normal.calculator}>>
        <<zeige Plots: {\tt normal.calculator}>>
        print("Dichte- und Verteilungsfunktion:")
        print(cbind(x       =x.F,
                    "f(x)"  =dnorm(x.F,mu,sigma),
                    "F(x)"  =pnorm(x.F,mu,sigma),
                    "1-F(x)" =1-pnorm(x.F,mu,sigma)))
       },
       {
        print("Bitte Wahrscheinlichkeiten eingeben! F(x)=?")
        Fx<-scan(,0); if(length(Fx)==0) Fx<-c(.05,.1,.25,.5,.75,.9,.95)
        <<berechne Statistiken von {\tt normal.calculator}>>
        print("Quantile:")
        x.F<-qnorm(Fx,mu,sigma)
        print(cbind("F(x)"=Fx,x=x.F))
        <<zeige Plots: {\tt normal.calculator}>>
       },
       {
        print("Die Zufallsvariable wird um  b  verschoben.")
        print("Bitte  b  eingeben (Default: b==0) b=?")
        b<-c(scan(,0,n=1),0)[1]
        mu<-mu+b
        <<berechne Statistiken von {\tt normal.calculator}>>
        <<zeige Plots: {\tt normal.calculator}>>
       },
       {
        print("Die Zufallsvariable wird um  a  gestreckt.")
        print("Bitte  a  eingeben (Default: a==1) a=?")
        a<-c(scan(,0,n=1),1)[1]
        if(a==0){ print("ERROR: a==0") } else {
          mu<-a*mu
          sigma<-abs(a)*sigma
          <<berechne Statistiken von {\tt normal.calculator}>>
          <<zeige Plots: {\tt normal.calculator}>>
        }
       }
)


[350:]

<<zeige Plots: {\tt normal.calculator}>>=
x<-x.F
xmin<-min(-3.5,qnorm(.01,mu,sigma),x)
xmax<-max(3.5,qnorm(.99,mu,sigma),x)
z0<-(x-mu)/sigma
p.z0<-pnorm(z0)
xx<-seq(from=mu-3*sigma,to=mu+3*sigma,length=150)
xx<-xx[xmin<=xx&xx<=xmax]
Fxx<-pnorm(xx,mu,sigma)
fxx<-dnorm(xx,mu,sigma)
zz<-seq(from=-3,to=3,length=150)
Fzz<-pnorm(zz)
fzz<-dnorm(zz)
fmax<-max(fxx,fzz)

par(mfrow=c(3,2))
# PLOT 1,1
plot(1,xlab="",ylab="",ylim=c(0,1), xlim=c(xmin,xmax), type="n")
lines(xx,Fxx)
segments(par()$usr[1],0,xx[1],0)
segments(par()$usr[2],1,xx[length(xx)],1)
abline(v=x)
title("F(x)")
# PLOT 1,2
plot(1,xlab="",ylab="",ylim=c(0,fmax), xlim=c(xmin,xmax), type="n")
lines(xx,fxx)
segments(par()$usr[1],0,xx[1],0)
segments(par()$usr[2],0,xx[length(xx)],0)
abline(v=x)
title("f(x)")
# PLOT 2,1
plot(1,type="n",xlim=c(xmin,xmax),ylim=c(xmin,xmax),xlab="",ylab="")
abline(0,1,lty=2)
abline(mu,sigma,lty=4)
legend(xmin,xmax,legend=c("f(x)=x","x=sigma*z+mu"),lty=c(2,4))
h<-xmin<=z0 & z0<=xmax
segments(x,xmax,x,x)
segments(x,x,pmin(xmax,pmax(z0,xmin)),x)
if(any(h))segments(z0[h],xmin,z0[h],x[h])
title("Transformation")
# PLOT 2,2
plot(1,type="n",xlim=c(xmin,xmax),ylim=c(xmin,xmax),xlab="",ylab="")
abline(0,1,lty=2)
abline(mu,sigma,lty=4)
legend(xmin,xmax,legend=c("f(x)=x","x=sigma*z+mu"),lty=c(2,4))
segments(x,xmax,x,x)
segments(x,x,pmin(xmax,pmax(z0,xmin)),x)
if(any(h))segments(z0[h],xmin,z0[h],x[h])
title("Transformation")
# PLOT 3,1
plot(1,xlab="",ylab="",ylim=c(0,1), xlim=c(xmin,xmax), type="n")
lines(zz,Fzz)
segments(par()$usr[1],0,zz[1],0)
segments(par()$usr[2],1,zz[length(zz)],1)
if(any(h))segments(z0[h],1,z0[h],p.z0[h])
if(any(h))segments(z0[h],p.z0[h],xmin,p.z0[h])
title("Verteilungsfunktion von N(0,1)")
# PLOT 3,2
plot(1,xlab="",ylab="",ylim=c(0,fmax), xlim=c(xmin,xmax), type="n")
lines(zz,fzz)
segments(par()$usr[1],0,zz[1],0)
segments(par()$usr[2],0,zz[length(zz)],0)
if(any(h))abline(v=z0[h])
title("Dichte von N(0,1)")

par(mfrow=c(1,1))

demo.Laplace , demo.zgws

Diese Funktion demonstriert den Satz von Moivre-Laplace.


[351:]

<<initialisiere einige Funktionen>>=
demo.Laplace<-function(n=10,p=0.5){
  <<initialisiere {\tt demo.Laplace}>>
  repeat{
     <<ermittle {\tt n} und {\tt p}, {\tt demo.Laplace}>>
     <<erstelle ersten Plot, {\tt demo.Laplace}>>
     <<erstelle zweiten Plot, {\tt demo.Laplace}>>
     <<stelle Ende fest, {\tt demo.Laplace}>>
  }
  <<schliesse {\tt demo.Laplace}>>
}
Der graphische Device wird zweigeteilt


[352:]

<<initialisiere {\tt demo.Laplace}>>=
par(mfrow=c(1,2))


[353:]

<<ermittle {\tt n} und {\tt p}, {\tt demo.Laplace}>>=
cat("Geben Sie n ein! n=?\n")
n<-max(1,floor(c(scan(,0,n=1),n)[1]))
cat("Geben Sie p ein! p=?\n")
p<-c(scan(,0,n=1),p)[1]
p<-max(.0001,min(.9999,p))


[354:]

<<stelle Ende fest, {\tt demo.Laplace}>>=
cat("Wollen Sie die Funktion beenden? (j=ja)\n")
wahl<-c(scan(,"",n=1),"n")[1]
if(wahl=="j") break
Stichworte zum ersten Plot: NV-Parameter bestimmen, geeigneten Bereich für x finden, WS von x ermitteln, zu kleine Werte wieder entfernen, xnorm : x -Werte für die NV finden, Dichtewerte bestimmen, Plot erstellen.


[355:]

<<erstelle ersten Plot, {\tt demo.Laplace}>>=
sigma<-((mu<-n*p)*(1-p))^0.5
x<-0:n; if(n>19)x<-x[x>mu-5*sigma&x<mu+5*sigma]
y<-dbinom(x,n,p)
if(n>19){
     x<-x[y>0.0001]
     y<-y[y>0.0001]
}
xnorm<-seq(from=mu-5*sigma,to=mu+5*sigma,length=250)
xnorm<-xnorm[xnorm>=min(x)&xnorm<=max(x)]
ynorm<-dnorm(xnorm,mu,sigma)
ymax<-max(y,ynorm)

plot(x,y,ylab="f(x)",ylim=c(0,ymax))
segments(x,0,x,y)
lines(xnorm,ynorm)
title(paste("WS-Funktion/NV-Dichte\nn=",n,", p=",p))
Stichworte zum zweiten Plot: zu x korrespondierende Approximationswerte ermitteln, Fehler berechnen ( d ), kumulierte Fehler ( cd ), Plot erstellen.


[356:]

<<erstelle zweiten Plot, {\tt demo.Laplace}>>=
d <-y-           (pnorm(x,mu,sigma)-pnorm(x-1,mu,sigma))
cd<-pbinom(x,n,p)-pnorm(x,mu,sigma)

plot(x,cd,ylab="error",ylim=c(min(0,d,cd),max(0,d,cd)))
segments(x,0,x,d)
abline(h=0)
title("Fehler:f()-Approximation\n(Punkte:Fehler,kumuliert)")
Der graphische Device wird wieder in den Urzustand versetzt.


[357:]

<<schliesse {\tt demo.Laplace}>>=
par(mfrow=c(1,1))
Die Funktion demo.zgws demonstiert den Zentralen Grenzwertsatz.

Die Funktion demo.zgws besteht im Kern aus drei Schritten:

1.
Stichprobenziehung vom Umfang n,
2.
Berechnung der zugehörigen arithmetischen Mittel,
3.
Darstellung der gefundenen empirischen Verteilung,
4.
Benutzerbefragung für den nächsten Durchlauf.

Relevante Inputgrößen: Die Verteilung, aus denen die einzelnen Xi gezogen werden, wird über das erste Argument ( model ) spezifiziert. Das Argument bestimmt den Namensbestandteil der entsprechenden Splus-Funktion. Über das letzte Argument ... lassen sich weitere Argumente der Funktion zur Realisation der Zufallsvariablen mitgeben. n gibt den Umfang jeder der Stichproben an (Default: 10). Dann ist die Anzahl der Stichproben, aus denen Mittel berechnet werden, ( runs ) festzulegen (Deault: 100).


[358:]

<<initialisiere einige Funktionen>>=
demo.zgws<-function(model="norm",n=10,runs=100,...){
<<body of {\tt demo.zgws}>>
}


[359:]

<<body of {\tt demo.zgws}>>=
<<Initialisierung von {\tt demo.zgws}>>
repeat{
  <<ziehe Stichproben {\tt demo.zgws}>>
  <<berechne Mittel {\tt demo.zgws}>>
  <<erstelle Plots {\tt demo.zgws}>>
  <<erfrage W\"unsche {\tt demo.zgws}>>
}
<<Ende-Behandlung von {\tt demo.zgws}>>


[360:]

<<Initialisierung von {\tt demo.zgws}>>=
ynorm<-pnorm(xnorm<-(-80:80)/20)
<<erfrage W\"unsche {\tt demo.zgws}>>
par(mfrow=1:2)


[361:]

<<Ende-Behandlung von {\tt demo.zgws}>>=
par(mfrow=c(1,1))


[362:]

<<ziehe Stichproben {\tt demo.zgws}>>=
x<-eval(parse(text=realisiere.stpr))
x<-matrix(x,n,runs)


[363:]

<<berechne Mittel {\tt demo.zgws}>>=
xsum<-apply(x,2,sum)
xsum<-xsum-mean(xsum)
xsum<-xsum/sqrt(var(xsum))


[364:]

<<erstelle Plots {\tt demo.zgws}>>=
plot(c(-4,4),c(0,1),type="n",xlab="transformierte Mittel",ylab="F.dach, Phi")
points(sort(xsum),(1:length(xsum))/length(xsum))
lines(xnorm,ynorm)
text(-3,0.9,legend)
text(-3,0.8,paste("n =",n))
title("empirische Verteilung\ntransformierte Mittel")
pfade<-apply(x,2,cumsum)/matrix(1:n,n,runs)
yminmax<-range(pfade[,1:min(15,runs)])
plot(1,xlim=c(1,n),ylim=yminmax,xlab="x",ylab="Mittel bis x")
title("Entwicklung der Mittel")
for(i in 1:min(15,runs)) lines(1:n,pfade[,i])


[365:]

<<erfrage W\"unsche {\tt demo.zgws}>>=
cat("Modell / Aus welcher Verteilung sollen\n")
cat("Stichproben gezogen werden (Default: Normalverteilung)?\n")
wahl<-Menu(c(
       "Abbruch/Ende",
       "Normalverteilung",
       "Exponentialverteilung",
       "Gleichverteilung",
       "Cauchy-Verteilung",
       "Binomialverteilung",
       "Poisson-Verteilung"))
if(wahl==0) break
switch(wahl,
       break,
       {
         cat("Bitte Mittel der Normalverteilung eingeben (Default: 0)!\n")
           mue<-c(scan(,0,n=1),0)[1]
         cat("Bitte Standardabweichung eingeben (Default: 1)!\n")
           sigma<-c(scan(,0,n=1),1)[1]
         if(sigma<=0){cat("ERROR: sigma nicht positiv!\n"); sigma<-1}
         realisiere.stpr<-"rnorm(n*runs,mue,sigma)"
         legend<-paste("NV(",mue,",",sigma,")",sep="")
       },{
         cat("Bitte LAMBDA der Exponentialverteilung eingeben (Default: 1)!\n")
           lambda<-c(scan(,0,n=1),1)[1]
         if(lambda<=0){cat("ERROR: lambda nicht positiv!\n"); lambda<-1}
         realisiere.stpr<-"rexp(n*runs,lambda)"
         legend<-paste("Exp(",lambda,")",sep="")
       },{
         cat("Bitte Untergrenze der Gleichverteilung eingeben (Default: 0)!\n")
           ug<-c(scan(,0,n=1),0)[1]
         cat("Bitte Obergrenze eingeben (Default: 1)!\n")
           og<-c(scan(,0,n=1),1)[1]
         if(og<=ug){cat("ERROR: Grenzen falsch!\n"); og<-1+ug<-0}
         realisiere.stpr<-"runif(n*runs,ug,og)"
         legend<-paste("U(",ug,",",og,")",sep="")
       },{
         cat("Bitte Zentrum der Cauchy-Verteilung eingeben (Default: 0)!\n")
           mue<-c(scan(,0,n=1),0)[1]
         cat("Bitte Skalenparameter eingeben (Default: 1)!\n")
           sigma<-c(scan(,0,n=1),1)[1]
         if(sigma<=0){cat("ERROR: Skalenparameter nicht positiv!\n"); sigma<-1}
         realisiere.stpr<-"rcauchy(n*runs,mue,sigma)"
         legend<-paste("Cauchy(",mue,",",sigma,")",sep="")
       },{
         cat("Bitte n der Binomialverteilung eingeben (Default: 1)!\n")
           nbin<-floor(c(scan(,0,n=1),1)[1])
         cat("Bitte p eingeben (Default: 0.5)!\n")
           p<-c(scan(,0,n=1),0.5)[1]
         if(nbin<=0){cat("ERROR: n nicht positiv!\n"); nbin<-1}
         if(p<=0|p>=1){cat("ERROR: p falsch!\n"); p<-0.5}
         realisiere.stpr<-"rbinom(n*runs,nbin,p)"
         legend<-paste("Binom(",nbin,",",p,")",sep="")
       },{
         cat("Bitte LAMBDA der Poisson-Verteilung eingeben (Default: 1)!\n")
           lambda<-c(scan(,0,n=1),1)[1]
         if(lambda<=0){cat("ERROR: lambda nicht positiv!\n"); lambda<-1}
         realisiere.stpr<-"rpois(n*runs,lambda)"
         legend<-paste("Poisson(",lambda,")",sep="")
       }
) # end of switch
cat("Bitte Umfang der einzelnen Stichproben eingeben! (Default: 5)\n")
n<-max(1,min(floor(c(scan(n=1),5)[1]),100000))
cat("Bitte Umfang der Wiederholungen eingeben! (Default: 100)\n")
runs<-max(1,min(floor(c(scan(n=1),100)[1]),10000))
cat("Bitte Start des Zufallszahlengenerators eingeben! (Default: 13)\n")
set.seed(max(1,min(floor(c(scan(n=1),13)[1]),999)))

Identifizierfunktionen: qq.x.model , identify.exp , identify.pois ,
geom.p.est , interval.est.lambda

In diesem Abschnitt wird die Funktion qq.x.model definiert, die zu einem Datensatz einen QQ-Plot bezüglich einer der folgenden Verteilung erstellt:

Nr. Verteilung model parameter
       
1 Normalverteilung norm parameter == $(\mu, \sigma)$
2 Exponentialverteilung exp parameter == $\lambda$
3 Poisson-Verteilung pois parameter == $\lambda$
4 geometrische Verteilung geom parameter == p
5 Lognormalverteilung lnorm parameter == E$(\log X),\sigma_{log X})
$
Normalverteilung, Exponentialverteilung, Poisson-Verteilung, geometrische Verteilung, Lognormalverteilung. Als erstes Argument ist der Datensatz zu übergeben, als zweites kann das gewünschte Modell gewählt werden, als drittes eventuell bekannte Parameter. Werden die Parameter nicht mit gegeben, dann werden sie nach der Methode der Momente grob geschätzt. Wird kein Modell angegeben, wird es erfragt.


[366:]

<<initialisiere einige Funktionen>>=
qq.x.model<-function(x,model,parameter){
 <<bereite Input von {\tt qq.x.model} auf>>
 <<bestimme $y$-Werte f\"ur QQ-Plot, {\tt qq.x.model}>>
 <<zeichne QQ-Plot, {\tt qq.x.model}>>
}


[367:]

<<bereite Input von {\tt qq.x.model} auf>>=
mods<-c("norm","exp","pois","geom","lnorm")
if(missing(model)){
        cat("Welches Modell?\n")
        wahl<-Menu(c("Normalverteilung",
                     "Exponentialverteilung",
                     "Poisson-Verteilung",
                     "geometrische Verteilung",
                     "Lognormalverteilung"))
        model<-mods[wahl]
}
model<-model[1]
if(is.character(model[1])) model<-(1:length(mods))[mods==model]
if(0==length(model) || 1<length(model) || !any((1:length(mods))==model)){
 print("ERROR: Modell nicht im Angebot!"); break
}
if(missing(parameter)){
 parameter<-switch(model,
                   c(mean(x),var(x)^0.5),     # norm
                   1/mean(x),# exp
                   mean(x),  # Poisson
                   length(x)/(sum(x)+length(x)), # geom
                   c(mean(log(x)),var(log(x))^0.5)   # lnorm
                  )
}


[368:]

<<bestimme $y$-Werte f\"ur QQ-Plot, {\tt qq.x.model}>>=
p<-((1:length(x))-0.5)/length(x)
y<-switch(model,
          qnorm(p,parameter[1],parameter[2]), # norm
          qexp(p,parameter), # exp
          qpois(p,parameter), # Poisson
          qgeom(p,parameter), # geom
          qlnorm(p,parameter[1],parameter[2]) # lnorm
         )


[369:]

<<zeichne QQ-Plot, {\tt qq.x.model}>>=
x<-sort(x)
if(model!=5){
    plot(x,y,xlab="Daten",ylab=mods[model])
}else{
    plot(x,y,log="xy",xlab="Daten",ylab=mods[model])
}
abline(0,1)
title("QQ-Plot")
Um alle Punkte für den Plot zu verwenden, wird F.dach um 1/(2n) nach unten gezogen. Für die Schätzung der Geraden werden nur die 80 % kleinsten Beobachtungen verwendet. Geschätzt wird mit l1fit ohne Achsenabschnitt.


[370:]

<<initialisiere einige Funktionen>>=
identify.exp<-function(x,cut.off=4/5){
  n<-length(x)
  x<-  sort(x)
  y<- -log(1-((1:n)-.5)/n)
  plot(x,y,xlab="x",ylab="-log(1-F.dach(x))")
  h<-floor(n*cut.off)
  r<-c(l1fit(x[1:h],y[1:h],F)$coef)
  abline(r)
  names(r)<-"lambda.dach"
  r
}


[371:]

<<initialisiere einige Funktionen>>=
identify.pois<-function(x){
  y<-table(x); h<- y>1
  y<-y[h]/length(x)
  x<-as.numeric(names(y))
  y<-log(y)+log(gamma(x+1))
  plot(x,y,xlab="x",ylab="")
  r<-c(l1fit(x,y)$coef)
  abline(r)
  r<- c(-r[1],exp(r[2]))
  names(r)<-c("lambda.dach1","lambda.dach2")
  r
}
Eine Funktion zur Schätzung von p bei geom. Verteilung.


[372:]

<<initialisiere einige Funktionen>>=
geom.p.est<-function(x){
   n<-length(x)
   yy_table(x); xx_as.numeric(names(yy))
   yy_as.vector(yy); names(yy)_NULL
   plot(xx,log(yy/n),xlab="Wartezeit",ylab="log(n.i/n)")
   h_floor((length(yy))/2)
   abline(r_l1fit(xx[1:h],log(yy[1:h]/n))$coef)
   r_abs((0:1)-exp(r))
   names(r)_c("p aus Achsenabschnitt","p aus Steigung")
   return(r)
}
Eine Funktion zur Schätzung der Belastungsrate im Zeitablauf. Dazu werden verschiedene in Anzahlen gemessenen Fensterbreiten erfragt und graphisch umgesetzt.


[373:]

<<initialisiere einige Funktionen>>=
interval.est.lambda<-function(x){
  cat("Belastungsrate im Zeitablauf\n")
  print("Geben Sie die Anzahl der Ereignisse an, die zusammen betrachtet")
  print("werden sollen! Es duerfen auch mehrere (maximal 9)")
  print("Anzahlen eingegeben werden. (Default:  5 10 20) Anzahlen=?")
  anz.set<-scan(,0,n=9); if(length(anz.set)==0) anz.set<-c(5,10,20)
  par(mfrow=matrix(c(1,1, 1,2, 1,3, 2,2, 2,3, 2,3, 3,3, 3,3, 3,3),2,9)
          [,length(anz.set)])
  for(anz in anz.set){
    if(all(x==sort(x))) h<-x else h<-cumsum(x)
    hx<-.5*(h[(1+anz):length(h)]+h[1:(length(h)-anz)])
    hy<-anz/(h[(1+anz):length(h)]-h[1:(length(h)-anz)])
    plot(hx,hy,type="l",xlab="time",ylab="Belastung")
    title(paste("anz =",anz))
  }
  par(mfrow=c(1,1))
}

Reporterstellung (noch im Aufbau): revbook.report

In diesem Abschnitt wird eine kleine Funktion definiert, die die Reporterstellung maximal erleichert. Einige Designentscheidungen entsprechen Vorschlägen aus P.Naeve: Ein einfaches statistisches Reportsystem in Splus.


[374:]

<<initialisiere einige Funktionen>>=
revbook.report<-function(){
 repeat{
   <<Fkt: {\tt revbook.report} erfrage Wunsch>>
   <<Fkt: {\tt revbook.report} handele M\"oglichkeiten ab>>
 }
 invisible()
}


[375:]

<<Fkt: {\tt revbook.report} erfrage Wunsch>>=
auswahl<-c(
           "Abbruch/Ende",
           "leere Report",
           "fuege Text-Zeile an den Report an",
           "fuege Text-Zeile ein",
           "kopiere Plot in den Report",
           "entferne Zeilen aus Report",
           "zeige Roh-Report an",
           "verarbeite Report",
           "drucke Report"
          )
wahl<-Menu(auswahl,report=F)


[376:]

<<Fkt: {\tt revbook.report} handele M\"oglichkeiten ab>>=
switch(wahl,
         { break
       },{ <<Fkt: {\tt revbook.report} leere Report>>
       },{ <<Fkt: {\tt revbook.report} Zeile anh\"angen>>
       },{ <<Fkt: {\tt revbook.report} Zeile einf\"ugen>>
       },{ <<Fkt: {\tt revbook.report} Plot einf\"ugen>>
       },{ <<Fkt: {\tt revbook.report} Zeilen l\"oschen>>
       },{ <<Fkt: {\tt revbook.report} Report zeigen>>
       },{ <<Fkt: {\tt revbook.report} Report verarbeiten>>
       },{ <<Fkt: {\tt revbook.report} Report ausdrucken>>
       }
)


[377:]

<<Fkt: {\tt revbook.report} leere Report>>=
cat(" Revbook-Report leeren\n")
cat("Sind Sie sicher, dass der alte Report \n")
cat("geloescht werden soll? Fall ja j eingeben!\n")
h<-paste(readline(),"n",sep="")
if("j"==substring(h,1,1)){
  unix("echo @ > revbookreport.rev",,F)
  cat(" Revbook-Report wurde geloescht\n")
}else{
  cat(" Revbook-Report wurde NICHT geloescht\n")
}


[378:]

<<Fkt: {\tt revbook.report} Zeile anh\"angen>>=
cat(" Revbook-Report um Textzeile verlaengern\n")
cat("Geben Sie die Text-Zeile ein:\n")
h<-readline()
if(nchar(h)>0){
  write(h,".tmp")
  unix(paste("cat .tmp >","> revbookreport.rev",sep=""))
} else {
  unix(paste("echo @ >","> revbookreport.rev",sep=""))
}


[379:]

<<Fkt: {\tt revbook.report} Zeile einf\"ugen>>=
cat("Textzeile in Revbook-Report einfuegen\n")
cat("Geben Sie die Nummer der Zeile ein, hinter\n")
cat("der die neue Zeile eingefuegt werden soll!\n")
h<-readline()
h<-substring(h,1:nchar(h),1:nchar(h))
no<-h[grep(c("0","1","2","3","4","5","6","7","8","9",),h)]
if(length(no)>0){
  no<-paste(no,collapse="")
  cat("Geben Sie die Text-Zeile ein:\n")
  h<-readline()
  if(nchar(h)>0){
    unix(paste("head -n",no,"revbookreport.rev > .tmphead"))
    write(h,".tmp")
    eval(parse(text=paste("no<-1+as.numeric(no)")))
    unix(paste("tail -n +",no," revbookreport.rev>.tmptail",sep=""))
    unix("cat .tmphead .tmp .tmptail > revbookreport.rev")
  }
} else {
  cat("Es wurde keine Nummer eingegeben!\n")
}


[380:]

<<Fkt: {\tt revbook.report} Plot einf\"ugen>>=
cat("Plot in Report kopieren\n")
cat("Geben Sie die Nummer der Zeile ein, hinter\n")
cat("der der Plot eingefuegt werden soll!\n")
h<-readline()
h<-substring(h,1:nchar(h),1:nchar(h))
no<-h[grep(c("0","1","2","3","4","5","6","7","8","9",),h)]
  if(length(no)==0) no<-"9999"
  no<-paste(no,collapse="")
  cat("Geben Sie einen Namen f\"ur das Bild ein!\n")
  h<-paste(readline(),".ps",sep="")
  if(nchar(h)>3){
    dev.copy(postscript,file=h,horizontal=F, height=4,width=4)
    if(names(dev.cur())=="postscript") dev.off()
    h<-paste("{\\psfig{figure=",h,",height=5cm,width=5cm}}\n\n",sep="")
    h<-paste("\n\n\\centerline",h,sep="")
    write(h,".tmp")
    if(no!="9999"){
       unix(paste("head -n",no,"revbookreport.rev > .tmphead"))
       eval(parse(text=paste("no<-1+as.numeric(no)")))
       unix(paste("tail -n +",no," revbookreport.rev>.tmptail",sep=""))
       unix("cat .tmphead .tmp .tmptail > revbookreport.rev")
    } else {
       unix("cat .tmp >> revbookreport.rev")
    }
  } else {
    cat("Ohne Namen keine Kopie!\n")
  }


[381:]

<<Fkt: {\tt revbook.report} Zeilen l\"oschen>>=
cat("Zeilen aus Report entfernen\n")
cat("Geben Sie die Nummer der ersten und die der\n")
cat("letzten Zeile ein, die geloescht werden soll!\n")
h<-readline()
if(nchar(h)>0){
  h<-substring(h,1:nchar(h),1:nchar(h))
  no<-h[grep(c(" ","0","1","2","3","4","5","6","7","8","9",),h)]
  no[no==" "]<-","
  no<-paste(no,collapse="")
  no<-eval(parse(text=paste("c(",no,",-1,-2)")))[1:2]
  if(no[1]>0){
    if(no[2]<0) no[2]<-no[1]
    unix(paste("head -n",no[1]-1,"revbookreport.rev > .tmphead"))
    unix(paste("tail -n +",no[2]+1," revbookreport.rev>.tmptail",sep=""))
    unix("cat .tmphead .tmptail > revbookreport.rev")
    cat(paste("Report von Zeile",no[1],"bis",no[2],"geloescht\n"))
  }
}


[382:]

<<Fkt: {\tt revbook.report} Report zeigen>>=
cat(" Revbook-Report zeigen\n")
unix("pr -n:3 revbookreport.rev|more",,F)


[383:]

<<Fkt: {\tt revbook.report} Report verarbeiten>>=
cat("verarbeite Report\n")
unix(      "cat report.head           > h.rev",,F)
unix(paste("cat revbookreport.rev >","> h.rev",sep=""),,F)
unix(paste("cat report.tail       >","> h.rev",sep=""),,F)
unix(paste("noweave -index -delay -filter /opt/revweb/lib/umlaute",
           "h.rev > h.tex"),,F)
unix("echo q | latex h",,F)
unix("dvips h",,F)
cat("Anzeige des Reports mit dem Programm ghostview\n")
cat("ENDE von ghostview: Taste  Q \n")
unix("ghostview h.ps",,F)


[384:]

<<Fkt: {\tt revbook.report} Report ausdrucken>>=
cat("dps h.ps\n")

select.spalte , select.and.split für DM-zugriffe

Die Datenmatrixszugriffsfunktion select.spalte .


[385:]

<<initialisiere einige Funktionen>>=
select.spalte<-function(dm=rubber){
  <<initialisiere {\tt select.spalte}>>
  <<selektiere Spalten; {\tt select.spalte}>>
  <<selektiere Teilmenge aus den gew\"ahlten Spalten; {\tt select.spalte}>>
  <<erstelle Ausgabe f\"ur {\tt select.spalte}>>
}


[386:]

<<initialisiere {\tt select.spalte}>>=
cat("\n\n")
cat("+-----------------------------------------------------------+\n")
cat("|Programm zur Selektion eines Merkmals aus einer Datenmatrix|\n")
cat("+-----------------------------------------------------------+\n\n")
cat(" Mit diesem Programm koennen Sie aus der Datenmatrix\n")
cat(" eine Merkmalsspalte auswaehlen.\n")
cat(" Danach koennen Sie mittels eines zweiten Merkmals\n")
cat(" die ausgewaehlte Spalte verkuerzen.\n")
cat("  BITTE RETURN druecken \n\n")
readline()
if(is.list(dm))                 dm<-dm{\tt 1}
if(!is.matrix(dm))               dm<-cbind(dm)
if(is.null(dimnames(dm)))        dimnames(dm)<-list(NULL,1:ncol(dm))
if(0==length(dimnames(dm){\tt 2})) dimnames(dm){\tt 2}<-1:ncol(dm)
nspalten<-ncol(dm)
dm.out<-NULL
dm.h hält als Vektor die ausgewählte Spalte.


[387:]

<<selektiere Spalten; {\tt select.spalte}>>=
  cat(paste("  Die Datenmatrix hat",nspalten,"Spalten.\n"))
  cat("  Hier ist die Liste der Spaltennamen mit den Spaltennummern:\n\n")
  print(rbind(dimnames(dm){\tt 2}))
  cat("\n")
  cat("  Welche Spalte wollen Sie auswaehlen?\n")
  cat("  Geben Sie die Nummer der von Ihnen gewuenschten Spalte an!\n")
  wahl<-c(scan(,0,n=1),1)[1]
  wahl<-floor(wahl)
  wahl<-wahl[wahl<=nspalten & wahl>0]
  if(0==length(wahl)){
        print("ERROR: Falsche Eingabe - ABBRUCH")
        break
  }
  dm.h<-dm[,wahl]


[388:]

<<selektiere Teilmenge aus den gew\"ahlten Spalten; {\tt select.spalte}>>=
cat("\n")
cat("Auswahl von Teilelementen der gerade gewaehlten Spalte\n")
cat("------------------------------------------------------\n")
cat(" Nun koennen Elemente der gewaehlte Spalte durch Festlegung\n")
cat(" einer Bedingungen ausgewaehlt/ausgeschlossen werden.\n")
cat("\n")
cat(" Hier ist die Liste der Spaltennamen mit den Spaltennummern.\n\n")
print(rbind(dimnames(dm){\tt 2}))
cat("\n")
cat(" Welche Spalte wird fuer die Bedingung benoetigt?\n")
cat(" Eine leere Eingabe fuehrt zu keiner (weiteren) Reduktion.\n")
wahl<-scan(,0,n=1)
if(length(wahl)>0){
   wahl<-floor(wahl)
   wahl<-wahl[wahl<=nspalten & wahl>0]
   key<-dm[,wahl]
   cat("\n  Hier ist ein Ausdruck der Spalte fuer die Bedingung:\n")
   print(key)
   cat("     Welchen Typ von Bedingung wuenschen Sie?\n")
   relation<-Menu(c("Bedingungs-Spalte < Zahl", "Bedingungs-Spalte = Zahl",
                    "Bedingungs-Spalte > Zahl"))
   cat("     Die Vergleichszahl soll sein:\n")
   zahl<-scan(,0,n=1)
   cat("\n")
   switch(relation,   log.vec<-key < zahl,
                      log.vec<-key ==zahl,
                      log.vec<-key > zahl)
   dm.h<-dm.h[log.vec]
}


[389:]

<<erstelle Ausgabe f\"ur {\tt select.spalte}>>=
dm.out<-dm.h
return(dm.out)

Erforderlich ist es, aus einer Datenmatrix eine Spalte nach einer anderen zu splitten.


[390:]

<<initialisiere einige Funktionen>>=
select.and.split<-function(dm=rubber){
  <<initialisiere {\tt select.and.split}>>
  <<selektiere Spalten {\tt select.and.split}>>
  <<suche die Spalte zum Splitten aus {\tt select.and.split}>>
  <<erstelle Ausgabe f\"ur {\tt select.and.split}>>
}


[391:]

<<initialisiere {\tt select.and.split}>>=
cat("\n\n")
cat("+--------------------------------------------------------------+\n")
cat("|Programm zur Auswahl von Merkmalsspalten aus einer Datenmatrix|\n")
cat("+--------------------------------------------------------------+\n\n")
cat(" Mit diesem Programm koennen Sie aus der Datenmatrix eine Spalte\n")
cat(" auswaehlen und dann mittels eines anderen Merkmals aufsplitten,\n")
cat(" oder sie k\"onnen mehrere verschiedene Spalten auswaehlen.\n")
cat("  BITTE RETURN druecken \n\n")
readline()
if(is.list(dm))                  dm<-dm{\tt 1}
if(!is.matrix(dm))               dm<-cbind(dm)
if(is.null(dimnames(dm)))        dimnames(dm)<-list(NULL,1:ncol(dm))
if(0==length(dimnames(dm){\tt 2})) dimnames(dm){\tt 2}<-1:ncol(dm)
nspalten<-ncol(dm)


[392:]

<<selektiere Spalten {\tt select.and.split}>>=
  cat(paste("  Die Datenmatrix hat",nspalten,"Spalten.\n"))
  cat("  Hier ist die Liste der Spaltennamen mit den Spaltennummern:\n\n")
  print(rbind(dimnames(dm){\tt 2}))
  cat("\n")
  cat("  Welche Spalte(n) wollen Sie auswaehlen?\n")
  cat("  Geben Sie die Nummer(n) der von Ihnen gewuenschten Spalte an!\n")
  wahl<-scan(,0)
  wahl<-floor(wahl)
  wahl<-wahl[wahl<=nspalten & wahl>0]
  if(0==length(wahl)){
        print("ERROR: Falsche Eingabe - ABBRUCH")
        break
  }
  dm.h<-dm[,wahl]
  if(is.matrix(dm.h)) {
    if(is.null(dimnames(dm.h){\tt 2})){
       namen<-paste("vorher",wahl)
    } else {
       namen<-dimnames(dm.h){\tt 2}
    }
    dm.h<-split(dm.h,col(dm.h))
    names(dm.h)<-namen
  }


[393:]

<<suche die Spalte zum Splitten aus {\tt select.and.split}>>=
if(length(wahl)==1){
  cat("\n")
  cat(" Nun koennen Elemente der gewaehlte Spalte gemaess den\n")
  cat(" Merkmalsauspraegungen einer anderen Spalte gesplittet werden.\n")
  cat("\n")
  cat("    Hier ist die Liste der Spaltennamen mit den Spaltennummern.\n\n")
  print(rbind(dimnames(dm){\tt 2}))
  cat("\n")
  cat("    Welche Spalte soll zum Splitten ausgewaehlt werden?\n")
  cat("    Eine leere Eingabe fuehrt nicht zu einer Zerlegung.\n")
  wahl<-scan(,0,n=1)
  if(length(wahl)>0){
   wahl<-floor(wahl)
   wahl<-wahl[wahl<=nspalten & wahl>0]
   if(wahl<=nspalten & wahl>0) {
      dm.h<-split(dm.h,dm[,wahl])
      names(dm.h)<-names(table(dm[,wahl]))
   }
  }
}


[394:]

<<erstelle Ausgabe f\"ur {\tt select.and.split}>>=
return(dm.h)

Makefile

# Makefile fuer REVBOOK  8.4.97 , 28.4.97 , 9.5.97
# all
all: t w x

# vorher    make wall, make tall

win:
        echo "START dos"
        cp  revtmp.rev dos/revbook.rev
        u2d dos/revbook.rev
        cp  revtmp.sch dos/revbook.sch
        u2d dos/revbook.sch
        cp  revobj.sch dos/revobj.sch
        cp  revtmp.dvi dos/revbook.dvi
        cp  lotto.sch  dos/lotto.sch
        u2d dos/lotto.sch
        cp  lotto.rev  dos/lotto.rev
        u2d dos/lotto.rev
        cp  lotto.dvi  dos/lotto.dvi
        echo "attach(\"_Revbook\",pos=1)" > dos/install.sch
        cat dos/revivegrin.sch           >> dos/install.sch
        echo "detach(1)"                 >> dos/install.sch
        cat revobj.sch                   >> dos/install.sch
        u2d dos/install.sch
        echo "mcopy install.sch a:"
        echo "mcopy lotto.*     a:"
        echo "mcopy revbook.*   a:"
        echo "mcopy read.me     a:"

# Definiere Revbook-Funktionen in .Revbook neu.
obj:
        notangle -filter /opt/revweb/lib/twebnumbering\
                         source/revbook.obj.rev \
           | gawk '{gsub(/^[ ]+#/,"#");print $0}'  > revobj.sch
        echo "source(\"revobj.sch\")" > .in
        Splus BATCH .in .out
        read h; echo "$h"
        cp  _Revbook/* /opt/splus/library/revbook/.Data

tmodel: revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.model.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.model.a.rev\
            source/revbook.model.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

tnv:    revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.nv.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.model.a.rev\
            source/revbook.nv.a.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

tmass: revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.masszahlen.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.masszahlen.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

tgraph: revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.graphiken.rev\
            source/revbook.anhang.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.graphiken.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

tmulti: revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.multi.rev\
            source/revbook.anhang.rev\
            source/revbook.multi.a.rev\
            source/revbook.multi.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

tall: revtmp.sch
        echo '   start tangling:'
        cat source/revbook.head.rev\
            source/revbook.vorweg.rev\
            source/revbook.problem.rev\
            source/revbook.masszahlen.rev\
            source/revbook.graphiken.rev\
            source/revbook.multi.rev\
            source/revbook.model.rev\
            source/revbook.nv.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.model.a.rev\
            source/revbook.masszahlen.m.rev\
            source/revbook.graphiken.m.rev\
            source/revbook.multi.m.rev\
            source/revbook.model.m.rev\
            source/revbook.nv.a.rev\
            source/revbook.anhangend.rev\
            source/revbook.obj.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'
        cp  revtmp.sch /opt/splus/library/revbook/revbook.sch

wmass: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.masszahlen.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.masszahlen.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

wgraph: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.graphiken.rev\
            source/revbook.anhang.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.graphiken.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

wmulti: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.multi.rev\
            source/revbook.anhang.rev\
            source/revbook.multi.a.rev\
            source/revbook.multi.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

wmodel: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.model.rev\
            source/revbook.anhang.rev\
            source/revbook.model.a.rev\
            source/revbook.model.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

wnv:    revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.nv.rev\
            source/revbook.anhang.rev\
            source/revbook.nv.a.rev\
            source/revbook.anhangend.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

wall: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.vorweg.rev\
            source/revbook.problem.rev\
            source/revbook.masszahlen.rev\
            source/revbook.graphiken.rev\
            source/revbook.multi.rev\
            source/revbook.model.rev\
            source/revbook.nv.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.model.a.rev\
            source/revbook.nv.a.rev\
            source/revbook.masszahlen.m.rev\
            source/revbook.graphiken.m.rev\
            source/revbook.multi.m.rev\
            source/revbook.model.m.rev\
            source/revbook.anhangend.rev\
            source/revbook.obj.rev\
            source/revbook.make.start\
            Makefile\
            source/revbook.make.end\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

revtmp.dvi: w
        latex revtmp

wpro: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.vorweg.rev\
            source/revbook.problem.rev\
            source/revbook.masszahlen.rev\
            source/revbook.graphiken.rev\
            source/revbook.multi.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.anhangend.rev\
            source/revbook.obj.rev\
            source/revbook.tail.rev\
                             > revtmp.rev
        noweave -index -delay -filter /opt/revweb/lib/umlaute \
                 revtmp.rev > revtmp.tex
        [ -f revtmp.tex ] && echo  '     revtmp.tex generated'
        latex revtmp; latex revtmp
        # x: revtmp.dvi

tpro: revtmp.tex
        echo '   start weaving:'
        cat source/revbook.head.rev\
            source/revbook.vorweg.rev\
            source/revbook.problem.rev\
            source/revbook.masszahlen.rev\
            source/revbook.graphiken.rev\
            source/revbook.multi.rev\
            source/revbook.anhang.rev\
            source/revbook.masszahlen.a.rev\
            source/revbook.graphiken.a.rev\
            source/revbook.multi.a.rev\
            source/revbook.anhangend.rev\
            source/revbook.obj.rev\
            source/revbook.tail.rev\
                             > revtmp.rev

        notangle -Rstart revtmp.rev|gawk 'BEGIN{print "#0:"}\
                                        {print$0}\
                                      END{print"#:0"}'> revtmp.sch
        notangle -filter /opt/revweb/lib/twebnumbering revtmp.rev| \
                gawk '{gsub(/^[ ]+#/,"#");print $0}'  >>revtmp.sch
        [ -f revtmp.sch ] && echo  '     revtmp.sch generated'

clean:
        rm revtmp.log

Liste der verwendeten Module

About this document ...

Ein wiederbelebbares Buch zur Statistik

Version: 1.0, Oktober 1997

This document was generated using the LaTeX2HTML translator Version 97.1 (release) (July 13th, 1997)

Copyright © 1993, 1994, 1995, 1996, 1997, Nikos Drakos, Computer Based Learning Unit, University of Leeds.

The command line arguments were:
latex2html -split 1 -toc_depth 5 revtmp.

The translation was initiated by Peter Wolf on 2/3/1999


next up previous
Peter Wolf
2/3/1999