/ LICENSE

ADSP (5) R 기초와 데이터 마트

ADSP 관련 글

ADSP를 준비하면서 공부한 내용을 정리한 글입니다.
3과목 1장 R 기초와 데이터 마트에 대한 부분을 정리한 글입니다.

  1. R 기초
    1. 데이터 타입
    2. 연산자
    3. R 데이터 구조
    4. R 내장 함수
    5. R 데이터 핸들링
    6. 제어문
    7. 통계분석에 사용되는 R 함수
  2. 데이터 마트
    1. 데이터 전처리
    2. R 패키지 활용
  3. 데이터 탐색
    1. 탐색적 데이터 분석
    2. 결측값
    3. 이상값



R 기초

데이터 타입

문자형 타입

””, ‘‘안에 입력하여 사용한다.

class('abc')
class("abc")
class('1')
class("True")

‘character’

‘character’

‘character’

‘character’


숫자형 타입

numeric, double(실수), integer(정수), complex(복소수)와 같은 타입이 있다.
double은 숫자로만 표현이 가능하다.
Inf는 Infinite의 약자로 무한대를 의미한다.

class(Inf)
class(1)
class(-3)

‘numeric’

‘numeric’

‘numeric’


논리형 타입

참, 거짓을 의미한다.

class(TRUE)
class(FALSE)

‘logical’

‘logical’


NaN. NA, NULL

NaN은 ‘Not of Number’의 약자로 음수의 제곱근을 구하려고 시도하는 것과 같은 경우에 오류와 함께 숫자가 아님을 반환한다.
‘Not Available’의 약자인 Na와 NULL은 결측값을 의미한다.
NA는 공간을 차지하는 방면, NULL은 공간을 차지하지 않는 존재하지 않는 값을 의미한다.

sqrt(-3)
class(NA)
class(NULL)
Warning message in sqrt(-3):
"NaN이 생성되었습니다"

NaN

‘logical’

‘NULL’



연산자

대입 연산자

<-,«-,= : 오른쪽 값을 왼쪽에 대입
->,-» : 왼쪽 값을 오른쪽에 대입

string1 <- 'abc'
'data'->string2
number1<<-15
Inf->>number2
logical=NA

string1
string2
number1
number2
logical

‘abc’

‘data’

15

Inf

<NA>


비교 연산자

== : 두 값이 같은지 비교
< ,> : 초과, 미만을 비교
<= , => : 이상, 이하를 비교
is.character : 문자형인지 아닌지를 비교
is.numeric : 숫자형인지 아닌지를 비교
is.logical : 논리형인지 아닌지를 비교
is.na : NA인지 아닌지를 비교
is.null : NULL인지 아닌지를 비교

NA는 비교할 값이 존재하지 않으므로 어떤 것과 비교를 하더라도 NA를 반환한다.

string1=='abc'
string2>'DATA'
number1<=15
is.na(logical)
is.null(NULL)

TRUE

FALSE

TRUE

TRUE

TRUE


산술 연산자

두 숫자형 타입의 계산을 위한 연산자로서 다양한 연산이 가능하다.
+, -, *, / : 두 숫자간의 사칙연산
%/% : 두 숫자의 나눗셈의 몫 %% : 두 숫자의 나눗셈의 나머지
^, ** : 거듭제곱
exp() : 자연상수의 거듭제곱


기타 연산자

논리값을 계싼하기 위한 연산자로는 부정연산자 (!), AND 연산자 (&), OR 연산자 (|)가 있다.
부정 연산자는 현재의 논리값에 반대되는 값, AND 연산자는 두 값이 모두 참일 때만 참, OR 연산자는 두 값 중 하나의 값만 참이여도 참이다.

!TRUE
TRUE&TRUE
TRUE&FALSE
!(TRUE)
TRUE | FALSE

FALSE

TRUE

FALSE

FALSE

TRUE



R 데이터 구조

벡터

벡터는 타입이 같은 여러 데이터를 하나의 행으로 저장하는 1차원 데이터 구조다.
‘연결한다’라는 의미의 ‘concatenate’의 c를 써서 데이터를 묶을 수 있다.

v4<-c(3, TRUE,FALSE)
v4
v5<-c('a',1,TRUE)
v5

