ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python Pandas] 데이터 분할, 데이터 균등 분할 (cut, qcut)
    IT/Pandas 2022. 9. 27. 16:36

    Python Pandas 라이브러리를 이용하여 데이터를 분할하는 함수

    pandas.cut 과 pandas.qcut을 알아보겠습니다.

     


     

    pandas.cut


    : pandas.cut은 특정 배열에서 데이터 값을 구간으로 분할하고 정렬이 필요할 경우 사용합니다.

    연속된 데이터 변수 값을 범주형(categorical) 데이터 변수 값으로 변경할 때 유용합니다.


    Pandas.cut을 사용하여 배열을 분할하는 기본 방법을 살펴봅니다.

     

    In [1] :

     

    # 넘파이 라이브러리 임포트
    import numpy as np
    # 판다스 라이브러리 임포트
    import pandas as pd
    # 나이 배열 선언
    age_array = np.array([5,15,25,35,45,55,65])
    # pandas.cut 사용 , 6개의 구간으로 데이터를 분할
    pd.cut(age_array, 6)

    Out [1] :

    pd.cut(age_array, 6) 결과

      위의 결과와 같이 age_array의 값을 6개의 동일한 길이의 구간으로 분할된 것을 확인할 수 있습니다.

     

     

    pandas.cut parameters


      pandas.cut function은 다양한 매개변수(parameters)가 있습니다.

    주로 사용되는 매개변수의 역할을 간략하게 살펴봅니다.

     

    pandas.cut function 's parameters

     

    • x : Array-like
      • 구간을 나누고자 하는 연속된 데이터 배열. 즉 input 값입니다.

    • bins : Int, Sequence of scalars or IntervalIndex
      • Int : 입력한 정수 값을 기준으로 동일한 길이의 int 수 만큼 구간이 분할 됩니다.
      • Sequence of scalars : 분할되는 구간을 사용자가 지정하여, 동일하지 않은 길이의 구간으로 분할합니다.

    Sequnce_of_scalars 예시

     

    • right : bool, default True
      • 구간의 오른쪽을 포함할지 말지 (닫을지 열지)를 결정하는 매개변수입니다.
        예를 들어 (0, 20] 이라는 범위는 0 < x <= 20을 뜻하며, 왼쪽은 열려있고 오른쪽은 닫혀있다라고 표현합니다.

    • labels : array or False, default None
      • pandas.cut을 사용해서 분할되는 구간에 label을 지정합니다.
      • 반드시 분할되는 구간의 갯수와 동일한 갯수의 label 값을 입력으로 주어야 합니다.

    Labels 예시

     

    • retbins : bool, default None
      • 입력 데이터로부터 분할한 구간 정보 (bins)를 return 받을 지를 결정하는 매개변수입니다.

    Retbins 예시

     


     

    pandas.qcut


    :  pandas.qcut은 특정 배열에서 데이터 값을 구간으로 분할하지만, 구간에 속하는 데이터의 수가 동일하도록

    구간을 나누기 위해 사용합니다.

    pandas.cut : 분할 구간을 데이터의 값 범위 기준으로 분할
           vs
    pandas.qcut : 분할 구간을 구간에 속하는 데이터의 수 기준으로 분할

     사용 방법은 pandas.cut과 유사합니다.

    keras에서 제공하는 boston_housing dataset의 일부를 가져와 살펴봅니다.

     

    In [2] :

    # 텐서플로 라이브러리 임포트
    import tensorflow as tf
    # Boston_housing 데이터셋 임포트
    from tensorflow.keras.datasets import boston_housing
    # 판다스 라이브러리 임포트
    import pandas as pd
    
    # 불러온 데이터 분할 (price만 살펴볼 예정)
    (train_X, price), (test_X, test_Y) = boston_housing.load_data()
    
    # Price array 값을 갖는 Dataframe 생성
    original_df = pd.DataFrame(price , columns ={"price"})
    original_df

     

    Out [2] :

    price Dataframe

      해당 데이터를 살펴보면 총 404개의 데이터루 구성되어 있으며 최소값 5, 최대값 50을 확인할 수 있습니다.

    "price" column 데이터의 min / max 값

     

      위에서 생성한 dataframe을 사용하여 price column의 데이터를 "cut"과 "qcut" 둘 다 5개의 구간으로 분할을 합니다.

    # pandas.cut 사용 시
    In [3] :
    original_df["price_cut_categories"] = pd.cut(original_df["price"], 5)
    original_df["price_cut_categories"].value_counts()
    
    Out [3] :
    (14.0, 23.0]     194
    (23.0, 32.0]      94
    (4.955, 14.0]     64
    (32.0, 41.0]      27
    (41.0, 50.0]      25
    Name: price_cut_categories, dtype: int64
    
    # pandas.qcut 사용 시
    In [4] :
    original_df["price_qcut_categories"] = pd.qcut(original_df["price"], 5)
    original_df["price_qcut_categories"].value_counts()
    
    Out [4] :
    (4.999, 15.16]    81
    (15.16, 19.42]    81
    (22.58, 27.94]    81
    (27.94, 50.0]     81
    (19.42, 22.58]    80
    Name: price_qcut_categories, dtype: int64

     

      "cut" function의 경우 5개의 동일한 길이의 구간으로 분할된 것을 확인할 수 있고,

    "qcut" function의 경우 각 구간마다 포함되는 데이터의 수가 동일하게 5개의 구간으로 분할된 것을 확인할 수 있습니다.

     

    추가로 qcut을 어떻게 활용할 수 있는지에 살펴보면

    "qcut"의 retbin 매개변수를 사용하여 구간 값을 별도로 변수에 저장하여 "cut" function의

    "bins" 매개변수의 값으로 사용 가능합니다.

     

    In [5] :
    # DataFrame 다시 생성
    original_df = pd.DataFrame(price , columns ={"price"})
    
    # cut function을 사용하여 "price_cut_category" 생성
    original_df["price_cut_category"] = pd.cut(original_df["price"], 5)
    
    # qcut function을 사용하여 "price_qcut_category" 생성 및 범주형(categorical) 구간 변수를 return받아 retbins에 저장
    original_df["price_qcut_category"], retbins = pd.qcut(original_df["price"], 5, retbins = True)
    
    # 위의 qcut function에서 return받은 retbins를 사용하여 "new_category" 생성
    original_df["new_category"] = pd.cut(original_df["price"], bins = retbins)
    
    # 최종 비교
    original_df

     

    Out [5] :

    cut / qcut / cut (qcut retbins 사용)

     

      위의 그림과 같이 qcut으로 데이터를 바로 분할한 "price_qcut_category" column의 데이터 값과 qcut에서 반환 받은 retbins 변수를 사용하여 cut으로 데이터를 분할한 "new_category" column의 데이터 값이 동일한 것을 확인할 수 있습니다.

     

     

    pandas.qcut parameters


      pandas.qcut function은 pandas.cut function에 비해 매개변수가 적습니다.

    기본적으로 pandas.cut function과 사용 방법과 매개변수는 동일함으로, 차이점인 "q"에 대해 살펴봅니다.

     

    pandas.qcut's parameters

     

    • q : int or list-like of float
      • 데이터 구간을 몇개로 나누고 싶은지에 대한 매개변수입니다.
      • [0, .2, .5, .75, 1.]과 같은 float형 list로 매개변수 값을 주어서 구간 당 포함되는 데이터 수를 동일하지 않게 변경하는 것도 가능합니다.


    pandas 라이브러리에서 제공하는 데이터 분할 함수인 .cut과 .qcut에 대해 알아봤습니다.

    많은 도움이 되었기를 바랍니다.

     

    공식 문서는 아래를 참고 바랍니다.

     

    https://pandas.pydata.org/docs/reference/api/pandas.cut.html#pandas.cut

    https://pandas.pydata.org/docs/reference/api/pandas.qcut.html#pandas.qcut

     

    pandas.qcut — pandas 1.5.0 documentation

    Number of quantiles. 10 for deciles, 4 for quartiles, etc. Alternately array of quantiles, e.g. [0, .25, .5, .75, 1.] for quartiles.

    pandas.pydata.org

     

    pandas.cut — pandas 1.5.0 documentation

    Indicates whether bins includes the rightmost edge or not. If right == True (the default), then the bins [1, 2, 3, 4] indicate (1,2], (2,3], (3,4]. This argument is ignored when bins is an IntervalIndex.

    pandas.pydata.org

     

Designed by Tistory.