쭈쌤
쭈쌤 Hello World

[R 데이터분석] 기술통계

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 기술통계≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[R 데이터분석] 기술통계

기술통계란 자료를 그래프나 숫자등으로 요약하는 통계적 행위 및 관련 방법을 의미합니다.

데이터를 요약하고 시각화해서 잘 설명하는 것이 중점을 두며 데이터에 대해서 쉽게 설명하기 위해서 시각화를 많이 활용합니다.

기술 통계에서 기본적으로 사용하는 시각화 자료들은 박스플롯(상자그림), 도수분포표, 히스토그램이 있으며 이를 기반으로 사실을 객관적으로 확인하는 것을 중점으로 합니다.

#01. 기술통계 절차

  1. 데이터의 전체 크기와 형태
    • 행과 열의 수를 확인한다.
    • 10만건의 데이터 전체를 출력하는 것은 매우 부담이 큰 처리이므로 상위 n건, 하위 n건의 일부만을 확인한다.
  2. 집단의 특성을 잘 나타내는 요약 통계량을 확인한다.
    • 평균, 중앙값, 표준편차, 범위(최대값~최소값), 사분위수 등을 확인한다.
    • 요약통계량을 상자그림으로 시각화하여 확인한다.
  3. 전체 데이터의 데이터 분포를 확인한다.
    • 구간별 자료의 개수를 나타내는 표(=도수분포표)를 산정한다.
    • 도수 분포표를 그래프로 표현한 히스토그램을 확인한다.

데이터의 기본 특성을 파악한 후 데이터 전처리와 데이터 정제 과정을 거쳐 분석을 진행하게 된다.

#02. 실습을 위한 샘플 데이터 프레임 만들기

1
2
성적표 <- read.csv("http://itpaper.co.kr/demo/r/grade.csv", stringsAsFactors=F, fileEncoding="euc-kr")
성적표
▶ 출력결과

A data.frame: 5 × 7

이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자 98NA8864
영희2여자 88906272
민수1남자 9270NANA
수현3여자 63603170
호영4남자12050NA88

#03. 데이터의 전체 크기 확인

1) 행과 열의 크기 확인

1
2
크기 <- dim(성적표)
크기
▶ 출력결과
1
2
1. 5
2. 7

2) 상위 n건 확인하기

1
2
상위데이터 <- head(성적표, 3)
상위데이터
▶ 출력결과
A data.frame: 3 × 7
이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
철수1남자98NA8864
영희2여자88906272
민수1남자9270NANA

3) 하위 n건 확인하기

1
2
하위데이터 <- tail(성적표, 3)
하위데이터
▶ 출력결과
A data.frame: 3 × 7
이름학년성별국어영어수학과학
<chr><int><chr><int><int><int><int>
3민수1남자 9270NANA
4수현3여자 63603170
5호영4남자12050NA88

#04. 요약 통계량 확인

1) 요약 통계량을 이해하기 위한 통계학 개념

평균값

모든 값을 더한 후 개수로 나눈 값.

1, 2, 3, 4, 5, 100의 평균은 (1+2+3+4+5+100)/6 이므로 19.17이다.

평균은 특정 값이 다른 값들의 범위와 차이가 큰 경우 신뢰도가 떨어진다.

위의 데이터에서 100에 해당하는 값은 다른 값들에 비해 극단적으로 높다. 이러한 형태의 값을 극단치라고 한다.

중앙값

모든 값을 순서대로 정렬한 후 가운데 위치의 값.

평균의 신뢰도가 현저히 낮을 경우 데이터의 분포를 확인하기 위해 사용한다.

데이터의 수가 홀수개인 경우

모든 값을 순서대로 정렬한 후 가운데 위치의 값.

1, 2, 3, 4, 5의 중앙값은 3이다.

데이터의 수가 짝수개인 경우

모든 값을 순서대로 정렬한 후 가운데 두 값의 평균.

1, 2, 3, 4, 5, 6의 중앙값은 (3+4)/2이므로 3.5이다.

2) 사분위 수

데이터 표본을 4개의 동일한 부분으로 나눈 값.

사분위수를 사용하여 데이터 집합의 범위와 중심 위치를 신속하게 평가할 수 있다.

이는 데이터를 이해하는 데 중요한 첫 번째 단계이다.

용어 설명
1사분위 수 데이터의 하위 25%가 이 값보다 작거나 같음.
2사분위 수 중위수 데이터의 50%가 이 값보다 작거나 같음. (=중앙값)
3사분위 수 데이터의 하위 75%가 이 값보다 작거나 같음.

반대로 말하면 데이터의 상위 25%는 3사분위 수 보다 크다.

