Анализ демографии групп ВКонтакте

Задача определить демографические показатели исследуемой целевой аудитории — одна из первых задач, встающих перед интернет-маркетолог при изучении того или иного товара или услуги. Для себя я решил, что проще всего это сделать — написав специальный скрипт, позволяющий посмотреть пол-возраст групп ВКонтакте.

Например, пройдемся по группе Охота и рыбалка.

Результаты работы скрипта:

Число запросов к API: 3
Анализируемая группа: fishingtrapper
Всего профилей: 74512
Получено профилей с возрастом: 31795
Женщин: 3.87%
Мужчин: 96.06%

Распределение по возрастам:

pr_1

Или возьмем типичную «женскую» группу Кёсем Султан.

Результаты работы скрипта:

Число запросов к API: 1
Анализируемая группа: kosem_sultan
Всего профилей: 4727
Получено профилей с возрастом: 1836
Женщин: 92.97%
Мужчин: 6.86%

Распределение по возрастам:

pr_2

Исходный код самого скрипта:

<?
  header('Content-Type: text/html; charset=UTF-8');
  set_time_limit(0);
  session_start();

  function vk_query($url, $params) {
    	$ch = curl_init();
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    	curl_setopt($ch, CURLOPT_HEADER, false);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch, CURLOPT_IPRESOLVE, CURLOPT_IPRESOLVE_V4);
    	curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_REFERER, $url);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    	curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
      $result = curl_exec($ch);
      curl_close($ch);
      return $result;
  }

