📌 학습주제
1. Indian Restaurant Dataset으로 실습하기
2. Global AI, ML, Data Science Salary Dataset 으로 실습하기
3. NBA players Dataset으로 실습하기
Global AI, ML, Data Science Salary Dataset으로 실습하기
🔗 실습 링크 : https://www.kaggle.com/datasets/dparas01/global-ai-ml-data-science-salary
Global AI, ML, Data Science Salary 2023
Open salary data of Data Science related profile in the public domain
www.kaggle.com
1단계. 데이터 살펴보기
컬럼명 | 의미 | |
work_year | 급여가 지급된 기준 연도 | |
experience_level | 숙련도 | EN(Entry-level)/Junior |
MI(Mid-level)/Intermediate | ||
SE(Senior-level)/Expert | ||
EX(Executive-level)/Director | ||
employment_type | 고용 형태 | PT(Part-time) |
FT(Full-time) | ||
CT(Contract) | ||
FL(Freelance) | ||
job_title | 직무이름 | |
salary | 해당 연도를 기준으로 총 얼마가 지급되었는지(연봉) | |
salary_currency | 연봉이 지급된 통화 | |
salary_in_usd | USD가 아닌 다른 통화로 지급되었을 때 이를 당시 환율로 환산한 값 | |
employee_residence | 근무 당시 거주 국가 | |
remote_ratio |
재택근무 비율 (총 근무 중 몇 %를 재택근무로 하는지) |
0 |
50 | ||
100 | ||
company_location | 메인 오피스의 위치 | |
company_size |
직원수 규모 | S(50명 미만) |
M(50명 이상 250명 이하) | ||
L(250명 초과) |
- [employment_type] 컬럼은 FT밖에 없으므로 해당 컬럼은 구분 기준으로 사용하기 어렵다. 따라서 분석에서는 제외한다.
2단계. 다양한 기준에 따라 SQL로 데이터 분석하기
-- 우선, 연도별로 데이터 카운트해보기
SELECT work_year, count(1) as cnt
FROM salary
GROUP BY 1
ORDER BY 1
work_year | cnt |
2020 | 75 |
2021 | 218 |
2022 | 1651 |
2023 | 6861 |
→ 2020, 2021년도의 데이터가 2022, 2023년도의 데이터 개수에 비해 현저히 작으므로 분석에서는 제외하도록 하겠다.
-- 2022, 2023연도의 평균 연봉 파악하기
SELECT work_year, AVG(salary_in_usd) as usd_salary
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 1
work_year | usd_salary |
2022 | 134449.1381 |
2023 | 155198.4878 |
→ 2022년 대비 2023년에 평균 연봉이 오른 것을 확인할 수 있다.
2022년 대비 2023년에 평균 연봉이 증가하게 된 요인(컬럼)에 대해서 분석해보자.
-- (1) 숙련도에 따른 평균 연봉 차이 알아보기
SELECT experience_level, AVG(salary_in_usd) as usd_salary
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
experience_level | usd_salary |
EN | 91388.4539 |
MI | 116621.0223 |
SE | 162391.0944 |
EX | 189309.9647 |
→ 숙련도가 높을수록 평균 연봉도 높아지는 것을 알 수 있다.
→ 특히, MI와 SE 레벨에서 연봉 차이가 많이 나는 것을 확인했다.
-- (2) 직무명에 따른 평균 연봉 차이 알아보기
SELECT job_title, AVG(salary_in_usd) as usd_salary
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
→ 직무명에 직책까지 포함된 것들이 많기 때문에 나중에 살펴보도록 하겠다.
-- (3) 재택근무 비율에 따른 평균 연봉 차이 알아보기
SELECT remote_ratio, AVG(salary_in_usd) as usd_salary
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
remote_ratio | usd_salary |
50 | 81863.8468 |
100 | 145743.0010 |
0 | 156072.8260 |
→ 재택근무 비율이 50%인 경우가 평균 연봉이 가장 낮고 다른 비율에 비해 차이가 많이 난다.
→ 100% 재택근무보다 100% 출근인 경우가 연봉이 더 낮긴 하지만, 큰 차이는 없다.
-- (4) 직원수 규모에 따른 평균 연봉 차이 알아보기
SELECT company_size, AVG(salary_in_usd) as usd_salary
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
company_size | usd_salary |
S | 95446.0686 |
L | 141378.9649 |
M | 152651.3354 |
→ 고용 인원이 50명 미만일 때 평균 연봉이 가장 낮고 다른 규모의 회사와 차이가 크다.
→ M 사이즈 회사에서 연봉을 가장 많이 주는 경향이 있긴 하지만, L 사이즈 회사와 큰 차이는 없다.
2022년에서 2023년으로 넘어갈 때 평균 연봉의 비율이 어떻게 변화했는지를 알아보자.
-- (1) 숙련도에 따른 2022년 대비 2023년 평균 연봉 비율 변화
WITH bef as(
SELECT work_year, experience_level, count(1) as cnt_2022
FROM salary
WHERE work_year = 2022
GROUP BY 1, 2
),
aft as(
SELECT work_year, experience_level, count(1) as cnt_2023
FROM salary
WHERE work_year = 2023
GROUP BY 1, 2
)
SELECT bef.*, aft.cnt_2023
FROM bef INNER JOIN aft ON bef.experience_level = aft.experience_level
구글 스프레드 시트로 export해보면 다음과 같다.
→ 평균 연봉이 상대적으로 높았던 SE와 EX 레벨의 비중이 2022년 대비 2023년에 증가했다.
→ 평균 연봉이 상대적으로 낮았던 EN와 MI 레벨의 비중이 2022년 대비 2023년에 감소했다.
→ 특히, 연봉이 가장 적은 EN 레벨에서는 절반 가까이 감소한 것을 알 수 있다.
→ 즉, 2022년보다 2023년에 고연봉 연차들이 많이 속해있기 때문에 전체적인 평균 연봉이 높아졌다고 할 수 있다.
-- (2) 회사 규모에 따른 2022년 대비 2023년 평균 연봉 비율 변화
WITH bef as(
SELECT work_year, company_size, count(1) as cnt_2022
FROM salary
WHERE work_year = 2022
GROUP BY 1, 2
),
aft as(
SELECT work_year, company_size, count(1) as cnt_2023
FROM salary
WHERE work_year = 2023
GROUP BY 1, 2
)
SELECT bef.*, aft.cnt_2023
FROM bef INNER JOIN aft ON bef.company_size = aft.company_size
구글 스프레드 시트로 export해보면 다음과 같다.
→ 연봉이 가장 적은 S 규모 회사와, L 규모 회사에서는 2022년 대비 2023년에 비중이 줄었다.
→ 연봉이 가장 높은 M 규모 회사에서는 2022년 대비 2023년에 비중이 그만큼 늘었다.
→ 즉, 2022년보다 2023년에 연봉이 가장 높은 M 규모 회사의 비중이 더 높아졌기 때문에 전체적인 평균 연봉이 높아졌다고 할 수 있다.
[정리]
2022년에 비해 2023년에 평균 연봉이 증가했는데, 그 이유는
1) 숙련도 관점에서 SE 비중이 높아지고,
2) 직원수 규모 관점에서 M 규모 회사의 비중이 높아졌기 때문이다.
※ 위의 분석만으로는 무엇이 원인인지 변수간 어떤 상관관계 혹은 인과관계가 있는지 알기 어렵다.
당시 맥락을 파악할 수있는 경제 지표, 고용 추이 등의 추가적인 데이터를 활용해야 보다 정확한 원인 파악이 가능하다.
연도별 재택근무 비중을 확인해보자.
-- 2022, 2023연도의 평균 재택근무 비율 파악하기
SELECT work_year, AVG(remote_ratio) as avg_remote_ratio
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 1
work_year | avg_remote_ratio |
2022 | 55.2090 |
2023 | 33.4718 |
→ 2022년 대비 2023년에 평균 재택근무 비중이 감소했다.
2022년 대비 2023년에 평균 재택근무 비중이 감소하게 된 요인(컬럼)에 대해서 분석해보자.
-- (1) 숙련도에 따른 평균 재택근무 비중 차이 알아보기
SELECT experience_level, AVG(remote_ratio) as avg_remote_ratio
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
experience_level | avg_remote_ratio |
MI | 35.9356 |
SE | 37.5200 |
EX | 41.7647 |
EN | 44.7631 |
→ SE의 평균 재택근무 비중이 상대적으로 낮다.
→ 2022년 대비 2023년에 가장 많이 증가한 숙련도 레벨이 SE이므로 재택근무 비중이 낮아진 이유는 SE가 많아진 것이 하나의 요인으로 작용했을 것이다.
-- (2) 직원수 규모에 따른 평균 재택근무 비중 차이 알아보기
SELECT company_size, AVG(remote_ratio) as avg_remote_ratio
FROM salary
WHERE work_year in (2022, 2023)
GROUP BY 1
ORDER BY 2
experience_level | company_size |
L | 37.2074 |
M | 37.2696 |
S | 72.5490 |
→ 직원수 규모가 적을수록 평균 재택근무 비중이 높다.
→ 2022년 대비 2023년에 S 규모 회사 비중이 줄어들긴 했었지만, 원래도 3% 정도였기 때문에 상관관계가 높아보이지는 않는다.
가설 : 직원들이 해외에 있다면 재택근무를 하는 비중이 더 높을 수도 있을 것이다.
-- (3) 근무 당시 거주지역에 따른 2022년 대비 2023년 평균 재택근무 비율 변화
WITH bef as(
SELECT work_year,
IF(employee_residence = 'US', 'In-US', 'Out-US') as residence_group,
count(1) as cnt_2022
FROM salary
WHERE work_year = 2022
GROUP BY 1, 2
),
aft as(
SELECT work_year,
IF(employee_residence = 'US', 'In-US', 'Out-US') as residence_group,
count(1) as cnt_2023
FROM salary
WHERE work_year = 2023
GROUP BY 1, 2
)
SELECT bef.*, aft.cnt_2023
FROM bef INNER JOIN aft ON bef.residence_group = aft.residence_group
구글 스프레드 시트로 export해보면 다음과 같다.
→ 미국 외 지역에서 근무하는 직원의 비중이 감소했다.
→ 이 요인 또한 재택근무 비중 감소에 영향을 주었을 것이다.
[정리]
2022년에 비해 2023년에 평균 재택근무 비중이 감소했는데, 그 이유는
1) 숙련도 관점에서 SE 비중이 높아지고,
2) 해외 근무자(미국 외 지역 근무자)의 비중이 감소했기 때문이다.
직무별 평균 연봉을 비교해보자.
직무명에 직책이 포함된 항목들이 많기 때문에 눈에 보이는 키워드를 기준으로 그룹화한 후에 분석을 수행해보자.
-- 특정 키워드를 기준으로 직무를 그룹화한 후 특징 파악하기
SELECT CASE
WHEN job_title LIKE '%Scientist%' THEN 'S'
WHEN job_title LIKE '%Director%' THEN 'D'
WHEN job_title LIKE '%Engineer%' THEN 'E'
WHEN job_title LIKE '%Analyst%' THEN 'A'
WHEN job_title LIKE '%Architect%' THEN 'AC'
WHEN job_title LIKE '%Consultant%' THEN 'SC'
WHEN job_title LIKE '%Manager%' THEN 'M'
WHEN job_title LIKE '%Specialist%' THEN 'SP'
WHEN job_title LIKE '%Practitioner%' THEN 'P'
ELSE 'OTHER'
END AS job_group, AVG(salary_in_usd) as avg_salary, AVG(remote_ratio) as avg_remote, count(1) as cnt
FROM salary
GROUP BY 1
ORDER BY 2
job_group | avg_salary | avg_remote | cnt |
P | 144480.0000 | 0 | 10 |
C | 114600.7422 | 23.2558 | 43 |
M | 144556.2071 | 25.8929 | 280 |
SP | 100668.7639 | 31.2500 | 72 |
E | 158492.8584 | 35.9232 | 3829 |
OTHER | 138896.6069 | 36.2595 | 262 |
S | 161875.2231 | 39.9724 | 2533 |
A | 108129.7664 | 44.1754 | 1528 |
D | 222549.5625 | 46.8750 | 32 |
AC | 169045.2917 | 59.7222 | 216 |
→ SP가 평균 연봉이 가장 낮다.
→ D가 평균 연봉이 가장 높다.
→ P는 100% 출근이다.
→ C는 외주를 받아서 일하는 경우가 대다수이기 때문에 재택근무 비중이 낮은 것이 상식적이다.
→ AC가 재택근무 비중이 가장 높다.
직원들의 근무 당시 거주지역을 직무별로 나누어 살펴보자.
-- 직무 그룹 별 그룹내 카운트, 전체 카운트를 각각 구한 후 둘의 비율 파악하기
WITH base as(
SELECT CASE
WHEN job_title LIKE '%Scientist%' THEN 'S'
WHEN job_title LIKE '%Director%' THEN 'D'
WHEN job_title LIKE '%Engineer%' THEN 'E'
WHEN job_title LIKE '%Analyst%' THEN 'A'
WHEN job_title LIKE '%Architect%' THEN 'AC'
WHEN job_title LIKE '%Consultant%' THEN 'SC'
WHEN job_title LIKE '%Manager%' THEN 'M'
WHEN job_title LIKE '%Specialist%' THEN 'SP'
WHEN job_title LIKE '%Practitioner%' THEN 'P'
ELSE 'OTHER'
END AS job_group, IF(employee_residence = 'US', 'In-US', 'Out-US') as residence_group
FROM salary
),
g_1 as(
SELECT job_group, residence_group, count(1) as group_cnt
FROM base
GROUP BY 1, 2
),
g_2 as(
SELECT job_group, residence_group, count(1) as tot_cnt
FROM base
GROUP BY 1
)
SELECT g_1.job_group, residence_group, group_cnt, group_cnt/tot_cnt as ratio
FROM g_1 INNER JOIN g_2 ON g_1.job_group = g_2.job_group
job_group | residence_group | group_cnt | ratio |
A | In-US | 1295 | 0.8475 |
A | Out-US | 233 | 0.1525 |
AC | In-US | 198 | 0.9167 |
AC | Out-US | 18 | 0.0833 |
C | In-US | 30 | 0.6977 |
C | Out-US | 13 | 0.3023 |
D | In-US | 21 | 0.6563 |
D | Out-US | 11 | 0.3438 |
E | In-US | 3295 | 0.8605 |
E | Out-US | 534 | 0.1395 |
M | In-US | 257 | 0.9179 |
M | Out-US | 23 | 0.0821 |
OTHER | In-US | 194 | 0.7405 |
OTHER | Out-US | 68 | 0.2595 |
P | In-US | 10 | 1 |
S | In-US | 2164 | 0.8543 |
S | Out-US | 369 | 0.1457 |
SP | In-US | 63 | 0.8750 |
S | Out-US | 9 | 0.1250 |
→ D는 미국 내 거주 비중이 높은 것으로 보아 해외 지사장 같은 직책일 수 있다.
→ C도 해외 지사에 가서 업무 프로세스를 개선하는 등 업무를 해야하니 해외 지사로 나가는 경우가 많은 것 같다.
※ 범수형 변수와 숫자형 변수 사이에 상관계수를 알아보기 위해서는 'point biserial 상관계수'를 사용하면 구할 수 있다.
3단계. 분석 결론 내리기
회고
JOIN의 개념은 알겠는데 어떻게 조인되는지 머릿속으로 잘 그려지지 않음... 노트로 그려보면서 해야겠다.