Data analyses enkel voor grote ondernemingen: No way!
Nicky Van Thuyne - 5 oktober 2020
In mijn vorige post heb ik aangehaald dat er verschillende manieren zijn om data op een goedkope manier te gaan analyseren. Een daar van is door middel van R. In deze driedelige reeks van posts ga ik een concreet voorbeeld geven van hoe je met een (minimale) hoeveelheid aan data, reeds verrassend uitgebreide analyses kan uitvoeren, met vergaande inzichten.
Inleiding
Voor deze analyse heb ik gebruik gemaakt van een publiek beschikbare dataset (https://www.kaggle.com/sulmansarwar/transactions-from-a-bakery). Deze dataset bevat 21293 observaties van een bakerij. De datafile bevat slechts 4 variabelen: Datum, Tijd, Transactie ID en Item.
Dit is niet wat onder de noemer "Big Data" valt, maar vaak wordt deze term overgebruikt, en ben je beter gediend met "Smart Data".
Daar waar de eerste term vooral gaat over de hoeveelheid data die gegenereerd wordt, is het bij de tweede term zo dat alle niet relevante data verwijderd wordt, en je een goede gegevenskwaliteit hebt.
Met bovenstaande variabelen, en 1 (!) simpele bewerking (een functie genaamd), kunnen we reeds de volgende zaken afleiden uit de data:
1) De gecapteerde informatie loopt van 30/10/2016 tot 09/4/2017, of met andere woorden 161 dagen
2) De meeste verkoop gebeurt rond 12u45 's middags; daarnaast zijn enkele merkwaardige waarden te noteren om 1u21 en 23u38 (waarschijnlijk foutieve data ingave, daar dit buiten de openingsuren van een zaak valt)
3) Het populairste verkochte artikel is koffie, wat verbazingwekkend lijkt, aangezien het een bakkerij is! Daar nummer 3 thee is ga ik ervanuit dat dit een winkel is met drankvoorziening.
Eerste analyses
In mijn meer uitgebreide analyse heb ik de volgende zaken onderzocht
- Meest populaire artikelen
- Totaal aantal Items verkocht per dag
- Top 50 verkoopsdagen gegroepeerd per weekdag
Dit alles om te kunnen bepalen welke dagen de meeste verkoop gegenereerd wordt. Hieruit blijkt dat zaterdag/zondag en daarna vrijdag de topdagen zijn.
Maar hier komen we bij een van de valkuilen van data analyses. Het is inderdaad zo dat er meer items verkocht worden, maar dit bepaalt niet het aantal transacties die uitgevoerd zijn. Zoals we in het voorbeeld van de data in het begin van het artikel kunnen zien word soms 1 artikel gekocht, en soms meerdere.
Om dit te achterhalen dienen we het analyse luik over een andere boeg te gooien.
We passen onze functie lichtjes aan waarbij we unieke filtering op Transactie ID doorvoeren. Dit levert ons de volgende (meer realistische) grafiek op
Het is duidelijk dat zaterdag nog steeds de topdag is, maar vrijdag komt nu voor zondag + de andere dagen van de week zijn niet zo extreem veel minder meer. De interpretatie die je hieraan koppelt is dat op zondag mensen meer dan 1 of 2 items kopen als ze naar de bakkerij gaan. De logische vraag die je je dan stelt is natuurlijk hoeveel? Mits het schrijven van een functie kom je bij het volgende uit:
En ja hoor, 2.6 items gemiddeld op zondag; hypothese bevestigd!
Analyses op Uur-niveau
De analyses die tot nu toe zijn uitgevoerd waren op het niveau van dag. Als we terug kijken naar de kolommen in onze dataset, dan hebben we gebruik gemaakt van transactieID, Datum en Item. 1 kolom hebben we nog niet gebruikt, namelijk Tijd. Hier komt nu verandering in, want we gaan verder inzoomen tot op uurniveau.
Opnieuw kunnen we dit doen voor totaal aantal verkochte items & uniek aantal verkopen, en dan zien we het volgende:
Niet veel verschil tussen de twee behalve de schaal, waarvan we weten uit een vorige grafiek dat deze rond de 2,2 ligt gemiddeld (wat nogmaals bevestigd wordt hier). Zou er een verschil zijn op uurniveau voor het aantal aankopen, of zou dit ook rond de 2,2 liggen?
Als we hier de grafiek van genereren dan zien we het volgende:
Hier zien wel wel een opmerkelijk verschil: tussen 9u en 17u zien we gemiddelde waarden boven de 2, erbuiten opmerkelijk lager. Dit kan wijzen op een verschillend aankoopgedrag: 's morgens & 's avonds wordt bvb enkel een koffie gekocht, daartussen wordt iets voor te eten EN te drinken gekocht. Meer gedetailleerde analyses kan deze hypothese eventueel bevestigen.
Conclusie van eerste analyse
Als laatste grafiek gaan we pogen alles wat we reeds bekeken hebben samen te brengen in 1 grafiek.
Deze grafiek lijkt heel complex waar veel code achter steekt, maar ik zal hier de code in plakken, en regel per regel uitleggen wat deze doet
x10 <- x %>%
mutate(Hour=as.factor(hour(Time)),
Day=wday(Date,label=T)) %>%
group_by(Day,Hour,Transaction) %>%
summarise(Count=n()) %>%
ggplot(aes(x=Hour,y=Day,group=Day,fill=..density..))+
theme_fivethirtyeight()+
ggtitle("Transactie dichtheid per uur per dag")+
theme(legend.position="none")+
geom_density_ridges_gradient(scale=2, rel_min_height=0.01)+
scale_fill_viridis(option="magma")
x10
x10 is de naam van de grafiek die we gaan maken (de vorige figuren hadden namen zoals x1,x2, ...)
X
-> onze dataset die we initieel ingelezen hebben
%>%
-> een pipe commando:we voeren een transformatie uit op de aangeleverde data, en geven het resultaat dan door aan de volgende bewerking
Dus de eerste regel moet geïnterpreteerd worden als neem je oorspronkelijk data, en doe er de volgende bewerkingen op. Daarna sla je het resultaat op in X10
mutate(Hour=as.factor(hour(Time)), Day=wday(Date,label=T))
-> maak van het stukje UUR in de variable tijd een factor, zodat hierop kan gegroepeerd worden
-> haal de naam van de weekdag (bvb Zaterdag) uit de datum
group_by(Day,Hour,Transaction)
-> groepeer op dag, uur en transactie
summarise(Count=n())
-> tel het aantal per groep bepaald in de vorige stap
Tot hier verlopen de transformaties op de data. Vanaf nu is het puur op visualisatie van de data
ggplot(aes(x=Hour,y=Day,group=Day,fill=..density..))+
-> maak een plot waarbij je op de X-as de datum neemt, op de Y-as de dag en groeppeer per dag in de visualisatie
theme_fivethirtyeight()+
-> selecteer een template van visualisatie (bvb kleurenpatroon zoals in excel grafieken)
ggtitle("Transactie dichtheid per uur per dag")+
-> een titel aan je grafiek toevoegen
theme(legend.position="none")+
-> een template voor de legende toevoegen (geen in dit geval)
geom_density_ridges_gradient(scale=2, rel_min_height=0.01)+
-> parameters toevoegen voor de visualisatie
scale_fill_viridis(option="magma")
-> geef een type van kleurschakering voor de magnitide van aantal transacties aan je figuur
Daarna met X10 plot je de grafiek
Het is duidelijk dat we met deze analyse enkel het topje van de ijsberg hebben aangekaart. We hebben op basis van de gegevens enkele basis conclusies kunnen trekken. In een vervolg post, gaan we dieper in gaan op de transactie data zelf, en bestuderen we het koopgedrag meer in detail door middel van een market basket analysis.
In een derde en afsluitende post gaan we nog verder, waarbij we aan de hand van gegevensverrijking gaan proberen voorspellingen te simuleren op basis van promoties.
Indien je hier ondertussen reeds vragen over hebt of met je eigen data aan de slag wil gaan, aarzel dan zeker niet om me te contacteren.