#acl +All:read #format wiki #language ko #pragma description 기초의학통계학 및 실험; = Chi-squared Test = == T-Test는 평균값을 비교할 때 사용 == 우리나라는 매년 겨울 서풍에 실려오는 초미세먼지로 불편을 겪는다. * 2020년 1월 신종 코로나 바이러스에 대한 대책으로 중국의 경제 활동이 멈췄고, 우리는 겨울답지 않는 맑은 공기를 반갑게 맞이했다. * 실제 공기 질이 좋아졌는지 [[http://data.seoul.go.kr/dataList/OA-2218/S/1/datasetView.do|서울시 일별 대기오염도 정보]] 자료를 이용해서 2019년 12월과 2020년 2월의 초미세먼지 농도를 비교 해 보자. * 다음 예제는 실습의 편의를 위하여 [[https://github.com/gehoon/statistics/|GitHub]]에 올려둔 파일을 사용한다. {{{#!highlight r dataFile <- 'https://raw.githubusercontent.com/gehoon/statistics/master/data/seoul_daily_air_20200923.csv' df <- read.csv(dataFile, fileEncoding='euc-kr') # 혹은 df <- read.csv(file.choose(), fileEncoding='euc-kr') df <- df[ grep('구$', df$측정소명), ] dust19 <- data.frame(month = as.factor('2019.12'), pm2.5 = df[ grep('^201912', df$측정일시) , '초미세먼지.....' ]) dust20 <- data.frame(month = as.factor('2020.02'), pm2.5 = df[ grep('^202002', df$측정일시) , '초미세먼지.....' ]) dust = rbind(dust19, dust20) summary(dust) boxplot(pm2.5 ~ month, data=dust, col=c('brown2','deepskyblue')) shapiro.test(dust19$pm2.5) shapiro.test(dust20$pm2.5) wilcox.test(pm2.5 ~ month, data=dust) }}} {{attachment:dust1912_2002.png}} {{{#!highlight rout numbers=disable > shapiro.test(dust19$pm2.5) Shapiro-Wilk normality test data: dust19$pm2.5 W = 0.9001, p-value < 2.2e-16 > shapiro.test(dust20$pm2.5) Shapiro-Wilk normality test data: dust20$pm2.5 W = 0.90371, p-value < 2.2e-16 > wilcox.test(pm2.5 ~ month, data=dust) Wilcoxon rank sum test with continuity correction data: pm2.5 by month W = 266166, p-value = 0.4786 alternative hypothesis: true location shift is not equal to 0 }}} === T-test 결과 === T-Test (실제로는 Wilcoxon rank sum test)결과 2019년 12월과 2020년 2월의 초미세먼지 농도는 유의미하게 다르지 않다고 한다!! == Chi-squared Test는 빈도를 비교할 때 사용 == === '매우 나쁨'날의 빈도 비교 === 2020년 2월의 공기질이 2019년 12월보다 나았다는 것을 꼭 주장하고 싶어서 다른 통계 방법을 써 보기로 한다. * boxplot을 보면, 초미세먼지 농도가 대부분 20~40 사이에 분포한다. * 그런 날은 우리가 미세먼지에 대한 생각 없이 그냥 살다가, 수치가 증가한 날 먼지의 존재를 느끼게 된다. * 단순히 초미세먼지의 농도를 비교하는 방법보다, "초미세먼지가 심한 날"이 몇일이나 되었나를 비교하는 방법을 써 보기로 했다. [[https://www.gov.kr/portal/ntnadmNews/1392704|2018년 3월 20일 발표된 환경부 기준]]에 따르면, * 초미세먼지 농도가 76㎍/㎥ 이상이면 '매우 나쁨'이다. * dust 데이타의 pm2.5 가 76 이상인지 판단하여 dust$severe 라는 TRUE/FALSE vector로 만들어 저장하고, * [[https://www.rdocumentation.org/packages/base/topics/table|table()]] 함수를 이용하여 TRUE/FALSE의 갯수를 헤아릴 것이다. {{{#!highlight r dust$severe <- dust$pm2.5 >= 76 veryBadDust <- table(dust$month, dust$severe) veryBadDust }}} {{{#!highlight rout numbers=disable FALSE TRUE 2019.12 761 11 2020.02 675 0 }}} === Chi-squared Test === 초미세먼지가 '매우 나쁨'인 날이 11일 vs. 0일이어서 비교가 불필요하지만, 어쨋든 [[https://www.rdocumentation.org/packages/stats/topics/chisq.test|chisq.test()]]를 하면 다음과 같다. * 계산 결과, p < 0.01 로 다른 어떤 이유없이 '우연히' 이러한 차이를 얻을 확률이 100분의 1 이하라고 한다. * 2019년 12월과 2020년 2월의 초미세먼지 '매우 나쁨'인 날의 수는, 우연이 아닐 가능성이 큰 것으로 보인다. {{{#!highlight r chisq.test(veryBadDust) }}} {{{#!highlight rout numbers=disable Pearson's Chi-squared test with Yates' continuity correction data: veryBadDust X-squared = 7.8949, df = 1, p-value = 0.004958 }}} === 공기질을 여러 등급으로 나눠서 비교하기 === [[https://www.gov.kr/portal/ntnadmNews/1392704|2018년 3월 20일 발표된 환경부 기준]]에 따르면, * 초미세먼지 농도가 0~15㎍/㎥ 면 '좋음', * 초미세먼지 농도가 16~35㎍/㎥ 면 '보통', * 초미세먼지 농도가 36~75㎍/㎥ 면 '나쁨', * 초미세먼지 농도가 76㎍/㎥ 이상이면 '매우 나쁨'이다. * 이 기준에 따라 공기질을 4등급으로 나누면, {{{#!highlight r dust$severity = 'Good' dust$severity[dust$pm2.5 >= 16] = "Plain" dust$severity[dust$pm2.5 >= 36] = "Bad" dust$severity[dust$pm2.5 >= 76] = "Very Bad" dustSeverity <- table(dust$month, dust$severity) dustSeverity }}} {{{#!highlight rout numbers=disable > dustSeverity Bad Good Plain Very Bad 2019.12 185 146 431 11 2020.02 195 146 334 0 }}} Category가 알파벳순(Bad, Good, Plain, Very Bad)으로 자동 정렬되었다. * 카이제곱 검정과는 관계 없지만, 공기질을 심각 순서로 정렬하려면 이 category를 factor로 인식시켜야 한다. 그리고 Chi-squared test를 하면, p < 0.001 으로 계산된다. * 이는 2019년 12월과 2020년 2월의 초미세먼지 등급 차이를 '우연히' 얻을 확률이 1000분의 1 이하라는 뜻으로, * 우연에 의한 차이가 아닐 것으로, 유의미한 차이일 것으로 본다. {{{#!highlight r dust$severity <- factor(dust$severity, levels = c('Good','Plain','Bad','Very Bad')) dustSeverity <- table(dust$month, dust$severity) dustSeverity chisq.test(dustSeverity) }}} {{{#!highlight rout numbers=disable > dustSeverity Good Plain Bad Very Bad 2019.12 146 431 185 11 2020.02 146 334 195 0 > chisq.test(dustSeverity) Pearson's Chi-squared test data: dustSeverity X-squared = 17.008, df = 3, p-value = 0.0007041 }}} ----- <>