Show results and status before revisions for A/B testing results
authorrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2015 00:25:31 +0000 (00:25 +0000)
committerrniwa@webkit.org <rniwa@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 23 May 2015 00:25:31 +0000 (00:25 +0000)
https://bugs.webkit.org/show_bug.cgi?id=145327

Reviewed by Chris Dumez.

Place the results and the status columns before the columns for revisions.
Also show the absolute difference as well as the relative difference between the averages of A and B.

* public/v2/app.js:
(App.TestGroupPane._populate):
(App.TestGroupPane._computeStatisticalSignificance):
* public/v2/index.html:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@184806 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Websites/perf.webkit.org/ChangeLog
Websites/perf.webkit.org/public/v2/app.js
Websites/perf.webkit.org/public/v2/index.html

index 161968a..55b78f2 100644 (file)
@@ -1,3 +1,18 @@
+2015-05-22  Ryosuke Niwa  <rniwa@webkit.org>
+
+        Show results and status before revisions for A/B testing results
+        https://bugs.webkit.org/show_bug.cgi?id=145327
+
+        Reviewed by Chris Dumez.
+
+        Place the results and the status columns before the columns for revisions.
+        Also show the absolute difference as well as the relative difference between the averages of A and B.
+
+        * public/v2/app.js:
+        (App.TestGroupPane._populate):
+        (App.TestGroupPane._computeStatisticalSignificance):
+        * public/v2/index.html:
+
 2015-05-20  Ryosuke Niwa  <rniwa@webkit.org>
 
         Build fix after r184591.
index 73a8af9..0e3422c 100755 (executable)
@@ -1424,14 +1424,21 @@ App.TestGroupPane = Ember.ObjectProxy.extend({
 
         this.set('configurations', configurations);
 
+        var probabilityFormatter = d3.format('.2p');
         var comparisons = [];
         for (var i = 0; i < configurations.length - 1; i++) {
             var summary1 = configurations[i].summary;
             for (var j = i + 1; j < configurations.length; j++) {
                 var summary2 = configurations[j].summary;
+
+                var valueDelta = testResults.deltaFormatter(summary2.value - summary1.value);
+                var relativeDelta = d3.format('+.2p')((summary2.value - summary1.value) / summary1.value);
+
+                var stat = this._computeStatisticalSignificance(summary1.measuredValues, summary2.measuredValues);
                 comparisons.push({
                     label: summary1.configLetter + ' / ' + summary2.configLetter,
-                    result: this._computeStatisticalSignificance(summary1.measuredValues, summary2.measuredValues)
+                    difference: isNaN(summary1.value) || isNaN(summary2.value) ? 'N/A' : valueDelta + ' (' + relativeDelta + ') ',
+                    result: stat,
                 });
             }
         }
@@ -1448,13 +1455,13 @@ App.TestGroupPane = Ember.ObjectProxy.extend({
         var details = ' (t=' + tFormatter(statistics.t) + ' df=' + tFormatter(statistics.degreesOfFreedom) + ')';
 
         if (!statistics.range[0])
-            return 'Not statistically significant' + details;
+            return 'Not significant' + details;
 
         var lowerLimit = probabilityFormatter(statistics.range[0]);
         if (!statistics.range[1])
-            return 'Statistical significance > ' + lowerLimit + details;
+            return 'Significance > ' + lowerLimit + details;
 
-        return lowerLimit + ' < Statistical significance < ' + probabilityFormatter(statistics.range[1]) + details;
+        return lowerLimit + ' < Significance < ' + probabilityFormatter(statistics.range[1]) + details;
     },
     _updateReferenceChart: function ()
     {
index 30f9d1c..cb7f29d 100755 (executable)
                     <thead>
                         <tr>
                             <td colspan="2">Configuration</td>
+                            <td>Results</td>
+                            <td>Status</td>
                             {{#each repositories}}
                                 <td>{{name}}</td>
                             {{/each}}
-                            <td>Results</td>
-                            <td>Status</td>
                         </tr>
                     </thead>
                     {{#each configurations}}
                         <tbody>
                             <tr>
                                 <td colspan="2">{{label}}</td>
+                                <td>{{difference}}</td>
+                                <td>{{result}}</td>
                                 {{#with ../this}}
                                     {{#each repositories}}
                                         <td></td>
                                     {{/each}}
                                 {{/with}}
-                                <td colspan="2">{{result}}</td>
                             </tr>
                         </tbody>
                     {{/each}}
     </script>
 
     <script type="text/x-handlebars" data-template-name="testGroupRow">
-        {{#each revisionList}}
-            <td>{{this}}</td>
-        {{/each}}
         <td>
             {{#if value}}
-                {{box-plot range=valueRange value=value delta=confidenceIntervalDelta}}
+                {{box-plot range=valueRange value=value delta=delta}}
             {{/if}}
             {{formattedValue}}
         </td>
         <td>
             <a {{bind-attr href=url title=buildLabel}}>{{statusLabel}}</a>
         </td>
+        {{#each revisionList}}
+            <td>{{this}}</td>
+        {{/each}}
     </script>
 
     <script type="text/x-handlebars" data-template-name="testGroupForm">