Визуализация рынка соискателей с помощью R

    Рынок труда представляет собой классическое формирование спроса и предложения на рабочую силу. И если со стороны спроса на труд, многие кадровые агентства и порталы по поиску работы представляют собой некоторую аналитику по имеющимся предложениям (правда, не всегда в необходимом виде). То со стороны предложения (соискателей) аналитики гораздо меньше, да и та, что есть, не является универсальной для каждого, и чаще всего представляет собой просто срез по желаемому доходу в каких-то общих сферах, или просто по названию резюме.
    image
    Мне же был интересен инструмент, который по произвольной выборке резюме (по названию, ключевым словам и прочее) показывал бы основные характеристики такой выборки, распределение зарплат, возрастов, и многое другое, как в графическом виде, так и виде произвольных перцентилей. Итог моего желания, ниже под катом.

    Сбор данных


    Итак, для визуализации данных, нужны собственно данные, наиболее крупным источником таких данных является сайт HeadHunter. Зная, что у него есть API, я подумал, что вот сейчас то, с ним, быстро все получу, и не придется ничего парсить, но прочитав его описание, увидел, что доступ по нему к базе именно резюме можно получить только для работодателей, и более того, только для целей предложения работы. Но ничего, и в открытом доступе hh.ru есть раздел с резюме людей, которые открыли их всему Интернету, и их то мы видим, а их достаточно много, около трети от общего числа. Из этих людей нас интересует те, которые указали желаемый доход, а их подавляющее большинство – 80%.
    В итоге сбор данных, реализовал двумя способами – сбором данных используя API import.io (первоначально, как более быстрый для реализации), и непосредственно сбор и парсинг осуществляется используя R, этот способ, в итоге оказался на 20% быстрее. Так максимальное число резюме — 5 000 (ограничение hh.ru) собираются за 3 минуты, но обычно в интересующем запросе их гораздо меньше, так что непосредственная временная разница между двумя способами сбора составляет несколько секунд.

    Обзор данных


    Вероятнее всего, данная выборка, является смещенной, я исхожу из предположения, что люди в большинстве своем, открывающие резюме всему интернету, более заинтересованы в поиске работы, и вследствие этого, их ожидания по доходу, вероятнее всего несколько занижены. Но без доступа к полной базе, проверить эту гипотезу, нельзя, поэтому что есть, то есть.
    Анализируя полученные результаты, всегда можно помнить об этой смещенности, и, например, накидывать несколько процентов на полученные результаты. Также решил дополнительно разделять выборку на две части: резюме, обновленное до полугода и старше, для оценки тенденции, есть ли пресловутое влияние кризиса на ожидания и возраст соискателей или же нет.

    Графический веб-интерфейс


    Так как формирование исходного запроса на сайте hh, достаточно мощное, то нецелесообразно отдельно дублировать его в приложении R-Shiny, поэтому исходный произвольный запрос формируется на самом сайте hh, а в приложении надо просто указать эту гиперссылку (в данном примере использовался следующий запрос (сам не заинтересован в подобном запросе): Москва, IT/Телеком, Программирование/разработка, опыт от 3 лет). Данная гиперссылка автоматически преобразуется в вывод ста объявлений на страницу (для ускорения сбора данных), и осуществляется сбор данных (без захода внутрь резюме), так как основные характеристики выборки уже указаны на этой исходной странице. После необходимых преобразований (исключения резюме без рублевой зарплаты и возраста, если это не было сделано на самом сайте hh, обработки дат резюме), помимо сводной картинки из заголовка поста, строятся разные диаграммы по данной выборке, они показаны на рис. 1, 3. Сделано это все, используя пакет Shiny Dashboard. По диаграммам рис.1 можно увидеть плотности распределений, как зарплат, так и возрастов, с указанием децилей этих значений (кстати, визуально видно, что качественно ожидания соискателей более полгода назад и сейчас – не отличаются).

    image
    Рис. 1. Плотности распределений возрастов и зарплат с указанием децилей

    Также в отдельном пункте бокового меню (рис. 2), выводятся все резюме в удобном табличном виде, в котором дополнительно сортировкой или поисковыми фильтрами, можно что-то найти конкретное.

    image
    Рис.2 Таблица данных

    На последней диаграмме (рис. 3) можно увидеть, как основные характеристики дохода (минимум, три квартиля, максимум и выбросы) по конкретному возрасту, так и общую тенденцию по доходу (помимо диаграммы рассеяния из заголовка поста, на которой указана сглаживающая кривая).

    image
    Рис.3 Боксплот (распределение дохода по возрастам)

    Заключение


    В очередном посте про R, я хотел показать, что многие произвольные «данные вокруг нас» можно быстро и легко обработать и представить в наглядном и более удобном для восприятия виде. В данном случае, можно, например, оценить как «широкий» взгляд на отрасль, сферу труда, или же наоборот, «узкий» — максимально детализировав свой запрос по многим параметрам (ключевым словам, направлению), увидеть основные тенденции.
    • +10
    • 14.1k
    • 8
    Share post

    Comments 8

      0
      Крайне интересная работа, спасибо!
      1. Просьба явно выложить ссылку на сервис, сейчас пришлось перебивать с картинки адрес.
      2. Также просьба написать внутри сервиса краткую инструкцию по использованию.
      3. Частоту шкал лучше сделать больше, всё-таки основная ЗП заканчивается около 200К для большинства профессий.
        +1
        Интересно, правда в посте о визуализации данных на R про R написано лишь то, что все это сделано на R)
          0
          Чтобы Вы хотели увидеть конкретно?
          (просто в предыдущих постах, я писал более подробно о shiny и дашбоардах, решил не дублировать)
          0
          В последнее время заинтересовался языком R, понемногу начинаю пробовать. Вопрос такой: а какие есть штатные стредства обращаться в собственную базу (допустим, MySql и/или MSSQL) — ведь отдавать в RCurl через собственный фронтенд как-то глупо, верно?
            +1
            Для получения данных из различных СУБД — есть пакеты,
            для MySQL — RMySQL — cran.r-project.org/web/packages/RMySQL/index.html
            для MSSQL — через RODBC или RJDBC — cran.r-project.org/web/packages/RODBC/index.html,
            также есть пакеты и для других БД,
            если привычнее SQL синтаксис для последующих манипуляций данными,
            то есть пакет sqldf.
            Вообще пакетов очень много, более 7 000 только в официальном хранилище CRAN,
            появился, например, пакет извлекающий данные из таблиц даже из doc документов.
              0
              Спасибо, дальше сам погуглю по этим ключевикам примеры.
            0
            Кто там хочет 550 тысяч?
              0
              image
              Зачем первые двое указали себя в категории Программирование/Разработка не знаю

            Only users with full accounts can post comments. Log in, please.