Jump to content

User:Pathoschild/2010 steward confirmation statistics

From Meta, a Wikimedia project coordination wiki
This page statistically summarizes the 2010 steward confirmations. See also the collected statistics page.

Summary table

[edit]

Unique participants: 263 (see edits to confirmation pages).

Last update: 2010-03-01 00:00 (UTC)

steward overall trust[1] concerns[2] Relative
trust[3]
Relative
concerned[3]
Relative
participation[4]
result
Thogo 1.000,  100% (72/72) 0.274,  27.4% 0.000,  0% 0.274,  27.4% confirmed
Drini 1.000,  100% (67/67) 0.255,  25.5% 0.000,  0% 0.259,  25.9% confirmed
Erwin 1.000,  100% (55/55) 0.209,  20.9% 0.000,  0% 0.209,  20.9% confirmed
Leinad 1.000,  100% (44/44) 0.167,  16.7% 0.000,  0% 0.167,  16.7% confirmed
M7 1.000,  100% (43/43) 0.163,  16.3% 0.000,  0% 0.163,  16.3% confirmed
Jusjih 1.000,  100% (33/33) 0.125,  12.5% 0.000,  0% 0.125,  12.5% confirmed
Mav 1.000,  100% (30/30) 0.114,  11.4% 0.000,  0% 0.114,  11.4% confirmed
Rdsmith4 1.000,  100% (30/30) 0.114,  11.4% 0.000,  0% 0.114,  11.4% confirmed
Mike.lifeguard 0.987,  98.7% (76/77) 0.289,  28.9% 0.004,  0.4% 0.293,  29.3% confirmed
Bastique 0.986,  98.6% (73/74) 0.278,  27.8% 0.004,  0.4% 0.285,  28.5% confirmed
Kylu 0.984,  98.4% (62/63) 0.236,  23.6% 0.004,  0.4% 0.24,  24% confirmed
Mardetanha 0.984,  98.4% (60/61) 0.228,  22.8% 0.004,  0.4% 0.232,  23.2% confirmed
Laaknor 0.981,  98.1% (53/54) 0.202,  20.2% 0.004,  0.4% 0.205,  20.5% confirmed
guillom 0.981,  98.1% (52/53) 0.198,  19.8% 0.004,  0.4% 0.202,  20.2% confirmed
DerHexer 0.978,  97.8% (91/93) 0.346,  34.6% 0.008,  0.8% 0.354,  35.4% confirmed
Nick1915 0.977,  97.7% (43/44) 0.163,  16.3% 0.004,  0.4% 0.167,  16.7% confirmed
Millosh 0.972,  97.2% (35/36) not very active (4). 0.133,  13.3% 0.004,  0.4% 0.141,  14.1% confirmed
Dungodung 0.968,  96.8% (60/62) 0.228,  22.8% 0.008,  0.8% 0.236,  23.6% confirmed
Shanel 0.962,  96.2% (50/52) 0.19,  19% 0.008,  0.8% 0.198,  19.8% confirmed
Pathoschild 0.951,  95.1% (77/81) mishandling of public personal information (5). 0.293,  29.3% 0.015,  1.5% 0.312,  31.2% confirmed
Darkoneko 0.942,  94.2% (65/69) dispute on frwiki (4). 0.247,  24.7% 0.015,  1.5% 0.262,  26.2% confirmed
Effeietsanders 0.915,  91.5% (43/47) not very active (4). 0.163,  16.3% 0.015,  1.5% 0.179,  17.9% confirmed
Sj 0.889,  88.9% (32/36) inactive (10). 0.122,  12.2% 0.015,  1.5% 0.141,  14.1% confirmed
Oscar 0.882,  88.2% (45/51) not very active (13). 0.171,  17.1% 0.023,  2.3% 0.198,  19.8% confirmed
Shizhao 0.794,  79.4% (27/34) inactive (7), Steward policy violation (6), no statement (4). 0.103,  10.3% 0.027,  2.7% 0.133,  13.3% confirmed
Andre Engels 0.674,  67.4% (29/43) inactive (17). 0.11,  11% 0.053,  5.3% 0.167,  16.7% confirmed
Lar 0.646,  64.6% (93/144) incivility & drama (34), ignores policy and consensus & dispute on enwiki & disruption (29), unilateral & threatening (23), militant & divisive & polarized (22), alleged inappropriate behaviour (10), contributes to anti-Wikipedia forum (10), alleged breach of privacy policy (10), few article edits on enwiki (7). 0.354,  35.4% 0.194,  19.4% 0.551,  55.1% removed
Cspurrier 0.622,  62.2% (23/37) inactive (14). 0.087,  8.7% 0.053,  5.3% 0.144,  14.4% removed
Anthere 0.561,  56.1% (23/41) inactive (21). 0.087,  8.7% 0.068,  6.8% 0.16,  16% removed
Redux 0.432,  43.2% (16/37) inactive (25). 0.061,  6.1% 0.08,  8% 0.144,  14.4% removed
Alexanderps 0.263,  26.3% (10/38) inactive (23), alleged checkuser misuse on home wiki (7), loss of trust (7), steward policy violation (7), mostly does "easy stuff like SRP" (6). 0.038,  3.8% 0.106,  10.6% 0.156,  15.6% removed
  1. ^ The 'overall trust' column is only a rough indicator of how widely trusted a user is. The confirmations are not a vote; arguments will be taken into account, not counts.
  2. ^ Includes concerns voiced by more than a few users.
  3. ^ The 'relative trust' and 'relative concerned' columns summarise the percentage of all unique participants in the election who trust this steward (or are concerned about them). This helps put the statistics in context, but it is not an indication of absolute support; for example, many well-trusted stewards will receive fewer comments simply because there is no need to comment when the result is already obvious.
  4. ^ The 'relative participation' column indicates the percentage of all unique participants who commented on this steward (including ambivalent or neutral comments).

