1.기술 통계

1.1 중심위치의 측정

1.1.1 평균 및 결측치

weight <- c(72, 67, 60, 78, 82)
mean(weight)

myNum <-  sample(x = 1:100, size = 100, replace = TRUE)  # 복원추출 100개의 난수 생성
myNum
mean(myNum)

myNum[sample(x = 1:100, size = 20, replace = FALSE)]     # 비복원 추출 20개 난수 생성
myNum
mean(myNum)


n <- sample(x = 1:100, size = 20, replace = FALSE)
myNum[n] <- NA                                           # 20개 짜리 index 값에 결측치 부여
myNum

mean(myNum, na.rm = TRUE)                                # 결측값을 제외하고 연산
sum(myNum, na.rm = TRUE)
var(myNum, na.rm = TRUE)
sd(myNum, na.rm = TRUE)

1.1.2 가중평균

# 예시1
sales <- c(95,72,87,65)
weights <- c(0.5, 0.25, 0.125, 0.125)
mean(sales)
weighted.mean(sales, weights)


# 예시2
A.score <- c(4.0, 3.0)
B.score <- c(3.0, 4.0)
count <- c(3,2)
weight <- count / sum(count)
weighted.mean(A.score, weight)
weighted.mean(B.score, weight)

# 예시3
score <- c(90, 80, 70, 60)
count <- c(3, 12, 15, 5)
weight <- score / sum(count)
weighted.mean(score, weight)

1.1.3중앙값

time <- c(7, 7, 2, 3, 7, 6, 9, 10, 8, 9, 9, 10)
sort(time)
mean(time)
median(time)

time1 <- c(7, 7, 2, 3, 7, 6, 9, 10, 8, 9, 10)
mean(time1)
median(time1)
summary(time1)

1.1.4 최빈값

num.v <- c(1, 2, 2, 3, 4, 3, 5, 5, 7, 9, 2, 2, 0)
char.v <- c("o","it", "the","it", "it", "가", "가", "가", "가")

freq <- table(num.v)
freq

which.max(freq)
names(freq)[3]                              # names 특정인덱스 지정해주면 그 값을 가져옴

freq <- table(char.v)
freq

which.max(freq)
names(freq)[1]

x <- c(1, 2, 3, NA, 5)
which.max(x)                                #가장 큰/작은 수의 색인을 구한다.
which.min(x)

max(x); min(x)                              # 이렇게 사용하면 NA라는 오류 뜸 

max(x, na.rm = TRUE); min(x, na.rm = TRUE)  # NA 지워주려고

연습문제1-1

  1. 하나의 주사위를 던져 이론적으로 예상할 수 있는 평균과 표준편차
D <- c(1, 2, 3, 4, 5, 6)
mean(D)
## [1] 3.5
sd(D)
## [1] 1.870829
  1. 주사위를 10번 던졌을 때 평균과 표준편차
D1 <- sample(x = 1:6, size = 10, replace = TRUE)
D1
##  [1] 1 4 5 1 3 6 5 1 6 4
mean(D1)
## [1] 3.6
sd(D1)
## [1] 2.01108
  1. 주사위를 1,000,000번 던졌을 때 평균 표준편차
D2 <- sample(x = 1:6, size = 1000000, replace = TRUE)
mean(D2)
## [1] 3.499554
sd(D2)
## [1] 1.706357

연습문제1-2

타이타닉 데이터를 활용한 문제

#자료 읽기
Data <- read.csv("train.csv")
head(Data)
##   PassengerId Survived Pclass
## 1           1        0      3
## 2           2        1      1
## 3           3        1      3
## 4           4        1      1
## 5           5        0      3
## 6           6        0      3
##                                                  Name    Sex Age SibSp
## 1                             Braund, Mr. Owen Harris   male  22     1
## 2 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1
## 3                              Heikkinen, Miss. Laina female  26     0
## 4        Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1
## 5                            Allen, Mr. William Henry   male  35     0
## 6                                    Moran, Mr. James   male  NA     0
##   Parch           Ticket    Fare Cabin Embarked
## 1     0        A/5 21171  7.2500              S
## 2     0         PC 17599 71.2833   C85        C
## 3     0 STON/O2. 3101282  7.9250              S
## 4     0           113803 53.1000  C123        S
## 5     0           373450  8.0500              S
## 6     0           330877  8.4583              Q
  1. Survived의 평균과 이것이 의미하는 바
mean(Data$Survived)  # 생존율을 의미한다.
## [1] 0.3838384
  1. 탑승객 나이에 대한 기초 통계량
