К старту флагманского курса по Data Science делимся небольшим исследованием о зарплате на основе данных опроса Stack Overflow, а также очень кратко знакомим читателей с библиотекой построения байесовских моделей Bambi. За подробностями приглашаем под кат.


Зачем?

Как разработчик или дата-сайентист вы можете задаться вопросом:

  • Будете ли вы зарабатывать больше с ростом опыта? Если да, то на сколько?

  • Есть ли другие факторы: учёная степень, должность и размер компании? Влияют ли они на зарплаты?

Ответим на эти вопросы, используя визуализацию и байесовский вывод.

Данные

Используем опрос 2018 года на Stack Overflow. Загрузим данные в текущий каталог и выполним код:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("survey_results_public.csv")

Выберем не студентов, а разработчиков из США, которые заняты полностью:

sample = df.query(
    "Country == 'United States' & Employment == 'Employed full-time' & Student == 'No'"
)

Уберём зарплаты, превышающие $300,000:

normal_salary = sample[sample["ConvertedSalary"] < 300_000].copy()

И получим диапазон зарплат:

# Group by salary range
bins = [0, 25_000, 50_000, 75_000, 100_000, 125_000, 150_000, 300_000]

normal_salary["Salary Range"] = pd.cut(
    normal_salary.dropna(subset=["ConvertedSalary"])["ConvertedSalary"], bins=bins
)

salary_groupby = normal_salary.groupby("Salary Range").agg({"Respondent": "count"})

# Create a bar plot
salary_groupby.plot(kind="bar")
plt.show()

Похоже, большинство разработчиков зарабатывают от $75 000 до 100 000 в год. Для зарплаты разработчиков в США звучит правдоподобно.

Зарплата и опыт

Покажем влияние опыта на зарплату при помощи ящика с усами:

normal_salary.YearsCoding.head(10)

Преобразуем строки YearsCoding в pandas.Interval:

def str_to_interval(text: str):
    if isinstance(text, str):
        years = text.split()[0].split("-")
        if len(years) == 2:
            return pd.Interval(int(years[0]), int(years[1]))
        else:
            return pd.Interval(int(years[0]), float("inf"))

    return text

# Convert string to pandas.Interval    
normal_salary.YearsCoding = normal_salary.YearsCoding.apply(str_to_interval)

# Sort by years
years_sorted = normal_salary.dropna(
    subset=["ConvertedSalary", "YearsCoding"]
).sort_values(by="YearsCoding")

И визуализируем данные:

sns.boxplot(data=years_sorted, x="YearsCoding", y="ConvertedSalary")
plt.show()

Отлично, кажется, что средняя зарплата увеличивается с ростом опыта.

Обратите внимание, что данные выше — это только выборка. Как проверить, что в средней зарплате разработчиков с опытом от 3 до 5 лет и разработчиков с опытом до двух лет или 6–8 лет и до 2 лет есть выраженная разница? Сделать это можно при помощи байесовского t-теста с независимыми выборками.

Байесовский t-тест при помощи Bambi

Что такое Bambi?

Bambi — это высокоуровневый интерфейс построения байесовских моделей на Python. Он написан поверх Pymc3. Иными словами, Bambi похож на Pymc3, но использовать его намного проще:

pip install bambi

Байесовский t-тест по годам стажа

Начнём со сравнения средней зарплаты разработчиков с опытом до 2 лет от 3 до 5 лет.

# Filter
sample1 = years_sorted[
    (years_sorted.YearsCoding == pd.Interval(0, 2))
    | (years_sorted.YearsCoding == pd.Interval(3, 5))
]

# visualize
sns.boxplot(data=sample1, x="YearsCoding", y="ConvertedSalary")
plt.show()

Обозначим средние зарплаты:

Таким образом, мы можем написать:

Из уравнения выше видно, что если нет разницы в средних зарплатах между двумя группами, то ???? = 0. Воспользуемся Bambi, чтобы отрисовать 4000 образцов β и найти распределение β. Предположим, что распределение з/п с опытом до 2 и от 3 до 5 лет нормальное. Тогда:

import arviz as az
import bambi as bmb

# Convert to string
sample1.YearsCoding = sample1.YearsCoding.astype(str)

# Build model
model1 = bmb.Model("ConvertedSalary ~ YearsCoding", sample1)
result1 = model1.fit(random_seed=0)

В коде выше ConvertedSalary ~ YearsCoding сообщает, что YearsCoding влияет на ConvertedSalary. Обобщим результаты:

az.summary(result1)

В таблице выше YearsCoding[(3.0, 5.0)] — это ???? vp уравнения выше. Мы видим, что 94% наибольшей плотности (HDI) ???? находится между 8418,925 и 14 348,040. Представим распределение ????:

az.plot_posterior(result1.posterior["YearsCoding"], ref_val=0)

Исходя из распределения выше можно сказать, что:

  • разница в зарплатах между двумя группами составляет $11,400;

  • основной пласт различий, а это 94%, лежит между $8418,925 и 14,348,040.

Поскольку все значения β намного выше 0, можно сказать наверняка, что между средней зарплатой разработчиков с опытом до 2 лет и с опытом 3–5 лет есть значительная разница. Проверим, все ли значения β больше 0:

(result1.posterior["YearsCoding"] > 1).values.mean() # Output: 1.0

Да, так и есть.

Байесовский t-тест и опыт работы

Сравним другие цифры:

years_sorted.YearsCoding = years_sorted.YearsCoding.astype(str)

all_model = bmb.Model("ConvertedSalary ~ YearsCoding", years_sorted)
all_results = all_model.fit(random_seed=0)

yearsCoding_summary = (
    az.summary(all_results)
    .drop(["ConvertedSalary_sigma", "Intercept"])
    .sort_values(by="mean")
)

Средняя зарплата увеличивается по мере роста опыта, но её рост замедляется с годами.

Зарплата и другие факторы

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

Зарплата и формальное образование

Формальная степень влияет на то, сколько вы зарабатываете? Выяснить это мы можем при помощи ящика с усами, ящики которого отсортированы по уровню образования.

Судя по графику выше, люди без формального образования, кажется, не зарабатывают столько же, сколько магистры, и больше, чем люди с образованием бакалавра. Можно сказать, что формальная учёная степень мало коррелирует с зарплатой.

Зарплата и размер компании

Как на зарплату влияет размер компании? На представленном ниже графике средняя зарплата в больших компаниях, похоже, больше средней зарплаты в маленьких компаниях.

Зарплата и тип разработчика

График ниже показывает, что средняя зарплата управленцев, таких как инженер-менеджер, генеральный директор, CTO, выше средней заработной платы на других должностях. Однако различия небольшие. Студенты, кажется, зарабатывают значительно меньше, чем устроенные на полный день разработчики.

Распределение зарплат руководителей C (генеральный директор, CTO и т. д.) является более разреженным, чем другие. Вполне возможно, что зарплаты высших руководителей сильно различаются в зависимости от размера компании.

Итоги и дальнейшие шаги

Исходя из вышеприведённого анализа, можно сказать, что:

  • есть значительная разница в средней заработной плате между разработчиками с меньшим стажем и разработчиками с большим стажем;

  • наличие формального диплома практически не влияет на размер заработной платы;

  • медианная зарплата немного увеличивается при увеличении размера компании и при более высокой должности.

Так стоит ли вам получить высшее образование или набрать больше лет опыта, чтобы получать большую зарплату? Из анализа приведённых выше данных следует, что лучшим вложением средств является получение большего количества лет опыта работы в интересующей вас области.

Что дальше?

Можете ли вы использовать байесовский t-тест, чтобы определить, существует ли значительная разница в средней зарплате между компаниями разного размера или между разными типами должностей? Свободно форкайте репозиторий статьи.

Ссылки

Stack Overflow. 2018–05–15. Stack Overflow 2018 Developer Survey, Version 2. Database Contents License. Retrieved 2021–01–06 from this anchor.

Продолжить изучение науки о данных и Python вы сможете на наших курсах:

Узнайте подробности здесь.

Профессии и курсы

Комментарии (11)


  1. AlexeyALV
    24.01.2022 22:58
    +10

    Больше тот кто применил образование для получения опыта.

    Предвижу минусы от молодых дарований.


    1. mxr
      25.01.2022 06:21
      +2

      Как в воду глядели.


  1. siberiano
    24.01.2022 23:59
    +15

    Занятно, что рекламирующие курс не смогли такое исследование построить сами, а просто перевели готовое, где анализ просто смешон.

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

      И таковых всего 0,7%. Либо это какие-то редкие везунчики из провинции в Индии, либо шутники, заполнявшие анкету намеренно неправильно. Такое количество ответов нельзя вообще рассматривать всерьёз.

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

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

    В общем, вот пример как не надо делать датасаенс.


  1. D03ER
    25.01.2022 10:37
    +3

    Справедливости ради стоит отметить, что некоторые базовые вещи, которые медленно и нудно постигаешь (или нет) при самообучении разжовываются в академическом образовании и скармливаются в готовом виде. А то видел я этих прекрасных молодых людей, считающих что модели OSI это версии линуксов и виндовсов


  1. ysadyev
    25.01.2022 10:45

    По моим наблюдениям, люди из практики без образования зарабатывают до определенного "потолка". Затем нужны либо инженерные знания, полученные каким-то путем, но эти знания очень трудно держать в голове если ты постоянно не используешь их, либо те же самые инженерные знания, но полученные с помощью Высшего Образования и тогда диплом является своеобразным подтверждением, как минимум, того, что на протяжении нескольких лет специалиста готовили к базовым приемам использования и получения этих самых знания.


    1. avengerweb
      26.01.2022 10:19

      Нет, просто дальше идёт уже manager, director, VP, cto, ceo и тд

      Куда попасть без ВО сложно, потому что эти направления перестают быть узко направленными как разработка чего либо. И вам начинают быть нужны уже те волшебные софт скилы, понимание экономики, психологии и поведения людей. Те вещи которые все тихо ненавидят учась в вузах на технических направлениях. Это ещё не беря в учёт что нужно знать предметную область компании, если ваш СЕО в стартапе по разработке роботов не имеет мастерс в инженерной области, для инвесторов звоночек.


  1. Grue55
    25.01.2022 10:45

    Ну такую задачку просто пандосом делается, зачем такие сложности, я это пару месяцев назад делал, как домашние задание


  1. codecity
    25.01.2022 11:28

    Самое главное чтобы образование не навредило - не отбило интерес. Бывает и такое.

    Компетентный образованный чел. видит подводные камни, знает что не все так просто. Не станет рисковать. Чел. без образования настроен более оптимистически, проще начнет стртап в гараже, думая что умнее всех (не осознавая своей некомпетентности). Иногда это срабатывает.


  1. ScarferNV
    25.01.2022 12:19

    Вопрос из разряда, какая машина едет быстрее, белая или красная


  1. aryeh
    25.01.2022 15:53

    хорошо бы ещё узнать, как часто люди без образования попадают на места, где трабуется степень?


  1. Daddy_Cool
    27.01.2022 01:27

    Вопрос который сковозит - "а не зря ли я учусь, если это не повлияет на зарплату"?
    Тут был шикарный пример - как водитель грузовика может добиться доходов хорошего программиста и выше (оставив далеко позади глупых инженеров). Очевидно, для вождения грузовика не нужно высшее образование и тем более ученые степени.
    В РФ, 90-х была ситуация, что можно было зарабатывать деньги, а учиться смысла не имело (если не сваливать).
    На растущем рынке нет смысла тратить время на... всё, кроме как на этот рынок. Зачем учиться, если можно скупать тюльпаны? Вопрос, правда, сколько эта радость продлится?