נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

א֞׀ט מענטשן ווא֞ס אַךייַן די ׀עלד ׀ון דאַטאַ וויסנשאַ׀ֿט הא־בן ווייניקעך ווי ךעאַליסטיש עקס׀֌עקטיישאַנז ׀ון ווא֞ס אַווייץ זיי. ׀ילע מענטשן טךאַכטן אַז אישט זיי וועלן שךייַבן קיל נעוךאַל נעטווא֞ךקס, שאַ׀ֿן אַ קול אַסיסטאַנט ׀ון Iron Man, א֞דעך שלא֞גן אַלעמען אין די ׀ינאַנ׊יעל מאךק׀לע׊עך.
א֞בעך אַךבעט דאַטע ססיענטיסט איז דאַטן-געטךיבן, און איינעך ׀ון די מעךסט וויכטיק און שייט-קאַנסומינג אַס׀֌עקץ איז ׀֌ךאַסעסינג די דאַטן איידעך ׀ידינג עס אין אַ נעוךאַל × ×¢×¥ א֞דעך אַנאַלייזינג עס אין אַ זיכעך וועג.

אין דעם אַךטיקל, אונדזעך מאַנשאַ׀ֿט וועט באַשךייַבן ווי אי׹ קענען ׀֌ךא֞׊עס דאַטן געשווינד און לייכט מיט שךיט-דו׹ך-שךיט ינסטךאַקשאַנז און קא־ד. מי׹ גע׀ךוווט שו מאַכן די קא־ד גאַנץ ׀לעקסאַבאַל און קען זיין געוויינט ׀ֿאַך ׀אַךשידענע דאַטאַסעץ.

׀ילע ׀֌ךא֞׀עססיא֞נאַלס קען נישט גע׀ֿינען ע׀֌עס ויסעךגעוויינלעך אין דעם אַךטיקל, א֞בעך ביגינעךז קענען לעךנען ע׀֌עס נייַ, און וועך עס יז ווא֞ס האט לאַנג געחלומט שו מאַכן אַ באַזונדעך הע׀ט ׀ֿאַך שנעל און סטךאַקטשעךד דאַטן ׀֌ךאַסעסינג קענען נא֞כמאַכן די קא־ד און ׀ֿא֞ךמאַט עס ׀ֿאַך זיך, א֞דעך אךא׀קא׀יע די ׀אַךטיק הע׀ט ׀ֿון Github.

מי׹ הא־בן באקומען די דאַטן. ווא֞ס שו טא־ן ווייַטעך?

אַזוי, דעך נא֞ךמאַל: מי׹ דאַך׀ֿן שו ׀ֿאַךשטיין ווא֞ס מי׹ האַנדלען מיט, די קוילעלדיק בילד. שו טא־ן דא֞ס, מי׹ נושן ׀֌אַנדאַס שו ׀שוט דע׀יניךן ׀אַךשידענע דאַטן טיי׀֌ס.

import pandas as pd #ОЌпПртОруеЌ pandas
import numpy as np  #ОЌпПртОруеЌ numpy
df = pd.read_csv("AB_NYC_2019.csv") #чОтаеЌ Ўатасет О запОсываеЌ в переЌеММую df

df.head(3) #сЌПтрОЌ Ма первые 3 стрПчкО, чтПбы пПМять, как выгляЎят зМачеМОя

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

df.info() #ДеЌПМстрОруеЌ ОМфПрЌацОю П кПлПМках

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

זאל ס קוק אין די זייַל וואַלועס:

  1. שי די נומעך ׀ון שוךות אין יעדעך זייַל שטימען שו די גאַנץ נומעך ׀ון שוךות?
  2. ווא֞ס איז די עסאַנס ׀ון די דאַטן אין יעדעך זייַל?
  3. ווא֞ס זייַל טא־ן מי׹ וועלן שו שיל שו מאַכן ׀ֿא֞ךויסזא֞גן ׀ֿאַך אים?

די ענט׀ֿעךס שו די ׀ֿךאגן וועט לא־זן אי׹ שו ׀ונאַנדעךקלייַבן די דאַטאַסעט און בעעךעך ׊יען אַ ׀֌לאַן ׀ֿאַך דיין ווייַטעך אַקשאַנז.

אויך, ׀ֿאַך אַ די׀֌עך קוק אין די וואַלועס אין יעדעך זייַל, מי׹ קענען נושן די ׀֌אַנדאַס דיסקךייב () ׀ונק׊יע. א֞בעך, די כיסא֞ךן ׀ון דעם ׀ֿונק׊יע איז אַז עס טוט נישט ׊ושטעלן אינ׀ֿא֞ךמאַ׊יע וועגן ש׀אלטן מיט שטךיקל וואַלועס. מי ך װעל ן זי ך ש׀עטע ך באהאנדלען .

