Analýza dat pomocí Apache Sparku a Pythonu

Důležité

Microsoft Fabric je v současné době ve verzi PREVIEW. Tyto informace se týkají předběžného vydání produktu, který může být před vydáním podstatně změněn. Společnost Microsoft neposkytuje na zde uvedené informace žádné záruky, ať už vyjádřené nebo předpokládané.

V tomto kurzu se naučíte provádět průzkumné analýzy dat pomocí Azure Open Datasets a Apache Sparku.

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 jízdách taxi: informace o každé cestě, počátečním a koncovém čase a umístění, nákladech a dalších zajímavých atributech.

Požadavky

Důležité

Microsoft Fabric je v současné době ve verzi PREVIEW. Tyto informace se týkají předběžného vydání produktu, který může být před vydáním podstatně změněn. Společnost Microsoft neposkytuje na zde uvedené informace žádné záruky, ať už vyjádřené nebo předpokládané.

Stažení a příprava dat

  1. Vytvořte poznámkový blok pomocí PySparku. 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 s vizualizací datové sady. 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 k přímému načtení souboru do paměti jako datového rámce. Vytvořte datový rámec Sparku načtením dat prostřednictvím rozhraní OPEN Datasets API. Zde 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
    
    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. Po přečtení dat budeme chtít datovou sadu nejprve vyfiltrovat. Můžeme odebrat nepotřebné sloupce a přidat sloupce, které extrahují důležité informace. Kromě toho v datové sadě vyfiltrujeme anomálie.

    # 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 přehledy z dat. V této části kurzu si projdeme několik užitečných nástrojů dostupných v poznámkových blocích Microsoft Fabric. V této analýze chceme porozumět faktorům, které poskytují vyšší tipy taxi pro vybrané období.

Apache Spark SQL Magic

Nejprve provedeme průzkumnou analýzu dat pomocí Sql Apache Sparku a magických příkazů pomocí poznámkového bloku Microsoft Fabric. 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 za vybrané 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í částky tipu za den a průměrné ceny 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 jako hodnoty. Po výběru vyberte Použít a aktualizujte graf.

Vizualizace dat

Kromě předdefinovaných možností vytváření grafů poznámkových bloků 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. Tyto knihovny Pythonu se běžně používají pro vizualizaci dat.

  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ě. Použijeme Matplotlib k vytvoření histogramu, 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 částem menším nebo rovenm 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()
    

    Snímek obrazovky s histogramem tipů

  3. Dále chceme porozumět vztahu mezi tipy pro danou cestu a dnem v týdnu. Pomocí seabornu můžete vytvořit krabicový graf, který shrnuje trendy pro každý den 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í rozdělení tipů za den

  4. Další naší hypotézou může být, že existuje pozitivní vztah mezi počtem cestujících a celkovou částkou taxi tipu. Pokud chcete ověřit tuto relaci, spusťte následující kód, který vygeneruje 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 porozumět vztahu mezi částkou jízdného a částkou tipu. Na základě výsledků vidíme, že existuje několik pozorování, u kterých lidé nedají tip. Vidíme ale také kladný vztah mezi celkovým tarifem a částkami spropitného.

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

    Snímek obrazovky bodového grafu s velikostí tipu

Další kroky