Sdílet prostřednictvím


Analýza dat s využitím Azure Sparku

V tomto kurzu se naučíte provádět průzkumnou analýzu dat pomocí Azure Open Datasets a Apache Sparku. Výsledky pak můžete vizualizovat v poznámkovém bloku Synapse Studio ve službě Azure Synapse Analytics.

Konkrétně budeme analyzovat datovou sadu New York City (NYC) Taxi . Data jsou k dispozici prostřednictvím služby Azure Open Datasets. Tato podmnožina datové sady obsahuje informace o žlutých cestách taxíkem: informace o jednotlivých jízdách, počáteční a koncový čas a místa, náklady a další zajímavé atributy.

Než začnete

Vytvořte fond Apache Sparku podle kurzu Vytvoření fondu Apache Sparku.

Stažení a příprava dat

  1. Vytvořte poznámkový blok pomocí jádra PySpark. Pokyny najdete v tématu Vytvoření poznámkového bloku.

    Poznámka

    Kvůli jádru PySpark nemusíte explicitně vytvářet žádné kontexty. Kontext Sparku se automaticky vytvoří při spuštění první buňky kódu.

  2. V tomto kurzu použijeme několik různých knihoven, které nám pomůžou datovou sadu vizualizovat. Chcete-li provést tuto analýzu, naimportujte následující knihovny:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Vzhledem k tomu, že nezpracovaná data jsou ve formátu Parquet, můžete použít kontext Sparku a načíst soubor do paměti jako datový rámec přímo. Vytvořte datový rámec Sparku načtením dat prostřednictvím rozhraní Open Datasets API. Tady použijeme schéma datového rámce Sparku pro vlastnosti čtení k odvození datových typů a schématu.

     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)
     filtered_df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
    
    
  4. Po přečtení dat budeme chtít datovou sadu nejprve vyfiltrovat, abychom ji vyčistili. Můžeme odebrat nepotřebné sloupce a přidat sloupce, které extrahují důležité informace. Kromě toho vyfiltrujeme anomálie v datové sadě.

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

Analýza dat

Jako datový analytik máte k dispozici širokou škálu nástrojů, které vám pomůžou extrahovat z dat přehledy. V této části kurzu vás provedeme několika užitečnými nástroji dostupnými v poznámkových blocích Azure Synapse Analytics. V této analýze chceme porozumět faktorům, které pro vybrané období přinášejí vyšší spropitné taxi.

Apache Spark SQL Magic

Nejprve provedeme průzkumnou analýzu dat pomocí Apache Spark SQL a příkazů magic pomocí poznámkového bloku Azure Synapse. Po zadání dotazu vizualizujeme výsledky pomocí integrované chart options funkce.

  1. V poznámkovém bloku vytvořte novou buňku a zkopírujte následující kód. Pomocí tohoto dotazu chceme pochopit, jak se v průběhu vybraného období změnily průměrné částky spropitné. Tento dotaz nám také pomůže identifikovat další užitečné přehledy, včetně minimální/maximální denní částky tipu a průměrné částky jízdného.

    %%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. Po dokončení dotazu můžeme vizualizovat výsledky přepnutím do zobrazení grafu. Tento příklad vytvoří spojnicový graf zadáním day_of_month pole jako klíče a avgTipAmount hodnoty. Po výběru vyberte Použít a aktualizujte graf.

Vizualizace dat

Kromě předdefinovaných možností vytváření grafů v poznámkových blocích můžete k vytváření vlastních vizualizací použít oblíbené opensourcové knihovny. V následujících příkladech použijeme Seaborn a Matplotlib. Běžně se používají knihovny Pythonu pro vizualizaci dat.

Poznámka

Ve výchozím nastavení každý fond Apache Sparku v Azure Synapse Analytics obsahuje sadu běžně používaných a výchozích knihoven. Úplný seznam knihoven najdete v dokumentaci k modulu runtime Azure Synapse. Pokud chcete svým aplikacím zpřístupnit kód třetí strany nebo místně sestavený kód, můžete knihovnu nainstalovat do jednoho ze svých fondů Sparku.

  1. Aby byl vývoj jednodušší a levnější, převzorkujeme datovou sadu dolů. Použijeme integrovanou funkci vzorkování Apache Sparku. Kromě toho Seaborn i Matplotlib vyžadují datový rámec Pandas nebo pole NumPy. Pokud chcete získat datový rámec Pandas, použijte toPandas() příkaz k převodu datového rámce.

    # 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. Chceme porozumět distribuci tipů v naší datové sadě. Pomocí knihovny Matplotlib vytvoříme histogram, který bude zobrazovat rozdělení množství tipu a počtu. Na základě rozdělení vidíme, že spropitné jsou zkosené směrem k částce menší než nebo rovna 10 USD.

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

    Histogram tipů

  3. Dále chceme pochopit vztah mezi tipy pro danou cestu a dnem v týdnu. Pomocí nástroje Seaborn můžete vytvořit krabicový graf, který shrnuje trendy pro jednotlivé dny v týdnu.

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

    Graf znázorňující distribuci tipů za den

  4. Další naší hypotézou může být, že existuje kladný vztah mezi počtem cestujících a celkovou výší tipu taxislužby. Pokud chcete tuto relaci ověřit, spuštěním následujícího kódu vygenerujte krabicový graf, který znázorňuje rozdělení hrotů pro jednotlivé počty cestujících.

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

    Graf znázorňující krabicový graf

  5. Nakonec chceme pochopit vztah mezi částkou jízdného a částkou tipu. Na základě výsledků vidíme, že existuje několik pozorování, kdy lidé nedají tip. Vidíme však také pozitivní vztah mezi celkovým tarifem a částkami tipu.

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

    Bodový graf výše tipu

Vypnutí instance Sparku

Po dokončení spuštění aplikace vypněte poznámkový blok, aby se uvolnily prostředky. Buď kartu zavřete, nebo na stavovém panelu v dolní části poznámkového bloku vyberte Ukončit relaci .

Viz také

Další kroky