I am looking for technique to identify abnormally low/high values in a set of data. I am using the technique to compare the production of machines. The number of machines in the set can be quite small (5) and range up to 200.
I want to identify problematic machines so as to flag them for inspection, or outstanding machines to use them as reference for maximum potential.
I stumbled across IQR analysis using percentiles to identify outliers. This is nice but not quite what I was looking for. The problem with IQR analysis is that because my dataset is so small, it always finds outliers. If the production of my machines is more or less the same there will always be machines in the low and high quarters of the sample.
I am leaning towards a standard deviation approach to determine if there are any exceptionally high or low alues within the set. But I don't know how many standard deviations to count and I am looking for a generic method which can apply accross different sites (ie, maybe the number of standard deviations to count is different for different sites ???)
My data set consists of a performance-ratio between 0 and 1 :
- Typical values range from 75% to 90%
- It will vary throughout the year and from machine to machine as it is dependant on a range of factors.
Sample data:
Here is some real data and the results of my current analysis:
Machine 1: 74.1% 12th percentile
Machine 2: 50.2% 6th percentile Machine underperforming - should be flagged
Machine 3: 76.5% 32th percentile
Machine 4: 78.9% 78th percentile
Machine 5: 78.9% 78th percentile
Machine 6: 74.1% 12th percentile
Machine 7: 76.5% 32th percentile
Machine 8: 0% 0th percentile Machine broken down - should be flagged
Machine 9: 78.9% 78th percentile
Machine 10: 76.5% 32th percentile
Machine 11: 72.2% 10th percentile
Machine 12: 76.5% 34th percentile
Machine 13: 78.7% 75th percentile
Machine 14: 78.7% 75th percentile
Machine 15: 76.5% 34th percentile
Machine 16: 76.5% 34th percentile
Machine 17: 76.5% 34th percentile
Machine 18: 78.7% 75th percentile
Machine 19: 76.5% 34th percentile
Machine 20: 78.7% 75th percentile
Machine 21: 76.5% 34th percentile
Machine 22: 76.5% 34th percentile
Machine 23: 76.5% 32th percentile
Machine 24: 81.3% 100th percentile Best performing machine, but by no means an outlier
Machine 25: 76.5% 32th percentile
Machine 26: 75.9% 22th percentile
Machine 27: 75.2% 19th percentile
Machine 28: 78.3% 73th percentile
Machine 29: 78.3% 73th percentile
Machine 30: 77.7% 66th percentile
Machine 31: 78.3% 73th percentile
The method I am using:
Once plotted on that number line, the smallest data point and the biggest data point in the set of data create the boundaries of an interval of space on the number line that contains all data points in the set. The interquartile range (IQR) is the length of the middle 50% of that interval of space.
I am using a method which groups the data into 3 groups :
- The 50% of this range, ranging from 25% to 75% IQR.
- The lower quartile <25th percentile
- The upper quartile >75th percentile
This method is insufficient - Machine 27 is flagged as it is in the 19th percentile, while its performance ratio is comperable to other machines in the middle of the range which are not flagged.
However, I am not doing the calculation. I am using an external code library: Apache Commons Math to find the cumulative probability of an emperical distribution. This is where the percentile values are coming from in the above data.
Bonus points:
I would also like to show a simple indicator to determine the trend of the performance ratio. If I was to take for example the daily performance-ratio of a machine over 30 days. How could I determine if it was improving, steady or descending.