summary(Data$Age)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.42   20.12   28.00   29.70   38.00   80.00     177
  1. 생존자의 평균나이를 구하여라
Data.Survived <- Data[Data$Survived == 1, ]
head(Data.Survived)
##    PassengerId Survived Pclass
## 2            2        1      1
## 3            3        1      3
## 4            4        1      1
## 9            9        1      3
## 10          10        1      2
## 11          11        1      3
##                                                   Name    Sex Age SibSp
## 2  Cumings, Mrs. John Bradley (Florence Briggs Thayer) female  38     1
## 3                               Heikkinen, Miss. Laina female  26     0
## 4         Futrelle, Mrs. Jacques Heath (Lily May Peel) female  35     1
## 9    Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female  27     0
## 10                 Nasser, Mrs. Nicholas (Adele Achem) female  14     1
## 11                     Sandstrom, Miss. Marguerite Rut female   4     1
##    Parch           Ticket    Fare Cabin Embarked
## 2      0         PC 17599 71.2833   C85        C
## 3      0 STON/O2. 3101282  7.9250              S
## 4      0           113803 53.1000  C123        S
## 9      2           347742 11.1333              S
## 10     0           237736 30.0708              C
## 11     1          PP 9549 16.7000    G6        S
mean(Data.Survived$Age, na.rm = TRUE)
## [1] 28.34369
NROW(Data.Survived)
## [1] 342
  1. 가중평균을 이용 Survived=1 의 평균 나이를 구하시오
weighted.mean(Data$Age, Data$Survived, na.rm =  T)   
## [1] 28.34369
# 잘 사용하지 않는 방법이지만 실제 데이터의 나이를 가중치로 두었음.

1.2 자료의 분산

  • 분산이란 자료가 얼마나 퍼져있는지를 의미한다
  • 자료의 퍼짐 정도를 측정하는 방법은 다음의 세가지가 있다.

1.2.1 범위

weight <- c(72, 67, 60, 78, 82)
max(weight) - min(weight)
## [1] 22
range(weight)
## [1] 60 82

1.2.2 분산

var(weight)
## [1] 76.2

1.2.3 표준편차

sd(weight)
## [1] 8.729261

연습문제2

  1. 탑승객 나이에 대한 평균, 중앙값, 최빈값을 구하시오
mean(Data$Age, na.rm = T)
## [1] 29.69912
min(Data$Age, na.rm = T)
## [1] 0.42
median(Data$Age, na.rm = T)
## [1] 28
age.freq <- table(Data$Age)
which.max(age.freq)
## 24 
## 32
which.min(age.freq)
## 0.42 
##    1
  1. 탑승객의 좌석등급 중 가장 많은 수를 차지하는 좌석등급은 무엇인가
summary(Data$Pclass)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.309   3.000   3.000
Pclass.freq <- table(Data$Pclass)
which.max(Pclass.freq)
## 3 
## 3
  1. 탑승객 최고령자와 최연소자
#분석할 때 데이터의 형태 확인하기!
str(Data$Age)
##  num [1:891] 22 38 26 35 35 NA 54 2 27 14 ...
min(Data$Age)
## [1] NA
max(Data$Age)
## [1] NA
  1. 탑승객 운임의 범위는?
range(Data$Fare, na.rm = T)
## [1]   0.0000 512.3292

1.3 데이터의 위치

1.3.1 사분위수

  • 사분위수란 자료를 크기 순으로 배열하고, 누적 백분율을 4등분한 각 점에 해당하는 값을 말한다.
x <- c(136, 182, 166, 132, 130, 186, 140, 155)
quantile(x, 0.25)
## 25% 
## 135
quantile(x, 0.3)
##   30% 
## 136.4
quantile(x)
##    0%   25%   50%   75%  100% 
## 130.0 135.0 147.5 170.0 186.0

사분위수는 summary 함수로도 구할 수 있다.

summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   130.0   135.0   147.5   153.4   170.0   186.0
boxplot(x)

summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 

1.3.2 boxplot

  • boxplot(상자그림)은 자료의 분포 형태를 4분위수(Q3 ~ Q1)와 최소, 최대값의 다섯 가지 정보로 나타낸 그래프이다.
boxplot(iris[, 1:4])

boxplot(iris$Sepal.Width)

1.3.3 도수분포표

