Datenanalyse & Statistik

Eine der häufigste Anwendung von Computern in der Experimentalphysik ist die Auswertung von Messdaten. Auch dafür stehen diverse Befehle zur Verfügung. Wir wollen hier die wichtigsten anschauen.

Daten einlesen

Oft wirst du Daten anschauen wollen, die du in irgend einer Art bereits auf dem Computer gespeichert hast. In diese Fällen möchtest du sie natürlich nicht neue eintippen und auch Copy-Paste ist keine besonders elegante Lösung. Die einfachste Möglichkeit solche Daten zu importieren ist der Befehl load -ascii filename. Damit kannst du Zahlen aus einer Textdatei einlesen. Die Textdatei kann verschieden Strukturen haben. Am Einfachsten ist aber wohl eine csv-Datei (Comma Separated Values). Eine solche Datei enthält die einzulesenden Zahlenwerte in einer Tabelle. Die Felder einer Zeile trennst du mit , (oder ";" oder " ") von einander. Speichere die Beispieldatei in dein Arbeitsverzeichnis.

% einlesen load -ascii zuerichsee.csv % zugreiffen zuerichsee

Grundbefehle

mean(v)Bestimmt den Mittelwert der Elemente im Vektor v.
std(v)Bestimmt die Standardabweichung der Element in v.
min(v)Bestimmt das kleinste Element in v.
max(v)Bestimmt das grösste Element in v.

Aufgabe 1

zuerichsee.csv enthält den Wasserstand des Zürichsees für jeden Tag des Jahres 2008. (Quelle: Hydrologisches Jahrbuch der Schweiz 2008) Beantworte mit Hilfe der Statistik-Befehle folgenden Fragen für jeden Monat:

Lösung Anzeigen

load -ascii zuerichsee.csv for monat = 1:12 monatswerte = zuerichsee(2:32, monat+1); monatswerte(find(monatswerte==0))=[]; printf('\nMonat: %d\n', monat) printf('mean: %f\n', mean(monatswerte)) printf('std: %f\n', std(monatswerte)) printf('diff: %f\n', max(monatswerte)-min(monatswerte)) end

Aufgabe 2

Beantworte die Fragen aus Aufgabe 1 auch für das gesamte Jahr. Du könntest dazu deine Resultate zwischenspeichern. Wir werden aber noch ein paar Mal die Werte des ganze Jahres betrachten wollen. Definiere also einen Vektor, der alle Wasserstände in einer Spalte/Zeile enthält (ohne Tage, Monate und Nuller).

Du hast zwei Möglichkeiten das zu erreichen. Ist A = [0 1 2; 3 0 4; 5 6 0] eine Matrix, so ersetzt A(find(A==0))=[] diese durch einen Vektor aller Elemente ungleich 0.
Alternativ kannst du mit Hilfe von sed und grep relativ einfach eine neue Input-Datei mit erstellen.

Lösung Anzeigen

% matlab/octave jahr = zuerichsee jahr(find(jahr<=400))=[] % shell cat zuerichsee.csv | sed s/,/\\n/g | grep 40 > jahr.csv

Histogramme

Histogramme sind ein wichtiges Mittel in der Datenanalyse. Du kannst dir ein Histogram wie eine Reihe aus Rohren (Bins) vorstellen. Jedes Rohr entspricht einem Wertebereich. Für jede Zahl in einem Wertebereich wird nun eine Kugel in das entsprechende Rohr geworfen. Die resultierenden Füllstände, sind dann das Histogram. Histogramme erzeugst du mit dem Befehl hist.

[Y, X] = hist(v, nBins)
Füllt die Elemente von v in ein Histogramm dessen Anzahl Bins gleich nBins ist
(nBins muss eine natürliche Zahl sein.)
[Y, X] = hist(v, binCenters)
Füllt die Elemente von v in ein Histogramm mit bins um die Werte binCenters.
(binCenters ist ein Vektor.)

Die Rückgabewerte geben dir die Füllhöhe (Y) sowie die x-Position der Bins. Im zweiten Fall ist X = binCenter.

Am besten Zeichnest du die Wert anschliessend mit bar(X,Y). Wenn du hist ausführst ohne die Rückgabewerte zu übernehmen, dann wird das Histogram automatisch gezeichnet. Dies hat aber den Nachteil, dass du die entsprechende Grafik dann nicht bearbeiten kannst.

Aufgabe 3

Schreibe ein Programm, das von dir einen Wert nach dem anderen einliest. Fülle mit den eingelesenen Werten jedes Mal ein Histogramm füllt, so dass du zusehen kannst, wie dieses wächst.

Falls du im Moment noch zu verwirrt bist, was ein Histogramm genau ist und was diese Befehle machen, so kannst du dir auch die Lösung kopieren. Probiere das Programm dann aus und versuche zu verstehen, was die einzelnen Zeilen bewirken.

Hinweise:
  • Gib die Bins fest vor, so dass sie nicht von deiner Eingabe abhängen.
  • Speichere deine Werte in einem Vektor und füge den neuen Wert jeweils am Ende an.
  • Wenn du das neue und das alte Histogram in verschiedenen Farben übereinander zeichnest, kannst du den neusten Eintrag hervorheben.
  • Die Farbe eines Histogramms kannst du mit folgenden Befehlen ändern:
    ax = bar(X, Y);
    set(ax, 'facecolor', 'r')
    .
    Der Rückgabewert ax von bar identifiziert die erzeugte Grafik. Dies erlaubt dir später wieder darauf zuzugreifen um zum Beispiel die Farbe zu ändern.

Probiere dein Programm aus. Was passiert bei Zahlen mit Kommastellen? Was bei solchen ausserhalb des Bin-Bereichs?

Lösung Anzeigen

% histExample.m values = []; bins = 1:1:10; Y = zeros(1,11); while 1 new = input("neu : "); if new <= 0 break endif values(length(values)+1) = new; oldY = Y; Y = hist(values, bins); ax = bar(bins, Y); set(ax, 'facecolor', 'r') hold on bar(oldY) hold off endwhile

Aufgabe 4

Erstelle nun ein Histogram des gesamten 2008. Wähle Bereich und Anzahl Bins so, dass du eine informative Verteilung erhältst

Lösung Anzeigen

[Y bins] = hist(jahr, 405.5:0.2:406.2) bar(bins, Y)

Grafiken mit Fehlerbalken

Wie du im Praktikum gelernt hast, sind die Messungen immer mit einem Fehler behaftet. Diese Fehler sollten auch aus deinen Plots ersichtlich sein. Um Plots mit Fehlerbalken zu zeichnen verwendest du den Befehel errorbar.

errorbar([10 9 8 7 6], [0.5 0.5 0.5 1 0.5])

Aufgabe 5

Stelle den mittleren monatlichen Pegelstand des Zürichsees in einer Grafik dar. Zeichne die Standardabweichung dieses Werts als Fehler ein. Wähle dafür eine möglichst informative Darstellung.

Lösung Anzeigen

load -ascii zuerichsee.csv for monat = 1:12 monatswerte = zuerichsee(2:32, monat+1); monatswerte(find(monatswerte==0))=[]; result(monat, 1) = mean(monatswerte); result(monat, 2) = std(monatswerte); result(monat, 3) = max(monatswerte)-min(monatswerte); end monate = 1:12; mittel = mean(result(:, 1)); errorbar(monate, result(:,1)-mittel, result(:, 2))