> ## Content Index
> Fetch the complete content index at: https://www.popit.kr/llms.txt
> Use this file to discover other available public pages before exploring further.

# 개발자가 배우는 R : 6강, 기초통계 함수 배워보기
- URL: https://www.popit.kr/developer-learns-r-6-basic-statistics-functions/
- Published: 2017-04-16T15:10:05.000Z
- Updated: 2017-04-29T08:56:29.000Z
- Author: 광식 이
- Tags: #소프트웨어, R, 개발자, #데이터분석, 머신러닝, 알, 기계학습, 통계분석

# 개요

**이번 포스팅에는 그룹핑 관련 함수와 도표 데이터를 다루기 시작하는것 까지 진행한다.**

코드중심의 설명이기 때문에 본문 보다는 코드의 주석이 집중적으로 추가되어 있으니 참고 바란다.

## tapply 함수 사용하기

이미 배운 tapply 함수를 데이터프레임에서는 그룹핑에 활용 할 수 있다.

```r
> attach(mtcars)
 
> tapply(mpg, am, mean) # mpg값을 am값으로 group화 하여 평균값(mean)을 구한다.
       0        1
17.14737 24.39231
 
> tapply(mpg, am, mean, na.rm=TRUE) # na.rm을 이용하여 평균값을 구할때 na값을 제거한다는 뜻이다.
       0        1
17.14737 24.39231
 
> detach(mtcars)
알아두면 좋은 점은 tapply 2번째 인지값은 리스트를 지정해야 한다는 것이다.

> attach(mtcars)
 
> tapply(mpg, list(am, cyl), mean)
       4        6     8
0 22.900 19.12500 15.05
1 28.075 20.56667 15.40
 
> detach(mtcars)
```

## aggregate 함수

aggregate 함수를 이용하여서도 그룹별 데이터를 조회해볼 수 있다.

```r
> vars <- c("mpg", "hp", "wt")
 
> aggregate(mtcars[vars], by=list(am=mtcars$am), mean) # mtcars 데이터로 am값을 이용하여 평균값을 구한다.
am mpg hp wt
1 0 17.14737 160.2632 3.768895
2 1 24.39231 126.8462 2.411000
 
> aggregate(mtcars[vars], by=list(am=mtcars$am), sd) # mtcars 데이터로 am값을 이용하여 표준편차를 구한다.
am mpg hp wt
1 0 3.833966 53.90820 0.7774001
2 1 6.166504 84.06232 0.6169816
```

## y\~x aggregation 표현식

**가장 많이 사용하는 방법은 아래의 방법으로써** y\~x 표현식을 쓰면 표기가 더 간단해진다.

이부분은 y = x라는 함수라는 개념으로 x가 가변인자이고 y는 aggregation 적용 대상이다.

```r
> aggregate(mpg~am, mtcars, mean) # mpg가 y값 am은 x값 개념이다. 즉 am값에 따른 mpg의 평균값이다.
  am      mpg
1  0 17.14737
2  1 24.39231
 
> aggregate(mpg~am+cyl, mtcars, mean) # am과 cyl조합이 x값, mpg가 y값으로 평균을 구한다.
  am cyl      mpg
1  0   4 22.90000
2  1   4 28.07500
3  0   6 19.12500
4  1   6 20.56667
5  0   8 15.05000
6  1   8 15.40000
 
> aggregate(cbind(mpg, wt)~am, mtcars, mean) # y값을 여러개 지정하고 싶을때는 cbind를 사용한다.
  am      mpg       wt
1  0 17.14737 3.768895
2  1 24.39231 2.411000
```

## by 함수

안타깝게도 **aggregate()** 함수는 단일값에 대해서만 적용가능하다.

예를 들어 평균값, 표준편차 등에서는 사용가능하지만 그렇지 않은 통계지표들이 있는데 이럴때는 **by()** 함수를 사용하면 된다.

```r
> vars <- c("mpg", "hp", "wt")
>  by(mtcars[vars], mtcars$am, summary)
mtcars$am: 0
      mpg              hp              wt       
 Min.   :10.40   Min.   : 62.0   Min.   :2.465  
 1st Qu.:14.95   1st Qu.:116.5   1st Qu.:3.438  
 Median :17.30   Median :175.0   Median :3.520  
 Mean   :17.15   Mean   :160.3   Mean   :3.769  
 3rd Qu.:19.20   3rd Qu.:192.5   3rd Qu.:3.842  
 Max.   :24.40   Max.   :245.0   Max.   :5.424  
------------------------------------------------------------
mtcars$am: 1
      mpg              hp              wt       
 Min.   :15.00   Min.   : 52.0   Min.   :1.513  
 1st Qu.:21.00   1st Qu.: 66.0   1st Qu.:1.935  
 Median :22.80   Median :109.0   Median :2.320  
 Mean   :24.39   Mean   :126.8   Mean   :2.411  
 3rd Qu.:30.40   3rd Qu.:113.0   3rd Qu.:2.780  
 Max.   :33.90   Max.   :335.0   Max.   :3.570
```