예를 들어, 데이터가 7, 9, 16, 36, 39, 45, 45, 46, 48, 51인 경우

Q1 = 14.25
Q2(중위수) = 42
Q3 = 46.50
사분위간 범위 = 14.25 ~ 46.50 또는 32.25

사분위수는 데이터의 관측치가 아닌 계산된 값이다.

사분위수를 정확하게 계산하려면 종종 두 관측치 사이를 보간해야 한다.

중위수와 사분위간 범위는 극단치의 영향을 받지 않기 때문에 평균 및 표준 편차보다 치우침이 많은 데이터의 중심 위치와 범위의 더 나은 측도가 될 수 있다.

3) 모든 항목에 대한 요약통계 결과 일괄 확인

항목 의미
Min 최소값
1st Qu. 1사분위 수 (하위 25% 지점의 데이터)
Median 중앙값/2사분위 수(50% 지점의 데이터)
Mean 평균
3rd Qu. 3사분위 수(상위 25% 지점의 데이터)
Max 최대값
NA’s 결측값의 수
1
2
요약통계 <- summary(성적표)
요약통계
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
     이름                학년         성별                국어
 Length:5           Min.   :1.0   Length:5           Min.   : 63.0
 Class :character   1st Qu.:1.0   Class :character   1st Qu.: 88.0
 Mode  :character   Median :2.0   Mode  :character   Median : 92.0
                    Mean   :2.2                      Mean   : 92.2
                    3rd Qu.:3.0                      3rd Qu.: 98.0
                    Max.   :4.0                      Max.   :120.0

      영어           수학            과학
 Min.   :50.0   Min.   :31.00   Min.   :64.0
 1st Qu.:57.5   1st Qu.:46.50   1st Qu.:68.5
 Median :65.0   Median :62.00   Median :71.0
 Mean   :67.5   Mean   :60.33   Mean   :73.5
 3rd Qu.:75.0   3rd Qu.:75.00   3rd Qu.:76.0
 Max.   :90.0   Max.   :88.00   Max.   :88.0
 NA's   :1      NA's   :2       NA's   :1

4) 개별 함수를 통한 확인

각각의 열별로 개별 조회를 위해서는 다음의 함수들을 사용한다.

최대값

1
max(성적표$국어)
▶ 출력결과
1
120

최소값

1
min(성적표$국어)
▶ 출력결과
1
63

평균값

1
mean(성적표$국어)
▶ 출력결과
1
92.2

분산

1
var(성적표$국어)
▶ 출력결과
1
419.2

표준편차

1
sd(성적표$국어)
▶ 출력결과
1
20.4743742273116

중앙값

1
median(성적표$국어)
▶ 출력결과
1
92

길이

1
length(성적표$국어)
▶ 출력결과
1
5

범위

1
range(성적표$국어)
▶ 출력결과
1
2
1. 63
2. 120

순위

데이터를 순서대로 정렬했을 때 해당 행이 몇 번째 순위인지 표시한다.

1
rank(성적표$국어)
▶ 출력결과
1
2
3
4
5
1. 4
2. 2
3. 3
4. 1
5. 5

역순정렬

1
rev(성적표$국어)
▶ 출력결과
1
2
3
4
5
1. 120
2. 63
3. 92
4. 88
5. 98

순차정렬

1
sort(성적표$국어)          #순차정렬
▶ 출력결과
1
2
3
4
5
1. 63
2. 88
3. 92
4. 98
5. 120

#05. 상자그림

데이터의 요약 정보를 시각화 해 놓은 그래프로 데이터의 범위, 사분위 수 등을 확인할 수 있는 시각화 자료이다.

png

1) jupyter에서의 시각화 옵션 지정하기

a) 그래프 크기 설정

출력될 시각화 결과물의 사이즈를 지정한다. 한번 설정하면 다시 재설정하기 전까지는 이후의 모든 시각화 출력에 영향을 준다.

1
options(repr.plot.width=5, repr.plot.height=5)

b) 불필요한 경고 메시지 끄기

한글 처리 과정에서 표시되는 불필요한 경고 메시지가 표시되지 않도록 설정한다.

1
options(warn=-1)

2) 특정 컬럼에 대한 상자그림 표시하기

모든 컬럼이 숫자값으로만 이루어진 데이터프레임의 경우 boxplot(데이터프레임) 형식으로 전체 데이터 프레임을 지정하면, 모든 컬럼에 대해 일괄 처리하지만 현재 사용중인 샘플 데이터는 이름이라는 문자열 컬럼이 있기 때문에 한번에 일괄 표시는 할 수 없다.

1
boxplot(성적표$영어)
▶ 출력결과

png

3) 다중 컬럼에 대한 상자그림

콤마로 시각화 하고자 하는 컬럼들을 나열한다.

1
boxplot(성적표$국어, 성적표$영어)
▶ 출력결과

png

4) 한글 표시를 위한 준비 과정

a) 한글을 사용할 수 있는 폰트 확인을 위한 패키지 설치 및 로드

1
2
3
4
5
6
7
REPO_URL <- "https://cran.seoul.go.kr/"

if (!require("extrafont")) {
    install.packages("extrafont", repos=REPO_URL)
}

library(extrafont)

b) NanumGothic이라는 단어를 포함하는 이름을 갖는 폰트 설치하기

운영체제에 설치된 글꼴들을 R 자체적으로 관리하는 폰트 디렉토리로 복사한다.

나눔고딕이 설치되어 있지 않은 경우 네이버에서 검색후 다운로드 가능함.

1
font_import(pattern = "NanumGothic")
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
Importing fonts may take a few minutes, depending on the number of fonts and the speed of the system.
Continue? [y/n]  y

Scanning ttf files in /Library/Fonts/, /System/Library/Fonts, ~/Library/Fonts/ ...
Extracting .afm files from .ttf files...
/Users/leekh/Library/Fonts/NanumGothic.ttf : NanumGothic already registered in fonts database. Skipping.
/Users/leekh/Library/Fonts/NanumGothicBold.ttf : NanumGothicBold already registered in fonts database. Skipping.
/Users/leekh/Library/Fonts/NanumGothicExtraBold.ttf : NanumGothicExtraBold already registered in fonts database. Skipping.
/Users/leekh/Library/Fonts/NanumGothicLight.ttf : NanumGothicLight already registered in fonts database. Skipping.
Found FontName for 0 fonts.
Scanning afm files in /usr/local/lib/R/3.6/site-library/extrafontdb/metrics

c) 설치된 폰트 목록 확인

fonttable() 함수를 통해 반환받는 DataFrame에서 FamilyName 컬럼을 확인하면 R 소스코드에 적용해야 할 폰트 이름을 확인할 수 있다.

출력결과는 시스템에 설치되어 있는 글꼴의 상태에 따라 다를 수 있다.

1
2
ftable <- fonttable()
ftable$FamilyName
▶ 출력결과
1
2
3
4
1. 'D2Coding'
2. 'NanumBarunGothic'
3. 'NanumBarunpen'</li>
4. 'NanumGothic'

d) 설치된 폰트들 로드하기

1
2
3
# mac의 경우 `device="win"` 생략
#loadfonts(device="win")
loadfonts()
▶ 출력결과
1
2
3
4
5
6
7
D2Coding already registered with pdfFonts().
NanumBarunGothic already registered with pdfFonts().
NanumBarunGothic Light already registered with pdfFonts().
NanumBarunGothic UltraLight already registered with pdfFonts().
NanumGothic already registered with pdfFonts().
NanumGothicExtraBold already registered with pdfFonts().
NanumGothic Light already registered with pdfFonts().

5) 상자그림의 옵션 사용하기

옵션 설명
col 색상
main 제목지정
xlab x축 이름
ylab y축 이름
xlim x값 범위
ylim y값 범위
names 각 데이터 이름
1
2
3
4
5
6
7
8
9
10
par(family = "NanumGothic")            # 사용할 글꼴 지정

boxplot(성적표$국어, 성적표$수학,
       col=c('#ffff00', '#ff6600'),    # 색상값. 항목 수 만큼 백터로 지정
       main='국어,수학 점수 분포',
       xlab='과목',
       ylab='점수',
       xlim=c(0,3),
       ylim=c(0,150),
       names=c('국어','수학'))
▶ 출력결과

png

#06. 데이터 분포(도수분포) 확인하기

  1. 계급 (Class)
    • 자료가 취하는 전체 범위를 몇 개의 소집단(범주,구간)으로 나눈것
  2. 도수/빈도 (Frequency)
    • 각 계급에 속하는 자료의 수
  3. 상대도수 (Relative Frequency)
    • 도수를 전체 자료의 수, 즉 전체 도수로 나눈 비율(Proportion,Probability)
    • 상대도수를 모두 합하면, 1 이 됨
  4. 도수분포표 (Frequency Table)
    • 모집단의 대략적인 분포의 형태, 중심위치, 산포 등을 파악하기 위한 데이터정리 방법
    • 계급, 도수, 상대도수, 누적도수 등으로 구성
  5. 잃는 정보, 얻는 정보
    • 도수분포표에서 잃어버리는 정보 : 자료 그 자체의 수치값
    • 도수분포표에서 얻는 정보 : 자료 분포의 특징 (집중성,대칭성 등)

