Detect Statistical Outliers using Z-Score and ResultSet

This article demonstrates how to detect statistical outliers in an SAP Analytics Cloud table using Z-Score analysis and ResultSet scripting.

The script calculates the mean and standard deviation of the values returned by a table and then determines how many standard deviations each member sits from the average.
Members whose Z-Score exceeds a defined threshold are identified as statistical outliers and written dynamically to a text widget.

// Get result set
var resultSet = Table_1.getDataSource().getResultSet();
var rowDims = Table_1.getDimensionsOnRows();

if (resultSet.length > 0 && rowDims.length > 0)
{
    var count = resultSet.length;
    var total = 0.0;

    // Use the first row dimension
    var dimId = rowDims[0];

    // --------------------------------
    // 1. Calculate mean
    // --------------------------------
    for (var i = 0; i < count; i++)
    {
        var value = ConvertUtils.stringToNumber(resultSet[i][Alias.MeasureDimension].rawValue);
        total = total + value;
    }

    var mean = total / count;

    // --------------------------------
    // 2. Calculate standard deviation
    // --------------------------------
    var variance = 0.0;

    for (var j = 0; j < count; j++)
    {
        var currentValue = ConvertUtils.stringToNumber(resultSet[j][Alias.MeasureDimension].rawValue);
        var diff = currentValue - mean;

        variance = variance + (diff * diff);
    }

    var stdDev = Math.sqrt(variance / count);

    // --------------------------------
    // 3. Detect outliers using Z-score
    // --------------------------------
    var outlierText = "No statistical outliers detected.";

    if (stdDev !== 0.0)
    {
        for (var k = 0; k < count; k++)
        {
            var value2 = ConvertUtils.stringToNumber(resultSet[k][Alias.MeasureDimension].rawValue);
            var zScore = (value2 - mean) / stdDev;
            var absZ = Math.abs(zScore);

            if (absZ > 2.0)
            {
                var memberName = resultSet[k][dimId].description;
                var roundedZ = Math.round(zScore * 10.0) / 10.0;

                outlierText =
                    memberName +
					'\n'
					+
                    " is a statistical outlier (Z-score: " +
                    ConvertUtils.numberToString(roundedZ) +
                    ")";

                break;
            }
        }
    }

    // --------------------------------
    // 4. Output
    // --------------------------------
    Text_1.applyText(outlierText);
}
Code language: JavaScript (javascript)
Scroll to Top