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:
Liest Daten, die aus einer Deltatabelle im Lakehouse gespeichert sind.
Generieren Sie eine zufällige Stichprobe des Dataframes.
Konvertieren Sie einen Spark-Datenrahmen in pandas-Datenrahmen, den Python-Visualisierungsbibliotheken unterstützen.
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
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.
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)})
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())
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')
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")
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')
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.
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()
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()
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)
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")
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.