Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

데이터분석 공부하기

[가정] 모수적 검정- 1) 정규성(normality) 본문

통계

[가정] 모수적 검정- 1) 정규성(normality)

Eileen's 2022. 1. 14. 17:43
  • 모수적 검정(Parametric test) : 모수 추정을 위한 가정 검정 
    1. 분포의 정규성(normality) : data in each group should be normally distributed
    2. 분산의 동질성(homogeneity) : data in each group should have approx. equal variance;
                                                       표본들의 분산이 동일한 모집단에서 비롯되었음
    3. 구간 척도(interval data) : 적어도 interval data로 측정되어야 한다.
    4. 독립성 : 1) independent groups : data in each group should be randomly and independently sampled from the population, 2) repeated measure : behaviors of each participants should be independent(not influenced by one another), 3) regression : errors in the regression models are not correlated
  • R packages : car, ggplot2, pastecs, psych

분포의 정규성 가정


언제 정규성을 검정하는가?

1) 여러 통계적 검정(ex, t-test)에서는 표집분포가 정규분포라고 가정하나, 표집분포에 직접 접근할 수 없어,
    표본분포가 정규분포인지 확인하여 표집분포가 정규분포라고 가정
2)회귀/일반성형모형 : 일반성형모형의 오차들이 정규분포를 따른 다고 가정 

 

정규성 검증법 


도수분포 : 눈으로 확인

1)히스토그램과 정규 곡선 (normal curve)
 - 사용 함수 : geom_histrogram(aes(y=..density..)), stat_function
- histogram(aes(y=..density..)는 밀도분포인데, 정규곡석을 그리기 위함

#day1 histogram
f.hist.d1 <- ggplot(festival.data, aes(day1)) + theme(legend.position = "none")  +
  geom_histogram(aes(y=..density..), color = "black", fill = "white") +
  labs(x = "Hygiene score on day 1", y = "Density")
f.hist.d1

#day1 정규분포 곡선 (위 그래프와 하나로 합친 뒤 출력 가능)
f.hist.d1 + stat_function(fun = dnorm, 
args = list(mean = mean(festival.data$day1, na.rm = TRUE), sd = sd(festival.data$day1, na.rm = TRUE)),
color = "black", size = 1)​


2) Q-Q plot(quantile, 분위수) : 자료의 누적값정규 분표의 누적확률과 대조하여 표시; 각 값- 그 값에 해당하는 정규분포 기대값을 x/y에서 나가는 선좌표로 사용하여 cross되는 곳에 점 생성(정규본포일 시, 대각선 형성)
- 사용함수: stat_qq(), qplot()
qqplot.day1 <- qplot(sample = festival.data$day1, stat= "qq") qqplot.day1
- 정규분포가 아닌 모형 : 비대칭 - S자 곡선, 첨도 - 일관되게 대각선의 위 또는 아래에 위치

qqplot.day1 <- qplot(sample = festival.data$day1, stat= "qq")
qqplot.day1​

참고: https://www.youtube.com/watch?v=qM7A0vcb_eg
       youtube.com/watch?v=IgIN9-4-kSg




Quantifying 정규성 : 숫자로 확인
1) 비대칭도와 첨도 
 -사용 함수 : psych패키지 -> describe()함수;
                    pastecs 패키지 -> stat.desc(변수이름, basic = TRUE, norm = FALSE)함수

#1 method : (recommend) -> list out variable names
describe(festival.data[, c("day1", "day2", "day3")])
stat.desc(festival.data[, c("day1", "day2", "day3")], 
          basic = FALSE, norm = TRUE)

#2 method : cbind
describe(cbind(festival.data$day1,festival.data$day2 ,festival.data$day3))
stat.desc(cbind(festival.data$day1,festival.data$day2 ,festival.data$day3), 
          basic = FALSE, norm = TRUE)

#3 method : one by one
describe(festival.data$day1)
stat.desc(festival.data$day1, basic = FALSE, norm = TRUE)
stat.desc(festival.data$day1, basic = TRUE, norm = TRUE)​

- 비대칭도(skewness) : (= 0) 정규분포, (+> 0) right-skew, (-< 0) left-skew
- 첨도(kurtosis) : (= 0) 정규분포, (+> 0) 분포가 뾰족 & 꼬리가 두꺼움, (-< 0) 분포가 평평 & 꼬리가 가늠
* e-#, e+#에 주의하여 숫자를 인식해야한다. ex) 1.20 e-01 = 0.12
* round(반올림할 객체, digits = 소수점 이하 유효자릿수)로 복잡해보이는 숫자를 간편화 할 수 있다

round(stat.desc(cbind(festival.data$day1,festival.data$day2 ,festival.data$day3), 
                basic = FALSE, norm = TRUE), digits = 3)


