Compartilhar via


Analisar dados com o Apache Spark e Python

Neste artigo, você aprenderá a executar a análise de dados exploratória usando o Azure Open Datasets e o Apache Spark. Este artigo analisa o conjunto de dados de táxis da cidade de Nova Iorque. 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.

Neste artigo você:

  • Baixar e preparar dados
  • Analisar dados
  • Visualizar dados

Pré-requisitos

Baixar e preparar os dados

Para começar, baixe o conjunto de dados de táxi de Nova Iorque (NYC) e prepare os dados.

  1. Crie um notebook usando o 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.

  2. Neste artigo, você usará várias bibliotecas diferentes para 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
    
  3. Como os dados brutos estão no formato Parquet, você pode usar o contexto spark para efetuar pull do arquivo na memória como um DataFrame diretamente. Use a API do Open Datasets para recuperar os dados e criar um DataFrame do Spark. Para inferir os tipos de dados e o esquema, use as propriedades esquema de leitura do Spark DataFrame.

    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. Depois que os dados forem lidos, faça uma filtragem inicial para limpar o conjunto de dados. Você pode remover colunas desnecessárias e adicionar colunas que extraem informações importantes. Além disso, você pode filtrar 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 artigo, saiba mais sobre algumas ferramentas úteis disponíveis nos notebooks do Microsoft Fabric. Nesta análise, você quer entender os fatores que geram gorjetas de táxi mais altas no período selecionado.

Comando magic do SQL do Apache Spark

Primeiro, faça uma análise exploratória dos dados usando o Apache Spark SQL e os comandos magic com o notebook do Microsoft Fabric. Depois de ter a consulta, visualize os resultados usando a funcionalidade chart options interna.

  1. No notebook, crie uma nova célula e copie o código a seguir. Ao usar esta consulta, você poderá entender como os valores médios de gorjeta mudam ao longo do período selecionado. Essa consulta também ajuda você a identificar outros insights ú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
    
  2. Depois que a consulta terminar de ser executada, você poderá 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 e avgTipAmount como o valor. Depois de fazer as seleções, escolha 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, use Seaborn e Matplotlib, que são bibliotecas Python comumente usadas para visualização de dados.

  1. Para tornar o desenvolvimento mais fácil e menos caro, reduza a resolução do conjunto de dados. Use a funcionalidade de amostragem interna 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()
    
  2. Você pode entender a distribuição de gorjetas no conjunto de dados. Use o Matplotlib para criar um histograma que mostre a distribuição do valor da gorjeta e a contagem. Com base na distribuição, você pode 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()
    

    Captura de tela do histograma que mostra a distribuição do valor da gorjeta.

  3. Em seguida, tente entender a relação entre as gorjetas para 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()
    
    

    Gráfico que mostra a distribuição de gorjetas por dia.

  4. Outra hipótese pode ser que haja uma relação positiva entre o número de passageiros e o valor total da gorjeta do 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()
    

    Gráfico que mostra um diagrama de caixa de bigodes do valor da gorjeta por contagem de passageiros.

  5. Por fim, explore a relação entre o valor da tarifa e o valor da gorjeta. Com base nos resultados, você poderá ver que há várias observações onde as pessoas não dão gorjeta. No entanto, há uma relação positiva entre o valor total da tarifa e o valor das gorjetas.

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

    Captura de tela do gráfico de dispersão do valor da gorjeta.