Research talk:VisualEditor's effect on newly registered editors/May 2015 study/Work log/2015-05-27

From Meta, a Wikimedia project coordination wiki

Wednesday, May 27, 2015[edit]

Today I am performing a preliminary analysis of the pilot study. The bucketing for this study started and ended three days ago, so that means I won't have a full week with which to review newcomers contributions, but we should be able to looks for anomalies in their first 24-48 hours just fine.

Bucketed users[edit]

So, first things first, I need to gather the set of bucketed users and label them by condition.

> SELECT event_userId AS user_id, timestamp AS registration, event_displayMobile AS via_mobile FROM ServerSideAccountCreation_5487345 WHERE wiki = "enwiki" AND event_isSelfMade AND timestamp BETWEEN "2015052115" and "2015052215" LIMIT 10;
+----------+----------------+------------+
| user_id  | registration   | via_mobile |
+----------+----------------+------------+
| 25251662 | 20150521150038 |          0 |
| 25251673 | 20150521150153 |          0 |
| 25251675 | 20150521150208 |          1 |
| 25251680 | 20150521150245 |          0 |
| 25251684 | 20150521150309 |          0 |
| 25251687 | 20150521150343 |          0 |
| 25251689 | 20150521150427 |          0 |
| 25251690 | 20150521150430 |          0 |
| 25251696 | 20150521150500 |          0 |
| 25251700 | 20150521150502 |          1 |
+----------+----------------+------------+
10 rows in set (0.00 sec)

OK. Let's make sure I have the time bounds right before we go any farther.

> SELECT LEFT(user_registration, 10) AS hour, SUM(ve.up_user IS NOT NULL)/COUNT(*) AS ve_prop FROM user LEFT JOIN user_properties AS ve ON up_user = user_id AND up_property = 'visualeditor-enable' WHERE user_registration BETWEEN "2015052114" AND "2015052217" AND user_id > 25241662 GROUP BY 1;
+------------+---------+
| hour       | ve_prop |
+------------+---------+
| 2015052114 |  0.0073 |
| 2015052115 |  0.3188 |
| 2015052116 |  0.3147 |
| 2015052117 |  0.3268 |
| 2015052118 |  0.3298 |
| 2015052119 |  0.3091 |
| 2015052120 |  0.2739 |
| 2015052121 |  0.3302 |
| 2015052122 |  0.3030 |
| 2015052123 |  0.3299 |
| 2015052200 |  0.3322 |
| 2015052201 |  0.3681 |
| 2015052202 |  0.3713 |
| 2015052203 |  0.3535 |
| 2015052204 |  0.3401 |
| 2015052205 |  0.3728 |
| 2015052206 |  0.3371 |
| 2015052207 |  0.3651 |
| 2015052208 |  0.3291 |
| 2015052209 |  0.3144 |
| 2015052210 |  0.3326 |
| 2015052211 |  0.3450 |
| 2015052212 |  0.3348 |
| 2015052213 |  0.3154 |
| 2015052214 |  0.3300 |
| 2015052215 |  0.0249 |
| 2015052216 |  0.0079 |
+------------+---------+
27 rows in set (0.10 sec)

Looks like the deployments are tight to the hour. Good. Now to confirm which users were bucketed.

> SELECT user_id % 2 = 0 AS even_id, LEFT(user_registration, 10) AS hour, SUM(ve.up_user IS NOT NULL)/COUNT(*) AS ve_prop FROM user LEFT JOIN user_properties AS ve ON up_user = user_id AND up_property = 'visualeditor-enable' WHERE user_registration BETWEEN "2015052115" AND "2015052118" AND user_id > 25241662 GROUP BY 1, 2;
+---------+------------+---------+
| even_id | hour       | ve_prop |
+---------+------------+---------+
|       0 | 2015052115 |  0.0109 |
|       0 | 2015052116 |  0.0000 |
|       0 | 2015052117 |  0.0036 |
|       1 | 2015052115 |  0.6268 |
|       1 | 2015052116 |  0.6295 |
|       1 | 2015052117 |  0.6489 |
+---------+------------+---------+
6 rows in set (0.04 sec)

OK. it is clearly newcomers with an even user_id. Now to add that to my user extraction query.

> SELECT event_userId AS user_id, IF(event_userId % 2 = 0, "experimental", "control") AS bucket, timestamp AS registration, event_displayMobile AS via_mobile FROM ServerSideAccountCreation_5487345 WHERE wiki = "enwiki" AND event_isSelfMade AND timestamp BETWEEN "2015052115" and "2015052215" LIMIT 10;
+----------+--------------+----------------+------------+
| user_id  | bucket       | registration   | via_mobile |
+----------+--------------+----------------+------------+
| 25251662 | experimental | 20150521150038 |          0 |
| 25251673 | control      | 20150521150153 |          0 |
| 25251675 | control      | 20150521150208 |          1 |
| 25251680 | experimental | 20150521150245 |          0 |
| 25251684 | experimental | 20150521150309 |          0 |
| 25251687 | control      | 20150521150343 |          0 |
| 25251689 | control      | 20150521150427 |          0 |
| 25251690 | experimental | 20150521150430 |          0 |
| 25251696 | experimental | 20150521150500 |          0 |
| 25251700 | experimental | 20150521150502 |          1 |
+----------+--------------+----------------+------------+

Cool. Now to include whether ve_enabled property.

SELECT event_userId AS user_id, IF(event_userId % 2 = 0, "experimental", "control") AS bucket, timestamp AS registration, event_displayMobile AS via_mobile, ve.up_user IS NOT NULL AS ve_enabled FROM ServerSideAccountCreation_5487345 LEFT JOIN enwiki.user_properties ve ON event_userId = up_user AND up_property = 'visualeditor-enable' WHERE wiki = "enwiki" AND event_isSelfMade AND timestamp BETWEEN "2015052115" and "2015052215" LIMIT 10;
+----------+--------------+----------------+------------+------------+
| user_id  | bucket       | registration   | via_mobile | ve_enabled |
+----------+--------------+----------------+------------+------------+
| 25251662 | experimental | 20150521150038 |          0 |          1 |
| 25251673 | control      | 20150521150153 |          0 |          0 |
| 25251675 | control      | 20150521150208 |          1 |          0 |
| 25251680 | experimental | 20150521150245 |          0 |          1 |
| 25251684 | experimental | 20150521150309 |          0 |          1 |
| 25251687 | control      | 20150521150343 |          0 |          0 |
| 25251689 | control      | 20150521150427 |          0 |          0 |
| 25251690 | experimental | 20150521150430 |          0 |          1 |
| 25251696 | experimental | 20150521150500 |          0 |          1 |
| 25251700 | experimental | 20150521150502 |          1 |          1 |
+----------+--------------+----------------+------------+------------+
10 rows in set (0.00 sec)

Cool. It looks like we're enabling VE for mobile registrations. That'll be noise if they don't eventually edit from the desktop (no VE on mobile yet), so I'll keep 'em flagged so we can filter them out in the analysis later.

SELECT 
  event_userId AS user_id, 
  IF(event_userId % 2 = 0, "experimental", "control") AS bucket, 
  timestamp AS registration, 
  event_displayMobile AS via_mobile, 
  ve.up_user IS NOT NULL AS ve_enabled 
FROM log.ServerSideAccountCreation_5487345 
LEFT JOIN enwiki.user_properties ve ON 
  event_userId = up_user AND 
  up_property = 'visualeditor-enable' 
WHERE 
  wiki = "enwiki" AND 
  event_isSelfMade AND 
  timestamp BETWEEN "2015052115" and "2015052215";
$ wc datasets/pilot_users.tsv 
  4190  20950 161399 datasets/pilot_users.tsv

--Halfak (WMF) (talk) 12:43, 27 May 2015 (UTC)[reply]

Metrics![edit]

OK. Time to extract some metrics.

I used this library https://github.com/halfak/mwmetrics, to run the following bit:

datasets/pilot_user_metrics.tsv: datasets/pilot_users.tsv
	cat datasets/pilot_users.tsv | \
	mwmetrics new_users enwiki $(dbstore) > \
	datasets/pilot_user_metrics.tsv

It didn't take long at all. Now, I've created a repo for my own code[1] and loaded up my work in R.

