logo
Верификация данных

3.1.2 Основные функции программы

В заголовочном файле «Fdstat.h» реализовано несколько функций для обработки и визуализации данных, а также объявлено три переменных в области глобальной видимости.

Переменные вещественного типа с двойной точностью «double» «vctdstat» и «vctads» размерностью 51 элемент для хранения выборки, и аномальных значений соответственно. Переменная типа «int» «nd» хранящая размерность выборки.

Функция «func_mo» реализует расчет математического ожидания выборки, в качестве параметров принимает вектор вещественного типа длиной 51 элемент, нижнюю и верхнюю границу подсчета (целочисленного типа).

Данные с нижней границы по верхнюю границу суммируются и делятся на число наблюдений.

Функция «func_s» реализует расчет СКО выборки, в качестве параметров принимает вектор вещественного типа длиной 51 элемент, нижнюю и верхнюю границу подсчета (целочисленного типа), математическое ожидание выборки (вещественного типа).

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

Функция обработчик события «Load_Form» реализует основную работу метода D статистики. В таблицу заносятся критические значения критерия Смирнова-Граббса для уровня значимости 0,05. Затем ряд ранжируется по возрастанию с помощью сортировки Шелла (листинг 6). После ранжирования данных по возрастанию, в цикле с предусловием, рассчитывается критерий Смирнова-Граббса, и сравнивается с табличным для текущего размера выборки. Если расчетное значение превышает табличное, данное признается аномальным и исключается из выборки (цикл и его тело приведено в листинге 7).

Листинг 6 сортировка Шелла

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++

step=Convert::ToInt32(floor(nd/2.0))+1;

while (step>0)

{

i=1;

while (i<=nd-step)

{

if (mas[i]>mas[i+step])

{

temp=mas[i];

mas[i]=mas[i+step];

mas[i+step]=temp;

i=1;

}

else

i=i+1;

};

step=Convert::ToInt32(floor(Convert::ToDouble(step)/2.0));

};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++

Листинг 7 цикл исключения аномальных данных

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++

while (flmin||flmax)

{

if (flmax)

{

dmax=(mas[upi]-

func_mo(dwi,upi,mas))/func_s(dwi,upi,mas,func_mo(dwi,upi,mas));

if (dmax<dtbl[upi-dwi+1])

flmax=false;

};

if (flmin)

{

dmin=(func_mo(dwi,upi,mas)-

mas[dwi])/func_s(dwi,upi,mas,func_mo(dwi,upi,mas));

if (dmin<dtbl[upi-dwi+1])

flmin=false;

};

if (flmax)

upi--;

if (flmin)

dwi++;

if (upi-dwi+1<3)

break;

};

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++

В заголовочном файле «Fktm.h» реализовано несколько функций для обработки и визуализации данных, а также объявлено три переменных в области глобальной видимости.

Переменные вещественного типа с двойной точностью «double» «vctktm» и «vctakt» размерностью 51 элемент для хранения выборки, и аномальных значений соответственно. Переменная типа «int» «nk» хранящая размерность выборки.

При загрузке формы, данные ранжируются по возрастанию и выводятся в таблицу, пользователь должен оценить их и ввести количество аномальных данных сверху и снизу ряда. Общее число аномальных данных не более 10. Проверка на корректность ввода реализуется с помощью функции «func_strtoint», которая возвращает значение истина, если число не корректно введено пользователем.

Сортировка реализована аналогично сортировке в заголовочном файле «Fdstat.h».

Критические значения критерия Титьена-Мура заносятся в матрицу для уровня значимости 0,05.

Работа метода реализована в обработчике события нажатия кнопки «Анализ данных».

Вычисляются среднее по всей выборке, среднее по выборке без аномальных данных, сумма квадратов разностей значений ряда и среднего с аномальными данными, сумма квадратов разностей значений ряда и среднего без аномальных данных. Затем первая сумма делится на вторую, частное от деления и есть критерий Титьена-Мура.

Если вычисленное значение меньше табличного для данного размера выборки и количества аномальных данных, то в выборке имеются аномальные значения, и те значения, которые выбрал пользователь, исключаются из выборки.