Comparative participation & trust

[edit]

The bars below show the overall participation and opinions of all participating users for each steward, where green indicates trust, red indicates non-trust, grey indicates neutral, and bordered white indicates users who did not comment on this steward.

Lar
DerHexer
Pathoschild
Mike.lifeguard
Bastique
Thogo
Darkoneko
Drini
Kylu
Dungodung
Mardetanha
Erwin
Laaknor
guillom
Oscar
Shanel
Effeietsanders
Andre Engels
Nick1915
Leinad
M7
Anthere
Alexanderps
Redux
Cspurrier
Sj
Millosh
Shizhao
Jusjih
Mav
Rdsmith4

Comparative non-trust

[edit]

The bars below show the relative concern about each steward as a percentage of all commenting users, where red indicates non-trust, green indicates trust, grey indicates neutral, and bordered white indicates users who did not comment on this steward.

Lar
Alexanderps
Redux
Anthere
Cspurrier
Andre Engels
Shizhao
Oscar
Pathoschild
Darkoneko
Effeietsanders
Sj
Shanel
Dungodung
DerHexer
Nick1915
Mike.lifeguard
Bastique
Kylu
Mardetanha
Millosh
guillom
Laaknor
Mav
Rdsmith4
Jusjih
M7
Leinad
Erwin
Drini
Thogo


Script

[edit]
Screenshot of script, showing two new comments.

Although comments need to be tallied manually, this can be done quickly by using the following quick-and-dirty script to count comments for each listed candidate, note how many comments were added since the last update, and re-sort the table when done tallying.

The script should be run while editing the table section. It uses the regex menu framework.

/*********************
** Functions
*********************/
function ses_report(text) {
	$('stewiestats').adopt(document.createTextNode(text));
}