(= 구간별 빈도) - 수집된 데이터에서 값의 종류가 매우 다양할 경우 모든 값에 대하여 빈도조사를 하는 것은 큰 의미가 없을 수도 있다. 이러한 경우 전체 데이터를 일정한 구간으로 설정해 각 구간의 범위 안에 조사된 데이터 값들이 몇 개씩 속하는지를 볼 필요가 있다.

x <- c(88, 67, 76, 80, 86, 94, 78, 84, 82, 75, 80, 75, 65, 84, 78, 82, 71, 60, 87, 75)
(max(x) - min(x))/4
## [1] 8.5
x <- c(6.5, 4.0, 7.1, 5.4, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 7.7, 3.9, 4.3, 15.1, 11.0, 5.0, 8.4, 10.1, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 4.0, 7.1, 5.4)  
                        # 임의로 입력한 x 자료
max(x); min(x)
## [1] 16.7
## [1] 3.9
  1. 계급 따라서 구간을 설정해야 하는 경우 각 구간을 계급이라고 한다.
x.num <- NROW(x)        # length써도 동일한 결과 
x.num ^(1/3)
## [1] 3.207534
round(x^1/3)            # 계급의 수
##  [1] 2 1 2 2 3 3 3 5 6 2 2 3 2 3 1 1 5 4 2 3 3 3 3 3 5 6 2 2 3 2 1 2 2
  1. 급간
  • 그리고 각 계급에 설정된 구간의 범위를 급간이라고 한다.
(max(x)-min(x))/4 
## [1] 3.2
round((max(x)-min(x))/4)
## [1] 3
x.cut <- cut(x, breaks = seq(3.0, 18.0, by = 3.0), right = FALSE)  # 급간 값이 3  
                                                                   # right = F 옵션은 이상( '[' ) ~ 미만( ')' ) 구간으로 바꿔서 출력

x.cut
##  [1] [6,9)   [3,6)   [6,9)   [3,6)   [6,9)   [6,9)   [9,12)  [15,18)
##  [9] [15,18) [6,9)   [3,6)   [6,9)   [3,6)   [6,9)   [3,6)   [3,6)  
## [17] [15,18) [9,12)  [3,6)   [6,9)   [9,12)  [6,9)   [6,9)   [9,12) 
## [25] [15,18) [15,18) [6,9)   [3,6)   [6,9)   [3,6)   [3,6)   [6,9)  
## [33] [3,6)  
## Levels: [3,6) [6,9) [9,12) [12,15) [15,18)
table(x.cut)                                                       # 구간의 수 빈도
## x.cut
##   [3,6)   [6,9)  [9,12) [12,15) [15,18) 
##      11      13       4       0       5

1.3.4 상대도수

  • 상대도수는 어느 계급에 속한 도수가 전체 도수에서 차지하는 비율을 말한다.
# 패키지 이용해보기
install.packages("devtools")
library(devtools)

# 깃허브를 이용한 패키지 다운로드 
install_github("SukjaeChoi/easyStats")
library(sukjaeChoi/easyStats)
x.table <- table(x.cut)    
round(prop.table(x.table), digits = 3) * 100                       # 구간별 퍼센트 확인
## x.cut
##   [3,6)   [6,9)  [9,12) [12,15) [15,18) 
##    33.3    39.4    12.1     0.0    15.2

연습문제3-1

  1. 운임의 사분위수를 구하시오
quantile(Data$Fare)
##       0%      25%      50%      75%     100% 
##   0.0000   7.9104  14.4542  31.0000 512.3292
  1. 나이의 사분위수를 구하시오
quantile(Data$Age, na.rm = T)
##     0%    25%    50%    75%   100% 
##  0.420 20.125 28.000 38.000 80.000
  1. summary한 값과 차이가 있는지 비교
summary(Data$Fare); summary(Data$Age) 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    7.91   14.45   32.20   31.00  512.33
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.42   20.12   28.00   29.70   38.00   80.00     177

연습문제3-2

운임과 나이에 대한 box-plot을 그리고, 각각의 분포의 형태를 파악하시오.

Data <- read.csv("train.csv")
boxplot(Data$Fare) 

boxplot(Data$Age)  # 20 ~ 40대가 전체의 50%를 차지하고 있다.

1.4데이터 요약

1.4.1 plot

데이터의 퍼짐 정도를 시각적으로 알 수 있다. 하지만 데이터의 특징을 한 마디로 말하기는 어렵다.

x <- c(6.5, 4.0, 7.1, 5.4, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 7.7, 3.9, 4.3, 15.1, 11.0, 5.0, 8.4, 10.1, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 4.0, 7.1, 5.4)
plot(x)        

### 1.4.3 histogram

