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
- 하나의 주사위를 던져 이론적으로 예상할 수 있는 평균과 표준편차
D <- c(1, 2, 3, 4, 5, 6)
mean(D)## [1] 3.5
sd(D)## [1] 1.870829
- 주사위를 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,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
- Survived의 평균과 이것이 의미하는 바
mean(Data$Survived) # 생존율을 의미한다.## [1] 0.3838384
- 탑승객 나이에 대한 기초 통계량
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
- 생존자의 평균나이를 구하여라
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
- 가중평균을 이용 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
- 탑승객 나이에 대한 평균, 중앙값, 최빈값을 구하시오
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
- 탑승객의 좌석등급 중 가장 많은 수를 차지하는 좌석등급은 무엇인가
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
- 탑승객 최고령자와 최연소자
#분석할 때 데이터의 형태 확인하기!
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
- 탑승객 운임의 범위는?
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
- 계급 따라서 구간을 설정해야 하는 경우 각 구간을 계급이라고 한다.
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
- 급간
- 그리고 각 계급에 설정된 구간의 범위를 급간이라고 한다.
(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
- 운임의 사분위수를 구하시오
quantile(Data$Fare)## 0% 25% 50% 75% 100%
## 0.0000 7.9104 14.4542 31.0000 512.3292
- 나이의 사분위수를 구하시오
quantile(Data$Age, na.rm = T)## 0% 25% 50% 75% 100%
## 0.420 20.125 28.000 38.000 80.000
- 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
- 타이타닉 데이터에서 연령(Age)과 운임(Fare)의 왜도
skewness(Data$Age, na.rm = T)## [1] 0.3882899
skewness(Data$Fare, na.rm = T)## [1] 4.779253
- 연령(Age)과 운임(Fare)의 첨도
kurtosis(Data$Fare)## [1] 36.20429
kurtosis(Data$Age)## [1] NA
- 히스토그램
hist(Data$Age)hist(Data$Fare)- 줄기잎그림
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