Lembar contekan notepad untuk prapemrosesan data yang cepat

Seringkali orang yang memasuki bidang Ilmu Data memiliki ekspektasi yang kurang realistis terhadap apa yang menanti mereka. Banyak orang berpikir bahwa sekarang mereka akan menulis jaringan saraf yang keren, membuat asisten suara dari Iron Man, atau mengalahkan semua orang di pasar keuangan.
Tapi bekerja Data Ilmuwan bergantung pada data, dan salah satu aspek terpenting dan memakan waktu adalah memproses data sebelum memasukkannya ke dalam jaringan saraf atau menganalisisnya dengan cara tertentu.

Dalam artikel ini, tim kami akan menjelaskan bagaimana Anda dapat memproses data dengan cepat dan mudah dengan petunjuk langkah demi langkah dan kode. Kami mencoba membuat kodenya cukup fleksibel dan dapat digunakan untuk kumpulan data yang berbeda.

Banyak profesional mungkin tidak menemukan sesuatu yang luar biasa dalam artikel ini, tetapi para pemula akan dapat mempelajari sesuatu yang baru, dan siapa pun yang telah lama bermimpi membuat buku catatan terpisah untuk pemrosesan data yang cepat dan terstruktur dapat menyalin kode dan memformatnya sendiri, atau unduh buku catatan yang sudah jadi dari Github.

Kami menerima kumpulan datanya. Apa yang harus dilakukan selanjutnya?

Jadi, standarnya: kita perlu memahami apa yang kita hadapi, gambaran keseluruhannya. Untuk melakukan ini, kami menggunakan panda untuk mendefinisikan tipe data yang berbeda.

import pandas as pd #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ pandas
import numpy as np  #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #Ρ‡ΠΈΡ‚Π°Π΅ΠΌ датасСт ΠΈ записываСм Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ df

df.head(3) #смотрим Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹Π΅ 3 строчки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ выглядят значСния

Lembar contekan notepad untuk prapemrosesan data yang cepat

df.info() #ДСмонстрируСм ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°Ρ…

Lembar contekan notepad untuk prapemrosesan data yang cepat

Mari kita lihat nilai kolomnya:

  1. Apakah jumlah baris pada setiap kolom sesuai dengan jumlah baris seluruhnya?
  2. Apa inti dari data di setiap kolom?
  3. Kolom mana yang ingin kita targetkan untuk membuat prediksi?

Jawaban atas pertanyaan-pertanyaan ini akan memungkinkan Anda menganalisis kumpulan data dan secara kasar membuat rencana untuk tindakan Anda selanjutnya.

Selain itu, untuk melihat lebih dalam nilai di setiap kolom, kita dapat menggunakan fungsi pandas deskripsi(). Namun kekurangan dari fungsi ini adalah tidak memberikan informasi tentang kolom dengan nilai string. Kami akan menanganinya nanti.

df.describe()

Lembar contekan notepad untuk prapemrosesan data yang cepat

Visualisasi ajaib

Mari kita lihat di mana kita tidak memiliki nilai sama sekali:

import seaborn as sns
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Lembar contekan notepad untuk prapemrosesan data yang cepat

Itu tadi sekilas dari atas, sekarang kita akan beralih ke hal-hal yang lebih menarik

Mari kita coba mencari dan, jika mungkin, menghapus kolom yang hanya memiliki satu nilai di semua baris (tidak akan mempengaruhi hasil dengan cara apa pun):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ датасСт, оставляя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ значСния

Sekarang kita melindungi diri kita sendiri dan keberhasilan proyek kita dari baris duplikat (baris yang berisi informasi yang sama dalam urutan yang sama dengan salah satu baris yang ada):

df.drop_duplicates(inplace=True) #Π”Π΅Π»Π°Π΅ΠΌ это, Ссли считаСм Π½ΡƒΠΆΠ½Ρ‹ΠΌ.
                                 #Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ с самого Π½Π°Ρ‡Π°Π»Π° Π½Π΅ стоит.

Kami membagi kumpulan data menjadi dua: satu dengan nilai kualitatif, dan yang lainnya dengan nilai kuantitatif

Di sini kita perlu membuat sedikit klarifikasi: jika baris dengan data yang hilang dalam data kualitatif dan kuantitatif tidak terlalu berkorelasi satu sama lain, maka kita perlu memutuskan apa yang kita korbankan - semua baris dengan data yang hilang, hanya sebagian saja, atau kolom tertentu. Jika garis-garisnya berkorelasi, maka kita berhak membagi kumpulan data menjadi dua. Jika tidak, pertama-tama Anda harus menangani garis-garis yang tidak mengkorelasikan data yang hilang secara kualitatif dan kuantitatif, dan baru kemudian membagi kumpulan data menjadi dua.

df_numerical = df.select_dtypes(include = [np.number])
df_categorical = df.select_dtypes(exclude = [np.number])

Kami melakukan ini untuk memudahkan kami memproses dua jenis data yang berbeda ini - nanti kami akan memahami betapa hal ini membuat hidup kami lebih mudah.

Kami bekerja dengan data kuantitatif

Hal pertama yang harus kita lakukan adalah menentukan apakah ada β€œkolom mata-mata” dalam data kuantitatif. Kami menyebut kolom ini demikian karena kolom tersebut menampilkan dirinya sebagai data kuantitatif, namun bertindak sebagai data kualitatif.

Bagaimana kita bisa mengidentifikasinya? Tentu saja, semuanya bergantung pada sifat data yang Anda analisis, namun secara umum kolom tersebut mungkin hanya berisi sedikit data unik (sekitar 3-10 nilai unik).

print(df_numerical.nunique())

Setelah kami mengidentifikasi kolom mata-mata, kami akan memindahkannya dari data kuantitatif ke data kualitatif:

spy_columns = df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]#выдСляСм ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ-ΡˆΠΏΠΈΠΎΠ½Ρ‹ ΠΈ записываСм Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ dataframe
df_numerical.drop(labels=['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3'], axis=1, inplace = True)#Π²Ρ‹Ρ€Π΅Π·Π°Π΅ΠΌ эти ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ ΠΈΠ· количСствСнных Π΄Π°Π½Π½Ρ‹Ρ…
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1']) #добавляСм ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2']) #добавляСм Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅
df_categorical.insert(1, 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3', spy_columns['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']) #добавляСм Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ-шпион Π² качСствСнныС Π΄Π°Π½Π½Ρ‹Π΅

Terakhir, kami telah sepenuhnya memisahkan data kuantitatif dari data kualitatif dan sekarang kami dapat mengolahnya dengan baik. Hal pertama adalah memahami di mana kita memiliki nilai kosong (NaN, dan dalam beberapa kasus 0 akan diterima sebagai nilai kosong).

for i in df_numerical.columns:
    print(i, df[i][df[i]==0].count())

Pada titik ini, penting untuk memahami di kolom mana angka nol dapat menunjukkan nilai yang hilang: apakah ini disebabkan oleh cara pengumpulan data? Atau mungkinkah itu terkait dengan nilai data? Pertanyaan-pertanyaan ini harus dijawab berdasarkan kasus per kasus.

Jadi, jika kita masih memutuskan bahwa kita mungkin kehilangan data jika ada angka nol, kita harus mengganti angka nol tersebut dengan NaN agar lebih mudah menangani data yang hilang ini nanti:

df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]] = df_numerical[["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 1", "ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 2"]].replace(0, nan)

Sekarang mari kita lihat di mana kita kehilangan data:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # МоТно Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ df_numerical.info()

Lembar contekan notepad untuk prapemrosesan data yang cepat

Di sini nilai-nilai di dalam kolom yang hilang harus ditandai dengan warna kuning. Dan sekarang kesenangannya dimulai - bagaimana menangani nilai-nilai ini? Haruskah saya menghapus baris dengan nilai atau kolom ini? Atau isi nilai kosong ini dengan nilai lain?

Berikut adalah diagram perkiraan yang dapat membantu Anda memutuskan apa yang pada prinsipnya dapat dilakukan dengan nilai kosong:

Lembar contekan notepad untuk prapemrosesan data yang cepat

0. Hapus kolom yang tidak perlu

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Apakah jumlah nilai kosong pada kolom ini lebih dari 50%?

print(df_numerical.isnull().sum() / df_numerical.shape[0] * 100)

df_numerical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)#УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° ΠΈΠΌΠ΅Π΅Ρ‚ большС 50 пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Hapus baris dengan nilai kosong

df_numerical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Memasukkan nilai acak

import random #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ random
df_numerical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True) #вставляСм Ρ€Π°Π½Π΄ΠΎΠΌΠ½Ρ‹Π΅ значСния Π² пустыС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

3.2. Memasukkan nilai konstan

from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ значСния
imputer = SimpleImputer(strategy='constant', fill_value="<Π’Π°ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ здСсь>") #вставляСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SimpleImputer
df_numerical[["новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ это для нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ со старыми значСниями

3.3. Masukkan nilai rata-rata atau paling sering

from sklearn.impute import SimpleImputer #ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ SimpleImputer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ значСния
imputer = SimpleImputer(strategy='mean', missing_values = np.nan) #вмСсто mean ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ most_frequent
df_numerical[["новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1",'новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2','новая_ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']] = imputer.fit_transform(df_numerical[['ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2', 'ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3']]) #ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌ это для нашСй Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹
df_numerical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True) #Π£Π±ΠΈΡ€Π°Π΅ΠΌ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ со старыми значСниями

3.4. Masukkan nilai yang dihitung oleh model lain

Terkadang nilai dapat dihitung menggunakan model regresi menggunakan model dari perpustakaan sklearn atau perpustakaan serupa lainnya. Tim kami akan menyediakan artikel terpisah tentang bagaimana hal ini dapat dilakukan dalam waktu dekat.

Jadi, untuk saat ini, narasi tentang data kuantitatif akan terputus, karena masih banyak nuansa lain tentang bagaimana melakukan persiapan dan pra-pemrosesan data dengan lebih baik untuk tugas-tugas yang berbeda, dan hal-hal dasar tentang data kuantitatif telah dipertimbangkan dalam artikel ini, dan sekarang saatnya kembali ke data kualitatif, yang kita pisahkan beberapa langkah mundur dari data kuantitatif. Anda dapat mengubah buku catatan ini sesuka Anda, menyesuaikannya dengan tugas yang berbeda, sehingga pemrosesan awal data berjalan sangat cepat!

Data kualitatif

Pada dasarnya, untuk data kualitatif, metode One-hot-encoding digunakan untuk memformatnya dari string (atau objek) menjadi angka. Sebelum melanjutkan ke poin ini, mari gunakan diagram dan kode di atas untuk menangani nilai kosong.

df_categorical.nunique()

sns.heatmap(df_categorical.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Lembar contekan notepad untuk prapemrosesan data yang cepat

0. Hapus kolom yang tidak perlu

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True)

1. Apakah jumlah nilai kosong pada kolom ini lebih dari 50%?

print(df_categorical.isnull().sum() / df_numerical.shape[0] * 100)

df_categorical.drop(labels=["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2"], axis=1, inplace=True) #УдаляСм, Ссли какая-Ρ‚ΠΎ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ° 
                                                                          #ΠΈΠΌΠ΅Π΅Ρ‚ большС 50% пустых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

2. Hapus baris dengan nilai kosong

df_categorical.dropna(inplace=True)#УдаляСм строчки с пустыми значСниями, 
                                   #Ссли ΠΏΠΎΡ‚ΠΎΠΌ останСтся достаточно Π΄Π°Π½Π½Ρ‹Ρ… для обучСния

3.1. Memasukkan nilai acak

import random
df_categorical["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"].fillna(lambda x: random.choice(df[df[column] != np.nan]["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°"]), inplace=True)

3.2. Memasukkan nilai konstan

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='constant', fill_value="<Π’Π°ΡˆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ здСсь>")
df_categorical[["новая_колонка1",'новая_колонка2','новая_колонка3']] = imputer.fit_transform(df_categorical[['колонка1', 'колонка2', 'колонка3']])
df_categorical.drop(labels = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"], axis = 1, inplace = True)

Jadi, kami akhirnya berhasil mengatasi angka nol dalam data kualitatif. Sekarang saatnya melakukan one-hot-encoding pada nilai-nilai yang ada di database Anda. Metode ini sangat sering digunakan untuk memastikan algoritma Anda dapat belajar dari data berkualitas tinggi.

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res)

features_to_encode = ["ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°1","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°2","ΠΊΠΎΠ»ΠΎΠ½ΠΊΠ°3"]
for feature in features_to_encode:
    df_categorical = encode_and_bind(df_categorical, feature))

Jadi, kami akhirnya selesai memproses data kualitatif dan kuantitatif yang terpisah - saatnya menggabungkannya kembali

new_df = pd.concat([df_numerical,df_categorical], axis=1)

Setelah kita menggabungkan kumpulan data menjadi satu, akhirnya kita dapat menggunakan transformasi data menggunakan MinMaxScaler dari perpustakaan sklearn. Ini akan membuat nilai kita berada di antara 0 dan 1, yang akan membantu saat melatih model di masa mendatang.

from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
new_df = min_max_scaler.fit_transform(new_df)

Data ini sekarang siap untuk apa pun - jaringan saraf, algoritme ML standar, dll.!

Dalam artikel ini, kami tidak memperhitungkan penggunaan data deret waktu, karena untuk data tersebut Anda harus menggunakan teknik pemrosesan yang sedikit berbeda, bergantung pada tugas Anda. Kedepannya tim kami akan menyediakan artikel tersendiri untuk topik ini, dan semoga mampu menghadirkan sesuatu yang menarik, baru dan bermanfaat ke dalam hidup Anda, seperti ini.

Sumber: www.habr.com

Tambah komentar