# Lösungen Pandas & Seaborn¶

## Aufgabe - Erstellen eines Dataframes¶

5 Punkte

Erstellen Sie einen Pandas Data Frame mit dem namen `uni_addr`, nachdem Schema folgender Tabelle:

Address | plz
--- | ---
Johannes-Selenka-Platz 1 | 38118 Braunschweig
Universitätspl. 2 | 38106 Braunschweig
Harburger Str. 6 | 21614 Buxtehude
Adolph-Roemer-Straße 2A | 38678 Clausthal-Zellerfeld
Constantiapl. 4 | 26723 Emden
Weender Landstraße 3-7 | 37073 Göttingen
Wilhelmsplatz 1 | 37073 Göttingen

In [2]:

    uni_addr = pd.DataFrame({
        "Address": [
            "Johannes-Selenka-Platz 1", "Universitätspl. 2",
            "Harburger Str. 6", "Adolph-Roemer-Straße 2A",
            "Constantiapl. 4", "Weender Landstraße 3-7",
            "Wilhelmsplatz 1"
        ],
        "plz": [
            "38118 Braunschweig", "38106 Braunschweig",
            "21614 Buxtehude", "38678 Clausthal-Zellerfeld",
            "26723 Emden", "37073 Göttingen", "37073 Göttingen",
        ]
    })

In [3]:

    uni_addr

Out[3]:

| Address | plz
--- | --- | ---
0 | Johannes-Selenka-Platz 1 | 38118 Braunschweig
1 | Universitätspl. 2 | 38106 Braunschweig
2 | Harburger Str. 6 | 21614 Buxtehude
3 | Adolph-Roemer-Straße 2A | 38678 Clausthal-Zellerfeld
4 | Constantiapl. 4 | 26723 Emden
5 | Weender Landstraße 3-7 | 37073 Göttingen
6 | Wilhelmsplatz 1 | 37073 Göttingen

## Aufgabe - Extrahieren einer Series¶

1 Punkte

Exthahieren Sie die Series `plz` aus dem zuvor erstelltem Data Frame `uni_addr` und speichern Sie ihr Ergebnis in `uni_plz`.

In [4]:

    uni_plz = uni_addr["plz"]
    uni_plz

Out[4]:

    0            38118 Braunschweig
    1            38106 Braunschweig
    2               21614 Buxtehude
    3    38678 Clausthal-Zellerfeld
    4                   26723 Emden
    5               37073 Göttingen
    6               37073 Göttingen
    Name: plz, dtype: object

## Aufgabe - Read CSV¶

1 Punkt

Nutzen sie die Funktion `pd.read_csv` um das Datenset `unis_nd.csv` in die Variable `unis_nd` einzulesen.

Falls Sie hilfe benötigen lesen Sie gerne die Dokumentation im Getting Started Guide.

Hinweis: Die Datei liegt in keinem Ordner, sondern im selben wie dieses Notebook!

In [7]:

    unis_nd = pd.read_csv("unis_nd.csv")
    unis_nd.head(1)

Out[7]:

| University name | Type of university | Sponsorship | Right of promotion | Founding year | Number of students | Address | lat | lon | plz | pic
--- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | ---
0 | Hochschule für Bildende Künste Braunschweig | Artistic university | public | yes | 1963 | 976.0 | Johannes-Selenka-Platz 1 | 52.257738 | 10.502315 | 38118 Braunschweig | https://www.hbk-bs.de/fileadmin/_processed_/5/...

## Aufgabe¶

2 Punkte

Selektieren Sie die Spalten University name, Founding year & Number of students, speichern sie ihr Ergebnis in der Variablen `select`.

Geben Sie danach die ersten 5 Werte von Oben der Selektion aus.

In [8]:

    select = unis_nd[
        ["University name", "Founding year", "Number of students"]
    ]
    select.head(5)

Out[8]:

| University name | Founding year | Number of students
--- | --- | --- | ---
0 | Hochschule für Bildende Künste Braunschweig | 1963 | 976.0
1 | Technische Universität Carolo-Wilhelmina zu Br... | 1745 | 17709.0
2 | Hochschule 21 | 2005 | 1084.0
3 | Technische Universität Clausthal | 1775 | 3446.0
4 | Hochschule Emden/Leer | 2009 | 4481.0

## Aufgabe¶

2 Punkte

Nutzen Sie die Funktion `value_counts` und erstellen Sie ein Balkendiagramm, mittels matplotlib, über die Anzahl an Staatlichen und Privaten Hochschulen Niedersachsen.

Die dazugehörige Spalte im Datenset ist Sponsorship. Finden Sie eine geeignete Darstellung.

In [12]:

    c = unis_nd["Sponsorship"].value_counts()
    plt.style.use('https://github.com/dhaitz/matplotlib-stylesheets/raw/master/pitayasmoothie-dark.mplstyle')
    plt.bar(c.keys(), c, color=["black", "white"])
    plt.title("Universitäten nach Finanzierungstatus")
    plt.ylabel("Anzahl")
    plt.show()

## Aufgabe¶

8 Punkte

Erstelle das Dataset `people_in_germany`.

Folgendes Szenario:

Du bist Part einer Massenhaft angelegten Studie um die bereits bekannten Zahlen des Statistischen Bundesamtes zu überprüfen.

Dazu sind 4 Größen bekannt aus den Angaben des Statistischen Bundesamt für die männliche Population & die weibliche Population:

| Körpergröße (in cm) | Gewicht (in Kg)
--- | --- | ---
Männlich | 178.9 | 85.8
Weiblich | 165.8 | 69.2

Gehe dabei wie folgt vor:

- Treffe annahmen über die Verteilung und finde geeignete Werte für $\mu$ & $\sigma$. Erkläre deine Annahmen mit einem kurzen Text.
- Die Samplegröße beträgt 1000. Sample dementsprechend aus den gegebenen Werten.
- Speichere die gesampleten Personen nach dem Schema: |gender|height|weight| in der File `people_in_germany.csv` als csv. -> Nutze für das `gender` Attribut den Datentyp `bool` mit der Kodierung: `True = female` & `False = male`.
- Stelle dein Ergebnis angemessen dar. Das theme `darkgrid` darf nicht verwendet werden.
- Beschreibe & Interpretiere den Plot. Gehe dabei von der Hypothese aus das es keine Unterschiede zwischen den Geschlechtern beim samplen geben sollte.

Tipp: Dataclasses erleichtern die Aufgabe ungemein!

In [22]:

    # define dataclass
    import numpy as np
    from dataclasses import dataclass
    @dataclass
    class Individual:
        gender: bool
        height: np.float64
        weight: np.float64

In [23]:

    # fixed values
    samples = 1000
    rng = np.random.default_rng()
    individuals = list()

In [24]:

    # Simulation part
    for i in range(samples):
        if i % 2 == 0:
            gender = False
            height = rng.normal(178.9, 10)
            weight = rng.normal(85.8, 26)

        else:
            gender = True
            height = rng.normal(165.8, 11)
            weight = rng.normal(69.2, 19)

        height = np.round(height, decimals=1)
        weight = np.round(weight, decimals=1)

        individual = Individual(gender=gender,height=height,weight=weight)
        individuals.append(individual)

    individuals = pd.DataFrame(individuals)
    individuals.to_csv('people_in_germany.csv', index=False)

In [25]:

    sns.set_style('white')
    sns.jointplot(data=individuals, x="height", y="weight", hue="gender")
    plt.show()