I Graph Database: analisi del comportamento degli utenti
- 4. My Background
SW e Analytics
Backend SW: Data Oriented microservices
Analytics: Data Engineering e Data Analysis
Ambito
Servizi ecommerce & Marketplace
Energy
Healthcare
- 5. Interests & Goals
User Behaviour Analysis
• Cosa fanno sul sito/app (eg: ricerche)
• Quali contenuti proporgli (suggestions)
• Engagement + Re-Engagement
Product & Content Improvement
• Per soddisfare i clienti attuali: utenti e venditori
• Per attrarre nuovi clienti
- 6. Ingredienti
.4 linguaggi di sviluppo (c#, python, java, scala)
.3 databases (elasticsearch, postgresql, Big query, graphdb)
.3-4 tools a piacimento (google o adobe analytics, google adwords, bing)
Un pizzico di Jenkins, Azure e Google Cloud Platform
Amalgamare e cuocere a “fuoco lento” per alcuni ….minuti .. mesi
- 8. Retail Behavior - Offline
• Conosco un set di operazioni/transazioni
• Ordini
• Offerte commerciali
• Promo
• Utente: conosco i suoi attributi/anagrafica (quando sono fortunato)
• Cliente “particolari”
• Clienti offline: bassa “frequentazione”
• Business: molto (molto) bassa “frequentazione”
- 9. Web Behavior
• Conosco un set di operazioni/transazioni
• Acquisti
• Richieste di supporto
• Utente: anagrafica (molto) ristretta
• Esempio: form di iscrizione snello VS form iscrizione “tabellare”
• Utente Anonimo: web = cookies + GDPR
• Conosco tutte le azioni sul sito
• Visualizzazione Dettaglio Prodotto
• Aggiunta Carrello
• Acquisto
• Review Prodotto
- 10. App Behavior
• Conosco un set di operazioni/transazioni
• Acquisti
• Richieste di supporto
• Utente: anagrafica ristretta
• Utente Anonimo ma meglio definito: deviceId
• Conosco tutte le azioni App*
• ScreenView
• Location
• Contenuti: immagini, audio
* bonus: non ho javascript tra le scatole, deviceId meno volatile dei cookies
- 11. Big Data (?) e Modelli
• Tanti dati?
• Meglio tanti “esempi”, che mi permettano di rappresentare il problema
• Colleziono tutto?
• Mi concentro su un problema alla volta
• NB: Speculare può portare fortuna
• Come li gestisco o come li uso?
• Indago su un obiettivo principale, esploro un obiettivo secondario
- 12. La sfida
• Modellizzare le relazioni tra utenti per capire come si comportano, in
maniera più intuitiva.
• Sia in fase di analisi
• Sia per costruire sistemi in grado di fornire informazioni “live”
• Esempio: suggerire qualcosa ad un utente nuovo o esistente.
- 15. Property Graph
• Labels
• Key/Value Properties
Roberto Fiat 500
Microsoft
PERSON
COMPANY
CAR
Age: 39
Work: SW Dev
Name: Microsoft
Business: Software
Hp: 50
Brand: Fiat
Works With
since:2006
Owns
since:2010
- 17. GraphDB - Caratteristiche
• Gestiscono relazioni “entity to entity” (no tabelle N-M)
• Alta velocità di attraversamento nodo – relazione – nodo – … – nodo
• Algoritmi ad-hoc (Page Rank, Shortest Path, …)
• Alcuni (>100 !!!) esempi
- 18. GraphDB: Use cases e algoritmi
• Social Analytics
• User Behavior (Recommendation Engine)
• Fraud Analysis (Fraud Rings)
• Logistics
• Access Control (Hierarchies of Access Rules)
• Gaming (game blocks)
- 19. Neo4j - Cypher
Graph Query Language (Pattern matching)
MATCH (a:USER) –[:LIKES]-> (b:MOVIE)
WHERE a.name = “Rob”
RETURN b.id, b.title;
Ref: https://neo4j.com/developer/cypher-query-language/
- 20. DEMO
RDBMS vs GRAPH DB
• Analisi di un database “classico”
• Nortwhind
• Azure Data Studio + SQL Server
+ Docker
• Neo4J Desktop
• Obiettivo:
• Esplorazione
• Trovare I prodotti più venduti
• Capire chi sono gli utenti
coinvolti
• Offriamo qualcosa di diverso a
“questi” utenti
- 22. The Relational Way (.. inizio ..)
WITH
-- tutti gli ordini in cui ho comprato il prodotto 60
qry1 AS (
SELECT OD."OrderID", O."CustomerID", "ProductID", "UnitPrice", "Quantity",
"Discount"
FROM public.order_details as OD INNER JOIN public.orders as O ON OD."OrderID"
= O."OrderID"
WHERE OD."ProductID" = 60
)
.. .. .. ..
- 23. The Relational Way (.. seconda parte ..)
-- tutti i prodotti diversi da X venduti assieme ad 60
, qry2 AS (
SELECT
OD."ProductID", COUNT(*) AS N
FROM qry1
INNER JOIN public.orders as O ON O."OrderID" = qry1."OrderID"
INNER JOIN public.order_details as OD ON OD."OrderID" = O."OrderID"
WHERE OD."ProductID" <> 60
GROUP BY OD."ProductID"
)
SELECT * FROM qry2 ORDER BY N desc
- 30. Recommendation Engines
• Content Based
• Individuare un set di caratteristiche/contenuti in commune tra utenti
• Collaborative Filtering
• Individuare un usi/comportamenti comuni tra utenti
• Hybrid
• Mix tra content e collaborative filtering
- 31. Content Based
GOAL: identificare item simili utilizzando attributi o caratteristiche di un
prodotto di partenza
Esempio: Homer adora birra “Duff” -> Potrebbe interessargli la T-Shirt “Duff”
- 32. Collaborative Filtering
GOAL: suggerire un item sulla base dei comportamenti associati a quell’item da parte
dei relative utenti
Esempio: Utente A e B condividono comportamenti in commune (pizza e pasta) =>
potrei suggerire a A quello che piace a B (che A non conosce)
- 33. Esempi
• Have a look http://rejoiner.com/resources/amazon-recommendations-
secret-selling-online/
- 39. MovieLens - Jaccard Similarity
• Movie A VS Movie B
• Genres(A) = {“Drama”, “Adult”}
• Genres(B) = {“Drama”, “Sci-Fi”, “Horror”}
• J(A,B) = LEN({“Drama”}) / LEN({“Drama”, “Sci-Fi”, “Horror”, “Adult”})
= 1/4
Ref: Neo4j Jaccard SImilarity
- 41. MovieLens – Euclidean Distance
• User a VS User b
• Ratings(a) = { ra1, ra2, … raN }
• Ratings(b) = { rb1, rb2, … rbN }
• D(a,b) = SQRT( (rb1-ra1)^2 + ….. (rbN-raN)^2 )
• S(a,b) = 1/ 1 + D(a,b)
Ref: Neo4j Euclidean SImilarity
- 42. Euclidean Similarity – Neo4J
MATCH (u1:USER{ userId: 1 })-[r1:RATED]->(m:MOVIE)<-[r2:RATED]-(u2:USER)
WITH
count(m) AS CommonMovies, u1.userId AS user1, u2.userId AS user2, u1, u2
, collect((toFloat(r1.rating)-toFloat(r2.rating))^2) AS ratings, collect(m.title) AS
movieNames, collect(m.movieId) AS movieIds
WITH u1, u2, CommonMovies, movieNames, movieIds, ratings
WHERE CommonMovies > 2
WITH u1, u2, CommonMovies, 1/(1+SQRT(reduce(total=0.0, k in extract(i in ratings | i ) |
total+k))) as EUC_SIM
ORDER BY EUC_SIM DESC LIMIT 3
MATCH (u2)-[or:RATED]->(om:MOVIE) WHERE NOT ( (u1)-[:RATED]->(om) )
WITH om , EUC_SIM as similarity, or.rating as rating
ORDER BY om.movieId, similarity DESC
- 43. MovieLens – Cosine Similarity
• User a VS User b
• Ratings(a) = { ra1, ra2, … raN }
• Ratings(b) = { rb1, rb2, … rbN }
• S(a,b) = [ (rb1*ra1) + ..+ (rbN*raN) ] / [ SQRT(ra1^2+…+raN^2) *
SQRT( rb1^2 + ….. + rbN^2 )
Ref: Neo4j Cosine Similarty
- 44. Cosine Similarity - Neo4J
MATCH (u1:USER{ userId:1 })-[x:RATED]->(m:MOVIE)<-[y:RATED]-(u2:USER)
WITH
u1, u2, COUNT(m) as CommonMovies, COLLECT(m) as CommonMoviesItems
, SUM(toFloat(x.rating) * toFloat(y.rating)) AS xyDotProduct
, SQRT(REDUCE(xDot = 0.0, a IN COLLECT(toFloat(x.rating)) | xDot + toFloat(a)^2)) AS xProd
, SQRT(REDUCE(yDot = 0.0, b IN COLLECT(toFloat(y.rating)) | yDot + toFloat(b)^2)) AS yProd
WHERE CommonMovies > 2
WITH u1, u2, CommonMovies, CommonMoviesItems, (xyDotProduct / (xProd * yProd)) as CosineSimilarity
ORDER BY CosineSimilarity DESC LIMIT 5
MATCH (u2)-[or:RATED]->(om:MOVIE)
WHERE NOT ( (u1)-[:RATED]->(om) )
WITH u2, om , CosineSimilarity, or.rating as rating
ORDER BY om.movieId, CosineSimilarity DESC
- 45. MovieLens – Pearson Similarity
• Misura della correlazione lineare
tra A e B
• Assume valori tra -1 e 1
Ref: Neo4j Person Similarty
- 48. Instacart Kaggle – Alternative Data Model
Calcolo Probabilità
• di acquistare C dopo aver acquistato B -> P(C|B)
• acquistare C dopo aver acquistato B e A -> P(C|A,B)
Product A Product B
:NEXT
- times: 100
Product C
:NEXT
- times: 30
Product D:NEXT
- times: 50
- 49. Instacart Kaggle - Recommendation
MATCH
(p:Product{ name = “Chocolate Sandwich Cookies” }) –[r:NEXT] -
>(next:Product)
RETURN next.name, r.count
- 56. Conclusioni
• GraphDB offrono una prospettiva “diversa”
• Join molto complesse
• CTE e operazioni ricorsive
• Relazioni tra archi e nodi sono di naturale interpretazione
• Attenzione (!)
• Versioni Enterprise costano parecchio
• Tanti nuovi player -> competizione
• Alternativa Cloud -> Amazon Neptune, Azure CosmosDB
- 57. Conclusioni
• Studio
• Diversi libri in questo ambito
• Diversi Databases e Tool
• Spike
• Caricate I dati su un GraphDB
• Gestionale, Crm, Dati non strutturati
• Suggerimenti
• In Locale e sul Cloud
- 61. Grazie!
{
“id”: 99
, “name”: “Roberto Grandi”
, “mail”: roberto.grandi@gmail.com
, “twitter”: @grandirob
, “contact me for”: [“help”, “consultancy”, “SW”]
, “interests”: [ “SW Development”,
“Data Engineering”,
“User Behavior” ]
}