20 мая 2009 г.

Точность определения страны и региона с помощью ip2cc

При использовании таких продуктов, как ip2cc всегда возникает вопрос, насколько точно он позволяет определить местонахождения пользователя. К сожалению, точный ответ на этот вопрос получить невозможно, но можно попытаться оценить её по косвенным признакам. И мне представилась такая возможность. Около полугода назад (свежесть здесь тоже имеет значение, так как блоки IP иногда перерегистрируются) мне посчастливилось участвовать в одном проекте, в котором пользователь при регистрации может указать страну и регион (для России). К настоящему времени таких пользователей набралось около 20000 — достаточное количество для проведения оценки. Проект ориентирован на русскоязычную аудиторию, поэтому 93% пользователей из России. Благодаря ориентиру на широкую аудиторию, представленными оказались 77 стран и все 83 региона России.
Вот что получилось при сравнении страны, определённой по IP с помощью базы ip2cc, с введённой пользователем:
Правильно — 96.1%, Не правильно — 3.7%, Нет данных — 0.2%
Картинка представляется очень приятной, однако следует понимать, что она несколько искажается из-за того, что большинство пользователей из России — такова специфика проекта. Если брать только пользователей, выбравших при регистрации другую страну, то всё становится не таким радужным:
Правильно — 82.7%, Не правильно — 16.5%, Нет данных — 0.8%
Подавляющее большинство пользователей, попавших здесь в категорию "нет данных" имеют IP, зарегистрированный на Европу без указания конкретной страны.
Ну и, наконец, регионы России. Здесь я выделил в отдельную категорию пользователей из Москвы, Московской области, Санкт-Перербурга и Лениградской области (это всё разные субъекты федерации), для которых удалось определить регион с точностью путаницы город–область. Дело в том, что значительное количество пользователей живя в области посещают проект с работы, находящейся в областном центре, и наоборот, выбирают при регистрации город, вынесенный вверх списка, не утруждая себя поисками области. Следует их считать определёнными неправильно или нет, зависит от задачи.
Правильно — 79.1%, Город/область — 4.9%, Не правильно — 13.8%, Нет данных — 2.2%
Мне сложно судить, насколько качественная такая оценка. Далеко не всегда пользователи заходят из того региона, к которому они себя относят. Например, мне сложно поверить, чтобы IP, зарегистрированный на европейский университет, в реальности находился бы в России (хотя и такое бывает — в своё время пул IP-адресов одной из сетей МГУ им. Ломоносова был зарегистрирован на Германию). Скорее всего, человек из России просто проходит там сейчас обучение. Поэтому указанные здесь цифры следует воспринимать только как нижнюю оценку точности, фактически гарантирующие, что определение будет не хуже.
P.S. Для тех кто не в курсе, приведённые здесь диаграммы сделаны с помощью API Google Chart. И чтобы как-то разбавить скучные статистические данные этого поста, приведу здесь использованную мной функцию для их получения:
def pie_slice(items):
    values = []
    labels = []
    colors = []
    for label, value, color in items:
        values.append('%.1f' % value)
        label = u'%s \u2014 %.1f%%' % (label, value)
        labels.append(label.encode('utf-8'))
        colors.append(color)
    data = dict(
        cht='p3',
        chd='t:'+','.join(values),
        chs='500x100',
        chl='|'.join(labels),
        chco=','.join(colors)
    )
    url = 'http://chart.apis.google.com/chart?'+urlencode(data)
    alt = ', '.join(labels)
    return '<img src="%s" alt="%s">' % (url, alt)

Комментариев нет: