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:
Membaca data yang disimpan dari tabel delta di lakehouse.
Hasilkan sampel acak dari dataframe.
Konversikan dataframe Spark ke dataframe Pandas, yang didukung pustaka visualisasi python.
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
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.
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)})
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())
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')
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")
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')
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.
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()
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()
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)
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")
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.