Delen via


Gegevens analyseren met Apache Spark en Python

In dit artikel leert u hoe u verkennende gegevensanalyse uitvoert met behulp van Azure Open Datasets en Apache Spark. In dit artikel wordt de gegevensset voor taxi's van New York City geanalyseerd. De gegevens zijn beschikbaar via Azure Open Datasets. Deze subset van de gegevensset bevat informatie over gele taxiritten: informatie over elke reis, de begin- en eindtijd en locaties, de kosten en andere interessante kenmerken.

In dit artikel leert u het volgende:

  • Gegevens downloaden en voorbereiden
  • Gegevens analyseren
  • Gegevens visualiseren

Vereisten

De gegevens downloaden en voorbereiden

Als u wilt beginnen, downloadt u de taxigegevensset van New York City (NYC) en bereidt u de gegevens voor.

  1. Maak een notebook met behulp van PySpark. Zie Een notebook maken voor instructies.

    Notitie

    Vanwege de PySpark-kernel hoeft u niet expliciet contexten te maken. De Spark-context wordt automatisch voor u gemaakt wanneer u de eerste codecel uitvoert.

  2. In dit artikel gebruikt u verschillende bibliotheken om de gegevensset te visualiseren. Als u deze analyse wilt uitvoeren, importeert u de volgende bibliotheken:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Omdat de onbewerkte gegevens de Parquet-indeling hebben, kunt u de Spark-context gebruiken om het bestand rechtstreeks als een DataFrame in het geheugen op te halen. Gebruik de OPEN Datasets-API om de gegevens op te halen en een Spark DataFrame te maken. Als u de gegevenstypen en het schema wilt afleiden, gebruikt u het Spark DataFrame-schema voor leeseigenschappen .

    from azureml.opendatasets import NycTlcYellow
    
    end_date = parser.parse('2018-06-06')
    start_date = parser.parse('2018-05-01')
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    nyc_tlc_pd = nyc_tlc.to_pandas_dataframe()
    
    df = spark.createDataFrame(nyc_tlc_pd)
    
  4. Nadat de gegevens zijn gelezen, moet u eerst filteren om de gegevensset op te schonen. U kunt overbodige kolommen verwijderen en kolommen toevoegen die belangrijke informatie extraheren. Daarnaast kunt u afwijkingen in de gegevensset uitfilteren.

    # 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")
    

Gegevens analyseren

Als gegevensanalist beschikt u over een breed scala aan hulpprogramma's waarmee u inzichten uit de gegevens kunt extraheren. In dit deel van het artikel vindt u informatie over enkele handige hulpprogramma's die beschikbaar zijn in Microsoft Fabric-notebooks. In deze analyse wilt u de factoren begrijpen die hogere taxitips opleveren voor de geselecteerde periode.

Apache Spark SQL Magic

Voer eerst verkennende gegevensanalyse uit met behulp van Apache Spark SQL en magic-opdrachten met het Microsoft Fabric-notebook. Nadat u de query hebt uitgevoerd, visualiseert u de resultaten met behulp van de ingebouwde chart options mogelijkheid.

  1. Maak in het notebook een nieuwe cel en kopieer de volgende code. Door deze query te gebruiken, kunt u begrijpen hoe de gemiddelde tipbedragen veranderen gedurende de periode die u selecteert. Deze query helpt u ook bij het identificeren van andere nuttige inzichten, waaronder het minimum/maximum aantal tips per dag en het gemiddelde tariefbedrag.

    %%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. Nadat de query is uitgevoerd, kunt u de resultaten visualiseren door over te schakelen naar de grafiekweergave. In dit voorbeeld wordt een lijndiagram gemaakt door het day_of_month veld op te geven als de sleutel en avgTipAmount als de waarde. Nadat u de selecties hebt geselecteerd, selecteert u Toepassen om de grafiek te vernieuwen.

Gegevens visualiseren

Naast de ingebouwde opties voor notitieblokgrafieken kunt u populaire opensource-bibliotheken gebruiken om uw eigen visualisaties te maken. In de volgende voorbeelden gebruikt u Seaborn en Matplotlib. Dit zijn veelgebruikte Python-bibliotheken voor gegevensvisualisatie.

  1. Als u de ontwikkeling eenvoudiger en goedkoper wilt maken, moet u de gegevensset omlaagsampleen. Gebruik de ingebouwde Apache Spark-samplingfunctie. Daarnaast vereisen zowel Seaborn als Matplotlib een Pandas DataFrame of NumPy-matrix. Als u een Pandas DataFrame wilt ophalen, gebruikt u de toPandas() opdracht om het DataFrame te converteren.

    # 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. U kunt de distributie van tips in de gegevensset begrijpen. Gebruik Matplotlib om een histogram te maken waarin de verdeling van de tiphoeveelheid en het aantal wordt weergegeven. Op basis van de distributie kunt u zien dat tips scheef zijn ten opzichte van bedragen kleiner dan of gelijk aan $ 10.

    # 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()
    

    Schermopname van histogram met verdeling van tiphoeveelheid.

  3. Probeer vervolgens de relatie tussen de tips voor een bepaalde reis en de dag van de week te begrijpen. Gebruik Seaborn om een boxplot te maken waarmee de trends voor elke dag van de week worden samengevat.

    # 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()
    
    

    Grafiek met de distributie van tips per dag.

  4. Een andere hypothese kan zijn dat er een positieve relatie is tussen het aantal passagiers en het totale aantal taxitips. Als u deze relatie wilt controleren, voert u de volgende code uit om een boxplot te genereren die de distributie van tips voor elk aantal passagiers illustreert.

    # 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()
    

    Grafiek met een box whisker-plot van fooihoeveelheid per aantal passagiers.

  5. Ten slotte verkent u de relatie tussen het tariefbedrag en de tiphoeveelheid. Op basis van de resultaten kunt u zien dat er verschillende waarnemingen zijn waarbij mensen geen tip geven. Er is echter een positieve relatie tussen de totale tarief- en tipbedragen.

    # 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()
    

    Schermopname van het spreidingsplot met tiphoeveelheid.