1) 도수 분포표 생성하기

1
2
3
# 국어점수에 대한 구간별 데이터 수
분포표1 <- table(성적표$국어)
분포표1

출력결과에서의 구간별 의미

  • 63이상, 88미만
  • 88이상, 92미만
  • 92이상, 98미만
  • 98이상, 120미만
  • 120이상
▶ 출력결과
1
2
 63  88  92  98 120
  1   1   1   1   1
1
2
3
# 영어 점수에 대한 구간별 데이터 수
분포표2 <- table(성적표$영어)
분포표2
▶ 출력결과
1
2
50 60 70 90
 1  1  1  1

2) 교차표

  • 두 변수의 빈도 표를 교차시켰다는 의미
  • 교차 분석에 사용

교차표 생성하기

1
2
교차표 <- table(성적표$국어, 성적표$영어)
교차표
▶ 출력결과
1
2
3
4
5
6
      50 60 70 90
  63   0  1  0  0
  88   0  0  0  1
  92   0  0  1  0
  98   0  0  0  0
  120  1  0  0  0

#07. 히스토그램

자료 값이 가질 수 있는 범위를 몇 개의 구간으로 나누고 각 구간에 해당하는 값의 숫자 혹은 상대적 빈도를 표현하는 그래프.

즉, 도수분포표에 대한 시각화 결과물이라 할 수 있다.

히스토그램 작성 과정

  1. 자료의 갯수와 구간(최대값, 최소값)을 확인한다.
  2. 자료를 몇 개의 구간으로 나눌지 결정한다.
  3. 구간은 자료의 개수나 분포에 따라 달라져야 한다.
  4. 각 구간별로 5개 이상의 값이 들어가도록 하는 것이 좋다.
  5. 너무 많은 구간을 나누지 않도록 해야 한다. (일반적으로 5~15 사이의 값)

R의 경우 hist 함수가 위의 과정을 수행해 준다.

1
2
3
# 국어 점수에 대한 히스토그림 생성
par(family = "NanumGothic")
hist(성적표$국어)
▶ 출력결과

png

히스토그램 함수의 파라미터

  • labels : 수치값 표시 여부. TRUE / FALSE
  • main=’국어점수 히스토그램’
  • xlab=’점수수간’
  • ylab=’상대도수’
  • breaks : 계급 구간, 계급의 경계.
    1. 계급 구간의 수.
    2. breakpoint를 구하는 함수.
      • nclass.Sturges, nclass.scott, nclass.FD
    3. 계급 구간의 수를 구하는 알고리즘 문자열.
      • “Sturges”,”Scott”,”FD”,”freedmandiaconis”
  • freq : TRUE일 때, y축의 단위는 frequencies(도수). FALSE일 때, probabilities(상대도수).
  • density : 막대 내부 빗금의 밀도. (default=NULL)
  • angle : 막대 내부 빗금의 기울기. (default=45)
  • col : 막대 내부 색.
  • border : 막대 테두리 색.
  • plot : (default)TRUE일 때, 히스토그램을 출력. FALSE일 때 자료값들을 리스트로 반환.
    • 리스트 요소 : breaks, counts(각 계급 도수), intensities, density(상대도수, 확률밀도), mids, xname, equidist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
par(family = "NanumGothic")
options(repr.plot.width=5, repr.plot.height=6.5)
hist(성적표$국어,
     labels=TRUE,
     main='국어점수 히스토그램',
     xlab='점수수간',
     ylab='상대도수',
     breaks=2,
     freq=FALSE,
     density=1,
     angle=60,
     col=c('red','orange'),
     border=c('green', 'blue'),
     plot=TRUE)
▶ 출력결과

png

히스토그램의 자료값 반환받기

plot 파라미터를 FALSE로 지정하여 사용한다.

이 때 breaks를 제외한 다른 파라미터는 사용되지 않기 때문에 hist 함수에 설정할 경우 경고 메시지가 표시된다.

  • breaks : 계급(구간)
  • counts : 각 계급별 도수 (데이터 수)
  • density : 각 계급별 상대도수 (확률밀도)
  • mids : 데이터 구간 (최소값~최대값)
  • xname : 데이터 이름
1
hist(성적표$국어, breaks=2, plot=FALSE)
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$breaks
[1]  50 100 150

$counts
[1] 4 1

$density
[1] 0.016 0.004

$mids
[1]  75 125

$xname
[1] "성적표$국어"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R 데이터분석] 기술통계≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus