Pengantar End-to-End untuk Menangani Nilai yang Hilang

Node Sumber: 1121996

Artikel ini diterbitkan sebagai bagian dari Blogathon Ilmu Data

Ringkasan

Data memberi kita kekuatan untuk menganalisis dan memperkirakan peristiwa di masa depan. Setiap hari, semakin banyak perusahaan yang mengadopsi teknik ilmu data seperti peramalan prediktif, pengelompokan, dan sebagainya. Meskipun sangat menarik untuk terus belajar tentang algoritma ML dan DL yang kompleks, jangan lupa untuk menguasai yang penting pemrosesan awal data. Salah satu bagian penting dari pra-pemrosesan data adalah menangani nilai yang hilang. Ini adalah panduan lengkap tentang cara menangani berbagai jenis data yang hilang.

Konten

  1. Mengapa penting untuk menangani nilai yang hilang?
  2. Alasan di balik Nilai yang hilang
  3. Jenis nilai yang hilang
  4. Periksa Nilai yang Hilang dalam kumpulan data
  5. Memvisualisasikan nilai yang hilang
  6. Menjatuhkan baris dengan nilai yang hilang
  7. Menjatuhkan kolom dengan nilai yang hilang
  8. Imputasi untuk variabel kontinu
    1. Imputasi dengan mean
    2. Imputasi dengan Median
  9. Memprediksi nilai yang hilang dengan Regresi
  10. Nilai yang hilang dalam Data Kategoris
  11. Nilai yang hilang dalam Data Deret Waktu
    1. Isi teruskan nilai yang hilang
    2. Isi mundur nilai yang hilang
    3. Interpolasi Linier
  12. Algoritma kuat untuk nilai yang hilang
  13. Kesimpulan

Mengapa penting untuk menangani data yang hilang?

Data di dunia nyata memiliki banyak data yang hilang dalam banyak kasus. Mungkin ada alasan berbeda mengapa setiap nilai tidak ada. Mungkin ada kehilangan atau kerusakan data, atau mungkin ada alasan khusus juga. Data yang hilang akan mengurangi daya prediksi model Anda. Jika Anda menerapkan algoritma dengan data yang hilang, maka akan ada bias dalam estimasi parameter. Anda tidak dapat yakin tentang hasil Anda jika Anda tidak menangani data yang hilang.

Alasan di balik Nilai yang Hilang

Pernah bertanya-tanya tentang alasan di balik data yang hilang dalam kumpulan data?

Beberapa kemungkinan alasan di balik data yang hilang adalah:

  • Orang tidak memberikan informasi mengenai pertanyaan tertentu dalam survei pengumpulan data. Misalnya, beberapa mungkin tidak nyaman berbagi informasi tentang gaji, minuman keras, dan kebiasaan merokok mereka. Ini sengaja ditinggalkan oleh penduduk
  • Dalam beberapa kasus, data diakumulasikan dari berbagai catatan masa lalu yang tersedia dan tidak secara langsung. Dalam hal ini, korupsi data adalah masalah utama. Karena perawatan yang rendah, beberapa bagian data rusak sehingga menimbulkan data yang hilang
  • Ketidakakuratan selama proses pengumpulan data juga berkontribusi pada data yang hilang. Misalnya, dalam entri data manual, sulit untuk sepenuhnya menghindari kesalahan manusia
  • Inkonsistensi peralatan yang mengarah ke pengukuran yang salah, yang pada gilirannya tidak dapat digunakan.

Jenis Nilai yang Hilang

Data yang hilang dapat terjadi karena berbagai alasan. Kita dapat mengkategorikan mereka menjadi tiga kelompok utama: Hilang Sepenuhnya Secara Acak, Hilang Secara Acak, Tidak Hilang Secara Acak.

1. Hilang Sepenuhnya Secara Acak (MCAR)

Data yang hilang tidak mengikuti pola tertentu, mereka hanya acak. Hilangnya data ini tidak terkait atau independen dari variabel yang tersisa. Tidak mungkin untuk memprediksi nilai-nilai ini dengan data variabel lainnya. Misalnya, selama pengumpulan data, sampel tertentu hilang karena kecerobohan. Ini adalah kasus yang ideal, di mana secara statistik analisis tidak akan bias. Tetapi Anda tidak boleh menganggap keberadaan MCAR kecuali sangat yakin karena ini adalah situasi yang jarang terjadi.

2. Hilang Secara Acak (MAR)

Di sini tidak seperti MCAR, data hilang di antara himpunan bagian tertentu. Dimungkinkan untuk memprediksi apakah data akan ada / tidak ada dengan bantuan fitur lain. Tapi, Anda tidak bisa memprediksi data yang hilang itu sendiri.

Misalnya, mari kita pertimbangkan survei tentang waktu yang dihabiskan di internet, yang memiliki bagian tentang waktu yang dihabiskan di platform seperti Netflix, amazon prime. Diamati bahwa orang yang lebih tua (di atas 45 tahun) lebih kecil kemungkinannya untuk mengisinya daripada orang yang lebih muda. Ini adalah contoh MAR. Di sini, parameter 'Usia' memutuskan apakah data akan hilang atau tidak. MAR terjadi sangat umum daripada MCAR.

3. Tidak Hilang Secara Acak (NMAR)

Ini adalah situasi yang serius dan rumit. Katakanlah tujuan survei adalah untuk mengukur penggunaan berlebihan/kecanduan media sosial. Jika orang yang menggunakan media sosial secara berlebihan, tidak sengaja mengisi survei, maka kita memiliki kasus NMAR. Ini kemungkinan besar akan menyebabkan bias dalam hasil. Metode biasa seperti menjatuhkan baris/kolom, imputasi tidak akan berfungsi. Untuk mengatasi ini, pengetahuan mendalam tentang domain akan diperlukan.

Sekarang kita telah melihat berbagai jenis data yang hilang, mari kita beralih ke berbagai cara untuk menanganinya.

Periksa nilai yang hilang

Saat Anda memiliki kumpulan data, langkah pertama adalah memeriksa kolom mana yang memiliki data yang hilang dan berapa banyak. Mari kita gunakan kumpulan data paling terkenal di antara ilmu Data yang dipelajari, tentu saja, para penyintas Titanic! Baca dataset menggunakan fungsi pandas read_csv seperti yang ditunjukkan di bawah ini.

train=pd.read_csv('../input/titanic/train.csv') test=pd.read_csv('../input/titanic/test.csv') print('Bentuk data pelatihan: ', train.shape ) print('Menguji bentuk data: ', test.shape) train.head()

Data Nilai yang Hilang

Sumber: Gambar dari buku catatan Kaggle Penulis

Sekarang kita memiliki kerangka data pelatihan dan pengujian dari data titanic.

Bagaimana cara memeriksa kolom mana yang memiliki data yang hilang, dan berapa banyak?

Fungsi "isnull()" digunakan untuk ini. Saat Anda memanggil fungsi sum bersama dengan isnull, jumlah total data yang hilang di setiap kolom adalah outputnya.

missing_values=train.isnull().sum() print(missing_values)
PassengerId 0 Survived 0 Pclass 0 Nama 0 Jenis Kelamin 0 Umur 177 SibSp 0 Parch 0 Tiket 0 Tarif 0 Kabin 687 Embarked 2 dtype: int64

Perhatikan bahwa 3 kolom memiliki nilai yang hilang: Age, Cabin, Embarked

Meskipun kita tahu berapa banyak nilai yang hilang di setiap kolom, penting untuk mengetahui persentasenya terhadap nilai total. Jadi, mari kita hitung itu dalam satu baris kode.

