R 강의 Summary

2024년 4월 27일부터 5월 10일까지 AI Bigdata Statistics with R 강의 요약본입니다.

제1일차 강의 (2024.4.27)는 다음과 같은 내용이 포함됩니다.

  • 연산자 및 논리연산자 (R을 계산기 같이 사용하기)
  • 자료의 생성 및 선택
  • 프로그램의 기초 (for, while, if, function)
  • 각종 내장함수의 연습
  • 프로그램(function)의 연습

1. 연산자와 논리연산자

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

2. 벡터(vector)의 생성 및 선택

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으로 바꾸기

3. 행렬(matrix)의 생성 및 선택

# 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

4. 배열(array)의 생성 및 선택

# 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."

5. Dataframe의 생성과 선택

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

6. List의 생성과 선택

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

7. 프로그램을 위한 기초 (print)

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] "수학성적은 성별에 따라 차이가 있을 것이다."

8. 내장함수

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

9.프로그램의 기초

R 프로그램의 핵심인 다음의 4개 개념을 익힌다.

  • for loop
  • while loop
  • if
  • function
# 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

10. 소수(prime number) 구하기

# 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

11. 행렬의 계산

# 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

12. 표준점수 구하기

  • 표준점수는 통계학에서 가장 중요한 개념중의 하나이다.

  • 평균이 서로 다른 집단에서 나온 점수는 서로 비교할 수 없다. 예컨대 수학능력시험 에서 물리를 선택한 학생의 점수와 생물을 선택한 학생의 점수는 서로 평균이 다르기 때문에 그 점수를 비교하려면 두 점수의 평균과 표준편차를 인위적으로 같게 만들어서 비교해야 한다. 즉 두개의 점수를 평균과 표준편차가 같은 표준점수로 환산하면 비로서 비교가 가능하다.

  • 참고로 표준점수의 평균은 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