Partilhar via


Analise dados com Apache Spark e Python

Neste artigo, você aprenderá a executar a análise exploratória de dados usando o Azure Open Datasets e o Apache Spark. Este artigo analisa o conjunto de dados de táxis da cidade de Nova York. Os dados estão disponíveis através dos Conjuntos de Dados Abertos do Azure. Este subconjunto do conjunto de dados contém informações sobre viagens de táxi amarelo: informações sobre cada viagem, a hora e locais de início e fim, o custo e outros atributos interessantes.

Neste artigo, irá:

  • Transferir e preparar dados
  • Analisar dados
  • Visualizar os dados

Pré-requisitos

  • Obtenha uma assinatura do Microsoft Fabric. Ou inscreva-se para uma avaliação gratuita do Microsoft Fabric.

  • Entre no Microsoft Fabric.

  • Use o seletor de experiência no canto inferior esquerdo da página inicial para alternar para o Fabric.

    Captura de tela do menu do seletor de experiência, mostrando onde selecionar Ciência de Dados.

Faça o download e prepare os dados

Para começar, faça o download do conjunto de dados do New York City (NYC) Taxi e prepare os dados.

  1. Crie um bloco de anotações usando o PySpark. Para obter instruções, consulte Criar um bloco de anotações.

    Nota

    Devido ao kernel do PySpark, você não precisa criar nenhum contexto explicitamente. O contexto do Spark é criado automaticamente para você quando você executa a primeira célula de código.

  2. Neste artigo, você usa 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 do Spark para puxar o arquivo para a memória como um DataFrame diretamente. Use a API Open Datasets para recuperar os dados e criar um Spark DataFrame. Para inferir os tipos de dados e o esquema, use o esquema Spark DataFrame nas propriedades de leitura .

    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 gama de ferramentas disponíveis para ajudá-lo a extrair insights dos dados. Nesta parte do artigo, conheça algumas ferramentas úteis disponíveis nos blocos de anotações do Microsoft Fabric. Nesta análise, você quer entender os fatores que rendem maiores gorjetas de táxi para o período selecionado.

Apache Spark SQL Magic

Primeiro, faça a análise exploratória de dados usando o Apache Spark SQL e comandos mágicos com o notebook Microsoft Fabric. Depois de ter a consulta, visualize os resultados usando o recurso interno chart options .

  1. No bloco de anotações, crie uma nova célula e copie o código a seguir. Usando essa consulta, você pode entender como os valores médios de gorjetas mudam ao longo do período selecionado. Esta consulta também ajuda 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 visualização de gráfico. Este exemplo cria um gráfico de linhas especificando o day_of_month campo como a chave e avgTipAmount como o valor. Depois de fazer as seleções, selecione Aplicar para atualizar o gráfico.

Visualizar os dados

Além das opções de gráficos de bloco de anotações integradas, você pode usar bibliotecas de código aberto populares 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 dispendioso, reduza a resolução do conjunto de dados. Use o recurso de amostragem integrado do Apache Spark. Além disso, tanto Seaborn quanto Matplotlib exigem uma matriz Pandas DataFrame ou NumPy. Para obter um Pandas DataFrame, use o toPandas() comando 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 dicas no conjunto de dados. Use Matplotlib para criar um histograma que mostre a distribuição da quantidade e contagem de pontas. Com base na distribuição, você pode ver que as gorjetas são inclinadas para valores menores ou iguais a $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 da quantidade de dicas.

  3. Em seguida, tente entender a relação entre as dicas para uma determinada viagem e o dia da semana. Use Seaborn para criar um box plot que resume as tendências para 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 das gorjetas por dia.

  4. Outra hipótese pode ser a de que exista 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 dicas 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 gráfico de caixa whisker do valor da ponta por contagem de passageiros.

  5. Por último, explore a relação entre o valor da tarifa e o valor da gorjeta. Com base nos resultados, você pode ver que há várias observações em que as pessoas não dão gorjetas. No entanto, há uma relação positiva entre a tarifa geral e os valores 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 da quantidade da dica.