<ol class=list-inline> <li>3</li> <li>1</li> <li>0</li> </ol>

<ol class=list-inline> <li>‘a’</li> <li>‘1’</li> <li>‘TRUE’</li> </ol>

벡터를 생성할 때 c 안에 콤마를 구분자로 써서 성분을 직접 입력할 수 있지만 콜론:을 사용하여 시작과 끝값을 지정해 벡터를 생성할 수도 있다.

v1<-c(1:6)
v1

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> </ol>


행렬

행렬은 2차원 구조를 가진 벡터다.
벡터의 성질을 가지고 있으므로 행렬에 저장된 모든 데이터는 같은 타입이어야 한다.
matrix를 사용하여 행렬을 만들 경우 nrow를 사용하여 행의 수를 결정하거나 ncol을 사용하여 열의 수를 결정할 수 있다.

m1<-matrix(c(1:6),nrow=2)
m1
m2<-matrix(c(1:6),ncol=2)
m2
135
246
14
25
36

matrix를 사용하여 행렬을 만들 경우 행렬의 값들이 열로 저장된다.
byrow=T를 지정하면 값들이 열이 아닌 행으로 나온다.


m3<-matrix(c(1:6),nrow=2, byrow=T)
m3
123
456

벡터에 차원을 주는 방법도 있다.
dim함수는 벡터를 행렬로 변환할 뿐만 아니라 주어진 행렬이 몇 개의 행과 열로 구성되어 있는지 행렬의 크기를 나타내기도 한다.

v1<-c(1:6)
v1
dim(v1)<-c(2,3)
v1

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> </ol>

135
246


배열

3차원 이상의 구조를 갖는 벡터이다.
array를 사용하여 만들 수 있으나 몇 차원의 구조를 갖는지 dim 옵션에 명시해야 한다.
주피터 노트북 R을 사용하면 해당 기능이 작동하지 않는다.

a1<-array(c(1:12), dim=c(2,3,2))
a1
a2<-c(1:12)
dim(a2)<-c(2,3,2)
a2

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> </ol>

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> </ol>


리스트

리스트는 성분들이 서로 이질적이다.

L<-list()
L[[1]]<-5
L[[2]]<-c(1:6)
L[[3]]<-matrix(c(1:6),nrow=2)
L[[4]]<-array(c(1:12),dim=c(2,3,2))
L
  1. 5
  2. <ol class=list-inline>
  3. 1
  4. 2
  5. 3
  6. 4
  7. 5
  8. 6
  9. </ol>
  10. 135
    246
  11. <ol class=list-inline>
  12. 1
  13. 2
  14. 3
  15. 4
  16. 5
  17. 6
  18. 7
  19. 8
  20. 9
  21. 10
  22. 11
  23. 12
  24. </ol>


데이터프레임

2차원 구조를 갖는 관계형 데이터 구조
행렬과 같은 모양이지만 각 열은 서로 다른 타입의 데이터를 가질 수 있다.
R의 벡터는 시작 인덱스 값을 1로 갖는다.

v1<-c(1,2,3)
v2<-c('a','b','c')
df1<-data.frame(v1,v2)
df1
v1v2
1a
2b
3c

R의 벡터는 시작 인덱스 값을 1로 갖는다.

df1[0]
df1[1]
v1
1
2
3



R 내장 함수

기본 함수

help() or ? : 함수의 도움말
paste() : 문자열 이어 붙이기
seq() : 시작값, 끝값, 간격으로 수열을 생성
rep() : 주어진 데이터를 일정 횟수만큼 반복
rm() : 대입 연산자에 의해 생성된 변수 삭제
ls() : 현재 생성된 변수들의 리스트 표현
print() : 값을 콘솔창에 출력

# help와 ?는 R스튜디오에서는 도움창이 있지만 주피터 노트북에서는 하단에 창으로 나온다.
help(paste)
?paste 
paste('This is','a pen')
seq(1,10,by=2)
rep(1,5)
a<-1
a
rm(a)
# a : error
ls()
print(10)

‘This is a pen’

<ol class=list-inline> <li>1</li> <li>3</li> <li>5</li> <li>7</li> <li>9</li> </ol>

<ol class=list-inline> <li>1</li> <li>1</li> <li>1</li> <li>1</li> <li>1</li> </ol>

1

<ol class=list-inline> <li>‘a1’</li> <li>‘a2’</li> <li>‘df1’</li> <li>‘L’</li> <li>‘logical’</li> <li>‘m1’</li> <li>‘m2’</li> <li>‘m3’</li> <li>‘number1’</li> <li>‘number2’</li> <li>‘string1’</li> <li>‘string2’</li> <li>‘strint1’</li> <li>‘v1’</li> <li>‘v2’</li> <li>‘v4’</li> <li>‘v5’</li> </ol>

[1] 10


통계 함수

sum : 입력된 값의 합
mean : 입력된 값의 평균
median : 입력된 값의 중앙값
var : 입력된 값의 표본 분산
sd : 입력된 값의 표본 표준편차
max : 입력된 값의 최댓값
min : 입력된 값의 최솟값
range : 입력된 값의 최댓값과 최솟값
summary : 입력된 값의 요약값

NA가 있는 경우에 na.rm=T 사용하면 NA 제외하고 계산

v1<-c(1:9)
sum(v1)
mean(v1)
median(v1)
var(v1)
sd(v1)
max(v1)
min(v1)
range(v1)
summary(v1)

45

5

5

7.5

2.73861278752583

9

1

<ol class=list-inline> <li>1</li> <li>9</li> </ol>

   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      1       3       5       5       7       9 



R 데이터 핸들링

데이터 이름 변경

2차원 이상의 데이터 구조는 colnames와 rownames 함수를 사용하여 행과 열의 이름을 표현

m1<-matrix(c(1:6),nrow=2)
colnames(m1)<-c('c1','c2','c3')
rownames(m1)<-c('r1','r2')
m1
colnames(m1)
rownames(m1)
df<-data.frame(x=c(1,2,3),y=c(4,5,6))
colnames(df1)<-c('c1','c2')
rownames(df1)<-c('r1','r2','r3')
df1
colnames(df1)
rownames(df1)
c1c2c3
r1135
r2246

<ol class=list-inline> <li>‘c1’</li> <li>‘c2’</li> <li>‘c3’</li> </ol>

<ol class=list-inline> <li>‘r1’</li> <li>‘r2’</li> </ol>

c1c2
r11a
r22b
r33c

<ol class=list-inline> <li>‘c1’</li> <li>‘c2’</li> </ol>

<ol class=list-inline> <li>‘r1’</li> <li>‘r2’</li> <li>‘r3’</li> </ol>


데이터 추출

대괄호([])를 이용하여 원하는 위치의 데이터를 얻을 수 있으며 행과 열의 이름으로 데이터를 얻을 수 있다.

v1<-c(3,6,9,12)
v1[2]
m1<-matrix(c(1:6),nrow=3)
m1
m1[2,2]
colnames(m1)<-c('c1','c2')
m1[,'c1']
rownames(m1)<-c('r1','r2','r3')
m1['r3','c2']

6

14
25
36

5

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> </ol>

6

데이터프레임에서는 $ 기호를 사용하여 원하는 열의 데이터를 구할 수 있으며, $와 []의 혼용이 가능하다.

v1<-c(1:6)
v2<-c(7:12)
df1<-data.frame(v1,v2)
df1$v1
df1$v2[3]

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> <li>6</li> </ol>

9


데이터 결합

행으로 결합하는 rbind와 열로 결합하는 cbind가 대표적이다.

v1<-c(1,2,3)
v2<-c(4,5,6)
rbind(v1,v2)
cbind(v1,v2)
v1123
v2456
v1v2
14
25
36

행의 수 혹은 열의 수가 같아야 결합이 가능하다.
하지만 벡터와 벡터의 결합에서는 부족한 데이터를 앞에서부터 다시 재활용하여 사용한 뒤, 오류와 함께 결과를 반환한다.

v1<-c(1,2,3)
v2<-c(4,5,6,7,8)
rbind(v1,v2)
Warning message in rbind(v1, v2):
"number of columns of result is not a multiple of vector length (arg 1)"
v112312
v245678



제어문

반복문

for과 while이 있다.

for(i in 1:3){
    print(i)
}

data<-c('a','b','c')
for (i in data){
    print(i)
}