if (empty($_SESSION['access_token'])){

    $client_id = ''; // ID приложения
    $client_secret = ''; // Защищённый ключ
    $redirect_uri = 'http://w7.ru/tools/vk/sex.php'; // Адрес сайта

    $url = 'http://oauth.vk.com/authorize';

    $params = array(
        'client_id'     => $client_id,
        'redirect_uri'  => $redirect_uri,
        'scope' => 'offline',
        'response_type' => 'code'
    );

    echo $link = '<p><a href="' . $url . '?' . urldecode(http_build_query($params)) . '">Аутентификация через ВКонтакте</a></p>';

if (isset($_GET['code'])) {
    $result = false;
    $params = array(
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'code' => $_GET['code'],
        'redirect_uri' => $redirect_uri
    );

    $token = json_decode(file_get_contents('https://oauth.vk.com/access_token' . '?' . urldecode(http_build_query($params))), true);

    if (isset($token['access_token'])) {
        $_SESSION['access_token'] = $token['access_token'];
        get_cabinet();
    }
}
} else get_cabinet();

  function get_cabinet(){

  $group_id = '';

  $result = json_decode(vk_query('https://api.vk.com/method/groups.getById', array(
    'group_id' => $group_id,
    'fields' => 'members_count'
  )), true);

  $group_vk_array = $result['response'][0];

  $group_vk_id = $group_vk_array['gid'];
  $group_vk_count = $group_vk_array['members_count'];

  $query_count = ceil(ceil($group_vk_count / 1000) / 25);
  echo 'Число запросов к API: '.$query_count.'<br />';
  $members_all = array();

  for ($i=0; $i<$query_count; $i++){
    $offset_out = $i*25000;
  		$query = "
  			var members = API.groups.getMembers({\"group_id\": $group_vk_id, \"count\":1000, \"fields\": \"sex, bdate\", \"offset\": $offset_out}).items;
  			var offset = 1000;
  			while (offset < 25000 && (offset+$offset_out < $group_vk_count)){
        members = members + API.groups.getMembers({\"group_id\": $group_vk_id, \"count\":1000, \"fields\": \"sex, bdate\",\"offset\": ($offset_out + offset)}).items;
        offset = offset + 1000;
  			};
  			return members;
  		";
    $result = json_decode(vk_query('https://api.vk.com/method/execute', array(
      'access_token' => $_SESSION['access_token'],
      'code' => "$query",
      'v' => '5.37'
    )), true);

    //echo '<pre>';
    //print_r($result);
    $members_all[] = $result;
  }
    $count_return = 0;
    $sex['m'] = $sex['w'] = 0;
        foreach ($members_all as $response){
          foreach ($response['response'] as $m){
             	$y = explode('.', $m['bdate']);
              if (sizeof($y) == 3){
                if ($m['sex'] == 1)
                  $sex['w']++;
        	    else if ($m['sex'] == 2)
            	    $sex['m']++;

              	$age = date('Y', time()) - $y[2];
              	$b[$age]++;
     				$count_return++;
              }
        }
      }
      echo 'Анализируемая группа: '.$group_id.'<br />';
      echo 'Всего профилей: '.$group_vk_count.'<br />';
      echo 'Получено профилей с возрастом: '.$count_return.'<br />';
      echo 'Женщин: '.round(($sex['w']/$count_return)*100,2).'%<br />';
      echo 'Мужчин: '.round(($sex['m']/$count_return)*100,2).'%<br />';
    //arsort($b);
    ksort($b);
    echo '<table><tr><td>Возраст</td><td>Соотношение</td></tr>';
    $s1 = $ticks = null;

    foreach ($b as $key=>$v){
      $p = round(($v/$count_return)*100,2);
      if ($key > 12 && $key < 70){
        echo '<tr><td>'.$key.'</td><td>'.round(($v/$count_return)*100,2).'% ('.$v.')</td></tr>';
        $ticks .= "$key, ";
        $s1 .= "$v, ";
      }
    }
    echo '</table>';
    $ticks = rtrim($ticks, ", ");
    $s1 = rtrim($s1, ", ");
?>
    <link class="include" rel="stylesheet" type="text/css" href="bar/jquery.jqplot.min.css" />
    <link rel="stylesheet" type="text/css" href="bar/examples/examples.min.css" />
    <link type="text/css" rel="stylesheet" href="bar/examples/syntaxhighlighter/styles/shCoreDefault.min.css" />
    <link type="text/css" rel="stylesheet" href="bar/examples/syntaxhighlighter/styles/shThemejqPlot.min.css" />
  <script class="include" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

  <script class="code" type="text/javascript">$(document).ready(function(){
        $.jqplot.config.enablePlugins = true;
        var s1 = [<?=$s1?>];
        var ticks = [<?=$ticks?>];

        plot1 = $.jqplot('chart1', [s1], {
            // Only animate if we're not using excanvas (not in IE 7 or IE 8)..
            animate: !$.jqplot.use_excanvas,
            seriesDefaults:{
                renderer:$.jqplot.BarRenderer,
                pointLabels: { show: true }
            },
            axes: {
                xaxis: {
                    renderer: $.jqplot.CategoryAxisRenderer,
                    ticks: ticks
                }
            },
            highlighter: { show: false }
        });

        $('#chart1').bind('jqplotDataClick',
            function (ev, seriesIndex, pointIndex, data) {
                $('#info1').html('series: '+seriesIndex+', point: '+pointIndex+', data: '+data);
            }
        );
    });</script>

  <span id="info1">Nothing yet</span></div>
    <div id="chart1" style="margin-top:20px; margin-left:20px; width:1400px; height:600px;"></div>
  <pre class="code brush:js"></pre>


    <script class="include" type="text/javascript" src="bar/jquery.jqplot.min.js"></script>
    <script type="text/javascript" src="bar/examples/syntaxhighlighter/scripts/shCore.min.js"></script>
    <script type="text/javascript" src="bar/examples/syntaxhighlighter/scripts/shBrushJScript.min.js"></script>
    <script type="text/javascript" src="bar/examples/syntaxhighlighter/scripts/shBrushXml.min.js"></script>

  <script class="include" type="text/javascript" src="bar/plugins/jqplot.barRenderer.min.js"></script>
  <script class="include" type="text/javascript" src="bar/plugins/jqplot.pieRenderer.min.js"></script>
  <script class="include" type="text/javascript" src="bar/plugins/jqplot.categoryAxisRenderer.min.js"></script>
  <script class="include" type="text/javascript" src="bar/plugins/jqplot.pointLabels.min.js"></script>
<?
  }
?>
Facebook Comments

Леонид Чернядьев

Увлекаюсь программированием, интернет маркетингом, прогнозированием, дизайном и версткой. Принимаю заказы на лидогенерацию. Связь через - https://www.facebook.com/lenid.chernyadyev