데이터 변환 방법으로서
(2) 정규분포화
(3) 범주화
- 이산형화
- 이항변수화
(4) 개수 축소
(5) 차원 축소
- 주성분분석
- 요인분석
중에서 로그 변환, 제곱급 변환을 활용한 정규분포화에 대해서 알아보겠습니다. 이들 변환들이 정규분포가 아니었던 분포를 정규분포로 변환시키는데 활용되므로 정규분포화 변환이라는 카테고리로 묶어보았습니다.
많은 통계기법이 정규분포를 가정하고 있으므로 정규분포(Gausian distribution)가 아닌 경우 정규분포로 변환시키는 것은 사전작업으로 필수적이라고 하겠습니다.
R 데이터 변환 (2) 정규분포화 log(), sqrt() |
[ 데이터 변환 구성 ]
자연현상 중에, 우리 주변의 일상 중에 정규분포가 많은데요(예: 키, 몸무게, 통계성적 등), 그에 못지않게 멱함수 분포(Power-law distribution)도 많이 있답니다. 특히 개체간 상호작용과 (긍정적/부정적) 피드백이 작용하는 관계에서는 멱함수 분포가 존재할 가능성이 높습니다.
아래는 한겨레신문에서 카이스트 정하웅 교수님 인터뷰하면서 정규분포(고소도로 네트워크)와 멱함수분포(항공망 네트워크)의 예로 들은 것인데요(바라바시 링크 책 참조), 멱함수 분포를 띠는 항공망 네트워크의 경우 허브(Hub) 역할을 하는 공항이 있다는 것이지요. 이를 척도 없는 네트워크(scale-free network)라고도 하는데요, 이런 허브(Hub), 매개자(Connector) 가 있음으로 해서 세상이 좁아진다(small world)는 이론이 뒷받침을 받게 됩니다.
[ 네트워크의 두가지 유형 ]
한 국가의 부의 분포를 보면 20%의 국민이 부의80%를 차지하고 있고, 마태복은 13장 12절에 있는 ‘무릇 있는 자는 받아 풍족하게 되고 없는 자는 그 있는 것 까지도 빼앗기리라’ 말씀을 따서 마태효과(Matthew effect)라는 이론이 있기도 한데요, 멱함수 분포의 예라고 할 수 있겠습니다.
그밖에도 멱함수 분포를 따르는 것으로 논문 인용, 인터넷 네트워크, 전기회로도, 전기/하수구 네트워크, 뇌의 뉴런 네트워크, 전염병이나 성병의 전파(아래 그림 예의 왼쪽에서 오른쪽, 상에서 하 순서 참고), 산불이나 지진의 강도별 발생 빈도, 프로야구선수 또는 프로축구선수 연봉 등... 그 예를 들자면 아주 많습니다. 혹시 복잡계과학, 네트워크과학에 대해서 관심이 있으시면 바라바시의 링크(Linked), 버스트(Birst), 던컨와츠의 스몰 월드(Small World), 마큐뷰캐넌 사회적원자(Social Atom), 우발과 패턴(Ubiquity) 등의 책을 추천합니다. 저자들이 물리학자 혹은 사회과학자들인데요, 수학적 공식없이도 일반인들이 쉽고 재미있게 읽을 수 있도록 책을 썼습니다. 지적유희 측면에서 재미있어요. 복잡한 세상 속에 이런 규칙이...하고 놀랄겁니다.
[ 다양한 멱함수 분포 예 ]
옆길로 많이 샜는데요 ^^;, 이처럼 많은 멱함수 분포를 정규분포로 변환할 때 로그 변환이나 제곱근 변환을 사용하게 됩니다.
UsingR 패키지에 들어있는 cfb 데이터 프레임을 가지고 예를 들어보겠습니다. cfb 데이터셋은 소비자 재정에 관한 설문조사 샘플 데이터로서, 14개의 변수와 1000명의 관측치가 들어있습니다.
> install.packages("UsingR")
|
(1) 로그 변환 : log()
> ## 로그 변환 > cfb <- transform(cfb, INCOME_log = log(INCOME + 1)) > hist(cfb$INCOME_log, breaks=500, freq=TRUE)
|
위의 로그 변환 시에 INCOME_log = log(INCOME + 1) 처럼 (INCOME +1) 을 했습니다. INCOME 이 '0'부터 시작하는데 '0'을 로그 취하면 마이너스 무한대가 나오기 때문에 1을 더해서 오른쪽으로 1씩 이동시킨 후에 로그변환을 취했습니다.
히스토그램을 보면 이전의 멱함수 분포의 소득이 정규분포로 변환되었음을 알 수 있습니다.
(2) 제곱근 변환 : sqrt()
> ## 제곱근 변환 > cfb <- transform(cfb, INCOME_sqrt = sqrt(INCOME + 1)) > hist(cfb$INCOME_sqrt, breaks=500, freq=TRUE)
|
제곱근 변환은 sqrt() 함수를 사용합니다. 위의 예시를 보면 로그변환 보다는 제곱근 변환이 오른쪽에 수입이 엄청나게 많은 부자들을 덜 정규분포화 시킨다는 것을 알 수 있는데요, 원래 데이터의 분포를 보고 로그변환과 제곱근 변환 중에서 더 적합한 것을 선택해서 사용하면 되겠습니다.
정규성 검정을 할 때 정규 분위수-분위수 그림(Q-Q Plot)을 사용하는데요, 아래에 원래 INCOME, 로그 변환 INCOME_log, 제곱근 변환 INCOME_sqrt 의 세개 변수에 대해서 Q-Q plot을 그려보았습니다. 아래 Q-Q plot으로 봐서는 로그 변환이 가장 잘 정규성을 띠고 있네요.
> ## Q-Q plot > par( mfrow = c(1,3)) > qqnorm(cfb$INCOME, main="Q-Q plot of INCOME") > qqline(cfb$INCOME) > > qqnorm(cfb$INCOME_log, main="Q-Q plot of INCOME_log") > qqline(cfb$INCOME_log) > > qqnorm(cfb$INCOME_sqrt, main="Q-Q plot of INCOME_sqrt") > qqline(cfb$INCOME_sqrt) > par(mfrow = c(1,1))
|
모집단의 분포 형태에 따른 대략적인 정규분포 변환 방법은 아래 표와 같습니다
[ 분포 형태별 정규분포 변환 방법 ]
distribution before transformation |
transformation function |
distribution after transformation |
left |
X^3 |
normal distribution (bell shape) |
mild left |
X^2 | |
mild right |
sqrt(X) | |
right |
ln(X) | |
severe right |
1/X |
단일모집단의 정규성 검정 (shapiro test, Q-Q plot) 방법은 아래의 링크를 참조하세요.
☞ R 단일 모집단 분포의 정규성 검정 : shapiro.test(), qqnorm(), qqline()
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^
'R 분석과 프로그래밍 > R 데이터 전처리' 카테고리의 다른 글
R 데이터 변환 : (3) 범주화 - (3-2) 이항변수화 (binarization), 더미변수(dummy variable) (10) | 2015.08.01 |
---|---|
R 데이터 변환 (3) 범주화 - (3-1) 이산형화(discretization) (4) | 2015.08.01 |
R 데이터 변환 (1) 표준화 : z 표준화 변환, [0-1] 변환 (12) | 2015.07.28 |
R 데이터 프레임 결합 : rbind(), cbind(), merge() (39) | 2015.07.27 |
R 벡터, 데이터 프레임 정렬 : sort(), order(), arrange() (0) | 2015.07.27 |