Datenvisualisierung mithilfe von ChatGPT

In diesem Blogbeitrag möchte ich von meiner Erfahrung mit dem Erstellen eines Liniendiagramms unter Verwendung von ChatGPT berichten. Bei dem Datensatz handelt es sich um die erteilten Baugenehmigungen in Kiel. Der Datensatz kann als CSV-Datei vom Open-Data-Portal der Stadt Kiel heruntergeladen werden. In einem anderen Artikel hatte ich bereits gezeigt, wie der Code – ohne die Hilfe von KI – aussehen könnte. Nachfolgend zeige ich nochmal den in jenem Beitrag verwendeten Code. Dabei wurde als Programmiersprache Python verwendet. Das Erstellen des Liniendiagramms übernahm die Bibliothek Bokeh.

#!/usr/bin/env python3

from io import StringIO

from bokeh.plotting import ColumnDataSource, figure, save, show

import pandas as pd

import requests
from requests.exceptions import (
    ConnectionError,
    RequestException,
    Timeout,
    TooManyRedirects,
)

URL = (
    "https://www.kiel.de/opendata/kiel_infrastruktur_bauen_wohnen_baugenehmigungen.csv"
)


def fetch_csv_data():
    """Fetch CSV data from given URL

    Returns:
        str -- CSV data
    """
    try:
        response = requests.get(URL)

        response.raise_for_status()

        return response.text

    except ConnectionError as e:
        print(f"Connection error: {e}")
    except Timeout as e:
        print(f"Request timed out: {e}")
    except TooManyRedirects as e:
        print(f"Too many redirects: {e}")
    except RequestException as e:
        print(f"An error occurred: {e}")


csv_data = fetch_csv_data()

csv_content = StringIO(csv_data)
df = pd.read_csv(csv_content, sep=";")

plot = figure(
    title="Baugenehmigungen in Kiel (1988 - 2023)",
    width=1000,
    x_axis_label="Jahr",
    y_axis_label="Baugenehmigungen",
)

datenquelle = ColumnDataSource(df)
plot.line(source=datenquelle, x="Jahr", y="Wohnungen gesamt")

show(plot)
save(plot)

Die Ausführung dieses Skripts führt zu folgendem Liniendiagramm:

Baugenehmigungen für Wohnungen in Kiel

Und nun folgt der ChatGPT-Erfahrungsbericht: Zunächst fragte ich, ob ich eine CSV-Datei zum Zwecke der Datenvisualisierung mit Python und Bokeh hochladen könne. Dies bejahte ChatGPT, so dass es nun an die Aufgabenstellung ging:

„Es sollen die Spalten „Jahr“ für die X-Achse und „Wohnungen gesamt“ für die Y-Achse visualisiert werden.“

Nach dem Hochladen der CSV-Datei, stellte ChatGPT fest, dass ein Semikolon als Trennzeichen verwendet wird:

„Die CSV-Datei scheint Spaltennamen und Werte mit Semikolon (;) statt Komma als Trennzeichen zu verwenden. Ich werde die Datei erneut laden und das Trennzeichen korrekt einstellen, um die Daten richtig zu analysieren.“

Dann wurden die Daten geladen und es erschien folgende Meldung:

„Die Daten wurden erfolgreich geladen. Die relevanten Spalten für die Visualisierung sind:

  • “Jahr”: X-Achse
  • “Wohnungen gesamt”: Y-Achse

Ich werde nun den Code für eine Visualisierung mit Python und Bokeh erstellen.“

ChatGPT hatte offensichtlich alle relevanten Informationen erkannt und konnte nun weitermachen, wobei die Ausgabe einer Grafik in der ChatGPT-App für macOS nicht funktionierte. Stattdessen wurde folgender Code angezeigt:

from bokeh.plotting import figure, show
from bokeh.io import output_file

# Daten für die Visualisierung
x = data['Jahr']
y = data['Wohnungen gesamt']

# Ausgabe-Datei festlegen
output_file("wohnungen_pro_jahr.html")

