Head / Tail Breaks in JavaScript

A JavaScript implementation of Heat / Tail Breaks for use on skewed datasets. Used in http://histagram.me. Requires Underscore.js More info: https://sites.google.com/site/thepowerofcartography/head-tail-breaks

JavaScript

var data = [1731.8,292.7,254.7,247.1,197,180.4,168.8,155.6,127,114.7,107.2,99.3,95.3,92.8,66.1,63.2,63.1,61.9,61,49.7,47,43,42.3,37.5,37.4,35.8,34.1,34,30.4,29.3,28.1,27.4,27.2,27.2,27.1,27,27,26.5,23.7,23.6,23.2,21.7,21.7,21.3,21.1,19.1,19.1,18.8,18.6,17.5,17.3,17.2,16.3,15.4,15.4,15.1,14.2,14.1,12.7,12.5,11.4,10.9,9.9,9.8,9.8,9.7,9.2,8.9,8.8,8.8,7.9,6.3];

var stats = {
    mean: function(arr){
      var len = arr.length,
          sum = _.reduce(arr, function(memo, num){ return memo + num; }, 0),
          mean = sum / len
      return mean;
    },
    headTail: function(arr){
       var data_min = _.min(arr),
           mean = this.mean(arr),
	       bins = [data_min];

	    while (arr.length > 1) {
	       arr = _.filter(arr, function (d) { return d > mean });
	       mean = this.mean(arr);
	       bins.push(mean);
	    };
	    return bins;
    }
};

var thresholds = stats.headTail(data);

console.log(thresholds);