Notepad-cheat sheet don saurin aiwatar da bayanai

Sau da yawa mutanen da ke shiga fagen Kimiyyar Bayanai suna da ƙarancin tsammanin abin da ke jiransu. Mutane da yawa suna tunanin cewa yanzu za su rubuta hanyoyin sadarwar jijiyoyi masu kyau, ƙirƙirar mataimakin murya daga Iron Man, ko doke kowa a cikin kasuwannin kuɗi.
Amma aiki data Masanin kimiyya yana tafiyar da bayanai, kuma ɗayan mafi mahimmanci da ɗaukar lokaci shine sarrafa bayanan kafin ciyar da su cikin hanyar sadarwa na jijiyoyi ko kuma yin nazari ta wata hanya.

A cikin wannan labarin, ƙungiyarmu za ta bayyana yadda zaku iya sarrafa bayanai cikin sauri da sauƙi tare da umarnin mataki-mataki da lamba. Mun yi ƙoƙarin sanya lambar ta zama mai sassauƙa kuma ana iya amfani da ita don saitin bayanai daban-daban.

Yawancin ƙwararru ba za su sami wani abu na ban mamaki ba a cikin wannan labarin, amma masu farawa za su iya koyon sabon abu, kuma duk wanda ya daɗe yana mafarkin yin littafin rubutu daban don sarrafa bayanai cikin sauri da tsari zai iya kwafi lambar ya tsara shi da kansa, ko zazzage littafin da aka gama daga Github.

Mun karbi bayanan. Me za a yi a gaba?

Don haka, ma'auni: muna buƙatar fahimtar abin da muke hulɗa da shi, cikakken hoto. Don yin wannan, muna amfani da pandas don kawai ayyana nau'ikan bayanai daban-daban.

import pandas as pd #импортируем pandas
import numpy as np  #импортируем numpy
df = pd.read_csv("AB_NYC_2019.csv") #читаем датасет и записываем в переменную df

df.head(3) #смотрим на первые 3 строчки, чтобы понять, как выглядят значения

Notepad-cheat sheet don saurin aiwatar da bayanai

df.info() #Демонстрируем информацию о колонках

Notepad-cheat sheet don saurin aiwatar da bayanai

Bari mu dubi ƙimar ginshiƙi:

  1. Shin adadin layin da ke cikin kowane ginshiƙi yayi daidai da jimlar adadin layukan?
  2. Menene ainihin bayanan a kowane shafi?
  3. Wane ginshiƙi muke so mu yi niyya don yin hasashensa?

Amsoshin waɗannan tambayoyin za su ba ku damar yin nazarin bayanan bayanan kuma ku zana tsari don ayyukanku na gaba.

Hakanan, don zurfafa kallon ƙimar kowane shafi, zamu iya amfani da aikin pandas siffanta(). Koyaya, rashin amfanin wannan aikin shine baya bada bayanai game da ginshiƙai tare da ƙimar kirtani. Za mu yi maganin su daga baya.

df.describe()

Notepad-cheat sheet don saurin aiwatar da bayanai

Ganin sihiri

Bari mu kalli inda ba mu da ƙima kwata-kwata:

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

Notepad-cheat sheet don saurin aiwatar da bayanai

Wannan ɗan gajeren kallo ne daga sama, yanzu za mu ci gaba zuwa abubuwa masu ban sha'awa

Bari mu yi ƙoƙari mu nemo kuma, idan zai yiwu, cire ginshiƙan da ke da ƙima ɗaya kawai a cikin duk layuka (ba za su shafi sakamakon ba ta kowace hanya):

df = df[[c for c
        in list(df)
        if len(df[c].unique()) > 1]] #Перезаписываем датасет, оставляя только те колонки, в которых больше одного уникального значения

Yanzu muna kare kanmu da nasarar aikinmu daga layukan kwafi (layukan da ke ɗauke da bayanai iri ɗaya cikin tsari ɗaya da ɗayan layin da ake da su):

df.drop_duplicates(inplace=True) #Делаем это, если считаем нужным.
                                 #В некоторых проектах удалять такие данные с самого начала не стоит.

