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
- Mengapa penting untuk menangani nilai yang hilang?
- Alasan di balik Nilai yang hilang
- Jenis nilai yang hilang
- Periksa Nilai yang Hilang dalam kumpulan data
- Memvisualisasikan nilai yang hilang
- Menjatuhkan baris dengan nilai yang hilang
- Menjatuhkan kolom dengan nilai yang hilang
- Imputasi untuk variabel kontinu
- Imputasi dengan mean
- Imputasi dengan Median
- Memprediksi nilai yang hilang dengan Regresi
- Nilai yang hilang dalam Data Kategoris
- Nilai yang hilang dalam Data Deret Waktu
- Isi teruskan nilai yang hilang
- Isi mundur nilai yang hilang
- Interpolasi Linier
- Algoritma kuat untuk nilai yang hilang
- 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()
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)
Sumber: 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)
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 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]
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]
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)
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)
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)
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)
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
- '
- 100
- 7
- 77
- 9
- perolehan
- Keuntungan
- algoritma
- algoritma
- Semua
- Amazon
- antara
- analisis
- analisis
- sekitar
- artikel
- TERBAIK
- Bangunan
- panggilan
- kasus
- Menyebabkan
- Charts
- klasifikasi
- kode
- Kolom
- Perusahaan
- menghitung
- Korupsi
- data
- ilmu data
- hari
- transaksi
- MELAKUKAN
- Menjatuhkan
- menjatuhkan
- peristiwa
- Fashion
- Fitur
- Fitur
- Pertama
- cocok
- mengikuti
- bentuk
- Depan
- fungsi
- masa depan
- Pemberian
- membimbing
- Penanganan
- di sini
- Seterpercayaapakah Olymp Trade? Kesimpulan
- How To
- HTTPS
- besar
- ide
- gambar
- informasi
- Internet
- IT
- pengetahuan
- besar
- memimpin
- terkemuka
- pengetahuan
- Perpustakaan
- baris
- utama
- Mayoritas
- Membuat
- Peta
- Matriks
- mengukur
- Media
- ML
- model
- pindah
- tetangga
- Netflix
- Lainnya
- pola
- Konsultan Ahli
- Platform
- Populer
- kekuasaan
- ramalan
- Prediksi
- menyajikan
- Ular sanca
- kuantitatif
- dunia nyata
- alasan
- arsip
- menurunkan
- regresi
- ISTIRAHAT
- Hasil
- Ilmu
- rasa
- Seri
- Seks
- Sederhana
- Ukuran
- kecil
- So
- Sosial
- media sosial
- terjual
- MEMECAHKAN
- Spot
- penyebaran
- Strategis
- mendukung
- Survei
- target
- uji
- pengujian
- Masa depan
- waktu
- Pelatihan
- us
- nilai
- visualisasi
- W
- Apa itu
- SIAPA
- Kerja
- bekerja
- dunia
- X
- tahun