본문 바로가기
공부/IT-R프로그래밍

R프로그래밍 강좌 - [11] [기초통계] 도수분포,상대도수분포,분활표

by 썸볼 2018. 1. 15.

1. 기초통계

- 통계에서 데이터를 표로 잘 정리하는 것은 통계전체 작업에서 50%이상을
  완성했음을 의미한다.
- 표로 데이터가 정리되면 통계적 해석이 쉽고, 그래프로도 나타내기 쉽다.

(1) 명목형 변수의 도수분포표  

- No, Yes의 답변이 흩어져있는 자료들은 표로 정리한다.


    


- 측정된 값을 카운트해서 정리하는 표를 도수분포표 한다.
- 도수의 의미는 거듭하는 횟수이며, 도수분포표는 수량을 세어 나타낸 표라 한다.

- Yes, No는 명목변수이다.


(2) 명목형 변수의 상대도수분포표

- 커피의 종류 아메리카노, 카라멜 마끼야또, 더치, 카페라떼, 오늘의 커피, 초코렛 프라프치노 등
  변수값이 많을 경우에는 월판매 도수분포표는 서로 비교가 쉽지 않다.
판매비율을 추가하면 숫자만 보는것보다 훨씬 비교가 쉽다.
- 판매비율은 상대도수를 추가하여 전체값에서 상대적인 비중을 차지하는 값을 비교할 수 있다.
 
  
 
  

(3) 연속성 변수의 도수분포, 상대도수, 누적도수표


- 통계학과 학생 정보중에서 통계학 점수인 연속형 변수를 이용한다.
  이름,   성별,  학년,  전공,    통계학점수,  교육학점수.....의 데이터 
  홍길동  남      4     통계학      87            74

연속형 변수형인 경우에는 구간(계급)을 정해 그 구간안에 속한 점수를 세어 개수를 표시한다.
- 점수대별 인원수의 도수분포에 상대도수(비율), 누적상대도수를 추가하여 40점대 또는 30점대 하위권 인원의
  비율을 쉽게 알 수 있고, 70점대 이하 학생의 비율도 알 수 있다
- 누적상대도수 3.30%는 상대도수10대~30대까지 모두 더한 값이다.


    

.

(4) 분할표(Contingency Table)

- 혈액형, 성별 두가지 명목형 변수를 표로 정리했다.
- 이 표를 통해 남자별 혈액형 비율 및 여자별 혈액형 비율도 알 수있다.
- 남녀구분없이 전체인원에서 O형이 차지하는 양도 알 수 있다.
- 이런표를 분할표라한다.


- 이표는 목적에 따라 달라질 수 있다. 남자, 여자별로 서로비교를 원한다면,
  남자총합 기준으로 남자 혈액형별 비율을 넣고 따로 여자 총합기준으로 여자 혈액형별 비율을 넣어야 한다.

- 아래 표를 통해 O형인 경우 남녀 각각의 비율을 알 수 있으며, 남자가 여자보다 O형이 많음을 알 수 있다.





- 다른 방법으로 전체에서 어떤값이 어떤 비율을 차지하는지도 알 수 있다.
- 전체 인원 총합에서 각각의 비율을 작성한 것이다.
- 이표를 통해서 전체에서 남자이면서 O형인사람이 차지하는 비율을 알 수 있다.
- 남자전체와 여자 전체가 차지하는 비율도 알 수 있다.
- A형인 모든 사람의 비율도 알 수 있다.
- 이처럼 분할표는 목적에 따라 상대비율의 기준을 정해 사용할 수 있다.




 

2. R에서 기초 통계 확인

(1) R에서 명목형 변수의 도수분포표 

- table()함수로 단순한 표의 형태로 표현할 수 있다.
- prop.table()를 이용하여 상대도수도 구할 수 있다.
- rbind()를 이용하면 혈액형 빈도수(Freq)아래에 행으로 상대도수를 붙일수 있다.
- addmargins()함수를 이용하여 합을 추가한다.
 

> df <- read.csv("./data/example_studentlist.csv")
 
> head(df)
    name gender age grade absence bloodtype height weight
1 김길동   남자  23     3      유         O  165.3   68.2
2 이미린   여자  22     2      무        AB  170.1   53.0
3 홍길동   남자  24     4      무         B  175.0   80.1
4 김철수   남자  23     3      무        AB  182.1   85.7
5 손세수   여자  20     1      유         A  168.0   49.5
6 박미희   여자  21     2      무         O  162.0   52.0
 
> freq <- table(df$bloodtype)  #혈액형변수의 빈도수
> freq
 
 A AB  B  O 
 4  3  5  5 
 
> pfreq <- prop.table(freq)  #상대도수
> pfreq
 
        A        AB         B         O 
0.2352941 0.1764706 0.2941176 0.2941176 
 
> table <- rbind(freq,pfreq)  #빈도수아래에 상대도수 붙임
> table
              A        AB         B         O
freq  4.0000000 3.0000000 5.0000000 5.0000000
pfreq 0.2352941 0.1764706 0.2941176 0.2941176
 
> table <- addmargins(table, margin=2) #합계도 추가 1:열의합 2:행의합
> table
              A        AB         B         O Sum
freq  4.0000000 3.0000000 5.0000000 5.0000000  17
pfreq 0.2352941 0.1764706 0.2941176 0.2941176   1 

 


(2) R에서 연속형 변수의 도수분포표

실수처럼 연속형 변수는 도수분포표를 만들기 위해서 구간을 나누어야 하며 이를 계급이라 한다.
- 아래의 예제에서는 height 값을 4구간으로 나누어 작업한다.
cut(나눌객체, breaks=나누고 싶은 구간의 개수, labels=나눈 구간의 이름)
- 구간의 내용이 (162,169] 표시되는데 ( ) - 포함안되고 [ ] - 포함된다는 의미이다.
- 연속형 변수이므로 누적상대도수도 cumsum()를 이용하여 추가한다.

 

> head(df)
    name gender age grade absence bloodtype height weight
1 김길동   남자  23     3      유         O  165.3   68.2
2 이미린   여자  22     2      무        AB  170.1   53.0
3 홍길동   남자  24     4      무         B  175.0   80.1
4 김철수   남자  23     3      무        AB  182.1   85.7
5 손세수   여자  20     1      유         A  168.0   49.5
6 박미희   여자  21     2      무         O  162.0   52.0
 
> fh <- cut(df$height, breaks=4) #수치형데이터를 구간으로 나눈다
> fh
 [1] (162,169] (169,175] (169,175] (175,182] (162,169] (162,169]
 [7] (155,162] (175,182] (175,182] (175,182] (162,169] (175,182]
[13] (162,169] (175,182] (155,162] (162,169] (169,175]
Levels: (155,162] (162,169] (169,175] (175,182]
 
> tfh <- table(fh) #빈도수를 구한다.
> tfh
fh
(155,162] (162,169] (169,175] (175,182] 
        2         6         3         6 
 
> tfh <- rbind(tfh,prop.table(tfh)) # 상대도수 구한다.
> tfh
    (155,162] (162,169] (169,175] (175,182]
tfh 2.0000000 6.0000000 3.0000000 6.0000000
    0.1176471 0.3529412 0.1764706 0.3529412
 
> rownames(tfh)[2]<- "RFreq"  #빈행의 이름을 추가한다.
> tfh
      (155,162] (162,169] (169,175] (175,182]
tfh   2.0000000 6.0000000 3.0000000 6.0000000
RFreq 0.1176471 0.3529412 0.1764706 0.3529412
 
> CumFreq<- cumsum(tfh[1,]) #누적상대도수 추가한다.
> CumFreq
(155,162] (162,169] (169,175] (175,182] 
        2         8        11        17 
 
> tfh <- rbind(tfh, CumFreq)
> tfh
        (155,162] (162,169]  (169,175]  (175,182]
tfh     2.0000000 6.0000000  3.0000000  6.0000000
RFreq   0.1176471 0.3529412  0.1764706  0.3529412
CumFreq 2.0000000 8.0000000 11.0000000 17.0000000
 
> rownames(tfh) <- c("도수","상대도수","누적도수")  #행의 이름을 한글로 바꾼다.
> tfh
         (155,162] (162,169]  (169,175]  (175,182]
도수     2.0000000 6.0000000  3.0000000  6.0000000
상대도수 0.1176471 0.3529412  0.1764706  0.3529412
누적도수 2.0000000 8.0000000 11.0000000 17.0000000
 
> tfh <- addmargins(tfh, margin=2)  #margin=2:행의합
> tfh
         (155,162] (162,169]  (169,175]  (175,182] Sum
도수     2.0000000 6.0000000  3.0000000  6.0000000  17
상대도수 0.1176471 0.3529412  0.1764706  0.3529412   1
누적도수 2.0000000 8.0000000 11.0000000 17.0000000  38



(3) R에서 분할표 만들기
- 분할표는 두 변수의 조건을 만족하는 빈도수를 나타내는 표이다.
- 두변수를 만족하는 관측치가 각각 몇 개씩인지 한눈에 파악할 수 있다.
- 두변수를 table()를 이용해서 가져온다(빈도수)
- 행과 열의합을 구한후 합을 기준으로 각각의 비율을 구한다(상대도수)
- 비율의 합을 구한다.(상대도수의 합)
- 남녀별로 상대도수를 구한다. 남녀구별은 행이므로 행으로 비율을 계산한다.
- 상대도수의 합을 구한다.
  addmargins의 margin=2- 행기준margin=1-열기준
  prop.table의 margin과 반대이다.

 

> ct <- table(df$gender,df$bloodtype) #두변수의 빈도수 구함
> ct
      
       A AB B O
  남자 2  2 4 2
  여자 2  1 1 3
 
> addmargins(ct)         # 행과열의 합계
      
        A AB  B  O Sum
  남자  2  2  4  2  10
  여자  2  1  1  3   7
  Sum   4  3  5  5  17
 
> pct <- prop.table(ct) # 상대도수 구하기
> pct
      
                A         AB          B          O
  남자 0.11764706 0.11764706 0.23529412 0.11764706
  여자 0.11764706 0.05882353 0.05882353 0.17647059
 
> addmargins(pct)  #상대도수합구하기
      
                A         AB          B          O        Sum
  남자 0.11764706 0.11764706 0.23529412 0.11764706 0.58823529
  여자 0.11764706 0.05882353 0.05882353 0.17647059 0.41176471
  Sum  0.23529412 0.17647059 0.29411765 0.29411765 1.00000000
 
> pct2 <- prop.table(ct,margin=1) #행으로 비율계산
> pct2
      
               A        AB         B         O
  남자 0.2000000 0.2000000 0.4000000 0.2000000
  여자 0.2857143 0.1428571 0.1428571 0.4285714
 
> addmargins(pct2,margin=2)  #상대도수합 행별 합계
      
               A        AB         B         O       Sum
  남자 0.2000000 0.2000000 0.4000000 0.2000000 1.0000000
  여자 0.2857143 0.1428571 0.1428571 0.4285714 1.0000000
 
> addmargins(pct)  #상대도수합구하기
      
                A         AB          B          O        Sum
  남자 0.11764706 0.11764706 0.23529412 0.11764706 0.58823529
  여자 0.11764706 0.05882353 0.05882353 0.17647059 0.41176471
  Sum  0.23529412 0.17647059 0.29411765 0.29411765 1.00000000
 
> pct2 <- prop.table(ct,margin=2) #열로 비율계산
> pct2
      
               A        AB         B         O
  남자 0.5000000 0.6666667 0.8000000 0.4000000
  여자 0.5000000 0.3333333 0.2000000 0.6000000
 
> addmargins(pct2,margin=1)  #상대도수합 열별 합계
      
                A        AB         B         O
  남자 0.5000000 0.6666667 0.8000000 0.4000000
  여자 0.5000000 0.3333333 0.2000000 0.6000000
  Sum  1.0000000 1.0000000 1.0000000 1.0000000


댓글