mis_value_percent = 100 * train.isnull().sum() / len(train) print(mis_value_percent)
PassengerId 0.000000 Bertahan 0.000000 Pclass 0.000000 Nama 0.000000 Jenis Kelamin 0.000000 Umur 19.865320 SibSp 0.000000 Parch 0.000000 Tiket 0.000000 Tarif 0.000000 Kabin 77.104377 Embarked 0.224467 dtype: float64

Jelas bahwa 77% dari Kolom 'Kabin' hilang, yang merupakan persentase yang sangat signifikan. Usia memiliki sekitar 19% data yang hilang dan Embarked hanya memiliki 0.2% yang hilang. Ini adalah analisis kuantitatif dari data yang hilang yang kami miliki. Bagaimana dengan kualitatif? Baca terus!

Memvisualisasikan nilai yang hilang dengan Missingno

Tebak apa? Kami memiliki paket python khusus untuk memvisualisasikan dan menjelajahi data yang hilang dari kumpulan data. Paket python "Missingno". Silakan dan instal dengan cepat

instal pip tidak ada

Dengan menggunakan ini, kita dapat membuat visualisasi dalam bentuk peta panas, diagram batang, dan matriks. Dengan menganalisis bagaimana mereka didistribusikan, Anda dapat menyimpulkan kategori apa yang termasuk dalam MCAR, MAR, atau NMAR. Kami juga dapat menemukan korelasi kolom yang berisi yang hilang dengan kolom target

Mulailah dengan membuat diagram batang untuk nilai non-null menggunakan fungsi 'bar()' dari library missingno. Anda telah meneruskan kerangka data pandas ke fungsi ini.

impor missingno sebagai msno msno.bar(train)

tidak ada | nilai yang hilangSumber: Gambar dari buku catatan Kaggle Penulis

Selanjutnya, kita dapat memplot visualisasi matriks. Ini membantu kita untuk mengetahui bagaimana data yang hilang didistribusikan melalui data, yaitu apakah mereka terlokalisasi atau tersebar merata, atau apakah ada pola dan banyak pertanyaan semacam itu.

msno.matrix(kereta api)
bilah pola

Di plot matriks, Anda akan melihat baris kosong untuk setiap data yang hilang. Perhatikan bahwa kolom 'Embarked' hanya memiliki dua data acak yang hilang, yang tidak mengikuti pola. Mereka mungkin hilang selama akuisisi data. Jadi, ini dapat diklasifikasikan sebagai Hilang sepenuhnya secara Acak.

Kolom usia dan Kabin mungkin MAR. Tetapi kami ingin memastikan bahwa tidak ada korelasi di antara mereka.

Bagaimana cara melakukannya?

Beruntung bagi kami, paket missingno juga menyediakan fungsi 'peta panas'. Dengan menggunakan ini kita dapat menemukan apakah ada korelasi antara data yang hilang dari kolom yang berbeda.

msno.heatmap(kereta api)

Keluaran ditampilkan!

peta panas | nilai yang hilang

Peta panas menunjukkan tidak ada korelasi kuat antara data yang hilang dari kolom Usia dan Kabin. Jadi, data yang hilang dari kolom-kolom ini dapat diklasifikasikan sebagai MAR atau Hilang secara Acak.

Saya harap Anda jelas tentang cara menganalisis nilai yang hilang. Selanjutnya, saya akan melanjutkan untuk membahas berbagai cara menangani data yang hilang ini.

Menjatuhkan baris dengan nilai yang hilang

Ini adalah metode sederhana, di mana kita membuang semua baris yang memiliki nilai yang hilang milik kolom tertentu. Semudah ini, ia datang dengan kerugian besar. Anda mungkin akhirnya kehilangan sebagian besar data Anda. Ini akan mengurangi ukuran set data Anda dan membuat prediksi model Anda menjadi bias. Anda harus menggunakan ini hanya ketika tidak ada nilai yang hilang sangat sedikit.

Misalnya, kolom 'Embarked' hanya memiliki 2 nilai yang hilang. Jadi, kita bisa menjatuhkan baris di mana kolom ini tidak ada. Ikuti cuplikan kode di bawah ini.

print('Dataset sebelum :', len(train)) train.dropna(subset=['Embarked'],how='any',inplace=True) print('Dataset setelah :', len(train)) print( 'nilai yang hilang :',train['Embarked'].isnull().sum())
Dataset sebelum : 891 Dataset setelah : 889 nilai hilang : 0

Bayangkan jika Anda melakukan hal yang sama untuk kolom 'Usia'. Anda akan kehilangan 77% data Anda!

Menjatuhkan kolom

Ketika sebuah kolom memiliki nilai-nilai yang hilang yang besar, tidak ada gunanya memasukkan nilai-nilai dengan data benar paling sedikit yang kita miliki. Jadi, ketika kolom mana pun memiliki lebih dari 80% nilai yang hilang, Anda bisa membuang kolom itu dari analisis Anda. Dalam kasus kami, 'Kabin' memiliki 77% data yang hilang, sehingga Anda dapat mengambil pilihan untuk menghapus kolom ini.

Pastikan bahwa kolom yang dijatuhkan tidak penting untuk analisis Anda. Jika demikian, Anda harus mencoba mendapatkan lebih banyak data dan kemudian menghitung nilai yang hilang.

Imputasi untuk variabel kontinu

kereta['Usia'][:10]
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 5 NaN 6 54.0 7 2.0 8 27.0 9 14.0 Nama: Umur, dtype: float64
train['Age']=train['Age'].replace(np.NaN,train['Age'].mean()) train['Usia'][:10]
0 22.000000 1 38.000000 2 26.000000 3 35.000000 4 35.000000 5 29.699118 6 54.000000 7 2.000000 8 27.000000 9 14.000000 Nama: Umur, dtype: float64

Anda dapat melihat bahwa 'NaN' telah diganti dengan 29.699 (mean yang dihitung).

Imputasi rata-rata memiliki kelemahan tertentu. Jika data memiliki distribusi yang sangat tidak merata, dengan banyak outlier, maka Mean tidak akan mencerminkan distribusi data yang sebenarnya. Mean sangat dipengaruhi oleh nilai ekstrim atau outlier. Jadi, jika data tidak memiliki banyak outlier dan mengikuti distribusi mendekati normal, gunakan imputasi rata-rata

Imputasi dengan Median

Nilai yang hilang dari fitur kontinu dapat diisi dengan median dari nilai non-null yang tersisa. Keuntungan dari median adalah, tidak terpengaruh oleh outlier, tidak seperti mean. Mari kita terapkan di sini.

train['Age']=train['Usia'].replace(np.NaN,train['Usia'].median()) kereta['Usia'][:10]

imputasi dengan mean

Anda dapat mengamati bahwa nilai median (28.0) telah diisi sebagai ganti nilai NaN.

Demikian pula, Anda juga dapat melakukan imputasi mode. Umumnya, Imputasi dengan mode populer untuk nilai-nilai yang hilang kategoris. Saya akan membahasnya secara mendalam di bagian selanjutnya

Memprediksi nilai yang hilang dengan Regresi

Alih-alih mengisi satu nilai rata-rata atau median di semua tempat, bagaimana jika kita dapat memprediksinya dengan bantuan variabel lain yang kita miliki?

Ya! Kita dapat menggunakan fitur dengan nilai non-null untuk memprediksi nilai yang hilang. Model regresi atau klasifikasi dapat dibangun untuk prediksi nilai yang hilang. Mari kita terapkan ini untuk kolom 'Usia' dari kumpulan data titanic kita.

Kami dapat memproses data untuk membangun model. Fitur "Usia" akan menjadi variabel target.

x_kereta: Baris set data yang memiliki nilai "Usia" difilter. 'Usia' adalah targetnya x_tes: Ini adalah kolom "Usia" dengan nilai bukan nol

