ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pandas 데이터 분석 - group by를 이용한 집계(sum, count, min, max, mean, median, std, var, quantile, describe, agg)
    데이터분석/파이썬 2021. 12. 11. 12:34
    반응형

    https://kbkb456.tistory.com/86

     

    pandas 데이터 분석 4 - apply, map를 활용해서 컬럼 연산해보기

    https://kbkb456.tistory.com/85 pandas 데이터 분석 3 - 데이터 합치기(merge, append, inner join, left outer join, right outer join, full outer join) https://kbkb456.tistory.com/84 pandas 데이터 분석 2..

    kbkb456.tistory.com

    오늘은 dataframe에서 group by를 통해서 데이터를 집계하는 법에 대해서 배워보도록 하겠습니다.

     

    1. group by는 어떤 상황에서 활용하는 걸까요?

    바로 그룹별 어떤 집계연산(sum, count, mean, max, min...)을 활용할 때 쓰는 함수 입니다.

     

    - 월별 통계를 매출 평균

    - 월별 인당 야근 수

    - 인당 남은 휴일 수

     

    기초가 되는 데이터에서 위의 데이터들을 구할 때 활용하는데요. 이럴 때 group by 가 되는 부분 집계 함수가 되는 부분을 잘 읽어줘야 합니다.

     

    - 월별 통계를 매출 평균

        - 월별: group by

        - 매출 평균: 집계함수(mean)

     

    - 월별 인당 야근 수

        - 월별: group by

        - 인당 야근 수: 집계함수(mean)

     

    - 인당 남은 휴일 수

        - 인당: group by

        - 남은 휴일 수: 집계함수(sum)

     

    이렇게 분석 지표를 해석하는 것 부터 시작하는 것입니다.

     

    2. group by와 활용할 수 있는 함수는 무엇이 있을까요?

    예시 데이터 프레임

    오늘도 등장한 야근수당

    문법

    - 데이터프레임.groupby(그룹이되는컬럼)[계산하고 싶은 컬럼].집계함수()

     

    함수의 종류

     

    - 중심 경향을 계산하는 함수: mean(평균), median(중위수)

     

    월별 수당의 중심 경향을 계산한다고 생각해 봅시다.

     

    이 문장을 이렇게 정리해봅시다.

     

    월별 수당의 중심 경향

    - 그룹이 되는 컬럼: 월

    - 계산하고 싶은 컬럼: 수당

    - 집계함수: mean, median

     

    이렇다면 아래처럼 코딩 될 것입니다.

    #월별 수당의 평균값
    df.groupby("월")['수당'].mean()
    
    #월별 수당의 중앙값
    df.groupby("월")['수당'].median()

    실행결과

    pandas group by mean, median

     

     

    - 총 숫자를 계산하는 함수: count(개수), sum(합산)

     

    인당 남은 휴가의 총 수월별 직원 수를계산한다고 생각해 봅시다.

     

    이 문장들을 이렇게 정리해봅시다.

     

    인당 남은 휴가의 총 수

    - 그룹이 되는 컬럼: 인당(사람)

    - 계산하고 싶은 컬럼: 휴일

    - 집계함수: sum

     

    월별 직원 수

    - 그룹이 되는 컬럼: 월별

    - 계산하고 싶은 컬럼: 이름

    - 집계함수: count

     

    이렇다면 아래처럼 코딩 될 것입니다.

    #인당 남은 휴가의 총 수
    df.groupby("이름")['휴일'].sum()
    
    #월별 직원 수
    df.groupby("월")['이름'].count()

    실행결과

    pandas group by sum, count

     

     

    - 최소 최대를 계산하는 함수: min(최소), max(최대)

     

    월별 남은 휴가의 최대와 최소 수를 계산한다고 생각해 봅시다.

     

    이 문장을 이렇게 정리해봅시다.

     

    월별 남은 휴가의 최대와 최소 수

    - 그룹이 되는 컬럼: 월

    - 계산하고 싶은 컬럼: 휴일

    - 집계함수: max, min

     

    이렇다면 아래처럼 코딩 될 것입니다.

    #월별 남은 휴가의 최대
    df.groupby("월")['휴일'].max()
    
    #월별 남은 휴가의 최소
    df.groupby("월")['휴일'].min()

    실행결과

    pandas group by min, max

     

     

    - 해당 데이터의 퍼짐정도를 나타내는 함수: std(표준편차), var(분산), quantile(특정 백분위)

     

    월별 야근의 표준편차와, 분산, 그리고 상위 10%의 야근일수를 계산하다고 해봅시다.

     

    이 문장을 이렇게 정리해봅시다.

     

    월별 야근의 표준편차와, 분산, 그리고 상위 10%의 야근일수

    - 그룹이 되는 컬럼: 월

    - 계산하고 싶은 컬럼: 야근일

    - 집계함수: std, var, quantile

     

    이렇다면 아래처럼 코딩 될 것입니다.

    #월별 야근의 표준편차
    df.groupby("월")['야근'].std()
    
    #월별 야근의 분산
    df.groupby("월")['야근'].var()
    
    #월별 상위 10%의 야근일수 -> 큰 순서대로 계산되기 때문에 상위 10%를 구하려면 0.9를 넣어줘야 함 
    df.groupby("월")['야근'].quantile(0.9)

    실행결과

    pandas group by std, var, quantile

     

    - 전반적인 지표를 뿌려주는 함수: describe

     

    월별로 전반적인 지표를 보고싶다면 describe를 활용하면 됩니다.

    df.groupby("월")['야근'].describe()

    월별 야근의 기초통계량

    3. agg와 multiple column group by(여러컬럼 groupby)

    분석을 하다보면 그룹조건이 여러개가 되는 경우가 있고 한번에 여러 컬럼을 다르게 연산해야 할 때가 있습니다.

     

    문법

    - 데이터프레임.groupby([컬럼1,컬럼2]).agg({계산하고싶은컬럼명1 : 집계함수 , 계산하고싶은컬럼명2 : 집계함수})

     

    예를들면

    월별 인당 휴일 평균과 야근 총합을 구해오세요. 라고 한다면 어떻게 해결할 수 있을까요?

     

    이 문장을 이렇게 정리해봅시다.

     

    월별 인당 휴일 평균과 야근 총합

    - 그룹이 되는 컬럼1, 컬럼2: 월, 이름

    - 계산하고 싶은 컬럼1, 컬럼2: 휴일, 야근

    - 집계함수: mean(평균), sum(총합)

     

    이렇게 코딩이가능할 것 입니다.

    df.groupby(["월","이름"]).agg({"휴일":"mean","야근":"sum"})

    pandas multiple group by sum, mean

    reset_index로 index초기화해서 데이터 활용하기

    저렇게 계산된 형태에서는 월과 이름을 컬럼형태로 슬라이싱하는게 어렵습니다.

    컬럼명 자체가 인덱스로 들어가있다.

    왜냐면 컬럼명 자체가 인덱스로 들어가 있기 때문입니다. 그래서 데이터프레임에서 이걸 컬럼으로 인지를 못합니다.

     

    그래서 만약 계산된 데이터 프레임에서 내가 이름컬럼을 가져다 쓰고싶다면 reset_index를 활용해주면 됩니다.

    g2_df = df.groupby(["월","이름"]).agg({"휴일":"mean","야근":"sum"}).reset_index()

    pandas reset_index() 함수

     

    https://colab.research.google.com/drive/1zO7mDkQUv3dbp7PiisXgjGR7V90dBRIc?usp=sharing 

     

    pandas 샘플코드.ipynb

    Colaboratory notebook

    colab.research.google.com

     

    반응형

    댓글

Designed by Tistory.