Latihan - Membersihkan dan menyiapkan data

Selesai

Sebelum dapat menyiapkan himpunan data, Anda perlu memahami konten dan strukturnya. Di lab sebelumnya, Anda mengimpor kumpulan data yang berisi informasi kedatangan tepat waktu untuk maskapai besar AS. Data tersebut mencakup 26 kolom dan ribuan baris, setiap baris mewakili satu penerbangan dan berisi informasi seperti asal penerbangan, tujuan, dan waktu keberangkatan terjadwal. Anda juga memuat data ke dalam buku catatan Jupyter dan menggunakan skrip Python sederhana untuk membuat Pandas DataFrame darinya.

DataFrame adalah struktur data berlabel dua dimensi. Kolom dalam DataFrame dapat memiliki tipe yang berbeda, seperti kolom dalam tabel spreadsheet atau database. Ini adalah objek yang paling umum digunakan di Pandas. Dalam latihan ini, Anda akan memeriksa DataFrame — dan data di dalamnya — secara lebih dekat.

  1. Beralih kembali ke buku catatan Azure yang Anda buat di bagian sebelumnya. Jika Anda menutup buku catatan, Anda bisa masuk kembali ke portal Notebooks, buka buku catatan Anda dan gunakan Sel ->Jalankan Semua untuk menjalankan ulang semua sel di buku catatan setelah membukanya.

    The FlightData notebook.

    Notebook FlightData

  2. Kode yang Anda tambahkan ke buku catatan di lab sebelumnya membuat DataFrame dari flightdata.csv dan memanggil DataFrame.head untuk menampilkan lima baris pertama. Salah satu hal pertama yang biasanya ingin Anda ketahui tentang himpunan data adalah jumlah baris yang dimilikinya. Untuk mendapatkan hitungan, ketik pernyataan berikut ke dalam sel kosong di akhir buku catatan dan jalankan:

    df.shape
    

    Konfirmasikan bahwa DataFrame berisi 11.231 baris dan 26 kolom:

    Getting a row and column count.

    Mendapatkan jumlah baris dan kolom

  3. Sekarang luangkan waktu sejenak untuk memeriksa 26 kolom dalam himpunan data. Kolom berisi informasi penting seperti tanggal penerbangan berlangsung (YEAR, MONTH, dan DAY_OF_MONTH), asal dan tujuan (ORIGIN dan DEST), waktu keberangkatan dan kedatangan yang dijadwalkan (CRS_DEP_TIME dan CRS_ARR_TIME), perbedaan antara waktu kedatangan terjadwal dan waktu kedatangan aktual dalam menit (ARR_DELAY), dan apakah penerbangan terlambat 15 menit atau lebih (ARR_DEL15).

    Berikut adalah daftar lengkap kolom dalam himpunan data. Waktu dinyatakan dalam waktu militer 24 jam. Misalnya, 1130 sama dengan 11:30 dan 1500 sama dengan 15:00.

    Kolom Deskripsi
    YEAR Tahun penerbangan berlangsung
    KUARTAL Kuartal penerbangan berlangsung (1-4)
    MONTH Bulan penerbangan berlangsung (1-12)
    HARI_DALAM_SEBULAN Hari dalam sebulan penerbangan berlangsung (1-31)
    DAY_OF_WEEK Hari dalam seminggu penerbangan berlangsung (1=Senin, 2=Selasa, dll.)
    UNIQUE_CARRIER Kode operator maskapai (misalnya, DL)
    TAIL_NUM Nomor ekor pesawat
    FL_NUM Nomor penerbangan
    ORIGIN_AIRPORT_ID ID bandara asal
    ORIGIN Kode bandara asal (ATL, DFW, SEA, dll.)
    DEST_AIRPORT_ID ID bandara tujuan
    DEST Kode bandara tujuan (ATL, DFW, SEA, dll.)
    CRS_DEP_TIME Waktu keberangkatan terjadwal
    DEP_TIME Waktu keberangkatan aktual
    DEP_DELAY Jumlah menit keberangkatan tertunda
    DEP_DEL15 0=Keberangkatan tertunda selama kurang dari 15 menit, 1=Keberangkatan tertunda selama 15 menit atau lebih
    CRS_ARR_TIME Waktu kedatangan terjadwal
    ARR_TIME Waktu kedatangan aktual
    ARR_DELAY Jumlah menit penerbangan datang terlambat
    ARR_DEL15 0=Terlambat datang selama kurang dari 15 menit, 1=Terlambat datang selama 15 menit atau lebih
    CANCELLED 0=Penerbangan tidak dibatalkan, 1=Penerbangan dibatalkan
    DIVERTED 0=Penerbangan tidak dialihkan, 1=Penerbangan dialihkan
    CRS_ELAPSED_TIME Waktu penerbangan terjadwal dalam menit
    ACTUAL_ELAPSED_TIME Waktu penerbangan aktual dalam hitungan menit
    DISTANCE Jarak yang ditempuh dalam mil

