Modul 2: Menjelajahi dan memvisualisasikan data menggunakan notebook Microsoft Fabric

Lingkungan runtime python di notebook Fabric dilengkapi dengan berbagai pustaka sumber terbuka yang telah diinstal sebelumnya untuk membangun visualisasi seperti matplotlib, seaborn, Plotly, dan banyak lagi.

Penting

Microsoft Fabric saat ini dalam PRATINJAU. Informasi ini berkaitan dengan produk prarilis yang mungkin dimodifikasi secara substansial sebelum dirilis. Microsoft tidak memberikan jaminan, dinyatakan atau tersirat, sehubungan dengan informasi yang diberikan di sini.

Dalam modul ini, kami menggunakan seaborn, yang merupakan pustaka visualisasi data Python yang menyediakan antarmuka tingkat tinggi untuk membangun visual pada dataframe dan array. Untuk informasi selengkapnya tentang seaborn, lihat seaborn: visualisasi data statistik.

Dalam tutorial ini Anda belajar melakukan tindakan berikut:

  1. Membaca data yang disimpan dari tabel delta di lakehouse.

  2. Hasilkan sampel acak dari dataframe.

  3. Konversikan dataframe Spark ke dataframe Pandas, yang didukung pustaka visualisasi python.

  4. Lakukan analisis data eksploratif menggunakan seaborn pada himpunan data taksi kuning New York. Kami melakukan ini dengan memvisualisasikan variabel durasi perjalanan terhadap variabel kategoris dan numerik lainnya.

Ikuti di buku catatan

Perintah/skrip python yang digunakan dalam setiap langkah tutorial ini dapat ditemukan di notebook yang menyertainya; 02-explore-and-visualize-data-using-notebooks.ipynb. Pastikan untuk melampirkan lakehouse ke notebook sebelum mengeksekusinya.

