1:
45:
46: package ;
47:
48: import ;
49: import ;
50: import ;
51: import ;
52:
53:
58: public abstract class BoxAndWhiskerCalculator {
59:
60:
71: public static BoxAndWhiskerItem calculateBoxAndWhiskerStatistics(
72: List values) {
73:
74: Collections.sort(values);
75:
76: double mean = Statistics.calculateMean(values);
77: double median = Statistics.calculateMedian(values, false);
78: double q1 = calculateQ1(values);
79: double q3 = calculateQ3(values);
80:
81: double interQuartileRange = q3 - q1;
82:
83: double upperOutlierThreshold = q3 + (interQuartileRange * 1.5);
84: double lowerOutlierThreshold = q1 - (interQuartileRange * 1.5);
85:
86: double upperFaroutThreshold = q3 + (interQuartileRange * 2.0);
87: double lowerFaroutThreshold = q1 - (interQuartileRange * 2.0);
88:
89: double minRegularValue = Double.POSITIVE_INFINITY;
90: double maxRegularValue = Double.NEGATIVE_INFINITY;
91: double minOutlier = Double.POSITIVE_INFINITY;
92: double maxOutlier = Double.NEGATIVE_INFINITY;
93: List outliers = new ArrayList();
94:
95: Iterator iterator = values.iterator();
96: while (iterator.hasNext()) {
97: Object object = iterator.next();
98: if (object != null && object instanceof Number) {
99: Number number = (Number) object;
100: double value = number.doubleValue();
101: if (value > upperOutlierThreshold) {
102: outliers.add(number);
103: if (value > maxOutlier && value <= upperFaroutThreshold) {
104: maxOutlier = value;
105: }
106: }
107: else if (value < lowerOutlierThreshold) {
108: outliers.add(number);
109: if (value < minOutlier && value >= lowerFaroutThreshold) {
110: minOutlier = value;
111: }
112: }
113: else {
114: if (minRegularValue == Double.NaN) {
115: minRegularValue = value;
116: }
117: else {
118: minRegularValue = Math.min(minRegularValue, value);
119: }
120: if (maxRegularValue == Double.NaN) {
121: maxRegularValue = value;
122: }
123: else {
124: maxRegularValue = Math.max(maxRegularValue, value);
125: }
126: }
127:
128: }
129: }
130: minOutlier = Math.min(minOutlier, minRegularValue);
131: maxOutlier = Math.max(maxOutlier, maxRegularValue);
132:
133: return new BoxAndWhiskerItem(
134: new Double(mean),
135: new Double(median),
136: new Double(q1),
137: new Double(q3),
138: new Double(minRegularValue),
139: new Double(maxRegularValue),
140: new Double(minOutlier),
141: new Double(maxOutlier),
142: outliers
143: );
144:
145: }
146:
147:
154: public static double calculateQ1(List values) {
155: double result = Double.NaN;
156: int count = values.size();
157: if (count > 0) {
158: if (count % 2 == 1) {
159: if (count > 1) {
160: result = Statistics.calculateMedian(values, 0, count / 2);
161: }
162: else {
163: result = Statistics.calculateMedian(values, 0, 0);
164: }
165: }
166: else {
167: result = Statistics.calculateMedian(values, 0, count / 2 - 1);
168: }
169:
170: }
171: return result;
172: }
173:
174:
181: public static double calculateQ3(List values) {
182: double result = Double.NaN;
183: int count = values.size();
184: if (count > 0) {
185: if (count % 2 == 1) {
186: if (count > 1) {
187: result = Statistics.calculateMedian(
188: values, count / 2, count - 1
189: );
190: }
191: else {
192: result = Statistics.calculateMedian(values, 0, 0);
193: }
194: }
195: else {
196: result = Statistics.calculateMedian(
197: values, count / 2, count - 1
198: );
199: }
200:
201: }
202: return result;
203: }
204:
205: }