Himpunan data mencakup distribusi tanggal yang kira-kira merata sepanjang tahun, hal penting karena penerbangan keluar dari Minneapolis cenderung tidak akan tertunda karena alasan badai musim dingin pada bulan Juli daripada di bulan Januari. Tetapi himpunan data ini jauh dari "bersih" dan siap digunakan. Mari kita tulis beberapa kode Pandas untuk membersihkannya.

Salah satu aspek terpenting dalam menyiapkan himpunan data untuk digunakan dalam pembelajaran mesin adalah memilih kolom "fitur" yang relevan dengan hasil yang Anda coba prediksi saat memfilter kolom yang tidak memengaruhi hasil, dapat membuat bias dengan cara negatif, atau mungkin menghasilkan multikolineritas. Tugas penting lainnya adalah menghilangkan nilai yang hilang, baik dengan menghapus baris atau kolom yang memuatnya atau menggantinya dengan nilai yang bermakna. Dalam latihan ini, Anda akan menghilangkan kolom asing dan mengganti nilai yang hilang di kolom yang tersisa.

  1. Salah satu hal pertama yang biasanya dicari oleh ilmuwan data dalam himpunan data adalah nilai yang hilang. Ada cara mudah untuk memeriksa nilai yang hilang di Pandas. Untuk memperlihatkannya, jalankan kode berikut dalam sel di akhir buku catatan:

    df.isnull().values.any()
    

    Konfirmasikan bahwa outputnya adalah "Benar", yang menunjukkan bahwa setidaknya ada satu nilai yang hilang di suatu tempat dalam himpunan data.

    Checking for missing values.

    Memeriksa nilai yang hilang

  2. Langkah selanjutnya adalah mencari tahu keberadaan nilai yang hilang. Untuk melakukannya, jalankan kode berikut:

    df.isnull().sum()
    

    Konfirmasi bahwa Anda melihat output berikut mencantumkan jumlah nilai yang hilang di setiap kolom:

    Number of missing values in each column.

    Jumlah nilai yang hilang di setiap kolom

  3. Anehnya, kolom ke-26 ("Tidak Bernama: 25") berisi 11.231 nilai yang hilang, angka tersebut sama dengan jumlah baris dalam himpunan data. Kolom ini salah dibuat karena file CSV yang Anda impor berisi koma di akhir setiap baris. Untuk menghilangkan kolom tersebut, tambahkan kode berikut ke buku catatan dan jalankan:

    df = df.drop('Unnamed: 25', axis=1)
    df.isnull().sum()
    

    Periksa output dan konfirmasikan bahwa kolom 26 telah menghilang dari DataFrame:

    The DataFrame with column 26 removed.

    DataFrame dengan kolom 26 dihapus

  4. DataFrame masih berisi banyak nilai yang hilang, tetapi beberapa di antaranya tidak berguna karena kolom yang memuatnya tidak relevan dengan model yang Anda bangun. Tujuan dari model tersebut adalah memprediksi apakah penerbangan yang Anda pertimbangkan untuk pesan cenderung tiba tepat waktu. Jika Anda tahu bahwa penerbangan kemungkinan terlambat, Anda mungkin memilih untuk memesan penerbangan lain.

    Oleh karena itu, langkah selanjutnya adalah memfilter himpunan data untuk menghilangkan kolom yang tidak relevan dengan model prediktif. Misalnya, nomor ekor pesawat mungkin tidak banyak berpengaruh pada ketepatan waktu tiba penerbangan pesawat, dan pada saat Anda memesan tiket, Anda tidak memiliki cara untuk mengetahui apakah penerbangan akan dibatalkan, dialihkan, atau ditunda. Sebaliknya, waktu keberangkatan terjadwal dapat memiliki banyak kaitan dengan kedatangan tepat waktu. Karena sistem hub-and-spoke yang digunakan oleh sebagian besar maskapai penerbangan, penerbangan pagi cenderung lebih tepat waktu daripada penerbangan sore atau malam. Dan di beberapa bandara besar, tumpukan lalu lintas pada siang hari meningkatkan kemungkinan bahwa nantinya penerbangan akan tertunda.

    Pandas menyediakan cara mudah untuk memfilter kolom yang tidak Anda inginkan. Jalankan kode berikut di sel baru di akhir buku catatan:

    df = df[["MONTH", "DAY_OF_MONTH", "DAY_OF_WEEK", "ORIGIN", "DEST", "CRS_DEP_TIME", "ARR_DEL15"]]
    df.isnull().sum()
    

    Output menunjukkan bahwa DataFrame sekarang hanya menyertakan kolom yang relevan dengan model, dan bahwa jumlah nilai yang hilang sangat berkurang:

    The filtered DataFrame.

    DataFrame yang difilter

  5. Satu-satunya kolom yang sekarang berisi nilai yang hilang adalah kolom ARR_DEL15, yang menggunakan 0 untuk mengidentifikasi penerbangan yang tiba tepat waktu dan 1 untuk penerbangan yang tidak. Gunakan kode berikut untuk memperlihatkan lima baris pertama dengan nilai yang hilang:

    df[df.isnull().values.any(axis=1)].head()
    

    Panda mewakili nilai yang hilang dengan NaN, yang merupakan singkatan dari Bukan Angka. Output menunjukkan bahwa baris ini memang kehilangan nilai di kolom ARR_DEL15:

    Rows with missing values.

    Baris dengan nilai yang hilang

  6. Alasan baris ini tidak memiliki nilai ARR_DEL15 adalah bahwa semua baris tersebut sesuai dengan penerbangan yang dibatalkan atau dialihkan. Anda dapat memanggil dropna pada DataFrame untuk menghapus baris ini. Tetapi karena penerbangan yang dibatalkan atau dialihkan ke bandara lain dapat dianggap "terlambat," mari kita gunakan metode fillna untuk mengganti nilai yang hilang dengan 1 detik.

    Gunakan kode berikut untuk mengganti nilai yang hilang di kolom ARR_DEL15 dengan 1dtk dan menampilkan baris 177 hingga 184:

    df = df.fillna({'ARR_DEL15': 1})
    df.iloc[177:185]
    

    Konfirmasikan bahwa NaN di baris 177, 179, dan 184 diganti dengan 1 yang menunjukkan bahwa penerbangan datang terlambat:

    NaNs replaced with 1s.

    NaN diganti dengan 1dtk

