Методика
Честные данные важнее красивых цифр. Здесь описано, откуда берутся данные, что с ними происходит и — главное — чему на этом дашборде верить нельзя.
Источник
- Открытые вакансии hh.kz (регион — Казахстан), по всем IT-ролям классификатора + дизайн и аналитика. Выгрузка еженедельная.
- Как забираются данные. В декабре 2025 HH закрыл анонимный доступ к своему API, а выдача токена приложения требует ручной модерации. Поэтому данные читаются из публичных страниц поиска hh.kz: каждая страница содержит встроенный JSON-стейт (структурированные вакансии с зарплатой, опытом, форматом работы) — его и разбираем. Парсится именно JSON, а не HTML-разметка, поэтому косметические правки вёрстки парсер не ломают. Это чтение того же, что видит любой посетитель сайта; персональные данные и закрытые разделы не затрагиваются.
- hh.kz, как и API, не отдаёт больше ~2000 вакансий на один запрос — обходим дроблением по роли × опыту × датам, так что в датасет попадает генеральная совокупность, а не «первые 2000».
- Архив накапливается: каждый снапшот добавляется к предыдущим, дубликаты по id схлопываются (побеждает свежая версия вакансии).
Нормализация зарплат
- Все суммы приведены к ₸/мес. Валютные вилки (USD, EUR, RUB) конвертируются по курсу на день сборки снапшота; курс зафиксирован в метаданных датасета.
- Точка вакансии — середина вилки. Если указана одна граница («от 500 000»), берётся она. Это стандартное упрощение зарплатных агрегаторов.
- «До налогов» и «на руки» не смешиваются в одну шкалу принудительно — мы не пересчитываем налоги. Флаг gross сохранён у каждой вакансии и виден в таблице. Смешение даёт ~10–15% шума в медианах; налоговая формула КЗ (ОПВ, ВОСМС, ИПН с вычетом) добавила бы ложную точность к данным, которые сами по себе — вилки, заявленные работодателем.
Грейды и роли
- Грейд — эвристика: явное слово в названии (Senior, младший, Lead…) сильнее всего; иначе — опыт из вакансии (без опыта → junior, 3–6 лет → middle, 6+ → senior). Вакансии с опытом «1–3 года» без слова в названии остаются «грейд не указан» — честнее, чем записывать всех в джуны.
- Роль — по названию вакансии (первично) и professional_roles HH (вторично): у HH роли часто проставлены криво, «Frontend-разработчик» может лежать в общей роли «Программист».
- Технологии извлекаются словарём (~100 канонических терминов) из названия вакансии. Полные требования лежат только в детальной карточке (тысячи лишних запросов) — поэтому доля технологий здесь занижена: считается лишь то, что попало в заголовок. Это самое слабое место данных, читать как «нижнюю оценку», а не точную долю.
Чему верить нельзя
- Зарплата указана только у ~40% вакансий. Это смещённая выборка: зарплату чаще публикуют массовые и джуновые позиции, реже — сеньорские в крупных компаниях. Реальные медианы офферов, скорее всего, выше.
- Это заявленные вилки, а не офферы. Работодатель может писать «до 1 500 000», нанимая на 900 000.
- Медианы по срезам с малым n (город с 5 вакансиями) — шум. Число вакансий показано рядом с каждой цифрой; города с n<5 скрыты.
- hh.kz покрывает не весь рынок: часть сеньорских и удалённых позиций живёт в LinkedIn, телеграм-каналах и рефералках.
Технически
- Датасет — статический снапшот (колоночный JSON со словарями), весь дашборд считается в браузере: фильтры, медианы, гистограммы — без сервера. Один проход по колонкам на любое изменение фильтра.
- Код открыт: github.com/Alexanderadon/tengestack. Пересборка данных — GitHub Actions по расписанию.