Нашли ошибку?
Скачать чистый
урок 3 из 5≈ 15 минупражнения: 0 из 4

Статистика

Медиана, когда среднее обманывает; разброс std; процентили — «какой балл лучше, чем у 90 % группы»; округление np.round и его неожиданное правило.

Python запустится при первом выполнении

Среднее — не единственный способ описать данные числом, и не всегда лучший. В этом уроке — оценки 30 студентов по пяти предметам из файла data/scores.csv. В первом столбце — код студента (текст), в остальных — баллы. Текст loadtxt не прочтёт как число, поэтому загрузим только столбцы с баллами: в usecols можно передать несколько номеров сразу — кортежем.

[ ]Оценки: 30 студентов × 5 предметов
import numpy as np

subjects = ["математика", "физика", "программирование", "история", "английский"]
scores = np.loadtxt("data/scores.csv", delimiter=",", skiprows=1, usecols=(1, 2, 3, 4, 5))
print(scores.shape)
print(scores[:3])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
(30, 5)
[[68. 49. 68. 82. 81.]
 [70. 66. 68. 77. 87.]
 [61. 58. 72. 60. 70.]]

Медиана

Медиана (median) — значение посередине: половина данных меньше него, половина — больше. В отличие от среднего, медиане всё равно, насколько велики самые большие значения:

[ ]Зарплаты: среднее и медиана
salaries = np.array([42, 45, 48, 50, 51, 53, 55, 58, 60, 400])   # тыс. ₽, последний — директор
print(salaries.mean())
print(np.median(salaries))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
86.2
52.0

np.median — функция (метода median у массива нет) и тоже понимает axis.

[ ]Упражнение 1Медиана по предметам решено

Сохраните в subject_median медианный балл по каждому предмету — пять чисел.

subject_median = ...

Разброс: std

Стандартное отклонение (standard deviation, std) показывает, насколько значения разбросаны вокруг среднего: чем оно больше, тем сильнее студенты отличаются друг от друга. Единицы у него те же, что у данных — баллы.

[ ]Разброс оценок по математике
math_scores = scores[:, 0]
print(math_scores.mean(), math_scores.std())
print(np.round(scores.std(axis=0), 1))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
67.76666666666667 11.712339172380934
[11.7 12.6 12.2 12.6 12.1]
[ ]Упражнение 2Самый неровный предмет решено

Сохраните в subject_std стандартное отклонение баллов по каждому предмету, а в most_spread — индекс предмета, где разброс самый большой.

subject_std = ...
most_spread = ...

Процентили

Процентиль (percentile) p — значение, ниже которого лежит p процентов данных. Медиана — это 50-й процентиль. 90-й процентиль отвечает на вопрос «какой балл нужен, чтобы быть в лучших 10 %»:

[ ]Процентили
print(np.percentile(math_scores, 50), np.median(math_scores))
print(np.percentile(math_scores, 90))
print(np.percentile(scores, 90))    # по всей таблице
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
68.0 68.0
83.30000000000001
85.0
[ ]Упражнение 3Порог для лучших решено

Сохраните в top_line 90-й процентиль баллов по математике (столбец 0), а в top_count — сколько студентов набрали по математике не меньше этого порога.

top_line = ...
top_count = ...

Округление: np.round

np.round(a, знаков) округляет каждый элемент массива. Удобно для показа — и есть одна особенность:

[ ]np.round
print(np.round(np.array([1.234, 5.678]), 1))
print(np.round(2.5), np.round(3.5))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
[1.2 5.7]
2.0 4.0
Вопрос

Что напечатает print(np.round(np.array([0.5, 1.5, 2.5])))?

[ ]Упражнение 4Средние для отчёта решено

Сохраните в report средний балл по каждому предмету, округлённый до одного знака после точки.

report = ...

Итоги

  • np.median — значение посередине, устойчиво к выбросам; mean — нет.
  • std — разброс вокруг среднего, в тех же единицах, что данные.
  • np.percentile(a, p) — значение, ниже которого p % данных; медиана — 50-й процентиль.
  • np.round(a, n) — округление; половинки — к ближайшему чётному.
  • Всё это понимает axis.

Подробнее в справочнике

Нашли ошибку?