hist(x)     # 히스토그램으로 자료 전반의 모습을 설명하고 box-plot으로 넘어가는 것이 일반적이다

### 1.4.2 boxplot

boxplot(x)  # 분포의 모양을 알 수 없다는 단점이 있다.

1.4.4 stem

  • 줄기잎 그림을 90도 회전하면 분포정도를 알기 쉽다.
age <- c(18, 31, 22, 19, 34, 32, 40, 42, 56, 58, 64, 28, 29, 36, 35, 41, 44, 47, 55, 61, 42)
stem(age) # 오른쪽으로 꼬리가 늘어진 모양이군
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   1 | 89
##   2 | 289
##   3 | 12456
##   4 | 012247
##   5 | 568
##   6 | 14

연습문제4

타이타닉 탑승자의 좌석등급과 연령을 히스토그램으로 나타내시오

hist(Data$Age)

hist(Data$Pclass)               # 연속형 자료가 아니기 때문에 듬성듬성

hist(Data$Fare)

hist(Data$Fare, breaks = 50)    # 초반 구간의 빈도가 굉장히 높다. 이처럼 히스토그램을 쪼개면 더 세부적인 정보를 알 수 있다.

1.5 분포의 대칭성

1.5.1 왜도와 첨도

비대칭도는 데이터의 분포가 정규분포를 따르는지를 알기위해 이용한다.

#install.packages("moments")
library(moments)

x <- c(6.5, 4.0, 7.1, 5.4, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 7.7, 3.9, 4.3, 15.1, 11.0, 5.0, 8.4, 10.1, 8.3, 7.6, 9.0, 15.7, 16.7, 6.4, 5.0, 8.5, 5.7, 4.0, 7.1, 5.4)
stem(x)
## 
##   The decimal point is at the |
## 
##    2 | 9
##    4 | 0030004477
##    6 | 44511667
##    8 | 3345500
##   10 | 10
##   12 | 
##   14 | 177
##   16 | 77
  • 왜도는 평균을 중심으로 한 분포의 비대칭 정도를 나타낸다.
skewness(x)  
## [1] 1.137252
  • 첨도는 정규분포와 비교하여 얼마나 뽀족한가를 나타낸다.
kurtosis(x)  
## [1] 3.270211
plot(density(x))                                             # 확률밀도 곡선
den.norm <- function(x) dnorm(x, mean = mean(x), sd = sd(x)) # 확률밀도 함수
curve(den.norm, col = "red", add = TRUE, lty = 2)            # 정규분포 곡선
abline(v = mean(x), col = "blue", lty = 2)                   # 평균 수직선

연습문제5

  1. 타이타닉 데이터에서 연령(Age)과 운임(Fare)의 왜도
skewness(Data$Age, na.rm = T)
## [1] 0.3882899
skewness(Data$Fare, na.rm = T)
## [1] 4.779253
  1. 연령(Age)과 운임(Fare)의 첨도
kurtosis(Data$Fare)
## [1] 36.20429
kurtosis(Data$Age)
## [1] NA
  1. 히스토그램
hist(Data$Age)

hist(Data$Fare)

  1. 줄기잎그림
stem(Data$Age)
## 
##   The decimal point is 1 digit(s) to the right of the |
## 
##   0 | 0111111111111122222222223333334444444444
##   0 | 5555666777888899999999
##   1 | 001111233444444
##   1 | 55555566666666666666666777777777777788888888888888888888888888999999+7
##   2 | 00000000000000011111111111111111111111112222222222222222222222222223+33
##   2 | 55555555555555555555555566666666666666666677777777777777777788888888+27
##   3 | 00000000000000000000000001111111111111111111222222222222222222333333+14
##   3 | 55555555555555555556666666666666666666666777777788888888888999999999
##   4 | 000000000000011111111222222222222233333444444444
##   4 | 55555555555566666777777777888888888999999
##   5 | 00000000001111111222222344444444
##   5 | 5566666778888899
##   6 | 000011122223344
##   6 | 5556
##   7 | 001114
##   7 | 
##   8 | 0
stem(Data$Fare)
## 
##   The decimal point is 2 digit(s) to the right of the |
## 
##   0 | 00000000000000001111111111111111111111111111111111111111111111111111+640
##   0 | 55555555555555555555555555555566666666666666666666666777777777777777+38
##   1 | 1111111111122223333444
##   1 | 55555555566
##   2 | 111123333
##   2 | 55666666
##   3 | 
##   3 | 
##   4 | 
##   4 | 
##   5 | 111