i<-0
while(i<5){
    print(i)
    i<-i+1
}
[1] 1
[1] 2
[1] 3
[1] "a"
[1] "b"
[1] "c"
[1] 0
[1] 1
[1] 2
[1] 3
[1] 4


조건문

참과 거짓에 따라 특정 코드가 수행될지 혹은 수행되지 않을지를 결정한다.

number<-5
if(number<5){
    print('number은 5보다 작다')
}else if (number>5){
    print('number은 5보다 크다')
}else{
    print('number은 5와 같다.')
}

number<-3
if(number<5){
    print('number은 5보다 작다')
}else if (number>5){
    print('number은 5보다 크다')
}else{
    print('number은 5와 같다.')
}

number<-7
if(number<5){
    print('number은 5보다 작다')
}else if (number>5){
    print('number은 5보다 크다')
}else{
    print('number은 5와 같다.')
}
[1] "number은 5와 같다."
[1] "number은 5보다 작다"
[1] "number은 5보다 크다"


사용자 정의 함수

사용자가 원하는 변수로 정의 함수를 만들 수 있다.

comparedTo5<-function(number){
    if(number<5){
    print('number은 5보다 작다')
    }else if (number>5){
    print('number은 5보다 크다')
    }else{
    print('number은 5와 같다.')
    }
}

comparedTo5(10)
comparedTo5(3)
comparedTo5(5)
[1] "number은 5보다 크다"
[1] "number은 5보다 작다"
[1] "number은 5와 같다."


주석

주석은 #를 사용하여 표시한다.

# 1+1 계산 방법

1+1

2



통계분석에 사용되는 R 함수

숫자 연산

sqrt : 제곱근
abs : 절댓값
exp : e의 제곱수
log : 밑이 e인 로그 값
log10 : 밑이 10인 로그 값
pi : 원주율
round : 반올림 값
ceiling : 올림
floor : 내림


문자 연산

tolower : 소문자 변환
toupper : 대문자 변환
nchar : 문자열의 길이
substr : 문자 일부분 추출
strsplit : 구분자로 나누어 분할
grepl : 문자열에 존재 확인
gsub : 일부 문자를 대체

data<-'This is a pen'
tolower(data)
toupper(data)
nchar(data)
substr(data,9,13)
strsplit(data,'is')
grepl('pen',data)
gsub('pen','banana',data)

‘this is a pen’

‘THIS IS A PEN’

13

‘a pen’

  1. <ol class=list-inline>
  2. 'Th'
  3. ' '
  4. ' a pen'
  5. </ol>

TRUE

‘This is a banana’


벡터 연산

length : 벡터의 길이
paste : 구분자를 기준으로 결합
cov : 공분산
cor : 상관계수
table : 데이터의 개수
order : 벡터의 순서


행렬 연산

t : 전치행렬
diag : 대각행렬
%*% : 행렬의 곱


데이터 탐색

head : 데이터 앞의 일부분
tail : 데이터 뒤의 일부분
quantile : 4분위수

x<-c(1:12)
head(x,5)
tail(x)
quantile(x)

<ol class=list-inline> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li>5</li> </ol>

<ol class=list-inline> <li>7</li> <li>8</li> <li>9</li> <li>10</li> <li>11</li> <li>12</li> </ol>

<dl class=dl-horizontal> <dt>0%</dt> <dd>1</dd> <dt>25%</dt> <dd>3.75</dd> <dt>50%</dt> <dd>6.5</dd> <dt>75%</dt> <dd>9.25</dd> <dt>100%</dt> <dd>12</dd> </dl>


데이터 전처리

subset : 조건식에 맞는 데이터 추출
merge : 특정 공통된 열을 기준으로 병합
apply : 열 또는 행별로 주어진 함수 적용

df1<-data.frame(x=c(1,1,1,2,2),y=c(2,3,4,3,3))
df2<-data.frame(x=c(1,2,3,4),z=c(5,6,7,8))

subset(df1, x==1)
merge(df1,df2,by=c('x'))
apply(df1,1,sum) # 각 행에 함수 적용
apply(df1,2,sum) # 각 열에 함수 적용
xy
12
13
14
xyz
125
135
145
236
236