## describeBy 함수

**psych 패키지**의 **describeBy()** 함수는 **describe()** 함수의 그룹핑 버전이라 생각하면 된다.

```r
> library(psych)
 
> describeBy(mtcars[c("mpg", "wt")], mtcars$am)
 
 Descriptive statistics by group
group: 0
    vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
mpg    1 19 17.15 3.83  17.30   17.12 3.11 10.40 24.40 14.00 0.01    -0.80 0.88
wt     2 19  3.77 0.78   3.52    3.75 0.45  2.46  5.42  2.96 0.98     0.14 0.18
------------------------------------------------------------
group: 1
    vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis   se
mpg    1 13 24.39 6.17  22.80   24.38 6.67 15.00 33.90 18.90 0.05    -1.46 1.71
wt     2 13  2.41 0.62   2.32    2.39 0.68  1.51  3.57  2.06 0.21    -1.17 0.17
```

# 도표 데이터 다루기

이번 시간부터 도표 데이터를 다루는 법을 알아보기로 한다.

## CSV -> 테이블 로드

우선 csv를 불러와 테이블로 넣어본다.

CSV 파일은 [github](https://github.com/lks21c/r%5Fsample%5Fdata/blob/master/file%5Fload/smoker.csv?ref=popit.kr)에 올려두었다.

```r
> smokeData <- read.csv("/home/lks21c/Downloads/ch4/smoker.csv")
 
> summary(smokeData)
     Smoke         SES     
 current:116   High  :211  
 former :141   Low   : 93  
 never  : 99   Middle: 52  
 
> smokerTable <- table(smokeData$Smoke, smokeData$SES) # 행, 열로 지정
 
> smokerTable
 
         High Low Middle
 current   51  43     22
 former    92  28     21
 never     68  22      9
```

## margin 함수

**margin 함수**를 통해 전체, 행, 열별 총 합계를 구할 수 있다.

```r
> margin.table(smokerTable) # 모든 데이터 총 합계
 [1] 356
 
 > margin.table(smokerTable, 1) # 행 별 데이터 총 합계
 current former never
 116 141 99
 
 > margin.table(smokerTable, 2) # 열 별 데이터 총 합계
 High Low Middle
 211 93 52
재밌는 점은 margin.table 함수로 계산한 행/열별 데이터를 벡터연산처럼 수행 할 수있다.

이를 통해 각 값들이 차지하는 비율을 확인 할 수 있다.

 > smokerTable / margin.table(smokerTable)
 High Low Middle
 current 0.14325843 0.12078652 0.06179775
 former 0.25842697 0.07865169 0.05898876
 never 0.19101124 0.06179775 0.02528090
 
 > margin.table(smokerTable, 1) / margin.table(smokerTable)
 current former never
 0.3258427 0.3960674 0.2780899
 
 > margin.table(smokerTable, 2) / margin.table(smokerTable)
 High Low Middle
 0.5926966 0.2612360 0.1460674
```

위의 예제는 margin.table로의 연산이 가능한 것을 보여주기 위한 방식이고 실제로 각 값들이 차지하는 비율을 보려면 아래와 같이 **prop.table**을 사용하면 된다.

```r
> prop.table(smokerTable)
 High Low Middle
 current 0.14325843 0.12078652 0.06179775
 former 0.25842697 0.07865169 0.05898876
 never 0.19101124 0.06179775 0.02528090
 
 > prop.table(smokerTable, 1) # by row
 High Low Middle
 current 0.43965517 0.37068966 0.18965517
 former 0.65248227 0.19858156 0.14893617
 never 0.68686869 0.22222222 0.09090909
 
 > prop.table(smokerTable, 2) # by column
 High Low Middle
 current 0.2417062 0.4623656 0.4230769
 former 0.4360190 0.3010753 0.4038462
 never 0.3222749 0.2365591 0.1730769
```

[](http://www.kwangsiklee.com/?ref=popit.kr)