binarize
Konvertieren von Kategorien in Binärdaten

Bei der Datenanalyse tritt mitunter das Problem auf, dass kategorielle Daten vorliegen, das Analyse-Werkzeug aber nur binäre Daten untersuchen kann. Das Programm binarize hilft, die Kategorien in binäre Daten zu wandeln. Wenn die Kategorien eine Ordnung tragen, lässt sich diese in die Binärdaten übertragen.

 

System-Voraussetzungen

binarize ist ein Perl-5-Programm, eine entsprechende Installation ist daher Voraussetzung. Eine mögliche Quelle dafür ist http://www.CPAN.org/.

Die Optionen und Parameter von binarize werden mittels Kommandozeilenaufruf übermittelt; diese Möglichkeit (oder etwas Entsprechendes) sollte daher im Betriebssystem vorhanden sein.

 

Installation

 

Kommandozeilen-Aufruf

binarize [-i] [-v] [-c var_data] [-o var_output] [-d delimiter] [-m missing] cat_data > bin_data

liest die Datei cat_data mit kategoriellen Daten ein und schreibt sie als Binär-Daten auf Standard-Output (hier umgelenkt auf die Datei bin_data).
Optionen (alle optional):
-i :
keine ID-Spalte vorhanden
(wird sonst als erste Spalte erwartet und 1-zu-1 ausgegeben);
-v :
keine Zeile mit Variablennamen vorhanden
(Variablennamen werden dann entweder aus var_data gelesen oder automatisch erzeugt als V_#);
-c :
Variablennamen und Kategorien aus Datei var_data lesen, ebenso Steuerung der Ausgabe.
-o :
Variablennamen und Kategorien in Datei var_output schreiben, ebenso Steuerung der Ausgabe. Erzeugt eine (einfache) var_data-Datei.
-d :
Feld-Trennzeichen (mehrere Alternativen möglich).
-m :
Missing-Value-Darstellung
(in der Ausgabe, wird nur mit der Option -c verwendet).

Parameter
cat_data
Die Datei cat_data enthält beliebig viele Zeilen mit jeweils beliebig-aber-gleich vielen Spalten, die mit Tabulator-Zeichen (oder einem der Option -d Parameter) voneinander getrennt sind.
In der ersten Zeile werden Variablennamen erwartet, in der ersten Spalte jeder Zeile eine ID; beides kann mittels der Optionen -v bzw. -i (s.oben) übergangen werden. Eine fehlende Option -i bewirkt, dass der erste Eintrag jeder Zeile ungeändert übertragen wird.
Die Missing Values jeder Variablen werden als normale Kategorie behandelt. Wenn eine Variablen-Zeile vorhanden ist, werden alle Kategorien (auch Missing!) gleich behandelt; in der Ausgabe werden sie lexikografisch sortiert. Werden die Beschreibungen der Variablen und Kategorien aus einer var_data-Datei gelesen (Option -c Parameter), werden alle Einträge, die dort nicht als Eingabe-Kategorie gelistet sind, als Missing Value interpretiert und entsprechend dem Parameter der Option -m (Default='·') ausgegeben. In diesem Fall landet das Missing-Bit am Ende der Kategorienliste der jeweiligen Variablen. Ohne Angabe der var_data-Datei werden die Variablen und Kategorien aus der cat_data-Datei bestimmt: die Variablennamen aus der ersten Zeile (ausser Option -v: dann automatisch als V_#), und die Kategorien aus den Daten-Einträgen von cat_data. Eine Reihenfolge ist dann aus den Daten nicht zu erkennen; es wird daher lexikografisch sortiert. Dies gilt auch für einen etwaigen Missing Value.
var_data
Die Datei var_data hat (sofern benötigt) folgenden Aufbau:
für jede Variable: Falls in cat_data eine ID-Spalte vorhanden ist, muss sie in var_data als erste mit ihrem Variablennamen (ohne Kategorien-Zeilen) genannt sein. binarize kann nicht nur kategorielle in binäre Daten konvertieren, das Programm kann dabei auch eine Ordnung wiedergeben. Im Normalfall (eine Kategorie pro Zeile mit Eingabe- und Ausgabe-Darstellung) wird in der Ausgabe genau eine der zusammengehörigen Binär-Variablen eine '1' als Wert tragen, alle anderen eine '0'. Wenn jedoch mehrere Kategorien in einer var_data-Zeile stehen, hängt die Anzahl der Binär-Ausgabe-Einsen von der Position jeder Kategorie in ihrer Gruppe (=Zeile) ab (und von der Kommando-Zeichenkette):
Sei die Anzahl der Elemente einer Kategorien-Gruppe gleich N. Dann wird für jedes Kommando-Zeichen der Gruppen-Ausgabe ein Block mit N Elementen (Nullen und Einsen) hinzugefügt. Ist das Kommando-Zeichen ein '=', so steht genau eine Eins in diesem Block, und zwar an der Position, die die Kategorie in ihrer Gruppe einnimmt. Ist das Kommando-Zeichen ein '>', so gibt es so viele führende Einsen, wie die Kategorie-Position (von links gezählt) bestimmt; je weiter rechts eine Kategorie in der Zeile steht, desto mehr führende Einsen erzeugt sie in der Binär-Ausgabe. Ist das Kommando-Zeichen ein '<', so gibt es umso mehr führende Einsen in der Binär-Ausgabe, je weiter links die Kategorie in der Zeile steht. Die Zeichen '>' und '<' machen Sinn, wenn die Kategorien eine Teilmengenrelation beschreiben: wenn eine Element der Kategorie A stets auch die Eigenschaften der Kategorie B besitzt, so ist die Menge aller Daten-Objekte mit A-Eintrag (eigentlich) eine Untermenge der B-Objekte. In einem kategoriellen oder Standard-Binären Datensatz geht diese Information meist verloren, in der binarize-Ordinal-Ausgabe jedoch nicht. Die var_data-Zeile dazu wäre:

<<TAB>A_ein<TAB>A_aus<TAB>B_ein<TAB>B_aus

Das Kommando-Zeichen '=' dient dazu, eine Gruppe zusätzlich in normaler Weise auszugeben. Das Programm kann nämlich jede Kategorie nur in genau einer Art ausgeben.

Die Bearbeitung erfolgt in folgenden Schritten:

Die Ausgabe hat eine Variablen-Zeile. Dabei wird jede (kategorielle) Eingabe-Variable mit jeder ihrer Kategorien verbunden und in der Form var+Kommandozeichen+cat als eigene (neue) Binär-Variable ausgegeben. In der Ausgabe ist der Tabulator das Feldtrennzeichen. War in der Eingabe eine ID-Spalte vorhanden, so wird diese original übertragen; andernfalls fehlt sie auch in der Ausgabe.

 

Daten-Struktur

In der Datei cat_data wird eine Matrix von Werten erwartet. Dabei entspricht jede Zeile einem Datensatz und jede Spalte einer Variablen. Die Spalten sind durch ein Trennzeichen (Delimiter) voneinander getrennt (Default=<TAB>; wählbar durch Option -d).

Die erste Zeile darf Variablennamen enthalten; fehlen diese, ist die Option -v zu setzen.

Die erste Spalte jeder Zeile darf eine (eindeutige) Identifikation enthalten. Sie wird nicht kategoriell interpretiert, sondern im Original in die Ausgabe übertragen. Fehlt eine solche Spalte, sollte die Option -i gesetzt werden.

 

Für die Feststellung der vorhandenen Kategorien jeder Variablen gibt es zwei Wege. Zum einen kann binarize diese Auswertung selbständig vornehmen, indem es die Datei cat_data einliest und auswertet. Die Option -o erzeugt dann eine (einfache) Variablen- und Kategorien-Liste in der Datei var_output. Diese Datei kann manuell den eigenen Wünschen angepasst und in einem zweiten Durchgang als var_data (Option -c Parameter) verwendet werden. Dies ist auch die zweite Möglichkeit, Variablennamen und Kategorien an binarize zu übermitteln. Darüber hinaus können auf diesem Weg Kategorien-Gruppen gebildet und Ausgabe-Wünsche genannt werden.

Wie schon erwähnt, enthält die Datei cat_data mehrere Spalten, die jeweils eine Variable repräsentieren. Jede Variable enthält Kategorien, die jeweils zu beliebigen Gruppen geordnet sein können. Diese Struktur findet sich in der Datei var_data wieder. Die Datei hat folgenden Aufbau:

für jede Variable:
eine Zeile mit dem Variablennamen
für jede Kategoriengruppe eine weitere Zeile mit
einer Kommando-Zeichenkette nach dem Muster /^[<=>]*$/, d.h. jedes der Zeichen '<', '=' und '>' darf beliebig oft (oder garnicht) enthalten sein, andere jedoch nicht
<TAB>
Eingabe-Darstellung (Eintrag in cat_data)
<TAB>
Ausgabe-Darstellung (Eintrag in der 1. Zeile der Ausgabe)
es dürfen beliebig viele Sequenzen der Art
<TAB>Eingabe-Darstellung<TAB>Ausgabe-Darstellung
folgen.

Ein- und Ausgabe-Darstellung
Die Datei cat_data enthält möglicherweise nicht den Text, den Sie sich als Variablen/Kategorien-Beschreibung wünschen. Daher gibt es die Möglichkeit, jeder cat_data-Kategorie einen anderen Text zuzuordnen, der in der binären Ausgabe in der Variablenzeile verwendet wird.

Kommando-Zeichenkette
Im binären Ausgabe-Datensatz wird aus einer Kategorie-Spalte ein ganzer Block von binären 0/1-Spalten. Wenn man die Binär-Darstellungen aller Kategorien einer Gruppe untereinander schreibt, bilden sie die Zeilen einer Matrix. Wenn die Kategorien einer Gruppe keine Ordnung tragen, wird jede Spalte ihres Binär-Spalten-Blocks genau eine Eins zeigen, der Rest sind Nullen; dies ergibt die Einheitsmatrix. Ist jedoch eine Ordnung vorhanden, die z.B. eine Teilmengenrelation beschreibt, kann es sinnvoll sein, statt einer Einheitsmatrix (jede Kategorie erzeugt genau eine Eins) eine Dreiecksmatrix von Einsen für den Binär-Spalten-Block zu erzeugen. Ob eine Kategorien-Gruppe eine Einheitsmatrix oder eine rechte-obere oder linke-untere Dreiecksmatrix erzeugt, steuert das Kommando-Zeichen '=', '<' bzw. '>'. Da es sinnvoll sein kann, mehrere dieser Darstellungen nebeneinander auszugeben, dürfen diese Zeichen auch mehrfach und gemischt auftreten. Welche Darstellung in der Ausgabe steht, ist an der Variablenzeile ersichtlich: das Kommando-Zeichen trennt den Variablennamen von der Kategorie. Die Kategorien einer Variablen können gruppiert werden; für jede dieser Gruppen kann eine andere Kommando-Zeichenkette angegeben werden. Bestes Beispiel ist eine geordnete Kategoriengruppe, zu der sich ein Missing Value gesellt: dieses passt nicht in die Ordnung und muss daher als 'Single' ausgegeben werden.

 

Beispiel-Aufruf

binarize -d ' ' -m NA -i -v -c marketing.vc marketing.data


Klaus.Bernt@math.uni-augsburg.de, 20. November 2001