<ol class=list-inline> <li>3</li> <li>4</li> <li>5</li> <li>5</li> <li>5</li> </ol>

<dl class=dl-horizontal> <dt>x</dt> <dd>7</dd> <dt>y</dt> <dd>15</dd> </dl>


정규분포

기본값은 표준 정규분포로 mean=0,sd=1이다.

dnorm : 주어진 값에서 함수 값
rnorm : 주어진 개수만큼 표본 추출
pnorm : 주어진 값보다 작은 확률 값 qnorm : 주어진 넓이 값을 갖는 x


표본추출

runif : 균일 분포에서 주어진 개수만큼 표본 추출
sample : 주어진 데이터에서 주어진 개수만큼 표본을 추출


날짜

Sys.Date : 연, 월, 일 출력
Sys.time : 연, 월, 일, 시간 출력 as.Date : 주어진 값을 날짜 형식으로 변환
format : 원하는 날짜 형식으로 변경
as.POSIXct : 타임스탬프를 날짜 및 시간으로 변환

타임 스탬프란 1970/1/1 UTC부터 날짜가 몇 초가 흘렀는지 나타내는 값

Sys.Date()
Sys.time()
as.Date("2020-01-01")
format(Sys.Date(),'%Y/%m/%d')
format(Sys.Date(),'%A') #A는 요일

#시간 데이터의 unclass 값이 타임스탬프  
unclass(Sys.time())
as.POSIXct(1577804401,origin='1970-01-01')
[1] "2021-11-04 01:01:04 KST"

‘2021/11/04’

‘목요일’

1635955264.19852

[1] "2020-01-01 00:00:01 KST"


산점도

plot : 산점도

type : p는 점, l은 직선, b는 점과 직선, n은 아무것도 표시하지 않음
xlim : x축의 범위, ylim : y축의 범위
xlab : x축의 이름, ylab : y축의 이름
main : 산점도의 이름

abline : 추가 직선

v : 수직선, h : 수평선
col : 매개변수의 색상

x<-c(1:10)
y<-rnorm(10)
plot(x,y,type='b',xlim=c(-2,12),ylim=c(-3,3),xlab='X axis',ylab='Y axis',main='Test plot')
abline(v=c(1,10),col='blue')

output_78_0


파일 읽기 쓰기

read.csv : CSV 파일 불러오기
write.csv : CSV 파일로 저장
saveRDS : 분석 모델 및 R 파일 저장
readRDS : 분석 모델 및 R 파일 읽기


기타

install.packages : 패키지 설치
library : 패키지 호출
getwd : 작업 디렉토리 확인
setwd : 작업 디렉토리 설정



데이터 마트

데이터 마트란 데이터 웨어하우스로부터 특정 사용가가 관심을 갖는 데이터들을 주제별, 부서별로 추출하여 모은 비교적 작은 데이터 웨어하우스

adsp_5


데이터 전처리

데이터 정제와 분석 변수 처리 과정

데이터 정제 : 결측값과 이상값을 처리
분석 변수 처리 : 변수 선택, 차원 축소, 파생변수 생성, 변수 변환, 클래스 불균형
파생변수 : 목적과 조건에 따라 생성한 변수
요약변수 : 기본적인 통계 자료를 추출한 변수


R 패키지 활용

reshape 패키지

https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/reshape

melt : 특정 변수를 기준으로 나머지 변수에 대한 세분화된 데이터 생성

install.packages ('reshape')
package 'reshape' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages
student_number<-c(1,2,1,2)
semester<-c(1,1,2,2)
math_score<-c(60,90,70,90)
english_score<-c(80,70,40,60)

score<-data.frame(student_number,semester,math_score,english_score)
rownames(score)<-c(1,2,3,4)

score

library(reshape)
melt(score,id=c('student_number','semester'))
student_numbersemestermath_scoreenglish_score
1 1 6080
2 1 9070
1 2 7040
2 2 9060
Warning message:
"package 'reshape' was built under R version 3.6.3"
student_numbersemestervariablevalue
1 1 math_score 60
2 1 math_score 90
1 2 math_score 70
2 2 math_score 90
1 1 english_score80
2 1 english_score70
1 2 english_score40
2 2 english_score60