Grafik y_train akan memiliki data yang memiliki nilai Usia yang hilang, yang akan diprediksi (kamu_pred)

impor panda sebagai pd data=pd.read_csv('../input/titanic/train.csv') data = data[["Survived", "Pclass", "Sex", "SibSp", "Parch", "Fare ", "Usia"]] data["Kelamin"] = [1 jika x=="laki-laki" lain 0 untuk x dalam data["Jenis Kelamin"]] test_data = data[data["Usia"].isnull()] data.dropna(inplace=True) x_train = data.drop("Usia", axis=1) x_test = test_data.drop("Usia", axis=1) y_train = data["Usia"]

Mari kita sesuaikan Model Regresi Linier untuk data ini. Saya akan menggunakan perpustakaan sklearn di sini.

dari sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test)

Sekarang, kita memiliki nilai null dari kolom Age yang diprediksi di y_pred.

Saya akan mencetak beberapa contoh input pengujian dan output yang diprediksi untuk pemahaman Anda yang lebih baik.

cetak(x_test[:10])
Bertahan Pclass Sex SibSp Parch Fare 5 0 3 1 0 0 8.4583 17 1 2 1 0 0 13.0000 19 1 3 0 0 0 7.2250 26 0 3 1 0 0 7.2250 28 1 3 0 0 0 7.8792 29 0 3 1 0 0 7.8958 31 1 1 0 1 0 146.5208 32 1 3 0 0 0 7.7500 36 1 3 1 0 0 7.2292 42 0 3 1 0 0 7.8958

Ini adalah bagaimana input diteruskan ke model regresi. Mari kita lihat nilai usia yang diprediksi.

cetak(y_pred[:10])
[29.07080066 30.10833306 22.44685065 29.08927347 22.43705181 29.07922599 32.43692984 22.43898701 22.15615704 29.07922599]

Hore! Kami mendapatkan nilai-nilainya.

Nilai yang hilang dalam data kategorikal

Sampai sekarang, kami melihat bagaimana menangani data numerik yang hilang. Bagaimana jika data hilang dalam kasus fitur kategoris? Misalnya, fitur "Kabin" dari kumpulan data Titanic bersifat kategoris. Di sini, kita tidak dapat menghitung mean dan median. Jadi, kita dapat mengisi nilai yang hilang dengan mode atau kelas/kategori yang paling sering muncul.

train['Cabin']=train['Cabin'].fillna(train['Cabin'].value_counts().index[0])

Ketika persentase nilai yang hilang lebih kecil, metode ini lebih disukai. Itu tidak menyebabkan kehilangan data yang besar, dan secara statistik relevan.

Tetapi jika Anda memiliki banyak nilai yang hilang, maka tidak masuk akal untuk mengaitkan dengan kelas yang paling sering. Sebagai gantinya, mari kita buat kategori terpisah untuk nilai yang hilang seperti "Tidak diketahui" atau "Tidak tersedia". Jumlah kelas akan bertambah satu.

Ketika nilai yang hilang berasal dari kolom kategori (string atau numerik) maka nilai yang hilang dapat diganti dengan kategori yang paling sering. Jika jumlah nilai yang hilang sangat besar maka dapat diganti dengan kategori baru.

train['Cabin']=train['Cabin'].fillna('Unknown') train['Cabin'][:10]

BARIS KABIN | isi na

Ini bekerja dengan baik dengan dataset kecil. Ini juga meniadakan hilangnya data dengan menambahkan kategori unik.

Bagaimana cara menangani nilai yang hilang dalam data deret waktu?

Kumpulan data tempat informasi dikumpulkan bersama dengan stempel waktu secara teratur dilambangkan sebagai data deret waktu. Jika Anda memiliki nilai yang hilang dalam data deret waktu, Anda jelas dapat mencoba salah satu metode yang dibahas di atas. Tetapi ada beberapa metode khusus juga yang dapat digunakan di sini.

