czwartek, 10 listopada 2016

Kalkulacje w Tableau cz 1 - Kolejność wykonywania działań w Tableau

Każdy kto pracuję dłużej z Tableau z pewnością nie raz spotkał się z sytuacją, w której w wyniku pewnych kalkulacji otrzymujemy nieco inne wyniki, niż moglibyśmy się tego spodziewać - dotyczy to głównie kalkulacji typu 'Percent of Total' oraz obliczeń opartych na dynamicznie zmieniających się polach, np. Setach czy Top N. Przyczyną takich niespodziewanych zachowań jest zazwyczaj specyficzna kolejność wykonywania działań, która jest wykorzystywana przez Tableau.



Jak widać na powyższym rysunku, sytuacja jest dosyć skomplikowana i może doprowadzić do wielu nieścisłości. Oprócz kilku typów filtrów zaznaczonych na niebiesko (extract, data source, context, dimension i measure filter) pojawia się tutaj sporo różnych typów kalkulacji wykorzystywanych w Tableau. Przyjrzyjmy się tym operacjom nieco bliżej:

  1. Extract Filters - filtry dostępne jedynie w momencie tworzenia ekstraktu źródła danych
  2. Data Source Filters - filtry dostępne z poziomu menu kontekstowego po kliknięciu na źródle:
  3. Context Filters - czyli tzw. filtry niezależne, które zawężają zakres danych branych pod uwagę przez filtry na poziomie wymiaru (dimension). Ich zastosowanie zazwyczaj znacznie poprawia wydajność i umożliwia budowanie ciekawych filtrów na bazie parametrów (top N). Dostępne po PPM na istniejącym dimension pod opcją 'Add to Context'
  4. Sets, Conditional and Top N filters - wspomniane w poprzednim punkcie, omówimy je nieco później na przykładzie
  5. FIXED Level of Detail - specjalny typ kalkulacji pozwalający tworzyć zaawansowane, kontekstowe kalkulacje na dowolnym poziomie szczegółowości - pokażemy to na przykładzie
  6. Dimension Filters - czyli zwykłe filtry na poziomie danego wymiaru. Odpowiednik SQL-owego WHERE
  7. Data Blending - operacja łącząca dane z wielu niejednolitych źródeł (nie mylić z joinami, które zazwyczaj wykonywane są w obrębie jednego źródła danych)
  8. INCLUDE i EXCLUDE Level of Detail - kalkulacje z tej samej grupy co wspomniany FIXED LoD, różnice między poszczególnymi wariantami zostaną omówione w osobnym artykule
  9. Measure filter - zwykły filtr na poziomie miary, np. całkowitej sprzedaży. Odpowiednik SQL-owego HAVING
  10. Totals - Totale kalkulowane przez Tableau, dostępne w Analysis-Totals
  11. Forecasts  - automatyczne prognozy generowane przez Tableau (panel Analytics)
  12. Table Calculations - szereg standardowych kalkulacji dostępnych w menu kontekstowym po kliknięciu PPM na istniejącej kalkulacji - zostaną omówione w osobnym artykule
  13. Trend Lines, Reference Lines - pomocnicze linie rysowane przez Tableau, dostępne w panelu Analytics
Skoro mamy za sobą teorię, to pora zobaczyć to w praktyce na dwóch prostych przykładach

PRZYKŁAD 1 - zastosowanie filtra kontekstowego

Bazując na źródle danych Superstore dostępnym z każdą wersją Tableau Desktop, utwórzmy prosty wykres pokazujący najbardziej wpływowych klientów ze stanu New Jersey. W tym celu zbudujemy prostą wizualizację przedstawioną na poniższym rysunku;

Po odpowiednim posortowaniu rezultatów widzimy czołówkę najlepszych klientów - podium wygląda obecnie następująco:
  1. Bill Shonoley
  2. Annie Thurman
  3. Karen Ferguson
Teraz spróbujmy utworzyć dodatkowy filtr, który pokaże nam tylko 10 najlepszych klientów. W tym celu przeciągamy Customer Name na pole filtru i wybieramy następujące opcje w zakładce Top:

Po zaaplikowaniu tego filtru naszym oczom powinna ukazać się lista 10 osób - na pierwszy rzut oka wszystko wygląda ok. Zwróćmy jednak uwagę na to, że lista uległa zmianie i nie zawiera identycznych nazwisk, np. brakuję nam Annie Thurman, która uprzednio zajmowała drugie miejsce!
Dlaczego się tak dzieję? Otóż odpowiedź tkwi właśnie w kolejności wykonywania działań przez Tableau - zarówno filtr na poziomie Stanu, jak i filtr Top 10 klientów są przykładami dimension filters i zostały przez Tableau wykonane jednocześnie zgodnie z poniższą hierarchią:


W tym momencie powinniście już wiedzieć, co się stało. Jedynym sposobem na rozwiązanie tego problemu jest zastosowanie filtru kontekstowego w przypadku State, tak aby filtrowanie zostało wykonane przed filtrem Top N - w ten sposób zawężamy liczbę rekordów i będziemy w stanie znaleźć właściwe 10 osób z największą sprzedażą w tym Stanie. Aby to zrobić musimy kliknąć PPM na polu State i skorzystać z opcji Add to context. Zwróć uwagę, że pole zmieniło swój kolor na szary. Końcowy rezultat tej operacji jest identyczny z oryginalną listą:


 Ten prosty przykład pokazał nam jedna z popularniejszych pułapek, jakie grożą nam w przypadku jednoczesnego zastosowania kilku filtrów w Tableau. Teraz pora na kolejny przykład.

PRZYKŁAD 2 - zastosowanie kalkulacji Level of Detail FIXED

W tym przykładzie przyjrzymy się jaki jest procentowy udział poszczególnych kategorii produktów w całkowitej sprzedaży. Aby odpowiedzieć na to pytanie zbudujemy prosty wykres oraz wykorzystamy jedną ze standardowych Tableau Calculations - Percent of Total:

Po wykorzystaniu tej funkcji na polu SUM(Sales) pojawił się dodatkowy trójkąt symbolizujący zastosowanie table calculation. Teraz wystarczy tylko posortować wyniki malejąco i pokazać labele (kliknij na symbolu 'Abc' w górnym panelu albo przeciągnij ponownie SUM(Sales) trzymając Ctrl i upuść na półce Label.

Zwróć uwagę na dwie pierwsze kategorię oraz ich udział w całkowitej sprzedaży:
  1. Telefony - 14.37%
  2. Krzesła - 14.3%
Teraz kliknijmy PPM na sub-category i wybierzmy opcję 'Show Filter' a następnie odznaczmy jedną z kategorii w menu po prawej, np. Stoły. Zwróć uwagę na zmianę wartości procentowych dla dwóch pierwszych kategorii.

Tableau ponownie przekalkulowało procenty dla wszystkich kategorii wyłączając część odpowiedzialną za Stoły. Niejednokrotnie chcemy jednak, żeby zmiany dokonywane w bieżącym widoku za pomocą Quick filters nie miały wpływu na tego typu kalkulacje. W takim przypadku jedynym ratunkiem okazuję się kalkulacja Level of Detail (FIXED), która pozwoli nam zablokować kontekst wyliczenia procentowego na poziomie kategorii niezależnie od wybranych filtrów. Aby lepiej zrozumieć tę sytuację spójrzmy ponownie na kolejność wykonywania działań.

Aby rozwiązać nasz problem musimy skalkulować udział procentowy za pomocą kalkulacji Level of Detail typu FIXED, która zostanie wykonana przed zaaplikowaniem filtru na poziomie kategorii.
LoD to bardzo potężne kalkulacje, które pozwalają dokonywanie obliczeń w oparciu o dowolny wymiar (dimension) nawet, jeśli nie jest on częścią danego widoku. Aby lepiej zrozumieć tego typu kalkulacje, odsyłam do oficjalnych zasobów na stronie Tableau oraz zapraszam na specjalny artykuł dedykowany LoD, który pojawi się w ramach naszej serii Kalkulacji w Tabelau :)

Tymczasem aby rozwiązać nasz problem musimy użyć następującej kalkulacji, która podzieli Sumę sprzedaży dla danej kategorii przez stałą sumę sprzedaży:
SUM([Sales])/SUM({FIXED : SUM([Sales])})

Zapisz kalkulację jako nowe pole np. Sum of Sales FIXED i przeciągnij je na kolumnę obok Sum(Sales) aby zobaczyć różnicę w obu wyliczeniach. Dla ułatwienia możesz też zmienić format wyświetlania wartości na procentowy tak jak w pierwszej kalkulacji:

Możesz teraz porównać liczby i przekonać się, że wartości pokazywane przez wykres po prawej nie ulegną zmianie w przypadku dowolnej zmiany selekcji kategorii :)

Mam nadzieje, że te przykłady pokazały jak ważne jest zrozumienie kolejności wykonywania działań w Tableau. Polecam przyswoić sobie drzewko kolejności działań (zwane potocznie query pipeline), gdyż będziemy się do niego często odwoływać. Zachęcam do samodzielnego eksperymentowania i zapraszam na dalsze artykuły w serii Kalkulacje w Tableau!

Brak komentarzy:

Publikowanie komentarza