cast : melt로 변환한 데이터를 요약을 위해 새롭게 가공

melted_score<-melt(score,id=c('student_number','semester'))

# 학생의 과목별 평균 구하기
cast(melted_score,student_number~variable,mean)

# 학생의 학기별 평균 점수
cast(melted_score,student_number~semester,mean)

# 학생의 과목별 최대 점수
cast(melted_score,student_number~variable,max)
student_numbermath_scoreenglish_score
1 6560
2 9065
student_number12
1 7055
2 8075
student_numbermath_scoreenglish_score
1 7080
2 9070


sqldf 패키지

sqldf는 표준 SQL 문장을 활용하여 R에서 데이터프레임을 다루게 한다.

install.packages('sqldf')
also installing the dependencies 'ellipsis', 'fastmap', 'bit', 'vctrs', 'rlang', 'cachem', 'bit64', 'blob', 'DBI', 'memoise', 'Rcpp', 'gsubfn', 'proto', 'RSQLite', 'chron'




  There are binary versions available but the source versions are later:
        binary source needs_compilation
rlang   0.4.11 0.4.12              TRUE
cachem   1.0.4  1.0.6              TRUE
blob     1.2.1  1.2.2             FALSE
Rcpp     1.0.6  1.0.7              TRUE
RSQLite  2.2.7  2.2.8              TRUE

  Binaries will be installed
package 'ellipsis' successfully unpacked and MD5 sums checked
package 'fastmap' successfully unpacked and MD5 sums checked
package 'bit' successfully unpacked and MD5 sums checked
package 'vctrs' successfully unpacked and MD5 sums checked
package 'rlang' successfully unpacked and MD5 sums checked
package 'cachem' successfully unpacked and MD5 sums checked
package 'bit64' successfully unpacked and MD5 sums checked
package 'DBI' successfully unpacked and MD5 sums checked
package 'memoise' successfully unpacked and MD5 sums checked
package 'Rcpp' successfully unpacked and MD5 sums checked


Warning message:
"cannot remove prior installation of package 'Rcpp'"Warning message in file.copy(savedcopy, lib, recursive = TRUE):
"C:\Users\keonj\anaconda3\Lib\R\library\00LOCK\Rcpp\libs\x64\Rcpp.dll를 C:\Users\keonj\anaconda3\Lib\R\library\Rcpp\libs\x64\Rcpp.dll로 복사하는데 문제가 발생했습니다: Permission denied"Warning message:
"restored 'Rcpp'"

package 'gsubfn' successfully unpacked and MD5 sums checked
package 'proto' successfully unpacked and MD5 sums checked
package 'RSQLite' successfully unpacked and MD5 sums checked
package 'chron' successfully unpacked and MD5 sums checked
package 'sqldf' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages


installing the source package 'blob'
library(sqldf)
sqldf('select * from score')

sqldf('select * from score where student_number=1')

sqldf('select avg(math_score),avg(english_score) from score group by student_number')
student_numbersemestermath_scoreenglish_score
1 1 6080
2 1 9070
1 2 7040
2 2 9060
student_numbersemestermath_scoreenglish_score
1 1 6080
1 2 7040
avg(math_score)avg(english_score)
6560
9065


plyr 패키지

apply함수를 기반으로 데이터를 분리하고 다시 결합하는 기능을 제공한다.

https://cran.r-project.org/web/packages/dplyr/vignettes/dplyr.html

입력 데이터 구조, 출력 데이터 구조, ply ex) ddply-데이터프레임, 데이터프레임, ply

install.packages('plyr')
package 'plyr' successfully unpacked and MD5 sums checked


Warning message:
"cannot remove prior installation of package 'plyr'"Warning message in file.copy(savedcopy, lib, recursive = TRUE):
"C:\Users\keonj\anaconda3\Lib\R\library\00LOCK\plyr\libs\x64\plyr.dll를 C:\Users\keonj\anaconda3\Lib\R\library\plyr\libs\x64\plyr.dll로 복사하는데 문제가 발생했습니다: Permission denied"Warning message:
"restored 'plyr'"


The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages
class<-c('A','A','B','B')
math<-c(50,70,60,90)
english<-c(70,80,60,80)

score<-data.frame(class,math,english)
score

