Datenformate und Datenstrukturen

2 Nov

Version 1.0


Textdateien und Binärdateien

Grundsätzlich werden Textdateien und Binärdateien unterschieden. Das ist auf den ersten Blick gar keine sinnvolle Unterscheidung, denn letztendlich sind ja auch Textdateien nichts anderes als Bits und Bytes, sonst könnte ein Computer damit nichts anfangen. Der wesentliche Unterschied ist, dass Textdateien auch unmittelbar von Menschen gelesen werden können: sie enthalten nämlich nur „lesbare“ Zeichen wie Buchstaben, Zahlen, Symbole (und Steuerzeichen, die dann z.B. als Zeilenschaltungen lesbar sind), die sequentiell interpretiert werden. Sie müssen also nicht vor der Anzeige durch eine spezielle Software aus dem maschinenlesbaren Format „übersetzt“ werden, sondern sie lassen sich von jedem beliebigen Texteditor „so wie sie sind“ angezeigen.

Welche Zeichen dabei angezeigt werden bzw. überhaupt werden können, hängt von dem verwendeten Zeichensatz ab. Bei der Erstellung einer Textdatei mit einem Texteditor wird auch immer ihre „Codierung“ festgelegt. Grob gesprochen ist das eine Zuordnung der in einem Zeichensatz vorhandenen Zeichen (der Zeichenvorrat) zu spezifischen Bytes. In der Welt des Personal-Computers wurde viele Jahre der ASCII-Zeichensatz verwendet, der lediglich 95 Zeichen darstellen konnte, also nicht viel mehr als das moderne lateinische Alphabet sowie die „arabischen“ Ziffern. Viele europäische Sprachen weisen jedoch ein erweitertes Alphabet auf, das vor allem eine Reihe von lateinischen Buchstaben durch spezielle Markierungen ergänzt,sogenannte Diakritika, im Deutschen die Umlaute „ä“, „ö“ und „ü“. Leider hat die Computerwelt seit den 1980er Jahren eine Vielzahl von Varianten entwickelt, mit denen diese sprachspezifischen Sonderzeichen, die in einem erweiterten ASCII-Zeichensatz/Zeichenvorrat Aufnahme fanden, kodiert wurden. So konnten zum Beispiel noch nicht einmal die auf einem PC mit einem DOS-Betriebssystem erstellten Texte in einem Texteditor unter MS-Windows „richtig“ angezeigt werden: Hier wurde dann schlicht und einfach eine falsche Zuordnungstabelle zugrunde gelegt. Denn: da ja eine Textdatei wie gesagt nur aus lesbaren Zeichen in sequentieller Reihenfolge besteht, ist in ihr auch nirgendwo die Information enthalten, mit welcher Codierung sie der Texteditor abgespeichert hat, mit der sie erstellt oder zuletzt bearbeitet wurde.

Auszeichnungen von Textdateien

Textdateien können durch „Auszeichnungen“ so mit Metainformationen versehen werden, dass sie weiterhin – zumindest grundsätzlich – für den Menschen lesbar bleiben. Diese Auszeichnungen sind Buchstaben- und Symbolkombinationen, die auf einer Konvention beruhen und zunächst einmal der Formatierung von (Text-) Daten dienen. Verbreitete Beispiele hierfür sind das Rich Text Format (RTF) und TEX, die aber für die Speicherung statistischer Daten keine Rolle spielen.

CSV

Das einfachste und für unseren Kontext gleich schon wichtigste „Auszeichnungsformat“ für statistische Daten ist das Comma-separated values- oder kurz CSV-Format. CSV-Dateien enthalten abgesehen von wenigen Strukturierungselementen (Trennung von Datensätzen (durch Zeilenumbruch), Trennung von Datenfeldern (z.B. durch ein Semikolon), optionale Verwendung von Feldbegrenzerzeichen und Verwendung der ersten Zeile für Spaltennamen) keinerlei Metainformationen, also auch keine Angaben über die Codierung.

Eine Datentabelle

beispiel

sieht als (Unicode-codierte) CSV-Datei so aus:

"V1","V2","V3","V4"
"Peter","ja",23,"stimme zu"
"Paul","nein",43,"keine Angabe"
"Marie","ja",21,"stimme überhaupt nicht zu"

Wäre diese Datei mit der Codierung „Windows Latin 1“ in einem Texteditor geöffnet worden hätte sie so ausgesehen:

