BasketAnalysis Deel3
In datamining is het a-priorialgoritme een algoritme dat helpt om associatieregels te leren uit een database met informatie over transacties, zoals per aankoop de gekochte producten in een supermarkt of de bezochte pagina’s op een website per sessie. Een voorbeeld van een associatieregel is: ‘in 80% van de gevallen kopen klanten die product A kopen ook product product B’.
Het algoritme helpt om associatieregels te leren door patronen te vinden in de data. Formeler gezegd, tracht het algoritme verzamelingen van transactieitems te vinden die meer dan een vooraf bepaald aantal keer voorkomen in de data. Bijvoorbeeld kan het algoritme gebruikt worden om in de dataset te zoeken naar frequente combinaties van aangekochte producten, zoals elke combinatie van producten die minstens 3 keer samen aangekocht werden.
Deel 3: Klasse BasketAnalysis
Download de klasse TransactionAnalysis
.
Maak geen wijzigingen aan deze gegeven klassen.
Merk op dat de klassen allemaal in de default package moeten zitten (=rechtstreeks in de ‘src’-map van het project in NetBeans).
Dit is nodig om deze later in te kunnen dienen op het Dodona platform voor feedback door middel van copy-pasten van de hele inhoud
van de klasse in het vak van de oefening op Dodona. Zorg er ook wel voor dat je ingediende code compileert, bij compilatiefouten kan
geen (zinvolle) feedback gegeven worden.
- Voeg de instantievariabelen toe zoals beschreven in het bovenstaande klassendiagram.
- Definieer de constructor zoals beschreven in het bovenstaande klassendiagram. Deze heeft een String als parameter
die de inhoud van een CSV-bestand met Basket objecten voorstelt. De constructor transformeert elke lijn in een Basket object en
voegt dit toe aan de instantievariabele. Indien de parameter ‘null’ of leeg is, wordt de instantievariabele geïnitialiseerd als
een lege lijst. Elk Basket object staat op een aparte lijn als volgt:
basketID;customerID;productID;quantity;productID;quantity;…
basketID;customerID;productID;quantity;productID;quantity;…
…
Voorbeeld input:
basket17;Fien;tropical fruit;4
basket0;Fons;citrus fruit;16;margarine;2;ready soups;3
- Maak de statische methode getItemsFromBaskets die een array van Basket objecten als parameter heeft. De methode retourneert een
array van Items die elk Item uit de meegegeven baskets slechts éénmaal bevat. Met de kwantiteiten wordt geen rekening gehouden,
enkel met de naam van het Item. Bijvoorbeeld, veronderstel dat de methode 2 baskets meekrijgt met het volgende er in:
Basket 1: (banaan, 4), (appel, 1) en (bloemkool, 2)
Basket 2: (banaan, 1) en (tandenborstel, 1)
De methode zal in dit geval een array van lengte 4 teruggeven, met daarin één Item voor elk uniek item. Dus [(banaan, 4),
(appel, 1) en (bloemkool, 2), (tandenborstel, 1)] of [(banaan, 1), (appel, 1) en (bloemkool, 2), (tandenborstel, 1)] zijn beide
correct.
- Maak de methode getClientBaskets die een String als parameter heeft. De methode retourneert een array van Basket
objecten, bestaande uit alle baskets waarvan de ‘clientID’ gelijk is aan de meegegeven ‘clientID’.
- Maak de methode analyzeClients die een array van Strings en een int als parameters heeft. Deze methode maakt
gebruik van de klasse TransactionAnalysis om de winkelmandjes van de meegegeven klanten één voor één te analyseren en het
resultaten weer te geven in de console.
De methode gaat alle Strings in de meegegeven array af. Voor elke String (i.e. een klanten ID) wordt achtereenvolgens
een boodschap van de vorm “Analysis Client [clientID] with threshold [threshold]:” afgeprint (met de [clientID] en [threshold]
als placeholders voor de meegegeven waarden), een nieuw TransactionAnalysis object aangemaakt en de output van de
‘aPrioriAlgorithm’-methode oproep uitgeprint. De constructor van TransactionAnalysis kan opgeroepen worden met als parameters
een array met Basket objecten van een bepaalde klant en een array met alle unieke Items die voorkomen in de voorgaande array.
De methode zou bijvoorbeeld de volgende output kunnen weergeven:
Analysis Client Fien with threshold 2:
- Found 21 frequent itemsets of size 1:
{(pip fruit);(yogurt);(pork);(hamburger meat);(citrus fruit);(whipped/sour cream);(coffee);(curd);(tropical fruit);
(other vegetables);(bottled beer);(soda);(sausage);(canned beer);(rolls/buns);(beef);(root vegetables);(whole milk);
(bottled water);(pastry);(chicken)}
- Found 7 frequent itemsets of size 2:
{(yogurt, rolls/buns);(yogurt, bottled water);(other vegetables, root vegetables);(other vegetables, whole milk);
(rolls/buns, whole milk);(rolls/buns, bottled water);(root vegetables, whole milk)}
Analysis Client Fons with threshold 2:
- Found 27 frequent itemsets of size 1:
{(fruit/vegetable juice);(newspapers);(root vegetables);(other vegetables);(whole milk);(dessert);
(tropical fruit);(pip fruit);(rolls/buns);(sausage);(yogurt);(frankfurter);(bottled water);(soda);(waffles);
(shopping bags);(margarine);(citrus fruit);(curd);(whipped/sour cream);(hygiene articles);(napkins);(misc. beverages);
(white bread);(pork);(brown bread);(coffee)}
- Found 13 frequent itemsets of size 2:
{(root vegetables, other vegetables);(other vegetables, whole milk);(whole milk, dessert);(whole milk, rolls/buns);
(whole milk, yogurt);(whole milk, shopping bags);(whole milk, napkins);(rolls/buns, sausage);(rolls/buns, yogurt);
(rolls/buns, frankfurter);(rolls/buns, bottled water);(rolls/buns, soda);(yogurt, curd)}
Hierbij nog wat uitleg over de Dodona-testen voor deze oefening:
- test00objectConcept: test of de ingediende klasse de verwachte de klasse definitie heeft (interface/abstracte klasse/klasse/enum/…).
- test01inheritance: test of de ingediende klasse de verwachte superklasse heeft en de verwachte interfaces implementeert.
- test02variables_presence: test of de ingediende klasse de verwachte instantievariabelen en statische variabelen definieert.
- test03variables_staticInitialValue: test of de statische variabelen van de klasse geinitialiseerd worden met de verwachte waarde (indien van toepassing).
- test04constructor: test of de constructor het gewenste effect heeft (indien van toepassing).
- test05constructor_legeString: test de constructor enkel voor het geval dat een lege String (= “”) meegegeven wordt als parameter.
- test06constructor_null: test de constructor enkel voor het geval dat een leeg object (= null) meegegeven wordt als parameter.
- test07methodsPresent: test of de verwachte methodes aanwezig zijn in de ingediende klasse en of de methode definities overeenkomen met de verwachte definities (= test geen effect!).
- test08accessorsMutators: test of de ingediende klasse de al dan niet verwachte accessor- en mutatormethodes definieert en of deze het verwachte effect hebben.
- test09getItemsFromBaskets: test de getItemsFromBaskets-methode.
- test10getClientBaskets: test de getClientBaskets-methode.
- test11analyzeClients: test de analyzeClients-methode.