# Boxplot으로 분포 시각화하기
fig, ax = plt.subplots(figsize=(8,3))
ax.boxplot([df["working_hours"],df["salary"], df["last_year_salary"], df["num_companies_worked"]])
ax.set_xticklabels(["working_hours", "salary","last_year_salary","num_companies_worked"])
# 변수 간에 수치 차이가 크기 때문에 한 눈에 보기 어려움. -> 분리해서 보자
fig, (ax1, ax2) = plt.subplots(1, 2, figsize = (8, 3))
ax1.boxplot([df["working_hours"],df["num_companies_worked"]])
ax1.set_xticklabels(["working_hours", "num_companies_worked"])
ax2.boxplot([df["salary"], df["last_year_salary"]])
ax2.set_xticklabels(["salary", "last_year_salary"])
#working_hours와 salary는 각 데이터 분포에 비해 상당히 멀리 떨어져 있음. #num_companies_worked는 상대적으로 가깝게 분포해있지만 일부 outliers로 의심되는 데이터 포인트들이 있음. 직접 눈으로 확인해보기!
# histogram
"""working_hours"""
fig, ax = plt.subplots(figsize = (5,3))
df["working_hours"].plot(kind="hist", ax = ax)
# 큰 값부터 작은 값으로 나열한 뒤, 상위 10개만 뽑기print(df["working_hours"].sort_values(ascending=False).head(10))
# 상위 7개의 index만 저장하기 -> 나중에 drop하거나 대체할 수 있음.
working_hours_top_idx = df["working_hours"].sort_values(ascending=False).head(7).index
q1 = np.quantile(df["num_companies_worked"], 0.25) # 1분위 값
q2 = np.quantile(df["num_companies_worked"], 0.50) # 2분위 값
q3 = np.quantile(df["num_companies_worked"], 0.75) # 3분위 값
iqr = q3 - q1
fig, ax = plt.subplots(figsize = (4,4))
ax.boxplot(df["num_companies_worked"])
ax.set_xticklabels(["num_companies_worked"])
ax.plot([0.9,1.1], [q1, q1], c = "red", linestyle="--")
ax.plot([0.9,1.1], [q3, q3], c = "green", linestyle="--")
ax.plot([0.9,1.1], [q3+1.5*iqr, q3+1.5*iqr], c = "blue", linestyle="--")
# 1.5를 늘리면 iqr 범위를 더 넉넉하게 가져갈 수 있음. (정상 분포라고 여겨지는 범위를 늘리는 것-> outlier는 더 줄어들것)
# 이 파란 점선을 넘어가는 친구들을 outlier 후보라고 볼 수 있음.
# matplotlib - boxplot의 노란 선은 중앙값을 의미한다.
# iqr 범위에서 벗어난 데이터 추출
outliers =
df[(df["num_companies_worked"] < q1 - 1.5 * iqr) | (df["num_companies_worked"] > q3 + 1.5 * iqr)]
outliers