Pandas 데이터 프레임에서 열 정규화

Sathiya Sarathi 2023년10월10일
  1. Pandas의 데이터 정규화
  2. 평균정규화로 Pandas 데이터 프레임 정규화
  3. 최소-최대정규화로 Pandas 데이터 프레임 정규화
  4. quantile 정규화로 Pandas 데이터 프레임 정규화
Pandas 데이터 프레임에서 열 정규화

데이터의 표준화 또는 정규화는 기능 엔지니어링의 초기 단계입니다. 열의 정규화에는 열의 값을 공통 척도로 가져 오는 것이 포함되며, 주로 다양한 범위의 열에 대해 수행됩니다. Pandas에서 Dataframe의 열은 다양한 함수로 정규화 할 수 있습니다. 이 기사는 이러한 기능을 연습하고 올바른 상황에서 기능을 적용하는 데 도움이됩니다.

Pandas의 데이터 정규화

가장 널리 사용되는 두 가지 데이터 정규화 방법이 있습니다.

  • 평균 정규화
  • 최소-최대 정규화
  • 분위수 정규화

Pandas에서 데이터 정규화를 수행하는 데 사용할 수있는 특정 방법은 없습니다. 이러한 정규화가 무엇인지, 네이티브 Pandas와 네이티브 Python 함수에서 약간의 터치를 사용하여 구현할 수있는 방법을 설명합니다.

다음 스 니펫을 모든 곳에서 사용하여 아래와 같이 임의의 요소로 데이터 프레임을 생성합니다.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
print(df)

아래와 같이 유사한 데이터 프레임을 반환합니다.

     A   B   C   D
0   72 -53  17  92
1  -33  95   3 -91
2  -79 -64 -13 -30
3  -12  40 -42  93
4  -61 -13  74 -12
5  -19  65 -75 -23
6  -28 -91  48  15
7   97 -21  75  92
8  -18  -1  77 -71
9   47  47  42  67
10 -68  93 -91  85
11  27 -68 -69  51
12  63  14  83 -72
13 -66  28  28  64
14 -47  33 -62 -83
15 -21  32   5 -58
16  86 -69  20 -99
17 -35  69 -43 -65
18   2  19 -89  74
19 -18  -9  28  42

[20 rows x 4 columns]

평균정규화로 Pandas 데이터 프레임 정규화

평균정규화는 다양한 범위의 데이터 프레임을 정규화하는 가장 쉬운 방법 중 하나입니다. 정규화는 데이터 프레임의 모든 요소에 대해 평균을 빼고 표준 편차로 나누어 수행됩니다.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def mean_norm(df_input):
    return df_input.apply(lambda x: (x - x.mean()) / x.std(), axis=0)


df_mean_norm = mean_norm(df)
print(df_mean_norm)

출력:

           A         B         C         D
0   1.452954 -1.090261  0.278088  1.247208
1  -0.514295  1.585670  0.037765 -1.333223
2  -1.376137 -1.289148 -0.236890 -0.473079
3  -0.120845  0.591236 -0.734701  1.261309
4  -1.038895 -0.367037  1.256545 -0.219266
5  -0.251995  1.043252 -1.301176 -0.374374
6  -0.420617 -1.777325  0.810231  0.161453
7   1.921346 -0.511681  1.273711  1.247208
8  -0.233260 -0.150069  1.308043 -1.051208
9   0.984561  0.717801  0.707236  0.894690
10 -1.170045  1.549509 -1.575831  1.148503
11  0.609847 -1.361470 -1.198181  0.669079
12  1.284333  0.121140  1.411038 -1.065309
13 -1.132573  0.374269  0.466913  0.852388
14 -0.776595  0.464672 -1.078020 -1.220417
15 -0.289467  0.446591  0.072097 -0.867899
16  1.715254 -1.379551  0.329586 -1.446028
17 -0.551766  1.115574 -0.751867 -0.966604
18  0.141455  0.211543 -1.541499  0.993395
19 -0.233260 -0.294714  0.466913  0.542172

Jupyter 노트북을 사용하는 경우 아래 코드와 같이Matplotlib를 사용하여 두 데이터 프레임을 시각화 할 수 있습니다.

# %matplotlib inline
df["A"].plot(kind="bar")

정규화 전에 데이터 프레임의 A열을 선택하고 막대 차트를 시각화하면 y 축에 -100에서 100 사이의 값이 포함됩니다.

평균 정규화-정규화 전

# %matplotlib inline
df_mean_norm["A"].plot(kind="bar")

아래 그림은 정규화 후 데이터를 보여줍니다. 동일한 열이 시각화되면 y 축은 -1.5에서 +1.5 범위에 있습니다.

평균 정규화-정규화 후

최소-최대정규화로 Pandas 데이터 프레임 정규화

이것은 정규화에 널리 사용되는 방법 중 하나입니다. 정규화 출력은 데이터 프레임의 최소값을 빼고 해당 열의 최고 값과 최저값의 차이로 나눕니다.

import pandas as pd
import numpy as np

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def minmax_norm(df_input):
    return (df - df.min()) / (df.max() - df.min())


df_minmax_norm = minmax_norm(df)

print(df_minmax_norm)

출력:

           A         B         C         D
0   0.857955  0.204301  0.620690  0.994792
1   0.261364  1.000000  0.540230  0.041667
2   0.000000  0.145161  0.448276  0.359375
3   0.380682  0.704301  0.281609  1.000000
4   0.102273  0.419355  0.948276  0.453125
5   0.340909  0.838710  0.091954  0.395833
6   0.289773  0.000000  0.798851  0.593750
7   1.000000  0.376344  0.954023  0.994792
8   0.346591  0.483871  0.965517  0.145833
9   0.715909  0.741935  0.764368  0.864583
10  0.062500  0.989247  0.000000  0.958333
11  0.602273  0.123656  0.126437  0.781250
12  0.806818  0.564516  1.000000  0.140625
13  0.073864  0.639785  0.683908  0.848958
14  0.181818  0.666667  0.166667  0.083333
15  0.329545  0.661290  0.551724  0.213542
16  0.937500  0.118280  0.637931  0.000000
17  0.250000  0.860215  0.275862  0.177083
18  0.460227  0.591398  0.011494  0.901042
19  0.346591  0.440860  0.683908  0.734375

위 출력에서각 열의 최소값이 0으로 변환되고 각 열의 최대 값이 1로 변환되는 것으로 추론 할 수 있습니다.

이 정규화에 대한 열 A는 아래와 같이 시각화됩니다.

# %matplotlib inline
df_minmax_norm["A"].plot(kind="bar")

최소-최대 정규화-정규화 후

이것은 근거리 데이터 프레임에 적합하지만 MinMax 정규화는 이상 값이 많은 데이터 프레임에 적합하지 않을 수 있습니다.

quantile 정규화로 Pandas 데이터 프레임 정규화

분위수 정규화는 고차원 데이터 분석의 경우에 사용됩니다. 모든 컬럼의 통계적 분포가 동일하다고 관찰하고 가정합니다. 분위수 정규화는 다음 단계로 구성됩니다.

  1. 각 열의 순서 값 (순위)
  2. 각 행에서 평균을 내고 행의 각 요소 값을 평균으로 바꿉니다.
  3. 값을 처음과 같이 원래 주문으로 다시 정렬합니다.
import numpy as np
import pandas as pd

np.random.seed(0)

df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))


def quantile_norm(df_input):
    sorted_df = pd.DataFrame(
        np.sort(df_input.values, axis=0), index=df_input.index, columns=df_input.columns
    )
    mean_df = sorted_df.mean(axis=1)
    mean_df.index = np.arange(1, len(mean_df) + 1)
    quantile_df = df_input.rank(method="min").stack().astype(int).map(mean_df).unstack()
    return quantile_df


df_quantile_norm = quantile_norm(df)

print(df_quantile_norm)

출력:

        A      B      C      D
0   77.00 -58.25   8.25  77.00
1  -36.50  92.00 -10.50 -79.25
2  -90.00 -66.50 -20.00 -20.00
3   24.75  44.00 -36.50  92.00
4  -66.50 -36.50  71.75  -3.00
5   -3.00  71.75 -73.00 -10.50
6  -20.00 -90.00  54.00   8.25
7   92.00 -41.00  77.00  77.00
8    8.25 -10.50  87.00 -58.25
9   54.00  54.00  44.00  44.00
10 -79.25  87.00 -90.00  71.75
11  44.00 -73.00 -66.50  24.75
12  71.75  -3.00  92.00 -66.50
13 -73.00  18.00  24.75  31.75
14 -58.25  31.75 -58.25 -73.00
15 -10.50  24.75  -3.00 -36.50
16  87.00 -79.25  18.00 -90.00
17 -41.00  77.00 -41.00 -41.00
18  31.75   8.25 -79.25  54.00
19   8.25 -20.00  24.75  18.00

분위수 정규화에 대한 출력은 아래와 같이 열 A에 대해 시각화 할 수 있습니다.

분위수 정규화-정규화 후

관련 문장 - Pandas DataFrame

관련 문장 - Pandas DataFrame Column