Udostępnij za pośrednictwem


Analizowanie danych przy użyciu platformy Apache Spark i języka Python

Z tego artykułu dowiesz się, jak wykonywać eksploracyjne analizy danych przy użyciu zestawów danych Platformy Azure Open i platformy Apache Spark. W tym artykule przedstawiono analizę zestawu danych taksówek w Nowym Jorku. Dane są dostępne za pośrednictwem usługi Azure Open Datasets. Ten podzestaw zestawu danych zawiera informacje o żółtych przejazdach taksówkami: informacje o każdej podróży, godzinie rozpoczęcia i zakończenia oraz lokalizacjach, kosztach i innych interesujących atrybutach.

W tym artykule opisano następujące zagadnienia:

  • Pobieranie i przygotowywanie danych
  • Analizowanie danych
  • Wizualizowanie danych

Wymagania wstępne

Pobieranie i przygotowywanie danych

Aby rozpocząć, pobierz zestaw danych New York City (NYC) Taxi i przygotuj dane.

  1. Utwórz notes przy użyciu narzędzia PySpark. Aby uzyskać instrukcje, zobacz Tworzenie notesu.

    Uwaga

    Ze względu na jądro PySpark nie trzeba jawnie tworzyć żadnych kontekstów. Kontekst platformy Spark jest automatycznie tworzony podczas uruchamiania pierwszej komórki kodu.

  2. W tym artykule użyjesz kilku różnych bibliotek, aby ułatwić wizualizowanie zestawu danych. Aby wykonać tę analizę, zaimportuj następujące biblioteki:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Ponieważ dane pierwotne są w formacie Parquet, możesz użyć kontekstu platformy Spark, aby bezpośrednio ściągnąć plik do pamięci jako ramkę danych. Użyj interfejsu API Otwórz zestawy danych, aby pobrać dane i utworzyć ramkę danych platformy Spark. Aby wywnioskować typy danych i schemat, użyj schematu ramki danych Spark we właściwościach odczytu .

    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 odczytaniu danych wykonaj wstępne filtrowanie, aby wyczyścić zestaw danych. Możesz usunąć niepotrzebne kolumny i dodać kolumny, które wyodrębnią ważne informacje. Ponadto można odfiltrować anomalie w zestawie danych.

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

Analizowanie danych

Jako analityk danych masz szeroką gamę narzędzi, które ułatwiają wyodrębnianie szczegółowych informacji z danych. W tej części artykułu dowiesz się więcej o kilku przydatnych narzędziach dostępnych w notesach usługi Microsoft Fabric. W tej analizie chcesz zrozumieć czynniki, które dają wyższe porady dotyczące taksówek dla wybranego okresu.

Apache Spark SQL Magic

Najpierw wykonaj eksploracyjne analizy danych przy użyciu języka Apache Spark SQL i poleceń magic z notesem usługi Microsoft Fabric. Po wykonaniu zapytania zwizualizuj wyniki przy użyciu wbudowanej chart options funkcji.

  1. W notesie utwórz nową komórkę i skopiuj następujący kod. Korzystając z tego zapytania, możesz zrozumieć, jak zmieniają się średnie kwoty porad w wybranym okresie. To zapytanie pomaga również zidentyfikować inne przydatne szczegółowe informacje, w tym minimalną/maksymalną kwotę porad dziennie i średnią kwotę taryfy.

    %%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 zakończeniu działania zapytania możesz zwizualizować wyniki, przełączając się do widoku wykresu. W tym przykładzie tworzony jest wykres liniowy, określając day_of_month pole jako klucz i avgTipAmount jako wartość. Po wybraniu zaznaczenia wybierz pozycję Zastosuj , aby odświeżyć wykres.

Wizualizowanie danych

Oprócz wbudowanych opcji tworzenia wykresów notesów można tworzyć własne wizualizacje przy użyciu popularnych bibliotek typu open source. W poniższych przykładach użyj bibliotek Seaborn i Matplotlib, które są często używane biblioteki języka Python do wizualizacji danych.

  1. Aby ułatwić tworzenie i obniżanie kosztów tworzenia, należy obniżyć poziom próbkowania zestawu danych. Użyj wbudowanej funkcji próbkowania platformy Apache Spark. Ponadto zarówno biblioteki Seaborn, jak i Matplotlib wymagają tablicy Pandas DataFrame lub NumPy. Aby uzyskać ramkę danych biblioteki Pandas, użyj toPandas() polecenia , aby przekonwertować ramkę danych.

    # 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. Możesz zrozumieć dystrybucję porad w zestawie danych. Użyj biblioteki Matplotlib, aby utworzyć histogram pokazujący rozkład ilości i liczby porad. Na podstawie rozkładu można zobaczyć, że wskazówki są niesymetryczne w stosunku do kwot mniejszych lub równych 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()
    

    Zrzut ekranu przedstawiający histogram przedstawiający rozkład ilości porad.

  3. Następnie spróbuj zrozumieć relację między poradami dotyczącymi danej podróży a dniem tygodnia. Użyj platformy Seaborn, aby utworzyć wykres skrzynkowy, który podsumowuje trendy dla każdego dnia tygodnia.

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

    Wykres przedstawiający rozkład porad dziennie.

  4. Inną hipotezą może być to, że istnieje pozytywny związek między liczbą pasażerów a całkowitą kwotą porad taksówki. Aby zweryfikować tę relację, uruchom następujący kod, aby wygenerować wykres skrzynkowy ilustrujący rozkład wskazówek dla każdej liczby pasażerów.

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

    Wykres przedstawiający wykres wąsowy pola ilości porad według liczby pasażerów.

  5. Na koniec zapoznaj się z relacją między kwotą taryfy a kwotą porad. Na podstawie wyników widać, że istnieje kilka obserwacji, w których ludzie nie przechylają się. Jednak istnieje pozytywna relacja między ogólną taryfą a kwotami porad.

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

    Zrzut ekranu przedstawiający wykres punktowy ilości porad.