W Tableau możemy
przeprowadzać analizy statystyczne poprzez wykonywanie obliczeń za pomocą pól
kalkulowanych, a następnie wizualizację danych i wyników. W przypadku
niektórych współczynników statystycznych wymagałoby to wprowadzenia
skomplikowanego wzoru. Aby uprościć sobie pracę, możemy skorzystać z połączenia
Tableau z R, dzięki któremu mamy dostęp do pakietów z funkcjami, algorytmami,
testami czy modelami statystycznymi.
TECHNICZNE ASPEKTY POŁĄCZENIA
Z R
Uzyskanie połączenia umożliwia zainstalowanie pakietu Rserve,
dzięki któremu za pomocą pól kalkulowanych w Tableau wysyłamy polecenie do R.
Proces instalacji pakietu i konfigurowania połączenia krok po kroku został
opisany w poście „Integracja Tableau z R – połączenie i zastosowanie”:
W Tableau dostępne są cztery funkcje współpracujące ze
środowiskiem R, którym możemy przekazywać jako argumenty dowolną liczbę
zmiennych ze zbioru wczytanego do Tableau. Uzyskany
wynik jest zwracany z powrotem do Tableau w postaci wektora określonego typu.
Nazwy funkcji zaczynają się od słowa „SCRIPT”. Druga część, podana po podkreśleniu
dolnym, wskazuje jaki typ wartości jest obsługiwany przez daną funkcję:
- BOOL (od boolean) – wartości
logiczne, TRUE or FALSE,
- INT (od integer) –
wartości całkowite,
- REAL – wartości
rzeczywiste,
- STR (od string) –
tekstowe.
Jako pierwszy argument
funkcje przyjmują kod R, podany w cudzysłowie (pojedynczym lub podwójnym), a
jako kolejne: zmienne z wczytanego do Tableau zbioru (zmienne liczbowe powinny
być zagregowane). Należy mieć na uwadze, że podwójny cudzysłów użyty
wewnątrz kodu R zostanie przez Tableau potraktowany jako zakończenie sekwencji
kodu R i kalkulacja nie wykona się poprawnie. Używanie pojedynczych cudzysłowów
pozwala na obejście tego problemu.
Druga możliwość dotyczy pracy w R na obiektach różnych od
wektorów, np. ramkach danych. Wyniki nie mogą być przekazane bezpośrednio do
Tableau, zatem konieczny jest eksport z poziomu skryptu R - owego np. do exela
czy innego formatu obsługiwanego przez Tableau. Zapisujemy plik w wybranym
katalogu i łączymy się z nim w Tableau na żywo. Dzięki temu, gdy przy wykonaniu
kalkulacji zawartość pliku wynikowego ulegnie zmianie, możemy odświeżyć
połączenie za pomocą opcji Refresh, do której skrótem jest klawisz F5. Do
zbioru podłączamy się jednokrotnie, później wystarczy odświeżać połączenie po każdej
zmianie parametrów kalkulacji - nowe wyniki zostaną zapisane do pliku wynikowego,
zastępując stare (tzw. nadpisywanie). Do eksportowania wyników możemy
wykorzystać np. funkcje z pakietów „data.table” albo „R.utils”.
Jeśli chcemy skorzystać z funkcji, która
znajduje się w pakiecie, który nie jest zamieszczony w podstawie programu R,
musimy jednorazowo zainstalować ten pakiet poprzez wpisanie w konsolę programu
R polecenia
install.packages("Nazwa_pakietu")
W każdej kalkulacji przed wywołaniem funkcji w kodzie R-owym,
podanym jako argument do Tableau, musimy wczytać pakiet, z którego ona
pochodzi. Korzystamy w tym celu z
następującej komendy:
library(Nazwa_pakietu)
Może się zdarzyć, że kod R - owy, który będziemy chcieli wykorzystać
w Tableau będzie długi i złożony. Wtedy nie ma konieczności wprowadzania całej
jego treści do Tableau – można zapisać go w pliku tekstowym, a do jego
wywołania w kreatorze pól kalkulowanych Tableau użyć następującej funkcji:
source('ścieżka_do_pliku /nazwa_pliku.txt')
Należy
przy tym pamiętać, że ze wcześniej wspomnianego powodu ścieżka do pliku zawierającego
skrypt musi być podana w pojedynczym cudzysłowie oraz, że ukośniki muszą być
skierowane dokładnie tak, jak podałam w przykładowej ścieżce powyżej
(przeciwnie do ukośników w ścieżce do pliku wygenerowanej przez system
Windows).
Opcjonalnie
możemy skorzystać z pakietu „logging", by opisywać proces realizacji
skryptu w pliku tekstowym – ułatwia to znajdowanie ewentualnych błędów. By
zapoznać się z dokumentacją pakietu „logging” wystarczy wpisać w konsolę
programu R (po uprzednim zainstalowaniu i wczytaniu pakietu) następującą
komendę:
?logging
albo
pobrać wydruk pdf z oficjalnej strony R:
JAK SZYBKO POŁĄCZENIE
DZIAŁA NA DUŻYCH
ZBIORACH DANYCH?
Tableau szybko przetwarza duże ilości danych, a szybkość
realizacji zapytań zależy od struktury bazy. Aby dodatkowo przyspieszyć możemy
pracować na ekstrakcie, czyli lokalnym zapisie zbioru danych na dysku. Wtedy baza
jest optymalizowana i pracujemy w oparciu o technologię in-memory.
R dobrze radzi sobie z bazami danych o wielkości kilkudziesięciu
tysięcy rekordów, jednak gdy liczba rekordów sięga milionów obliczenia wykonują
się wolno. Możemy skorzystać z pakietu „data.table”, w celu zwiększenia
wydajności operacji wykonywanych na dużych zbiorach danych. Istnieje również
możliwość kupna komercyjnej wersji programu R, uwzględniającej rozwiązania Big
Data.
TABLEAU SERVER,
TABLEAU PUBLIC, TABLEAU ONLINE
Po opublikowaniu woorkbook`a na Tableau Server, aby
użytkownicy serwera mogli oglądać wyniki uzyskane w R, Tableau Server (podobnie
jak Tableau Desktop) musi się łączyć z Rserve. W przeciwnym razie wizualizacje,
do których wykonania zostały wykorzystane pola kalkulowane obliczone w oparciu
o połączenie Tableau i R, nie zostaną wyświetlone.
Tableau Public i Tableau Online na chwilę obecną nie
wspierają połączenia z R.
PRZYKŁADOWE ANALIZY
Analizę przeprowadzimy na zbiorze Sample -
Superstore Subset, dostępnym w katalogu My Tableau Repository po zainstalowaniu
Tableau. Interesuje nas zależność zysku od sprzedaży w poszczególnych
segmentach klienta. Gdy zależność ta jest duża wiemy, że nasze działania
marketingowe przyniosły oczekiwane efekty, natomiast mała zależność alarmuje
nas o konieczności uruchomienia kolejnych akcji marketingowych, w celu
zwiększenia sprzedaży i maksymalizowania zysków.
Pracę rozpoczniemy od utworzenia wykresu
rozrzutu dla miar Profit i Sales (w zakładce Show Me: scatter plots) i
przeciągnięcia na ikonkę Detail zmiennej Customer Name. Następnie dodamy do
widoku kolejne wymiary: Region do wierszy, Department do kolumn. Przeciągamy
zmienną Customer Segment na zakładkę Filters i wyświetlamy filtr w postaci
listy jednokrotnego wyboru. W ten sposób zbudowaliśmy wykres panelowy, złożony
z wykresów rozrzutu w poszczególnych regionach i działach produktów, który
możemy dodatkowo filtrować po segmentach klienta.
Zależność
pomiędzy zmiennymi Profit i Sales możemy oceniać patrząc na wykresy – czy
rozrzut punktów wykazuje jakąś prawidłowość, np. liniową czy logarytmiczną?
Jednak bardziej precyzyjnym kryterium oceny zależności pomiędzy dwoma zmiennymi
liczbowymi jest badanie wartości wskaźnika statystycznego, zwanego korelacją.
Korelację obliczymy w oparciu o połączenie Tableau z R, używając funkcji SCRIPT_REAL(),
ponieważ wartości zmiennej korelacja to liczby rzeczywiste z przedziału [-1,
1]. Skorzystamy z funkcji R-owej cor(), która znajduje się w bibliotece
„stats”.
Tak wykonaną kalkulację przeciągamy na ikonkę Color i dostosowujemy
do szczegółowości naszego widoku (opcja Compute using -> Customer Name).
Na widoku automatycznie utworzy nam się legenda, związana z
wartościami zmiennej Korelacja. Teraz możemy np. zaobserwować, że w segmencie Corporate,
w regionie południowym i dziale Furniture zależność jest znikoma (korelacja pomiędzy
zmiennymi Profit i Sales jest bliska zeru). W regionie centralnym i dziale
Office Supplies występuje silna dodatnia zależność pomiędzy zyskiem i
sprzedażą. Wyfiltrujmy sobie zatem na widoku Region: Central, Department:
Office Supplies i przyjrzyjmy z bliska wykresowi rozrzutu, po dopasowaniu linii
trendu.
W wydruku modelu możemy sprawdzić m.in. jaką wartość przyjmuje współczynnik
determinacji R-Squared: 0,707432. Współczynnik ten przyjmuje
wartości z przedziału [0, 1] – im wyższa wartość, tym lepiej dopasowany jest
model. W naszym przypadku model jest dobrze dopasowany, a co za tym idzie,
zależność pomiędzy Profit i Sales jest silna.
Zwróćmy uwagę na obserwacje odstające.
Odchylenie wartości rzeczywistej od wartości dopasowanej to tzw. „residuum”,
czy inaczej „reszta”. To znaczy, że im większa jest wartość residuum dla danego
punktu, tym bardziej punkt ten odstaje od linii trendu.
W celu podkreślenia punktów, które najmocniej odstają, możemy obliczyć wartość bezwzględną residuów i nanieść kalkulację na ikonkę Size, a następnie dostosować do szczegółowości naszego widoku (opcja Compute using -> Customer Name).
W celu podkreślenia punktów, które najmocniej odstają, możemy obliczyć wartość bezwzględną residuów i nanieść kalkulację na ikonkę Size, a następnie dostosować do szczegółowości naszego widoku (opcja Compute using -> Customer Name).
Które
obserwacje powinny być dla nas alarmujące?
W celu upewnienia się które obserwacje są odstające możemy powołać
się na wybrane kryterium detekcji obserwacji odstających. Jedną z
rekomendowanych metod jest badanie wartości tzw. residuów standaryzowanych,
które dla obserwacji, które nie są odstające, powinny mieścić się w przedziale
[-2, 2]. Tym razem skorzystamy z funkcji SRCIPT_BOOL(), ponieważ wykonana
kalkulacja będzie przyjmować wartości TRUE or FALSE, w zależności od tego czy
warunek logiczny będzie spełniony. Przeciągamy kalkulację na ikonkę Color i
dostosowujemy do szczegółowości naszego widoku (opcja
Compute using -> Customer Name). Edytujemy linię trendu – chcemy, żeby bez
względu na kolor dopasowana była jedna linia trendu (odhaczamy opcję: Allow a
trend line per color).
Teraz
możemy przyjrzeć się bliżej obserwacjom odstającym z naszego zbioru i np.
wyeksportować interesujący nas podzbiór danych do Exela.
Za
pomocą legendy możemy podświetlić obserwacje odstające i np. wykluczyć je z
naszej kalkulacji.
Czy
poprawi to jakość dopasowania modelu?
Tak, wartość współczynnika determinacji
wzrosła z 0,707432 na 0,822181. Teraz model jest bardziej wiarygodny, jeśli
chcielibyśmy w oparciu o niego prognozować zachowanie naszych danych. Należy
jednak pamiętać, że nie zawsze usunięcie obserwacji odstających poprawia
dopasowanie modelu. Nie jest to wskazane zwłaszcza w sytuacji, gdy ich liczba
jest bardzo duża.
Wykonana
wizualizacja w sposób oczywisty odnosi się do całego widoku. Aby to sprawdzić powróćmy
do wykresu panelowego (Region: All, Department: All).
KOMENTARZE