Кто больше зарабатывает: специалист с образованием или с опытом?
К старту флагманского курса по 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 вы сможете на наших курсах:
Узнайте подробности здесь.
Профессии и курсы
Data Science и Machine Learning
Python, веб-разработка
Мобильная разработка
Java и C#
От основ — в глубину
А также