Расчет медианы массива данных

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Расчет медианы массива данных

Сообщение Haos » 21 май 2020, 15:28

Рассмотрим расчет медианы для заданного массива Y[N]. Элемент данных, где половина данных больше него и половина меньше, называется медианой. Другими словами, медиана в статистике – это уровень показателя, который делит набор данных на две равные половины.

Для расчета медианы пользуются таким правилом:

1. Ранжируются данные по убыванию.

2.1 Если количество данных нечетно, то медиана будет соответствовать центральному значению, номер которого можно определить по формуле:
iMe = (N + 1) / 2,
iMe - номер элемента в данных, соответствующий медиане;
где N - количество элементов в данных.

2.2 Если количество элементов в данных четно, то нужно брать среднюю арифметическую из двух центральных элементов данных:
iMe = (N / 2 + (N + 1) / 2) / 2.

Поскольку у нас массив начинается с нулевого номера, то нужно изменить формулs выше, т.е.
для нечетного случая:

iMe = (N +1) / 2 - 1, (1)

для четного случая:

Me = (N / 2 + (N / 2 - 1)) / 2 (2)

Проверим последние формулы.
1) Пусть у нас есть массив (ранжированный по убыванию):
i Y[i]
0 7
1 6
2 5
3 3
4 1
Количество элементов массива N = 5, т.е. нечетно. Значит медиана будет соответствовать значению массива с номером: (5 + 1) / 2 - 1 = 2, т.е. равна Y[2] = 5 (выделено жирным). Использована ф. (1).

2) Пусть у нас есть массив (ранжированный по убыванию):
i Y[i]
0 7
1 6
2 3
3 1
Количество элементов массива N = 4, т.е. четно. Значит медиана будет вычисляться как среднее арифметическое между двумя центральными значениями массива:
(Y[4 / 2] + Y[4 / 2 - 1]) / 2 = (3 + 6) / 2 = 4,5. Использована ф. (2).

Код функции по расчету медианы:
Код: выделить все
double f_GetMed(double &Y[])
{
// Функция возвращает значение медианы в массиве
   int size = ArraySize(Y);
   // сортируем массив по убыванию
   ArraySort(Y, WHOLE_ARRAY, 0, MODE_DESCEND);
   if(size%2 == 0) return((Y[size / 2 - 1] + Y[size / 2]) / 2);
   else return(Y[(size + 1) / 2 - 1]);
}

Массив передается по ссылке в качестве параметра в функцию f_GetMed. Сортируется по убыванию элементов. Далее проверяется если нацело на 2 делится кол-во элементов массива (т.е. их четное кол-во), то рассчитывается значение медианы для четного случая. Если кол-во элементов массива нечетное, то возвращается значение центрального номера массива.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 19923
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 976.15 Доллар
Группа: Главные модераторы
Благодарил (а): 2803 раз.
Поблагодарили: 7385 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения