Jak wizualizowałbyś segmentowany lejek? (i czy możesz to zrobić za pomocą Pythona?)

9

Widziałem ten post w Moz, który przedstawiał segmentowy lejek marketingowy:wprowadź opis zdjęcia tutaj

Tego rodzaju rzeczy miałyby w mojej pracy dużą wartość. Nie mam pojęcia, jak wizualizować nieprzetworzone dane, aby pokazać taki segmentowy lejek. Chodzi o to, że potencjalni klienci pochodzą z różnych źródeł (których używamy do segmentacji danych) i przechodzą przez kilka etapów, zanim przekształcą się w umowę. Z każdego etapu do drugiego niektóre odpadają. Szerokość każdego wycinka zależy od bezwzględnej liczby odprowadzeń w każdym z nich. [ EDYCJA : Zwróć uwagę, że obraz użyty tutaj jako odniesienie wprowadza w błąd, jeśli chodzi o liczby określone po prawej stronie każdego plasterka. Wydaje się, że nie ma związku między szerokością wycinka a liczbą. Zdjęcie należy traktować wyłącznie jako odniesienie do projektu segmentowanego lejka].

W każdym razie jakiś pomysł, jak to zwizualizować? Jeśli to możliwe, chciałbym mieć taką możliwość w Pythonie.

Oto dokument Google z danymi pozornymi, jeśli ktoś potrzebuje trochę ...

Czekamy na twoje spostrzeżenia. Dzięki!

Optimesh
źródło
5
Uważam tę ilustrację za mylącą ze względu na wbudowany w nią ogromny czynnik Lie Factor: kolejne poziomy „lejka” używają różnych skal, które zmieniają się nieregularnie. Tak więc szerokości pasm nie są w każdym przypadku określane liczbami bezwzględnymi - przynajmniej nie w żaden łatwo zrozumiały lub wizualizowany sposób. Więc o co pytasz: czy są lepsze sposoby wizualizacji takich danych lub jak stworzyć tę grafikę w Pythonie?
whuber
Aby pracować w jakimkolwiek oprogramowaniu, zwykle można po prostu wprowadzić kategorię przesunięcia dla ułożonych prętów, a następnie uczynić ją niewidoczną. Oto przykład z tym samym arkuszem kalkulacyjnym Google. Widać, że jest to nieskuteczne mianowicie. dla kategorii, które w tym przykładzie są zmniejszone do zera.
Andy W
1
@whuber Cześć. Nie jestem pewien, czy podążam. Każdy poziom to liczby bezwzględne ... a każdy poziom jest podgrupą poprzedniego poziomu. Proszę wyjaśnić, dlaczego skala zmienia się nieregularnie. Dzięki!
Optimesh,
3
Górny segment reprezentuje 1,5 miliona odwiedzin i obejmuje około 500 pikseli na moim ekranie: jeden piksel = 3000 odwiedzin. Dolny segment reprezentuje 5000 odwiedzin i obejmuje około 150 pikseli na moim ekranie zamiast mniej niż 2 (jak wskazał @Andy w swoim przykładzie). To przesada od około 100 do 1. Ponieważ grafika w tym pytaniu wydaje się nie przejmować się taką przesadą, wydaje się, że przeskalowanie segmentów nie ma sensu: można uzyskać lepszą informację, ustawiając je na całej długości i na grafice byłby mniej zwodniczy.
whuber
1
@ whuber Och, rozumiem, co masz na myśli. Tak, właśnie przyniosłem ten obraz jako przykład tego, co chcę zrobić wizualnie. Same liczby wprowadzają w błąd, bez wątpienia.
Optimesh,

Odpowiedzi:

3

Ten wykres wyświetla dwukierunkową tabelę zdarzeń awaryjnych, której dane są w przybliżeniu następujące:

                      Branded Unbranded Social Referring Direct   RSS
First-time...          177276    472737  88638    265915 472737 59092
Return Visits...       236002    629339 118001    354003 629339 78667
4+ Visits in ...       166514    444037  83257    249771 444037 55505
10+ Visit in ...        28782     76751  14391     43172  76751  9594
At Least One Visit...    6707     17886   3354     10061  17886  2236
Last Touch...             660      1759    330       989   1759   220

Istnieją niezliczone sposoby na zbudowanie tej fabuły. Na przykład, możesz obliczyć pozycje każdej prostokątnej łaty koloru i osobno wstawić każdą łatkę. Ogólnie jednak pomaga znaleźć zwięzły opis tego, jak wykres reprezentuje dane.

Jako punkt wyjścia możemy postrzegać ten wariant jako odmianę skumulowanego wykresu słupkowego.

Rysunek 1: skumulowany wykres słupkowy.

Ten wykres nie wymaga opisu: dzięki znajomości wiemy, że każdy rząd prostokątów odpowiada każdemu rzędowi tabeli awaryjnej; że długości prostokątów są wprost proporcjonalne do ich liczby; aby się nie nakładały; i że kolory odpowiadają kolumnom tabeli.

Jeśli przekonwertujemy tę tabelę na „ramkę danych” lub „tabelę danych” posiadającą jeden wiersz na liczbę z polami wskazującymi nazwę wiersza, nazwę kolumny i liczbę, wówczas wykreślenie zwykle oznacza wywołanie odpowiedniej funkcji i określenie, gdzie znaleźć nazwy wierszy, nazwy kolumn i liczby. Przy użyciu implementacji gramatyki grafiki ( pakietu dla ) wyglądałoby to mniej więcej takXggplot2R

ggplot(X, aes(Outcome, Count, fill=Referral)) + geom_col() 

Szczegóły grafiki, takie jak szerokość rzędu pasków i jakich kolorów użyć, zwykle muszą być wyraźnie określone. To, jak to się dzieje, zależy od środowiska kreślenia (i dlatego jest stosunkowo mało interesujące: wystarczy go poszukać).

Ta konkretna implementacja gramatyki grafiki zapewnia niewielką elastyczność w ustawianiu pasków. Jednym ze sposobów na uzyskanie pożądanego wyglądu, przy minimalnym wysiłku, jest wstawienie niewidocznej kategorii u podstawy każdego paska, tak aby paski były wyśrodkowane. Trochę myślenia sugeruje, że fałszywa liczba potrzebna do wyśrodkowania każdego słupka musi być średnią z całkowitej długości paska i długości najdłuższego paska. W tym przykładzie byłaby to początkowa kolumna z wartościami

 254478.0       0.0  301115.0  897955.0  993610.5 1019817.0 

Oto wynikowy skumulowany wykres słupkowy pokazujący fałszywe dane w kolorze jasnoszarym:

Rysunek 2

Pożądaną liczbę tworzy się, czyniąc grafikę fałszywej kolumny niewidoczną:

Rycina 3

Opis fabuły w gramatyce grafiki nie musi się zmieniać: po prostu dostarczyliśmy inną tabelę zdarzeń, która ma być renderowana zgodnie z tym samym opisem (i przesłoniliśmy domyślne przypisanie kolorów dla fałszywej kolumny).

Komentarze

Te grafiki są uczciwe: poziomy zasięg każdej kolorowej łaty jest wprost proporcjonalny do podstawowych danych, bez zniekształceń. Porównanie ich z oryginałem (w pytaniu) pokazuje, jak ekstremalne jest jego zniekształcenie ( czynnik Lie Tufte'a ).

Jeśli chcesz wyświetlić szczegóły na dole „ścieżki”, rozważ przedstawienie liczb według powierzchni, a nie długości. Możesz ustawić długości prętów proporcjonalnie do pierwiastków kwadratowych całkowitych długości i ich szerokości (w kierunku pionowym) również proporcjonalne do pierwiastków kwadratowych. Teraz dolna część „lejka” będzie miała około jednej dwudziestej najdłuższej długości, a nie jednej cztersetnej, co pozwoli na pokazanie szczegółów. Niestety ggplot2implementacja nie pozwala zmapować zmiennej na szerokość pręta, dlatego potrzebne jest bardziej zaangażowane obejście (takie, które rzeczywiście opisuje każdy prostokąt osobno). Być może istnieje implementacja w języku Python, która jest bardziej elastyczna.

Bibliografia

Edward Tufte, Wizualne wyświetlanie informacji ilościowych . Cheshire Press 1984.

Leland Wilkinson, The Grammar of Graphics. Springer 2005.

Whuber
źródło