[Pandas 기초] 구간 나누기 | cut()과 qcut() 차이와 활용

soyyeong·2023년 2월 20일
0
post-thumbnail

어떤 데이터를 구간에 따라 나눠서 새로운 값을 지정하고 싶을 때가 있다. if 문을 활용해 지정할 수도 있겠지만 판다스에는 더욱 효율적인 방법이 존재한다.

cut은 절대평가이다. 특정 점수를 부여하면 그 점수를 경계로 성적이 부여되는 절대평가와 비슷하고, qcut은 상위 몇 %인지에 따라 성적이 부여되는 상대평가와 비슷하다.
출처

9명의 학생의 점수가 다음과 같이 있을 때 수학과 영어 등급을 매기고자 한다.

df = pd.DataFrame(
    {'수학점수' : [55, 73, 100, 90, 85, 62],
     '영어점수' : [100, 88, 99, 70, 52, 79]},)

수학점수는 상대평가로 등급이 결정되고, 영어점수는 절대평가로 등급이 결정된다고 할 때 다음 6명의 학생의 수학과 영어 등급을 각각 새로운 열로 할당하고자 한다.


cut() 활용 : 절대구간 나누기

  • 영어 절대평가 기준
이상이하
1등급90100
2등급8089
3등급7079
4등급069

영어 등급은 절대평가니 cut()을 사용해보자.

grades = ['4등급', '3등급', '2등급', '1등급']
cut_bins = [0, 69, 79, 89, 100]

df['영어등급'] = pd.cut(df['영어점수'], bins = cut_bins, labels = grades)

cut() 오류해결

  • bins must increase monotonically
    만약 cut_bins 부분을 오름차순이 아닌 내림차순으로 지정하면 다음과 같은 오류가 난다.
  • ValueError: Bin labels must be one fewer than the number of bin edges
    labels 원소 개수가 bins 원소 개수보다 하나 작게 설정해야 한다.

qcut() 활용 : 상대구간 나누기

수학은 상대평가니 qcut()을 활용한다.
다음과 같은 평가 기준이 있을 때 등급을 나눠보자.

pd.qcut(x, q, labels=None, retbins = False, precision = 3, duplicates = 'raise')

  • x 에는 우리가 넣을 수학 점수인 df['수학점수']를 넣으면 된다.
  • q 에는 몇 분위수인지 넣으면 된다. 10분위수는 10을 입력
  • 내가 원하는 분위수를 넣고 싶다면 float형태로 시퀀스 자료형을 입력한다.
    [0, 0.25, 0.5, 0.75, 1.] 처럼 입력할 수 있다.

기본 사용법은 다음과 같고, 더 자세한 활용이 궁금하다면 여기 클릭

  • 수학 상대평가 기준
    사분위수로 4개의 등급을 나눈다.
grades = ['4등급', '3등급', '2등급', '1등급']
df['수학등급'] = pd.qcut(df['수학점수'], 4, labels = grades)
  • 상대평가인 수학의 커트라인이 궁금하다면?
pd.qcut(df['수학점수'],q=4)
아래에 커트라인이 출력된다.

사분위수의 경우, describe()로 출력 가능하다.

df['수학점수'].describe()
profile
블로그 이전 중입니다 : https://soyeong-blog.netlify.app/

0개의 댓글