Himpunan data sekarang "bersih" dalam arti bahwa nilai yang hilang telah diganti dan daftar kolom telah dipersempit ke yang paling relevan dengan model. Tapi Anda belum selesai. Ada lebih banyak yang harus dilakukan untuk menyiapkan himpunan data untuk digunakan dalam pembelajaran mesin.

Kolom CRS_DEP_TIME himpunan data yang Anda gunakan mewakili waktu keberangkatan terjadwal. Granularitas angka dalam kolom ini — berisi lebih dari 500 nilai unik — dapat berdampak negatif pada akurasi dalam model pembelajaran mesin. Hal ini dapat diselesaikan menggunakan teknik yang disebut pengelompokan atau kuantisasi. Bagaimana jika Anda membagi setiap angka di kolom ini dengan 100 dan dibulatkan ke bawah ke bilangan bulat terdekat? 1030 akan menjadi 10, 1925 akan menjadi 19, dan sebagainya, dan Anda akan dibiarkan dengan maksimum 24 nilai diskrit dalam kolom ini. Secara intuitif, hal ini masuk akal, karena mungkin keberangkatan penerbangan pada pukul 10:30 atau 10:40 tidak terlalu menjadi masalah. Yang menjadi hal penting adalah apakah penerbangan tersebut berangkat pada pukul 10:30 atau 17:30.

