X-Sell Networks

Navigation

Ziel der Analyse war es, X-Sell-Beziehungen zwischen Warengruppen übersichtlich darzustellen. Dazu bot sich die Netzwerk-Darstellung an, in der die Grösse der Knoten die Wichtigkeit der Warengruppen (absolute Transaktionshäufigkeiten) beschreibt und die Stärke der Kanten zwischen den Knoten die X-Sell-Häufigkeiten zwischen den Warengruppen vermittelt.

Zunächst wurde per SQL (unter Zuhilfenahme eines vereinheitlichender Warenguppen-Mappings) die Auszählung der X-Sells zwischen Warengruppen je Besuch (Zusammenfassung aller Belege eines POS/Datums/Kunden) durchgeführt.

 

Danach wurden diese Daten in Excel abgespeichert und pivotiert, um eine Matrix der Beziehungen zwischen den Warengruppen zu erhalten.

 

Die auf diese Weise enstandene Kreuztabelle wurde für die weitere Verarbeitung in R als csv abgespeichert.

 

Vorbedingungen in R

 

# !!! Falls noch nicht geschehen:
install.packages("igraph")
install.packages("tcltk")

# setzen des Arbeitsverzeichnisses auf den Ordner, in dem die csv-Datei liegt (in RStudio via "Session" -> "Set Working Directory")

 

Durchführung

# Laden der Bibliotheken

library(igraph)
library(tcltk)

 

#CSV einlesen als DataFrame
xsellnl <- read.table("Kreuztabelle.csv", sep=";",row.names=1,header=TRUE)

 

#missing value imputation (by 0)
xsellnl[is.na(xsellnl)] <- 0
 
#Matrix aus Data Frame erzeugen
jmatrix <- as.matrix(xsellnl)
 
#Graph aus Matrix erzeugen
g <- graph.adjacency(jmatrix, weighted=T, mode = "undirected")
 
#Knoten mit Tags versehen
V(g)$label <- V(g)$name

# degree gibt die Anzahl an Verbindungen der Knoten untereinander an
# bei vollständig gefüllter Matrix sind alle Werte gleich (Grad der Matrix)
V(g)$degree <- degree(g)
 
#Zufallsgenerator mit identischen Seed, so dass Layout gleich bleibt
set.seed(3952)
 
# grafisches Aufhübschen
# Schriftgrad der Knotenbeschriftung in Abhängigkeit vom Grad der Matrix
V(g)$label.cex <- V(g)$degree / max(V(g)$degree)+ .2
# Farbe Knotenbeschriftung = konstant
V(g)$label.color <- rgb(0, 0, .2, .8)
# Rahmen um Knoten entfernen
V(g)$frame.color <- NA

 

# Berechnung der Knotendicke
egam <- (log(E(g)$weight)+.4) / max(log(E(g)$weight)+.4)

#Kantenfarbe in Abhängigkeit vom Gewicht
E(g)$color <- rgb(.5, .5, 0, egam)
#Kantendicke ion Abhängigkeit vom Gewicht
E(g)$width <- 2*egam
#Knotengrösse als Spaltensumme der Matrix (also Transaktionshäufigkeit je Warengruppe)
bubble <- 50*colSums(jmatrix)/max(colSums(jmatrix))
 
# (interaktiver) Plot des Netzwerk-Graphen
tkplot(g, canvas.width=1200, canvas.height=960,
vertex.size=bubble,
vertex.label.color = V(g)$label.color,
edge.width = E(g)$width,
edge.curved = TRUE,
layout=layout.kamada.kawai)