Mun raba daftarin aiki gida biyu: daya da qualitative dabi'u, da kuma sauran tare da adadi

Anan muna buƙatar yin ƙaramin bayani: idan layin da bacewar bayanai a cikin bayanan ƙididdiga da ƙididdigewa ba su da alaƙa sosai da juna, to muna buƙatar yanke shawarar abin da muke sadaukarwa - duk layin da bacewar bayanai, kawai ɓangaren su. ko wasu ginshiƙai. Idan layukan suna da alaƙa, to muna da kowane haƙƙi don raba saitin bayanai zuwa biyu. In ba haka ba, da farko za ku buƙaci mu'amala da layin da ba su daidaita bayanan da suka ɓace a ƙima da ƙima, sannan sai ku raba bayanan gida biyu.

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

Muna yin haka ne don sauƙaƙa mana aiwatar da waɗannan nau'ikan bayanai guda biyu - daga baya za mu fahimci yadda wannan ya sauƙaƙa rayuwarmu.

Muna aiki tare da bayanan ƙididdiga

Abu na farko da ya kamata mu yi shi ne sanin ko akwai "ginshiƙan leken asiri" a cikin bayanan ƙididdiga. Muna kiran waɗannan ginshiƙan cewa saboda suna gabatar da kansu a matsayin bayanan ƙididdiga, amma suna aiki azaman bayanan inganci.

Ta yaya za mu ayyana su? Tabbas, duk ya dogara da yanayin bayanan da kuke bincika, amma gabaɗaya irin waɗannan ginshiƙan na iya samun ɗan ƙaramin bayanai na musamman (a cikin yanki na 3-10 na musamman).

print(df_numerical.nunique())

Da zarar mun gano ginshiƙan ɗan leƙen asiri, za mu matsar da su daga ƙididdiga masu ƙididdiga zuwa bayanai masu inganci:

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']) #добавляем третью колонку-шпион в качественные данные

A ƙarshe, mun rabu gaba ɗaya bayanan ƙididdigewa daga bayanan inganci kuma yanzu za mu iya aiki da shi yadda ya kamata. Abu na farko shine fahimtar inda muke da ƙimar komai (NaN, kuma a wasu lokuta za a karɓi 0 azaman ƙimar komai).

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

A wannan gaba, yana da mahimmanci a gane a cikin waɗanne ginshiƙan sifilai na iya nuna ƙimar da suka ɓace: shin wannan saboda yadda aka tattara bayanan? Ko yana iya kasancewa yana da alaƙa da ƙimar bayanai? Dole ne a amsa waɗannan tambayoyin bisa ga al'ada.

Don haka, idan har yanzu mun yanke shawarar cewa za mu iya rasa bayanai a inda akwai sifili, ya kamata mu maye gurbin sifilai tare da NaN don sauƙaƙe aiki tare da wannan bayanan da aka ɓace daga baya:

df_numerical[["колонка 1", "колонка 2"]] = df_numerical[["колонка 1", "колонка 2"]].replace(0, nan)

Yanzu bari mu ga inda muka rasa bayanai:

sns.heatmap(df_numerical.isnull(),yticklabels=False,cbar=False,cmap='viridis') # Можно также воспользоваться df_numerical.info()

Notepad-cheat sheet don saurin aiwatar da bayanai

Anan waɗancan ƙimar da ke cikin ginshiƙan da suka ɓace yakamata a yi musu alama cikin rawaya. Kuma yanzu jin dadi ya fara - yadda za a magance waɗannan dabi'u? Shin zan share layuka tare da waɗannan dabi'u ko ginshiƙai? Ko cika waɗannan darajoji marasa komai da wasu wasu?

Anan akwai madaidaicin zane wanda zai iya taimaka muku yanke shawarar abin da za a iya yi, bisa ƙa'ida, da ƙimar komai:

Notepad-cheat sheet don saurin aiwatar da bayanai

0. Cire ginshiƙan da ba dole ba

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Shin adadin ƙimar fanko a cikin wannan shafi ya fi 50%?

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

df_numerical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)#Удаляем, если какая-то колонка имеет больше 50 пустых значений

2. Share layi tare da ƙimar komai

df_numerical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, если потом останется достаточно данных для обучения

3.1. Saka darajar bazuwar

import random #импортируем random
df_numerical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True) #вставляем рандомные значения в пустые клетки таблицы

3.2. Saka ƙima akai-akai

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. Saka matsakaici ko mafi yawan ƙima

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. Saka ƙimar da aka ƙidaya ta wani samfurin

Wani lokaci ana iya ƙididdige ƙididdiga ta amfani da ƙirar koma baya ta amfani da ƙira daga ɗakin karatu na sklearn ko wasu ɗakunan karatu makamantan su. Ƙungiyarmu za ta ba da labarin dabam kan yadda za a iya yin hakan nan gaba kaɗan.

Don haka, a halin yanzu, za a katse ba da labari game da ƙididdigar ƙididdiga, saboda akwai wasu abubuwa da yawa game da yadda za a fi yin shirye-shiryen bayanai da tsarawa don ayyuka daban-daban, kuma an yi la'akari da ainihin abubuwan da ke tattare da ƙididdiga a cikin wannan labarin. Yanzu ne lokacin da za mu koma ga qualitative data, wanda muka raba matakai da yawa baya da na adadi. Kuna iya canza wannan littafin rubutu yadda kuke so, daidaita shi zuwa ayyuka daban-daban, ta yadda sarrafa bayanai ke tafiya da sauri!

Bayanai masu inganci

Ainihin, don ingantaccen bayanai, ana amfani da hanyar ɓoye-zafi-ɗaya don tsara shi daga zaren (ko abu) zuwa lamba. Kafin mu ci gaba zuwa wannan batu, bari mu yi amfani da zane da lambar da ke sama don magance ƙimar komai.

df_categorical.nunique()

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

Notepad-cheat sheet don saurin aiwatar da bayanai

0. Cire ginshiƙan da ba dole ba

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True)

1. Shin adadin ƙimar fanko a cikin wannan shafi ya fi 50%?

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

df_categorical.drop(labels=["колонка1","колонка2"], axis=1, inplace=True) #Удаляем, если какая-то колонка 
                                                                          #имеет больше 50% пустых значений

2. Share layi tare da ƙimar komai

df_categorical.dropna(inplace=True)#Удаляем строчки с пустыми значениями, 
                                   #если потом останется достаточно данных для обучения

3.1. Saka darajar bazuwar

import random
df_categorical["колонка"].fillna(lambda x: random.choice(df[df[column] != np.nan]["колонка"]), inplace=True)

3.2. Saka ƙima akai-akai

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)

Don haka, a ƙarshe mun sami ikon yin amfani da nulls a cikin bayanan inganci. Yanzu lokaci ya yi da za a yi rikodi-zafi ɗaya akan ƙimar da ke cikin bayananku. Ana amfani da wannan hanyar sau da yawa don tabbatar da cewa algorithm ɗin ku na iya koyo daga bayanai masu inganci.

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))

Don haka, a ƙarshe mun gama sarrafa bayanan ƙididdiga daban-daban da ƙididdiga - lokaci don haɗa su baya

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

Bayan mun haɗa bayanan tare zuwa ɗaya, a ƙarshe za mu iya amfani da canjin bayanai ta amfani da MinMaxScaler daga ɗakin karatu na sklearn. Wannan zai sa kimarmu ta kasance tsakanin 0 da 1, wanda zai taimaka lokacin horar da ƙirar a nan gaba.

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

Wannan bayanan yanzu an shirya don wani abu - hanyoyin sadarwa na jijiyoyi, daidaitattun algorithms ML, da sauransu!

A cikin wannan labarin, ba mu yi la'akari da yin aiki tare da bayanan jerin lokaci ba, tun da irin waɗannan bayanan ya kamata ku yi amfani da dabarun sarrafawa daban-daban, dangane da aikinku. A nan gaba, ƙungiyarmu za ta ba da labarin dabam ga wannan batu, kuma muna fatan za ta iya kawo wani abu mai ban sha'awa, sabo kuma mai amfani a rayuwar ku, kamar wannan.

source: www.habr.com

Add a comment