# Bokeh-Plot erstellen
plot = figure(
    title="Wohnungen gesamt pro Jahr",
    x_axis_label='Jahr',
    y_axis_label='Wohnungen gesamt',
    plot_width=800,
    plot_height=400
)
plot.line(x, y, legend_label="Wohnungen gesamt", line_width=2, color="blue")
plot.circle(x, y, size=8, color="red", legend_label="Datenpunkte")

# Plot anzeigen
show(plot)

Verglichen mit obigem Code führte dies schon in die richtige Richtung. Allerdings wird die CSV-Datei nicht geladen. Darauf hingewiesen, lieferte ChatGPT diesen Code:

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.io import output_file

# Lokalen Dateipfad anpassen
file_path = "kiel_infrastruktur_bauen_wohnen_baugenehmigungen.csv"

# CSV-Datei laden
data = pd.read_csv(file_path, delimiter=';')

# Daten für die Visualisierung
x = data['Jahr']
y = data['Wohnungen gesamt']

# Ausgabe-Datei festlegen
output_file("wohnungen_pro_jahr.html")

# Bokeh-Plot erstellen
plot = figure(
    title="Wohnungen gesamt pro Jahr",
    x_axis_label='Jahr',
    y_axis_label='Wohnungen gesamt',
    plot_width=800,
    plot_height=400
)
plot.line(x, y, legend_label="Wohnungen gesamt", line_width=2, color="blue")
plot.circle(x, y, size=8, color="red", legend_label="Datenpunkte")

# Plot anzeigen
show(plot)

Es wurden folgende Zeilen hinzugefügt, die es ermöglichen unter Verwendung von Pandas die CSV-Datei zu lesen:

# Lokalen Dateipfad anpassen
file_path = "kiel_infrastruktur_bauen_wohnen_baugenehmigungen.csv"

# CSV-Datei laden
data = pd.read_csv(file_path, delimiter=';')

Dennoch führte die Ausführung dieses Skripts zu einer Fehlermeldung, die ich ChatGPT mitteilte:

„Dies führt zu einer Fehlermeldung: AttributeError: unexpected attribute 'plot_width' to figure, similar attributes are outer_width, width or min_width

Das Problem bestand darin, dass in dem von ChatGPT gelieferten Code plot_width und plot_height anstelle von width und height verwendet wurden. ChatGPT konnte mit dieser Fehlermeldung etwas anfangen und zeigte schließlich funktionierenden Code an:

import pandas as pd
from bokeh.plotting import figure, show
from bokeh.io import output_file

# Lokalen Dateipfad anpassen
file_path = "kiel_infrastruktur_bauen_wohnen_baugenehmigungen.csv"

# CSV-Datei laden
data = pd.read_csv(file_path, delimiter=';')

# Daten für die Visualisierung
x = data['Jahr']
y = data['Wohnungen gesamt']

# Ausgabe-Datei festlegen
output_file("wohnungen_pro_jahr.html")

# Bokeh-Plot erstellen
plot = figure(
    title="Wohnungen gesamt pro Jahr",
    x_axis_label='Jahr',
    y_axis_label='Wohnungen gesamt',
    width=800,
    height=400
)
plot.line(x, y, legend_label="Wohnungen gesamt", line_width=2, color="blue")
plot.circle(x, y, size=8, color="red", legend_label="Datenpunkte")

# Plot anzeigen
show(plot)

Im Ergebnis erhielt ich schließlich dieses Liniendiagramm:

Baugenehmigungen für Wohnungen in Kiel

Fazit

Man kann ChatGPT für das Erstellen einer Grafik verwenden. Es mag nicht sofort funktionieren, aber durch die Mitteilung etwaiger Fehlermeldungen bzw. durch die Beschreibung des Problems kommt man tatsächlich zum Ziel. Im Vergleich zum ursprünglichen Liniendiagramm hat ChatGPT auch noch eine Legende hinzugefügt und die Datenpunkte durch kleine rote Punkte hervorgehoben. Bei zukünftigen Projekte werde ich wohl des öfteren auf eine KI zurückgreifen, alleine schon um mehr Erfahrungen mit dem Umgang solcher Tools zu sammeln.