Реструктурирование данных с сохранением группирующего параметра
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 | * Реструктурирование данных с сохранением группирующего параметра. **Программа составлена Рейналем Левек и применяется к обработке вопросников об оценке качества читаемых курсов **. ** (слушателей просят высказать своё согласие/несогласие с рядом утверждений, характеризующих прослушанный курс). ** Потом может быть интересно в единой таблице сопоставить распределения ответов на отдельные вопросы: ** посмотреть, какие аспекты курса нуждаются в улучшении. **Мой веб-сайт, посвящённый SPSS http://www.spsstools.net **. **Пример поддерживает группирующий признак, преобразовывая данные к "широкому" формату **. **Затем уже на "широком" массиве данных генерируется описательная статистика по каждому из заданных вопросов **. **Синтаксис генерирует отдельный отчёт для каждого значения группирующего признака **. **Данная программа может быть полезна для накопления исторической информации о качестве читаемых курсов **. PRESERVE. SET Printback=ON Length=None Width=80. DATA LIST LIST /var1(A1) vec b a (3F8.0). BEGIN DATA A 1 2 3 A 5 2 4 A 5 3 3 A 5 2 5 B 5 1 5 C 5 3 5 C 5 2 2 D 3 3 3 D 5 5 8 D 0 2 . D 1 1 1 END DATA. * Преобразуем те значения, которые выходят за пределы стандартной шкалы согласия / несогласия (от 1 до 5) в -1. * Далее -1 будет объявлен пропущенным значением. DO REPEAT var=vec TO a. IF Not Any(var, 1, 2, 3, 4, 5) var=-1. END REPEAT PRINT. SAVE OUTFILE='c:\\temp\\mydata.sav'. GET FILE='c:\\temp\\mydata.sav'. ** Определим макрос, задающий число необходимых колонок в широком файле (переменных) **. SET MPRINT=no. AGGREGATE OUTFILE=* /BREAK=var1 /n = N(var1). COMPUTE nobreak=1. AGGREGATE OUTFILE=* /BREAK=nobreak /n = MAX(n). DO IF $CASENUM=1. WRITE OUTFILE='c:\\temp\\define n.sps' /'DEFINE !n()'n'!ENDDEFINE.'. END IF. EXECUTE. INCLUDE FILE='c:\\temp\\define n.sps'. ** Теперь определим макрос, который реструктурирует данные из "высокого" формата в "широкий" **. *////////////. DEFINE !flip(!POS=!TOKENS(1) /!POS=!TOKENS(1) /vnames=!CMDEND) GET FILE='c:\\temp\\mydata.sav'. AUTORECODE VARIABLES=var1 /INTO var1num. !LET !nbvar=!NULL !DO !var !IN (!vnames) /* Считаем число переменных */ !LET !nbvar=!CONCAT(!nbvar,"1") /* создаём нумерованные имена переменных (вектор) */ - STRING !CONCAT('vname',!LENGTH(!nbvar)) (A8). - COMPUTE !CONCAT('vname',!LENGTH(!nbvar))=!QUOTE(!var). /* Запоминаем имя последней переменной */ !LET !lastnam=!var !DOEND !LET !nbvar=!LENGTH(!nbvar) VECTOR vname=vname1 TO !CONCAT('vname',!nbvar) /v=!HEAD(!vnames) TO !lastnam. STRING vname(A8). LOOP cnt=1 TO !nbvar. - COMPUTE c=v(cnt). - COMPUTE vname=vname(cnt). - COMPUTE vnameidx=cnt. - DO IF NOT SYSMIS(c). - XSAVE OUTFILE='c:\\temp\\temp.sav' /KEEP=var1 vname vnameidx c var1num. - END IF. END LOOP. EXECUTE. GET FILE='c:\\temp\\temp.sav'. SORT CASES BY vnameidx var1. COMPUTE casen=$CASENUM. RANK VARIABLES=casen(A) BY vnameidx !1 /RANK INTO idx . VECTOR c(!n). COMPUTE c(idx)=c. AGGREGATE OUTFILE=* /PRESORTED /BREAK=vnameidx var1num /var1 vname c1 TO !CONCAT('c',!n)=FIRST(var1 vname c1 TO !CONCAT('c',!n)). ADD FILES FILE=* /DROP=vnameidx !1. EXECUTE. !ENDDEFINE. *////////////. ** Вызовем макрос для выполнения преобразований **. SET MPRINT=yes. !flip var1num var1 vnames=vec b a. SET MPRINT=no. *Переименовываем переменные. RENAME VARS (VNAME C1 C2 C3 C4 = ITEM V1 V2 V3 V4). EXECUTE. ** Теперь определим макрос для вычисления описательной статистики **. *////////////////////. DEFINE !doit(nb=!TOKENS(1)) !LET !vlast=!CONCAT(v,!nb) VECTOR v=v1 TO !vlast. MISSING VALUES v1 TO !vlast (-1). DO REPEAT cnt=1 TO 5 /c=c1 TO c5 /Nc=Nc1 TO Nc5. . COUNT c=v1 TO !vlast (cnt). . COUNT Nc=v1 TO !vlast (cnt). . COMPUTE mean=MEAN(v1 TO !vlast). . COMPUTE SD=SD(v1 TO !vlast). . COMPUTE n=NVALID(v1 TO !vlast). . COMPUTE c=c/n*100. . COMPUTE NMis=NMIS(v1 TO !vlast). . FORMATS c(PCT4.0) NMis Nc(COMMA8). END REPEAT PRINT. *STRING Item(A4). *COMPUTE Item = SUBSTR(case_lbl,2,2). FORMATS n(COMMA8) mean (F8.2) sd (F8.2). VARIABLE LABEL mean "Среднее" Nc1 "Полн. несогл." Nc2 "Несогл." Nc3 "Нейтр." Nc4 "Согл." Nc5 "Полн. согл." c1 "Полн. несогл.%" c2 "Несогл.%" c3 "Нейтр.%" c4 "Согл.%" c5 "Полн. согл.%" NMis "Пропуски". !ENDDEFINE. *//// ///// //////. * Вызов макроса, вычисляющего статистику. SET MPRINT=yes. !doit nb=!n. SET MPRINT=no. SORT CASES BY VAR1 ITEM. EXECUTE. SPLIT FILE SEPARATE BY var1. Report /FORMAT= CHWRAP(ON) PREVIEW(OFF) CHALIGN(BOTTOM) UNDERSCORE(ON) ONEBREAKCOLUMN(OFF) CHDSPACE(1) SUMSPACE(0) AUTOMATIC LIST BRKSPACE(-1) PAGE(1) MISSING'.' LENGTH(1, 71) ALIGN(LEFT) TSPACE(1) FTSPACE(1) MARGINS(1,101) /TITLE= CENTER 'Отчёт по тестам' ')Год (может быть передан через скрипт, см. комм. ниже)' 'Статистика по вопросам*' LEFT '' /FOOTNOTE= LEFT '* Среднее основано на порядковой шкале, где 5=полное согласие; 4=согласие; 3=неопределённость; 2=несогласие; 1=полное несогласие;' ' SD=Стандартное отклонение (SD показывает изменчивость рейтингов); N=число действительных ответов на данный вопрос;' ' Пропуски=число пропущенных ответов (из-за неприменимости вопросов, неотвеченных вопросов и нераспознанных сканером ответов);' ' Статистика строится на основе действительных ответов студентов, пропуски исключаются из расчёта статистик;' ' Непосредственно число выборов каждой из градаций вопроса можно определить, исходя из представленных процентов, учтя число действительных ответов.' /VARIABLES mean (VALUES) (RIGHT) (OFFSET(0)) (4) sd (VALUES) (RIGHT) (OFFSET(0)) (4) n (VALUES) (RIGHT) (OFFSET(0)) (4) nmis (VALUES) (RIGHT) (OFFSET(0)) (5) SEP1(DUMMY) (3) ' ' c5 (VALUES) (RIGHT) (OFFSET(0)) (5) c4 (VALUES) (RIGHT) (OFFSET(0)) (5) c3 (VALUES) (RIGHT) (OFFSET(0)) (5) c2 (VALUES) (RIGHT) (OFFSET(0)) (5) c1 (VALUES) (RIGHT) (OFFSET(0)) (5) /BREAK item (LABELS) (LEFT) (OFFSET(0)) (10) . SPLIT FILE OFF. **Возможные дополнения. Указанные ниже скрипты помогут сэкономить время на подготовку отчётов **. **Первое: поскольку данные пример может быть полезен для добавления фрагментов данных в более крупный (основной) файл, ** полезным будет добавление переменной с указанием на время, к которому относятся фрагменты данных. ** Начать выполнение синтаксиса можно с вызова скрипта, который запрашивает время, к которому относятся данные (например, год и месяц), ** после чего создаёт макрос !fy, содержащий это значение. Вы можете дополнить синтаксис командой, создающей переменную var со значением ** !fy, после чего информация о времени может быть помещена в заголовок отчёта посредством ** указания строки ')var' в синтаксисе, где var - имя переменной, содержащей информацию о времени **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/dialogs/GetFyFromUserThenRunSyntax.txt **. **Где-то в начале вашей программы поместите команду, подобную той, что приведена ниже, с указанием пути к файлу скрипта **. **SCRIPT FILE='C:\\--(укажите путь к файлу .sbs)--\\GetFyFromUserThenRunSyntax.sbs'. **. ** Указанная версия скрипта пытается вызвать синтаксис report.sps после своего завершения. Можно поправить скрипт так, ** чтобы этого вызова не происходило - примеч. перев. **Второе: Можно использовать скрипт SPSS Clean Viewer для удаления ненужных частей выдачи **. **См.: http://www.spsstools.net/Scripts/OutputDoc/DeleteStatisticsAndCaseProcessingSummary.txt **. **Вызов:. **SCRIPT FILE='C:\\--(подставьте сюда нужный путь к файлу)--\\Clean Viewer.sbs'. **. **Третье: Можно использовать скрипт, экспортирующий выдачу в MS Word для распечатки **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/ImportExport/ExportVisibleOutputToWordViaHTML.txt **. *Четвёртое: если вся выдача направляется одному и тому же человеку, можно использовать скрипт, который направляет всю выдачу по указанному адресу **. **См. скрипт Рейналя Левека: http://www.spsstools.net/Scripts/ImportExport/SendDocumentByEmail.txt **. *Следующая команда восстанавливает исходные установки системы SPSS, сохранённые в начале. RESTORE. |