Memvisualisasikan dan menganalisis

  1. Untuk memulai, mari kita baca tabel delta (disimpan dalam modul 1) dari lakehouse dan membuat kerangka data panda pada sampel acak data.

    data = spark.read.format("delta").load("Tables/nyctaxi_raw")
    SEED = 1234
    sampled_df = data.sample(True, 0.001, seed=SEED).toPandas()
    

    Catatan

    Untuk meminimalkan waktu eksekusi, kami menggunakan sampel 1/1000 untuk menjelajahi dan memvisualisasikan data yang diserap.

  2. Impor pustaka dan fungsi yang diperlukan untuk visualisasi, dan atur parameter tema seaborn yang mengontrol estetika visual output seperti gaya, palet warna, dan ukuran visual.

    import seaborn as sns
    import matplotlib.pyplot as plt
    import matplotlib.ticker as mticker
    import numpy as np
    sns.set_theme(style="whitegrid", palette="tab10", rc = {'figure.figsize':(9,6)})
    
  3. Visualisasikan distribusi durasi perjalanan (menit) pada skala linier dan logaritma dengan menjalankan serangkaian perintah berikut.

    ## Compute trip duration(in minutes) on the sample using pandas
    sampled_df['tripDuration'] = (sampled_df['tpepDropoffDateTime'] - sampled_df['tpepPickupDateTime']).astype('timedelta64[m]')
    sampled_df = sampled_df[sampled_df["tripDuration"] > 0]
    
    fig, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.histplot(ax=axes[0],data=sampled_df,
                x="tripDuration",
                stat="count",
                discrete=True).set(title='Distribution of trip duration(minutes)')
    sns.histplot(ax=axes[1],data=sampled_df,
                x="tripDuration",
                stat="count", 
                log_scale= True).set(title='Distribution of trip duration(log scale)')
    axes[1].xaxis.set_major_formatter(mticker.ScalarFormatter())
    

    Cuplikan layar dua bagan untuk memvisualisasikan distribusi durasi perjalanan.

  4. Buat bin untuk memisahkan dan memahami distribusi tripDuration dengan lebih baik. Untuk melakukan ini, buat kolom durationBin menggunakan operasi panda untuk mengklasifikasikan durasi perjalanan ke dalam wadah <10 Menit, 10-30 Menit, 30-60 Menit, 1-2 Jam, 2-4 Jam, dan >4 Jam. Visualisasikan kolom terikat menggunakan plot histogram seaborn.

    ## Create bins for tripDuration column
    sampled_df.loc[sampled_df['tripDuration'].between(0, 10, 'both'), 'durationBin'] = '< 10 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(10, 30, 'both'), 'durationBin'] = '10-30 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(30, 60, 'both'), 'durationBin'] = '30-60 Mins'
    sampled_df.loc[sampled_df['tripDuration'].between(60, 120, 'right'), 'durationBin'] = '1-2 Hrs'
    sampled_df.loc[sampled_df['tripDuration'].between(120, 240, 'right'), 'durationBin'] = '2-4 Hrs'
    sampled_df.loc[sampled_df['tripDuration'] > 240, 'durationBin'] = '> 4 Hrs'
    
    # Plot histogram using the binned column
    sns.histplot(data=sampled_df, x="durationBin", stat="count", discrete=True, hue = "durationBin")
    plt.title("Trip Distribution by Duration Bins")
    plt.xlabel('Trip Duration')
    plt.ylabel('Frequency')
    

    Bagan batang yang memperlihatkan distribusi durasi perjalanan menurut bin durasi.

  5. Visualisasikan distribusi tripDuration dan tripDistance dan klasifikasikan oleh passengerCount menggunakan sebaran seaborn dengan menjalankan perintah di bawah ini.

    sns.scatterplot(data=sampled_df, x="tripDistance", y="tripDuration", hue="passengerCount")
    

    Bagan sebar yang menunjukkan distribusi durasi perjalanan dan jarak perjalanan yang diklasifikasikan oleh jumlah penumpang.

  6. Visualisasikan distribusi keseluruhan kolom passengerCount untuk memahami instans passengerCount yang paling umum dalam perjalanan.

    sns.histplot(data=sampled_df, x="passengerCount", stat="count", discrete=True)
    plt.title("Distribution of passenger count")
    plt.xlabel('No. of Passengers')
    plt.ylabel('Number of trips')
    

    Bagan batang untuk menunjukkan jumlah penumpang yang paling umum dalam perjalanan taksi.

  7. Buat boxplot untuk memvisualisasikan distribusi tripDuration menurut jumlah penumpang. Boxplot adalah alat yang berguna untuk memahami varianabilitas, simetri, dan outlier data.

    # The threshold was calculated by evaluating mean trip duration (~15 minutes) + 3 standard deviations (58 minutes), i.e. roughly 3 hours.
    fig, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.boxplot(ax=axes[0], data=sampled_df, x="passengerCount", y="tripDuration").set(title='Distribution of Trip duration by passengerCount')
    sampleddf_clean = sampled_df[(sampled_df["passengerCount"] > 0) & (sampled_df["tripDuration"] < 189)]
    sns.boxplot(ax=axes[1], data=sampleddf_clean, x="passengerCount", y="tripDuration").set(title='Distribution of Trip duration by passengerCount (outliers removed)')
    

    Pada gambar pertama, kami memvisualisasikan tripDuration tanpa menghapus outlier apa pun sedangkan pada angka kedua kami menghapus perjalanan dengan durasi lebih besar dari 3 jam dan nol penumpang.

    Cuplikan layar dua plot kotak untuk memvisualisasikan durasi perjalanan, satu dengan outlier dan satu tanpa.

  8. Analisis hubungan tripDuration dan fareAmount yang diklasifikasikan oleh paymentType dan VendorId menggunakan sebaran seaborn.

    f, axes = plt.subplots(1, 2, figsize=(18, 6))
    sns.scatterplot(ax =axes[0], data=sampled_df, x="fareAmount", y="tripDuration",  hue="paymentType")
    sns.scatterplot(ax =axes[1],data=sampled_df, x="fareAmount", y="tripDuration",  hue="vendorID")
    plt.title("Distribution of tripDuration by fareAmount")
    plt.show()
    

    Cuplikan layar dua bagan sebar untuk memvisualisasikan hubungan antara durasi perjalanan, tarif, dan jenis pembayaran.

  9. Analisis frekuensi perjalanan taksi per jam dalam sehari menggunakan histogram jumlah perjalanan.

    sampled_df['hour'] = sampled_df['tpepPickupDateTime'].dt.hour
    sampled_df['dayofweek'] = sampled_df['tpepDropoffDateTime'].dt.dayofweek
    sampled_df['dayname'] = sampled_df['tpepDropoffDateTime'].dt.day_name()
    sns.histplot(data=sampled_df, x="hour", stat="count", discrete=True, kde=True)
    plt.title("Distribution by Hour of the day")
    plt.xlabel('Hours')
    plt.ylabel('Count of trips')
    plt.show()
    

    Bagan histogram untuk menunjukkan jumlah perjalanan taksi per jam dalam sehari.

  10. Analisis durasi perjalanan taksi rata-rata berdasarkan jam dan hari bersama-sama dengan menggunakan peta panas seaborn. Sel di bawah ini membuat tabel pivot panda dengan mengelompokkan perjalanan menurut jam dan kolom dayName dan mendapatkan rata-rata nilai tripDuration. Tabel pivot ini digunakan untuk membuat peta panas menggunakan seaborn seperti yang ditunjukkan dalam contoh berikut.

    pv_df = sampled_df[sampled_df["tripDuration"]<180]\
          .groupby(["hour","dayname"]).mean("tripDuration")\
          .reset_index().pivot("hour", "dayname", "tripDuration")
    sns.heatmap(pv_df,annot=True,fmt='.2f', cmap="Blues").set(xlabel=None)
    

    Peta panas di atas tabel panda untuk menunjukkan durasi rata-rata perjalanan menurut jam dan hari.

  11. Terakhir, mari kita buat plot korelasi, yang merupakan alat yang berguna untuk menjelajahi hubungan di antara variabel numerik dalam himpunan data. Ini menampilkan titik data untuk setiap pasangan variabel sebagai scatterplot dan menghitung koefisien korelasi untuk setiap pasangan. Koefisien korelasi menunjukkan seberapa kuat dan ke arah mana variabel terkait. Korelasi positif berarti bahwa variabel cenderung meningkat atau berkurang bersama-sama, sementara korelasi negatif berarti bahwa variabel cenderung bergerak ke arah yang berlawanan. Dalam contoh ini, kami menghasilkan plot korelasi untuk subset kolom dalam dataframe untuk analisis.

    cols_to_corr = ['tripDuration','fareAmount', 'passengerCount', 'tripDistance', 'extra', 'mtaTax',
          'improvementSurcharge', 'tipAmount', 'hour',"dayofweek"]
    sns.heatmap(data = sampled_df[cols_to_corr].corr(),annot=True,fmt='.3f', cmap="Blues")
    

    Tabel plot korelasi yang menunjukkan hubungan antara pasangan variabel perjalanan.

Pengamatan dari analisis data eksplorasi

  • Beberapa perjalanan dalam data sampel memiliki jumlah penumpang 0 tetapi sebagian besar perjalanan memiliki jumlah penumpang antara 1-6.
  • kolom tripDuration memiliki outlier dengan jumlah perjalanan yang relatif kecil yang memiliki tripDuration lebih dari 3 jam.
  • Outlier untuk TripDuration secara khusus hadir untuk vendorId 2.
  • Beberapa perjalanan tidak memiliki jarak perjalanan dan karenanya mereka dapat dibatalkan dan difilter dari pemodelan apa pun.
  • Sejumlah kecil perjalanan tidak memiliki penumpang (0) dan karenanya dapat difilter.
  • Kolom fareAmount berisi outlier negatif, yang dapat dihapus dari pelatihan model.
  • Jumlah perjalanan mulai naik sekitar pukul 16.00 jam dan puncaknya antara pukul 18.00 - 19.00.

Langkah berikutnya