Deep Learning + AI

데이터분석응용 in R_260325(update260412)

내인생왜이래 2026. 4. 12. 02:21
반응형

 

ch15ds1 <- read.csv("./datasets/ch15ds1.csv")

ch15ds1

 

 

# 데이터의 기초통계량을 살피며 각을 재보자

 

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

boxplot of 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)

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~ 이후 코드부터는 꾸며주는 용도

interaction.plot

 

# 달라지는것 같다.

 

 

# 이제 실제로 값으로 확인해보자.

# 구체적으로 어디가 차이가 있는지 알고 싶으면

# 두그룹 비교, 세그룹 비교,, 등이 하고 싶다면,,,

# 현실에서 많이 쓰이는 비교인 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

 

 

# 혹시 눈치챘는가? 분할표 데이터와 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)

 

 

반응형