Freigeben über


Analysieren von Daten mit Apache Spark

In diesem Lernprogramm erfahren Sie, wie Sie explorative Datenanalysen mithilfe von Azure Open Datasets und Apache Spark durchführen. Anschließend können Sie die Ergebnisse in einem Synapse Studio-Notizbuch in Azure Synapse Analytics visualisieren.

Insbesondere analysieren wir das New York City (NYC)-Taxi-Dataset . Die Daten sind über Azure Open Datasets verfügbar. Diese Teilmenge des Datasets enthält Informationen zu Taxifahrten von Yellow Cabs: Informationen zu den einzelnen Fahrten, Start- und Endzeiten, Abfahrtsorte und Ziele, die Kosten sowie weitere interessante Attribute.

Bevor Sie anfangen

Erstellen Sie einen Apache Spark Pool, indem Sie das Lernprogramm zum Erstellen eines Apache Spark-Pools ausführen.

Herunterladen und Vorbereiten der Daten

  1. Erstellen Sie ein Notizbuch mithilfe des PySpark-Kernels. Anweisungen finden Sie unter Erstellen eines Notizbuchs.

    Hinweis

    Aufgrund des PySpark-Kernels müssen Sie keine Kontexte explizit erstellen. Der Spark-Kontext wird automatisch für Sie erstellt, wenn Sie die erste Codezelle ausführen.

  2. In diesem Lernprogramm verwenden wir verschiedene Bibliotheken, um uns beim Visualisieren des Datasets zu helfen. Für die Analyse müssen die folgenden Bibliotheken importiert werden:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Da sich die Rohdaten in einem Parkettformat befinden, können Sie den Spark-Kontext verwenden, um die Datei direkt als DataFrame in den Arbeitsspeicher zu übertragen. Erstellen Sie einen Spark DataFrame, indem Sie die Daten über die Open Datasets-API abrufen. Hier verwenden wir das Spark DataFrame-Schema zum Lesen von Eigenschaften, um die Datentypen und das Schema abzuleiten.

    from azureml.opendatasets import NycTlcYellow
    
    from datetime import datetime
    from dateutil import parser
    
    end_date = parser.parse('2018-05-08 00:00:00')
    start_date = parser.parse('2018-05-01 00:00:00')
    
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
    
    
  4. Nachdem die Daten gelesen wurden, möchten wir einige anfängliche Filterung durchführen, um das Dataset zu bereinigen. Möglicherweise entfernen wir nicht benötigte Spalten und fügen Spalten hinzu, die wichtige Informationen extrahieren. Darüber hinaus werden Anomalien innerhalb des Datasets herausfiltert.

    # Filter the dataset 
    from pyspark.sql.functions import *
    
    filtered_df = df.select('vendorID', 'passengerCount', 'tripDistance','paymentType', 'fareAmount', 'tipAmount'\
                                    , date_format('tpepPickupDateTime', 'hh').alias('hour_of_day')\
                                    , dayofweek('tpepPickupDateTime').alias('day_of_week')\
                                    , dayofmonth(col('tpepPickupDateTime')).alias('day_of_month'))\
                                .filter((df.passengerCount > 0)\
                                    & (df.tipAmount >= 0)\
                                    & (df.fareAmount >= 1) & (df.fareAmount <= 250)\
                                    & (df.tripDistance > 0) & (df.tripDistance <= 200))
    
    filtered_df.createOrReplaceTempView("taxi_dataset")
    

Daten analysieren

Als Datenanalyst steht Ihnen eine Vielzahl von Tools zur Verfügung, die Ihnen beim Extrahieren von Erkenntnissen aus Daten helfen. In diesem Teil des Lernprogramms werden wir einige nützliche Tools durchlaufen, die in Azure Synapse Analytics-Notizbüchern verfügbar sind. In dieser Analyse wollen wir die Faktoren verstehen, die für unsere ausgewählte Periode höhere Taxitipps liefern.

Apache Spark SQL Magic

Zunächst führen wir explorative Datenanalysen durch Apache Spark SQL und magische Befehle mit dem Azure Synapse-Notizbuch durch. Nachdem wir über unsere Abfrage verfügen, visualisieren wir die Ergebnisse mithilfe der integrierten chart options Funktion.

  1. Erstellen Sie in Ihrem Notizbuch eine neue Zelle, und kopieren Sie den folgenden Code. Mithilfe dieser Abfrage möchten wir verstehen, wie sich die durchschnittliche Tippbeträge im ausgewählten Zeitraum geändert haben. Diese Abfrage hilft uns auch, andere nützliche Erkenntnisse zu identifizieren, einschließlich des Mindest-/Maximalen Tippbetrags pro Tag und des durchschnittlichen Tarifbetrags.

    %%sql
    SELECT 
        day_of_month
        , MIN(tipAmount) AS minTipAmount
        , MAX(tipAmount) AS maxTipAmount
        , AVG(tipAmount) AS avgTipAmount
        , AVG(fareAmount) as fareAmount
    FROM taxi_dataset 
    GROUP BY day_of_month
    ORDER BY day_of_month ASC
    
  2. Nachdem die Ausführung unserer Abfrage abgeschlossen ist, können wir die Ergebnisse visualisieren, indem wir zur Diagrammansicht wechseln. In diesem Beispiel wird ein Liniendiagramm erstellt, indem wir das Feld day_of_month als Schlüssel und avgTipAmount als Wert angeben. Nachdem Sie die Auswahl getroffen haben, wählen Sie Übernehmen aus, um das Diagramm zu aktualisieren.

Visualisieren von Daten

Zusätzlich zu den integrierten Diagrammoptionen im Notebook können Sie auch beliebte Open-Source-Bibliotheken verwenden, um eigene Visualisierungen zu erstellen. In den folgenden Beispielen verwenden wir Seaborn und Matplotlib. Dies sind häufig verwendete Python-Bibliotheken für die Datenvisualisierung.

Hinweis

Standardmäßig enthält jeder Apache Spark-Pool in Azure Synapse Analytics eine Reihe häufig verwendeter und Standardbibliotheken. Sie können die vollständige Liste der Bibliotheken in der Dokumentation zur Azure Synapse-Laufzeit anzeigen. Darüber hinaus können Sie eine Bibliothek in einem Ihrer Spark-Pools installieren, um Drittanbieter- oder lokal erstellten Code für Ihre Anwendungen verfügbar zu machen.

  1. Um die Entwicklung einfacher und kostengünstiger zu gestalten, werden wir den Datensatz verkleinern. Wir verwenden die integrierte Apache Spark-Samplingfunktion. Darüber hinaus benötigen sowohl Seaborn als auch Matplotlib einen Pandas-Datenrahmen oder ein NumPy-Array. Um einen Pandas-Datenrahmen zu erhalten, verwenden wir den Befehl toPandas() zum Konvertieren des Datenrahmens.

    # To make development easier, faster, and less expensive, downsample for now
    sampled_taxi_df = filtered_df.sample(True, 0.001, seed=1234)
    
    # The charting package needs a Pandas DataFrame or NumPy array to do the conversion
    sampled_taxi_pd_df = sampled_taxi_df.toPandas()
    
  2. Wir möchten die Verteilung von Tipps in unserem Dataset verstehen. Wir verwenden Matplotlib, um ein Histogramm zu erstellen, das die Verteilung der Spitzenmenge und -anzahl anzeigt. Basierend auf der Verteilung können wir sehen, dass Tipps in Richtung von Beträgen, die kleiner oder gleich 10 $ sind, schief sind.

    # Look at a histogram of tips by count by using Matplotlib
    
    ax1 = sampled_taxi_pd_df['tipAmount'].plot(kind='hist', bins=25, facecolor='lightblue')
    ax1.set_title('Tip amount distribution')
    ax1.set_xlabel('Tip Amount ($)')
    ax1.set_ylabel('Counts')
    plt.suptitle('')
    plt.show()
    

    Histogramm von Tipps.

  3. Als Nächstes möchten wir die Beziehung zwischen den Tipps für eine bestimmte Reise und dem Wochentag verstehen. Wir verwenden Seaborn, um ein Boxplotdiagramm zu erstellen, das die Trends für jeden Wochentag zusammenfasst.

    # View the distribution of tips by day of week using Seaborn
    ax = sns.boxplot(x="day_of_week", y="tipAmount",data=sampled_taxi_pd_df, showfliers = False)
    ax.set_title('Tip amount distribution per day')
    ax.set_xlabel('Day of Week')
    ax.set_ylabel('Tip Amount ($)')
    plt.show()
    
    

    Diagramm, das die Verteilung von Tipps pro Tag zeigt.

  4. Eine weitere Hypothese unserer Könnte sein, dass es eine positive Beziehung zwischen der Anzahl der Passagiere und dem gesamten Taxi-Tipp-Betrag gibt. Um diesen Zusammenhang zu überprüfen, können Sie den folgenden Code ausführen, um ein Boxplot zu erzeugen, das die Verteilung der Trinkgelder für jede Fahrgastanzahl zeigt.

    # How many passengers tipped by various amounts 
    ax2 = sampled_taxi_pd_df.boxplot(column=['tipAmount'], by=['passengerCount'])
    ax2.set_title('Tip amount by Passenger count')
    ax2.set_xlabel('Passenger count')
    ax2.set_ylabel('Tip Amount ($)')
    ax2.set_ylim(0,30)
    plt.suptitle('')
    plt.show()
    

    Diagramm, das ein Box-Whisker-Diagramm zeigt.

  5. Schließlich möchten wir die Beziehung zwischen dem Tarifbetrag und dem Tippbetrag verstehen. Basierend auf den Ergebnissen können wir sehen, dass es mehrere Beobachtungen gibt, bei denen die Leute kein Trinkgeld geben. Wir sehen jedoch auch eine positive Beziehung zwischen den Gesamtpreis- und Tippbeträgen.

    # Look at the relationship between fare and tip amounts
    
    ax = sampled_taxi_pd_df.plot(kind='scatter', x= 'fareAmount', y = 'tipAmount', c='blue', alpha = 0.10, s=2.5*(sampled_taxi_pd_df['passengerCount']))
    ax.set_title('Tip amount by Fare amount')
    ax.set_xlabel('Fare Amount ($)')
    ax.set_ylabel('Tip Amount ($)')
    plt.axis([-2, 80, -2, 20])
    plt.suptitle('')
    plt.show()
    

    Streudiagramm des Trinkgeldbetrags.

Fahren Sie die Spark-Instanz herunter

Nachdem Sie die Ausführung der Anwendung abgeschlossen haben, beenden Sie das Notizbuch, um die Ressourcen freizugeben. Schließen Sie entweder die Registerkarte, oder wählen Sie im Statusbereich unten im Notizbuch " Sitzung beenden" aus.

Siehe auch

Nächste Schritte