Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach Krzysztof Kusch Predictive Solutions Tabele zagnieżdżone z sortowaniem po statystykach W tym miesiącu przyjrzymy się bliżej kwestii sortowania w tabelach tworzonych w programie IBM SPSS Statistics za pomocą modułu Tabel użytkownika [ang. Custom tables]. Temat sam w sobie nie jest zbyt skomplikowany, co więcej w najnowszej wersji programu [przypominam, w wersji 21] dostępna jest możliwość sortowania komórek w tabelach już wygenerowanych z poziomu edytora raportów. Jest to niewątpliwie funkcjonalność, na którą wielu z nas niecierpliwie czekało. W tym artykule chciałbym skupić się na paru zasadach, które mogą pomóc w uzyskaniu tabeli o pożądanym układzie (albo pozwolą oszczędzić czas, gdyż będziemy wiedzieć, że niektórych efektów w dany sposób nie da się uzyskać). Znajomość tych zasad jest szczególnie przydatna, gdy nie posiadamy najnowszej wersji programu IBM SPSS Statistics lub gdy chcemy, by generowana tabela nie wymagała dalszej ingerencji ze strony użytkownika (automatyzacja). W związku z tym, że będziemy traktować głównie o zasadach i efekcie, jaki uzyskamy, stosując różnego rodzaju sortowanie w tabelach, będzie to artykuł o zabarwieniu nieco teoretycznym. Co jest naszym celem? W tym artykule skupimy się przede wszystkim na konsekwencjach zastosowania sortowania według statystyk w tabelach zagnieżdżonych. Zanim jednak przejdziemy do tabel tego szczególnego typu, przyjrzyjmy się podstawom sortowania tabel w IBM SPSS Statistics. Otwórzmy zbiór [tabela_wz_sortowanie.sav] i wejdźmy do kreatora [Tabel użytkownika] ([Analiza] u [Tabele specjalne] u [Tabela użytkownika]). Przenieśmy do wierszy zmienną Wewnętrzna i, klikając na przycisk w lewym dolnym rogu, otwórzmy okno [Kategorie] [i podsumowania]. Dolny obszar [Sortuj kategorie] pozwala zdefiniować klucz (wartości, etykieta i liczebność) i porządek (rosnąco lub malejąco) sortowania komórek w tabeli. Zauważmy, że lista kluczy sortowania tabeli zależy od tego, jakie statystyki zostały w niej umieszczone. O ile sortowanie według wartości, etykiet i liczebności pokazuje się zawsze nawet wtedy, gdy nie są zdefiniowane żadne etykiety to pozostałe zależą od statystyk, które zostały umieszczone w tabeli. W tym przypadku w komórkach tabeli znajduje się jedynie liczebność, zatem mamy możliwość wybrania tylko jej. Jeśli dodalibyśmy do tabeli jeszcze procent w kolumnie, to również ta statystyka pojawiłaby się wśród dostępnych kluczy sortowania. Zauważmy również, że oprócz dostępnych tam kluczy sortowania, mamy jeszcze jeden sposób sortowania komórek w tabeli użytkownika, dzięki któremu możemy ręcznie zdefiniować kolejność komórek w tabeli. Aby to zrobić, musimy użyć listy etykiet wartości wyświetlonej w tym oknie i strzałek znajdujących się po prawej stronie, które pozwalają na zmianę kolejności wyświetlania poszczególnych kategorii. Jeśli zmienna nie posiada etykiet wartości lub jest zmienną ilościową ta opcja nie jest dostępna. Zobaczmy, jak zmienia się część kodu generującego tabelę w zależności od wyboru klucza sortowania. Kod tworzący tabelę z ustawieniami domyślnymi (czyli z sortowaniem po wartościach zmiennej) wygląda następująco:
2 Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach CTABLES /VLABELS VARIABLES=wew DISPLAY=LABEL /TABLE wew [COUNT F40.0] /CATEGORIES VARIABLES=wew ORDER=A KEY=VALUE EMPTY=INCLUDE. Za sortowanie odpowiadają dwa słowa kluczowe: ORDER (rosnąco lub malejąco) oraz KEY (wybrany klucz sortowania). Linia kodu zawierająca komendę CATEGORIES kontrolującą wyświetlanie pustych kategorii, wyświetlanie podsumowań i podsumowań częściowych oraz właśnie to, w jakim porządku zostaną wyświetlone kategorie w tabeli. W przypadku standardowo dostępnych kluczy sortowania, w miejsce VALUE po słowie kluczowym, możemy wstawić LABEL (sortowanie po etykietach), a także COUNT (sortowanie po liczebnościach). Natomiast jeśli ręcznie ustawilibyśmy kolejność kategorii w tabeli (za pomocą wspomnianych już strzałek), to słowa kluczowe ORDER i KEY nie pojawiłyby się w ogóle w kodzie, a komenda CATEGORIES wyglądałaby następująco (przy ustawieniu kolejności wyświetlania kategorii w kolejności 2, 1, 3): /CATEGORIES VARIABLES=wew [2, 1, 3, OTHERNM] EMPTY=INCLUDE. Dodany parametr OTHERNM w nawiasach kwadratowych oznacza pozostałe, nie wymienione kategorie. Zauważmy, że dzięki temu możemy spowodować, że część określonych kategorii zawsze będzie wyświetlana na końcu tabeli. Przykładowo, aby wyświetlić kategorię 1 na samym końcu tabeli wyspecyfikowalibyśmy w kodzie [OTHERNM, 1]. Warto podkreślić również, że w przypadku określenia tu listy wartości i pominięcia tego słowa kluczowego, wszystkie niewyspecyfikowane wartości zostaną usunięte z generowanej tabeli. Sortowanie w tabelach zagnieżdżonych Aby dobrze zrozumieć, w jaki sposób odbywa się sortowanie w tabelach zagnieżdżonych, wygenerujmy najpierw dwie osobne tabele dla obu zmiennych znajdujących się w zbiorze danych, w których komórki zostaną posortowane zgodnie z liczebnościami (rosnąco). Prześledźmy krok po kroku generowanie pierwszej z nich: 1. Otwórzmy okno [Tabel użytkownika] i przenieśmy zmienną Wewnętrzna do wierszy tabeli. 2. Następnie wciśnijmy przycisk [KATEGORIE I PODSUMOWANIA], znajdujący się w lewym dolnym rogu tabeli, aby wywołać okno, w którym możemy zdefiniować sposób sortowania komórek w tabeli.
3 Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach 3. W obszarze [Sortuj kategorie] wybieramy z menu [Według] opcję [], dzięki czemu komórki w wygenerowanej tabeli będą umieszczone od najmniej liczebnej do najczęściej występującej. Po określeniu tej opcji klikamy przycisk [Zastosuj], a następnie [OK], aby wygenerować tabelę. Analogicznie wygenerujmy tabelę dla zmiennej zew. Wewnętrzna Kategoria 2 6 Kategoria 3 7 Kategoria 1 9 Zewnętrzna Kategoria 1 10 Kategoria 2 12 Znając rozkłady częstości kategorii obu zmiennych, stwórzmy teraz tabelę zagnieżdżoną, w której komórki zmiennej wewnętrznej (zagnieżdżonej) będą posortowane zgodnie z liczebnościami. Aby to zrobić, przywołajmy ponownie okno kreatora [Tabel użytkownika] i przyciśnijmy przycisk [Resetuj], aby móc zbudować całkowicie nową tabelę. Następnie przenieśmy zmienną Wewnętrzna do wierszy, po czym dodamy obok niej (również do wierszy) zmienną Zewnętrzna, dzięki czemu stworzymy tabelę zagnieżdżoną. Po dokonaniu tych operacji, schemat budowanej tabeli w oknie kreatora powinien wyglądać następująco: Przed kliknięciem przycisku [KATEGORIE I PODSUMOWANIA] upewnijmy się, że kolorem jest podświetlona zmienna wewnętrzna, gdyż to jej wartości w pierwszym kroku będziemy chcieli posortować zgodnie z liczebnościami. Po upewnieniu się, że tak jest, wejdźmy w okno [kategorie i podsumowania] i zdefiniujmy sortowanie komórek w tabeli rosnąco według liczebności. Po tych ustawieniach wygenerujmy tabelę. Zewnętrzna Kategoria 1 Wewnętrzna Kategoria 2 2 Kategoria 2 Wewnętrzna Kategoria 2 4 Kategoria 3 2
4 Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach Jeśli przyjrzymy się liczebnościom w poszczególnych komórkach, zauważymy, że nie są one ułożone malejąco, według liczebności w kategoriach zmiennej zagnieżdżającej, czyli zmiennej zewnętrznej. Gdyby tak było, to spodziewalibyśmy się tabeli, która wyglądałaby następująco: Zewnętrzna Kategoria 1 Wewnętrzna Kategoria 2 2 Kategoria 2 Wewnętrzna Kategoria 3 2 Kategoria 2 4 Zamiast tego, kategorie zmiennej wewnętrznej zostały ułożone zgodnie z rozkładem częstości zmiennej wewnętrznej, który nie uwzględnia żadnej innej zmiennej. Popatrzmy na wcześniej wygenerowaną tabelę z liczebnościami kategorii zmiennej Wewnętrzna najrzadszą kategorią (6 wystąpień) jest Kategoria 2, następną (7 wystąpień) Kategoria 3, a najczęstszą Kategoria 1 z dziewięcioma wystąpieniami. Ma to oczywiście jedną dużą zaletę obie części tabeli stworzone w oparciu o kategorie zmiennej zagnieżdżającej czyta się w ten sam sposób, dzięki czemu odnalezienie się odbiorcy w tej tabeli jest dużo prostsze. Jednocześnie wydaje się jednak, że nie mamy możliwości stworzenia takiej tabeli, jak ta, którą zaprezentowałem powyżej. Nie jest to prawdą, choć aby tabelę uzyskać, będziemy musieli uciec się do małej sztuczki. Zanim jednak przejdziemy do tego zagadnienia, przyjrzyjmy się jeszcze możliwości dawanej nam przez IBM SPSS Statistics w zakresie sortowania tabeli zgodnie z wartościami zmiennej zagnieżdżającej i łączenia sortowania na różnych poziomach zagnieżdżenia. W tym celu wróćmy do okna kreatora [Tabel użytkownika] i zaznaczmy na podglądzie tabeli zmienną Zewnętrzna. Jeśli teraz klikniemy w przycisk [Kategorie i podsumowania] możemy ustawić sposób sortowania tej zmiennej. Ustalmy zatem sortowanie malejąco według liczebności i wykonajmy tabelę: Zewnętrzna Kategoria 2 Wewnętrzna Kategoria 2 4 Kategoria 3 2 Kategoria 1 Wewnętrzna Kategoria 2 2 Tym razem to Kategoria 2 zmiennej Zewnętrznej została pokazana w tabeli jako pierwsza, ponieważ to ona częściej występuje w danych niż Kategoria 1. Jeśli dodalibyśmy teraz kolejne zagnieżdżenie, to sortowanie zmiennej Zewnętrzna podlegałoby takim samym zasadom, jakie zostały omówione w przypadku zmiennej Wewnętrzna. Zauważmy również, że sortowanie kategorii zmiennej zagnieżdżanej nie zmieniło się wciąż ustawione jest sortowanie rosnąco po liczebnościach. Jeśli przyjrzymy się kodowi generującemu powyższą tabelę, zauważymy, że dodana została do niego nowa linia definiująca sposób sortowania zmiennej zew: CTABLES /VLABELS VARIABLES=zew wew DISPLAY=LABEL /TABLE zew [C] > wew [C][COUNT F40.0] /CATEGORIES VARIABLES=zew ORDER=D KEY=COUNT EMPTY=INCLUDE /CATEGORIES VARIABLES=wew ORDER=A KEY=COUNT EMPTY=INCLUDE. Chciałbym teraz wrócić do tematu tabeli z odmiennym sortowaniem dla każdej kategorii zmiennej zagnieżdżającej. O ile w prosty sposób nie możemy tego wyklikać z interfejsu graficznego, to istnieją sposoby na oszukanie programu, dzięki czemu uzyskamy pożądany wynik. W tym miejscu chciałbym pokazać jeden z nich, który możeś okazać się przydatny. Zaprezentowany poniżej, zakłada ingerencję w dane: stworzymy oddzielne zmienne techniczne dla każdej kategorii zmiennej Zewnętrzna i zestawimy je ze sobą w jednej tabeli, dzięki czemu program pozwoli nam sortować je na dowolne sposoby. Ponieważ zmienna Zewnętrzna posiada dwie kategorie, stworzymy dwa zestawy zmiennych w przypadku, gdy
5 Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach zmienna ta będzie przyjmowała wartość 1, to przekopiujemy tę wartość do nowopowstałej zmiennej zew1 i przekopiujemy wartości zmiennej wewnętrzna do nowopowstałej zmiennej wew1. Dla drugiej wartości zmiennej zew te zmienne będą przyjmowały systemowe braki danych. Analogicznie postąpimy dla drugiej kategorii zmiennej zew. Oczywiście moglibyśmy zapisać te działania na danych w postaci prostych wyliczeń warunkowych, aby jednak było nam prościej uogólnić to rozwiązanie, poniżej prezentuję kod zawierający pętlę, dzięki której można zbudować zestaw takich zmiennych technicznych dla większej liczby kategorii: VECTOR zew(2)/wew(2). LOOP #i = 1 TO 2. DO IF zew = #i. COMPUTE zew(#i) = #i. COMPUTE wew(#i) = wew. END IF. END LOOP. EXECUTE. Wszystkie użyte powyżej komendy języka poleceń programu IBM SPSS Statistics zostały już wcześniej omówione przy okazji artykułów z serii o automatyzacji. Po wykonaniu tego kodu oetykietujemy nowe zmienne w ten sam sposób, w jaki są opisane ich zmienne źródłowe (możemy się w tym celu wspomóc bonuspackową procedurą PS Słownikowy opis danych). Po dokonaniu tych operacji otwórzmy kreator [Tabel użytkownika], zresetujmy dotychczasowe ustawienia i wykonajmy następujące kroki: 1. Przenieśmy zmienną wew1 do wierszy tabeli: 2. Wejdźmy w okno [Kategorie i podsumowania] i ustalmy sposób sortowania rosnąco zgodnie z liczebnościami i kliknijmy [zastosuj] 3. Przenieśmy zmienną zew1 do tabeli w ten sposób, że zagnieżdżona w niej zostanie zmienna wew1: 4. Zaznaczmy tę zmienną i wejdźmy w okno [Kategorie i podsumowania], gdzie odznaczymy pole [Pokaż: puste kategori]: 5. Przenieśmy teraz zmienną wew2 do tabeli w ten sposób, że zostanie ona umieszczona pod tymi już się w niej znajdującymi:
6 Raportowanie Tabele zagnieżdżone z sortowaniem po statystykach 6. Wejdźmy ponownie w okno [Kategorie i podsumowania], ustalmy sposób sortowania rosnąco zgodnie z liczebnościami i kliknijmy [zastosuj]: 7. Zagnieźdźmy tę zmienną w zmiennej zew2 : 8. i ustalmy również w jej kategoriach i podsumowaniach, że nie mają być pokazywane puste kategorie: 9. Wykonajmy tabelę: Zewnętrzna Kategoria 1 Wewnętrzna Kategoria 2 2 Zewnętrzna Kategoria 2 Wewnętrzna Kategoria 3 2 Kategoria 2 4 W przypadku małej liczby kategorii, prościej byłoby nam osiągnąć ten efekt ręcznie. Natomiast w przypadku procedur automatyzujących i zmiennych o wielu kategoriach, ten sposób może być wygodniejszy (w przypadku wielu kategorii lepiej byłoby budować tabelę w języku poleceń). Rozwiązanie to jest dość skomplikowane, gdyż w większości przypadków, zagnieżdżając tabelę, będziemy zapewne korzystać ze standardowych funkcjonalności chciałbym jednak, abyśmy pamiętali, że są dostępne inne sposoby sortowania, choć czasami nie na proste wyciągnięcie ręki. Predictive Solutions ul. Racławicka 58 30-017 Kraków tel. 12 636 96 80 faks wew. 102 e-mail [info@predictivesolutions.pl] [www.predictivesolutions.pl]