Tableau + R jak zacząć [artykuł]

wrz 25, 2017

Data Driven

Tableau

Data Science

banery data science

W tym artykule przedstawiam korzyści płynące z połączenia możliwości Tableau i R, przedstawiam listę wymagań aby zrealizować to połączenie. Opisuję jak ta współpraca jest realizowana ze strony Tableau. Do tego zamieszczam kilka wskazówek jak zoptymalizować współdziałanie i zaprezentuje przykład użycia R w analizie Tableau.

Wdrożenie Tableau w organizacji otwiera zupełnie nowe możliwości raportowe, nie tylko ze względu na demokratyzację danych, szybkie uzyskiwanie odpowiedzi na złożone pytania i wyciąganie wniosków biznesowych, czy też łączenie wielu różnych źródeł informacji, ale również ze względu na możliwość wykorzystania w analizach zaawansowanych możliwości języka programowania R.

R to interpretowany język programowania oraz środowisko do obliczeń statystycznych i wizualizacji wyników. Projekt ten został stworzony na uniwersytecie Auckland przez Roberta Gentelmana i Rossa Ihakę jako implementacja języka S stworzonego wcześniej w Bell Laboratories. W obecnej chwili R jest jednym z dwóch najpopularniejszych języków programowania wśród społeczności data science i jest cały czas rozwijany przez „The R Foundation” oraz licznych programistów którzy udostępniają wyniki swojej pracy.

I tu właśnie leży siła R – niesłychanie aktywna społeczność użytkowników często akademickich i biznesowych, tworzy i udostępnia nowe rozwiązania w postaci pakietów funkcji z różnych dziedzin Data Science takich jak machine learning, analiza szeregów czasowych czy analiza predykcyjna. Jakość tych pakietów jest na bieżąco sprawdzana w aktualnych scenariuszach naukowych czy biznesowych przez licznych użytkowników i ekspertów z danej dziedziny i jeżeli wytrzyma próbę czasu staje się fundamentem nowych rozwiązań.

Twórcy Tableau dostrzegli potencjał płynący ze współpracy R i Tableau i już od wersji Tableau 8.1 wbudowali w silnik Tableau wsparcie dla R. Ta integracja miała trzy główne cele :

Po pierwsze było wzbogacenie możliwości analitycznych Tableau poprzez udostępnienie użytkownikom pomostu prowadzącego do bogatej (i ciągle wzbogacanej) bazy metod statystycznych i wielu innych obszarów Data Science (warto tu wspomnieć choćby o bardzo popularnym serwisie Stackoverflow)

Po drugie wykorzystanie zaawansowanych modeli R i możliwości pracy z nimi korzystając z interaktywnych wizualizacji Tableau bez konieczności znajomości języka R.

Po trzecie umożliwienie użytkownikom R korzystania z płynnej, przejrzystej eksploracji danych i łatwego dostępu do wielu typów baz danych, a także szybkiego udostępniania wyników w organizacji (włączając w mobilny dostęp do dashboardów) z wykorzystaniem np.: Tablau Server.

Co jest wiec potrzebne do rozpoczęcia pracy z Tableau i R?
Ze strony R do wygodnej pracy potrzebujemy trzy rzeczy
– Program R,
– wygodny edytor np.: RStudio
– niezbędne biblioteki dodatkowe;

Jeśli chodzi o R to obecnie najbardziej aktualną wersją jest 3.4.1. „Single Candle” którą można pobrać ze strony projektu R: https://www.r-project.org lub ze strony https://cran.r-project.org/. Dostępne są wersje dla różnych systemów operacyjnych –Windows, OSX i różnych dystrybucji Linuxa. Instalacja jest bezproblemowa i najczęściej sprowadza się do klikania next, next next . Program R jest udostępniany na licencji GNU GPL. To oznacza że jest całkowicie bezpłatny do wszystkich zastosowań edukacyjnych, przemysłowych, biznesowych, komercyjnych i innych.

RStudio to nie tylko prosty edytor ale raczej zintegrowane środowisko programistyczne (IDE), które umożliwia edytowanie, tworzenie pakietów, aplikacji, raportów. Zawiera również managera wersji i narzędzia wspierające debuggowanie kodu. RStudio Desktop można pobrać ze strony https://www.rstudio.com .
Dzieki skorzystania z RStudio mamy tuż pod ręką dostęp do:
– konsoli w której natychmiast możemy wykonywać polecenia R,
– edytora w którym możemy pisać bardziej złożone skrypty R,
– okien z pomocą , eksploratorem plików, wykresami, pomocą
– okien z historią wykonywanych poleceń i środowiskiem programistycznym wraz z używanymi aktualnie zmiennymi

Po zanistalowaniu R i RStudio mamy już dostęp do podstawowych funkcjonalności ale do uzyskania połączenia z Tableau potrzebne jest jeszcze zainstalowanie pakietu RServe, który odpowiada za tą komunikację. 
Instalacja wywołuje się z poziomu konsoli RStudio komendą install.packages(„RServe”), po zakończeniu działania powinniśmy otrzymać następujący komunikat:

aby uruchomić RServe pozostaje wczytać je do aktualnej sesji R poleceniem library(RServe) i uruchomić RServe()

RServe posiada również wiele opcji takich jak uruchamiania serwera z plikiem konfiguracyjnym, który może na przykład zawierać polecenia załadowania wszystkich potrzebnych pakietów, poleceń optymalizujących prace, czy opcji ułatwiających debugowanie napisanych skryptów. Ale opisanie wszystkich możliwości wykracza poza zakres tego artykułu, być może wpis poruszający ten temat pojawi się w przyszłości na naszym blogu.
Teraz pozostaje tylko połączyć się z RServe z poziomu Tableau.
 W tym celu z menu Help wybieramy Settings and Performance i dalej Manage External Service Connection

Connection 

Pojawi się okno, w którym ustawiamy parametry połączenia z serwerem, jeśli znajduje się on na naszym komputerze to domyślne ustawienia wystarczą do nawiązania połączenia.

Po wykonaniu tych wszystkich kroków mamy już aktywne połączenie R i Tableau.
Ale jak wygląda współpraca z R z poziomu Tableau?
Uruchamianie skryptów R do tej pory było możliwe z poziomu R i RStudio ale jak już wspominałem wersji 8.1 Tableau dodano do zbioru funkcji cztery nowe, które umożliwiają uruchamianie ich bezpośrednio w Tableau, są to następujące:

  1. SCRIPT_REAL
  2. SCRIPT_INT
  3. SCRIPT_STR
  4. SCRIPT_BOOL

Składnia wszystkich powyższych funkcji jest identyczna np.: SCRIPT_REAL(string, experssion, …)

  1. Polecenie SCRIPT_* sygnalizuje Tableau użycie R, w zależności od typu spodziewanego wyniku używamy odpowiedniej funkcji :
    1. Dla liczb rzeczywistych, zmiennoprzecinkowych używamy SCRIPT_REAL
    2. Dla liczb całkowitych używamy SCRIPT_INT
    3. Jeżeli wynikiem działania skryptu jest ciąg znaków, tekst używamy SCRIPT_STR
    4. I jeżeli w wyniku działania otrzymujemy zmienna TRUE/FALSE używamy SCRIPT_BOOL
  2.  Pierwszym argumentem funkcji jest skrypt R, Tableau traktuje go jako ciąg znaków (string) i wysyła do R w celu interpretacji.
  3. .arg1, .arg2, .arg3…zaznaczają gdzie w kodzie R użyte powinny być kolejne argumenty. Ilość argumentów nie jest ograniczona.
  4. Dane z Tableau mogą być w postaci pola lub parametr, a wszystkie pola muszą być zagregowane (MIN(), MAX(), AVG(), ATTR(), etc).

Komunikacja Tableau i R wygląda następująco:

  1. Kod R i dane Tableau są spakowane i wysyłane do R
  2. Za całość komunikacji odpowiada pakiet RServe – pakiet który znajduje się pomiędzy Tableau i R
  3. R interpretuje kod i wykonuje niezbędne obliczenia, zwraca wynik w postaci wektora.
  4. RServe zwraca wyniki do Tableau jako nowe pole kalkulowane w danych.

Powyższy proces można przedstawić następująco:

Zaprezentuję jak wszystko to działa w praktyce używając R do zidentyfikowania wartości nietypowych. Poszukiwanie wartości nietypowych jest przydatne w analizie eksploracyjnej gdy chcemy przeanalizować interesujące nas zjawisko i chcemy wykluczyć wartości nietypowe, albo wręcz przeciwnie chcemy przyjrzeć się wartościom, które wykraczają poza standard. Analiza wartości nietypowych może być również punktem wyjścia do analizy predykcyjnej.

Przeanalizujemy występowanie objawów grypy. Po wrzuceniu danych do Tableau uzyskujemy wykres na którym możemy zaobserwować ewidentne wartości nietypowe oznaczające nasilone występowanie zachorowań na grypę i kilka lokalnych maksimów co do których nie ma pewności czy są statystycznie istotnymi wartościami nietypowymi:

Wykrywanie wartości nietypowych nie jest częścią bazowego pakietu R, w tej sytuacji trzeba użyć pakietu zawierającego odpowiednie funkcje – AnomalyDetection. Ten pakiet został zbudowany przez programistów Twittera aby uprościć i przyśpieszyć analizę szeregów czasowych uzyskiwanych z API Twittera czy Google i ułatwić wykrywanie nietypowych wartości. Więcej informacji o działaniu pakietu i funkcjach które zawiera można znaleźć pod poniższymi adresami:
https://github.com/twitter/AnomalyDetection
https://www.r-bloggers.com/anomaly-detection-in-r/
http://blog.revolutionanalytics.com/2015/01/twitters-new-r-package-for-anomaly-detection.html
Kod w R korzystający z tego pakietu mógłby wyglądać następująco( komentarze zaznaczone są przez #) :

#### Wykrywanie wartości nietypowych ###########


# Załadowanie biblioteki AnomalyDetection


library(AnomalyDetection)

# Wczytanie danych

fluTrends = read.csv(‘fluTrends.csv’)



# Wyczyszczenie danych wejściowych w celu łatwiejszej manipulacji 


searchWeek = fluTrends$start
searchVolume = fluTrends$flu.symptoms.
searchWeek = as.Date(searchWeek)
cleanFluTrends = data.frame(searchWeek, searchVolume)

# Znajdowanie wartości nietypowych

fluOutliers = AnomalyDetectionTs(cleanFluTrends)

# Przygpotowanie właściwego format uzyskanych wyników


outlierDates = fluOutliers$anoms$timestamp
outlierDates = as.Date(outlierDates)
isOutlier = searchWeek %in% outlierDates

# przygotowanie wykresu w R


colors = isOutlier + 1
plot(cleanFluTrends, col = colors)
Powyższy kod w R powinien wygenerować poniższy wykres, na którym wartości nietypowe zaznaczone są na czerwono:

Jak w takim razie powinno wyglądać pole kalkulowane w Tableau żeby uzyskać taki sam rezultat?
Ponieważ chcemy uzyskać informacje czy coś jest czy nie jest wartością nietypową, czy też nie więc najlepszą funkcją do tego będzie SCRIPT_BOOL. Nazwę ją isOutlier.
Pożądaną rozdzielczością danych będzie poziom tygodni, dla wartości nietypowych musimy przeanalizować numer tygodnia i wartość objawów grypy, jeżeli mamy wiele danych dla jednego tygodnia to musimy te wartości uśrednić w obrębie tygodnia, gdyż chcemy dla jednego tygodnie mieć tylko jedną wartość, dlatego będziemy używać zmiennych ATTR([searchWeek)] oraz AVG([searchVolume]).
Następnym krokiem jest wyczyśczenie kodu R ze zbędnych elementów czyli:

  • Wczytywania danych z pliku (dane będą już wczytane w Tableau)
  • Tworzenie wykresu (wykres będzie tworziny za pomocą Tableau)
  • Pozbycie się komentarzy w celu zwiększenia czytelności tekstu.

Teraz pozostaje tylko właściwe zdefiniowanie argumentów:

searchWeek = fluTrends$start

searchVolume = fluTrends$flu.symptoms z oryginalnego kodu R zmieniamy tak aby wykorzystywały argumenty przekazywane przez Tableau:

searchWeek = .arg1


searchVolume = .arg2



naszym .arg1 będzie ATTR([searchWeek)], a .arg2 będzie AVG([searchVolume]).

Ostatecznie kod funkcji isOutlier w Tableau będzie wyglądał następująco:
SCRIPT_BOOL(“library(AnomalyDetection)

searchWeek = .arg1
searchVolume = .arg2


searchWeek = as.Date(searchWeek)

cleanFluTrends = data.frame(searchWeek, searchVolume)

fluOutliers = AnomalyDetectionTs(cleanFluTrends)

outlierDates = fluOutliers$anoms$timestamp

outlierDates = as.Date(outlierDates)

isOutlier = searchWeek %in% outlierDates”,

ATTR([searchWeek]),


AVG([searchVolume])
)

Ostatecznie wykres w Tableau może wyglądać jak poniżej. Wartości które są statystycznie istotnymi wartościami nietypowymi zaznaczone są kolorem pomarańczowym:

Ta metoda może posłużyć dalej do automatycznego wykrywania wartości nietypowych.

Ten przykład stanowi zachętę do eksplorowania rozszerzonych możliwości Tableau i absolutnie nie wyczerpuje szerokiego tematu. Kolejne wpisy dotyczące ciekawych połączeń Tableau z R będą sukcesywnie pojawiać się na naszym blogu.