Analisar dados com Apache Spark
Neste tutorial, você aprenderá a executar a análise de dados exploratórios usando os Azure Open Datasets e o Apache Spark. Em seguida, você pode visualizar os resultados em um notebook do Synapse Studio no Azure Synapse Analytics.
Em particular, analisaremos o conjunto de dados Táxi da cidade de Nova York (NYC). Os dados estão disponíveis por meio dos Conjuntos de Dados em Aberto no Azure. Esse subconjunto do conjunto de dados contém informações sobre as corridas de táxi amarelo: informações sobre cada corrida, a hora de início e de término e os locais, o custo e outros atributos interessantes.
Antes de começar
Crie um Pool do Apache Spark seguindo o tutorial Criar um Pool do Apache Spark.
Baixar e preparar os dados
Crie um notebook usando o kernel do PySpark. Para obter instruções, confira Criar um notebook.
Observação
Por causa do kernel do PySpark, não será necessário criar nenhum contexto explicitamente. O contexto do Spark é criado automaticamente para você ao executar a primeira célula do código.
Neste tutorial, usaremos várias bibliotecas diferentes para nos ajudar a visualizar o conjunto de dados. Para fazer essa análise, importe as seguintes bibliotecas:
import matplotlib.pyplot as plt import seaborn as sns import pandas as pd
Como os dados brutos estão no formato Parquet, você pode usar o contexto do Spark para extrair o arquivo diretamente na memória como um DataFrame. Crie um DataFrame do Spark recuperando os dados por meio da API do Open Datasets. Aqui, usaremos as propriedades do DataFrame do Spark schema on read para inferir os tipos de dados e o esquema.
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())
Depois que os dados forem lidos, convém fazer uma filtragem inicial para limpar o conjunto de dados. Podemos remover colunas desnecessárias e adicionar colunas que extraem informações importantes. Além disso, filtraremos anomalias dentro do conjunto de dados.
# 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")
Analisar dados
Como analista de dados, você tem uma ampla variedade de ferramentas disponíveis para ajudá-lo a extrair informações dos dados. Nesta parte do tutorial, veremos algumas ferramentas úteis disponíveis nos notebooks do Azure Synapse Analytics. Nesta análise, queremos entender os fatores que geram mais gorjetas em táxis no período selecionado.
Comando magic do SQL do Apache Spark
Primeiro, executaremos a análise de dados exploratórios por comandos magic e do SQL do Apache Spark com o notebook do Azure Synapse. Depois que tivermos nossa consulta, veremos os resultados usando o recurso interno chart options
.
No notebook, crie uma nova célula e copie o código a seguir. Ao usar essa consulta, queremos entender como os valores de gorjeta médios mudaram no período selecionado. Essa consulta também nos ajudará a identificar outras informações úteis, incluindo o valor mínimo/máximo da gorjeta por dia e o valor médio da tarifa.
%%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
Depois que nossa consulta terminar a execução, podemos visualizar os resultados alternando para a exibição de gráfico. Este exemplo cria um gráfico de linhas especificando o campo
day_of_month
como a chave eavgTipAmount
como o valor. Depois de fazer as seleções, selecione Aplicar para atualizar o gráfico.
Visualizar dados
Além das opções internas de gráfico de notebook, você pode usar bibliotecas open-source para criar suas próprias visualizações. Nos exemplos a seguir, vamos usar Seaborn e Matplotlib. Essas são bibliotecas do Python comumente usadas para visualização de dados.
Observação
Por padrão, cada pool do Apache Spark no Azure Synapse Analytics contém um conjunto de bibliotecas padrão e comumente usadas. Você pode exibir a lista completa de bibliotecas na documentação Runtime do Azure Synapse. Além disso, para disponibilizar códigos de terceiros ou compilados para seus aplicativos, você pode instalar uma biblioteca em um dos pools do Spark.
Para tornar o desenvolvimento mais fácil e mais barato, vamos reduzir a taxa de amostragem do conjuntos de dados. Vamos usar a funcionalidade interna de amostragem do Apache Spark. Além disso, o Seaborn e o Matplotlib exigem uma matriz NumPy ou DataFrame do Pandas. Para obter um DataFrame do Pandas, use o comando
toPandas()
para converter o DataFrame.# 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()
Queremos entender a distribuição de gorjetas em nosso conjuntos de dados. Vamos usar Matplotlib para criar um histograma que mostra a distribuição da quantidade e da contagem de gorjetas. Com base na distribuição, podemos ver que as gorjetas tendem a valores menores ou iguais a US$ 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()
Em seguida, queremos entender a relação entre as gorjetas de uma determinada viagem e o dia da semana. Use o Seaborn para criar um gráfico de caixa que resuma as tendências de cada dia da semana.
# 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()
Outra hipótese nossa pode ser que haja uma relação positiva entre o número de passageiros e o valor total da gorjeta de táxi. Para verificar essa relação, execute o código a seguir para gerar um gráfico de caixa que ilustra a distribuição de gorjetas para cada contagem de passageiros.
# 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()
Por fim, queremos entender a relação entre o valor da tarifa e o valor da gorjeta. Com base nos resultados, podemos ver que há várias observações em que as pessoas não dão gorjetas. No entanto, também vemos uma relação positiva entre os valores gerais de tarifa e gorjeta.
# 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()
Desligar a instância do Spark
Depois de concluir a execução do aplicativo, encerre o notebook para liberar os recursos. Feche a guia ou selecione Encerrar Sessão na barra de status na parte inferior do notebook.
Confira também
- Visão geral: Apache Spark no Azure Synapse Analytics
- Criar um modelo de machine learning do Apache Spark