В данном посту опишу пример использования API метода вконтакте users.search и, чтобы было интереснее, приложение будет определять самый холостяцкий факультет в Новосибирском государственном университете. Обычно считается, что обучение на определенном факультете откаладывает на поведении человека некоторый отпечаток. Попробуем выяснить влияет ли как-то факультет на семейное положение на примере данных из сайта «вконтакте». Для самых нетерпеливых сразу график. По оси X — возраст, по оси Y — процент холостяков. Подсказка: по легенде можно кликать, тем самым включая или выключая график для выбранного факультета.
Выборку по возрасту взял с 21 года до 32ух лет. Для каждого возраста-факультета выбиралось общее количество человек и количество тех, у кого в статусе указано «не женат». Используя эти 2 цифры можно получить число холостых в процентах, что собственно и отображено на графике.
Как видно из графика — тенденция на уменьшение холостяков с возрастом есть почти для всех факультетов, но не сильно заметная, как ожидал. Наиболее явно это прослеживается на самом многочисленном факультете — ММФ. Но например если взять юридический факультет, то тут неожиданно обратная картина. В данном случае экономический факультет выглядит определенным углоком стабильности, количество холостяков в любом возрасте примерно 20% .
Меня немного удивил пик на физическом факультете при возрасте в 27 лет. Сделал соответсвующий запрос для проверки и действительно 67 из 180 холостые. (картинка кликабельна)
Ниже приведен прокомментированный код для получения данных, отображенных на графике. Из примечаний могу сказать, что сервера вконтакте обрабатывают не больше 3ёх запросов в секунду, поэтому задержка необходима (есть ещё вариант смотреть в сторону метода execute). Массив факультетов брал, используя стандартный поиск в вконтакте, подсмотрев данный параметр в url строке.
//определяем массив факультетов
var departments = [
1640, // - MMF
1641, // - FF
1642, // - ГГФ
1643, // - ФЕН
1644, // - ГФ
1645, // - ЖФ
1646, // - филосовский
1647, // - юридический
1648, // - экономический
1649, // - ФИТ
1650, // - психологии
1651, // - ИнЯз
1652 // - медицинский
]
//определяем массив возрастов(по году рождения)
var ages = []
for (var i=21; i<33; i++){ ages.push(i); } // массив статусов по семейному положению 1 — Не женат, 2 — Встречается, 3 — Помолвлен, 4 — Женат, 7 — Влюблён, 5 — Всё сложно, 6 — В активном поиске. var statuses = [1/*,2,3,4,5,6,7*/] // массив всех параметров запроса к API var ALL_PARAMS = [] for (var yy in ages){ for (var ss in statuses){ for (var ff in departments){ var pp = new Object(); pp.university = '671' // pp.has_photo = 1 pp.university_faculty = departments[ff] pp.sex = 2//1-women, 2-men pp.status = statuses[ss]; // pp.birth_year = ages[yy] pp.age_from = ages[yy] pp.age_to = ages[yy] pp.count = 0 ALL_PARAMS.push(pp) } } } //now works without statuses function makeChartData(num, sum){ var chartOut = [] var res_index = 0; for (var yy in ages){ var lineOut = [ages[yy]] for (var ff in departments){ if (sum[res_index] == 0){ var chartPercent = 0 }else{ var chartPercent = (num[res_index]*1.)/(sum[res_index]*1.) } lineOut.push(chartPercent) res_index++; } chartOut.push(lineOut) } return chartOut; } var finalResult = []; var finalResultSum = []; var chartData = null; VK.init(function() { // API initialization succeeded // Your code here var current_param = 0; var repeatIt = setInterval(function(){ if (current_param>=ALL_PARAMS.length){
//destroy interval if no more need
clearInterval(repeatIt);
$('#debug').text( finalResult.join(",") )
$('#sum').text( finalResultSum.join(",") )
chartData = makeChartData(finalResult, finalResultSum)
$('#chartData').text( JSON.stringify(chartData) )
console.log(chartData)
return;
}
VK.api('users.search',ALL_PARAMS[current_param],function(data) {
if (data.response){
finalResult.push(data.response.count);
console.log(finalResult)
}else{
//выдаст ошибку, если что-то пошло не так
console.log(data)
}
})
//подсчитываем общее количество
var qNoStatus = JSON.parse( JSON.stringify( ALL_PARAMS[current_param] ) );
qNoStatus.status = 0
VK.api('users.search', qNoStatus, function(data) {
if (data.response){
finalResultSum.push(data.response.count);
console.log(finalResultSum)
}else{
console.log(data)
}
})
current_param++;
//небольшая задержка, чтобы не заблокировали за бомбежку запросами (Too many requests per second)
}, 2500);
}, function() {
// API initialization failed
// Can reload page here
}, '5.28');
Кстати у меня такое чувство, что VK следит за статистикой запросов, во всяком случае меня заблокировали после того как в программе не углядел бесконечный цикл, так что будьте внимательнее.
Не следует сильно серьёзно относится к данному мини исследованию, оно лишь дает некоторое представление, так как основаны на данных, взятых из социальной сети. А она, как известно, полна ботами. Кому нужны официальные данные — добро пожаловать в росстат
Есть пожелания, комментарии, выводы по графику, идеи — пишите vk.com/id12982