2) z-score(표준화 점수): 비대칭도/첨도의 유의성 점검; 표본이 클 때는 사용 X(>200, 정규분포가 아니여도 유의결과나옴)
    1. 서로 다른 측정 방법으로 얻은 표본들의 비대칭도/첨도 비교,  2. 비대칭도/첨도 발생 활률 파악
   - z(비대칭도) = (skewness - μ)/(SE of skewness) 
   - z(첨도) = (kurtosis - μ)/(SE of kurtosis)
   => 이러한 비대칭/첨도가 우연히 나올 수 있는가? : 큰 표본에서는 정규분포에서 조금만 벗어나도 유의한 값이 나오므로
        큰 포본에서는 z = 2.58(P < .01), 작은 표본에서는 z = 1.96(P<0.05);
        아주 큰 표본(>200)은 너무 작은 표준오차의 문제점으로 눈으로 (1번방법) 비대칭/첨도의 값을 확인하는 것이 더 중요
   - stat.desc에서의 skew.2SE, kurt2SE : 비대칭도/첨도를 각자의 (표준오차*2)로 나눈 것
         -> z-score 2.58이 유의한 것과 같이, 표준오차*2를 감안하여 score 1.29(약 1)보다 크면 유의하다고 볼 수 있다.
              1(p<.05, for 30<N<50), 1.29(p < .01),  1.65(p<.001); (표본이 작을 경우, 큰 경우는 주의!) 

 



검정통계로 확인

사피로-윌크 검정(Shapiro-Wilk test) : 표본점수와 그 표본과 평균/표준편차가 동일한 정규분포에서 뽑은 점수와 비교
    - 유의함(p > .05) : 정규분포와 유의하게 다르다 (정규분포X)
    - 한계: 표본이 크면 정규분포를 조금만 벗어나도 유의한 결과가 나오기 쉽다.
               정규분포에서 벗어난 결과라도 히스토그램/Q-Q/비대칭/첨도 등과 함께 파악하는 등 정규성 가정 통계 사용유무 결정
    - shapiro.test(데이터셋$변수), stat.desc(데이터셋$변수, norm = TRUE)의 normtest.W, normtest.p
    - 여러변수 : by(데이터셋$변수, 데이터셋$변수, shapiro.test) *)그룹들 비교 분석은 전체 분포가 아닌 각 그룹 분포가 중요!
    - 보고:  The percentage on the R exam, W = 0.96, p = .005, and the numeracy scores, W = 0.92, p < .001, were both significantly non-normal.

 

 

 

+) 자료 그룹들 살펴보기 by R
1) 자료 전체 분석: stat.desc(), stat_function()

round(stat.desc(rexam[,c("exam","computer","lectures","numeracy","uni")], 
                basic = FALSE, norm = TRUE), digits = 3)

#exam
hist.exam <- ggplot(rexam, aes(exam)) + 
     geom_histogram(aes(y = ..density..), fill = "white", color = "black") +
     stat_function(fun = dnorm, args = list(mean = mean(rexam$exam, na.rm = TRUE),
                   sd = sd(rexam$exam, na.rm = TRUE)), size = 3)
hist.exam


2) 그룹별 분석: by(), subset()

#그룹별 수치
by(data = rexam$exam, INDICES = rexam$uni, FUN = stat.desc, basic = FALSE, norm = TRUE)

#Multiple variables
by(cbind(rexam$exam, rexam$numeracy), rexam$uni, describe)
by(rexam[,c("exam", "numeracy")], rexam$uni, stat.desc, basic = FALSE, norm = TRUE)
-> parameter name does not have to be listed if in order of data,INDICES,FUN
#그룹별 히스토그램
#subset으로 그룹별 데이터셋 생성
dunce.data <- subset(rexam, rexam$uni == "Duncetown U")
sussex.data <- subset(rexam, rexam$uni == "Sussex U")

#DuncetownUni 히스토그램 생성
hist.num.dunce <- ggplot(dunce.data, aes(numeracy)) +
  theme(legend.position = "none") + 
  geom_histogram(aes(y = ..density..), fill = "white", color = "black", binwidth = 1) +
  labs(x = "Numeracy Score of Duncetown U", y = "Density") + 
  stat_function(fun = dnorm, args = list(mean = mean(dunce.data$numeracy, na.rm = TRUE),
                sd = sd(dunce.data$numeracy, na.rm = TRUE)), color = "blue", size = 1) 
hist.num.dunce

#SussexUni 히스토그램 생성
hist.num.sussex <- ggplot(sussex.data, aes(numeracy)) +
  theme(legend.position = "none") + 
  geom_histogram(aes(y = ..density..), fill = "white", color = "black", binwidth = 1) +
  labs(x = "Numeracy Score of Sussex U", y = "Density") + 
  stat_function(fun = dnorm, args = list(mean = mean(sussex.data$numeracy, na.rm = TRUE),
                sd = sd(sussex.data$numeracy, na.rm = TRUE)), color = "blue", size = 1) 
hist.num.sussex

 

 

 

출처 및 참고 : '앤디 필드의 유쾌한 R 통계학'