OCA Учебник online                   

"Спросить - минутный стыд, не спросить - стыд на всю жизнь".
Японская пословица

Отбор анкет (фильтр); удаление анкет
(OCA for Windows)
Часто бывает необходимо отобрать для работы часть анкет из общего массива. Например, мы хотим анализировать только те анкеты, которые заполняли женщины, или анкеты заполненные жителями какой-то конкретной области. Для этого в OCA for Windows есть функция "Отбор анкет (фильтр)"



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



Дело в том, что каждый фильтр для OCA for Windows представляет собой отдельный файл с расширением (три последние буквы имени файла) flt.

Файл-фильтр содержит как условие для отбора анкет, так и информацию про то какая анкета была отобрана, а какая нет.
В вышеуказанном окне Вы можете указать любой ранее созданный Вами фильтр или, указав имя еще не существующего файла-фильтра, создать новый. После этого вы увидите окно настройки фильтра.



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



Для осуществления отбора по условию следует указать условие, которому должны соответствовать отобранные анкеты. Также можно указать любой текстовый комментарий к условию (он носит исключительно информационный характер).

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



При открытии ранее созданного фильтра Вы можете увидеть сообщение о том, что размер массива не соответствует фильтру.



Это значит, что фильтр был рассчитан на массиве с другим количеством анкет. Просто постройте фильтр еще раз (нажмите кнопку "Построить"). Вообще лучше всегда перестраивать фильтр после его открытия. Ведь может быть ситуация когда фильтр был рассчитан на другом массиве, который содержал такое же количество анкет, как и текущий. Если Вы дадите команду построить ранее созданный фильтр, программа у Вас спросит, перестраивать ли его.
После того как фильтр построен, Вы можете нажать кнопку "Подключить", после чего окно настройки фильтра закроется, а фильтр вступит в силу.



Для отключения ранее подключенного фильтра следует снова вызвать функцию отбора анкет, а после появления диалогового окна нажать на нем кнопку "Отмена" или нажать клавишу Esc на клавиатуре.



Увидеть подключен ли сейчас фильтр и, если подключен, то какой можно на нижней информационной панели программы.




Теперь рассмотрим написание условий. Ведь именно отбор по условию используется наиболее часто. Кроме того, писать условия необходимо и при других функциях (например, при построении признаков с помощью условного вычисления). Здесь мы не будем рассматривать все существующие функции (о них можно узнать из справки к программе), рассмотрим наиболее используемые.
Итак, каждое условие отбора представляет собою логическое выражение, которое включает в себя арифметические выражения. После отбора в работе останутся только те анкеты, для которых, описанное логическое выражение, истинно. Так, например, выражение:
мужской пол и возраст более 50 лет
истинно для всех объектов мужского пола в возрасте старше 50 лет.

Поддерживаются три основные логические операции:
И - and
ИЛИ - or
НЕ - not

Логическое И (в условиях записывается как and) - выражение будет истинно если истинными являются оба утверждения, объединенные этой функцией, как это было в нашем предыдущем примере.

Логическое ИЛИ (в условиях записывается как or) - выражение будет истинно, если истинным является хотя бы одно из объединяемых выражений. Так, если перефразировать наш пример:
мужской пол или возраст более 50 лет
то выражение будет истинно для всех мужчин, а также для всех мужчин и женщин старше 50 лет (или мужчина; или любой человек старше 50).

Логическое НЕ (в условиях записывается как not) просто изменяет истину на ложь, а ложь на истину в логических выражениях. Таким образом, выражение
НЕ мужской пол
будет истинно для всех женщин - всех кто имеет пол отличный от мужского. Логическое отрицание позволяет легко инвертировать условие, поменяв местами список отобранных и не отобранных анкет.

Арифметические выражения наверняка и так известны всем, напомним основные:
= равно
< > не равно
> больше
< менше
>= больше или равно
<= меньше или равно
+ сложение
- вычитание
* умножение
/ деление

Таким образом, арифметическое выражение
1+1=2
истинно, а выражение
1+1>2
ложно.

Теперь рассмотрим, как можно обратится к значению некоторого признака в анкете. Для этого номер признака следует записать между двумя знаками диеза. Выражение
#1#=2
при отборе будет интерпретировано, как отбор все анкет, у которых признак номер один равен 2. Отметим, что можно обращаться к признакам не только по номерам, но и по именам. В случае обращения к признаку по его имени, а не по номеру, имя берется в квадратные скобки. Имена признаков задаются в паспорте директивой @qname = Х, где Х - имя признака без квадратных скобок. Так, выражение:
#[Пол]#=1
можно интерпретировать как отбор всех анкет, у которых значение признака, обозначенного как Пол (в комментариях к признаку записано @qname=Пол), равно 1. Выражение
#1#+#[ПК]#=2 or #5#=6
можно интерпретировать так: отобрать все анкеты, у которых сумма значения первого признака и признака с именем ПК (в комментариях к признаку записано @qname=ПК) равно 2 или значение признака номер 5 равно 6.
Вспомним наш пример с отбором мужчин старше 50 лет. И запишем это условие в понятном программе виде. Предположим, что признак, в котором хранится пол опрошенного, имеет номер 10 и его значение 1 соответствует варианту мужчина. А признак возраст имеет номер 11 и хранит количество исполнившихся опрашиваемому лет, на момент проведения исследования. Наш фильтр будет выглядеть так:




