Анализ выборов в КС

Oct 29, 2012 15:18


В принципе, здесь ничего нового (ну разве что в конце есть кое-что). Мне интересно изучить структуру нормальных избирателей, без мммщиков, но пока руки не дошли. А руки пока дошли только до того, чтобы собственно выкинуть мммщиков. Ну и применить PCA, чтобы посмотреть, как это всё выглядит.

Начал я с того, что перегнал протокол в матрицу из нулей и единичек размера количество_избирателей x количество_вариантов. Дальше я с этой табличкой сделал две вещи: во-первых применил k-средних при k=2, а во-вторых применил PCA.

Ну с k-средних всё ясно, я получил два кластера, один из них размера 63643, другой 18052 избирателей. 18 тысяч - известная оценка числа проголосовавших мммщиков, так что скорее всего я всё сделал правильно.

Теперь PCA. Вся табличка в octave не лезла (или лезла, но медленно, не знаю), так что я взял случайные 1000 избирателей. Получилась такая картинка:



Красные - мммщики, синие - остальные. Зелёными кружками показаны центры кластеров.

Делал я это как-то так:

% В последний раз я имел дело с PCA год назад, когда проходил mlclass
% Так что я всё забыл, поэтому мог ошибиться, но результат вроде сходится

% Загружаем матрицу mat: 1000 x cand
% ну то есть строки - избиратели, столбцы - кандидаты
mat = load("1000");

% c: 1000 x 1000
c = cov(mat);

% нам тут v вроде нужен, v: cand x new
% если честно, я определял, что на что умножать методом размерностей
[u,s,v] = svd(c);

% берём первые две главные компоненты и проецируем на них избирателей
% вообще-то я потом m использовать не буду, он тут так просто
m = mat * v(:,1:2);

% это центры кластеров, найденных ранее, centers: 2 x cand
centers = load("centers");

% их тоже проецируем, чтобы потом нарисовать
cs2 = centers * v(:,1:2);

% разбиваем данные на два кластера
clus1 = []
clus2 = []

% да, octave я забыл совсем...
for i = 1:size(mat,1)
  d1 = sum((centers(1,:) - mat(i,:)) .^ 2);
  d2 = sum((centers(2,:) - mat(i,:)) .^ 2);
  if d1 < d2
    clus1 = [clus1; mat(i,:)];
  else
    clus2 = [clus2; mat(i,:)];
  end
end

% и проецируем избирателей из кластеров тоже
clus1tr = clus1 * v(:,1:2);
clus2tr = clus2 * v(:,1:2);

% рисуем
plot(clus1tr(:,1), clus1tr(:,2), "+b", "markersize", 5);
hold on
plot(clus2tr(:,1), clus2tr(:,2), "+r", "markersize", 5);
hold on
plot(cs2(:,1), cs2(:,2), "og", "markersize", 20);

Что касается политических пристрастий этих кластеров, то вот топ30 для синих. (Если что, здесь всё в кучу, курии вместе с общегражданским списком). Левая колонка - что-то вроде вероятности того, что за кандидата проголосовал избиратель из синего кластера:

0.68 Навальный Алексей Анатольевич
0.60 Быков Дмитрий Львович
0.53 Каспаров Гарри Кимович
0.51 Яшин Илья Валерьевич
0.51 Собчак Ксения Анатольевна
0.50 Чирикова Евгения Сергеевна
0.47 Шац Михаил Григорьевич
0.45 Ашурков Владимир Львович
0.45 Гудков Дмитрий Геннадьевич
0.45 Лазарева Татьяна Юрьевна
0.43 Пархоменко Сергей Борисович
0.43 Дзядко Филипп Викторович
0.42 Гудков Геннадий Владимирович
0.40 Соболь Любовь Эдуардовна
0.39 Немцов Борис Ефимович
0.38 Давидис Сергей Константинович
0.37 Гельфанд Михаил Сергеевич
0.37 Романова Ольга Евгеньевна
0.35 Кашин Олег Владимирович
0.35 Илларионов Андрей Николаевич
0.33 Удальцов Сергей Станиславович
0.33 Кара-Мурза Владимир Владимирович
0.33 Адагамов Рустем Ринатович
0.32 Пивоваров Андрей Сергеевич
0.32 Винокуров Александр Иванович
0.31 Кац Максим Евгеньевич
0.30 Газарян Сурен Владимирович
0.30 Албуров Георгий Валентинович
0.28 Долгих Антон Витальевич
0.28 Пионтковский Андрей Андреевич

А это аналогичный топ38 для красного кластера. Почему 38? Потому что дальше идёт резкое падение популярности (39-й Антон Долгих с 0.39):

