Partager via


Analyser les données avec Apache Spark et Python

Dans cet article, vous allez découvrir comment effectuer une analyse exploratoire des données à l’aide d’Azure Open Datasets et d’Apache Spark. Cet article analyse le jeu de données de taxis de New York City. Les données sont disponibles dans Azure Open Datasets. Ce sous-ensemble du jeu de données contient des données sur les courses de taxis jaunes, qui incluent des informations sur chaque course, les heures et lieux de départ et d’arrivée, le prix et d’autres attributs intéressants.

Dans cet article, vous découvrirez comment :

  • Télécharger et préparer les données
  • Analyser des données
  • Visualiser les données

Prérequis

Télécharger et préparer les données

Pour commencer, téléchargez le jeu de données New York City (NYC) Taxi et préparez les données.

  1. Créez un bloc-notes à l’aide de PySpark. Pour obtenir des instructions, consultez Créer un notebook.

    Notes

    Grâce au noyau PySpark, il est inutile de créer des contextes explicitement. Le contexte Spark est créé automatiquement pour vous lorsque vous exécutez la première cellule de code.

  2. Dans cet article, vous utilisez différentes bibliothèques pour visualiser le jeu de données. Pour effectuer cette analyse, importez les bibliothèques suivantes :

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. Comme les données brutes sont au format Parquet, vous pouvez utiliser le contexte Spark pour extraire le fichier en mémoire directement en tant que DataFrame. Utilisez l’API Open Datasets pour récupérer les données et créer un DataFrame Spark. Pour déduire les types de données et le schéma, utilisez les propriétés de schéma lors de la lecture du DataFrame 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. Une fois les données lues, effectuez un premier filtrage pour nettoyer le jeu de données. Vous pouvez supprimer les colonnes inutiles et ajouter des colonnes supplémentaires qui extraient des informations importantes. Vous pouvez également filtrer les anomalies dans le jeu de données.

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

Analyser des données

En tant qu’analyste de données, vous disposez d’un large éventail d’outils pour vous aider à extraire des informations à partir de ces données. Dans cette partie de l’article, vous allez découvrir quelques outils utiles disponibles dans les notebooks Microsoft Fabric. Dans cette analyse, vous souhaitez comprendre les facteurs qui donnent lieu à des pourboires plus élevés pour la période sélectionnée.

Magic SQL Apache Spark

Tout d'abord, effectuez une analyse exploratoire des données à l’aide d’Apache Spark SQL et de commandes magiques avec le notebook Microsoft Fabric. Une fois que vous avez la requête, visualisez les résultats à l’aide de la capacité chart options intégrée.

  1. Dans le notebook, créez une cellule et copiez le code suivant. À l’aide de cette requête, vous pouvez comprendre la façon dont les montants moyens des pourboires changent au cours de la période sélectionnée. Cette requête vous aide également à identifier d’autres insights utiles, notamment le montant minimal/maximal d’un pourboire par jour et le montant moyen des courses.

    %%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. Une fois l’exécution de la requête terminée, vous pouvez visualiser les résultats en basculant vers la vue graphique. Dans cet exemple, nous allons créer un graphique en courbes en spécifiant le champ day_of_month comme clé et avgTipAmount comme valeur. Une fois que vous avez effectué les sélections, sélectionnez Appliquer pour actualiser votre graphique.

Visualiser les données

Outre les options intégrées de création de graphiques du notebook, vous pouvez utiliser des bibliothèques open source populaires pour créer vos propres visualisations. Dans les exemples suivants, utilisez Seaborn et Matplotlib, qui sont des bibliothèques Python couramment utilisées pour la visualisation des données.

  1. Pour faciliter le développement et le rendre moins onéreux, réduisez l’échantillon de jeu de données. Utilisez la capacité intégrée d’échantillonnage Apache Spark. En outre, Seaborn et Matplotlib nécessitent un DataFrame Pandas ou un tableau NumPy. Pour obtenir un DataFrame Pandas, utilisez la commande toPandas() pour convertir notre 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. Vous pouvez comprendre la distribution des pourboires dans le jeu de données. Utilisez Matplotlib pour créer un histogramme montrant la répartition de la quantité et du nombre de pourboires. Sur la base de la distribution, vous pouvez voir que les pourboires sont biaisés autour de montants inférieurs ou égaux à 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()
    

    Capture d’écran de l’histogramme montrant la distribution du montant du pourboire.

  3. Ensuite, essayez de comprendre la relation entre les pourboires pour un trajet donné et le jour de la semaine. Utilisez Seaborn pour créer un diagramme à surfaces résumant les tendances pour chaque jour de la semaine.

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

    Graphique montrant la répartition des pourboires par jour.

  4. Une autre hypothèse est qu’il existe une relation positive entre le nombre de passagers et le montant total du pourboire des taxis. Pour vérifier cette relation, exécutez le code suivant pour générer un diagramme à surfaces illustrant la répartition des pourboires pour chaque nombre de passagers.

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

    Graphique en boîte à moustaches du pourboire en fonction du nombre de passagers.

  5. Pour finir, explorez la relation entre le montant de la course et le montant du pourboire. Sur la base des résultats, vous pouvez constater qu’il y a plusieurs observations où les gens ne donnent pas de pourboire. Cependant, il existe une relation positive entre le prix global de la course et le montant du pourboire.

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

    Capture d'écran du nuage de points du montant du pourboire.