> summary(user_metrics)
    user_id                  bucket      registration         via_mobile    
 Min.   :25251662   control     :2080   Min.   :2.015e+13   Min.   :0.0000  
 1st Qu.:25254181   experimental:2109   1st Qu.:2.015e+13   1st Qu.:0.0000  
 Median :25256579                       Median :2.015e+13   Median :0.0000  
 Mean   :25256593                       Mean   :2.015e+13   Mean   :0.2234  
 3rd Qu.:25259016                       3rd Qu.:2.015e+13   3rd Qu.:0.0000  
 Max.   :25261540                       Max.   :2.015e+13   Max.   :1.0000  
   ve_enabled     user_registration   day_revisions    
 Min.   :0.0000   Min.   :2.015e+13   Min.   :  0.000  
 1st Qu.:0.0000   1st Qu.:2.015e+13   1st Qu.:  0.000  
 Median :1.0000   Median :2.015e+13   Median :  0.000  
 Mean   :0.5058   Mean   :2.015e+13   Mean   :  0.925  
 3rd Qu.:1.0000   3rd Qu.:2.015e+13   3rd Qu.:  1.000  
 Max.   :1.0000   Max.   :2.015e+13   Max.   :149.000  
 day_reverted_main_revisions day_main_revisions day_wp_revisions 
 Min.   : 0.0000             Min.   : 0.0000    Min.   :0.00000  
 1st Qu.: 0.0000             1st Qu.: 0.0000    1st Qu.:0.00000  
 Median : 0.0000             Median : 0.0000    Median :0.00000  
 Mean   : 0.2344             Mean   : 0.6469    Mean   :0.01146  
 3rd Qu.: 0.0000             3rd Qu.: 0.0000    3rd Qu.:0.00000  
 Max.   :28.0000             Max.   :75.0000    Max.   :5.00000  
 day_talk_revisions day_user_revisions week_revisions   
 Min.   :  0.0000   Min.   :  0.0000   Min.   :  0.000  
 1st Qu.:  0.0000   1st Qu.:  0.0000   1st Qu.:  0.000  
 Median :  0.0000   Median :  0.0000   Median :  0.000  
 Mean   :  0.1015   Mean   :  0.2153   Mean   :  1.179  
 3rd Qu.:  0.0000   3rd Qu.:  0.0000   3rd Qu.:  1.000  
 Max.   :148.0000   Max.   :149.0000   Max.   :149.000  
 week_reverted_main_revisions week_main_revisions week_wp_revisions 
 Min.   : 0.0000              Min.   : 0.0000     Min.   : 0.00000  
 1st Qu.: 0.0000              1st Qu.: 0.0000     1st Qu.: 0.00000  
 Median : 0.0000              Median : 0.0000     Median : 0.00000  
 Mean   : 0.2616              Mean   : 0.8083     Mean   : 0.01743  
 3rd Qu.: 0.0000              3rd Qu.: 0.0000     3rd Qu.: 0.00000  
 Max.   :28.0000              Max.   :90.0000     Max.   :13.00000  
 week_talk_revisions week_user_revisions surviving       sessions      
 Min.   :  0.0000    Min.   :  0.0000    False:4094   Min.   : 0.0000  
 1st Qu.:  0.0000    1st Qu.:  0.0000    True :  95   1st Qu.: 0.0000  
 Median :  0.0000    Median :  0.0000                 Median : 0.0000  
 Mean   :  0.1115    Mean   :  0.2614                 Mean   : 0.4249  
 3rd Qu.:  0.0000    3rd Qu.:  0.0000                 3rd Qu.: 1.0000  
 Max.   :148.0000    Max.   :149.0000                 Max.   :18.0000  
 time_spent_editing
 Min.   :    0.0   
 1st Qu.:    0.0   
 Median :    0.0   
 Mean   :  469.3   
 3rd Qu.:  410.0   
 Max.   :40092.0

Looks like our users are relatively balanced. 22% of our users registered via mobile and and *probably* be discarded. All of the week measures and "surviving" are invalid due to the fact that we haven't been able to observe them for a week yet. ...and our timestamp is misinterpreted, so I'm going to have to clean that up. --Halfak (WMF) (talk) 17:05, 27 May 2015 (UTC)[reply]


Drumroll please:

         bucket via_mobile editing.k productive.k    n
1: experimental          0       534          272 1627
2:      control          0       544          271 1626
3:      control          1       117           59  454
4: experimental          1       115           51  482

So, no big deviations there. I can eyeball them as non-significant. That's an expected outcome at this point. Tomorrow I'm going to be looking at burden and log events. Until then. --Halfak (WMF) (talk) 17:31, 27 May 2015 (UTC)[reply]