Python/Python Pandas

Python Pandas : Percentile Rank 계산하기 (백분위 계산하기)

CosmosProject 2024. 3. 25. 23:20
728x90
반응형

 

 

 

pandas DataFrame에서 어떻게 Percentile Rank를 계산하는지 봅시다.

 

(백분위, 백분위수에 대한 이해를 기반으로 합니다. 백분위 관련 개념 습득을 위해서는 아래 글을 참고하면 좋습니다.)

https://cosmosproject.tistory.com/826

 

백분위(Percentile Rank), 백분위수(Percentile), 사분위수(Quartile) 알아보기

수학, 통계, 데이터 분석 등 다양한 곳에서 백분위라는 말이 쓰입니다. 수능 성적을 받아도 백분위라는 것이 있죠. 이 백분위라는 것이 무엇이고, 왜/어떻게 쓰이며, 어떻게 계산할 수 있는지 알

cosmosproject.tistory.com

 

 

 

 

import pandas as pd

dict_test = {
    'col1': [
        10,
        20,
        30,
        40,
        50,
        60,
        70,
        80,
        90,
        100,
        110
    ]
}

df = pd.DataFrame(dict_test)

df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
                                           method='min',
                                           pct=False,
                                           na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)




-- Result
    col1  rank  value_count  percentile_rank
0     10   1.0           11              0.0
1     20   2.0           11              0.1
2     30   3.0           11              0.2
3     40   4.0           11              0.3
4     50   5.0           11              0.4
5     60   6.0           11              0.5
6     70   7.0           11              0.6
7     80   8.0           11              0.7
8     90   9.0           11              0.8
9    100  10.0           11              0.9
10   110  11.0           11              1.0

 

백분위(Percentile Rank)를 직접적으로 한 번에 구해주는 것은 없습니다.

따라서 위처럼 값들의 Rank를 구하고 값들의 개수를 구하여 이를 기반으로 백분위를 구해야 합니다.

 

 

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [
        10,
        20,
        30,
        40,
        50,
        60,
        70,
        80,
        90,
        100,
        110
    ]
}

df = pd.DataFrame(dict_test)

df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
                                           method='min',
                                           pct=False,
                                           na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)

print(np.percentile(
    a=list(df.loc[:, 'col1']),
    q=10
))


-- Result
    col1  rank  value_count  percentile_rank
0     10   1.0           11              0.0
1     20   2.0           11              0.1
2     30   3.0           11              0.2
3     40   4.0           11              0.3
4     50   5.0           11              0.4
5     60   6.0           11              0.5
6     70   7.0           11              0.6
7     80   8.0           11              0.7
8     90   9.0           11              0.8
9    100  10.0           11              0.9
10   110  11.0           11              1.0

20.0

 

계산된 백분위를 검증하기 위해 numpy의 percentile method를 사용하여 백분위 10% 위치에 있는 백분위수가 무엇인지 구해보았습니다.

 

20이 결과로 출력되는데

DataFrame에서 백분위 0.1(= 10%)인 값을 보면 20인 것을 알 수 있습니다.

잘 구해진 것을 알 수 있죠.

 

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [
        -30,
        -20,
        -10,
        40,
        50,
        60,
    ]
}

df = pd.DataFrame(dict_test)

df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
                                           method='min',
                                           pct=False,
                                           na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)

print(np.percentile(
    a=list(df.loc[:, 'col1']),
    q=10
))



-- Result
   col1  rank  value_count  percentile_rank
0   -30   1.0            6              0.0
1   -20   2.0            6              0.2
2   -10   3.0            6              0.4
3    40   4.0            6              0.6
4    50   5.0            6              0.8
5    60   6.0            6              1.0

-25.0

 

위처럼 값에 음수가 있어도 상관 없습니다.

 

 

 

import pandas as pd
import numpy as np

dict_test = {
    'col1': [
        -30,
        -30,
        -10,
        40,
        50,
        60,
    ]
}

df = pd.DataFrame(dict_test)

df.loc[:, 'rank'] = df.loc[:, 'col1'].rank(ascending=True,
                                           method='min',
                                           pct=False,
                                           na_option='bottom')
df.loc[:, 'value_count'] = len(df.loc[:, 'col1'])
df.loc[:, 'percentile_rank'] = (df.loc[:, 'rank'] - 1.0) / (df.loc[:, 'value_count'] - 1.0)
print(df)

print(np.percentile(
    a=list(df.loc[:, 'col1']),
    q=10
))



-- Result
   col1  rank  value_count  percentile_rank
0   -30   1.0            6              0.0
1   -20   2.0            6              0.2
2   -20   2.0            6              0.2
3    40   4.0            6              0.6
4    50   5.0            6              0.8
5    60   6.0            6              1.0

-25.0

 

또한 동일한 값이 존재해도 상관 없이 백분위를 구할 수 있습니다.

 

 

 

 

 

728x90
반응형