0.98 Аверьянов Иван Александрович
0.98 Аитова Екатерина Петровна
0.98 Барабаш Кирилл Владимирович
0.98 Скалаух Иван Сергеевич
0.98 Аникин Сергей Владимирович
0.98 Дегтярь Иван Васильевич
0.98 Виноградов Сергей Николаевич
0.97 Волкова Елена Ивановна
0.97 Гаскаров Алексей Владимирович
0.97 Бадыкова Фиалка Ахмадеевна
0.97 Николаев Александр Александрович
0.97 Вистицкий Михаил Михайлович
0.97 Агишев Ирек Абдулхакович
0.97 Бондарик Николай Николаевич
0.97 Лавров Андрей Валерьевич
0.97 Городенцев Андрей Геннадьевич
0.97 Василенко Павел Владимирович
0.97 Артёмов Игорь Владимирович
0.97 Гельфанд Михаил Сергеевич
0.97 Колчинцев Вадим Валерьевич
0.97 Демидов Михаил Александрович
0.97 Рафаилов Георгий Георгиевич
0.97 Бурашников Дмитрий Андреевич
0.96 Курамшин Владимир Вячеславович
0.96 Палчаев Аким Нажмудинович
0.96 Левченко Екатерина Валентиновна
0.96 Кудрявцев Федор Александрович
0.95 Спорыхина Ульяна Викторовна
0.95 Давыденко Денис Вячеславович
0.95 Сайдашев Радик Ромович
0.95 Пряников Павел Николаевич
0.95 Чернышева Наталья Юрьевна
0.95 Студенова (Пелевина) Наталья Владиславовна
0.95 Константинов Даниил Ильич
0.95 Шатов Станислав Николаевич
0.95 Крюков Василий Анатольевич
0.94 Поляков Анатолий Викторович
0.94 Сухарева Татьяна Викторовна

На самом деле, мне кажется, этот способ исключения мммщиков слишком жёсткий.

Upd. Синий кластер после выкидывания мммщиков. И как теперь это анализировать?



Upd2. Немного почитал, что другие пишут, и вот что оказалось:



Цветом обозначено количество галочек, поставленных изберателем, красный < 10, зелёный > 40.
Кстати, обратите внимание на уплотнение слева в красной зоне. Оказалось, что оно состоит в основном из тех, кто проголосовал ровно за 4-х кандидатов. Не знаю, почему. Но судя по всему, это недобитые мммщики.

Upd3. Ну тогда я решил все вектора поделить на количество галочек, поставленных избирателем. В этом случае все избиратели укладываются на одну гиперплоскость. Получилась такая штука:



Что это вообще такое? В чём смысл этих двух кластеров? Если честно, ответ меня несколько удивил. Оказалось, что синий кластер - это те, кто проголосовал за Навального. Красный - те, кто не проголосовал за Навального, вообще, в том числе недобитые мммщики, но видимо не только они. Краснокластерных около 30% кстати.
Top15 За Навального:
0.9970972424 Навальный Алексей Анатольевич
0.7271407837 Быков Дмитрий Львович
0.6516690856 Чирикова Евгения Сергеевна
0.6400580552 Каспаров Гарри Кимович
0.6342525399 Яшин Илья Валерьевич
0.6240928882 Собчак Ксения Анатольевна
0.5834542816 Шац Михаил Григорьевич
0.5747460087 Ашурков Владимир Львович
0.5718432511 Гудков Дмитрий Геннадьевич
0.557329463 Гудков Геннадий Владимирович
0.5428156749 Пархоменко Сергей Борисович
0.5428156749 Лазарева Татьяна Юрьевна
0.5050798258 Дзядко Филипп Викторович
0.5007256894 Соболь Любовь Эдуардовна

Top15 Против Навального:
0.2958199357 Давидис Сергей Константинович
0.2829581994 Аитова Екатерина Петровна
0.2668810289 Быков Дмитрий Львович
0.2508038585 Гельфанд Михаил Сергеевич
0.2347266881 Бондарик Николай Николаевич
0.2282958199 Артёмов Игорь Владимирович
0.2154340836 Гаскаров Алексей Владимирович
0.2090032154 Рыклин Александр Юрьевич
0.2057877814 Каспаров Гарри Кимович
0.2057877814 Шац Михаил Григорьевич
0.2057877814 Долгих Антон Витальевич
0.2025723473 Илларионов Андрей Николаевич
0.1961414791 Каретникова Анна Георгиевна
0.192926045 Собчак Ксения Анатольевна
0.192926045 Винокуров Александр Иванович

Но что всё это значит?

PS На самом деле последнюю картинку я строил для 1000 случайных избирателей из синего кластера. Если взять 10 000, то там начинает проявляться ещё более сложная структура, похожая на перистые облака:

Previous post Next post
Up