Compartir a través de


Análisis de datos con Apache Spark

En este tutorial, aprenderá a realizar análisis de datos exploratorios mediante Azure Open Datasets y Apache Spark. Después, puede visualizar los resultados en un cuaderno de Synapse Studio en Azure Synapse Analytics.

En concreto, analizaremos el conjunto de datos de taxis de la ciudad de Nueva York (NYC). Los datos están disponibles a través de Azure Open Datasets. Este subconjunto del conjunto de datos contiene información sobre los viajes de los taxis amarillos: información sobre cada viaje, la hora, la ubicación de inicio y de fin, el coste de la carrera y otros atributos interesantes.

Antes de empezar

Cree un grupo de Apache Spark siguiendo el tutorial Creación de un grupo de Apache Spark.

Descarga y preparación de los datos

  1. Cree un cuaderno mediante el kernel de PySpark. Para obtener instrucciones, consulte Creación de un cuaderno.

    Nota:

    Debido a la existencia del kernel PySpark, no necesitará crear ningún contexto explícitamente. El contexto de Spark se crea automáticamente al ejecutar la primera celda de código.

  2. En este tutorial, usaremos varias bibliotecas diferentes para ayudarnos a visualizar el conjunto de datos. Para realizar este análisis, importe las siguientes bibliotecas:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Dado que los datos sin procesar están en formato de Parquet, puede usar el contexto de Spark para extraer el archivo a la memoria como trama de datos directamente. Cree un dataFrame de Spark recuperando los datos a través de open Datasets API. Aquí, usamos el esquema DataFrame de Spark en las propiedades de lectura para deducir los tipos de datos y el 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)
    df = spark.createDataFrame(nyc_tlc.to_pandas_dataframe())
    
    
  4. Una vez leídos los datos, queremos realizar algún filtrado inicial para limpiar el conjunto de datos. Es posible que se quiten las columnas innecesarias y se agreguen columnas que extraigan información importante. Además, filtraremos las anomalías dentro del conjunto de datos.

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

Análisis de datos

Los analistas de datos disponen de una amplia gama de herramientas que pueden ayudarles a extraer información de los datos. En esta parte del tutorial, le guiaremos por algunas herramientas útiles disponibles en cuadernos de Azure Synapse Analytics. En este análisis, queremos comprender los factores que producen mayores propinas de taxi para nuestro período seleccionado.

Apache Spark SQL Magic

En primer lugar, realizaremos análisis exploratorios de datos mediante Apache Spark SQL y comandos mágicos con el cuaderno de Azure Synapse. Una vez que tengamos nuestra consulta, visualizaremos los resultados mediante la funcionalidad integrada chart options .

  1. En el cuaderno, cree una nueva celda y copie el código siguiente. Con esta consulta, queremos comprender cómo han cambiado las cantidades medias de propinas durante el período seleccionado. Esta consulta también nos ayudará a identificar otras conclusiones útiles, incluido el importe mínimo o máximo de propinas al día y el importe medio de la 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. Una vez finalizada la ejecución de la consulta, podemos visualizar los resultados cambiando a la vista de gráfico. En este ejemplo se crea un gráfico de líneas mediante la especificación del campo day_of_month como la clave y avgTipAmount como el valor. Después de realizar las selecciones, seleccione Aplicar para actualizar el gráfico.

Visualización de datos

Además de las opciones de gráficos integradas del cuaderno, puede usar bibliotecas de código abierto populares para crear sus propias visualizaciones. En los ejemplos siguientes, usaremos Seaborn y Matplotlib. Normalmente se usan bibliotecas de Python para la visualización de datos.

Nota:

De forma predeterminada, cada grupo de Apache Spark de Azure Synapse Analytics contiene un conjunto de bibliotecas usadas y predeterminadas. Puede ver la lista completa de bibliotecas en la documentación del entorno de ejecución de Azure Synapse . Además, para que el código de terceros o compilado localmente esté disponible para las aplicaciones, puede instalar una biblioteca en uno de los grupos de Spark.

  1. Para facilitar y reducir el costo del desarrollo, reduciremos el conjunto de datos. Usaremos la funcionalidad de muestreo integrada de Apache Spark. Además, tanto Seaborn como Matplotlib requieren un DataFrame de Pandas o una matriz de NumPy. Para obtener un DataFrame de Pandas, usaremos el comando toPandas() para convertir dicho 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. Queremos comprender la distribución de propinas en nuestro conjunto de datos. Usaremos Matplotlib para crear un histograma que muestre la distribución de la cantidad y el recuento de propinas. En función de la distribución, podemos ver que las propinas están inclinadas hacia cantidades inferiores o iguales a 10 USD.

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

    Histograma de propinas.

  3. A continuación, queremos comprender la relación entre las sugerencias para un viaje determinado y el día de la semana. Usamos Seaborn para crear un diagrama de cajas que resume las tendencias de cada día de la 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 muestra la distribución de propinas por día.

  4. Otra hipótesis de nuestra puede ser que haya una relación positiva entre el número de pasajeros y la cantidad total de propinas de taxi. Para comprobar esta relación, ejecutamos el siguiente código para generar un diagrama de cajas que ilustra la distribución de las propinas por número de pasajeros.

    # 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 muestra un diagrama de cajas y bigotes.

  5. Por último, queremos comprender la relación entre el importe de la tarifa y el importe de la propina. En función de los resultados, podemos ver que hay varios casos en los que las personas no dejan propina. Sin embargo, también vemos una relación positiva entre las tarifas generales y las cantidades de propinas.

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

    Gráfico de dispersión de la cantidad de propina.

Apagado de la instancia de Spark

Una vez finalizada la ejecución de la aplicación, cierre el cuaderno para liberar los recursos. Cierre la pestaña o seleccione Finalizar sesión en el panel de estado de la parte inferior del cuaderno.

Consulte también

Pasos siguientes