11.2 Diskrete Daten und Häufigkeiten#

Lernziele#

Lernziele

  • Sie können diskrete Daten als Balkendiagramm visualisieren.

  • Sie können kontinuierliche Daten als Histogramm darstellen.

  • Sie verstehen den Unterschied zwischen Balkendiagrammen und Histogrammen.

  • Sie können die Anzahl der Bins bei Histogrammen anpassen.

  • Sie können Balken- und Histogramme mit Farben gestalten.

Balkendiagramme#

Ein Balkendiagramm wird mit der Funktion bar() erstellt. Balkendiagramme eignen sich zur Darstellung von diskreten, kategorialen Daten. Angenommen, wir möchten auswerten, wie viele Nutzer/innen in campUAS auf die Jupyter Notebooks zum Download zugegriffen haben:

Woche

Anzahl Nutzer/innen

2

14

3

12

4

10

5

10

6

9

Dann wird das Balkendiagramm mit folgendem Code erzeugt:

import matplotlib.pyplot as plt

# Daten
x = [2, 3, 4, 5, 6]
y = [14, 12, 10, 10, 9]

# Balkendiagramm
plt.figure()
plt.bar(x, y)
plt.xlabel('Woche')
plt.ylabel('Anzahl Nutzer/innen')
plt.title('Zugriff auf Jupyter Notebooks zum Download WiSe 2021/22')
plt.show()
../_images/2c4028de806b8e3470fb2e4340262d953103989e4b017a669dde9697c401b5b8.png

Farben können mit dem optionalen Argument color= eingestellt werden. Dabei funktionieren häufig einfach die englischen Bezeichnungen für grundlegende Farben wie beispielsweise red, green, blue. Eine Alternative dazu ist, den RGB-Wert zu spezifizieren, also den Rot-Anteil, den Grün-Anteil und den Blau-Anteil. Details finden Sie in der Matplotlib-Dokumentation:

Im folgenden Balkendiagramm sind die Balken grau dargestellt.

# Daten
x = [2, 3, 4, 5, 6]
y = [14, 12, 10, 10, 9]

# Balkendiagramm mit Farbe
plt.figure()
plt.bar(x, y, color='gray')
plt.xlabel('Woche')
plt.ylabel('Anzahl Nutzer/innen')
plt.title('Zugriff auf Jupyter Notebooks zum Download WiSe 2021/22')
plt.show()
../_images/90ca883384438d598021a4adc9a7dd7a020d5ea7cbc04e0efca9eca1d653598d.png

Balkendiagramme eignen sich besonders gut für den Vergleich von Kategorien. Hier ein weiteres Beispiel mit verschiedenen Programmiersprachen und ihrer Beliebtheit. Bei diesem Beispiel färben wir auch noch die Balken ein. Dazu übergeben wir dem Argument color eine Liste mit Strings, die die Farben Hex-Code spezifiziert. Mehr Details zu Hex-Codes für Farben finden Sie hier: https://www.color-hex.com.

# Daten (fiktive Umfrage)
sprachen = ['Python', 'Java', 'C++', 'JavaScript', 'C#']
beliebtheit = [85, 78, 65, 82, 58]

# Balkendiagramm
plt.figure()
plt.bar(sprachen, beliebtheit, color=['#3776ab', '#f89820', '#00599c', '#f7df1e', '#239120'])
plt.xlabel('Programmiersprache')
plt.ylabel('Beliebtheit (%)')
plt.title('Beliebtheit von Programmiersprachen unter Studierenden')
plt.show()
../_images/520f3c019e30ba71a15878e40730b8647d65a9744f16392852bde8ee47a5eb56.png

Mini-Übung

Hier ist eine Tabelle mit den Zugriffszahlen auf die Jupyter Notebooks in der Vorlesung Angewandte Informatik. Bitte stellen Sie die Daten als Balkendiagramm inklusive Beschriftungen dar. Färben Sie die Balken schwarz.

Woche

Anzahl Nutzer/innen

3

9

4

17

5

15

6

10

7

11

# Hier Ihr Code:

Lösung

import matplotlib.pyplot as plt

x = [3, 4, 5, 6, 7]
y = [9, 17, 15, 10, 11]

plt.figure()
plt.bar(x, y, color='black')
plt.xlabel('Woche')
plt.ylabel('Anzahl Nutzer/innen')
plt.title('Zugriffszahlen Jupyter Notebooks - Angewandte Informatik')
plt.show()

Histogramme#

Während Balkendiagramme für diskrete, kategoriale Daten verwendet werden, dienen Histogramme zur Darstellung der Verteilung kontinuierlicher Daten. Ein Histogramm zeigt, wie häufig bestimmte Wertebereiche in einem Datensatz vorkommen.

Der wichtigste Unterschied: Bei Balkendiagrammen sind die Kategorien fest vorgegeben (z.B. Wochentage, Programmiersprachen), bei Histogrammen werden die kontinuierlichen Daten in Intervalle (sogenannte “Bins”) unterteilt.

Erstellen wir zunächst einen Datensatz mit kontinuierlichen Daten:

import numpy as np
import matplotlib.pyplot as plt

# Simuliere Körpergrößen von 1000 Personen (normalverteilt)
np.random.seed(42)  # Für reproduzierbare Ergebnisse
koerpergroessen = np.random.normal(175, 8, 1000)  # Mittelwert 175cm, Standardabweichung 8cm

