-
통계-15 정규화, 표준화, 변환통계 2023. 6. 4. 16:23
1. 최소-최대 정규화(min-max-scaling)
min-max scaling은 데이터- 최소값/최대값-최소값 공식을 사용하며 모든 데이터를 0과 1 사이의 범위로 변환하는 것으로 정규화한다.
dates = pd.date_range(start= '2023-01-01',periods =100, freq='d') values = np.random.randint(0,100,size=100) data = pd.DataFrame({'date':dates , 'value':values}) min_value = data['value'].min() max_value = data['value'].max() data['value_normaized'] = (data['value']- min_value)/(max_value-min_value) print(data['value_normaized'].head()) 0 0.090909 1 0.636364 2 0.121212 3 0.808081 4 0.585859
min-max 공식을 이용하여 정규화를 실행하고 데이터를 확인하면 0과 1사이로 정규화된 것을 확인할 수 있다.
2. 표준화(z-score 정규화)
표준화는 정규분포의 속성을 가지도록 데이터를 평균이 0, 표준편차를 1로 바꿔버린다는 점에서 정규화와 차이점이 있다.
z-score는 평균과 표준편차를 사용하여 데이터가 얼마나 떨어져 있는지를 확인할 수 있다. 데이터 - 평균/ 표준편차 공식으로 구할 수 있다. 즉 데이터와 평균과의 거리를 표준편차로 정규화하여 standard-score라고도 부른다.
from sklearn.preprocessing import StandardScaler dates = pd.date_range(start= '2023-01-01',periods =100, freq='d') values = [10,12,11,15,9,13,8,14,10,16]*10 data = pd.DataFrame({'date':dates , 'value':values}) x= data['value'].values.reshape(-1,1) scaler = StandardScaler() X_scaled = scaler.fit_transform(x) data['value-scaled'] = X_scaled print(X_scaled) [[-0.71374643] [ 0.07930516] [-0.31722063] [ 1.26888254] [-1.11027222]
데이터를 생성하고 밸류값만 따로 추출한다. 추출한 값을 standardscaler에 집어넣고 정규화를 진행한다. 정규화를 거친 후 데이터들은 평균 0에서 1의 표준편차를 가지도록 변환된 것을 확인할 수 있다.
3. 로그 변환
로그 변환이란 데이터에 로그 함수를 적용하는 방법이다. 데이터에 로그를 씌우면 우선 데이터의 크기가 작아지기 때문에 이상치의 영향을 줄일 수 있고 치우쳐진 분포에서 로그를 씌우면 작은 쪽은 적당히 넓히고 큰 쪽은 좁힘으로써 데이터를 정규분포에 가깝게 만들 수 있다.
data = pd.DataFrame({'value':[10,20,30,40,50]}) data['logvalue']=np.log(data['value']) plt.plot(data['value'], label='original') plt.plot(data['logvalue'], label='log') plt.xlabel('index') plt.ylabel('value') plt.legend() plt.title('log') plt.show()
데이터 프레임을 생성한 후 로그함수에 넣어준다. 원본데이터와 비교해봤을 때 데이터가 훨씬 작아져 이상치에 대비할 수 있고 변동성이 작아진 모습이다.
4. 차분
차분은 연속한 값들의 차이를 계산하는 것이다. 현재의 시점에서 이전 데이터를 뺀 값으로 변화량을 의미한다.
data['diffvalue'] = data['value'].diff() print(data) value logvalue diffvalue 0 10 2.302585 NaN 1 20 2.995732 10.0 2 30 3.401197 10.0 3 40 3.688879 10.0 4 50 3.912023 10.0
diff 함수로 차분을 계산한다. 첫번째 값은 이전 값이 없으므로 결측치로 표시된다.
5. 박스-콕스 변환
박스 콕스 변환은 데이터의 정규성을 개선하기 위한 방법이다. y(lambda) = (x^lambda - 1) / lambda 박스 콕스 공식은 양수에만 사용가능하며 lambda의 값을 조정하여 데이터를 변환한다.
from scipy.stats import boxcox transformed_data ,lambda_ = boxcox(data['value']) print(transformed_data) plt.plot(transformed_data, label='box cox') plt.xlabel('index') plt.ylabel('value') plt.legend() plt.title('boxcox') plt.show()
boxcox 함수에 데이터를 넣어 람다 값과 변환된 데이터 값을 얻을 수 있다. 그래프로 그려보면 데이터를 정규 분포에 가깝게 만들어진 것을 확인할 수 있다.
'통계' 카테고리의 다른 글
통계-17 다변량분석(주성분, 인자, 군집, 생존) (0) 2023.06.05 통계-16 ar, ma, arma, arima, sarima (0) 2023.06.04 통계-14 이상치 (0) 2023.06.04 통계-13 결측치 (0) 2023.06.01