2017-05-02 4 views
1

Ich entwickle gerade einen Zeitrahmen für einen Churn-Datensatz in R. Um dies zu tun brauche ich die durchschnittliche Inter-Kauf-Zeit von jedem Kunden.Durchschnittliche Kaufzeit mit allen Daten in einer Spalte in R

Die Beispieldaten unten zeigen zwei Kunden (Kunden 1 und 2), die jeweils 3 und 2 verschiedene Gelegenheiten kaufen. Die durchschnittliche Zeit zwischen Käufen für Kunde 1 beträgt 7,5 Tage ((9 + 6)/2) und die durchschnittliche Zeit zwischen Käufen für Kunde 2 beträgt lediglich 5 Tage, da für diesen Kunden nur zwei Beobachtungen vorliegen. Im Code sieht es wie folgt aus:

df <- data.frame(cust_id=c(1,2,1,2,1), 
    order_date=as.Date(c("2012-8-14", "2012-7-1", "2012-8-23", "2012-7-6" 
    "2012-8-29"))) 

und grafisch sieht es so etwas wie dieses:

cust_id order_date 
1 1   2012-8-14 
2 2   2012-7-1 
3 1   2012-8-23 
4 2   2012-7-6 
5 1   2012-8-29 

Schließlich möchte ich es wie folgt aussehen:

cust_id avg_interpurchase_time 
1 1   7.5 
2 2   5 

Ist jemand in der Lage zu zeigen in mir die richtige Richtung?

Danke!

P.S. Ich habe den folgenden Beitrag angeschaut: Calculating Inter-purchase Time in R aber ich glaube meine Frage unterscheidet sich von der dort gestellten Frage. Ich habe alle Daten in einer Spalte und ein Kunde kann bis zu 80 Daten haben, während der Typ, der das veröffentlicht hat, nur zwei Daten für jeden Kunden hat, verteilt auf 2 Spalten.

Antwort

0

In Basis R gemacht, könnten Sie aggregate zusammen mit einer benutzerdefinierten Funktion verwenden:

aggregate(order_date ~ cust_id, data=df, FUN=function(x) mean(diff(x))) 
    cust_id order_date 
1  1  7.5 
2  2  5.0 

Hier nehmen wir die Differenz nach Bestelldatum und berechnen dann den Mittelwert. Beachten Sie, dass dazu die Daten nach Datum sortiert sein müssen. Sie können sicherstellen, dass dies der Fall ist, indem Sie order in den Aufruf des data.frame, wie in data=df[order(df$order_date),] zum Beispiel.

Daten
Enthält ein paar Tippfehler korrigiert von OP.

df <- 
structure(list(cust_id = c(1, 2, 1, 2, 1), order_date = structure(c(15566, 
15522, 15575, 15527, 15581), class = "Date")), .Names = c("cust_id", 
"order_date"), row.names = c(NA, -5L), class = "data.frame") 
+0

Danke! Das hat mein Problem gelöst. Entschuldigung für die Tippfehler und Danke für die Korrektur! –

1

Mayeb Verwendung dplyr:

df %>% group_by(cust_id) %>% summarise(avg_internetpurchase_time = mean(diff(order_date))) 
0

Hier ist die dplyr Lösung. Beachten Sie, dass Sie einen Tippfehler im Jahr des zweiten Kauf von cust_id 2. Daher mittelt bis 371 statt 5.

library(dplyr) 
df %>% group_by(cust_id) %>% arrange(order_date) %>% mutate(dif = order_date - lag(order_date)) %>% 
    summarise(avg_purchase = mean(dif, na.rm = TRUE)) 
+0

Vielen Dank für Ihre Antwort umfasst Sortier-! Danke, dass du auch den Tippfehler entdeckt hast, ich werde ihn bearbeiten. Ich fürchte, mein Beispiel ist nicht repräsentativ genug für den gesamten Datensatz. Zum Beispiel, mit dem Code, den Sie geliefert haben, erhalte ich eine durchschnittliche Inter-Kauf-Zeit von -48,5 für einen Kunden mit den folgenden Daten: 2015-09-03, 2014-09-08, 2015-05-29 (in dieser Reihenfolge wenn die Daten nach cust_id gruppiert sind. Dies sollte jedoch 180 (263 + 97)/2 sein. Irgendeine Idee, warum das so aussehen könnte? –

+0

Ich nahm an, dass Ihr Datensatz wie im Beispiel bereits bestellt wurde. Ich habe die Sortierung hinzugefügt, was meine Antwort identisch mit der von epi99 macht. – Edwin

0

Ähnlich wie Antworten, aber (ordnen)

library(dplyr) 
df %>% 
    group_by(cust_id) %>% 
    arrange(order_date) %>% 
    mutate(t = order_date - lag(order_date)) %>% 
    summarize(avg_interpurchase_time = mean(t, na.rm=T)) 
Verwandte Themen