
К старту флагманского курса по 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()
Обозначим средние зарплаты:

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

Из уравнения выше видно, что если нет разницы в средних зарплатах между двумя группами, то
