2024년 4월 27일부터 5월 10일까지 AI Bigdata Statistics with R 강의 요약본입니다.
제1일차 강의 (2024.4.27)는 다음과 같은 내용이 포함됩니다.
R을 계산기와 같이 사용할 수 있음.
a = 20
b = 15
# 산술연산자의 연습
a + b
## [1] 35
a - b
## [1] 5
a * b
## [1] 300
a / b
## [1] 1.333
a**2 # a의 제곱
## [1] 400
a^2 # a의 제곱
## [1] 400
a^0.5 # a의 제곱근
## [1] 4.472
sqrt(a) # a의 제곱근
## [1] 4.472
a %% b # 나눗셈의 나머지
## [1] 5
a %/% b # 나눗셈의 몫
## [1] 1
# 논리연산자의 연습
a > b
## [1] TRUE
a < b
## [1] FALSE
a > 20
## [1] FALSE
a >= 20
## [1] TRUE
# 교집합(and), 양쪽 모두 TRUE이어야 전체식이 TRUE가 된다.
a > 10 & b < 10
## [1] FALSE
# 합집합(or), 양쪽의 조건 중에서 하나라도 TRUE이면 전체식이 TRUE가 된다.
a > 10 | b < 10
## [1] TRUE
c(1, 3, 5, 7, 9) # 벡터의 생성
## [1] 1 3 5 7 9
1:6 # 벡터의 생성
## [1] 1 2 3 4 5 6
c(1, 3, 5, 1:3) # 벡터의 병합: c(1,3,5)와 1:3
## [1] 1 3 5 1 2 3
seq(1, 3, by=0.5) # 1부터 3사이에 0.5씩 증가한 숫자
## [1] 1.0 1.5 2.0 2.5 3.0
rep(1:3, times=2) # 1:3 전체를 두번 반복
## [1] 1 2 3 1 2 3
rep(1:3, each=2) # 1:3 각각의 숫자를 두번 반복
## [1] 1 1 2 2 3 3
a = c(1, 3, 5, 7, 9) # 벡터를 a라는 저장소에 저장
a[1] # a의 첫번째 숫자
## [1] 1
a[3] # a의 세번째 숫자
## [1] 5
a[2:4] # a의 두번째에서 네번째 숫자
## [1] 3 5 7
a[c(1,3)] # a의 첫번째와 세번째 숫자
## [1] 1 5
a[-3] # a에서 세번째 숫자만 제외하고 출력하기
## [1] 1 3 7 9
a[a == 5] # a에서 5인 숫자만 출력하기
## [1] 5
a[a != 5] # a에서 5가 아닌 숫자만 출력하기
## [1] 1 3 7 9
a[a == 5] = 0 # a에서 5를 0으로 바꾸기
# 1 부터 12까지의 숫자를 가지고 3x4 행렬을 만드는 것
x = matrix(1:12, 3, 4)
print(x)
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
# x 행렬과 같이 3x4행렬인데 입력순서가 row순서로 입력함
y = matrix(1:12, 3, 4, byrow=TRUE)
print(y)
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
# 1로 채워진 5x1 행렬
y = matrix(1, 5, 1)
print(y)
## [,1]
## [1,] 1
## [2,] 1
## [3,] 1
## [4,] 1
## [5,] 1
# 6개 숫자로 이루어진 z 벡터를 이용하여 3x2 행렬 생성
z = c(1, 4, 3, 2, 5, 4)
z = matrix(z, 3, 2)
print(z)
## [,1] [,2]
## [1,] 1 2
## [2,] 4 5
## [3,] 3 4
# 1부터 24까지의 숫자로 24개 요소를 가진 1차원 배열
Z1 = array(1:24, c(24))
Z1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
# 1부터 24까지의 숫자로 6x4의 2차원 배열
Y1 = array(1:24, c(6,4))
Y1
## [,1] [,2] [,3] [,4]
## [1,] 1 7 13 19
## [2,] 2 8 14 20
## [3,] 3 9 15 21
## [4,] 4 10 16 22
## [5,] 5 11 17 23
## [6,] 6 12 18 24
# 1부터 24까지의 숫자로 3x4x2의 3차원 배열 (3x4행렬이 2 개)
X1 = array(1:24, c(3,4,2))
X1
## , , 1
##
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
##
## , , 2
##
## [,1] [,2] [,3] [,4]
## [1,] 13 16 19 22
## [2,] 14 17 20 23
## [3,] 15 18 21 24
# 첫번째 3x4 행렬
X1[,, 1]
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
# 두번째 3x4 행렬
X1[,, 2]
## [,1] [,2] [,3] [,4]
## [1,] 13 16 19 22
## [2,] 14 17 20 23
## [3,] 15 18 21 24
# 첫번째 행렬의 [1,1]에 해당하는 숫자
X1[1, 1, 1]
## [1] 1
# 5번째 행, 3번째 열
Y1[5, 3]
## [1] 17
# Y1 배열을 치환(transpose)
t(Y1)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
## [4,] 19 20 21 22 23 24
# Y1을 치환한 행렬과 원래 행렬을 곱하는 것 (Moment Matrix라고 함)
t(Y1) %*% Y1 # Y1' * Y1
## [,1] [,2] [,3] [,4]
## [1,] 91 217 343 469
## [2,] 217 559 901 1243
## [3,] 343 901 1459 2017
## [4,] 469 1243 2017 2791
# "t(Y1) %*% Y1"는 singular matrix이므로 역행렬이 존재하지 않음
if (det(t(Y1)%*%Y1) == 0) {
print("There is no inverse matrix becuase it is singular.")
} else {
solve(t(Y1)%*%Y1)
}
## [1] "There is no inverse matrix becuase it is singular."
library(knitr)
## Warning: 패키지 'knitr'는 R 버전 4.3.3에서 작성되었습니다
library(kableExtra)
## Warning: 패키지 'kableExtra'는 R 버전 4.3.3에서 작성되었습니다
# openxlsx라는 R package를 최초로 한번 설치해야 한다. (install.packages"openxlsx")
# 패키지 설치 이후에는 그것을 필요할 때마다 library(openxlsx)를 이용해서 불러야 한다.
# working directory에 있는 regress.xlsx파일을 df라는 파일로 읽음
# df는 data.frame의 형태로 저장됨
library(openxlsx)
df= read.xlsx('regress.xlsx')
df
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 88 34 78 88 88
## 2 98 23 98 78 56
## 3 88 34 78 98 78
## 4 89 23 88 77 78
## 5 89 34 88 89 67
## 6 78 45 87 89 78
## 7 78 34 89 98 77
## 8 67 34 67 67 56
## 9 78 45 56 78 77
## 10 89 34 78 67 65
## 11 88 78 67 56 64
## 12 67 65 34 67 65
## 13 45 56 45 78 34
## 14 43 67 34 89 45
## 15 45 78 45 78 67
## 16 56 76 56 67 57
## 17 45 78 45 78 45
## 18 67 89 34 67 56
## 19 56 78 45 78 56
## 20 56 67 34 67 45
## 21 45 56 23 98 34
## 22 45 34 34 56 45
## 23 56 23 56 67 56
## 24 45 34 45 78 45
## 25 56 23 34 89 34
## 26 45 34 45 78 45
## 27 34 45 34 67 34
## 28 45 34 23 56 45
## 29 56 45 34 67 56
## 30 65 56 56 78 66
# 첫번째 칼럼(변수, 필드)를 출력하는 법 (I)
df[,1]
## [1] 88 98 88 89 89 78 78 67 78 89 88 67 45 43 45 56 45 67 56 56 45 45 56 45 56
## [26] 45 34 45 56 65
# 첫번째 칼럼(변수, 필드)를 출력하는 법 (II)
df[[1]]
## [1] 88 98 88 89 89 78 78 67 78 89 88 67 45 43 45 56 45 67 56 56 45 45 56 45 56
## [26] 45 34 45 56 65
# 첫번째 칼럼(변수, 필드)를 출력하는 법 (III)
df$근무만족도
## [1] 88 98 88 89 89 78 78 67 78 89 88 67 45 43 45 56 45 67 56 56 45 45 56 45 56
## [26] 45 34 45 56 65
# df파일의 처음 6라인을 출력하는 법
head(df)
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 88 34 78 88 88
## 2 98 23 98 78 56
## 3 88 34 78 98 78
## 4 89 23 88 77 78
## 5 89 34 88 89 67
## 6 78 45 87 89 78
# 두번째와 세번째 칼럼을 출력하는 방법
df[,2:3]
## 대인관계 자아개념
## 1 34 78
## 2 23 98
## 3 34 78
## 4 23 88
## 5 34 88
## 6 45 87
## 7 34 89
## 8 34 67
## 9 45 56
## 10 34 78
## 11 78 67
## 12 65 34
## 13 56 45
## 14 67 34
## 15 78 45
## 16 76 56
## 17 78 45
## 18 89 34
## 19 78 45
## 20 67 34
## 21 56 23
## 22 34 34
## 23 23 56
## 24 34 45
## 25 23 34
## 26 34 45
## 27 45 34
## 28 34 23
## 29 45 34
## 30 56 56
# 첫번째와 다섯번째 칼럼을 처음부터 3라인(행)까지 출력하는 방법
df[1:3,c(1,5)]
## 근무만족도 SES점수
## 1 88 88
## 2 98 56
## 3 88 78
x=1:3 # vector
t=3.88 # 숫자 (scalar)
z=matrix(1:6,2,3) # 2x3 행렬식식
df=data.frame(x=1:3, # x,y,z를 포함한 dataframe
y=c('kim','lee','park'),
z=c(TRUE,TRUE,FALSE))
output=list(x=x,t=t,df=df,z=z) # x,t, df, z를 포함한 list
output # list의 출력
## $x
## [1] 1 2 3
##
## $t
## [1] 3.88
##
## $df
## x y z
## 1 1 kim TRUE
## 2 2 lee TRUE
## 3 3 park FALSE
##
## $z
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
output$df # list안에 있는 df를 출력
## x y z
## 1 1 kim TRUE
## 2 2 lee TRUE
## 3 3 park FALSE
z[,1] # z행렬의 첫번째 열
## [1] 1 2
output$df[3,3] # list안에 있는 df[3,3]을 출력
## [1] FALSE
x = 12345
cputime = 12.23455
# 실수의 출력
print(cputime)
## [1] 12.23
# 소수점 3자리까지 표시
print(round(cputime,3))
## [1] 12.23
# 문자의 출력
print('이것은 결과입니다.')
## [1] "이것은 결과입니다."
# paste()의 예시
print(paste('CPUtime:',cputime,'seconds'))
## [1] "CPUtime: 12.23455 seconds"
# paste0()의 예시
print(paste0('CPUtime: ',cputime,'seconds'))
## [1] "CPUtime: 12.23455seconds"
# 출력결과에서 따옴표(")를 없애는 방법
print(paste0('CPUtime: ',cputime,'seconds'), quote=FALSE)
## [1] CPUtime: 12.23455seconds
# cat을 이용한 출력. 끝에 "\n"을 넣지 않으면 한 줄로 출력된다.
cat('CPU time:',cputime,'seconds','\n')
## CPU time: 12.23 seconds
# sprintf를 이용한 출력 (문자형, 정수형, 실수형의 자료 출력)
a <- 'hello'
b <- 12345
c <- 12345.1287
sprintf('문자형: %s, 정수형: %d, 실수형: %.3f',a,b,c)
## [1] "문자형: hello, 정수형: 12345, 실수형: 12345.129"
# 벡터의 내용을 포함하여 출력하는 방법
v=c('성별','수학성적')
sprintf('%s은 %s에 따라 차이가 있을 것이다.',v[2],v[1])
## [1] "수학성적은 성별에 따라 차이가 있을 것이다."
library(knitr)
df = read.xlsx('regress.xlsx')
head(df) # 파일의 처음 6줄을 출력
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 88 34 78 88 88
## 2 98 23 98 78 56
## 3 88 34 78 98 78
## 4 89 23 88 77 78
## 5 89 34 88 89 67
## 6 78 45 87 89 78
tail(df) # 파일의 마지막 6줄을 출력
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 25 56 23 34 89 34
## 26 45 34 45 78 45
## 27 34 45 34 67 34
## 28 45 34 23 56 45
## 29 56 45 34 67 56
## 30 65 56 56 78 66
str(df) # 파일의 구조(structure)를 출력
## 'data.frame': 30 obs. of 5 variables:
## $ 근무만족도: num 88 98 88 89 89 78 78 67 78 89 ...
## $ 대인관계 : num 34 23 34 23 34 45 34 34 45 34 ...
## $ 자아개념 : num 78 98 78 88 88 87 89 67 56 78 ...
## $ 근무평정 : num 88 78 98 77 89 89 98 67 78 67 ...
## $ SES점수 : num 88 56 78 78 67 78 77 56 77 65 ...
class(df) # 파일의 형태
## [1] "data.frame"
summary(df) # 통계적 summary를 출력
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## Min. :34.0 Min. :23.0 Min. :23.0 Min. :56.0 Min. :34.0
## 1st Qu.:45.0 1st Qu.:34.0 1st Qu.:34.0 1st Qu.:67.0 1st Qu.:45.0
## Median :56.0 Median :45.0 Median :45.0 Median :78.0 Median :56.0
## Mean :63.4 Mean :48.5 Mean :54.3 Mean :76.3 Mean :57.1
## 3rd Qu.:78.0 3rd Qu.:66.5 3rd Qu.:75.2 3rd Qu.:85.5 3rd Qu.:66.8
## Max. :98.0 Max. :89.0 Max. :98.0 Max. :98.0 Max. :88.0
dim(df) # 파일의 행과 열의 갯수를 출력
## [1] 30 5
nrow(df) # 행(row)의 갯수
## [1] 30
ncol(df) # 열(column)의 갯수
## [1] 5
x = c(1, 3, 5, 7, 9, 6, 3, 5, 2, 1)
cputime = 1.236648
mean(x) # x 벡터의 평균
## [1] 4.2
sd(x) # x의 표준편차
## [1] 2.658
sum(x) # x의 합
## [1] 42
median(x) # x의 median(50 percentile)
## [1] 4
table(x) # x의 빈도
## x
## 1 2 3 5 6 7 9
## 2 1 2 2 1 1 1
round(cputime,3) # cputime을 소숫점 3자리에서 반올림해서 출력
## [1] 1.237
rnorm(100) # 표준점수 100개를 생성
## [1] 0.433345 -0.364149 -0.516268 0.318951 0.291501 1.151233 -0.032804
## [8] -0.742498 1.858294 0.181289 -0.082848 0.622000 -1.445421 1.134480
## [15] 1.110364 0.459952 1.005734 -0.178810 0.005374 0.689515 1.555199
## [22] -0.592438 -0.191876 -0.224012 -0.920432 0.233056 0.520384 -0.814405
## [29] -1.768185 1.703787 0.408482 -0.027564 0.096718 -0.574587 -0.775868
## [36] -0.651650 2.781273 2.321854 0.316304 -1.664173 -0.925137 -0.320498
## [43] -0.652265 0.063538 0.952909 -1.690451 -2.074160 -0.556814 0.114003
## [50] -0.134604 -0.269433 -1.517331 -0.244651 1.390293 -0.708274 1.804370
## [57] -1.204856 -0.438229 1.653803 -0.779874 0.992323 -0.025130 -0.235956
## [64] -0.859936 0.748095 0.394604 0.930277 1.035069 -0.476140 -1.114616
## [71] -0.398321 -0.504588 0.497990 -1.816401 1.398590 0.378210 -1.085433
## [78] 0.798530 -1.281534 0.086025 -0.038931 0.716097 -0.180185 0.632145
## [85] -0.692204 0.672425 -0.536742 -1.292518 1.338227 -0.022031 1.045251
## [92] -0.860727 0.009690 -1.681822 2.836405 -1.171084 -0.630819 1.043726
## [99] 0.547336 1.134760
sample(50,100,replace=T) # 1~50사이의 숫자를 중복을 허용하며 100개를 생성
## [1] 47 38 17 14 8 9 4 39 16 37 18 27 10 19 11 14 7 24 9 23 27 35 21 18 21
## [26] 31 30 23 18 38 20 8 27 9 41 30 20 44 5 2 47 24 34 13 21 2 31 21 24 45
## [51] 28 39 33 41 10 10 37 33 21 21 49 46 35 29 36 26 24 15 27 46 44 40 14 6 39
## [76] 47 25 34 50 28 26 33 45 42 47 24 25 23 14 10 36 3 47 12 14 19 26 41 17 14
factorial(10) # 10 factorial 계산
## [1] 3628800
colMeans(df) # 열별 평균
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 63.40 48.53 54.33 76.27 57.13
colSums(df) # 열별 합계
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1902 1456 1630 2288 1714
apply(df,2,sd) # 열별 표준편차
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 18.55 20.13 22.17 12.09 15.17
rowMeans(df) # 행별 평균
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
## 75.2 70.6 75.2 71.0 73.4 75.4 75.2 58.2 66.8 66.6 70.6 59.6 51.6 55.6 62.6 62.4
## 17 18 19 20 21 22 23 24 25 26 27 28 29 30
## 58.2 62.6 62.6 53.8 51.2 42.8 51.6 49.4 47.2 49.4 42.8 40.6 51.6 64.2
rowSums(df) # 행별 합계
## 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
## 376 353 376 355 367 377 376 291 334 333 353 298 258 278 313 312 291 313 313 269
## 21 22 23 24 25 26 27 28 29 30
## 256 214 258 247 236 247 214 203 258 321
apply(df,1,sd) # 행별 표준편차
## 1 2 3 4 5 6 7 8 9 10 11
## 23.435 31.762 24.479 27.395 23.944 17.729 24.591 14.342 15.385 20.599 12.522
## 12 13 14 15 16 17 18 19 20 21 22
## 14.346 16.682 22.267 16.682 8.905 18.075 19.982 14.758 14.342 28.908 9.203
## 23 24 25 26 27 28 29 30
## 16.682 16.682 26.262 16.682 14.342 12.542 12.542 9.066
cbind(df[,1],df[,4]) # df의 1열과 4열을 합치는 것
## [,1] [,2]
## [1,] 88 88
## [2,] 98 78
## [3,] 88 98
## [4,] 89 77
## [5,] 89 89
## [6,] 78 89
## [7,] 78 98
## [8,] 67 67
## [9,] 78 78
## [10,] 89 67
## [11,] 88 56
## [12,] 67 67
## [13,] 45 78
## [14,] 43 89
## [15,] 45 78
## [16,] 56 67
## [17,] 45 78
## [18,] 67 67
## [19,] 56 78
## [20,] 56 67
## [21,] 45 98
## [22,] 45 56
## [23,] 56 67
## [24,] 45 78
## [25,] 56 89
## [26,] 45 78
## [27,] 34 67
## [28,] 45 56
## [29,] 56 67
## [30,] 65 78
rbind(df[1,],df[3,]) # df의 1행과 3행을 합치는 것
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 88 34 78 88 88
## 3 88 34 78 98 78
R 프로그램의 핵심인 다음의 4개 개념을 익힌다.
# 1부터 10까지를 프린트
for (i in (1:10)) {
print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
# 1부터 10까지 합을 구함
hap = 0
for (i in 1:10) {
hap = hap + i
}
print(hap)
## [1] 55
# 1부터 10까지 곱을 구함
gop=1
for (i in 1:10) {
gop = gop * i
}
print(gop)
## [1] 3628800
# i가 5보다 크거나 j가 15보다 작을 때까지 실행
i = j = 10
while ((i > 5) & (j < 15)) {
cat("i = ",i,"\tj =",j,"\n")
i = i -1
j = j -1
}
## i = 10 j = 10
## i = 9 j = 9
## i = 8 j = 8
## i = 7 j = 7
## i = 6 j = 6
# 1 부터 10까지 홀수, 짝수 표시하기
for (i in 1:10) {
if (i %% 2 == 0) {
print(paste(i,"is even number"))
} else {
print(paste(i,"is odd number"))
}
}
## [1] "1 is odd number"
## [1] "2 is even number"
## [1] "3 is odd number"
## [1] "4 is even number"
## [1] "5 is odd number"
## [1] "6 is even number"
## [1] "7 is odd number"
## [1] "8 is even number"
## [1] "9 is odd number"
## [1] "10 is even number"
# 1부터 n까지 수를 합한 수 구하는 함수
hap = function(n) {
hap = 0
for (i in 1:n) {
hap = hap + i
}
print(hap)
}
hap (10)
## [1] 55
hap (100)
## [1] 5050
hap (1000)
## [1] 500500
# Prime Number Function: 원시적인 방법으로 구하는 함수
prime1 = function(n) {
x = 1:n
x[1] = 0
for (i in 3:n) {
for (j in 2:sqrt(i)) {
if (i %% j == 0) {
x[i] = 0
break
}
}
}
out = x[x != 0]
np = length(out)
cat("==============================================","\n")
cat(" Finding prime numbers between 1 to",n,"\n")
cat("----------------------------------------------","\n")
cat(" Number of prime numbers:",np, "\n")
cat("==============================================","\n")
}
begin = Sys.time()
prime1(1000000)
## ==============================================
## Finding prime numbers between 1 to 1000000
## ----------------------------------------------
## Number of prime numbers: 78498
## ==============================================
print(Sys.time() - begin)
## Time difference of 4.084 secs
# Prime Number Function: 에라토스테네스의 체
prime = function(n) {
out = 1:n
out[1] = 0
m = sqrt(n)
for (i in c(2,seq(3,m,2))) {
if (out[i] != 0) {
out[seq(i+i,n,i)] = 0
}
}
out = out[out != 0]
np = length(out)
cat("==============================================","\n")
cat(" Finding prime numbers between 1 to",n,"\n")
cat("----------------------------------------------","\n")
cat(" Number of prime numbers:",np, "\n")
cat("==============================================","\n")
}
begin = Sys.time()
prime(1000000)
## ==============================================
## Finding prime numbers between 1 to 1000000
## ----------------------------------------------
## Number of prime numbers: 78498
## ==============================================
print(Sys.time()-begin)
## Time difference of 0.03487 secs
# 2개의 행렬을 만든다.
a = 1:8
b = c(5,7,9,9,6,2,1,1)
a = matrix(a, 4, 2)
b = matrix(b, 4, 2)
a
## [,1] [,2]
## [1,] 1 5
## [2,] 2 6
## [3,] 3 7
## [4,] 4 8
b
## [,1] [,2]
## [1,] 5 6
## [2,] 7 2
## [3,] 9 1
## [4,] 9 1
# 행렬끼리 더하기와 행렬과 scalar의 더하기
a + b
## [,1] [,2]
## [1,] 6 11
## [2,] 9 8
## [3,] 12 8
## [4,] 13 9
a + 3
## [,1] [,2]
## [1,] 4 8
## [2,] 5 9
## [3,] 6 10
## [4,] 7 11
# 행렬끼리 빼기와 행렬에서 scalar를 빼기
a - b
## [,1] [,2]
## [1,] -4 -1
## [2,] -5 4
## [3,] -6 6
## [4,] -5 7
a - 3
## [,1] [,2]
## [1,] -2 2
## [2,] -1 3
## [3,] 0 4
## [4,] 1 5
# 행렬끼리 곱하기와 행렬에 scalar를 곱하기
a * b
## [,1] [,2]
## [1,] 5 30
## [2,] 14 12
## [3,] 27 7
## [4,] 36 8
a * 3
## [,1] [,2]
## [1,] 3 15
## [2,] 6 18
## [3,] 9 21
## [4,] 12 24
# 행렬끼리 나누기와 행렬을 scalar로 나누기
a / b
## [,1] [,2]
## [1,] 0.2000 0.8333
## [2,] 0.2857 3.0000
## [3,] 0.3333 7.0000
## [4,] 0.4444 8.0000
a / 3
## [,1] [,2]
## [1,] 0.3333 1.667
## [2,] 0.6667 2.000
## [3,] 1.0000 2.333
## [4,] 1.3333 2.667
# 행렬을 matrix operation으로 곱하기 (%*%)
a %*% t(b)
## [,1] [,2] [,3] [,4]
## [1,] 35 17 14 14
## [2,] 46 26 24 24
## [3,] 57 35 34 34
## [4,] 68 44 44 44
표준점수는 통계학에서 가장 중요한 개념중의 하나이다.
평균이 서로 다른 집단에서 나온 점수는 서로 비교할 수 없다. 예컨대 수학능력시험 에서 물리를 선택한 학생의 점수와 생물을 선택한 학생의 점수는 서로 평균이 다르기 때문에 그 점수를 비교하려면 두 점수의 평균과 표준편차를 인위적으로 같게 만들어서 비교해야 한다. 즉 두개의 점수를 평균과 표준편차가 같은 표준점수로 환산하면 비로서 비교가 가능하다.
참고로 표준점수의 평균은 0이고 표준편차는 1이다.
표준점수의 공식: zy = (y - mean(y)) / sd(y)
# 벡터의 표준점수를 구하는 방법
y = c(56, 78, 46, 57, 68, 87, 78, 98, 77, 95)
m = mean(y)
s = sd(y)
zy = (y - m) / s
print(zy)
## [1] -1.0470 0.2327 -1.6287 -0.9888 -0.3490 0.7562 0.2327 1.3960 0.1745
## [10] 1.2215
print(mean(zy))
## [1] -0.00000000000000001661
print(sd(zy))
## [1] 1
# 여러 개의 변수가 있는 행렬의 표준점수를 구하는 방법
# 이 부분은 매우 중요한 부분이므로 꼭 이해하고 넘어가야 합니다.
# 다음 시간에 다시 한번 자세히 설명할 예정임
df = read.xlsx("regress.xlsx")
df
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 88 34 78 88 88
## 2 98 23 98 78 56
## 3 88 34 78 98 78
## 4 89 23 88 77 78
## 5 89 34 88 89 67
## 6 78 45 87 89 78
## 7 78 34 89 98 77
## 8 67 34 67 67 56
## 9 78 45 56 78 77
## 10 89 34 78 67 65
## 11 88 78 67 56 64
## 12 67 65 34 67 65
## 13 45 56 45 78 34
## 14 43 67 34 89 45
## 15 45 78 45 78 67
## 16 56 76 56 67 57
## 17 45 78 45 78 45
## 18 67 89 34 67 56
## 19 56 78 45 78 56
## 20 56 67 34 67 45
## 21 45 56 23 98 34
## 22 45 34 34 56 45
## 23 56 23 56 67 56
## 24 45 34 45 78 45
## 25 56 23 34 89 34
## 26 45 34 45 78 45
## 27 34 45 34 67 34
## 28 45 34 23 56 45
## 29 56 45 34 67 56
## 30 65 56 56 78 66
dfm = colMeans(df) # 5개 변수의 평균값
dfs = apply(df, 2, sd) # 5개 변수의 표준편차
n = nrow(df) # 전체 사례수
xm = matrix(1, n, 1) %*% dfm
xs = matrix(1, n, 1) %*% dfs
# df의 5개 변수를 표준점수로 변환한 것
zdf = (df - xm) / xs
zdf
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 1.32626 -0.7218 1.06770 0.97084 2.035064
## 2 1.86539 -1.2682 1.96998 0.14342 -0.074722
## 3 1.32626 -0.7218 1.06770 1.79827 1.375756
## 4 1.38018 -1.2682 1.51884 0.06068 1.375756
## 5 1.38018 -0.7218 1.51884 1.05359 0.650517
## 6 0.78713 -0.1755 1.47373 1.05359 1.375756
## 7 0.78713 -0.7218 1.56395 1.79827 1.309825
## 8 0.19409 -0.7218 0.57144 -0.76675 -0.074722
## 9 0.78713 -0.1755 0.07519 0.14342 1.309825
## 10 1.38018 -0.7218 1.06770 -0.76675 0.518656
## 11 1.32626 1.4636 0.57144 -1.67691 0.452725
## 12 0.19409 0.8179 -0.91732 -0.76675 0.518656
## 13 -0.99200 0.3709 -0.42106 0.14342 -1.525199
## 14 -1.09983 0.9172 -0.91732 1.05359 -0.799960
## 15 -0.99200 1.4636 -0.42106 0.14342 0.650517
## 16 -0.39896 1.3642 0.07519 -0.76675 -0.008791
## 17 -0.99200 1.4636 -0.42106 0.14342 -0.799960
## 18 0.19409 2.0099 -0.91732 -0.76675 -0.074722
## 19 -0.39896 1.4636 -0.42106 0.14342 -0.074722
## 20 -0.39896 0.9172 -0.91732 -0.76675 -0.799960
## 21 -0.99200 0.3709 -1.41357 1.79827 -1.525199
## 22 -0.99200 -0.7218 -0.91732 -1.67691 -0.799960
## 23 -0.39896 -1.2682 0.07519 -0.76675 -0.074722
## 24 -0.99200 -0.7218 -0.42106 0.14342 -0.799960
## 25 -0.39896 -1.2682 -0.91732 1.05359 -1.525199
## 26 -0.99200 -0.7218 -0.42106 0.14342 -0.799960
## 27 -1.58505 -0.1755 -0.91732 -0.76675 -1.525199
## 28 -0.99200 -0.7218 -1.41357 -1.67691 -0.799960
## 29 -0.39896 -0.1755 -0.91732 -0.76675 -0.074722
## 30 0.08626 0.3709 0.07519 0.14342 0.584586
# zdf의 각 변수의 평균은 0
colMeans(zdf)
## 근무만족도 대인관계 자아개념
## 0.00000000000000007633 0.00000000000000011657 -0.00000000000000011472
## 근무평정 SES점수
## 0.00000000000000006199 0.00000000000000002874
# zdf의 각 변수의 표준편차는 1
apply(zdf,2,sd)
## 근무만족도 대인관계 자아개념 근무평정 SES점수
## 1 1 1 1 1