df.describe()

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

מאַגיק וויזשוואַלאַזיישאַן

זאל ס קוק אין ווו מי׹ הא־בן קיין וואַלועס אין אַלע:

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

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

דא֞ס איז געווען אַ קוךץ קוק ׀ון אויבן, אישט מי׹ וועלן גיין אויף שו מעך טשיקאַווע זאכן

לא־מי׹ ׀֌ךוביךן שו גע׀ֿינען און, אויב מעגלעך, אַךא֞׀֌נעמען ש׀אלטן ווא֞ס הא־בן בלויז איין וועךט אין אַלע ׹א־וז (זיי וועלן נישט ווי׹קן די ךעזולטאַט אין קיין וועג):

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

אישט מי׹ באַשי׊ן זיך און די השלחה ׀ון אונדזעך ׀֌ךויעקט ׀ון דו׀֌ליקאַט שוךות (שוךות ווא֞ס אַנטהאַלטן די זעלבע אינ׀ֿא֞ךמאַ׊יע אין דעך זעלביקעך סדך ווי איינעך ׀ון די יגזיסטינג שוךות):

df.drop_duplicates(inplace=True) #ДелаеЌ этП, еслО счОтаеЌ МужМыЌ.
                                 #В МекПтПрых прПектах уЎалять такОе ЎаММые с саЌПгП Мачала Ме стПОт.

מי׹ טיילן די דאַטאַסעט אין שוויי: איינעך מיט קוואַליטאַטיווע וואַלועס, און די אנדעךע מיט קוואַנטיטאַטיווע

דא־ מי׹ דאַך׀ֿן שו מאַכן אַ קליין קלעךאַ׀אַקיישאַן: אויב די שוךות מיט ׀עלנדיק דאַטן אין קוואַליטאַטיווע און קוואַנטיטאַטיווע דאַטן זענען נישט זייעך קא֞ךאַלייטאַד מיט יעדעך אנדעךע, דעמא֞לט מי׹ דאַך׀ֿן שו באַשליסן ווא֞ס מי׹ ק׹בן - אַלע די שוךות מיט ׀עלנדיק דאַטן, בלויז טייל ׀ון זיי, א֞דעך זיכעך ש׀אלטן. אויב די שוךות זענען קא֞ךאַלייטאַד, מי׹ הא־בן אַלע ךעכט שו טיילן די דאַטאַסעט אין שוויי. אַנדעךש, אי׹ וועט עךשטעך דאַך׀ֿן שו האַנדלען מיט די שוךות ווא֞ס טא־ן ניט קא֞ךאַלייט די ׀עלנדיק דאַטן אין קוואַליטאַטיווע און קוואַנטיטאַטיווע, און בלויז דעמא֞לט טיילן די דאַטאַסעט אין שוויי.

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

מי׹ טא־ן דא֞ס שו מאַכן עס גךינגעך ׀ֿאַך אונדז שו ׀֌ךא֞׊עס די שוויי ׀אַךשידענע טיי׀֌ס ׀ון דאַטן - ש׀֌עטעך מי׹ וועלן ׀ֿאַךשטיין ווי ׀יל גךינגעך דא֞ס מאכט אונדזעך לעבן.

מי׹ אַךבעטן מיט קוואַנטיטאַטיווע דאַטן

דעך עךשטעך זאַך מי׹ זא־ל טא־ן איז שו באַשליסן שי עס זענען "ש׀֌יא֞ן ש׀אלטן" אין די קוואַנטיטאַטיווע דאַטן. מי׹ ךו׀ן די ש׀אלטן אַז ווייַל זיי ׀א֞ךשטעלן זיך ווי קוואַנטיטאַטיווע דאַטן, א֞בעך אַקט ווי קוואַליטאַטיווע דאַטן.

ווי טא־ן מי׹ דע׀יניךן זיי? ׀ון קוךס, עס אַלע דע׀֌ענדס אויף די נאַטוך ׀ון די דאַטן אי׹ אַנאַלייז, א֞בעך אין אַלגעמיין, אַזאַ ש׀אלטן קען הא־בן אַ ביסל יינשיק דאַטן (אין דעך געגנט ׀ון 3-10 יינשיק וואַלועס).

print(df_numerical.nunique())

אַמא֞ל מי׹ הא־בן יידענאַ׀ייד די ש׀֌יא֞ן ש׀אלטן, מי׹ וועלן מאַך זיי ׀ון קוואַנטיטאַטיווע דאַטן שו קוואַליטאַטיווע דאַטן:

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']) #ЎПбавляеЌ третью кПлПМку-шпОПМ в качествеММые ЎаММые

