Aus Raspberry Pi Geek 10/2020

Tabellenbearbeitung mit DataFrames (Seite 4)

Listing 13

> sepalwidth_less2_5(row) = row.SepalWidth < 2.5
> filter(sepalwidth_less2_5, data)
11x3 DataFrame
| Row | SepalLength | SepalWidth | Species    |
|     | Float64     | Float64    | Cat...     |
+-----+-------------+------------+------------+
| 1   | 4.9         | 2.4        | versicolor |
| 2   | 5.5         | 2.4        | versicolor |
| 3   | 5.5         | 2.4        | versicolor |
| 4   | 4.5         | 2.3        | setosa     |
| 5   | 5.5         | 2.3        | versicolor |
| 6   | 6.3         | 2.3        | versicolor |
| 7   | 5.0         | 2.3        | versicolor |
| 8   | 6.0         | 2.2        | versicolor |
| 9   | 6.2         | 2.2        | versicolor |
| 10  | 6.0         | 2.2        | virginica  |
| 11  | 5.0         | 2.0        | versicolor |
> filter(row -> row.SepalWidth < 2.5, data)
...

Bei derart einfachen Bedingungen böte es sich allerdings an, auf die Definition der Funktion zu verzichten, um stattdessen die Bedingung direkt in Form einer anonymen Funktion nach dem Muster x -> x ... zu übergeben. Der zweite Aufruf von filter() liefert ein identisches Ergebnis.

Visualisierung

Im zweiten Teil des Julia-Workshops haben wir das Package PyPlot zur Bereitstellung grafischer Ausgaben vorgestellt. In Listing 14 kommt es zum Einsatz, um die Iris-Daten zu visualisieren.

Listing 14

> using PyPlot
> setosa = filter(x -> x.Species == "setosa", data);
> virginica = filter(x -> x.Species == "virginica", data);
> versicolor = filter(x -> x.Species == "versicolor", data);
> scatter(setosa.SepalLength, setosa.SepalWidth)
> scatter(virginica.SepalLength, virginica.SepalWidth)
> scatter(versicolor.SepalLength, versicolor.SepalWidth)
> xlabel("Kelchblatt Länge")
> ylabel("Kelchblatt Breite")

Zunächst gruppieren wir per filter() die Schwertlilien nach Arten. Das würde auch mit einem Aufruf von groupby(data, :Species) funktionieren, der einen GroupedDataFrame zurückliefert, über den man iterieren kann. Aus Gründen der Code-Lesbarkeit haben wir hier die etwas ausführlichere Variante mit filter() gewählt.

Jede Zeile der drei Tabellen, sprich jede Schwertlilie, lässt sich mit den zwei gegebenen skalaren Eigenschaften (Länge und Breite des Kelchblatts) als ein Punkt auf einer Fläche interpretieren. Die visuelle Umsetzung erledigt die PyPlot-Funktion scatter(). Deren erster Aufruf öffnet ein PyPlot-Fenster und zeichnet die Punkte in blauer Farbe. Der zweite und der dritte Aufruf von scatter() zeichnen in Orange beziehungsweise Grün in das bereits geöffnete Fenster (Abbildung 1).

Abbildung 1: Der Iris-Datensatz als zweidimensionale Darstellung. Die Kelchblatt-Abmessungen allein gen&uuml;gen nicht, um eindeutig zwischen den drei Schwertlilienarten zu unterscheiden.

Abbildung 1: Der Iris-Datensatz als zweidimensionale Darstellung. Die Kelchblatt-Abmessungen allein genügen nicht, um eindeutig zwischen den drei Schwertlilienarten zu unterscheiden.

Auf diese Weise haben Sie die Möglichkeit, die drei Arten miteinander zu vergleichen. Dabei wird schnell klar, dass die Kelchblatt-Abmessungen allein nicht genügen, um eindeutig zwischen Virginischen und verschiedenfarbigen Schwertlilien zu unterscheiden.