В листинге 8 приведен код расчета критерия Титьена-Мура.

Листинг 8 критерий Титьена-Мура:

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++

i=step=1;

movct=moint=smm1=smm2=0.0;

while (i<=nk)

{

movct=movct+mas[i];

i++;

};

i=1;

movct=movct/Convert::ToDouble(nk);//среднее ряда

i=dwi+1;

while(i<=(nk-upi))//среднее ряда без аномальных значений (аномальных

по предположению)

{

moint=moint+mas[i];

i++;

};

i=1;

moint=moint/Convert::ToDouble(nk-(dwi+upi));

i=dwi+1;

while(i<=(nk-upi))//числитель для критерия

{

smm1=smm1+(mas[i]-moint)*(mas[i]-moint);

i++;

};

i=1;

while (i<=nk)//знаменатель

{

smm2=smm2+(mas[i]-movct)*(mas[i]-movct);

i++;

};

k_e=smm1/smm2;

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

++++++++++++++++

В заголовочном файле «Fbox.h» реализовано несколько функций для обработки и визуализации данных, а также объявлено две переменных в области глобальной видимости.

Переменная вещественного типа с двойной точностью «double» «vctbox» размерностью 51 элемент для хранения выборки и переменная типа «int» «nb» хранящая размерность выборки.

Данные ранжируются по возрастанию. Находится медиана (если объем выборки нечетное число, то это середина ряда данных, иначе это среднее арифметическое между двумя серединными значениями). Вычисляются квартили, межквартильный размах, шаг межквартильного размаха, внутренние и внешние барьеры.

В циклах, с помощью прохода по вектору ранжированных данных и сравнению с рассчитанными величинами определяются внешние и отскакивающие данные, вычисляются «усы ящика», подсчитывается количество дополнительных точек лдя построения диаграммы (листинг 9).

Листинг 9 диаграмма «Ящик с усами»:

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++

i=j=step=0; temp=0.0;

//вычисление значений для построения диаграммы

if (fmod(Convert::ToDouble(nb),2.0)<0.000000000001)//если размер

выборки четное число

{

i=nb/2;

mdn=(mas[i]+mas[i+1])/2.0;

}

else

{

i=(nb+1)/2;

mdn=mas[i];

};

i=Convert::ToInt32((Convert::ToDouble(nb)*25.0)/100.0);

q1=mas[i]; q2=mas[nb-i+1];

iqr=q2-q1;

siqr=1.5*iqr;

bi1=q1-siqr; bi2=q2+siqr;

be1=q1-2*siqr; be2=q2+2*siqr;

//завершение вычислений значений для построения диаграммы

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++

//++++++++++вычисление различных не стандартных значений++++++

i=j=step=1;

while (i<=nb)//примыкающие данные (усы)

{

if (mas[i]>bi1)

{

us1=mas[i];

break;

};

i++;

};

i=nb;

while (i>0)//примыкающие (усы)

{

if (mas[i]<bi2)

{

us2=mas[i];

break;

};

i--;

};

i=step=j=1;

v1=v2=sc1=sc2=0;

while (i<=nb)//внешние данные

{

if ((mas[i]<bi1)&&(mas[i]>be1))

{

this->axvsFlexArray2->set_TextMatrix(1,j,Convert::ToString(mas[i]));

v1=i;

sc1++;

j++;

};

i++;

};

i=nb;

while (i>0)//внешние данные

{

if ((mas[i]>bi2)&&(mas[i]<be2))

{

this->axvsFlexArray2->set_TextMatrix(1,j,Convert::ToString(mas[i]));

v2=i;

sc2++;

j++;

};

i--;

};

i=j=step=1;

step=0;

while (i<=nb)//anomal data

{

if (mas[i]<be1)

{

this->axvsFlexArray3->set_TextMatrix(1,j,Convert::ToString(mas[i]));

step=i;

j++;

};

i++;

};

i=nb;k=0;

while (i>0)//anomal data

{

if (mas[i]>be2)

{

this->axvsFlexArray3->set_TextMatrix(1,j,Convert::ToString(mas[i]));

k=i;

j++;

};

i--;

};

//+++завершение вычисления различных не стандартных значений++

//+++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++