Python에서 데이터를 변환하는 방법(로그, 제곱근, 세제곱근)
많은 통계 테스트에서는 데이터 세트가 정규 분포를 따른다고 가정합니다. 그러나 실제로는 그렇지 않은 경우가 많습니다.
이 문제를 해결하는 한 가지 방법은 다음 세 가지 변환 중 하나를 사용하여 데이터 세트의 값 분포를 변환하는 것입니다.
1. 로그 변환: 응답 변수를 y에서 log(y) 로 변환합니다.
2. 제곱근 변환: 응답 변수를 y에서 √y 로 변환합니다.
3. 세제곱근 변환: 응답 변수를 y에서 y 1/3 으로 변환합니다.
이러한 변환을 수행함으로써 데이터세트는 일반적으로 보다 정규 분포를 띄게 됩니다.
다음 예제에서는 Python에서 이러한 변환을 수행하는 방법을 보여줍니다.
Python의 로그 변환
다음 코드는 변수에 대해 로그 변환을 수행하고 병렬 플롯을 생성하여 데이터의 원래 분포와 로그 변환된 분포를 표시하는 방법을 보여줍니다.
import numpy as np import matplotlib. pyplot as plt #make this example reproducible n.p. random . seeds (0) #create beta distributed random variable with 200 values data = np. random . beta (a= 4 , b= 15 , size= 300 ) #create log-transformed data data_log = np. log (data) #define grid of plots fig, axs = plt. subplots (nrows= 1 , ncols= 2 ) #create histograms axs[0]. hist (data, edgecolor=' black ') axs[1]. hist (data_log, edgecolor=' black ') #add title to each histogram axs[0]. set_title (' Original Data ') axs[1].set_title(' Log-Transformed Data ')
로그 변환된 분포가 원래 분포보다 더 정규 분포를 따르는지 확인하세요.
여전히 완벽한 “종 모양”은 아니지만 원래 분포보다 정규 분포에 더 가깝습니다.
Python의 제곱근 변환
다음 코드는 변수에 대해 제곱근 변환을 수행하고 병렬 플롯을 생성하여 원래 분포와 데이터의 제곱근 변환 분포를 표시하는 방법을 보여줍니다.
import numpy as np import matplotlib. pyplot as plt #make this example reproducible n.p. random . seeds (0) #create beta distributed random variable with 200 values data = np. random . beta (a= 1 , b= 5 , size= 300 ) #create log-transformed data data_log = np. sqrt (data) #define grid of plots fig, axs = plt. subplots (nrows= 1 , ncols= 2 ) #create histograms axs[0]. hist (data, edgecolor=' black ') axs[1]. hist (data_log, edgecolor=' black ') #add title to each histogram axs[0]. set_title (' Original Data ') axs[1].set_title(' Square Root Transformed Data ')
제곱근으로 변환된 데이터가 원래 데이터보다 훨씬 더 정규 분포를 따르는지 확인하세요.
Python의 큐브 루트 변환
다음 코드는 변수에 대해 큐브 루트 변환을 수행하고 병렬 플롯을 생성하여 원래 분포와 데이터의 큐브 루트 변환 분포를 표시하는 방법을 보여줍니다.
import numpy as np import matplotlib. pyplot as plt #make this example reproducible n.p. random . seeds (0) #create beta distributed random variable with 200 values data = np. random . beta (a= 1 , b= 5 , size= 300 ) #create log-transformed data data_log = np. cbrt (data) #define grid of plots fig, axs = plt. subplots (nrows= 1 , ncols= 2 ) #create histograms axs[0]. hist (data, edgecolor=' black ') axs[1]. hist (data_log, edgecolor=' black ') #add title to each histogram axs[0]. set_title (' Original Data ') axs[1].set_title(' Cube Root Transformed Data ')
큐브 루트로 변환된 데이터가 원본 데이터보다 훨씬 더 정규 분포를 이루고 있음을 알 수 있습니다.
추가 리소스
Python에서 Z 점수를 계산하는 방법
Python에서 데이터를 정규화하는 방법
통계에서 정규성 가정은 무엇입니까?