Das Anscombe-Quartett

Zu guter Letzt sehen wir uns einen weiteren klassischen Datensatz an, das sogenannte Anscombe-Quartett (Listing 15). Es handelt sich dabei um vier Mengen von jeweils elf Datenpunkten, deren grundlegende statistische Eigenschaften wie Mittelwert, Varianz und Korrelation nahezu identisch ausfallen, die aber in der grafischen Darstellung sehr unterschiedlich aussehen [4].

Listing 15

> data = dataset("datasets", "anscombe")
11x8 DataFrame
| Row | X1    | X2    | X3    | X4    | Y1      | Y2      | Y3      | Y4      |
|     | Int64 | Int64 | Int64 | Int64 | Float64 | Float64 | Float64 | Float64 |
+-----+-------+-------+-------+-------+---------+---------+---------+---------+
| 1   | 10    | 10    | 10    | 8     | 8.04    | 9.14    | 7.46    | 6.58    |
| 2   | 8     | 8     | 8     | 8     | 6.95    | 8.14    | 6.77    | 5.76    |
| 3   | 13    | 13    | 13    | 8     | 7.58    | 8.74    | 12.74   | 7.71    |
| 4   | 9     | 9     | 9     | 8     | 8.81    | 8.77    | 7.11    | 8.84    |
| 5   | 11    | 11    | 11    | 8     | 8.33    | 9.26    | 7.81    | 8.47    |
| 6   | 14    | 14    | 14    | 8     | 9.96    | 8.1     | 8.84    | 7.04    |
| 7   | 6     | 6     | 6     | 8     | 7.24    | 6.13    | 6.08    | 5.25    |
| 8   | 4     | 4     | 4     | 19    | 4.26    | 3.1     | 5.39    | 12.5    |
| 9   | 12    | 12    | 12    | 8     | 10.84   | 9.13    | 8.15    | 5.56    |
| 10  | 7     | 7     | 7     | 8     | 4.82    | 7.26    | 6.42    | 7.91    |
| 11  | 5     | 5     | 5     | 8     | 5.68    | 4.74    | 5.73    | 6.89    |

Das mag etwas abstrakt klingen. Kurz gesagt gelang es Anscombe zu zeigen, dass Sätze wie “Das durchschnittliche Einkommen in X beträgt Y” eine eher geringe Aussagekraft besitzen. Für alle vier Punktmengen gilt: Der Mittelwert von x ist immer 9, von y um 7,5; die Varianz für x beträgt immer 11, für y um 4,12; die Korrelation zwischen x und y beträgt immer um 0,816.

Das Package Statistics bietet Funktionen zum Berechnen des Mittelwerts (mean), der Korrelation (cor) und der Varianz (var). Damit sind Sie in der Lage, die Eigenschaften der vier Punktmengen zu prüfen. Listing 16 und Listing 17 zeigen das Ermitteln der statistischen Eigenschaften und das Erzeugen einer grafischen Ausgabe anhand der ersten Punktmenge.

Abbildung 2: Die vier Anscombe-Punktmengen sehen sehr unterschiedlich aus, die grundlegenden statistischen Eigenschaften sind aber identisch. Sie zeigen, dass statistische Daten unter bestimmten Bedingungen ihre Aussagekraft weitgehend einb&uuml;&szlig;en.

Abbildung 2: Die vier Anscombe-Punktmengen sehen sehr unterschiedlich aus, die grundlegenden statistischen Eigenschaften sind aber identisch. Sie zeigen, dass statistische Daten unter bestimmten Bedingungen ihre Aussagekraft weitgehend einbüßen.

Listing 16

> using Statistics
> mean(data.X1)
9.0
> mean(data.Y1)
7.500909090909093
> var(data.X1)
11.0
> var(data.Y1)
4.127269090909091
> cor(data.X1, data.Y1)
0.8164205163448398
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 7 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben