{"id":2307,"date":"2019-02-06T10:47:09","date_gmt":"2019-02-06T08:47:09","guid":{"rendered":"https:\/\/webanalyst.ro\/?p=2307"},"modified":"2020-03-23T19:42:51","modified_gmt":"2020-03-23T17:42:51","slug":"gganimate","status":"publish","type":"post","link":"https:\/\/webanalyst.ro\/blog\/2019\/gganimate\/","title":{"rendered":"Vizualizarea animat\u0103 a datelor din analytics \u00een R cu gganimate"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">\u00cen urm\u0103 cu un an scriam despre <a rel=\"noreferrer noopener\" aria-label=\"ggplot2 (se deschide \u00eentr-o fil\u0103 nou\u0103)\" href=\"https:\/\/webanalyst.ro\/blog\/2018\/ggplot2\/\" target=\"_blank\">ggplot2<\/a>, cel mai popular pachet pentru vizualizarea datelor cu limbajul R. Func\u021bionalit\u0103\u021bile acestuia pot fi extinse cu alte pachete, care func\u021bioneaz\u0103 ca ni\u0219te extensii. Este \u0219i cazul <strong>gganimate<\/strong>, pachet care la \u00eenceputul acestui an a fost publicat \u00een CRAN, arhiva oficial\u0103 de pachete pentru R.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen acest articol voi prezenta <em>gganimate<\/em> \u0219i voi trece printr-un <strong><em>studiu de caz<\/em><\/strong> \u00een care voi importa date din analytics, le voi prelucra \u00een R, le vom vizualiza cu <em>ggplot2<\/em> \u0219i apoi voi anima vizualizarea cu <em>gganimate<\/em>, la finalul articolului fiind disponibil \u0219i codul surs\u0103 pentru toate aceste etape.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2>Istoric<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>ggplot2<\/strong> a ap\u0103rut \u00een 2005, dar au mai trecut 9 ani p\u00e2n\u0103 s-a ajuns la versiunea 1.0.0. O schimbare fundamental\u0103 a venit \u00een decembrie 2015, c\u00e2nd s-a lansat versiunea 2.0.0, care a introdus conceptul de extensii, adic\u0103 alte pachete, care extind func\u021bionalit\u0103\u021bile sale. \u00cen iulie 2018 s-a lansat ggplot2 3.0.0, ocazie cu care au fost introduse mai multe concepte noi, printre care <em>tidy evaluation<\/em>, <em>simple features<\/em> sau <em>calculated aesthetics<\/em>. Cea mai recent\u0103 versiune existent\u0103 \u00een acest moment este 3.1.0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>R<\/strong> a avut, de asemenea, un an impotant \u00een 2018, c\u00e2nd s-a lansat versiunea 3.5, despre care se spune c\u0103 ar fi cea mai important\u0103 schimbare de la apari\u021bia limbajului. Pe l\u00e2ng\u0103 \u00eembun\u0103t\u0103\u021birile de performan\u021b\u0103, trebuie men\u021bionat\u0103 \u0219i introducerea unor meta-date pentru vectori, care fac opera\u021biile cu ace\u0219tia mult mai rapide (lucru util \u00een special la vectorii care con\u021bin foarte multe date). Trecerea la aceast\u0103 versiune (sau la una mai nou\u0103 &#8211; cea mai recent\u0103 fiind momentan 3.5.2), va necesita \u0219i pachete updatate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>gganimate<\/strong> a ajuns \u00een CRAN doar la \u00eenceputul acestui an, \u00eens\u0103 are o istorie mai lung\u0103. A fost lansat de David Robinson la \u00eenceputul lui 2016, deci la pu\u021bin timp dup\u0103 ce a ap\u0103rut posibilitatea de a crea extensii de <em>ggplot2<\/em>. Proiectul a fost apoi preluat de Thomas Lin Pedersen, care l-a rescris complet. A\u0219adar, codul pentru anima\u021bii <em>gganimate<\/em> scris \u00een urm\u0103 cu un an nu mai func\u021bioneaz\u0103 cu versiunea curent\u0103. Am a\u0219teptat ca acest pachet s\u0103 fie publicat \u00een CRAN pentru a scrie despre el, \u00eentruc\u00e2t \u00eenainte de asta instalarea lui era un co\u0219mar \u0219i d\u0103dea foarte multe erori, lucru pe care \u00eel \u0219tiu din proprie experien\u021b\u0103.<\/p>\n\n\n\n<h2>Cum func\u021bioneaz\u0103 gganimate<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/gganimate_logo.png\" alt=\"\" class=\"wp-image-2337\" width=\"228\" height=\"263\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/gganimate_logo.png 455w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/gganimate_logo-130x150.png 130w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/gganimate_logo-260x300.png 260w\" sizes=\"auto, (max-width: 228px) 100vw, 228px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">La fel ca <em>ggplot2<\/em>, \u0219i <em>gganimate<\/em> se bazeaz\u0103 pe gramatica graficii, framework-ul lui Leland Wilkinson din 1999. De altfel, <em>gganimate<\/em> mai este numit \u0219i <strong>gramatica anima\u021biilor<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u0103 vedem cele mai importante componente \u0219i func\u021bii din <em>gganimate<\/em>:<\/p>\n\n\n\n<ul><li><strong>Tranzi\u021bii<\/strong> &#8211; func\u021biile de tipul <code>transition_*()<\/code> definesc datele care vor fi folosite \u00een anima\u021bii \u0219i cum se vor comporta \u00een acest timp<\/li><li><strong>Vizualiz\u0103ri<\/strong> &#8211; func\u021biile <code>view_*()<\/code> definesc cum vom vedea anima\u021biile; \u00een general, ne putem juca cu axele x \u0219i y, astfel \u00eenc\u00e2t s\u0103 se schimbe \u0219i partea din grafic pe care o vedem \u00een timpul anima\u021biei; acestea trebuie folosite cu grij\u0103 pentru c\u0103 pot fi foarte dezorientative pentru audien\u021b\u0103<\/li><li><strong>Umbre<\/strong> &#8211; \u00een pofida numelui, func\u021biile de forma <code>shadow_*()<\/code> nu se ocup\u0103 de o simpl\u0103 umbr\u0103 pentru elementele din grafic, ci func\u021bioneaz\u0103 ca o memorie, astfel \u00eenc\u00e2t datele din cadrele anterioare s\u0103 apar\u0103 \u00een continuare \u00een grafic (se poate vedea \u00een exemplul din acest articol cum punctele anterioare r\u0103m\u00e2n \u0219i c\u00e2nd apar altele noi)<\/li><li><strong>Intr\u0103ri \/ ie\u0219iri<\/strong> &#8211; acestea sunt ni\u0219te concepte noi care definesc cum s\u0103 apar\u0103 noile date \u0219i cum s\u0103 dispar\u0103 cele vechi, practic anim\u00e2nd \u0219i aceste ac\u021biuni, cu ajutorul func\u021biilor <code>enter_*()<\/code>\/<code>exit_*()<\/code><\/li><li><code>ease_aes()<\/code> &#8211; o func\u021bie special\u0103 care define\u0219te cum se vor comporta diferite elemente estetice \u00een timpul tranzi\u021biilor<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>gganimate<\/em> va avea grij\u0103 s\u0103 creeze suficiente cadre pentru ca tranzi\u021bia s\u0103 fie una lin\u0103. La finalul articolului g\u0103si\u021bi detalii despre anima\u021bia prezentat\u0103 aici.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Anima\u021biile suport\u0103 \u0219i inserarea de texte din pachetul <em>glue<\/em>, adic\u0103 l\u00e2ng\u0103 graficul animat putem avea \u0219i un text care se schimb\u0103 odat\u0103 cu imaginea (de exemplu, s\u0103 schimbe data pentru care sunt afi\u0219ate informa\u021biile odat\u0103 cu anima\u021bia). Efectul este unul de impact dac\u0103 se folose\u0219te \u00een titlu.<\/p>\n\n\n\n<h2>Studiu de caz<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Observ\u0103m c\u0103 datele sunt prima component\u0103 at\u00e2t pentru ggplot2, c\u00e2t \u0219i pentru gganimate, lucru absolut firesc. Ca de obicei, am preferat s\u0103 folosesc date importate din Google Analytics. Pentru importarea acestora \u00een R, avem la dispozi\u021bie pachetul <a rel=\"noreferrer noopener\" aria-label=\"googleAnalyticsR (se deschide \u00eentr-o fil\u0103 nou\u0103)\" href=\"https:\/\/webanalyst.ro\/blog\/2017\/datele-din-google-analytics-r\/\" target=\"_blank\">googleAnalyticsR<\/a>.<\/p>\n\n\n\n<h3>Importul datelor din Google Analytics<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen acest caz am folosit contul Demo oferit de Google. Aici apare prima problem\u0103, pentru c\u0103 Google nu ofer\u0103 acces API pentru acest cont, motiv pentru care vom primi eroare. Din documenta\u021bia Google:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"715\" height=\"69\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/google-api-support.jpg\" alt=\"\" class=\"wp-image-2319\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/google-api-support.jpg 715w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/google-api-support-150x14.jpg 150w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/google-api-support-300x29.jpg 300w\" sizes=\"auto, (max-width: 715px) 100vw, 715px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Nu-i nimic, avem ocazia s\u0103 vedem \u0219i alt\u0103 metod\u0103 pentru importul datelor din analytics, mai ales c\u0103 pe cea prin API am descris-o deja pas cu pas \u00een articolul men\u021bionat anterior!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Google Analytics ne d\u0103 posibilitatea s\u0103 cre\u0103m un raport customizat, exact cu datele de care avem nevoie, pe care apoi s\u0103 \u00eel export\u0103m \u00een diverse formate. Pentru prelucrarea datelor este de preferat formatul CSV. A\u0219a \u00eencepe fi\u0219ierul meu:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"275\" height=\"322\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/csv-excel.jpg\" alt=\"\" class=\"wp-image-2321\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/csv-excel.jpg 275w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/csv-excel-128x150.jpg 128w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/csv-excel-256x300.jpg 256w\" sizes=\"auto, (max-width: 275px) 100vw, 275px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dup\u0103 cum se poate citi pe r\u00e2ndul 4, am exportat datele pentru ultimii 2 ani (2017 \u0219i 2018), deci valoarea medie a comenzii \u0219i num\u0103rul tranzac\u021biilor pentru 723 de zile consecutive.<\/p>\n\n\n\n<p>Am importat datele din acest fi\u0219ier \u00een R folosind func\u021bia <code>read.csv<\/code> din pachetul de baz\u0103 (adic\u0103 nu am mai \u00eenc\u0103rcat un alt pachet suplimentar pentru asta, chiar dac\u0103 unele au ceva mai multe op\u021biuni). R func\u021bioneaz\u0103 mai bine cu mai pu\u021bine pachete \u00eenc\u0103rcate, pentru c\u0103 la r\u00e2ndul lor acestea pot apela alte fi\u0219iere, a\u0219a c\u0103 am \u00eenc\u0103rcat pachete suplimentare doar acolo unde a fost nevoie.<\/p>\n<p>\u00cen ultimul argument al acestei func\u021bii, am precizat c\u0103 vreau s\u0103 ignore primele 6 linii. \u00cen imaginea de mai sus se poate vedea c\u0103 informa\u021biile de acolo nu ne intereseaz\u0103.<\/p>\n\n\n\n<h3>Cur\u0103\u021barea \u0219i prelucrarea datelor<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen acest moment, avem tabelul de date \u00een R, \u00eens\u0103 datele sunt departe de forma dorit\u0103 pentru a le putea utiliza.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Cur\u0103\u021barea \u0219i prelucrarea datelor sunt etapele care le ocup\u0103 cel mai mult timp speciali\u0219tilor \u00een analytics \u0219i data science. C\u00e2nd afli asta, probabil c\u0103 acest job nu \u021bi se mai pare la fel de sexy ca atunci c\u00e2nd citeai de modelarea datelor \u0219i <em>machine learning<\/em> \ud83d\ude42 Desigur, este vorba despre cei care fac analize avansate \u0219i care pot folosi mai multe surse de date, nu de cei care stau doar \u00een interfa\u021ba de Google Analytics (eventual \u0219i a celorlalte produse din suit\u0103).<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">O prim\u0103 problem\u0103 cu datele noastre o reprezint\u0103 modul \u00een care Google denume\u0219te una dintre coloane: \u201eAvg..Order.Value\u201d. Toate acele puncte din interiorul denumirii ne pot pune probleme mai t\u00e2rziu, a\u0219a c\u0103 \u00eencep cur\u0103\u021barea prin a redenumi aceast\u0103 coloan\u0103 mai simplu, \u201eAOV\u201d. Pentru redenumirea coloanei am folosit func\u021bia <code>colnames()<\/code>, disponibil\u0103 tot \u00een pachetul de baz\u0103.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Analiz\u00e2nd tabelul nostru, observ\u0103m c\u0103 a interpretat coloana cu datele ca fiind de tipul numeric (mai exact, valori \u00eentregi), a\u0219a c\u0103 urm\u0103torul pas este s\u0103 schimb\u0103m asta \u00een dat\u0103, de formatul <em>an (4 cifre)-lun\u0103-zi<\/em>. Sunt multe moduri de a face asta, eu am folosit func\u021bia <code>parse_date_time()<\/code> din pachetul <em>lubridate<\/em>, pentru a face totul dintr-o singur\u0103 opera\u021bie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen pasul urm\u0103tor voi crea valori diferite pentru <strong>an<\/strong>, <strong>lun\u0103<\/strong> \u0219i <strong>zi<\/strong>, pe l\u00e2ng\u0103 cea de dat\u0103, pentru c\u0103 poate o s\u0103 vreau s\u0103 le folosesc pe acestea separat (pentru consisten\u021b\u0103 cu celelalte nume de coloane, am folosit denumirile \u00een englez\u0103 <em>Year<\/em>, <em>Month<\/em>, <em>Day<\/em> &#8211; majuscula este important\u0103 pentru a le diferen\u021bia de func\u021biile cu acelea\u0219i nume, func\u021bii pe care le-am folosit chiar la aceste opera\u021bii). \u00cen acela\u0219i pas, am decis s\u0103 transform Year \u0219i Month \u00een tipul factor, adic\u0103 fiecare dintre cei 2 ani \u0219i fiecare dintre cele 12 luni s\u0103 fie tratate drept categorie \u00een func\u021bie de care s\u0103 pot afi\u0219a celelalte date.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Se poate merge mai departe \u0219i se pot ad\u0103uga coloane noi \u00een tabel cu valorile noi create, dar pentru ce vreau eu s\u0103 fac este suficient ce avem deja. \u00cencerc s\u0103 reduc la minim aceast\u0103 etap\u0103, pentru c\u0103 subiectul acestui articol este totu\u0219i vizualizarea datelor. Dar \u00eenainte s\u0103 ajungem acolo mai avem un singur pas la cur\u0103\u021bare&#8230;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Uit\u00e2ndu-ne la tabelul nostru ini\u021bial, vedem cum valorile de la AOV \u00eencep cu semnul \u201e$\u201d. Din acest motiv, sunt interpretate gre\u0219it. Este o ocazie s\u0103 folosim RegEx cu func\u021bia <code>gsub()<\/code> pentru a \u00eenlocui acel caracter cu&#8230; nimic (cam a\u0219a s-ar citi sintaxa respectiv\u0103). \u00cen aceea\u0219i linie de cod, vom transforma apoi valorile respective \u00een numerice.<\/p>\n\n\n\n<h2>Grafice statice \u00een ggplot2<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">De regul\u0103, vizualizarea \u00eencepe cu un grafic simplu, f\u0103cut pentru ca analistul s\u0103 \u00ee\u0219i fac\u0103 o p\u0103rere despre datele cu care lucreaz\u0103. A\u0219adar, voi crea un grafic cu evolu\u021bia \u00een timp a celor 2 indicatori pe care \u00eei avem \u00een tabel: <em>AOV<\/em> \u0219i <em>Transactions<\/em> (numarul tranzac\u021biilor). <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ambii vor fi reprezenta\u021bi cu linii \u0219i nu vreau s\u0103 introduc la moment culori, forme sau alte elemente care ar complica graficul. Totu\u0219i, pentru a \u00eei deosebi \u00een imagine, voi folosi tipuri diferite de linii: pentru AOV voi avea linie tip arie, cu o u\u0219oar\u0103 transparen\u021b\u0103 ca s\u0103 se vad\u0103 peste aceasta \u0219i linia tranzac\u021biilor.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"705\" height=\"451\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_initial.jpeg\" alt=\"\" class=\"wp-image-2325\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_initial.jpeg 705w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_initial-150x96.jpeg 150w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_initial-300x192.jpeg 300w\" sizes=\"auto, (max-width: 705px) 100vw, 705px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Observ\u0103m c\u0103 ambii indicatori au sc\u0103zut \u00een ultima jum\u0103tate a anului 2018. Exist\u0103 chiar o corela\u021bie \u00eentre cei doi, a\u0219a c\u0103 mai departe voi analiza mai atent doar unul dintre ei (mai exact, AOV).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pentru a compara \u00een func\u021bie de diferite intervale de timp, voi afi\u0219a c\u00e2te un punct pentru fiecare zi. Pentru a vedea u\u0219or anii, fiecare dintre cei 2 ani va avea punctele cu alt\u0103 culoare. Lunile (1 &#8211; 12) vor fi pe axa x. Vede\u021bi acum de ce aveam nevoie s\u0103 am anii \u0219i lunile de tipul categoric.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"705\" height=\"451\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/AOV.jpeg\" alt=\"\" class=\"wp-image-2326\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/AOV.jpeg 705w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/AOV-150x96.jpeg 150w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/AOV-300x192.jpeg 300w\" sizes=\"auto, (max-width: 705px) 100vw, 705px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Putem vedea \u0219i mai bine trendul anterior, cu toate acele puncte albastre \u00een partea de jos (ceea ce \u00eenseamn\u0103 AOV sc\u0103zut). Dar vedem \u00een acela\u0219i timp c\u0103 partea de sus a imaginii nu prea este folosit\u0103, \u00een timp ce \u00een partea de jos punctele sunt \u00eengr\u0103m\u0103dite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pentru a corecta asta, voi filtra toate valorile AOV peste 300 \u0219i voi schimba propor\u021biile graficului (ini\u021bial, avea o form\u0103 vertical\u0103 inserat \u00een articol \u0219i vreau s\u0103 schimb acest lucru). Rezultatul l-am denumit <em>grafic_static<\/em> \u0219i poate fi v\u0103zut mai jos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>ggplot2<\/em> ne va aten\u021biona c\u0103 am \u0219ters valorile pentru 12 zile, dar 12 din 723 chiar sunt irelevante \u0219i acest lucru ne va ajuta s\u0103 le vedem pe celelalte mai bine. \u00cen cod voi l\u0103sa doar ultima versiune a graficului, dar prima poate fi creat dac\u0103 se \u0219terg ultimele dou\u0103 func\u021bii, responsabile de limitele descrise anterior.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"705\" height=\"451\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_static.jpeg\" alt=\"\" class=\"wp-image-2327\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_static.jpeg 705w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_static-150x96.jpeg 150w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/grafic_static-300x192.jpeg 300w\" sizes=\"auto, (max-width: 705px) 100vw, 705px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Se vede \u0219i mai clar acum c\u0103 anul 2018 a \u00eenceput mai bine dec\u00e2t precedentul, dar lucrurile s-au schimbat din mai &#8211; iunie pentru restul anului.<\/p>\n\n\n\n<h2>Grafic animat \u00een gganimate<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ajungem la cel mai a\u0219teptat pas: anima\u021bia vizualiz\u0103rii de date.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pentru asta, trebuie doar s\u0103 apel\u0103m graficul f\u0103cut anterior (<em>grafic_static<\/em>) \u0219i s\u0103 \u00eei ad\u0103ug\u0103m func\u021biile dorite din <em>gganimate<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Am folosit <code>transition_reveal()<\/code> la nivel de zi, pentru ca punctele s\u0103 apar\u0103 \u00een ordinea zilelor (toate pentru zilele de 1, apoi toate pentru zilele de 2 etc.).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Urm\u0103toarea func\u021bie este <code>shadow_mark()<\/code>, care ne permite s\u0103 p\u0103str\u0103m punctele anterioare \u00een grafic, pe m\u0103sur\u0103 ce anima\u021bia evolueaz\u0103. Aceea\u0219i func\u021bie face ca unele puncte s\u0103 se mi\u0219te mai \u00eencet, cre\u00e2nd efectul c\u0103 ar fi l\u0103sate \u00een urm\u0103.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00cen final, am apelat <code>enter_grow()<\/code>, care face ca elementele din grafic s\u0103 par\u0103 c\u0103 ar cre\u0219te. Efectul nu este foarte vizibil \u00een cazul punctelor, dar arat\u0103 mai bine dec\u00e2t f\u0103r\u0103 el.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pentru c\u0103 tema blogului redimensioneaz\u0103 imaginea, voi pune link \u0219i spre <\/strong><a rel=\"noreferrer noopener\" aria-label=\"anima\u021bie (se deschide \u00eentr-o fil\u0103 nou\u0103)\" href=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/gganimate.gif\" target=\"_blank\"><strong>anima\u021bie<\/strong><\/a><strong> a\u0219a cum a fost ea exportat\u0103 din R<\/strong> <em>(refresh dac\u0103 browser-ul nu v\u0103 permite s\u0103 reveni\u021bi altfel la articol)<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La o privire atent\u0103 se pot vedea cele 31 de momente \u00een care apar punctele (c\u00e2te unul pentru fiecare zi a lunii).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De notat c\u0103 am vrut s\u0103 \u021bin lucrurile simple. De exemplu, nu am umblat deloc la modul \u00een care arat\u0103 elementele din vizualiz\u0103ri. Totul poate fi customizat, \u00eens\u0103 eu le-am l\u0103sat pe toate a\u0219a cum sunt ele implicit. <em>ggplot2<\/em> \u0219i <em>gganimate<\/em> ofer\u0103 mult mai multe posibilit\u0103\u021bi de a face vizualiz\u0103ri de date interesante, dar dac\u0103 exist\u0103 interes voi reveni cu alte articole pe acest subiect.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"806\" height=\"38\" src=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/rendering.jpg\" alt=\"\" class=\"wp-image-2330\" srcset=\"https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/rendering.jpg 806w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/rendering-150x7.jpg 150w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/rendering-300x14.jpg 300w, https:\/\/webanalyst.ro\/blog\/wp-content\/uploads\/2019\/02\/rendering-768x36.jpg 768w\" sizes=\"auto, (max-width: 806px) 100vw, 806px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Un grafic ca acesta are \u00een jur de 100 de cadre. La mine au fost create cu o viteza de ~3 fps. Graficele mai complexe dureaz\u0103 \u0219i mai mult, de exemplu anima\u021biile bazate pe h\u0103r\u021bi pot fi de 10 ori mai \u00eencete. Dar acesta este un aspect care va fi \u00eembun\u0103t\u0103\u021bit \u00een urm\u0103torul an la <em>gganimate<\/em>.<\/p>\n\n\n\n<h2>Codul surs\u0103<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A\u0219a cum promiteam la \u00eenceput, voi finaliza articolul cu codul folosit pentru a face opera\u021biile de mai sus, de la import \u0219i cur\u0103\u021bare date, la grafice statice \u0219i \u00een final la anima\u021bie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code> # \u00cenc\u0103rcare pachete folosite <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>library(lubridate) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>library(ggplot2) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>library(gganimate) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code># Import date <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>aov_data &lt;- read.csv(file='Analytics 1 Master View Daily AOV &amp; Transactions 20170101-20181231.csv', header = TRUE, sep = ',', skip = 6) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code># Cur\u0103\u021bare \u0219i prelucrare date <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>colnames(aov_data)[2] &lt;- 'AOV' <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>aov_data$Date &lt;- parse_date_time(aov_data$Date, \"Ymd\") <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Year &lt;- as.factor(year(aov_data$Date)) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Month &lt;- as.factor(month(aov_data$Date)) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Day &lt;- day(aov_data$Date) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>aov_data$AOV &lt;- as.numeric(gsub(\"\\\\$\", \"\", aov_data$AOV)) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code># Grafice statice   <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_initial &lt;- ggplot(aov_data, aes(x= Date, y = AOV)) + geom_area(alpha = 0.3) +   geom_line(aes(y = Transactions)) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_initial <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_static &lt;-ggplot(aov_data, aes(x= Month, y = AOV, color = Year)) +    geom_point(alpha = 0.5) + ylim(0, 300) + coord_fixed(ratio = 0.02) <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_static <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code># Grafic animat <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_animat &lt;- grafic_static + transition_reveal(Day)+   shadow_mark() +   enter_grow() <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>grafic_animat <\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00cen urm\u0103 cu un an scriam despre ggplot2, cel mai popular pachet pentru vizualizarea datelor cu limbajul R. Func\u021bionalit\u0103\u021bile acestuia pot fi extinse cu alte pachete, care func\u021bioneaz\u0103 ca ni\u0219te extensii. Este \u0219i cazul gganimate, pachet care la \u00eenceputul acestui an a fost publicat \u00een CRAN, arhiva oficial\u0103 de pachete pentru R. \u00cen acest articol [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2311,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,11,12],"tags":[870,868,850,869,843,364],"class_list":["post-2307","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","category-noutati","category-technical","tag-animatie","tag-gganimate","tag-ggplot2","tag-grafic","tag-r","tag-vizual"],"_links":{"self":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/2307","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/comments?post=2307"}],"version-history":[{"count":28,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/2307\/revisions"}],"predecessor-version":[{"id":2758,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/posts\/2307\/revisions\/2758"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media\/2311"}],"wp:attachment":[{"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/media?parent=2307"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/categories?post=2307"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webanalyst.ro\/blog\/wp-json\/wp\/v2\/tags?post=2307"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}