데이터분석응용 in R_260325(update260412)
ch15ds1 <- read.csv("./datasets/ch15ds1.csv")

# 데이터의 기초통계량을 살피며 각을 재보자
# describeBy()
library(psych) # describeBy를 실행하기 위한 library
describeBy(ch15ds1$Language.Score, group = ch15ds1$Group)
# describeBy는 집단별 데이터의 기술통계량을 보는 함수
# group = ch15ds1$Group : Group컬럼을 기준으로 Lan.Sc를 분류해라
Descriptive statistics by group
group: 10 Hours
vars n mean sd median trimmed mad min max
X1 1 10 85.2 6.2 85 84.38 5.19 78 99
range skew kurtosis se
X1 21 0.89 -0.15 1.96
------------------------------------
group: 20 Hours
vars n mean sd median trimmed mad min max
X1 1 10 91.6 3.41 90.5 91.62 2.97 87 96
range skew kurtosis se
X1 9 0.26 -1.72 1.08
------------------------------------
group: 5 Hours
vars n mean sd median trimmed mad min
X1 1 10 76.6 11.96 76.5 76.5 14.08 56
max range skew kurtosis se
X1 98 42 0.05 -0.9 3.78
# vars: 변수(L.S) 개수, n은 그룹 표본수
# trimmed: 극단값 일부 제거한 평균
# mad: 중앙절대편차, se: 표준오차
# 집단간 평균이 같을까?
# 같다는 전제하에 aov 분산분석을 해보자.
# aov 분산분석(ANOVA)은 평균이 같다는 귀무가설 검증을 분산을 분석하여 진행한다.
# 짧은 지식: aov 분산분석이란?
# aov는 (집단간 변동)/(집단내 변동)으로 나눈값을 이용해 검증한다.
# 평균이 다르면 집단간 변동값이 커진다.
# 분산이 크면(집단내 변동이 크면) 우연히 평균이 다를 수 있다. 분산이 작으면 우연히가 아닐 가능성이 높다.
# 즉, 평균이 같을 가능성은 집단간 변동값이 작고, 집단내 변동이 크면 높아진다.
# 귀무가설은 정의에 의해, 세 그룹의 평균이 같다.
# H0: u1=u2=u3
m1 <- aov(Language.Score ~ Group, data = ch15ds1)
# 보통 one-way ANOVA에 사용한다.
# 결과 보기전,
# boxplot으로 시각화도 해보자
par(mar = c(3, 3, 2, 1)) # 마진 줄이기
boxplot(Language.Score ~ Group, data = ch15ds1)

# 슥 봤을때는... 다를것 같다는 느낌??
# 이제 확인을 해보자.
summary(m1)
Df Sum Sq Mean Sq F value Pr(>F)
Group 2 1133 566.5 8.799 0.00114 **
Residuals 27 1738 64.4
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 유의수준이 0.01이상인 경우 바로 기각
# 즉 유의수준이 0.01이면 셋의 평균은 다르다.
# 근데 10이랑 20이 다른걸까.. 10이랑 30이 다른걸까.. 20이 30이랑 다른걸까??
# 그룹들 중 어느 쌍이 다른걸까??
# 이를 위해 사후검정을 하자.
# Tukey 사후검정
# H0: u3-u2=0, u1-u2=0, u1-u3=0
TukeyHSD(m1)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Language.Score ~ Group, data = ch15ds1)
$Group
diff lwr upr p adj
20 Hours-10 Hours 6.4 -2.497288 15.2972884 0.1941234
5 Hours-10 Hours -8.6 -17.497288 0.2972884 0.0596448
5 Hours-20 Hours -15.0 -23.897288 -6.1027116 0.0007780
# 유의수준 0.05라할 때,, 5시간과 20시간만 다르다.
# aov 추가설정(?), interaction.plot
ch16ds1 <- read.csv("./datasets/ch16ds1.csv")
View(ch16ds1)

# 기초 통계량 분석
library(psych)
describeBy(ch16ds1$Loss,
group = list(ch16ds1$Treatment, ch16ds1$Gender))
# group = list(ch16ds1$Treatment, ch16ds1$Gender)) : 두가지 기준으로 Loss를 분류해라
# aov
m2 <- aov(Loss ~ Treatment + Gender + Treatment*Gender,
data = ch16ds1)
# u고=u저 한개만 보고 싶으면 t test로 ㄱㄱ
# Treatment + Gender + Treatment*Gender : Treatment에 대한 Loss, Gender에 대한 Loss, 둘*다에 대한 Loss
# *는 상호작용효과를 보기 위한,,
# H0: u고=u저// u남=u여// u고&남=u고&여,=u저&남=u저&여로 총 3가지
summary(m2) # aov 결과 보기
Df Sum Sq Mean Sq F value Pr(>F)
Treatment 1 265 265.2 2.444 0.12669
Gender 1 207 207.0 1.908 0.17570
Treatment:Gender 1 1051 1050.6 9.683 0.00363 **
Residuals 36 3906 108.5
---
Signif. codes:
0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Treatment랑 Gender는 어느때에도 유의하지 않다. 즉, 평균이 같다.
# 그러나, 유의수준이 0.01 이상이면 Treatment:Gender이 유의해진다. 즉 평균이 달라진다.
# 즉, u고&남=u고&여,=u저&남=u저&여가 아니다.
# 근데 어느 =이 틀린거지???...
# 시각화로 봐보자.
# interaction Plot는 두 변수간 결합 효과를 보기 위한 그래프
# 즉, 상호작용 효과가 있느냐~
# 다시 말해, Treatment의 효과가 Gender에 따라 달라지는가?
interaction.plot(x.factor = ch16ds1$Treatment,
trace.factor = ch16ds1$Gender,
response = ch16ds1$Loss,
fixed = TRUE,
leg.bty = "b",
xlab = "Treatment",
ylab = "Weight Loss",
trace.label = "Gender",
ylim = c(60,85))
# x.factor = ch16ds1$Treatment : 독립변인
# trace.factor = ch16ds1$Gender : 추가로 선그리는 요인(각 x별 factor별 평균 구해서 잇기)
# response = ch16ds1$Loss : 종속변인
# fixed~ 이후 코드부터는 꾸며주는 용도

# 달라지는것 같다.
# 이제 실제로 값으로 확인해보자.
# 구체적으로 어디가 차이가 있는지 알고 싶으면
# 두그룹 비교, 세그룹 비교,, 등이 하고 싶다면,,,
# 현실에서 많이 쓰이는 비교인 TukeyHSD
TukeyHSD(m2)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = Loss ~ Treatment + Gender + Treatment * Gender, data = ch16ds1)
$Treatment
diff lwr upr p adj
Low Impact-High Impact -5.15 -11.83049 1.530493 0.1266935
$Gender
diff lwr upr p adj
Male-Female 4.55 -2.130493 11.23049 0.1756979
$`Treatment:Gender`
diff lwr upr p adj
Low Impact:Female-High Impact:Female -15.4 -27.94609 -2.85391 0.0110583
High Impact:Male-High Impact:Female -5.7 -18.24609 6.84609 0.6162344
Low Impact:Male-High Impact:Female -0.6 -13.14609 11.94609 0.9992219
High Impact:Male-Low Impact:Female 9.7 -2.84609 22.24609 0.1782508
Low Impact:Male-Low Impact:Female 14.8 2.25391 27.34609 0.0154282
Low Impact:Male-High Impact:Male 5.1 -7.44609 17.64609 0.6949307
# Treatment:Gender에서
# Low:Female - High:Female = -15.4 유의
# Low:Male - Low:Female = 14.8 유의
# 결론
# 1. 여성에게는 Treatment 효과가 크다
# 2. 남성에서는 Treatment 효과가 거의 없다.
# 3. Low Impact에서는 성별 차이가 크다.
# 연관성 분석(집단간 독립여부 판단)_feat. Contingency Table(분할표) 검정
income <- c(182, 213, 203, 154, 138, 110)
level <- c("1.low", "2.middle", "3.high", "1.low", "2.middle", "3.high")
opinion <- c("1.yes", "1.yes", "1.yes", "2.no", "2.no", "2.no")
# table 형태로 변형해보자.
# 다시말해, opinion과 level의 조합별로 income 값을 집계해서
# 표(교차표)를 만들자.
sample.table <- xtabs(income ~ opinion + level)
sample.table
level
opinion 1.low 2.middle 3.high
1.yes 182 213 203
2.no 154 138 110
# opinion이 먼저 쓰였으니 행축, level은 열축을 담당하게 된듯
# 이제 이 그룹들 간의 연관성 분석을 해보자.
# 우리가 지금까지는 집단간 평균이 서로 같냐를 따져봤다면,
# 이제는 집단간 독립 여부를 검정할것이다.
# 이때, 검정은 카이제곱 검정을 이용할 수 있다.
# 수치와 수치간의 상관관계는 상관계수(cor)로 분석했다면,
# 수치와 범주형간의 상관관계는 카이제곱(CrossTable or chisq.test)으로 분석할 수 있다.
# 카이제곱은 CrossTable 또는 chisq.test로 구할 수 있다.
# 이때, 여기에 넣는 데이터가 교차표임을 유의하자.
# CrossTable
library(gmodels)
CrossTable(sample.table, expected = TRUE)
# expected = TRUE : 기대빈도도 보여달라는 옵션
# 기대빈도? 두 변수가 서로 독립일때 나와야하는 값
Cell Contents
|-------------------------|
| N |
| Expected N |
| Chi-square contribution |
| N / Row Total |
| N / Col Total |
| N / Table Total |
|-------------------------|
Total Observations in Table: 1000
| level
opinion | 1.low | 2.middle | 3.high | Row Total |
-------------|-----------|-----------|-----------|-----------|
1.yes | 182 | 213 | 203 | 598 |
| 200.928 | 209.898 | 187.174 | |
| 1.783 | 0.046 | 1.338 | |
| 0.304 | 0.356 | 0.339 | 0.598 |
| 0.542 | 0.607 | 0.649 | |
| 0.182 | 0.213 | 0.203 | |
-------------|-----------|-----------|-----------|-----------|
2.no | 154 | 138 | 110 | 402 |
| 135.072 | 141.102 | 125.826 | |
| 2.652 | 0.068 | 1.991 | |
| 0.383 | 0.343 | 0.274 | 0.402 |
| 0.458 | 0.393 | 0.351 | |
| 0.154 | 0.138 | 0.110 | |
-------------|-----------|-----------|-----------|-----------|
Column Total | 336 | 351 | 313 | 1000 |
| 0.336 | 0.351 | 0.313 | |
-------------|-----------|-----------|-----------|-----------|
Statistics for All Table Factors
Pearson's Chi-squared test
------------------------------------------------------------
Chi^2 = 7.878212 d.f. = 2 p = 0.01946561
# 여기서 맨 하단의 p만 보면 된다.
# p가 유의수준 0.05라 할때 그것보다 작음
# 즉 변수간 독립성은 없다.
# 다시 말해 변수간 연관성 있다.
#chisq.test
# 같은 카이제곱 검정이니 p값도 결론도 같아야할것이다.
# 귀무가설은 (위에서도 마찬가지): 그룹간 연관성이 없다는것.
# 즉 "두 변수"가 독립
chisq.test(sample.table)
Pearson's Chi-squared test
data: sample.table
X-squared = 7.8782, df = 2, p-value = 0.01947
# 같다.
# 결론도 같다.
# 두 변수는 서로 연관성이 존재한다.
# 만약 분할표(Contingency table)이 아니라면? 독립성 검정 how,,
ch19ds2 <- read.csv("./datasets/ch19ds2.csv")

# 혹시 눈치챘는가? 분할표 데이터와 ch19ds2의 차이를?
# 분할표 데이터는 6개밖에 없고 컬럼이 3개였다. 3개를 엮은것이고,
# 이건 두개의 컬럼이다.
# 근데 왜 같다고 하는것인지 의문이 들 수 있다.
# 위에서 제시한 분할표는 ch19ds1과 같은 데이터의 빈도수를 미리 계산해
# income 컬럼에 집어넣은것이다라고 생각하면 된다.
# 이렇게 들어도 감이 안온다면 이걸로 contingency table(교차표)을 만들어보겠다.
table(ch19ds2$Gr, ch19ds2$Vote)
No Yes
Group1 20 37
Group2 31 32
# 여기서 연관성 여부 검사를 해보자.
chisq.test(ch19ds2$Gr, ch19ds2$Vote)
# 이 데이터의 귀무가설은 Group 여부가 Vote에 영향을 안준다.
Pearson's Chi-squared test with Yates' continuity correction
data: ch19ds2$Gr and ch19ds2$Vote
X-squared = 1.8974, df = 1, p-value = 0.1684
# 결론은 p-value가 유의수준 0.05라 잡을때 그것보다 커서
# 두 변수는 독립이다.
# 즉, Group 여부가 Vote에 영향을 안준다.
chisq.test(table(ch19ds2$Gr, ch19ds2$Vote))
# 이것도 위와 결과가 마찬가지로 나온다!
# 데이터를 봤을때 무슨 분석을 해야할지만 딱 떠올리자!!!
# 숫자면 cor, 문자면 chisq
# (내가 다시 봐야하는) 짧은 정리
# 기본통계량 보기 : describeBy() (선행 library : psych)
# describeBy(ch15ds1$Language.Score, group = ch15ds1$Group)
# describeBy(ch16ds1$Loss,
group = list(ch16ds1$Treatment, ch16ds1$Gender))
# 그룹간 평균이 같다가 귀무가설인 그룹 검정 : aov
# m1 <- aov(Language.Score ~ Group, data = ch15ds1)
# m2 <- aov(Loss ~ Treatment + Gender + Treatment*Gender,
data = ch16ds1) : 이와 같이 두 그룹간 상호작용도 볼 수 있음
# aov 검정 결과 : summary(m1)
# 그룹간 평균이 다를 경우 사후 검정 : TukeyHSD(m1)
# 귀무가설 H0: u3-u2=0, u1-u2=0, u1-u3=0
# 시각화 : boxplot/interaction.plot
# 마진줄이기: par(mar = c(3, 3, 2, 1))
# boxplot(Language.Score ~ Group, data = ch15ds1)
# interaction.plot(x.factor = ch16ds1$Treatment,
trace.factor = ch16ds1$Gender,
response = ch16ds1$Loss,
fixed = TRUE,
leg.bty = "b",
xlab = "Treatment",
ylab = "Weight Loss",
trace.label = "Gender",
ylim = c(60,85)) : Treatment의 효과가 Gender에 따라 달라지는가??(feat. 평균)
# 교차표 만들기
# sample.table <- xtabs(income ~ opinion + level)
# 연관성 분석 : CrossTable / chisq.test
# 두 변수가 독립이다가 기본 전제!!
# CrossTable 선행 library gmodels
# CrossTable(sample.table, expected = TRUE)
# chisq.test(sample.table)
# chisq.test(ch19ds2$Gr, ch19ds2$Vote)