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


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

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

Работая с этой статьей, вы выполните следующие задачи:

  • Скачивание и подготовка данных
  • Анализ данных
  • Визуализация данных

Необходимые компоненты

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

Чтобы начать, скачайте набор данных такси Нью-Йорка (NYC) и подготовьте данные.

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

    Примечание.

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

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

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

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

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

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

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

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

Во-первых, выполните анализ аналитических данных с помощью Apache Spark SQL и магических команд с записной книжкой Microsoft Fabric. После выполнения запроса визуализировать результаты с помощью встроенной 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 для визуализации данных.

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

    Снимок экрана: точечная диаграмма количества чаевых.