Среднее — не единственный способ описать данные числом, и не всегда лучший. В этом уроке — оценки 30 студентов
по пяти предметам из файла data/scores.csv. В первом столбце — код студента (текст), в остальных — баллы.
Текст loadtxt не прочтёт как число, поэтому загрузим только столбцы с баллами: в usecols можно передать
несколько номеров сразу — кортежем.
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.
Сохраните в subject_median медианный балл по каждому предмету — пять чисел.
np.median(scores, axis=0) — по столбцам.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
subject_median = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
subject_median = np.median(scores, axis=0)Разброс: 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]
Сохраните в subject_std стандартное отклонение баллов по каждому предмету, а в most_spread — индекс
предмета, где разброс самый большой.
scores.std(axis=0) — по столбцам.argmax.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
subject_std = ...
most_spread = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
subject_std = scores.std(axis=0)
most_spread = subject_std.argmax()Процентили
Процентиль (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
Сохраните в top_line 90-й процентиль баллов по математике (столбец 0), а в top_count — сколько студентов
набрали по математике не меньше этого порога.
np.percentile(scores[:, 0], 90).scores[:, 0] >= top_line.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
top_line = ...
top_count = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
top_line = np.percentile(scores[:, 0], 90)
top_count = (scores[:, 0] >= top_line).sum()Округление: np.round
np.round(a, знаков) округляет каждый элемент массива. Удобно для показа — и есть одна особенность:
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])))?
Сохраните в report средний балл по каждому предмету, округлённый до одного знака после точки.
scores.mean(axis=0), потом np.round(…, 1).Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
report = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
report = np.round(scores.mean(axis=0), 1)Итоги
np.median— значение посередине, устойчиво к выбросам;mean— нет.std— разброс вокруг среднего, в тех же единицах, что данные.np.percentile(a, p)— значение, ниже которогоp% данных; медиана — 50-й процентиль.np.round(a, n)— округление; половинки — к ближайшему чётному.- Всё это понимает
axis.