Untuk mendapatkan ide, saya akan membuat dataset dummy sederhana.

waktu= pd.date_range("1/01/2021", titik=10, freq="W") df = pd.DataFrame(indeks=waktu); df["Unit terjual"] = [5.0,4.0,np.nan,np.nan,1.0,np.nan,3.0,6.0,np.nan,2.0]; cetak (df)

unit terjual

Mari kita beralih ke metode

Isi teruskan nilai yang hilang

Nilai baris berikutnya akan digunakan untuk mengisi nilai yang hilang. 'fill' singkatan dari 'forward fill'. Sangat mudah untuk diimplementasikan. Anda hanya perlu meneruskan parameter "metode" sebagai "mengisi" di fungsi fillna().

forward_filled=df.fillna(method='fill') print(forward_filled)

maju diisi

Isi mundur nilai yang hilang

Di sini, kami menggunakan nilai baris sebelumnya untuk mengisi nilai yang hilang. 'bfill' adalah singkatan dari isian mundur. Di sini, Anda harus memberikan 'bfill' sebagai parameter metode.

backward_filled=df.fillna(method='bfill') print(backward_filled)

bagian belakang terisi

Saya harap Anda dapat menemukan perbedaan dalam kedua kasus dengan gambar di atas.

Interpolasi Linier

Data deret waktu memiliki banyak variasi. Metode penghitungan menggunakan backfill dan forward fill di atas bukanlah solusi terbaik. Interpolasi Linier untuk menyelamatkan!

Di sini, nilai diisi dengan nilai yang bertambah atau berkurang. Ini adalah semacam teknik imputasi, yang mencoba memplot hubungan linier antara titik data. Ini menggunakan nilai non-null yang tersedia untuk menghitung poin yang hilang.

interpolated=df.interpolate(limit_direction="keduanya") print(interpolasi)

Interpolasi linier dari nilai yang hilang

Bandingkan nilai-nilai ini dengan pengisian mundur dan maju dan periksa sendiri mana yang bagus!

Ini adalah beberapa cara dasar untuk menangani nilai yang hilang dalam data deret waktu

Algoritma kuat untuk nilai yang hilang

Ada beberapa kasus, di mana tidak satu pun di atas bekerja dengan baik. Namun, Anda perlu melakukan analisis. Kemudian, Anda harus memilih algoritme yang mendukung nilai yang hilang. KNN (K tetangga terdekat) adalah salah satu algoritma tersebut. Ini akan mempertimbangkan nilai yang hilang dengan mengambil sebagian besar nilai K terdekat. Hutan acak juga kuat untuk data kategoris dengan nilai yang hilang. Banyak algoritme berbasis pohon keputusan seperti XGBoost, Catboost mendukung data dengan nilai yang hilang.

Kesimpulan

Untuk meringkas, langkah pertama adalah mengeksplorasi data dan mencari tahu variabel apa yang memiliki data yang hilang, berapa persentasenya, dan termasuk dalam kategori apa. Setelah ini, Anda akan memiliki ide strategis tentang metode apa yang dapat Anda coba. Tip yang bermanfaat adalah mencoba Imputasi dengan algoritma tetangga terdekat K selain dari model regresi linier. Ada beberapa metode terbaru yang dapat Anda cari seperti menggunakan Datawig, atau metode Imputasi Hot-Deck jika metode di atas tidak berhasil.

Saya harap Anda menyukai bacaannya.

Anda dapat terhubung dengan saya di: [email dilindungi]

Linkedin: pra-pemrosesan data

Media yang ditampilkan dalam artikel ini tidak dimiliki oleh Analytics Vidhya dan digunakan atas kebijaksanaan Penulis.

Sumber: https://www.analyticsvidhya.com/blog/2021/10/end-to-end-introduction-to-handling-missing-values/

Stempel Waktu:

Lebih dari Analisis Vidhya