/*********************
** Initialize
*********************/
function ses_update_stats() {
	/*********************
	** Display status box
	*********************/
	var box = document.getElementById('stewiestats');
	if(!box) {
		// load required framework
		importScriptURI('http://meta.wikimedia.org/w/index.php?title=User:Pathoschild/Scripts/MooTools.js&action=raw&ctype=text/javascript');

		// create box
		box = document.createElement('pre');
		box.setAttribute('id','stewiestats');
		box.setAttribute('style', 'margin:1em; padding:0.5em; border:1px solid #C00;');
		box.appendChild(document.createTextNode('Loading required framework...\n'));
		editbox.parentNode.insertBefore(box, editbox.parentNode.firstChild);

		// jump to box
		window.location.hash = "#stewiestats";
	}

	/*********************
	** Wait until WikiMooTools loaded
	*********************/
	if(!window.$chk) {
		setTimeout('init_scan()', 500);
		return;
	}
	// clear old messages
	box.empty();
	ses_report('Loading required framework...\n');

	/*********************
	** Extract list of candidates & counts
	*********************/
	ses_report('Extracting candidate list...\n');

	var names = [];
	var totals = [];

	var text  = editbox.value.match(/<!--ses-start-->([\s\S]+?)<!--ses-end-->/)[1].toString();
	var temps = text.match(/{{user[\s\S]+?}}/ig);
	for(var i=0, len=temps.length; i<len; i++) {
		var supps = temps[i].match(/support *= *(.+)/)[1].toString();
		var oppos = temps[i].match(/oppose *= *(.+)/)[1].toString();
		var neuts = temps[i].match(/neutral *= *(.+)/)[1].toString();
		names[i]  = temps[i].match(/name *= *(.+)/)[1].toString();
		totals[i] = parseInt(supps) + parseInt(oppos) + parseInt(neuts);
	}

	/*********************
	** Extract participant count
	*********************/
	ses_report('Counting unique participants... ');
	box.adopt(
		new Element('span', {'id':'ses-box-count'})
	);
	ses_report('\n');

      	var request = new Request({
      		url:'http://meta.wikimedia.org/wiki/Stewards/confirm?action=render',
      		method: 'GET',
      		onSuccess:function(text, xml) {
			var links = text.match(/<li.+title="User:[^\/"]+/ig);
			var names = {};
			var count = 0;

			for(var i=0, len=links.length; i<len; i++) {
				var name = links[i].match(/User:(.+)$/)[1];
				if(!names[name]) {
					names[name] = 1;
					count++;
				}
			}
			$('ses-box-count').adopt(document.createTextNode(count));
			editbox.value = editbox.value.replace(/(<span id="ses-count">).*?(<\/span>)/, '$1' + count + '$2');
			editbox.value = editbox.value.replace(/(total voters\s*=\s*)\d*/g, '$1' + count);
      		},
      		onFailure: function(xhr) {
			$('ses-box-count').set({'text':' FAILED: ' + xhr.status + ' (' + xhr.statusText + ')'});
      		}
      	}).send();

	/*********************
	** Extract comment counts per candidate
	*********************/
	ses_report('Fetching elections pages...\n');
	for(var i=0, len=temps.length; i<len; i++) {
		var div = new Element('div')
		box.adopt(div);
		extract_count(div, names[i], totals[i]);
	}

	/*********************
	** Extract a count
	*********************/
	function extract_count(div, name, prev_count) {
		var request = new Request({
			url:'http://meta.wikimedia.org/wiki/Stewards/confirm/2010/' + encodeURIComponent(name) + '?action=render',
			method: 'GET',
			onSuccess:function(text, xml) {
				// strip cruft
				text = text.replace(/^[\s\S]+?Comments about .+/, '');	// statement, etc
   				text = text.replace(/^.+class="[^"]*stat-ignore.+$/mg, ''); // ignore non-comment lines


				// count comments
				var count = text.match(/^<li/mg).length;

				// report to user
				div.set({
					'text':'   ' + (count<10 ? ' ' : '') + count + ' '
				}).adopt(
					new Element('a', {
						'href':'http://meta.wikimedia.org/wiki/Stewards/confirm/2010/' + encodeURIComponent(name) + '?action=render',
						'text':name + (count != prev_count ? (' (+' + (count - prev_count) + ')') : '')
					})
				);

				// highlight those with non-matching counts
				if(count!=prev_count)
					div.set({'styles':{'background':'#FEE', 'font-weight':'bold'}});
				else
					div.set({'styles':{'color':'gray'}});

			},
			onFailure: function(xhr) {
				div.set({'text':'   ' + name + ' FAILED: ' + xhr.status + ' (' + xhr.statusText + ')'});
			}
		}).send();
	}

	/*********************
	** Add 'sort table' link
	*********************/
	box.adopt(
		new Element('div').adopt(
			new Element('a', {
				'href':'javascript:ses_sort_table();',
				'text':'sort table'
			})
		)
	).adopt(
		new Element('div').adopt(
			new Element('a', {
				'href':'javascript:ses_update_stats();',
				'text':'recheck'
			})
		)
	);
}
ses_update_stats();