Selain itu, kolom ORIGIN dan DEST himpunan data berisi kode bandara yang mewakili nilai pembelajaran mesin kategoris. Kolom ini perlu dikonversi menjadi kolom diskrit yang berisi variabel indikator, terkadang dikenal sebagai variabel "dummy". Dengan kata lain, kolom ORIGIN, yang berisi lima kode bandara, perlu dikonversi menjadi lima kolom, satu per bandara, dengan setiap kolom berisi 1 dan 0 yang menunjukkan apakah penerbangan berasal dari bandara yang diwakili kolom. Kolom DEST perlu ditangani dengan cara yang sama.

Dalam latihan ini, Anda akan "mengelompokkan" waktu keberangkatan di kolom CRS_DEP_TIME dan menggunakan metode get_dummies Pandas untuk membuat kolom indikator dari kolom ORIGIN dan DEST.

  1. Gunakan perintah berikut untuk menampilkan lima baris pertama DataFrame:

    df.head()
    

    Amati bahwa kolom CRS_DEP_TIME berisi nilai dari 0 hingga 2359 yang mewakili waktu militer.

    The DataFrame with unbinned departure times.

    DataFrame dengan waktu keberangkatan yang tidak dikelompokkan

  2. Gunakan pernyataan berikut untuk mengelompokkan waktu keberangkatan:

    import math
    
    for index, row in df.iterrows():
        df.loc[index, 'CRS_DEP_TIME'] = math.floor(row['CRS_DEP_TIME'] / 100)
    df.head()
    

    Konfirmasikan bahwa angka di kolom CRS_DEP_TIME sekarang berada dalam rentang 0 hingga 23:

    The DataFrame with binned departure times.

    DataFrame dengan waktu keberangkatan yang dikelompokkan

  3. Sekarang gunakan pernyataan berikut untuk menghasilkan kolom indikator dari kolom ORIGIN dan DEST sembari menghilangkan kolom ORIGIN dan DEST itu sendiri:

    df = pd.get_dummies(df, columns=['ORIGIN', 'DEST'])
    df.head()
    

    Periksa DataFrame yang dihasilkan dan amati bahwa kolom ORIGIN dan DEST diganti dengan kolom yang sesuai dengan kode bandara yang ada di kolom asli. Kolom baru memiliki 1 dan 0 yang menunjukkan apakah penerbangan tertentu berasal dari atau ditujukan untuk bandara yang sesuai.

    The DataFrame with indicator columns.

    DataFrame dengan kolom indikator

  4. Gunakan perintah File ->Simpan dan Titik Pemeriksaan untuk menyimpan buku catatan.

Himpunan data terlihat sangat berbeda dari awalnya, tetapi sekarang dioptimalkan untuk digunakan dalam pembelajaran mesin.