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
* Вопрос. Может ли кто порекомендовать ПО, которое бы строило графики распределения, например, гистограммы, и могло бы подсвечивать определённые точки данных.
Я провожу исследование удовлетворённости трудом на предприятии и для каждого отдела вычисляю, скажем, средний уровень удовлетворённости содержанием работы. В данный момент мы выдаём отделам  таблицу, где указан средний уровень удовлетворённости по предприятию в целом и уровень удовлетворённости для определённого отдела. Было бы здорово графически изобразить эти данные, указав, какое место занимает отдел в общем распределении уровней удовлетворённости по предприятию.

* Ответ. Автор: rlevesque@videotron.ca, размещено в новостной группе SPSS 10.08.2001.

* NB! Синтаксис предполагает работу с шаблоном графика. Данный шаблон корректно работает лишь в версиях SPSS для Windows до 11 включительно. - А.Б.
* NB! Здесь не строится гистограмма, как было указано в вопросе, но зато вычисляется процентиль, к которому относится наблюдение. - А.Б.

SET MPRINT=yes.

*///////////////////// Определяем макрос /////////////////////////.
DEFINE !print(myvar=!TOKENS(1))

GRAPH  /HISTOGRAM=!myvar .

!DO !counter = 1 !TO !EVAL(!n).
COMPUTE mypct=0.
IF ($casenum=!counter) mypct=pct.
!LET !name=!EVAL(!CONCAT('!id',!counter))
!LET !title=!QUOTE(!CONCAT("Выделенный кружок обозначает ",!name))
GRAPH
   /TEMPLATE="c:\\temp\\IdentifyYourOwnData.sct"
   /SCATTERPLOT(BIVAR)=!myvar WITH id BY mypct
   /MISSING=LISTWISE
   /TITLE=!title
   /FOOTNOTE='(mypct - процентиль, к которому относится наблюдение)' .
!DOEND.

!ENDDEFINE.
*----------------------------Конец макроса ----------------.

*////////////////////////////////////////////.
DEFINE !main (myvar=!TOKENS(1) /idname=!TOKENS(1))
RANK
  VARIABLES=!myvar  (A) /PERCENT INTO pct /N into n  /TIES=MEAN .
SORT CASES BY pct.
COMPUTE id=$CASENUM.

* Переменная  n, созданная выше командой RANK, содержит число наблюдений в файле.
* Запишем его в макрос чтобы потом иметь возможность использовать.
DO IF $CASENUM=1.
WRITE OUTFILE 'c:\\temp\\temp.sps' /"DEFINE !n()"n"!ENDDEFINE.".
END IF.
EXECUTE.

* Загружаем созданный выше макрос в память.
INCLUDE FILE='c:\\temp\\temp.sps'.

* Определим макрос, который содержит имя (номер, id) каждого наблюдения.
STRING mac_name(A8).
COMPUTE mac_name=CONCAT('!id',LTRIM(STRING(id,F8.0)," "),"()").  
DO REPEAT r=1 TO !EVAL(!n).
+ DO IF id=r.
+ WRITE OUTFILE 'c:\\temp\\temp id names.sps' /"DEFINE "mac_name !idname"!ENDDEFINE.".
+ END IF.
END REPEAT.
EXECUTE.
INCLUDE 'c:\\temp\\temp id names.sps'.
!print myvar=!myvar.

!ENDDEFINE.
*////////////////////////////////////////////.

******* Пример 1.
GET FILE='C:\\Program Files\\SPSS\\WORLD95.sav'.
* Поскольку каждое наблюдение уже содержит обобщённые результаты по стране, никакой дополнительной обработки не требуется.
* Следующая команда просто чтобы урезать файл данных и размер выдачи - оставим в файле первые 10 стран.
N OF CASES 10.

* Вызовем макрос, показывающий плотность населения для каждой страны на отдельном графике.
!main myvar=density idname=country.

******* Пример 2.
GET FILE='C:\\Program Files\\SPSS\\Employee data.sav'.

* Посчитаем сначала средний заработок по категориям jobcat.
AGGREGATE
  /OUTFILE=*
  /BREAK=jobtime
  /salary = MEAN(salary).


* Вызываем макрос.
!main myvar=salary idname=jobtime.