분위수 변환(quantile transformation)

1. quantile transformation의 이론적인 설명

 

 

주어진 데이터 x1,x2,...,xn의 분포를 그려보니 다루기 힘들거나 마음에 안들어서 분포를 변환할 필요가 있다고 합시다.

 

주어진 데이터 x1,x2,...,xn의 분포를 나타내는 누적확률분포함수 F(x)를 먼저 구해봅시다.

 

그런데 관측된 값으로는 이것을 구할 수 없으니 경험적 분포함수로 누적확률분포함수를 추정합니다.

 

주어진 데이터 xi에 대하여 F(X)F(xi)로 추정했다고 합시다.

 

분포함수에 관한 theorem 1에서 "X의 누적확률분포함수가 F(x)라면 확률변수 Y=F(X)U(0,1)을 따른다라고 했습니다.

 

이것이 무슨 의미를 가지냐면 경험적 분포함수를 이용하여 각 데이터 xi에 대하여 추정된 누적확률분포함수 F(x1),F(x2),...,F(xn)U(0,1)을 따른다는 것입니다.

 

이제 x1,x2,...,xn의 분포를 바꾸고자하는 target 분포가 있을 것입니다.

 

원하는 확률분포면 아무거나 상관없지만 보통은 uniform distribution이나 normal distribution으로 바꿉니다.

 

편의상 예를 들어 normal distribution으로 바꾸고 싶다고 합시다.

 

normal distribution은 너무나 특별해서 누적확률분포함수를 기호로 XN(0,1)이면 P(Xx)=ϕ(x)으로 표시합니다.

 

이제 분포함수에 관한 theorem 2를 보면 연속확률변수 YU(0,1)을 따르고 (중간 생략) 그렇다면 연속확률변수 X=F1(Y)F(x)를 누적확률분포함수(cumulative distribution function)로 가진다.”라고 했습니다.

 

이것이 무슨 의미를 가지는지 생각해보면

 

바꾸고 싶어하는 누적확률분포함수 F(x)의 역함수 F1(x)U(0,1)을 따르는 값들을 넣어주기만 하면 원하는 확률분포를 가지는 데이터로 바꿀 수 있다는 것을 의미합니다.

 

그러므로 우리의 데이터 x1,x2,...,xnN(0,1)을 따르도록 바꾸고 싶다면

 

x1,x2,...,xnU(0,1)을 따르도록 추정된 누적확률분포함수(경험적 분포함수)에 넣어서 F(x1),F(x2),...,F(xn)을 구했고 

 

이것을 바꾸기를 원하는 N(0,1)의 누적확률분포함수인 P(Xx)=ϕ(x)의 역함수인 ϕ1(x)에 집어넣기만 한다면

 

, ϕ1(F(x1)),ϕ1(F(x2)),...,ϕ1(F(xn))가 바로 N(0,1)을 따른다는 것입니다.

 

바로 우리가 가지고 있는 xiyi=ϕ1(F(xi))mapping 시키는 작업이 바로 quantile transformation입니다.

 

그런데 왜 quantile이냐? 누적확률분포함수의 역함수, normal의 경우 ϕ1(x)quantile을 구해주는 quantile function이기 때문입니다.

 

 

2. quantile transformation의 구현

 

이론적인 설명에 따라 직접 원하는 함수의 quantile function을 이용하여 구현할 수 있습니다.

 

scipy에서 여러가지 probability distribution function을 제공합니다.

 

혹은 sklearn에서 quantile transformation 함수를 제공합니다.

 

sklearn.preprocessing.quantile_transform — scikit-learn 1.0.1 documentation

 

sklearn.preprocessing.quantile_transform

Examples using sklearn.preprocessing.quantile_transform: Effect of transforming the targets in regression model Effect of transforming the targets in regression model,

scikit-learn.org

 

728x90