[Python] 대학원 입학과 스펙의 연관성 #6_이상치제거

Andy Oh Sae Ha·2022년 6월 26일
0
post-thumbnail

우리가 흔히 말하는 '스펙' (GRE 점수, Research 여부, TOEFL 시험 성적 등)이 대학원 입학에 미치는 영향과 가장 중요한 역할을 하는 요소에 관한 데이터 분석

#6 에서는 분석 결과에 대한 이상치를 제거하는 방법에 대해 알아 보겠습니다

***해당 분석은 Google Colab를 활용하여 출력한 자료들입니다


주요 이상치 제거 방법

SIGMA 활용

# 2시그마 이상치 제거
def remove_outliers_sigma(df, column_name):
  lower = df[column_name].mean() - (df[column_name].std()*2)
  upper = df[column_name].mean() + (df[column_name].std()*2)
  
  #min~max안에 포함되는 데이터만 저장
  removed_outliers = df[column_name].between(lower, upper)

  #기존 data size 이상치 제거 후 data size 비교
  bf = df[column_name].size
  print(str(df[column_name][removed_outliers].size) + "/" + str(bf) + "data points remain.")

  #이상치가 제거된 dataframe 반환
  index_names = df[~removed_outliers].index
  return df.drop(index_names)

위는 2시그마를 기준으로 이상치를 제거하였고 그 보다 더 크거나 작은 값을 입력할수도 있다

IQR (Interquartile Range) 활용

# IQR 이상치 제거
def remove_outliers_iqr15(df, column_name, lower, upper):
  iqr = abs(df[column_name].quantile(lower)-df[column_name].quantile(upper))

  removed_outliers = df[column_name].between(df[column_name].quantile(lower) - iqr*1.5, df[column_name].quantile(upper) + iqr * 1.5)

  print("max : " + str(df[column_name].quantile(upper) + iqr * 1.5) + "min : " + str(df[column_name].quantile(lower) - iqr * 1.5))
  bf = df[column_name].size
  print(str(df[column_name][removed_outliers].size) + "/" + str(bf) + "data points remain.")
  index_names = df[~removed_outliers].index
  return df.drop(index_names)

위는 2시그마를 기준으로 이상치를 제거하였고 그 보다 더 크거나 작은 값을 입력할수도 있다

이상치 제거 함수 적용 및 결과값 출력

sigma_data = remove_outliers_sigma(data, 'CGPA')
iqr_data = remove_outliers_iqr15(data, 'CGPA', 0.25, 0.75)

iqr15 함수를 활용한 값을 보면 1.5배에 대한 데이터 활용시 모든 데이터 값이 허용범위 값 안에 들어오며 무의미한 데이터를 가져오게 된다. 그러하여 아래와 같이 1.5배 하지 않은 함수를 적용하여 재출력하면

def remove_outliers(df, column_name, lower, upper):
  iqr = abs(df[column_name].quantile(lower)-df[column_name].quantile(upper))

  removed_outliers = df[column_name].between(df[column_name].quantile(lower) - iqr, df[column_name].quantile(upper) + iqr)

  print("max : " + str(df[column_name].quantile(upper) + iqr) + "min : " + str(df[column_name].quantile(lower) - iqr))
  bf = df[column_name].size
  print(str(df[column_name][removed_outliers].size) + "/" + str(bf) + "data points remain.")
  index_names = df[~removed_outliers].index
  return df.drop(index_names)

profile
데이터 분석가

0개의 댓글