/*********************
** Sort table
*********************/
function ses_sort_table() {
	ses_report('\nSorting table and updating date...\n');
	/***************
	** Extract rows & data
	***************/
	var raw = editbox.value.match(/<!--ses-start-->([\s\S]+?)<!--ses-end-->/i)[1].toString();
	raw     = raw.match(/{{user[^}]+?}}/ig);

	var names  = [];
	var sorted = [];
	var rows   = {};
	var ratios = {};
	var counts = {};

	for(var i=0, len=raw.length; i<len; i++) {
		var name     = raw[i].match(/name *= *(.+)/)[1].toString();
		var supports = raw[i].match(/support *= *(.+)/)[1].toString();
		var opposes  = raw[i].match(/oppose *= *(.+)/)[1].toString();
		var neutrals = raw[i].match(/neutral *= *(.+)/)[1].toString();

		names.push(name);
		counts[name] = supports+opposes+neutrals;
		ratios[name] = supports/(supports+opposes);
		rows[name] = raw[i];
	}

	/***************
	** Sort rows
	***************/
	for(var i=0, len=names.length; i<len; i++) {
		var name  = names[i];
		var ratio = ratios[name];

		// insert into sorted position
		for(var x=0, slen=sorted.length; x<=slen; x++) {
			// end of array, just push it in
			if(x==slen) {
				sorted.push(name);
				break;
			}
			// equal but more votes (or sorted first), insert
			else if(ratios[name]==ratios[sorted[x]]) {
				if(counts[name]>counts[sorted[x]] || (counts[name]==counts[sorted[x]] && name<sorted[x])) {
					sorted.splice(x, 0, name);
					break;
				}
			}
			// higher, insert
			else if(ratios[name]>ratios[sorted[x]]) {
				sorted.splice(x, 0, name);
				break;
			}
		}
	}

	/*********************
	** Update date
	*********************/
	function get_date() {
		// zero pad
		function zero_pad(num) {
			if(num<10)
				num = '0' + num;
			return num;
		}

		// generate string
		var d = new Date();
		var str = d.getUTCFullYear() + '-' + zero_pad(d.getUTCMonth()+1) + '-' + zero_pad(d.getUTCDate()) + ' '
		        + zero_pad(d.getUTCHours()) + ':' + zero_pad(d.getUTCMinutes()) + ' (UTC)';
		return str;
	}
	editbox.value = editbox.value.replace(/(<span id="ses-date">).*?(<\/span>)/, '$1' + get_date() + '$2');

	/***************
	** Update edit box
	***************/
	var str = '';
	len = sorted.length;
	for(var i=0; i<len; i++)
		str += rows[sorted[i]] + '\n';
	editbox.value = editbox.value.replace(/(<!--ses-start-->)[\s\S]+?(<!--ses-end-->)/i, '$1\n' + str + '$2');

	document.getElementById('wpSummary').value = 'updated';
	ses_report('Done.');
}