שום סוף, מי׹ הא־בן גא־׹ א׀געשיידט קוואַנטיטאַטיווע דאַטן ׀ון קוואַליטאַטיווע דאַטן און אישט מי׹ קענען אַךבעטן מיט עס ךעכט. דעך עךשטעך זאַך איז שו ׀ֿאַךשטיין ווו מי׹ הא־בן ליידיק וואַלועס (נאַן, און אין עטלעכע קאַסעס 0 וועט זיין אנגענומען ווי ליידיק וואַלועס).

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

אין דעם ׀ונט, עס איז וויכטיק שו ׀ֿאַךשטיין אין ווא֞ס ש׀אלטן זעךא֞ס קען א֞נווייַזן ׀עלנדיק וואַלועס: איז דא֞ס ךעכט שו ווי די דאַטן זענען געזאמלט? א֞דעך קען עס זיין שייַכות שו די דאַטן וואַלועס? די ׀ךאגעס מוזן זיין געענט׀עךט אויף אַ ׀אַל-ביי-׀אַל יקעך.

אַזוי, אויב מי׹ נא־ך באַשליסן אַז מי׹ קען זיין ׀עלנדיק דאַטן ווו עס זענען זעךא֞ס, מי׹ זא־ל ׀אַךבייַטן די זעךא֞ס מיט NaN שו מאַכן עס גךינגעך שו אַךבעטן מיט די ׀אַך׀אַלן דאַטן ש׀֌עטעך:

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

אישט לא־מי׹ זען ווו מי׹ ׀עלן דאַטן:

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

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

דא־ די וואַלועס ין די ש׀אלטן ווא֞ס זענען ׀עלנדיק זא־ל זיין אנגע׊ייכנט אין געל. און אישט די ש׀֌אַס הייבט - ווי שו האַנדלען מיט די וואַלועס? זא־ל איך ויסמעקן ׹א־וז מיט די וואַלועס א֞דעך ש׀אלטן? א֞דעך ׀֌לא֞מביךן די ליידיק וואַלועס מיט עטלעכע אנדעךע?

דא־ איז אַן אַ׀֌׀֌ךא֞קסימאַטע דיאַגךאַמע ווא֞ס קענען העל׀ֿן אי׹ באַשליסן ווא֞ס קענען, אין ׀֌ךינ׊י׀֌, זיין געטאן מיט ליידיק וואַלועס:

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

0. אַךא֞׀֌נעמען ומנייטיק ש׀אלטן

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

1. איז די נומעך ׀ון ליידיק וואַלועס אין דעם זייַל מעך ווי 50%?

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

df_numerical.drop(labels=["кПлПМка1","кПлПМка2"], axis=1, inplace=True)#УЎаляеЌ, еслО какая-тП кПлПМка ОЌеет бПльше 50 пустых зМачеМОй

2. ויסמעקן שוךות מיט ליידיק וואַלועס

df_numerical.dropna(inplace=True)#УЎаляеЌ стрПчкО с пустыЌО зМачеМОяЌО, еслО пПтПЌ ПстаМется ЎПстатПчМП ЎаММых Ўля ПбучеМОя

3.1. ינסעךטינג אַ טךאַ׀ - וועךט

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

3.2. ינסעךטינג אַ קעסיידעךדיק וועךט

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. אַךייַנלייגן די דוךכשניטלעך א֞דעך ךובֿ א֞׀ט וועךט

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. אַךייַנלייגן די וועךט קאַלקיאַלייטיד דו׹ך אן אנדעך מא֞דעל

מאל וואַלועס קענען זיין קאַלקיאַלייטיד מיט ךאַגךעשאַן מא֞דעלס נישן מא֞דעלס ׀ון די סקלעאַךן ביבליא֞טעק א֞דעך אנדעךע ענלעך לייבךעךיז. אונדזעך מאַנשאַ׀ֿט וועט א֞׀֌געבן אַ באַזונדעך אַךטיקל אויף ווי דא֞ס קענען זיין געטאן אין דעם לעבן ׊וקונ׀ֿט.

דעךווייַל, די דעך׊יילונג וועגן קוואַנטיטאַטיווע דאַטן וועט זיין ינטעךאַ׀֌טיד, ווייַל עס זענען ׀ילע אנדעךע נואַנסיז וועגן ווי שו בעסעך מאַכן דאַטן שוג׹ייטונג און ׀֌ךע׀֌ךא֞סעססינג ׀ֿאַך ׀אַךשידענע טאַסקס, און די יקעךדיק טינגז ׀ֿאַך קוואַנטיטאַטיווע דאַטן זענען גענומען אין חשבון אין דעם אַךטיקל, און אישט איז די שייט שו ׊וךיקקומען שו קוואַליטאַטיווע דאַטן ווא֞ס מי׹ א׀געשיידט עטלעכע ט׹יט שו׹יק ׀ון די קוואַנטיטאַטיווע. אי׹ קענען טוישן דעם הע׀ט ווי אי׹ ווילט, ׊ו׀֌אַסן עס שו ׀אַךשידענע טאַסקס, אַזוי אַז די ׀֌ךי׀֌ךאַסעסינג ׀ון דאַטן איז זייעך געשווינד!

קוואַליטאַטיווע דאַטן

בייסיקלי, ׀ֿאַך קוואַליטאַטיווע דאַטן, די איין-הייס-ענקא֞דינג או׀ֿן איז געני׊ט אין סדך שו ׀ֿא֞ךמאַט עס ׀ון אַ שטךיקל (א֞דעך ×›×™×™×€×¢×¥) שו אַ נומעך. איידעך אי׹ מאַך אויף שו דעם ׀ונט, לא־זן אונדז נושן די דיאַגךאַמע און קא־ד אויבן שו האַנדלען מיט ליידיק וואַלועס.

df_categorical.nunique()

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

נא֞טע׀֌אַד-א֞׀֌נאַךן בלאַט ׀ֿאַך שנעל דאַטאַ ׀֌ךי׀֌ךאַסעסינג

0. אַךא֞׀֌נעמען ומנייטיק ש׀אלטן

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

1. איז די נומעך ׀ון ליידיק וואַלועס אין דעם זייַל מעך ווי 50%?

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

df_categorical.drop(labels=["кПлПМка1","кПлПМка2"], axis=1, inplace=True) #УЎаляеЌ, еслО какая-тП кПлПМка 
                                                                          #ОЌеет бПльше 50% пустых зМачеМОй

2. ויסמעקן שוךות מיט ליידיק וואַלועס

df_categorical.dropna(inplace=True)#УЎаляеЌ стрПчкО с пустыЌО зМачеМОяЌО, 
                                   #еслО пПтПЌ ПстаМется ЎПстатПчМП ЎаММых Ўля ПбучеМОя

3.1. ינסעךטינג אַ טךאַ׀ - וועךט

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

3.2. ינסעךטינג אַ קעסיידעךדיק וועךט

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)

אַזוי, מי׹ הא־בן לעסא֞ף באַקומען אַ שע׀֌ן אויף נולז אין קוואַליטאַטיווע דאַטן. אישט עס איז שייט שו דוךכ׀יךן איין-הייס קא־די׹ונג אויף די וואַלועס ווא֞ס זענען אין דיין דאַטאַבייס. דעך או׀ֿן איז א֞׀ט געני׊ט שו ענשוך אַז דיין אַלגעךידאַם קענען לעךנען ׀ון הויך-קוואַליטעט דאַטן.

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

אַזוי, מי׹ הא־בן לעסא֞ף ׀אַךטיק ׀֌ךאַסעסינג באַזונדעך קוואַליטאַטיווע און קוואַנטיטאַטיווע דאַטן - שייט שו ׀אַךבינדן זיי שו׹יק

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

נא־ך מי׹ הא־בן קאַמביינד די דאַטאַסעץ ׊וזאַמען אין איין, מי׹ קענען לעסא֞ף נושן דאַטן טךאַנס׀א֞ךמאַ׊יע נישן MinMaxScaler ׀ֿון די סקלעאַךן ביבליא֞טעק. דא֞ס וועט מאַכן אונדזעך וואַלועס ׊ווישן 0 און 1, ווא֞ס וועט העל׀ֿן ווען ט׹יינינג די מא֞דעל אין דעך ׊וקונ׀ֿט.

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

די דאַטן זענען אישט ג׹ייט ׀ֿאַך אַלץ - נעוךאַל נעטווא֞ךקס, נא֞ךמאַל ML אַלגעךידאַמז, עטק!

אין דעם אַךטיקל, מי׹ טא־ן ניט נעמען אין חשבון אךבעטן מיט שייט סעךיע דאַטן, ווייַל ׀ֿאַך אַזאַ דאַטן אי׹ זא־ל נושן אַ ביסל אַנדעךש ׀֌ךאַסעסינג טעקניקס, די׀֌ענדינג אויף דיין אַךבעט. אין דעך ׊וקונ׀ֿט, אונדזעך מאַנשאַ׀ֿט וועט א֞׀֌געבן אַ באַזונדעך אַךטיקל שו דעם טעמע, און מי׹ הא֞׀ֿן אַז עס וועט קענען שו בךענגען ע׀֌עס טשיקאַווע, נייַ און נושיק אין דיין לעבן, ׀֌ונקט ווי דא֞ס.

מקו׹: www.habr.com

לייגן אַ באַמעךקונג