Modul 2: Untersuchen und Visualisieren von Daten mithilfe von Microsoft Fabric-Notebooks

Die Python-Laufzeitumgebung in Fabric-Notebooks enthält verschiedene vorinstallierte Open-Source-Bibliotheken zum Erstellen von Visualisierungen wie matplotlib, seaborn, Plotly und mehr.

Wichtig

Microsoft Fabric befindet sich derzeit in der VORSCHAU. Diese Informationen beziehen sich auf eine Vorabversion des Produkts, an der vor der Veröffentlichung noch wesentliche Änderungen vorgenommen werden können. Microsoft übernimmt keine Garantie, weder ausdrücklich noch stillschweigend, für die hier bereitgestellten Informationen.

In diesem Modul verwenden wir seaborn, eine Python-Datenvisualisierungsbibliothek, die eine allgemeine Schnittstelle zum Erstellen von Visuals für Dataframes und Arrays bietet. Weitere Informationen zu seaborn finden Sie unter seaborn: statistische Datenvisualisierung.

In diesem Tutorial erfahren Sie, wie Sie die folgenden Aktionen ausführen:

  1. Liest Daten, die aus einer Deltatabelle im Lakehouse gespeichert sind.

  2. Generieren Sie eine zufällige Stichprobe des Dataframes.

  3. Konvertieren Sie einen Spark-Datenrahmen in pandas-Datenrahmen, den Python-Visualisierungsbibliotheken unterstützen.

  4. Führen Sie explorative Datenanalysen mit seaborn für das New York Taxi Yellow Cab-Dataset durch. Dazu visualisieren wir eine Variable für die Fahrtdauer für andere kategorische und numerische Variablen.

Folgen Sie im Notebook

Die python-Befehle/skripts, die in jedem Schritt dieses Tutorials verwendet werden, finden Sie im zugehörigen Notebook. 02-explore-and-visualize-data-using-notebooks.ipynb. Stellen Sie sicher, dass Sie ein Lakehouse an das Notebook anfügen , bevor Sie es ausführen.

Visualisieren und Analysieren

  1. Lesen Sie zunächst die Delta-Tabelle (gespeichert in Modul 1) aus dem Lakehouse und erstellen einen Pandas-Dataframe aus einer zufälligen Stichprobe der Daten.

    data = spark.read.format("delta").load("Tables/nyctaxi_raw")
    SEED = 1234
    sampled_df = data.sample(True, 0.001, seed=SEED).toPandas()
    

    Hinweis

    Um die Ausführungszeit zu minimieren, verwenden wir ein 1/1000-Beispiel, um die erfassten Daten zu untersuchen und zu visualisieren.

  2. Importieren Sie erforderliche Bibliotheken und Funktionen, die für Visualisierungen erforderlich sind, und legen Sie designparameter fest, die die Ästhetik der Ausgabevisuals wie Stil, Farbpalette und Größe des Visuals steuern.

    import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.ticker as mticker
    import numpy as np
    sns.set_theme(style="whitegrid", palette="tab10", rc = {'figure.figsize':(9,6)})
    
  3. Visualisieren Sie die Verteilung der Fahrtdauer (Minuten) auf linearer und logarithmischer Ebene, indem Sie die folgenden Befehle ausführen.

    ## Compute trip duration(in minutes) on the sample using pandas
    sampled_df['tripDuration'] = (sampled_df['tpepDropoffDateTime'] - sampled_df['tpepPickupDateTime']).astype('timedelta64[m]')
    sampled_df = sampled_df[sampled_df["tripDuration"] > 0]
    
    fig, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.histplot(ax=axes[0],data=sampled_df,
                x="tripDuration",
                stat="count",
                discrete=True).set(title='Distribution of trip duration(minutes)')
    sns.histplot(ax=axes[1],data=sampled_df,
                x="tripDuration",
                stat="count", 
                log_scale= True).set(title='Distribution of trip duration(log scale)')
    axes[1].xaxis.set_major_formatter(mticker.ScalarFormatter())
    

    Screenshot: Zwei Diagramme zum Visualisieren der Verteilung der Fahrtdauer.

  4. Erstellen Sie Behälter, um die Verteilung von tripDuration besser zu trennen und zu verstehen. Erstellen Sie hierzu eine durationBin-Spalte mit Pandas-Vorgängen, um die Fahrtdauern in Buckets von <10 Minuten, 10 bis 30 Minuten, 30 bis 60 Minuten, 1-2 Stunden, 2 bis 4 Stunden und >4 Stunden zu klassifizieren. Visualisieren Sie die binnierte Spalte mithilfe eines Histogrammdiagramms vom Meer.

    ## Create bins for tripDuration column
    sampled_df.loc[sampled_df['tripDuration'].between(0, 10, 'both'), 'durationBin'] = '< 10 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(10, 30, 'both'), 'durationBin'] = '10-30 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(30, 60, 'both'), 'durationBin'] = '30-60 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(60, 120, 'right'), 'durationBin'] = '1-2 Hrs'
    sampled_df.loc[sampled_df['tripDuration'].between(120, 240, 'right'), 'durationBin'] = '2-4 Hrs'
    sampled_df.loc[sampled_df['tripDuration'] > 240, 'durationBin'] = '> 4 Hrs'
    
    # Plot histogram using the binned column
    sns.histplot(data=sampled_df, x="durationBin", stat="count", discrete=True, hue = "durationBin")
    plt.title("Trip Distribution by Duration Bins")
    plt.xlabel('Trip Duration')
    plt.ylabel('Frequency')
    

    Balkendiagramm, das die Verteilung der Fahrtdauer nach Dauerbehältern zeigt.

  5. Visualisieren Sie die Verteilung von tripDuration und tripDistance, und klassifizieren Sie nach passengerCount mithilfe von seaborn scatterplot, indem Sie die folgenden Befehle ausführen.

    sns.scatterplot(data=sampled_df, x="tripDistance", y="tripDuration", hue="passengerCount")
    

    Punktdiagramm, das die Verteilung der Fahrtdauer und der Fahrtstrecke nach Passagieranzahl zeigt.

  6. Visualisieren Sie die Gesamtverteilung der spalte passengerCount , um die gängigsten passengerCount-Instanzen in den Fahrten zu verstehen.

    sns.histplot(data=sampled_df, x="passengerCount", stat="count", discrete=True)
    plt.title("Distribution of passenger count")
    plt.xlabel('No. of Passengers')
    plt.ylabel('Number of trips')
    

    Balkendiagramm, um die häufigste Anzahl von Passagieren in den Taxifahrten anzuzeigen.

  7. Erstellen Sie Boxplots, um die Verteilung von tripDuration nach Passagieranzahl zu visualisieren. Ein Boxplot ist ein nützliches Tool, um die Variabilität, Symmetrie und Ausreißer der Daten zu verstehen.

    # The threshold was calculated by evaluating mean trip duration (~15 minutes) + 3 standard deviations (58 minutes), i.e. roughly 3 hours.
    fig, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.boxplot(ax=axes[0], data=sampled_df, x="passengerCount", y="tripDuration").set(title='Distribution of Trip duration by passengerCount')
    sampleddf_clean = sampled_df[(sampled_df["passengerCount"] > 0) & (sampled_df["tripDuration"] < 189)]
    sns.boxplot(ax=axes[1], data=sampleddf_clean, x="passengerCount", y="tripDuration").set(title='Distribution of Trip duration by passengerCount (outliers removed)')
    

    In der ersten Abbildung visualisieren wir tripDuration, ohne Ausreißer zu entfernen, während in der zweiten Abbildung Fahrten mit einer Dauer von mehr als 3 Stunden und 0 Passagieren entfernt werden.

    Screenshot von zwei Boxplots zum Visualisieren der Fahrtdauer, eines mit Ausreißern und eines ohne.

  8. Analysieren Sie die Beziehung zwischen tripDuration und fareAmount klassifiziert nach paymentType und VendorId mithilfe von seaborn scatterplots.

    f, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.scatterplot(ax =axes[0], data=sampled_df, x="fareAmount", y="tripDuration",  hue="paymentType")
    sns.scatterplot(ax =axes[1],data=sampled_df, x="fareAmount", y="tripDuration",  hue="vendorID")
    plt.title("Distribution of tripDuration by fareAmount")
    plt.show()
    

    Screenshot: Zwei Punktdiagramme zur Visualisierung der Beziehung zwischen Reisedauer, Tarif und Zahlungsmethode.

  9. Analysieren Sie die Häufigkeit der Taxifahrten nach Stunde des Tages mithilfe eines Histogramms der Anzahl der Fahrten.

    sampled_df['hour'] = sampled_df['tpepPickupDateTime'].dt.hour
    sampled_df['dayofweek'] = sampled_df['tpepDropoffDateTime'].dt.dayofweek
    sampled_df['dayname'] = sampled_df['tpepDropoffDateTime'].dt.day_name()
    sns.histplot(data=sampled_df, x="hour", stat="count", discrete=True, kde=True)
    plt.title("Distribution by Hour of the day")
    plt.xlabel('Hours')
    plt.ylabel('Count of trips')
    plt.show()
    

    Histogrammdiagramm, um die Anzahl der Taxifahrten pro Stunde des Tages anzuzeigen.

  10. Analysieren Sie die durchschnittliche Taxifahrtdauer nach Stunde und Tag mithilfe eines seegeborenen Wärmebilds. Die folgende Zelle erstellt eine Pandas-Pivottabelle, indem sie die Trips nach hour und dayName spalten und einen Mittelwert der tripDuration-Werte erhält. Diese Pivottabelle wird verwendet, um ein Wärmebild mit seaborn zu erstellen, wie im folgenden Beispiel gezeigt.

    pv_df = sampled_df[sampled_df["tripDuration"]<180]\
          .groupby(["hour","dayname"]).mean("tripDuration")\
          .reset_index().pivot("hour", "dayname", "tripDuration")
    sns.heatmap(pv_df,annot=True,fmt='.2f', cmap="Blues").set(xlabel=None)
    

    Wärmebild über einer Pandas-Tabelle, um die durchschnittliche Dauer der Fahrten nach Stunde und Tag anzuzeigen.

  11. Zum Schluss erstellen wir ein Korrelationsdiagramm, das ein nützliches Tool zum Untersuchen der Beziehungen zwischen numerischen Variablen in einem Dataset ist. Es zeigt die Datenpunkte für jedes Variablenpaar als Punktdiagramm an und berechnet den Korrelationskoeffizienten für jedes Paar. Der Korrelationskoeffizienten gibt an, wie stark und in welche Richtung die Variablen zusammenhängen. Eine positive Korrelation bedeutet, dass die Variablen tendenziell zusammen zunehmen oder abnehmen, während eine negative Korrelation bedeutet, dass sie sich tendenziell in entgegengesetzte Richtungen bewegen. In diesem Beispiel wird ein Korrelationsdiagramm für eine Teilmenge von Spalten im Datenrahmen für die Analyse generiert.

    cols_to_corr = ['tripDuration','fareAmount', 'passengerCount', 'tripDistance', 'extra', 'mtaTax',
          'improvementSurcharge', 'tipAmount', 'hour',"dayofweek"]
    sns.heatmap(data = sampled_df[cols_to_corr].corr(),annot=True,fmt='.3f', cmap="Blues")
    

    Korrelationsdiagrammtabelle, die Beziehungen zwischen Tripvariablenpaaren anzeigt.

Beobachtungen aus der Analyse von Explorationsdaten

  • Einige Fahrten in den Beispieldaten weisen eine Passagieranzahl von 0 auf, aber die meisten Fahrten weisen eine Passagieranzahl zwischen 1 und 6 auf.
  • Die TripDuration-Spalte enthält Ausreißer mit einer vergleichsweise geringen Anzahl von Fahrten mit einer TripDuration von mehr als 3 Stunden.
  • Die Ausreißer für TripDuration sind speziell für vendorId 2 vorhanden.
  • Einige Fahrten haben keine Fahrtstrecke und können daher abgebrochen und aus jeder Modellierung herausgefiltert werden.
  • Eine kleine Anzahl von Fahrten hat keine Passagiere(0) und kann daher herausgefiltert werden.
  • die FareAmount-Spalte enthält negative Ausreißer, die aus dem Modelltraining entfernt werden können.
  • Die Anzahl der Fahrten beginnt um 16:00 Uhr zu steigen und spitzen zwischen 18:00 und 19:00 Uhr.

Nächste Schritte