Lektion 6 – Statistik in MATLAB

In Lektion 6 des MATLAB-Kurses von matlab-tutorials.de zeige ich Ihnen wie Sie statistische Größen wie Mittelwert, Standardabweichung und Korrelationskoeffizienten berechnen und wie Sie Daten in Histogrammen darstellen.

Erzeugen von Zufallszahlen

Zum Testen von MATLAB-Programmen verwende ich häufig Zufallszahlen. Gerade bei statistischen Berechnungen sind Zufallszahlen mit einer vorgegebenen Wahrscheinlichkeitsverteilung sehr nützlich. MATLAB bietet die Möglichkeit gleichverteilte Zufallsvariablen sowie normalverteilte Zufallsvariablen zu erzeugen.

Gleichverteilte Zufallszahlen

Zur Erzeugung von gleichverteilten Zufallszahlen verwenden Sie folgenden Befehl:

>> rand(n,m)

Dies erzeugt eine Matrix mit n Zeilen und m Spalten. Die Elemente der Matrix nehmen jeden Wert zwischen 0 und 1 mit gleicher Wahrscheinlichkeit an. Falls Sie 100 Zahlen zwischen 20 und 35 erzeugen wollen, so erreichen Sie dies indem Sie den erzeugten Vektor mit der Differenz von Minimum und Maximum (35-20=15) multiplizieren und dann das Minimum (20) addieren:

x = 1:100;
y = rand(1,100)*15+20;
figure
scatter(x,y)
xlabel('x')
ylabel('y')
ylim([0,40])
hold on
plot([1,100],[20,20],'b--')
plot([1,100],[35,35],'b--')

Dies erzeugt folgenden Plot:

Plot gleichverteilte Zufallszahlen

Normalverteilte Zufallszahlen

Zur Erzeugung von normalverteilten Zufallszahlen verwenden Sie folgenden Befehl:

>> randn(n,m)

Dies erzeugt eine Matrix mit n Zeilen und m Spalten. Die Elemente der Matrix nehmen jeden beliebigen Wert an. Die Wahrscheinlichkeit mit der ein bestimmter Wert auftritt entspricht dabei einer Normalverteilung (Wikipedia-Artikel Normalverteilung) mit dem Erwartungswert 0 und der Standardabweichung 1. Diese Funktion wird auch Standardnormalverteilung genannt.

Normalverteilung mit Erwartungswert mu und Standardabweichung sigma

Um aus einer standardnormalverteilten Zufallsvariable x eine normalverteilte Zufallsvariable y mit dem Erwartungswert mu und der Standardabweichung sigma zu berechnen, muss sie folgender Transformation unterzogen werden:

y = x*sigma + mu

Um eine Matrix mit n Zeilen und m Spalten normalverteilter Zufallszahlen mit dem Erwartungswert mu und der Standardabweichung sigma zu erzeugen können Sie also folgenden Befehl verwenden:

>> y = randn(n,m)*sigma + mu

 

Berechnung von Mittelwert und Standardabweichung

 

Erzeugen von Histogrammen

Beispiel: Gehaltsverteilung von Ingenieuren und Naturwissenschaftlern

Importieren eines Datensatzes

Für das folgende Beispiel benutze ich einen Datensatz aus der Gehalts- und Lohnstrukturerhebung 2001. Die Daten werden von den Forschungsdatenzentren der statistischen Ämter des Bundes und der Länder als sogenannte Campus-Files zur Verfügung gestellt. Hier können Sie den Datensatz herunterladen. Der Datensatz besteht aus erklärenden Dokumenten und den erhobenen Daten in einer csv-Datei.

Der Datensatz enthält Stichproben von Befragungen von Einzelpersonen mit Angaben zu unter Anderen Geburtsdatum, Beruf, Bildungsabschluss.

Import der Spaltenüberschriften

In der ersten Zeile der csv-Datei stehen die Namen der Tabellenspaltenüberschriften. Um diese zu importieren klicken Sie in MATLAB mit der rechten Maustaste auf die Datei „glscampus.csv“ und wählen Sie anschließend „Import Data…“. Daraufhin erscheint der gesamte Datensatz in einer Tabelle. Wir wollen zunächst nur die Überschriften in ein cell array importieren. Markieren Sie dazu die erste Zeile der Tabelle. Jetzt müssen Sie den Typ der einzelnen Spalten anpassen. Damit Sie das nicht für alle Spalten einzeln machen müssen, gehen Sie einfach in eine beliebige Spalte und schieben den Mauszeiger über den Eintrag „TEXT“. Daraufhin erscheint ein Button mit der Aufschrift „Apply to Selection“. Drücken Sie mit der linken Maustaste auf diesen Button:

Datenimport Einkommensstatistik alle Spalten auf Text

Schalten Sie nun noch das Feld „Imported Data“ auf den Typ „Cell Array“:

Datenimport-Typ-Cell-Array

Klicken Sie anschließen rechts oben auf den Button „Import Selection“ und anschließend auf „Generate Function“. Die daraufhin erscheinende Funktion nennen Sie in importHeader um und speichern sie. Wir benötigen die Funktion später um die Tabellenspalten richtig zuzuweisen.

Import der Daten

Im zweiten Schritt wollen wir die eigentlichen Daten (ohne Überschriften) importieren. Öffnen Sie dazu erneut den Import-Assistenten (Klick mit rechter Maustaste auf Datei „glscampus.csv“ und dann „Import Data…“). Stellen Sie sicher, dass alle Zeilen bis auf die erste markiert sind und setzen Sie das Feld „Imported Data“ auf den Typ „Numeric Matrix“:

Datenimport Typ Numeric Matrix

Erzeugen Sie wieder eine Funktion und nennen diese importData.

Auswertung des Datensatzes

In der folgenden Auswertung zeige ich Ihnen, wie Sie aus den Daten die Datensätze von Ingenieuren und Naturwissenschaftlern mit Hochschulabschluss zwischen 33 und 37 Jahren herausfiltern und daraus ein Histogramm und eine kumulative Wahrscheinlichkeitsverteilung erzeugen.

clear
close all
 
% Import von Überschriften und Daten
header = importHeader('glscampus.csv', 1, 1);
data = importData('glscampus.csv');
 
% Tabellenspalte Beruf
idBeruf = strcmp('BERUF',header);
% Tabellenspalte Ausbildung (EF17U3)
idAusbildung = strcmp('EF17U3',header);
% Filter für Ingenieur (Beruf=7) und Hochschulabschluss (Ausbildung=6)
idIng = (data(:,idBeruf)==7) & (data(:,idAusbildung)==6);
% Anzahl der Datensätze
sum(idIng)

% Tabellenspalte Geburtsjahr
idGeburtsjahr = strcmp('EF13U2',header);
alterIng = 2001-data(idIng,idGeburtsjahr);
 
% Tabellenspalte Gehalt
idGehalt = strcmp('EF25',header);
% Gehälter der Ingenieure mit Hochschulabschluss
gehaltIng = data(idIng,idGehalt);
 
% Tabellenspalte Arbeitsstunden pro Woche
idStunden = strcmp('EF20',header);
stundenIng = data(idIng,idStunden);
 
% Gehalt bei 40 h pro Woche
gehalt40h = gehaltIng./stundenIng*40;
 
% Aussortieren fehlerhafter Datensätze
idOK = gehalt40h<10000;
gehalt40h = gehalt40h(idOK);
alterIng = alterIng(idOK);
 
% Darstellen als Streudiagramm
figure
scatter(alterIng,gehalt40h)
 
% Darstellen als Histogramm
figure
hist(gehalt40h(ismember(alterIng,33:37)),15)
xlabel('Monatsgehalt bei 40 h pro Woche in Euro')
ylabel('Anzahl')
title('Monatsgehälter von Ingenieuren und Naturwissenschaftlern 2001')
 
% Berechnen und darstellen der kumulativen Wahrscheinlichkeitsverteilung
g = linspace(0,10000);
cdfGehalt(size(g))=0;
for idG = 1:length(g)
    cdfGehalt(idG) = ...
        sum(gehalt40h(ismember(alterIng,33:37))<g(idG))./...
        sum(ismember(alterIng,33:37));
end
 
figure
plot(g,cdfGehalt,'linewidth',2);
set(gca,'xgrid','on','ygrid','on')
xlabel('Brutto-Monatsgehalt')
ylabel('Anteil, der weniger verdient')
title('Monatsgehälter von Ingenieuren und Naturwissenschaftlern 2001')

In Zeile 5 und 6 nutze ich die im vorherigen Abschnitt beschriebenen Import-Funktionen zum Einlesen der Daten.

Die Matrix mit den Daten enthält pro Zeile eine befragte Person und pro Spalte ein Attribut. Die Namen der Spalten stehen in der Variable header (Typ Cell Array). In den Zeilen 9, 11, 18, 22 und 27 konstruiere ich jeweils eine Variable vom Typ logical, die an der Stelle eine 1 enthält, an der der jeweils gesuchte Spaltenname steht. Die Bedeutung der Spaltennamen habe ich der Beschreibung des Datensatzes entnommen.

Beim Ansehen der Daten habe ich bemerkt, dass ein Datensatz einen extrem hohen Wert für das Gehalt enthält. Diesen sortiere ich in den Zeilen 34-36 aus. Dabei ist es wichtig, dass Sie das Aussortieren für alle später noch benötigten Vektoren vornehmen.

Die kumulative Wahrscheinlichkeitsverteilung gibt an, welcher Anteil der Stichprobe weniger verdient als einen Betrag g. Die Berechnung führe ich in einer for-Schleife für 100 verschiedene Werte von g durch. Mehr über for-Schleifen und andere Kontrollstrukturen erfahren Sie in Lektion 7. Die 100 verschiedenen Werte zwischen 0 und 10000 erzeuge ich in Zeile 50 durch den MATLAB-Befehl linspace.

linspace(xMin,xMax,n)

erzeugt einen Vektor, mit n Zahlen, die gleichmäßig zwischen xMin und xMax verteilt sind. Wenn Sie den Parameter n weglassen, wird standardmäßig 100 gewählt.

 

Das Skript erzeugt die folgenden Diagramme:

Histogramm Monatsgehälter Ingenieure und Naturwissenschaftler 2001

Wahrscheinlichkeitsverteilung Monatsgehälter Ingenieure Naturwissenschaftler 2001

Zeigen Sie diese Diagramme bei der nächsten Gehaltsverhandlung Ihrem Vorgesetzten. Wenn er aus dem Staunen über Ihre MATLAB- und Statistik-Kenntnisse nicht mehr herauskommt wird er Ihnen mindestens 7000 Euro pro Monat bezahlen.

Download der Beispiele

Zusammenfassung

Quiz

Fortsetzung