library(plyr)

#summarise는 데이터 요약
ddply(score,'class',summarise,math_avg=mean(math),eng_avg=mean(english))

#transform은 데이터 추가
ddply(score,'class',transform,math_avg=mean(math),eng_avg=mean(english))
classmathenglish
A 5070
A 7080
B 6060
B 9080
Attaching package: 'plyr'

The following objects are masked from 'package:reshape':

    rename, round_any
classmath_avgeng_avg
A 6075
B 7570
classmathenglishmath_avgeng_avg
A 50706075
A 70806075
B 60607570
B 90807570
year<-c(2012,2012,2012,2012,2013,2013,2013,2013)
month<-c(1,1,2,2,1,1,2,2)
value<-c(3,5,7,9,1,5,4,6)

data<-data.frame(year,month,value)
data

ddply(data,c('year','month'),summarise,value_avg=mean(value))

ddply(data,c('year','month'),function(x){
    value_avg=mean(x$value)
    value_sd=sd(x$value)
    data.frame(avg_sd=value_avg/value_sd)
})
yearmonthvalue
20121 3
20121 5
20122 7
20122 9
20131 1
20131 5
20132 4
20132 6
yearmonthvalue_avg
20121 4
20122 8
20131 3
20132 5
yearmonthavg_sd
2012 1 2.828427
2012 2 5.656854
2013 1 1.060660
2013 2 3.535534


data.table 패키지

특정 칼럼별 주소값을 갖는 인덱스를 생성하여 연산과 검색을 빠르게 수행할 수 있다.

install.packages('data.table')
  There is a binary version available but the source version is later:
           binary source needs_compilation
data.table 1.14.0 1.14.2              TRUE

  Binaries will be installed
package 'data.table' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages
library('data.table')
year<-rep(c(2012:2015),each=12000000)
month<-rep(rep(c(1:12),each=1000000),4)
value<-runif(48000000)

# 데이터 프레임과 데이터 테이블 생성

DataFrame<-data.frame(year,month,value)
DataTable<-as.data.table(DataFrame)

# 데이터 프레임의 검색 시간 측정

system.time(DataFrame[DataFrame$year==2012,])

# 데이터 테이블의 검색 시간 측정

system.time(DataTable[DataTable$year==2012,])

# 칼럼이 키 값으로 설정될 경우 자동 오름차순 정렬  

setkey(DataTable,year)

# 키 값으로 설정된 칼럼과 J 표현식을 사용한 검색시간 측정 

system.time(DataTable[J(2012)])
Warning message:
"package 'data.table' was built under R version 3.6.3"
Attaching package: 'data.table'

The following object is masked from 'package:reshape':

    melt




   user  system elapsed 
   0.87    0.24    1.11 



   user  system elapsed 
   0.47    0.21    0.29 



   user  system elapsed 
   0.32    0.06    0.12 



데이터 탐색

탐색적 데이터 분석

데이터를 이해하고 의미있는 관계를 찾기 위해 데이터의 통계값과 분포 등을 시각화하고 분석하는 것

head(iris,3)
summary(iris)
str(iris)
Sepal.LengthSepal.WidthPetal.LengthPetal.WidthSpecies
5.1 3.5 1.4 0.2 setosa
4.9 3.0 1.4 0.2 setosa
4.7 3.2 1.3 0.2 setosa
  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  
                
                
                


'data.frame':	150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...


결측값

결측값은 존재하지 않는 데이터를 의미하며 NA로 표현하지만 null, 공백, -1과 같은 표현을 할 때도 있다.
결측치를 처리하는 것은 가장 중요한 과정이다.
Amelia와 DMwR2가 대표적이다.

Amelia

missmap 함수로 결측값을 시각화하기 좋다.

install.packages('Amelia')
also installing the dependency 'RcppArmadillo'




  There are binary versions available but the source versions are later:
                  binary     source needs_compilation
RcppArmadillo 0.10.4.0.0 0.10.7.0.0              TRUE
Amelia             1.7.6      1.8.0              TRUE

  Binaries will be installed
package 'RcppArmadillo' successfully unpacked and MD5 sums checked
package 'Amelia' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages
copy_iris<-iris
copy_iris[sample(1:150,30),1]<-NA #결측값 생성 
library(Amelia)
missmap(copy_iris)
Warning message:
"package 'Amelia' was built under R version 3.6.3"Loading required package: Rcpp
## 
## Amelia II: Multiple Imputation
## (Version 1.7.6, built: 2019-11-24)
## Copyright (C) 2005-2021 James Honaker, Gary King and Matthew Blackwell
## Refer to http://gking.harvard.edu/amelia/ for more information
## 

output_109_1


결측값 대치 방법

단순 대치법

데이터를 삭제하는 방법이다.
대량의 데이터 손실이 발생할 수 있다.
complete.cases 함수가 있다.
하나의 열에 결측값이 존재하면 FALSE, 존재하지 않으면 TRUE를 반환한다.

adsp_6

copy_iris<-iris
dim(copy_iris) # 기존 데이터
copy_iris[sample(1:150,30),1]<-NA # 결측값 생성
copy_iris<-copy_iris[complete.cases(copy_iris),] # 단순 대치법
dim(copy_iris) # 결측값 처리 후

<ol class=list-inline> <li>150</li> <li>5</li> </ol>

<ol class=list-inline> <li>120</li> <li>5</li> </ol>


평균 대치법

평균 혹은 중앙값으로 결측값을 대치하여 완전한 자료로 만드는 방법이다.

비조건부 평균 대치법 : 데이터의 평균값으로 결측값을 대치하는 방법
조건부 평균 대치법 : 실제 값들을 분석하여 회귀분석을 사용하는 방법

DMwR2 패키지의 central Imputation 함수가 있다.

adsp_7

install.packages('DMwR2')
package 'DMwR2' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\keonj\AppData\Local\Temp\Rtmp2RneIh\downloaded_packages
copy_iris<-iris
copy_iris[sample(1:150,30),1]<-NA # 결측값 생성

meanValue<-mean(copy_iris$Sepal.Length,na.rm=T) #결측값을 제외한 평균  
copy_iris$Sepal.Length[is.na(copy_iris$Sepal.Length)] <-meanValue # 평균 대치  

# central Imputation 사용
library(DMwR2)

copy_iris[sample(1:150,30),1]<-NA # 결측값 생성
copy_iris<-centralImputation(copy_iris)


단순 확률 대치법

평균 대치법에서 추정량 표준 오차의 과소 추정 문제를 보완하고자 고안된 방법으로 KNN 방법이 있다.

adsp_8

KNN 방법 : KNN 알고리즘으로 주변 K개의 데이터 중 가장 많은 데이터로 대치하는 방법

adsp_9

copy_iris<-iris
copy_iris[sample(1:150,30),1]<-NA # 결측값 생성
copy_iris<-knnImputation(copy_iris,k=10)


다중 대치법

여러 번의 대치를 통해 n개의 임의 완전자료를 만드는 방법으로 대치, 분석, 결합의 세 단계로 구성된다.

copy_iris<-iris
copy_iris[sample(1:150,30),1]<-NA # 결측값 생성
iris_imp<-amelia(copy_iris,m=3,cs='Species') #cs는 cross-sectional로 분석에 포함될 정보

copy_iris$Sepal.Length<-iris_imp$imputation[[3]]$Sepal.Length
-- Imputation 1 --

  1  2  3

-- Imputation 2 --

  1  2  3

-- Imputation 3 --

  1  2  3


이상값

이상값이란 값이 존재하지 않는 결측값과 달리 다른 데이터와 비교했을 때 극단적으로 크거나 작은값

ESD(Extreme Studentized Deviation)

ESD는 평균으로부터 ‘표준편차 3’만큼 떨어진 값들을 이상값으로 인식하는 방법이다.
전체 데이터의 약 0.3퍼센트를 이상값으로 구분한다.

adsp_10


사분위수

사분위수를 이용하여 25%(Q1), 75%(Q3)에 해당하는 값을 활용하여 이상치를 판단한다.
IQR이란 Q1~Q3 사이를 의미하며 사분범위라고 한다.
사분범위에서 1.5분위수 벗어나는 경우를 이상치로 판단한다.
Q1-1.5IQR 미만이거나 Q3+1.5IQR 초과면 이상값으로 판단한다.

adsp_11