# Histogramm erstellen
plt.figure()
plt.hist(koerpergroessen, bins=30)
plt.xlabel('Körpergröße [cm]')
plt.ylabel('Häufigkeit')
plt.title('Verteilung der Körpergrößen')
plt.show()
../_images/3918939e534cb2b0fb553539f9dd4dfc087d59a2339cab07e6fbd58979fcd63c.png

Die Funktion hist() nimmt die Rohdaten und erstellt automatisch ein Histogramm. Der Parameter bins bestimmt, in wie viele Intervalle die Daten aufgeteilt werden. Mehr Bins führen zu einer feineren Aufteilung, weniger Bins zu einer gröberen.

Schauen wir uns den Effekt verschiedener Bin-Anzahlen an. Zusätzlich nutzen wir noch die Optionen alpha (Transparenzgrad), color (Farbe) und edgecolor (Farbe des Rahmens um die Balken), um die Bins besser zu visualisieren.

# Verschiedene Bin-Anzahlen vergleichen
anzahl_bins = [10, 20, 50, 100]
titel = ['10 Bins', '20 Bins', '50 Bins', '100 Bins']

for i in range(4):
  plt.figure()
  plt.hist(koerpergroessen, bins=anzahl_bins[i], alpha=0.7, color='skyblue', edgecolor='black')
  plt.xlabel('Körpergröße [cm]')
  plt.ylabel('Häufigkeit')
  plt.title(titel[i])
../_images/0cbd7ccb51e9fc7b24ff5ad40b93904786fbbbf6614623b48af2d1d432f123fe.png ../_images/56bfdadcf30282dbae3e69823e69a4098659bdd8329d4a19d257e6df65287782.png ../_images/b0ec9cb109e68d51a7ffd950f73d3ef660537bd15b73c94ad03fc24a92f631fc.png ../_images/bc7223098599cfc89a2d87f6dba81373db6c05be92eb5e56b128d785caf388d1.png

Mini-Übung

Erstellen Sie ein Histogramm für simulierte Reaktionszeiten:

  • Generieren Sie 500 Zufallszahlen mit Mittelwert 0.25 und Standardabweichung 0.05

  • Verwenden Sie 25 Bins

  • Färben Sie das Histogramm orange

  • Beschriften Sie die Achsen: x-Achse “Reaktionszeit [s]”, y-Achse “Häufigkeit”

  • Titel: “Verteilung der Reaktionszeiten”

# Hier Ihr Code

Lösung

import numpy as np
import matplotlib.pyplot as plt

# Daten generieren
np.random.seed(42)
reaktionszeiten = np.random.normal(0.25, 0.05, 500)

# Histogramm erstellen
plt.figure()
plt.hist(reaktionszeiten, bins=25, color='orange', alpha=0.7, edgecolor='black')
plt.xlabel('Reaktionszeit [s]')
plt.ylabel('Häufigkeit')
plt.title('Verteilung der Reaktionszeiten')
plt.grid(True, alpha=0.3)
plt.show()

Was ist der Unterschied zwischen Balkendiagramm und Histogramm?#

Um den Unterschied zwischen Balkendiagramm und Histogramm zu verdeutlichen, schauen wir uns Daten von Autos als Beispiel an.

Mit dem Balkendiagramm visualisieren wir diskrete Daten wie beispielsweise die Anzahl der verkauften Autos pro Marke.

# Anzahl verkaufter Autos pro Marke (diskrete Kategorien)
marken = ['BMW', 'Mercedes', 'Audi', 'VW', 'Ford']
verkaufte_autos = [45, 38, 52, 67, 23]

plt.figure()
plt.bar(marken, verkaufte_autos)
plt.xlabel('Automarke')
plt.ylabel('Anzahl verkaufter Autos')
plt.title('Balkendiagramm: Diskrete Kategorien')
plt.show();
../_images/336c8b4e4d81e8ba0972a50974326d0b20dfde86777689cc6417f0b94a3fad9b.png

Wenn es aber nun darum geht, darzustellen, wie viele Autos ein bestimmtes Alter in Jahren haben, ist ein Balkendiagramm unübersichtlich. Besser ist es, die Jahre zuerst zu clustern.

# Alter der Autos (kontinuierliche Daten)
np.random.seed(123)
alter = np.random.normal(12, 4, 100) 

plt.figure()
plt.hist(alter, bins=15, alpha=0.7, color='skyblue', edgecolor='black')
plt.xlabel('Alter [Jahre]')
plt.ylabel('Anzahl Autos')
plt.title('Histogramm: Kontinuierliche Daten')
plt.show();
../_images/eb083a32ef51d49238fdfeb7f22f295defb097e96f7fbc44e12867436a4a0d7a.png

Zusammenfassung und Ausblick#

In diesem Kapitel haben wir zwei wichtige Visualisierungstypen für verschiedene Datenarten kennengelernt. Balkendiagramme eignen sich für diskrete, kategoriale Daten und ermöglichen den direkten Vergleich zwischen verschiedenen Kategorien. Histogramme zeigen die Verteilung kontinuierlicher Daten und helfen dabei, Muster und Häufigkeiten in großen Datensätzen zu erkennen. Im nächsten Kapitel werden wir lernen, wie wir diese Techniken auf reale Datensätze anwenden können.