Megosztás a következőn keresztül:


Adatok elemzése az Apache Sparkkal

Ebben az oktatóanyagban megtudhatja, hogyan végezhet feltáró adatelemzést az Azure Open Datasets és az Apache Spark használatával. Ezután egy Synapse Studio-jegyzetfüzetben jelenítheti meg az eredményeket az Azure Synapse Analyticsben.

Különösen a New York City (NYC) Taxi adatkészletet fogjuk elemezni. Az adatok az Azure Open-adathalmazokon keresztül érhetők el. Az adatkészlet ezen részhalmaza információkat tartalmaz a sárga taxis utakról: az egyes utazásokról, a kezdési és befejezési időpontokról és helyekről, a költségekről és más érdekes attribútumokról.

Előkészületek

Apache Spark-készlet létrehozása az Apache Spark-készlet létrehozása oktatóanyagot követve.

Az adatok letöltése és előkészítése

  1. Hozzon létre egy jegyzetfüzetet a PySpark kernel használatával. Útmutatásért lásd: Jegyzetfüzet létrehozása.

    Megjegyzés

    A PySpark kernel miatt nem kell explicit módon környezeteket létrehoznia. A Spark-környezet automatikusan létrejön Az első kódcella futtatásakor.

  2. Ebben az oktatóanyagban több különböző kódtárat fogunk használni az adathalmaz vizualizációjának megjelenítéséhez. Az elemzés elvégzéséhez importálja a következő kódtárakat:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Mivel a nyers adatok Parquet formátumúak, a Spark-környezettel közvetlenül DataFrame-ként lekérheti a fájlt a memóriába. Hozzon létre egy Spark DataFrame-et az adatok Open Datasets API-val történő lekérésével. Itt a Spark DataFrame-sémát használjuk az olvasási tulajdonságokhoz az adattípusok és a séma következtetéséhez.

     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. Az adatok beolvasása után először szűrni szeretnénk az adathalmazt. Eltávolíthatjuk a felesleges oszlopokat, és olyan oszlopokat adhatunk hozzá, amelyek fontos információkat nyernek ki. Emellett kiszűrjük az adathalmazon belüli anomáliákat.

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

Adatok elemzése

Adatelemzőként számos olyan eszköz áll rendelkezésre, amellyel elemzéseket nyerhet ki az adatokból. Az oktatóanyag ezen részében bemutatunk néhány hasznos eszközt, amelyek Azure Synapse Analytics-jegyzetfüzetekben érhetők el. Ebben az elemzésben szeretnénk megérteni azokat a tényezőket, amelyek magasabb taxitippeket eredményeznek a kiválasztott időszakban.

Apache Spark SQL Magic

Először feltáró adatelemzést végzünk apache Spark SQL-lel és magic parancsokkal a Azure Synapse jegyzetfüzettel. A lekérdezés után a beépített chart options képesség használatával vizualizáljuk az eredményeket.

  1. Hozzon létre egy új cellát a jegyzetfüzetben, és másolja ki az alábbi kódot. Ezzel a lekérdezéssel szeretnénk megérteni, hogy az átlagos tippösszegek hogyan változtak a kiválasztott időszakban. Ez a lekérdezés további hasznos megállapításokat is segít azonosítani, beleértve a napi minimális/maximális tippmennyiséget és az átlagos viteldíj összegét.

    %%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. A lekérdezés futtatása után a diagram nézetre váltva vizualizálhatjuk az eredményeket. Ez a példa egy vonaldiagramot hoz létre úgy, hogy a day_of_month mezőt kulcsként és avgTipAmount értékként adja meg. Miután elvégezte a kijelöléseket, válassza az Alkalmaz lehetőséget a diagram frissítéséhez.

Adatok vizualizációja

A beépített jegyzetfüzet-diagramkészítési lehetőségek mellett népszerű nyílt forráskódú kódtárakat is használhat saját vizualizációk létrehozásához. Az alábbi példákban a Seaborn és a Matplotlib függvényt fogjuk használni. Ezeket gyakran használják Python-kódtárak adatvizualizációkhoz.

Megjegyzés

Alapértelmezés szerint az Azure Synapse Analytics összes Apache Spark-készlete gyakran használt és alapértelmezett kódtárakat tartalmaz. A kódtárak teljes listáját a Azure Synapse futtatókörnyezet dokumentációjában tekintheti meg. Emellett, ha elérhetővé szeretné tenni a külső vagy helyileg létrehozott kódot az alkalmazások számára, telepíthet egy kódtárat az egyik Spark-készletre.

  1. A fejlesztés megkönnyítése és költségcsökkentése érdekében leállítjuk az adathalmazt. A beépített Apache Spark-mintavételezési képességet fogjuk használni. Emellett mind a Seaborn, mind a Matplotlib használatához Pandas DataFrame vagy NumPy tömb szükséges. A Pandas DataFrame beszerzéséhez használja a toPandas() parancsot a DataFrame konvertálásához.

    # 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. Szeretnénk megérteni az adathalmaz tippjeinek eloszlását. A Matplotlib használatával létrehozunk egy hisztogramot, amely a tippösszeg és a darabszám eloszlását mutatja. Az eloszlás alapján láthatjuk, hogy a tippek a 10 usd-nél kisebb vagy azzal egyenlő összegek felé vannak elmozdulva.

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

    Tippek hisztogramja.

  3. Ezután szeretnénk megérteni az adott utazás tippjei és a hét napja közötti kapcsolatot. A Seaborn használatával létrehozhat egy dobozdiagramot, amely összefoglalja a hét minden napjára vonatkozó trendeket.

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

    Grafikon, amely a tippek napi eloszlását mutatja.

  4. Egy másik hipotézisünk az lehet, hogy pozitív kapcsolat van az utasok száma és a taxis tipp összege között. A kapcsolat ellenőrzéséhez futtassa az alábbi kódot egy dobozdiagram létrehozásához, amely az egyes utasok számához tartozó tippek eloszlását szemlélteti.

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

    Egy dobozos bajuszdiagramot ábrázoló grafikon.

  5. Végül szeretnénk megérteni a viteldíj összege és a tipp összege közötti kapcsolatot. Az eredmények alapján láthatjuk, hogy számos olyan megfigyelés van, ahol az emberek nem tippelnek. A teljes viteldíj és a tipp összege között azonban pozitív kapcsolat is látható.

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

    A csúcsérték pontdiagramja.

A Spark-példány leállítása

Az alkalmazás futtatása után állítsa le a jegyzetfüzetet az erőforrások felszabadításához. Zárja be a lapot, vagy válassza a Munkamenet befejezése lehetőséget a jegyzetfüzet alján található állapotpanelen.

Lásd még

Következő lépések