"V1","V2","V3","V4"
"Peter","ja",23,"stimme zu"
"Paul","nein",43,"keine Angabe"
"Marie","ja",21,"stimme überhaupt nicht zu"

SQL

Der aus meiner Sicht beste Speicherort für historische Daten ist ein relationales Datenbanksystem. Darin können praktisch beliebig viele Tabellen gespeichert und über die standardisierte Abfragesprache SQL miteinander verknüpft, abgefragt oder bearbeitet werden.

Sämtliche Daten können per „SQL-Dump“ aus der Datenbank exportiert bzw. in sie importiert werden. Es stehen mächtige Systeme wie MySQL, MariaDB oder PostgreSQL unter Open Source Lizenzen zur Verfügung. Viele Webspace-Angebote beinhalten auch einen einfachen Zugang zu einem dieser Datenbanksysteme. Sie basieren in der Regel auf einer Client-Server-Architektur, so dass man nicht ohne weiteres Zugang zu den Dateien hat, in denen die Daten abgespeichert sind. Es gibt aber auch Anwendungen wie SQLite, deren Datenbanken Sie auch lokal ohne einen Server, also so wie bei MS Access oder in früheren Jahren dBase betreiben können.

Die obige Beispieltabelle sieht als SQL-Dump so aus:

CREATE TABLE `beispiel` (
  `V1` VARCHAR(255) DEFAULT NULL,
  `V2` VARCHAR(255) DEFAULT NULL,
  `V3` INT(11) DEFAULT NULL,
  `V4` VARCHAR(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
INSERT INTO `beispiel` (`V1`, `V2`, `V3`, `V4`)
VALUES
	('Peter','ja',23,'stimme zu'),
	('Paul','nein',43,'keine Angabe'),
	('Marie','ja',21,'stimme überhaupt nicht zu');

Man sieht hier, dass eine Information über den Zeichensatz mitgeliefert wird (CHARSET=utf8) und den einzelnen Spalten jeweils ein Spaltentyp, „varchar“ oder „int“, zugeordnet ist.

In SQLite sieht die Tabelle so aus:

SQLite GUI

R stellt Pakete für die Verbindung zu Oracle-, MySQL- und SQLite-Datenbanken sowie über eine ODBC-Schnittstelle zur Verfügung. Anders als beim Import von Excel- oder SPSS- Daten werden hier jedoch keine Dateien importiert, sondern Anfragen an eine Datenbank gerichtet. Anschließend kann die Ergebnismenge der Abfrage importiert werden.

HTML und XML

Eine zentrale Auszeichnungssprache für verschiedenste Datenformen ist die Hypertext Markup Language, kurz HTML. Sie ist die Grundlage aller Webseiten im Internet. Unsere Beispieltabelle wird in HTML wie folgt ausgezeichnet:

<html>
<table>
<tr>
<th>V1</th>
<th>V2</th>
<th>V3</th>
<th>V4</th>
</tr>
<tr>
<td>Peter</td>
<td>ja</td>
<td>23</td
><td>stimme zu</td>
</tr>
<tr>
<td>Paul</td>
<td>nein</td>
<td>43</td>
<td>keine Angabe</td>
</tr>
<tr>
<td>Marie</td>
<td>ja</td>
<td>21</td>
<td>stimme überhaupt nicht zu</td>
</tr>
</table>
</html>

Für die Bearbeitung von statistischen Daten spielt HTML nur eine geringe Rolle (wenn man nicht Daten von Webseiten übernehmen möchte). Oftmals werden aber Daten den Digital Humanities in „XML“ bearbeitet. Wesentliches Merkmal von XML im Gegensatz zu HTML ist, dass die Auszeichnungselemente nicht vorgegeben sind, sondern erst durch eine Dokumenttypdefinition sowie eine XML Schema Definition festgelegt werden. (Genau genommen ist HTML ein Spezialfall von XML.) Für die Digital Humanities haben sich in Bezug auf die Verarbeitung von Texten die Regeln der Text Encoding Initiative weitgehend durchgesetzt. Das Fachkollegium Literaturwissenschaft der Deutschen Forschungsgemeinschaft nennt eine Reihe von Förderkriterien für wissenschaftliche Editionen in der Literaturwissenschaft. Die Daten sollten so aufgebaut sein, dass ein möglichst breiter Datenaustausch möglich ist. Sie sollten in einem „Basisformat“ für die Möglichkeit der Weiterverarbeitung durch Dritte zur Verfügung gestellt werden. Dabei handelt es sich im wesentlichen um die Vorgabe, Dateien in Unicode-Codierung abzuspeichern sowie an den Regeln der Text Encoding Initiative orientiert auszuzeichnen.

Für historische Statistikdaten spielen solche Initiativen bislang keine Rolle, sie bieten aber einen hilfreichen Ausgangspunkt für zukünftige Bestrebungen. Denkbar wäre in Bezug auf XML die Übernahme von sozialwissenschaftlichen Bemühungen wie der Data Documentation Initiative (DDI) oder das Statistical Data and Metadata eXchange (SDMX)-Format, das von vor allem von statistischen Ämtern zum internationalen Austausch von Daten verwendet wird.

Darüber hinaus könnten Ansätze des „Semantischen Web“ wie das „Resource Description Framework“ sowie die damit verarbeiteten „Linked Open Data“ von Interesse sein. Hier fehlen jedoch bislang ebenso entsprechende Vorarbeiten.

SVG

Insbesondere für Karten spielt eine spezielle Spezifikation von XML eine wichtige Rolle, die Scalable Vector Graphics (SVG). Eine SVG-Datei sieht zum Beispiel so aus:

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.2" baseProfile="tiny" width="800" height="728" viewBox="0 0 800 728" stroke-linecap="round" stroke-linejoin="round">
<g id="SDE2_GERMAN1895ELECTORALDISTRICTS">
<path d="M 57.3058 667.944 ... 57.3058 667.944 Z" id="6"/>
<path d="M 159.7408 655.7696 ... 159.7408 655.7696 Z" id="7"/>
.
.
.
<path d="M 788.0676 ... 788.0676 78.7721 Z" id="434"/>
<path d="M 767.4287 ... 85.1217 Z" id="435"/>
</g>
</svg>

Karten im SVG-Format können mit allen modernen Webbrowsern unmittelbar angezeigt werden. Mit JavaScript können darüber hinaus interaktive oder animierte Elemente ergänzt werden.

Ein weiteres Format für Daten und insbesondere für Kartendaten ist die JavaScript Object Notation, kurz JSON. Das Format wird auf dieser Seite für mehrere Beispiele für die Anzeige von Choroplethenkarten mit Mapael verwendet.

JSON

[
{"V1":"Peter","V2":"ja","V3":23,"V4":"stimme zu"},
{"V1":"Paul","V2":"nein","V3":43,"V4":"keine Angabe"},
{"V1":"Marie","V2":"ja","V3":21,"V4":"stimme überhaupt nicht zu"}
]

Binärdateiformate

Excel-Dateien

Für statistische Daten ist die Verwendung von XLS-Dateien sehr verbreitet, obwohl damit eine Reihe von Problemen verbunden ist. In Excel müssen Daten nicht zwingend in Zeilen und Spalten abgeordnet sein bzw. in der Spaltendimension identisch definiert sein. Wenn man sich eine Excel-Datei im XML-Format ansieht (hier mit der Mac-Version von LibreOffice 5.2.6.2 erzeugt), kann man sehr gut sehen, dass das Format der Daten auf Zellenebene festgelegt wird, nicht spaltenweise.

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook 
xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
<Colors><Color><Index>3</Index><RGB>#c0c0c0</RGB></Color><Color><Index>4</Index>
<RGB>#ff0000</RGB></Color></Colors></OfficeDocumentSettings>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
<WindowHeight>9000</WindowHeight><WindowWidth>13860</WindowWidth>
<WindowTopX>240</WindowTopX><WindowTopY>75</WindowTopY>
<ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>
<Styles>
<Style ss:ID="Default" ss:Name="Default"/>
<Style ss:ID="Result" ss:Name="Result"><Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/></Style>
<Style ss:ID="Result2" ss:Name="Result2"><Font ss:Bold="1" ss:Italic="1" ss:Underline="Single"/><NumberFormat ss:Format="Euro Currency"/></Style>
<Style ss:ID="Heading" ss:Name="Heading"><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style>
<Style ss:ID="Heading1" ss:Name="Heading1"><Font ss:Bold="1" ss:Italic="1" ss:Size="16"/></Style>
<Style ss:ID="co1"/><Style ss:ID="co2"/>
<Style ss:ID="co3"/><Style ss:ID="co4"/>
<Style ss:ID="co5"/><Style ss:ID="ta1"/>
</Styles><ss:Worksheet ss:Name="Sheet1">
<Table ss:StyleID="ta1">
<Column ss:Width="50.4"/>
<Column ss:Width="38.4945"/>
<Column ss:Width="31.3512"/>
<Column ss:Width="133.0016"/>
<Row ss:Height="12.8126">
<Cell><Data ss:Type="String">V1</Data></Cell>
<Cell><Data ss:Type="String">V2</Data></Cell>
<Cell><Data ss:Type="String">V3</Data></Cell>
<Cell><Data ss:Type="String">V4</Data></Cell>
</Row>
<Row ss:Height="12.8126">
<Cell><Data ss:Type="String">Peter</Data></Cell>
<Cell><Data ss:Type="String">ja</Data></Cell>
<Cell><Data ss:Type="Number">23</Data></Cell>
<Cell><Data ss:Type="String">stimme zu</Data></Cell>
</Row>
<Row ss:Height="12.8126">
<Cell><Data ss:Type="String">Paul</Data></Cell>
<Cell><Data ss:Type="String">nein</Data></Cell>
<Cell><Data ss:Type="Number">43</Data></Cell>
<Cell><Data ss:Type="String">keine Angabe</Data></Cell>
</Row>
<Row ss:Height="12.8126">
<Cell><Data ss:Type="String">Marie</Data></Cell>
<Cell><Data ss:Type="String">ja</Data></Cell>
<Cell><Data ss:Type="Number">21</Data></Cell>
<Cell><Data ss:Type="String">stimme überhaupt nicht zu</Data></Cell>
</Row>
</Table>
<x:WorksheetOptions/>
</ss:Worksheet>
</Workbook>

SPSS-Dateien

SPSS-Dateien bilden das klassische Format für Umfragedaten.1 Auch nahezu alle Datensätze der Historischen Statistik und Quantitativen Geschichtswissenschaft, die in den 1980er und 1990er Jahren angelegt wurden, liegen in diesem Format vor. Darüber hinaus werden zahlreiche Datensätze von den Datenarchiven als SPSS-Dateien zur Verfügung gestellt.

Ein SPSS-File enthält immer genau eine Tabelle. Einzelne Werte von Variablen können, genau so wie die Namen der Variablen, mit „Labels“ ergänzt werden (hier angezeigt mit der freien Software GNU PSPP):

SPSS-Datendatei

Darüber hinaus können einzelnen Werte als „Missing Values“ definiert werden.

Für den Import von SPSS-Dateien in R kann man entweder die Funktion spss.get() aus dem Paket Hmisc von Frank E. Harrell Jr. verwenden oder spss.system.file() aus dem Paket memisc von Martin Elff, die einen effzienten Import eines Teilbereiches einer größeren SPSS- Datei ermöglicht. Umgekehrt können Sie beim Import von SPSS-Dateien angeben, ob aus den Labels der dort vorhandenen Faktorvariablen Zeichenketten-Variablen erstellt werden sollen.

R-Dateien und -Objekttypen

In R gibt es verschiedene Datenstrukturen.2 Zum einem sind dies Vektoren , Matrizen und Arrays . R kennt numerische, ganzzahlige (Spezialfall der numerischen), logische, Zeichenketten-, Datums- und sogenannte „Faktor“-Vektoren. Ein Faktor ist eigentlich nichts anderes als eine kategoriale Variable. Sie können auch Bezeichnungen für die Faktorausprägungen vergeben. Das entspricht den Wertelabels bei SPSS. Vektoren, Matrizen und Arrays unterscheiden sich in ihrer Dimension. Umgangssprachlich könnte man sagen: Ein Vektor ist eine Zahlen- oder Zeichenfolge, eine Matrix eine Tabelle mit Zeilen und Spalten und ein Array eine „mehrdimensionale“ Tabelle. Bei drei Dimensionen also etwa mehrere Tabellen mit der gleichen Anzahl von Zeilen und Spalten hintereinander.

Die Elemente von Vektoren oder Matrizen müssen stets vom selben Typ sein, also etwa nur Zahlen. Will man unterschiedliche Typen in einem Objekt speichern, zum Beispiel Zahlen und Buchstaben, bietet R den Objekttyp „Datensatz“ (Data Frame) an. Ein Datensatz kann zum Beispiel aus einem Array erstellt werden: Das Ergebnis sieht genau so aus wie die Matrix. Variablen von Datensätzen können über ihren Namen ausgegeben werden, indem man an den Namen des Objekts ein Dollarzeichen, gefolgt von dem Namen der Variablen, anfügt.

Ein spezieller Objekttyp, der auch für Abbildungen sehr nützlich ist, ist für Zeitreihen vorgesehen.

Anders als man vermuten könnte, sind Datensätze keine Spezialfälle einer Matrix, sondern eines eher ungewöhnlichen Datentyps: der sogenannten „Listen“. Hierbei handelt es sich um eine Zusammenstellung von Elementen unterschiedlicher Art – im Falle eines Datensatzes können so numerische und alphanumerische Vektoren zusammengestellt werden. Listen erlauben ganz allgemein die Zusammenstellung von Objekten unterschiedlichen Typs. So kann zum Beispiel das erste Element einer Liste eine Zeichenkette sein, das zweite ein Vektor, das dritte ein Datensatz.

Ein SpatialPolygonsDataFrame schließlich ist eine spezielle Form von Datensätzen, die neben einem Datensatz vor allem eine Liste mit Polygonen enthalten, mit denen Karten gezeichnet werden können.

R kann beliebig viele dieser Objekttypen im Arbeitsspeicher bereitstellen sowie in einer Datei speichern. Diese Dateien, standardmäßig endend auf „.RData“, sind „externe Repräsentationen von R Objekten“, so die Formulierung in der R-Hilfe.

R-beispiel GUI (RStudio)

Shapefiles als Grundlage für Kartenvisualisierungen

Geodaten, vor allem Länder-, Regionen- oder Verwaltungsgrenzen werden sehr häufig in sogenannten Shapefiles abgespeichert. Dabei handelt es sich um ein schon sehr altes Datenformat, bei dem die Karteninformationen und zugehörige Atrribute in einer Reihe von Dateien mit gleichem Namen, aber unterschiedlichen Endungen gespeichert werden. Die Verwaltungsgrenzen von London werden zum Beispiel auf einer Seite von mysociety.org in der folgenden Form bereitgestellt:

greater_london_const_region.shp
greater_london_const_region.prj
greater_london_const_region.dbf
greater_london_const_region.shx

In der shp-Datei befinden sich die eigentlichen Geometrie-Daten. Das sind entweder Punkte oder Linien oder Flächen in Form von Polygonen. Die prj-Datei enthält lediglich einen sogenannten Projektionssatz, also eine Zeichenkette mit Angaben, in welcher Form also die eigentlich dreidimensionalen Daten in der shp-Datei zweidimensional abgebildet worden sind. Die dbf-Datei enthält einen Datensatz, in dem „Sachdaten“, also zum Beispiel Statistiken zu den einzelnen Geometrien in Form eines Datensatzes gespeichert werden. Die shx-Datei schließlich verknüpft Sach- und Geometriedaten. Darüber hinaus können weitere Dateien mit festgelegten Endungen noch weiterführende Informationen enthalten. Ein nicht unerheblicher Nachteil der Verwendung des dbf-Dateityps für die Sachdaten ist, dass darin nicht ohne weiteres Unicode-Daten abgespeichert werden können. Daher ist es oft sinnvoll, sich auf die Verwendung der Geometriedaten zu beschränken und diese mit Daten aus anderen Dateien zu verknüpfen.

Wir werden auf dieser Website Shapefiles als Ausgangsbasis zur grafischen Darstellung von Karten verwenden. Sehr hilfreich für unsere Zwecke ist ein Open Source Programm zur Anzeige von Shapefiles, Quantum GIS, das für Windows, Mac OS X und Linux verfügbar ist. Mit Quantum GIS können Sie zum Beispiel einzelne Polygone eines Shapefiles anklicken und sich die dazugehörigen Informationen ansehen oder sich Informationen über die verwendete Projektion anzeigen lassen.

QGIS-Kartenansicht

Anmerkungen:

  1. Uwe Jensen (2012), Leitlinien zum Management von Forschungsdaten – Sozialwissenschaftliche Umfragedaten, GESIS-Technical Reports 2012/07.
  2. Zum folgenden Thomas Rahlf (2014), Datendesign mit R – 100 Visualisierungsbeispiele, München: open source press, Abschnitt 3.2. Dort auch entsprechende Beispiele.