Следует отметить, что для шкал с совместимыми альтернативами нельзя использовать выражение равенства. Ведь они содержат одновременно несколько вариантов ответа. Поэтому запись
#5#=1
в случае, если пятый признак является признаком с совместимыми альтернативами, будет некорректна. Для работы с такими признаками существует специальная функция, определяющая присутствие в ответах на признак, того или иного кода. Выглядит эта функция так: E(X,Y) ,где X - номер признака или имя (записанное в квадратных скобках), а Y - код, присутствие которого следует проверить.
Таким образом правильным условием для отбора анкет где в пятом признаке (признаке с совместимыми альтернативами) указан, среди прочих, код 1 будет такая
E(5,1)
Условие
E(5,1) and E(5,3)
поможет нам отобрать анкеты, в которых в пятом признаке (признаке с совместимыми альтернативами) указаны одновременно коды 1 и 3.
Интересная функция caj(x), где X - номер признака с совместимыми альтернативами или имя (как мы помним, записанное в квадратных скобках), возвращает количество выбранных вариантов ответа. Таким образом с помощью условия
Caj(5)<=3
Мы можем отобрать все анкеты, в которых в пятом признаке выбрано 3 и меньше вариантов ответов. Условие
Caj([Sign])=2
отберет нам анкеты, у которых в признаке с именем Sign (в комментариях к признаку записано @qname= Sign) отобрано ровно 2 варианта ответов.

Для отбора анкет имеющих НеОтвет (обозначаемый долларом) в каком-либо признаке, есть специальная функция N(X), где X номер или имя (в квадратных скобках) признака. С помощью записи
N(1)
можно отобрать все анкеты, у которых НеОтвет в признаке номер 1.

Следует отметить, что при работе с нецелыми значениями метрических шкал (значениями, имеющими дробную часть) нежелательно использовать равенство. В случае присутствия дробного значения компьютер ведет расчет с некоторой точностью. Эта точность может быть высока, например, с точность до 10 знака после запятой, но не бесконечна. А значит, есть некие округления и несовпадения. Так, например, если мы хотим проверить, равна ли сумма нескольких метрических признаков (10, 11 и 12) десяти с половиной, при этом в качестве ответов могли использоваться нецелые числа, лучше воспользоваться следующим вариантом:
abs(#10#+#11#+#12# - 10.5)<0.01
Здесь используется арифметическая функция abs, возвращающая модуль числа. Если модуль разницы полученной суммы и 10.5 менее одной сотой (можно указать и меньшее значение), то условие выполняется. Если сумму нецелых значений нужно приравнять к целому числу, можно воспользоваться арифметической функцией округления Round. Например:
round(#10#+#11#+#12#)=10
Такое условие позволит отобрать анкеты, где сумма десятого, одиннадцатого и двенадцатого признака равна десяти.
Следует отметить, при суммировании нескольких признаков лучше пользоваться командой Sum(x,y) где x номер (имя) первого признака из группы, а y - последнего. Таким образом, выщеприведенное условие лучше записать как:

round(sum(10,12))=10

Также среди полезных арифметических функций можно еще отметить функции mod и div.
Функция mod позволяет получить остаток от деления, а с помощью функции div иожно получить целую часть частного.
Например, мы хотим отобрать только анкеты с четным номером. Признак "Номер анкеты" находится в массиве под номером 1. Запишем следующее условие:
#1# mod 2 =0
или, аналогичное предыдущему, но с использованием логического НЕ
not #1# mod 2 =1

Следует помнить, что мы можем управлять порядком вычисления (как арифметических, так и логических) выражений с помощью скобок. Так, например, условие:
#1#=2 and #2#=1 or #3#=1
отберет анкеты у которых первый признак равен 1 и второй признак равен 1, а также все анкеты где значение третьего признака равно 1. А условие:
#1#=2 and (#2#=1 or #3#=1)
отберет анкеты у которых первый признак равен 1 и второй или третий признаки также содержат еденицу.

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



Внимание! Вернуть удаленные анкеты невозможно. Будьте осторожны. Единственное, что можно сделать, если удалены не те анкеты - восстановить массив в том виде, в котором он был на момент загрузки в программу.