Jittering w Tableau
Dziś krótki, praktyczny wpis na temat jitteringu. Brzmi tajemniczo, ale jest (w zamyśle) proste i skuteczne.
Na pewno nie raz spotkałeś się z problemem nakładania danych na mapie - czy to z powodu zbyt dużego zagęszczenia, zbyt małej dokładności danych (np. tylko nazwa miasta a nie konkretne współrzędne), czy po prostu w danych było kilka punktów o identycznych koordynatach.
Co zrobić w takim momencie? Zabawa kolorem ani detalem nic nie da - unikniesz agregacji punktów ale dalej będą wyświetlane jeden pod drugim. Zawsze można też kombinować i używać pociętych custom shapów i podwójnej osi - nie jest to czytelne ani zazwyczaj nie wygląda dobrze - been there, done that. Poza tym coś takiego zadziała tylko, gdy nakładają się dwa punkty. W każdym z tych scenariuszy z pomocą przychodzi nam właśnie jittering. Jeśli czytasz bloga regularnie, to pewnie zauważyłeś pewne podobieństwo konceptu do hex binning.
Cały proces prześledzimy na przykładzie danych dotyczących stadionów w Polsce pochodzących z Wikipedii. Zastosowałem trzy rożne metody - każda ma swoje plusy i minusy.
W tym przypadku źródło danych to arkusz Google, który automatycznie odświeża dane z Wikipedii. Jak to zrobić opisałem we wpisie o prezentacji danych giełdowych w Tableau. Punkty może nie wyglądają jakby były na planie koła (trójkąt powinene być równoboczny, a romb powinen być kwadratem) ale tak jest. Zniekształcenie wynika z zakrzywienia ziemi i spłaszczenia po przeniesieniu na mapę (więcej na ten temat na Wikipedii).
Cały proces prześledzimy na przykładzie danych dotyczących stadionów w Polsce pochodzących z Wikipedii. Zastosowałem trzy rożne metody - każda ma swoje plusy i minusy.
Metoda 1 - Rozrzucenie punktów na planie koła
Najprostsze podejście. Punkty, które normalnie nakładałyby się lub zostały zagregowane rozrzucamy na planie koła wokół pierwotnego położenia. Efekt końcowy wygląda tak:
Kliknij aby przejść do Tableau Public |
W tym przypadku źródło danych to arkusz Google, który automatycznie odświeża dane z Wikipedii. Jak to zrobić opisałem we wpisie o prezentacji danych giełdowych w Tableau. Punkty może nie wyglądają jakby były na planie koła (trójkąt powinene być równoboczny, a romb powinen być kwadratem) ale tak jest. Zniekształcenie wynika z zakrzywienia ziemi i spłaszczenia po przeniesieniu na mapę (więcej na ten temat na Wikipedii).
Aby rozrzucić punkty po okręgu, tworzę nowe pola kalkulowane ze współrzędnymi. Niestety Tableau nie pozwala na używanie wygenerowanych na podstawie miast współrzędnych w kalkukacjach, dlatego też musimy je posiadać w naszym źróde danych. W każdym razie, posiłkując się matematyką podobną do tej użytej we wpisie o radar charts tworzymy następujące pole dla wysokości geograficznej (i analogiczne dla długości):
Nowe współrzędne punktu po jitteringu |
Mark Count to pole liczące ilość punktów po miastach. Czyli, jeśli w danym mieście jest więcej niż jeden stadion to zachodzi jittering, gdzie nowy punkt będzie przesunięty od pierwotnego o Jitter Param (paramter stworzony by ręcznie regulować odległość) w kierunku wyznaczanym przez sinus kąta (=Angle) - dla długości geografinczej jest to analogicznie cosinus.
Zawartość pola =Angle licząca kąt wektora od pierwotnego punktu |
Jak widać na powyższym obrazku, kierunek jitteringu jest liczony przez podzielenie 360 stopni przez liczbę punktów jaką chcemy uzystać dla danego miasta. I tak w przypadku Warszawy, dzielimy 360/3 i uzyskujemy 120 stopni (w Warszawie są trzy stadiony) - uzyskamy więc trójkąt.
Aby łatwiej znaleźć punkty z jednego miasta (co jest szczególnie trudne na śląsku) postanowiłem połączyć je linią. Jednak łącząc je linią nie otrzymujemy zamkniętej figury (czyli np. zamiast pełnego trójkąta otrzymujemy tylko dwa boki). Linie widoczne na wykresie to tak naprawdę przezroczysty polygon z czarnymi granicami. Dla lepszego odbioru, punkty zostaly pokolorowane wg. ilości miejsc na stadionach.
Metoda 2 - Rozrzucenie punktów na spirali
Rozwinięcie poprzedniego konceptu. Jedyna różnica to rozrzucenie nie na planie koła, a spirali (tak, na moim przykładzie są na planie spirali, niestety z powodu małego zagęszczenia danych nie wygląda to tak dobrze jak powinno). Wciąż nie wiadomo do końca, gdzie dokładnie leżały pierwotne punkty, ponieważ wszystkie są przesunięte.
Kliknij aby przejść do Tableau Public |
Aby osiągnąć taki efekt musimy trochę zmienić sposób liczenia nowych współrzędnych. Do kontroli spirali służą dwa parametry - Radius, czyli promień oraz Spacing, czyli odległość między punktami.
Metoda 3 - Punkty na planie koła połączone z centrum
Najbardziej zaawansowana, autorska metoda. Nie jest idealna, ale najlepiej obrazuje dane. W tym przpadku korzystamy z arkusza Excela, który ładujemy poprzez Legacy Connection - ten sam sposób, który jest używany przy sankeyu. Używając UNION w custom SQL duplikujemy dane dodając flagę PATH - 1 dla oryginalnych danych, 2 dla duplikatu.
Po co ta cała operacja? Nie chciałem duplikować danych w Excelu - metoda ma być jak najbardziej powtarzalna i korzystać z możliwości Tableau a nie ctrl+c/ctrl+v. Głównym celem jej użycia jest, jak już pisałem, duplikacja danych - jeden zbiór będziemy używać do wyliczenia punktów po jitteringu a drugi do pokazania dokładnej lokalizacji miasta. Samo Path wykorzystamy też do późniejszego łączenia punktów. Win-win. Metoda ta powoduje niestety też kilka problemów, które wychodzą np. przy tooltipach - przy takim typie połączenie nie można używać wyrażeń typu LOD, przez co nie udało mi się pokazać ilości stadionów w danym mieście. Można to zrobić blendując nasze źródło danych z oryginalnym (niezduplikowanym), gdzie LOD są dostępne, jednak nie jest kluczowe w naszym przykładzie - dlatego pominąłem ten krok.
Kliknij aby przejść do Tableu Public |
A więc jak zabrać się za tworzenie takiej mapy? Koncept jest bardzo podobny do metody pierwszej, w zasadzie wyliczanie punktów rozrzuconych jest takie same. Różnica jest taka, że nie używamy ich bezpośrednio, tylko tworzymy nowe pole kalkulowane łączące oryginalne wartości z rozrzuconymi dla każdej ze współrzędnych.
Wynika z tego problem - jako, że oba typy punktów (rozrzucone - szarne i centralne - czerwone) są generowane przez jedną metryką to maja taki sam stopień granulacji. Innymi słowy - elementy detalu są takie same. A to oznacza, że niestety nie mamy jedneg punktu centralnego, tylko 3 nakładajace się. Czyli zataczamy pewno rodzaju koło, ponieważ właśnie problem z nakładającymi się punkatmi pchnął nas w stronę jitteringu. Oznacza to tyle, że wszystkie wymiary, które chcielibyśmy użyć w tooltipach również muszą brać pod uwagę naszą duplikację danych. Aby już nie komplikować, czerwone kropki (centralne) zawierają w tooltipie tylko nazwę miasta, a szare (rozproszone) bardziej szczegółowe dane. Przykład pola zawartego w tooltipie wygląda tak:
Czyli po prostu pokazujemy pusty tooltip dla centralnej, nie rozproszonej kropki. Dla czytelności na mapie zostały dodane także linie łączące poszczególne stadiony z dokładnym położeniem miasta. Aby uzyskać taki efekt wrzucamy na półkę rzędów nasze zagregowane współrzędne (u mnie Lat MERGED pokazane dwa zrzuty wyrzej) po raz drugi i ustawiamy jako dual axis. Tą metrykę definujemy jako linę, wrzucając na path naszą flage PATH, o czym wspiminałem na początku. Dzięki temu nasza linia zawsze będzie biegła z punktu po jitteringu do oryginalnej lokalizacji.
Aby uzyskać rozróżnienie kolorem, o którym wcześniej wspominałem przy kropkach używamy flagi PATH jako koloru. Dla wielkości kropek użyłem liczbę miejc na stadione. Oczywiście tutaj też nastąpiłą modyfikacja biorąca pod uwagę duplikację danych - tym razem na sztywno, bez parametru.
Wynika z tego problem - jako, że oba typy punktów (rozrzucone - szarne i centralne - czerwone) są generowane przez jedną metryką to maja taki sam stopień granulacji. Innymi słowy - elementy detalu są takie same. A to oznacza, że niestety nie mamy jedneg punktu centralnego, tylko 3 nakładajace się. Czyli zataczamy pewno rodzaju koło, ponieważ właśnie problem z nakładającymi się punkatmi pchnął nas w stronę jitteringu. Oznacza to tyle, że wszystkie wymiary, które chcielibyśmy użyć w tooltipach również muszą brać pod uwagę naszą duplikację danych. Aby już nie komplikować, czerwone kropki (centralne) zawierają w tooltipie tylko nazwę miasta, a szare (rozproszone) bardziej szczegółowe dane. Przykład pola zawartego w tooltipie wygląda tak:
Czyli po prostu pokazujemy pusty tooltip dla centralnej, nie rozproszonej kropki. Dla czytelności na mapie zostały dodane także linie łączące poszczególne stadiony z dokładnym położeniem miasta. Aby uzyskać taki efekt wrzucamy na półkę rzędów nasze zagregowane współrzędne (u mnie Lat MERGED pokazane dwa zrzuty wyrzej) po raz drugi i ustawiamy jako dual axis. Tą metrykę definujemy jako linę, wrzucając na path naszą flage PATH, o czym wspiminałem na początku. Dzięki temu nasza linia zawsze będzie biegła z punktu po jitteringu do oryginalnej lokalizacji.
Aby uzyskać rozróżnienie kolorem, o którym wcześniej wspominałem przy kropkach używamy flagi PATH jako koloru. Dla wielkości kropek użyłem liczbę miejc na stadione. Oczywiście tutaj też nastąpiłą modyfikacja biorąca pod uwagę duplikację danych - tym razem na sztywno, bez parametru.
Co więcej?
Jaki są inne korzyści płynące z jitteringu? Po zastosowaniu funkcji random() dla wyznaczaniu kierunku przesunięcia oraz odległości od oryginalnego punktu opisywana technika świetnie sprawdzi się do anonimizacji danych. Nie chcesz pokazać gdzie dokładnie na mapie znajdują się twoje punkty? Rozrzuć je losowo wyliczając nowe współrzędne.
Podsumowanie
Miał być krótki wpis, znowu nie wyszło. Mam nadzieję, że komuś przyda się opisywana metoda, lub zainspiruje przy rozwiązywaniu podobnych problemów w Tableau.
Wiem też, że przy wprowadzonej w Tableau 10.5 Beta opcji wykresów w tooltipach jittering może nie wydawać się tak przydatny jak wcześniej. Moim zdaniem dalej ma swoje zastosowanie, zwłaszcza w sytuacji kiedy nie chcemy agregować punktów np. ze względu na odmienną charakterystykę lokacji (przykład z życia wzięty: podział na istniejące/planowane inwestycje)
Ze spraw organizacyjnych - w najbliższym czasie będę brał udział w prezentacji user case zastosowania Tableau w online marketingu organizowanej przez Astrafox. Prezentacja odbędzie się na żywo oraz, w późniejszym terminie, jako webinar. Na pewno podzielę się szczegółami, kiedy sam je poznam. Jeśli nie masz licencji to warto pobrać wersję próbną.
Wiem też, że przy wprowadzonej w Tableau 10.5 Beta opcji wykresów w tooltipach jittering może nie wydawać się tak przydatny jak wcześniej. Moim zdaniem dalej ma swoje zastosowanie, zwłaszcza w sytuacji kiedy nie chcemy agregować punktów np. ze względu na odmienną charakterystykę lokacji (przykład z życia wzięty: podział na istniejące/planowane inwestycje)
Ze spraw organizacyjnych - w najbliższym czasie będę brał udział w prezentacji user case zastosowania Tableau w online marketingu organizowanej przez Astrafox. Prezentacja odbędzie się na żywo oraz, w późniejszym terminie, jako webinar. Na pewno podzielę się szczegółami, kiedy sam je poznam. Jeśli nie masz licencji to warto pobrać wersję próbną.
Komentarze
Prześlij komentarz