function analyze( data, opts, clbk ) {
	var params;
	var scores;
	var tmp;

	params = methods[ opts.method ];

	// Assemble two element tuples consisting of the value index and a score on which to sort...
	switch ( opts.method ) {
	case 'followers':
	case 'following':
	case 'created':
	case 'repos':
	case 'gists':
		tmp = raw( data, params.key );
		break;
	case 'ffratio':
		tmp = ratio( data, params.key1, params.key2 );
		break;
	default:
		throw new TypeError( format( 'invalid option. Unknown method. Option: `%s`.', opts.method ) );
	}
	// For `created`, older users should be ranked higher...
	if ( opts.method === 'created' ) {
		if ( opts.order === 'desc' ) {
			opts.order = 'asc';
		} else {
			opts.order = 'desc';
		}
	}
	// Rank the data:
	tmp = sort( tmp, opts.order );

	// Shuffle the original data to match the sort order:
	data = shuffle( data, tmp );

	// Pluck the scores from the sort vector:
	scores = pluck( tmp, 1 );

	// Assemble the results data:
	data = {
		'data': data,
		'results': scores
	};

	setTimeout( onTimeout, 0 );

	/**
	* Dezalgo.
	*
	* @private
	*/
	function onTimeout() {
		clbk( null, data, null );
	}
}
Analyzes user detail data.

@param {ObjectArray} data - user data
@param {Object} opts - analysis options
@param {string} opts.method - analysis method
@param {string} opts.order - sort order
@param {Function} clbk - callback to invoke after completing analysis
@throws {TypeError} unknown method option
@returns {void}