Рубрики
Без рубрики

Как найти выбросы в Python легко?

[Учебное пособие] Практично и легко понимать примеру в аналитике веб-сайта: алгоритм Python One-Liner.

Автор оригинала: Chris.

Можете ли вы обнаружить выбросы в следующей последовательности: 000000001000000001? Выявление выбросов быстро может быть важнейшим для многих применений в военном, воздушном транспорте и производстве энергии.

Эта статья показывает вам наиболее базовый алгоритм обнаружения выбросов: если наблюдаемая стоимость отклоняется от среднего значения по сравнению с стандартным отклонением, оно считается выбросом.

Numpy Основы нашего простого алгоритма обнаружения выбросов

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

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

[ 8.78087409 10.95890859  8.90183201  8.42516116  9.26643393 12.52747974
  9.70413087 10.09101284  9.90002825 10.15149208  9.42468412 11.36732294
  9.5603904   9.80945055 10.15792838 10.13521324 11.0435137  10.06329581 
...
 10.74304416 10.47904781]

Если вы записали эту последовательность, вы получите следующий рисунок:

Появимость, похоже, напоминает нормальное распределение со средним значением 10 и стандартным отклонением 1. Среднее значение является средним значением всех значений последовательности. Стандартное отклонение – это отклонение от среднего значения, так что приблизительно 68% всех значений образца лежат в пределах стандартного интервала отклонения. Далее мы просто предполагаем: любое наблюдаемое значение, которое находится за пределами интервала, отмеченного стандартным отклонением вокруг среднего, является выброс.

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

import numpy as np
import matplotlib.pyplot as plt

sequence = np.random.normal(10.0, 1.0, 500)
print(sequence)

plt.xkcd()
plt.hist(sequence)
plt.annotate(r"$\omega_1=9$", (9, 70))
plt.annotate(r"$\omega_2=11$", (11, 70))
plt.annotate(r"$\mu=10$", (10, 90))
plt.savefig("plot.jpg")
plt.show()

Во-вторых, следующая функция NUMPY создает новую Numpy Array с каждым отрицательным значением положительным (абсолютные значения):

import numpy as np


a = np.array([1, -1, 2, -2])

print(a)
# [ 1 -1  2 -2]

print(np.abs(a))
# [1 1 2 2]

Вы можете увидеть, что функция «NP.ABS ()» просто преобразует отрицательные значения в небольшом массиве в их положительные аналоги.

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

import numpy as np


a = np.array([True, True, True, False])
b = np.array([False, True, True, False])

print(np.logical_and(a, b))
# [False  True  True False]

Каждый элемент при индексе I Array A сочетается с элементом i of array b, используя логическую и операцию (которая возвращает только «true», если обе операнды уже «правда»).

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

Обнаружить выбросы в аналитике сайта (одноклассник)

One-Liner осматривает следующую проблему: «Найти все дни выбросов, статистику которых (столбцы) отклоняются больше, чем стандартное отклонение от их средней статистики»

## Dependencies
import numpy as np


## Website analytics data:
## (row = day), (col = users, bounce, duration)
a = np.array([[815, 70, 115],
              [767, 80, 50],
              [912, 74, 77],
              [554, 88, 70],
              [1008, 65, 128]])
mean, stdev = np.mean(a, axis=0), np.std(a, axis=0)
# [811.2  76.4  88. ], [152.97764543   6.85857128  29.04479299]


## One-liner
outliers = ((np.abs(a[:,0] - mean[0]) > stdev[0])
            * (np.abs(a[:,1] - mean[1]) > stdev[1])
            * (np.abs(a[:,2] - mean[2]) > stdev[2]))



## Result
print(a[outliers])

Можете ли вы угадать вывод этого кода-фрагмента?

Обсуждение результатов

Представьте, что вы являетесь администратором онлайн-приложения, и вам необходимо проанализировать трафик сайта на постоянной основе. Как администратор веб-приложения Python Finxter.com, это одна из моих ежедневных занятий.

Набор данных состоит из нескольких строк и столбцов. Каждая строка включает в себя ежедневную статистику, состоящую из трех столбцов (ежедневных активных пользователей, скорость отказов и средняя продолжительность сеанса в секундах).

Для каждого столбца (статистически отслеживаемая метрика) мы рассчитываем среднее значение и стандартное отклонение. Например, среднее значение столбца «Ежедневных активных пользователей» составляет 811,2, а его стандартное отклонение составляет 152,97. Обратите внимание, что мы используем аргумент оси для расчета среднего и стандартного отклонения каждого столбца отдельно.

Напомним, что наша цель – обнаружить выбросы. Но как это сделать для аналитики нашего сайта? Код просто предполагает, что каждое наблюдаемое значение, которое не падает в стандартное отклонение вокруг среднего значения каждого конкретного столбца, является выбросом. Это так просто.

Например, среднее значение столбца «Ежедневные активные пользователи» составляет 811,2, а его стандартное отклонение составляет 152,97. Таким образом, каждое наблюдаемое значение для метрики «Ежедневных активных пользователей» меньше, чем 23 или более 43, считается выбросом для этого столбца.

Однако мы рассмотрим день, чтобы быть выбросом, только если все три наблюдаемых колонны являются выбросами. Это легко добиться этого, объединяя три логические массивы, используя «логическую и» работу Numpy.

Куда пойти отсюда?

Эта статья дала вам практический пример для Обнаружение выброса в Python. Мы тяжело использовали Numpy Library Отказ Первый шаг к тому, чтобы стать лучшим Python Coder – узнать больше о Numpy.

Я написал бесплатное обслуживание Numpy в моем блоге. Проверьте это!

[Статья] Numpy Tutorial – все, что вам нужно знать, чтобы начать работу с Numpy!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.