데이터 변환 방법으로서

(1) 표준화

(2) 정규분포화

(3) 범주화

   - 이산형화

   - 이항변수화

(4) 개수 축소

 

(5) 차원 축소

   - 주성분분석

   - 요인분석 

(6) 시그널 데이터 압축

 

중에서 로그 변환, 제곱급 변환을 활용한 정규분포화에 대해서 알아보겠습니다. 이들 변환들이 정규분포가 아니었던 분포를 정규분포로 변환시키는데 활용되므로 정규분포화 변환이라는 카테고리로 묶어보았습니다. 

 

많은 통계기법이 정규분포를 가정하고 있으므로 정규분포(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")
> library(UsingR)

> > data(cfb) # cfb 데이터 불러오기 > head(cfb) # 상위 6개 미리보기 WGT AGE EDUC INCOME CHECKING SAVING NMMF STOCKS FIN VEHIC X17470 5749.975 54 14 66814.19 6000 2000 0 500 39600 6400 X315 5870.634 40 12 42144.34 400 0 0 0 5400 21000 X8795 8043.695 35 14 25697.77 1000 160 0 0 15460 2000 X10720 6092.872 55 12 35976.87 2600 19100 0 0 54700 18250 X19170 7161.757 40 12 39060.61 1000 8300 0 3500 12800 9100 X22075 11429.633 82 12 13362.84 1000 0 50000 0 70500 7500 HOMEEQ OTHNFIN DEBT NETWORTH X17470 84000 0 40200 170800 X315 8000 0 58640 17760 X8795 12000 0 19610 9850 X10720 90000 0 8000 284950 X19170 47000 0 21000 268900 X22075 175000 0 0 253000 >

> summary(cfb$INCOME) # INCOME 요약통계량 Min. 1st Qu. Median Mean 3rd Qu. Max. 0 20560 38030 63400 69900 1542000 >

> hist(cfb$INCOME, breaks=500, freq=TRUE) # INCOME 히스토그램

 

 

 

 

 

(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()

 

많은 도움이 되었기를 바랍니다.

 

이번 포스팅이 도움이 되었다면 아래의 '공감 ~♡' 단추를 꾸욱 눌러주세요.^^

 

Posted by R Friend Rfriend

댓글을 달아 주세요

  1. MC 2020.06.05 17:36  댓글주소  수정/삭제  댓글쓰기

    왜도가 너무 심할 경우에는 log 변환이 안되는 경우도 있나요?
    아래 두가지 변수 모두 변환이 제대로 되지 않네요.ㅠㅠㅠ

    1. median이 0일 정도로 심하게 치우쳐 있는 경우
    2. 5점 척도 중에서 1~2점 응답이 많은 경우

    전체 자료는 450개 정도입니다.

  2. MC 2020.06.06 17:03  댓글주소  수정/삭제  댓글쓰기

    답변 감사합니다 :)
    1/x로 변환을 해도 1의 경우에는 shapiro.test()하면 p값이 NA로 나오구요, 2의 경우에는 변환 후에도 H1 채택됩니다.
    factor 수준이 2인 경우에는 wilcox.test로 보았지만, 3 이상인 경우에는 무조건 정규분포화 해야만 검증할 수 있지요?
    다른 방법이 없을까요?

  3. MC 2020.06.07 08:48  댓글주소  수정/삭제  댓글쓰기

    boxcox(df$perception ~ 1)
    p <- powerTransform(df$perception)
    y <- bcPower(df$perception, p$lambda)
    hist(y)
    qqnorm(y)
    이렇게 해도 정규분포가 안되네요 ㅠㅠㅠ 헤드부분 특정 응답값 제외하고 분석해야 할까요?

  4. MC 2020.06.07 09:50  댓글주소  수정/삭제  댓글쓰기

    네~답변 주셔서 정말 감사합니다^^ 데이터 분할해서 분석해보겠습니다. 가르쳐주셔서 고맙습니다 ㅎㅎ

  5. r 초보 2020.09.13 09:39  댓글주소  수정/삭제  댓글쓰기

    내용 감사드립니다.


    제가 정규분포로 변환하는 이유가 pearson 상관계수를 확인하려니, 정규분포여야한다는 내용이 있어 log를 취했는데요...

    그렇다면 이후의 모든 과정은 iog로 취한 데이터를 사용해서 상관관계 분석도 하고, 주성분 분석도 하고... 그러는 건가요??

    예를 들어...A 가 10, B 가 20 이라는 데이터가 있는데 log값으로 변환한
    log A 인 1, log B 인 2 라는 데이터를 가지고 상관분석등 나머지 통계 처리를 하는건가요??

    (너무 초보적인 질문 죄송요... 요게 해결이 안되서 며칠 헤메이고 있네요.ㅜㅜ)

    • R Friend Rfriend 2020.09.15 11:58 신고  댓글주소  수정/삭제

      안녕하세요. 반갑습니다.

      정규분포 가정을 충족시켜야 하는 분석 기법 사용을 위해 원본 데이터를 로그 변환하는 경우라면, 로그변환한 값으로 분석을 합니다. (그래야지 정규성 가정을 충족하므로).

      다만, 최종 산출물은 로그변환후의 값에 지수변환을 해서 원래의 값으로 역변환을 해주면 됩니다.

      가령, y 값을 로그변환 후의 값인 y_log로 해서 회귀모형을 적합한 경우, y_log 의 예측값을 회귀모형식으로부터 얻었다면, 최종 y 예측값은 exp(y_log 예측값) 을 사용하면 됩니다.

  6. sjung 2020.11.21 00:17  댓글주소  수정/삭제  댓글쓰기

    안녕하세요!
    상세한 설명 감사드립니다.

    혹시 하나의 모델에서 log와 sqrt를 동시 사용해도 되나요?
    예를 들어,
    Y = log(X1) + sqrt(X2)
    이런 식으로요. 어떤 변수들은 log, 어떤 변수들은 sqrt 변형에서 더 나은 정규분포를 보여서요..!
    아니면 꼭 한가지만 사용해야 하나요?