생각 작업실 The atelier of thinking

14-2. R 을 이용한 자료 요약 본문

통계학 이야기

14-2. R 을 이용한 자료 요약

knowledge-seeker 2023. 9. 1. 17:39

Chapter 14. R을 이용한 자료 요약

 

지난 회차에 이어 R을 이용하여 자료를 요약하는 법을 알아보겠습니다.

 

자료요약은 지난 11회차에 간단히 알아봤습니다.

 

2023.08.28 - [통계학 이야기] - 11. 자료의 요약

 

11. 자료의 요약

Chapter 11. 자료의 요약 1. 자료를 요약 정리해야 하는 이유 자료를 요약 정리해야 하는 이유에 대하여 아래와 같습니다. (1) 자료의 양이 많아지면 분석하기 힘들어지기 때문에 자료를 간결하게 요

thinking-atelier.tistory.com

 

아래의 자료를 이용하여 히스토그램과 줄기-잎 그래프를 그려보고자 합니다.

 

◈ 대학 정보 공시 취업률 자료

      위 자료는 통계학 관련 42개 학과의 취업률을 나타내고 있습니다.

      최소 취업률은 19.6%, 최대취업률은 91.3% 입니다.

      위 자료는 수치자료지만 범주화를 하고, 또 히스토그램을 그려보고자 합니다.

 

1.  수치자료의 범주화

 수치자료를 범주화하는 과정을 구간화라고도 합니다. 이는 연속형 데이터를 구간별로 나누어 범주로 만드는 과정입니다. 우선 계급(class)의 수와 경계값(크기) 결정합니다.  계급의 경계는 기본적으로 동일 간격이 좋으며 자료의 구조와 설명을 고려해 선택합니다.

 

 (1) 자료 불러오기

 

Job <- scan()
55.6 83.3 43.4 58.1 31.6 55.6 60.7 64.6 73.3 55.6 64.3
52.8 22.7 46.3 71.4 53.8 64.5 67.9 71.4 80.0 59.5 40.5
77.1 58.6 65.4 52.4 66.7 91.3 41.3 72.1 61.9 78.4 63.6
41.0 65.2 81.3 54.8 19.6 50.0 53.1 41.2 56.5

 R studio 에서 위 코드를 실행 시킨후 console 부문에서 enter를 치면 위와 같이 42개 데이터가 있음을 알려줍니다.

 

(2) 구간 설정

 

   위 자료는 최소점을 10%, 최대점 100%, 기본 계급구간 10%로 하고 도수가 적은 계급은 통합해서 구간 설정을 하고자 합니다.

cut(Job, breaks=c(10, 39.9, 49.9, 59.9, 69.9, 79.9, 100))

 

▶ cut( ) 함수

   연속형 변수를 구간으로 나누는데 사용합니다.

    위의 경우 구간을 초과, 이하로 설정되어 있습니다. ( ) 괄호는 초과,미만,  [ ] 괄호는 이상,이하를 의미합니다.

 

위와 똑같은 구간 설정을 아래와 같이 표현할 수 있습니다.

cut(Job, breaks=c(10, 40, 50, 60, 70, 80, 100),right=FALSE)

 

cut(x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE, 
    dig.lab = 3, ordered_result = FALSE)

x: 나눌 연속형 변수
breaks: 구간을 나누는 기준값. 
labels: 구간에 대한 레이블을 지정. 기본값은 NULL, 구간의 범위가 레이블로 사용.
include.lowest: 첫 번째 구간의 하한값을 포함할지 여부를 결정. 기본값은 FALSE 
첫 번째 구간의 하한값은 포함되지 않는다.
right: 우측 경계값을 포함할지 여부를 결정. 기본값은 TRUE로, 우측 경계값을 포함한다.
dig.lab: 레이블을 소수점 몇 자리까지 표시할지 결정. 기본값은 3으로, 세 자리까지 표시.
ordered_result: 반환되는 결과를 순서형(factor) 변수로 설정할지 여부를 결정. 
기본값은 FALSE로, 반환되는 결과는 범주형(factor) 변수.

 

(3) 도수분포표

JobCut <- cut(Job, breaks=c(10, 40, 50, 60, 70, 80, 100),right=FALSE)
table(JobCut)

   앞서 사용했던 table( ) 함수를 이용하여 도수분포표를 작성합니다.

 

  백분율로 표현해봅니다. prop.table( ) 함수와 round( ) 함수를 사용합니다.

JobFreq <- table(JobCut)
round(prop.table(JobFreq),3)

위 코드로 만들어진 백분율은 상대도수입니다. 

이제 누적상대도수를 구해보겠습니다.

JobProp <- round(prop.table(JobFreq),3)
cumsum(JobProp)

▶ cumsum( ) 함수

   상대도수의 누적 합을 계산하는데 사용합니다. 

 

이제 빈도수,상대도수,누적상대도수를 함께 나타내보겠습니다.

JobFreq <- table(JobCut)
JobProp <- round(prop.table(JobFreq),3)
CumJobProp <- cumsum(JobProp)
cbind(JobFreq,JobProp,CumJobProp)

위 표의 행과 열이름을 바꿔보겠습니다.

Result <- cbind(JobFreq,JobProp,CumJobProp)
colnames(Result) <- c("학과수","상대도수","누적상대도수")
rownames(Result) <- c("10%이상~40%미만","40%이상~50%미만","50%이상~60%미만",
                      "60%이상~70%미만","70%이상~80%미만","80%이상~100%")
Result

▶ colname( ) : 컬럼 이름을 설정합니다.

▶ rowname( ) : 행이름을 설정합니다.

 

2. 히스토그램 (Histogram)

히스토그램은 수치자료 특히 연속형 자료의 분포형태를 표시합니다.

 

위 취업률 자료를 히스토그램으로 그려봅니다.

hist(Job)

▶hist( ) 함수

   히스토그램을 생성하는 함수입니다.

   매개변수 freq 와 probability는 히스토그램 막대 높이를 조정합니다.

     freq : 기본값은 TRUE. 이 경우, 히스토그램의 막대 높이는 해당 구간(bin)에 속하는 데이터의 빈도수로 표시합니다. 즉, 막대 높이는 해당 구간 내에 포함된 데이터의 개수를 말합니다.

    probability : 히스토그램의 막대 높이는 해당 구간에 속하는 데이터의 상대적인 비율 또는 확률로 표시됩니다. 즉, 막대 높이는 해당 구간 내의 데이터 비율 또는 확률을 말합니다. probability를 TRUE로 설정하면 히스토그램의 총 면적이 1이 되도록 조정됩니다.

 

par(mfrow=c(1,2))
hist(Job,freq=FALSE,ylim=c(0,0.035))  # hist(Job, probability=TRUE)
hist(Job,freq=TRUE)  # hist(Job, probability=FALSE)

    y 축이 각각 밀도(Density)와 빈도수(Frequency) 로 나타나는 것을 확인할 수 있습니다.

 

   아래의 매개변수로 히스토그램의 모양을 다양하게 할 수 있습니다.

hist(x, breaks = "", col = "", main = "", xlab = "", ylab = "", ...)

      x: 히스토그램을 생성할 데이터 벡터 또는 수치형 변수
      breaks: 히스토그램의 구간(bin) 개수를 지정             
      col: 히스토그램의 막대 색상을 지정.
      main: 히스토그램의 제목을 지정.
      xlab: x축의 레이블을 지정.
      ylab: y축의 레이블을 지정.
par(mfrow=c(1,2))
hist(Job,freq=FALSE,ylim=c(0,0.035)) 
hist(Job,breaks = c(10, 39.99, 49.99, 59.99, 69.99, 79.99, 100), 
     main = "취업률 히스토그램", xlab = "취업률",
     ylab = "밀도",ylim=c(0,0.035), col="steelblue")

정리
# 1. 자료불러오기

Job <- scan()
55.6 83.3 43.4 58.1 31.6 55.6 60.7 64.6 73.3 55.6 64.3
52.8 22.7 46.3 71.4 53.8 64.5 67.9 71.4 80.0 59.5 40.5
77.1 58.6 65.4 52.4 66.7 91.3 41.3 72.1 61.9 78.4 63.6
41.0 65.2 81.3 54.8 19.6 50.0 53.1 41.2 56.5

# 2. 구간설정

cut(Job, breaks=c(10, 39.9, 49.9, 59.9, 69.9, 79.9, 100))
cut(Job, breaks=c(10, 40, 50, 60, 70, 80, 100),right=FALSE)

# 3. 도수분포표

JobCut <- cut(Job, breaks=c(10, 40, 50, 60, 70, 80, 100),right=FALSE)
JobFreq <- table(JobCut)
JobProp <- round(prop.table(JobFreq),3)
CumJobProp <- cumsum(JobProp)
Result <- cbind(JobFreq,JobProp,CumJobProp)
colnames(Result) <- c("학과수","상대도수","누적상대도수")
rownames(Result) <- c("10%이상~40%미만","40%이상~50%미만","50%이상~60%미만",
                      "60%이상~70%미만","70%이상~80%미만","80%이상~100%")
Result

# 4. Histogram

hist(Job)

par(mfrow=c(1,2))
hist(Job,freq=FALSE,ylim=c(0,0.035))  # hist(Job, probability=TRUE)
hist(Job,freq=TRUE)  # hist(Job, probability=FALSE)

par(mfrow=c(1,2))
hist(Job,freq=FALSE,ylim=c(0,0.035)) 
hist(Job,breaks = c(10, 39.99, 49.99, 59.99, 69.99, 79.99, 100), 
     main = "취업률 히스토그램", xlab = "취업률",
     ylab = "밀도",ylim=c(0,0.035), col="steelblue")