Что такое аутсайдер??

Мы должны определить, что такое выброс, прежде чем продолжить статью. Выбросы — это любые наблюдения, которые выделяются среди остальных точек данных и называются таковыми. Они, как правило, влияют на распределение данных. Иногда их удаляют, хотя это не всегда лучшая практика, и иногда стоит взглянуть на эти точки, потому что они могут предоставить значимую информацию.

Набор данных, использованный в этой статье, представляет собой результаты экзаменов учащихся двух португальских школ по математике и португальскому языку. Набор данных, наряду с результатами тестов, содержит другую демографическую информацию, такую ​​как возраст учащегося, размер семьи, образование родителей, состояние здоровья, время учебы и т. д.

import pandas as pd 
import seaborn as sns 
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5));
sns.set_theme(style="whitegrid", palette="Set2");
df = pd.read_csv("../data/student/student-por.csv",sep=";")

Первоначально набор данных был опубликован, чтобы проверить, повлияли ли вышеупомянутые факторы на окончательный результат теста студентов, которым является переменная с именем G3.

Я хочу добавить к этому немного внимания и посмотреть на любые отклонения в успеваемости учащегося, относящиеся к школе, дому и образу жизни. Для простоты мы учитываем только результаты тестов по португальскому предмету.

Ожидается, что для такого набора данных выбросами будут учащиеся, которые хорошо учатся без особой поддержки, или учащиеся, которые плохо справляются со всеми доступными ресурсами. Мы будем использовать неконтролируемое обучение, потому что у нас нет целевой переменной для нашего случая, которая является переменной, которая указывает, является ли успеваемость учащегося аномальной.

Блочные диаграммы

Давайте проанализируем успеваемость учащихся, получающих поддержку от своих семей, и проверим наличие каких-либо отклонений. Для этого примера мы будем использовать коробочные диаграммы.

df['Total_score'] =df['G1'] + df['G2'] + df['G3']

sns.boxplot(x="school",y="Total_score",hue="famsup",data = df,palette=["m", "g"]).set(
    xlabel="Total Score", 
    ylabel="School"
);
plt.legend(title="Family Support");
plt.title("Overall Test scores of students with respect to schools");

В школьной общей практике средний балл выше у учащихся, получающих поддержку семьи, и наоборот у учащихся, обучающихся в школе MS. Мы видим, что за пределами верхнего и нижнего усов находится 6 баллов, из которых 5 студентов набрали баллы ниже нижнего уса, а один из них — выше верхнего уса. Эти точки являются выбросами.

Z-баллы

Другой способ проверить выбросы — использовать z-оценки. Z-баллы обычно показывают, на сколько стандартных отклонений балл отличается от среднего. Формула для Z-показателя:

Z=стандартная оценка

x= наблюдаемое значение

μ = среднее значение выборки

𝜎= стандартное отклонение выборки

Если z-оценка равна 0, то это означает, что она находится ближе к среднему значению. Прежде чем погрузиться в Z-баллы, давайте сначала посмотрим на распределение баллов на выпускном экзамене (G3).

plt.hist(df['G3'],facecolor='blue',bins = 15, alpha=0.5,)
plt.xlabel('Score')
plt.ylabel('Students')
plt.title('Overall distribution of scores in Final Test (G3)');

На графике распределения мы можем видеть, что есть левый хвост и что есть некоторые ученики, которые показали плохие результаты. Однако это общее распределение баллов. Специально проверим распределение баллов учащихся, не получающих поддержки школы, семьи или не посещающих дополнительные платные занятия.

df2 = df.loc[(df["schoolsup"]=="no") & (df["famsup"]=="no") & (df["paid"]=="no"),
 ["G3"]]
plt.hist(df2['G3'],bins = 15,facecolor='blue', alpha=0.5)
plt.xlabel('Score')
plt.ylabel('Students')
plt.title('distribution of scores of students in Final Test (G3) without support');

Мы можем видеть, что распределение кажется немного хвостовым, где больше баллов присутствует около 10 и 15, и мы можем видеть, что есть несколько студентов, которые, кажется, набрали меньше 2 баллов, таким образом выделяясь среди остальных. Для вычисления Z-оценки мы будем использовать встроенный метод из библиотеки scipy.

import scipy.stats as stats
df2.rename(columns={'G3': 'Final Test Score (G3)'}, inplace=True)df2["z_score"] = df2.apply(stats.zscore)
df2.head()

Как мы знаем, показатель Z показывает, сколько стандартных отклонений от среднего. Чем дальше точка от центра, тем более экстремальной она становится. Эмпирическое правило заключается в том, чтобы установить порог на уровне 2,5, 2, 3, 3,5. В нашем случае порог установлен на 3. То есть любая точка, превышающая три стандартных отклонения от среднего, считается выбросом.

df2["outlier"] = (abs(df2["z_score"])>3).astype(int)
df2[df2["outlier"] == 1]

Изоляция Леса

Теперь давайте обсудим другой способ проверки выбросов, а именно изолирующий лес. Изолирующие леса основаны на том, что аномальные точки отличаются и находятся в меньшем количестве. Я пошел дальше и выполнил часть очистки, где я закодировал переменные.
Сначала мы создаем изолированный лес, где устанавливаем параметр загрязнения на 9%. Загрязнение — это процент данных, которые мы считаем аномальными.

cols=df.columns[:]
from sklearn.ensemble import IsolationForest
clf=IsolationForest(n_estimators=100, max_samples=’auto’, contamination=float(.09),
 max_features=1.0, bootstrap=False, n_jobs=-1, random_state=42, verbose=0)
clf.fit(df[cols])
pred = clf.predict(df[cols])
df[‘anomaly’]=pred
outliers=df.loc[df[‘anomaly’]==-1]
outlier_index=list(outliers.index)
print(df[‘anomaly’].value_counts())

мы можем видеть, что наша модель выбрала, что 59 точек выделяются как аномалия. Визуализируем данные с помощью PCA code to see

Напомним, что мы узнали о различных способах анализа выбросов в заданном наборе данных с использованием различных методов, таких как ящичные диаграммы, z-показатели и, наконец, изолирующий лес.

Ссылки :