Skip to content

Catherinemipt/jobix-dataset

Repository files navigation

Исследование Российского Рынка Труда: Датасет и Методология Анализа (конец 2025 года)

Данный репозиторий содержит материалы исследования, посвященного многоуровневому анализу текстовых описаний вакансий на российском рынке труда. Основу исследования составляет датасет из более чем 146 000 вакансий, собранных с публичных рекрутинговых платформ (hh.ru, career.habr.com).

Данное исследование — это масштабное применение той же технологии для анализа всего рынка целиком.

Методология

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

  1. Агрегация и нормализация данных: Автоматизированный сбор и первичная очистка текстовых описаний вакансий.
  2. Эвристический семантический анализ: Применение проприетарной модели для идентификации и классификации лексических маркеров, ассоциированных с потенциальными рисками и преимуществами для соискателей.
  3. Культурное профилирование: Кластеризация организаций на основе семантического анализа текста вакансий с использованием архетипов Модели конкурирующих ценностей (CVF).
  4. Алгоритмический скоринг: Расчет интегрального "Индекса Риска" (Toxicity Index) для каждой вакансии на основе взвешенной матрицы рисков, разработанной в рамках Иерархической Модели Оценки Риска и Полезности (HRUSM - см. в Методологии расета).

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

Прикладное применение

Результаты данного исследования и использованные методологии легли в основу публичного инструмента для соискателей Jobix. Если данный датасет предназначен для масштабного анализа всего рынка, то онлайн-инструмент позволяет проводить прикладной аудит вакансий в интерактивном режиме для личных целей.


Структура Датасетов

Репозиторий содержит два основных набора данных в формате JSON Lines (.jsonl), где каждая строка представляет собой валидный JSON-объект.

1. Первичный Датасет: hh_raw_vacancies.jsonl

Данный файл содержит необработанные (сырые) данные, полученные на этапе агрегации. Он представляет собой архив оригинальных текстов вакансий.

Структура одной записи:

  • "id" (string): Уникальный идентификатор вакансии на платформе-источнике.
  • "source" (string): Платформа-источник ("hh" для HeadHunter, "habr" для Habr Career).
  • "url" (string): Прямая ссылка на вакансию.
  • "name" (string): Оригинальное название должности.
  • "employer" (string): Оригинальное название компании.
  • "description" (string): Полный текст описания вакансии в формате HTML. Этот формат сохранен для возможности дальнейшего, более глубокого анализа, включая разметку и стили.
  • "download_status" (string): Технический статус загрузки ("ok", "closed_404" и т.д.).

2. Финальный ("Золотой") Датасет: jobix_golden_dataset_V5_5.jsonl

Этот файл является основным результатом исследования. Каждая запись содержит как исходные метаданные, так и результаты всех этапов аналитической обработки.

Структура одной записи:

  • "source_url" (string): Уникальная URL-ссылка на вакансию, выступающая в роли первичного ключа.
  • "meta" (object): Блок, содержащий базовые атрибуты вакансии (job_title, company_name, industry, grade, region).
  • "screen_1_risks" (object): Результаты качественного семантического анализа.
    • "risk_tag" (string): Классификационный тег, присвоенный вакансии.
    • "points" (array of objects): Массив выявленных "сигналов". Каждый объект содержит поля severity, title и text.
    • "verdict" (string): Синтезированное текстовое заключение.
  • "screen_2_culture" (object): Результаты культурного профилирования.
    • "profile" (object): Векторное представление культурного профиля (market, hierarchy, adhocracy, clan).
    • "rationale" (array of objects): Примеры лексем, послуживших основанием для классификации.
    • "culture_verdict" (string): Итоговый вывод о доминирующем культурном типе.
  • "toxicity_index" (float): Интегральный Индекс Риска. Расчетный показатель, полученный путем алгоритмического применения модели HRUSM к сигналам из блока "screen_1_risks".
  • "rating" (integer): Финальный 5-балльный рейтинг. Вычисляется программно на основе значения "toxicity_index" и его положения в общем распределении данных по датасету (калибровка по перцентилям).
  • "analyzed_at" (float): Временная метка Unix timestamp.

Методология Расчета Индекса и Рейтинга

Ключевой особенностью данного исследования является применение детерминированного алгоритма для вычисления итоговой оценки вакансии, что обеспечивает воспроизводимость и объективность результатов. Процесс скоринга состоит из двух этапов.

1. Расчет Интегрального Индекса Риска (toxicity_index)

Для расчёта интегрального Индекса Токсичности используется иерархическая многокритериальная модель оценки риска и полезности. По сути, это частный случай моделей ожидаемой полезности и многокритериальных методов (MAUT, метод анализа иерархий Саати), адаптированный под текст вакансий и семантические «флаги» риска.

​ В рамках данного исследования эта реализация обозначена как HRUSM (Hierarchical Risk & Utility Scoring Model). То есть теоретически модель опирается на существующие подходы к иерархической оценке риска, а название HRUSM — рабочий термин для конкретной реализации под рынок труда.

Для каждой вакансии toxicity_index вычисляется как взвешенная сумма всех негативных и предупреждающих сигналов (red и yellow), выявленных на этапе качественного анализа (screen_1_risks.points).

Матрица Весов Риска (Risk Weight Matrix):

Матрица сопоставляет семантические категории рисков с их численным весом, отражающим степень их влияния на привлекательность вакансии. При расчете использовался метод частичного совпадения ключевых слов (keywords) из заголовка сигнала (title) с маркерами в матрице.

Категория риска (Маркеры для поиска) Вес ($W$)
текучка, плохие отзывы 10
нечеткие kpi, отсутствие стратегии 9
много шляп, смешение ролей, вакансия-комбайн 8
5+ лет опыта для junior 8
гибкость, ожидание переработок, горящие глаза 7
оптимизации, снижение издержек 7
мы как семья, нарушение границ 6
рок-звезда, ниндзя 5
Прочие сигналы без совпадения 3

Учтем культурный контекст

Риски будут отличаться по значимости для каждой культуры. Что нормально для стартапа, может быть токсичным для крупной корпорации. Не учитывать культурный профиль компании было непростительной ошибкой. Теперь индекс токсичности считаем с учетом культурного типа:

$$ Toxicity_Index = \sum_{i=1}^{n} (W_{cat}^{(i)} \cdot S_{sev}^{(i)} \cdot M_{cult}^{(i)}) $$

Где:

  • $W_{cat}$ (Базовый вес): Значимость категории риска (от 5 до 10 баллов).
  • $S_{sev}$ (Тяжесть): Коэффициент серьезности нарушения:
    • 1.0 — для красных флагов (критично).
    • 0.5 — для рыжих флагов (средняя тяжесть).
  • $M_{cult}$ (Культурный модификатор): Коэффициент, определяющий, как среда компании усиливает или гасит риск (от 0.7 до 1.3).

Матрица Культурного Резонанса:

Категория риска Hierarchy (Иерархия) Market (Рынок) Clan (Клан) Adhocracy (Стартап)
Стратегический хаос 1.3 ⬆️ 1.0 1.1 0.7 ⬇️
Эксплуатация времени 1.1 0.8 ⬇️ 1.2 ⬆️ 0.9
Синдром Единорога 1.1 1.0 1.0 0.7 ⬇️
Агрессивная экономия 1.0 1.1 1.3 ⬆️ 1.2
Манипуляция лояльностью 1.2 1.0 0.7 ⬇️ 0.9
Кризис управления 1.2 ⬆️ 1.1 1.1 1.0
Junior Trap 0.8 ⬇️ 1.1 1.0 1.2
Нереалистичный героизм 1.2 0.8 ⬇️ 1.0 1.0

2. Калибровка Финального Рейтинга (rating)

Поскольку абсолютное значение toxicity_index может сильно варьироваться, для удобства интерпретации он был преобразован в стандартизированную 5-балльную шкалу (rating).

Конвертация производится на основе перцентильного распределения всех значений toxicity_index по датасету. Такой подход позволяет оценить каждую вакансию не в вакууме, а относительно всего исследуемого рынка труда.

Шкала калибровки:

toxicity_index Рейтинг (rating) Интерпретация
0 — 15.7 5 Safe Haven (Лучшие 10% рынка)
15.7 — 22.5 4 Good Deal (Следующие 20%)
22.5 — 27.8 3 The Swamp (Основная масса 40%)
27.8 — 32.5 2 Grinder (Следующие 20%)
32.5+ 1 VETO / Hell (Худшие 10%)

Таким образом, финальный rating представляет собой относительную оценку, показывающую, к какому сегменту рынка принадлежит данная вакансия — от наиболее привлекательных до крайне токсичных.


Рекомендации по Работе с Датасетом

Каждая строка в файле — это самостоятельный JSON-объект, что позволяет обрабатывать файл построчно, не загружая его целиком в оперативную память.

Пример 1: Базовая работа с данными на Python

Для начала работы с датасетом jobix_golden_dataset_V5_5.jsonl не требуются специализированные библиотеки. Вы можете читать и анализировать его с помощью стандартных средств Python.

import json
import collections

# Путь к вашему файлу
DATASET_PATH = 'jobix_golden_dataset_V5_5.jsonl'

# --- Пример: Подсчет вакансий по отраслям ---
industry_counter = collections.Counter()
total_records = 0

print("Анализируем распределение по отраслям...")
with open(DATASET_PATH, 'r', encoding='utf-8') as f:
    for line in f:
        try:
            record = json.loads(line)
            industry = record.get('meta', {}).get('industry', 'Не указано')
            industry_counter[industry] += 1
            total_records += 1
        except json.JSONDecodeError:
            continue

print(f"\nПроанализировано {total_records} записей.")
print("\nТоп-10 самых популярных отраслей в датасете:")
for industry, count in industry_counter.most_common(10):
    print(f"- {industry}: {count} вакансий")

Пример 2: Анализ с использованием Pandas

import json
import pandas as pd

# Путь к вашему файлу
DATASET_PATH = 'jobix_golden_dataset_V5_5.jsonl'

# Загружаем JSONL в pandas DataFrame
# Этот процесс может занять некоторое время для большого файла
print("Загружаю датасет в pandas DataFrame...")
try:
    with open(DATASET_PATH, 'r', encoding='utf-8') as f:
        records = [json.loads(line) for line in f]
    df = pd.json_normalize(records)
    print("Загрузка завершена.")

    # --- Пример: Поиск "лучших" и "худших" компаний ---
    # Переименовываем длинные колонки для удобства
    df.rename(columns={
        'meta.company_name': 'company',
        'toxicity_index': 'toxicity',
        'rating': 'rating'
    }, inplace=True)

    # Группируем по компаниям и считаем средний индекс токсичности
    company_scores = df.groupby('company').agg(
        avg_toxicity=('toxicity', 'mean'),
        vacancy_count=('toxicity', 'count')
    ).reset_index()

    # Фильтруем компании, у которых в датасете больше 5 вакансий (для репрезентативности)
    reputable_companies = company_scores[company_scores['vacancy_count'] > 5]

    print("\n--- Топ-5 'самых здоровых' компаний (низкий средний индекс токсичности) ---")
    print(reputable_companies.sort_values('avg_toxicity', ascending=True).head(5))

    print("\n--- Топ-5 'самых токсичных' компаний (высокий средний индекс токсичности) ---")
    print(reputable_companies.sort_values('avg_toxicity', ascending=False).head(5))

except FileNotFoundError:
    print(f"ОШИБКА: Файл {DATASET_PATH} не найден.")
except Exception as e:
    print(f"Произошла ошибка: {e}")

Если вы испульзуете данный датасет для собственных исследований, пожалуйста, ссылайтесь на этот репозиторий.


Результаты Исследования и План Публикаций

Данный репозиторий является "живым" проектом. Основные данные (jobix_golden_dataset_V5_5.jsonl) уже доступны для самостоятельного анализа. Выводы и анализы сделаные мной

📝 Статьи и Публикации

Здесь будут появляться ссылки на опубликованные материалы.

Следите за обновлениями, если они будут!

About

Анализ более 146 000 вакансий на российском рынке труда. Датасет и методология. Датасет состоит из проанализированных вакансий на предмет организационной энтропии, рисков токсичности и корпоративной культуры (модель CVF).

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors