Поделиться через


Анализ данных с помощью Apache Spark

Из этого учебника вы узнаете, как выполнять исследовательский анализ данных с помощью Открытых наборов данных Azure и Apache Spark. Затем можно визуализировать результаты в записной книжке Synapse Studio в Azure Synapse Analytics.

В частности, вы проанализируете набор данных о такси Нью-Йорка. Данные доступны через открытые наборы данных Azure. Это подмножество набора данных содержит сведения о поездках на такси: информацию о каждой поездке, времени начала и окончания и расположениях, стоимости и других интересных атрибутах.

Подготовка к работе

Создайте пул Apache Spark, выполнив инструкции из этого руководства.

Скачивание и подготовка данных

  1. Создайте записную книжку, используя ядро PySpark. Инструкции см. в разделе Создание записной книжки.

    Примечание

    Ядро PySpark позволяет не задавать контексты явным образом. Контекст Spark будет создан автоматически при выполнении первой ячейки кода.

  2. В этом учебнике мы будем использовать несколько различных библиотек, которые помогут нам визуализировать набор данных. Чтобы выполнить этот анализ, импортируйте следующие библиотеки:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Так как необработанные данные имеют формат Parquet, вы можете использовать контекст Spark, чтобы извлечь файл в память напрямую в виде кадра данных. Создайте DataFrame в Spark, получив данные с помощью API Открытых наборов данных. Здесь мы будем использовать свойства схемы при чтении для кадра данных Spark, чтобы определить типы и схему данных.

     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. После считывания данных необходимо выполнить начальную фильтрацию для очистки набора данных. При этом можно удалить ненужные столбцы и добавить те, в которые извлекаются важные сведения. Кроме того, необходимо отфильтровать аномалии в наборе данных.

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

Анализ данных

Аналитикам данных доступен широкий спектр средств, позволяющих извлекать ценные сведения из данных. В этой части учебника мы рассмотрим несколько полезных средств, доступных в записных книжках Azure Synapse Analytics. В результате этого анализа необходимо понять, какие факторы способствовали повышению чаевых за такси за выбранный период.

Магические команды Apache Spark SQL

Для начала мы выполним исследовательский анализ данных с помощью магических команд Apache Spark SQL, используя записную книжку Azure Synapse. После выполнения запроса мы визуализируем результаты с помощью встроенной возможности chart options.

  1. В записной книжке создайте новую ячейку и скопируйте в нее следующий код. С помощью этого запроса мы хотим понять, как менялся средний размер чаевых в течение выбранного периода. Этот запрос также поможет нам определить другие аналитические сведения, в том числе минимальную и максимальную сумму чаевых в день и среднюю стоимость поездки.

    %%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. После завершения выполнения запроса можно визуализировать результаты, переключившись на представление диаграммы. В этом примере для создания графика поле day_of_month задается в качестве ключа, а поле avgTipAmount — в качестве значения. После выбора параметров нажмите кнопку Применить, чтобы обновить диаграмму.

Визуализируйте данные

Помимо встроенных параметров создания диаграмм для записных книжек, вы можете использовать популярные библиотеки с открытым кодом для создания собственных визуализаций. В следующих примерах мы будем использовать Seaborn и Matplotlib. Это часто используемые библиотеки Python для визуализации данных.

Примечание

По умолчанию каждый пул Apache Spark в Azure Synapse Analytics содержит набор часто используемых и стандартных библиотек. Полный список библиотек можно просмотреть в документации по среде выполнения Azure Synapse. Кроме того, чтобы сделать написанный сторонними или собственными разработчиками код доступным для приложений, можно установить библиотеку в одном из пулов Spark.

  1. Чтобы упростить процесс разработки и снизить расходы, мы сократим этот набор данных. Для этого мы будем использовать встроенную возможность выборки Apache Spark. Кроме того, для Seaborn и Matplotlib требуется кадр данных Pandas или массив NumPy. Чтобы получить кадр данных Pandas, используйте команду toPandas() для преобразования кадра данных.

    # 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. Нам необходимо понять, как распределены чаевые в нашем наборе данных. Мы будем использовать Matplotlib для создания гистограммы, показывающей распределение суммы чаевых и их количества. Распределение указывает на то, что суммы чаевых преимущественно не превышают 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()
    

    Гистограмма чаевых.

  3. Далее мы хотим понять связь между чаевыми для определенной поездки и днем недели. Воспользуйтесь Seaborn, чтобы создать блочную диаграмму, на которой подытожены тенденции за каждый день недели.

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

    График, на котором показано распределение чаевых по дням.

  4. Другой гипотезой может быть наличие положительной связи между числом пассажиров и общей суммой чаевых за такси. Чтобы проверить эту связь, выполните следующий код, который создаст блочную диаграмму, иллюстрирующую распределение чаевых по числу пассажиров.

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

    График, на котором показана блочная диаграмма

  5. Наконец, мы хотим понять связь между стоимостью поездки и суммой чаевых. На основе результатов можно прийти к выводу, что наблюдается ряд ситуаций, в которых люди не дают чаевые. Однако также наблюдается положительная связь между общей стоимостью поездки и суммами чаевых.

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

    Точечная диаграмма сумм чаевых.

Завершение работы экземпляра Spark

По окончании использования приложения завершите работу записной книжки и освободите ресурсы. Можно закрыть вкладку или выбрать элемент Завершить сеанс в строке состояния в нижней части записной книжки.

См. также раздел

Дальнейшие действия