Menu
CoddyTech

Правило Z-оценки

Часть раздела Статистика для машинного обучения путешествия по Machine Learning на Coddy. Урок 26 из 64.

На ферме взвесили 300 яиц, а затем вручную ввели данные для двух из них: 6.2 g и 94.6 g — в обоих случаях с опечатками. Их z-оценки (расстояния от среднего значения в стандартных отклонениях) выдают их:

Гистограмма веса 300 яиц в виде z-оценок: все значения находятся между -3 и 3 внутри затенённой полосы, отмеченной как диапазон в пределах 3 стандартных отклонений. Две красные точки находятся далеко за её пределами: 6.2 g при z = -9.9 и 94.6 g при z = 6.3

np.abs убирает знаки минуса, поэтому одного сравнения достаточно, чтобы охватить обе стороны:

rng = np.random.default_rng(3)
eggs = np.concatenate([rng.normal(60, 4, size=300), np.array([6.2, 94.6])])
z = (eggs - eggs.mean()) / eggs.std()
print(np.abs(np.array([-4, 2, -1])))
print(eggs[np.abs(z) > 3])

Это выводит:

[4 2 1]
[ 6.2 94.6]

В данных с колоколообразным распределением 99,7% значений лежат в пределах 3 стандартных отклонений, поэтому np.abs(z) > 3 помечает редкие значения, которые нужно проверить перед обучением.

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

challenge icon

Задание

Средне

Весы в пекарне взвесили 250 буханок и записали их в loaves, а ещё 3 буханки ввели вручную. Программа считывает пороговое значение.

  1. Вычисли z-оценку каждой буханки, используя .mean() и .std() массива.
  2. В порядке расположения выведи каждую буханку, z-оценка которой отклоняется от 0 больше, чем на пороговое значение: её позицию, вес (1 знак после запятой) и z-оценку (2 знака после запятой).
  3. Выведи количество перечисленных буханок.

Для другого дня и порогового значения 3:

Loaf 200: 702.5 g, z = -5.38
Loaf 201: 889.3 g, z = 4.91
Loaves to re-weigh: 2

Попробуйте сами

import numpy as np

# Не изменяйте строки ниже: 250 буханок взвешены на весах, затем 3 значения веса введены вручную
rng = np.random.default_rng(25)
loaves = np.concatenate([rng.normal(800, 15, size=250), np.array([731.4, 868.9, 912.3])])
cutoff = float(input())

# Напишите свой код ниже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Статистика для машинного обучения

Потренируйтесь самостоятельно: Онлайн-компилятор Python