skinnyandbald
2/13/2014 - 1:29 AM

## How to generate a line chart for retention analysis with Keen IO

How to generate a line chart for retention analysis with Keen IO

`````` <script type="text/javascript" charset="utf-8">

// Global Properties for Line Chart Viz
var chartHeight = 400
var chartWidth = 600
var lineWidth = 3
var chartAreaWidth = "60%"
var chartAreaLeft = "10%"
var xAxisLabelAngle = "45%"

var daysInChart = 10  // Number of days in your line chart
var step1CollectionName = "user_created"
var step2CollectionName = "user_play"
var actorProperty = "player_id"
var retentionPeriod = 1 // Number of days to use for retention analysis (E.g. D7 Retention (T-7 installs return T0) has a retention value of 7)  aka DaysSinceFirstPlay. A retentionPeriod of 1 means the number of people who did step2 in the 24hour period after their step1 activity.

calculateRetention(daysInChart, step1CollectionName, step2CollectionName, retentionPeriod, actorProperty, "chart1A")
// calculateRetention(daysInChart, step1CollectionName, step2CollectionName, 3, actorProperty, "chart1B")
// calculateRetention(daysInChart, step1CollectionName, step2CollectionName, 7, actorProperty, "chart1C")

});

function calculateRetention(daysInChart, step1CollectionName, step2CollectionName, retentionPeriod, actorProperty, div) {
var dataForLineChart = []
var i = 0

while (i < daysInChart) {

// Funnel steps used for calculating retention

var firstStepDate = new Date();
firstStepDate.setDate(firstStepDate.getDate() - daysInChart - retentionPeriod + i)
firstStepDate.setHours(0,0,0)
var firstStepDateEnd = new Date(firstStepDate)
firstStepDateEnd.setDate(firstStepDateEnd.getDate() + 1)
var secondStepDate = new Date(firstStepDate);
secondStepDate.setDate(firstStepDate.getDate() + retentionPeriod)
var secondStepDateEnd = new Date(secondStepDate)
secondStepDateEnd.setDate(secondStepDateEnd.getDate() + 1)

var s1 = new Keen.Step(step1CollectionName, {
timeframe: {start: firstStepDate, end: firstStepDateEnd}
});

var s2 = new Keen.Step(step2CollectionName, {
timeframe: {start: secondStepDate, end: secondStepDateEnd}
});

//Instantiate a new Keen.Funnel for those steps.
var myFunnel = new Keen.Funnel([s1, s2], {
actorProperty: actorProperty
});

myFunnel.getResponse(function(response){
var percentage = response.result[1]/response.result[0]
dataForLineChart.push({
"value" : percentage,
"timeframe" : {
"start" : response.steps[1].timeframe["start"],
"end" : response.steps[1].timeframe["end"]
}
})
if (dataForLineChart.length == daysInChart) {
var title = "D" + retentionPeriod + " Retention"

// Need to sort data for line chart!
dataForLineChart.sort(function(x, y){
date1 = new Date(x.timeframe["start"]);
date2 = new Date(y.timeframe["start"]);
return date1 - date2;
})
drawMyLineChart(dataForLineChart, "daily", div , title)
}
});
i++
}
}

function drawMyLineChart(data, interval, div, title) {
// The final formatting required so that the result can be processed by the Keen.MultiLineChart draw method.
var formattedResult = {
result: data
}

// Create a Series object so that it can be referenced by the draw method.
// This is kind of a hack since we are passing in our own result object and not really querying the collection specified here.
// The "placeholder" is used instead of a collection name, since this is not used.
var placeholderSeries = new Keen.Series("placeholder", {
interval: interval
})

var placeholderLineChart = new Keen.LineChart(placeholderSeries, {
height: chartHeight,
width: chartWidth,
lineWidth: lineWidth,
chartAreaWidth: chartAreaWidth,
chartAreaLeft: chartAreaLeft,
title: title,
// colors: colors,
showLegend: false,
xAxisLabelAngle: xAxisLabelAngle
});
placeholderLineChart.draw(document.getElementById(div), formattedResult);
}

</script>``````