본문 바로가기
데이터분석/데이터분석준전문가(ADsP)

ADsP 대비 Part3.R기초와 데이터 마트

by Bookohol 2019. 5. 13.

R기초와 데이터 마트

데이터 분석 준전문가 ADsP 한 권으로 끝내기

http://book.naver.com/bookdb/book_detail.nhn?bid=13773681

 

* 위 참고도서를 직접 구입해 개인적으로

공부한 내용을 공유합니다.

ADsP를 준비하시는 많은 비전공자 분들에게 도움이 되었으면 합니다 :)

* 이 포스팅은 PC 버전에 최적화되어 있습니다

기출 빈도   

1. R기초

1) 분석 환경의 의해 (생략)

2) R 언어와 문법

[출처] Ceballos, Maite and Nicolás Cardiel. 2013. "Data structure." First Steps in R. Accessed 2018-05-11.

(1) 벡터 : 데이터 내에 들어갈 수 있는 원소는 숫자, 문자, 논리연산자이며 동일한 자료형을 갖는 값들의 집합

# 숫자형 벡터
> x<-c(1,3,4) 
# 문자형 벡터
> y<-c("사과", "배", "딸기") 
# 논리연산자 벡터(TRUE = 1, FALSE = 0, 반드시 대문자)
> z<-c(TRUE, FALSE) 
# 숫자형 벡터 + 문자형 벡터
> xy <-c(x,y)
> xy
[1] "1","3","4","사과","배","딸기"  #모두 문자열 형태

* vector type : numeric type(실수형 변수), intege type(정수형 변수), factor type(순서형, 명목형 변수), character type(문자열)

(2) 행렬 : 한 가지 유형의 스칼라만 사용할 수 있음

* matrix(data, nrow, ncol, byrow=FALSE, dimnames=NULL)

: data = 데이터 벡터, nrow=행의 수, ncol=열의 수, byrow=FALSE(열 우선으로), dimnames=각 차원 이름

> m<-matrix(c(1,2,3,4,5,6), ncol=2, byrow=FALSE, dimnames=NULL)
> m 
     [,1] [,2]
[1,]    1    4
[2,]    2    5
[3,]    3    6
> m<-matrix(c(1,2,3,4,5,6), nrow=2, byrow=FALSE, dimnames=NULL)
> m
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

 

(3) 데이터 프레임 : 행열과 유사한 2차원 데이터 구조, 각 열이 서로 다른 데이터 타입을 가질 수 있기 때문에 데이터의 크기가 커져도 사용자가 다루기 쉽다. 단, 벡터들의 길이가 반드시 같아야 함

# 데이터 프레임 생성
> a<-c(10,20,30)
> b<-c("a","b","c")
> c<-c(FALSE, TRUE, FALSE)
> D<-data.frame(income=a, car=b, marriage=c)
> D
  income car marriage
1     10   a    FALSE
2     20   b     TRUE
3     30   c    FALSE

(4) 배열 : 다차원 데이터 형태

# 벡터 데이터(1:10)는 열을 우선으로 배치되며, 배열의 빈 공간은 데이터가 반복되어 채워짐(1:2)
> array(1:10, dim=c(3,4))
     [,1] [,2] [,3] [,4]
[1,]    1    4    7    10
[2,]    2    5    8    1
[3,]    3    6    9    2
# 동일한 벡터 데이터(1:10)을 2*2*3 차원 배열로 생성 가능
> array(1:10, dim=c(2,2,3))
, , 1
     [,1] [,2]
[1,]    1    3
[2,]    2    4
, , 2
     [,1] [,2]
[1,]    5    7
[2,]    6    8
, , 3
     [,1] [,2]
[1,]    9    1
[2,]   10    2

(5) 리스트 : 서로 다른 데이터 유형을 담을 수 있음

> x<-list(fruit="apple", price=2000) 
# (fruit)key = (apple)value, (키, 값)의 형태
> x
$fruit
[1] "apple"
$price
[1] 2000
#  x$key(fruit, price) 값을 넣어주면 그에 해당되는 값을 불러올 수 있음 
> x$fruit
[1] "apple"
> x$price
[1] 2000

3) 외부 데이터 불러오기

# CSV 파일 불러올 시 : read.csv("경로\\파일명", header = T) <-csv파일 첫 줄을 변수명으로 지정
> read.csv("D:\\Rprogramming\\test.csv",hearder=T)
# txt 파일 불러올 시 : read.table("경로\\파일명", header = T, Sep=",") <-쉼표로 구분된 데이터 파일임을 지정
> read.table(D:\\Rprogramming\\test.csv",hearder=T,Sep=";")
# 엑셀 파일 불러올 시 : csv 파일로 지정해서 불러오는 것을 추천함

4) R의 기초 함수

(1) 수열 생성하기

# 수열 생성 req(n,m) : n을 m만큼 반복하는 숫자 벡터
> rep(1,3)
[1] 1 1 1
> rep(2:4, 2) 
[1] 2 3 4 2 3 4
# 수열 생성 seq(n,m) : n을 m까지 1만큼 증가하는 숫자 벡터
> seq(1,4)
[1] 1 2 3 4
> seq(1,11,by=3) # by=n 옵션은 n만큼 증가하는 숫자 벡터 생성
[1]  1  4  7 10
> seq(1,11,length=6) # length = n 옵션은 전체 숫자 벡터 데이터 수가 6개가 되도록 균등하게 증가
[1]  1  3  5  7  9 11

(2) 기초적인 행렬 계산

> a<-c(1,2,3) # 3행1열
> t(a) # 1행3열, 전치행렬 생성 함수 : t(a)  
     [,1] [,2] [,3]
[1,]    1    2    3
> z<-a%*%t(a) # %*% 행렬 곱하는 연산자 
> z
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9
> D<-z+matrix(c(3,5,4,2,1,9,10,2,3), ncol=3) # 3*3행렬 덧셈 연산 
> D
     [,1] [,2] [,3]
[1,]    4    4   13
[2,]    7    5    8
[3,]    7   15   12
> solve(D) # 역행렬 함수 solve( )
            [,1]        [,2]        [,3]
[1,] -0.10752688  0.26344086 -0.05913978
[2,] -0.05017921 -0.07706093  0.10573477
[3,]  0.12544803 -0.05734767 -0.01433692

(3) 기초적인 합, 평균, 분산, 상관계수, 공분산

> c<-1:10
> mean(c) # 평균
[1] 5.5
> var(c) # 분산
[1] 9.166667
> sd(c) # 표준편차
[1] 3.02765
> sum(c) # 합
[1] 55
> median(c) # 중앙값
[1] 5.5
> b<-log(c) # 숫자 벡터 로그 변환
> b 
 [1] 0.0000000 0.6931472 1.0986123 1.3862944 1.6094379 1.7917595 1.9459101 2.0794415 2.1972246 2.3025851
> cov(b,c) # 공분산: 두 변수가 각자의 평균으로부터 멀어지는 정도 => 두 변수간의 관계
[1] 2.112062
> cor(b,c) # 상관계수 : 공분산/(b의 표준편차 * c의 표준편차) => 단위를 보정하기 위해 각 변수의 표준편차로 나눠줌
[1] 0.9516624
> summary(c) # 각 사분위수 계산. 기초 통계량 확인
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00    3.25    5.50    5.50    7.75   10.00 

5) R 데이터 핸들링

(1) 벡터형 변수

> Fruit<-c("apple","banana","grape")
> Fruit[2] # 2번째 원소 해당되는 값 불러옴
[1] "banana"
> Fruit[-3] # 3번째 원소만 제외한 나머지 값 불러옴
[1] "apple"  "banana"
> Fruit[c(1,3)] # 1,3번째 값 불러옴
[1] "apple" "grape"

(2) 반복문과 조건문, 사용자 정의 함수

# 반복문 for구문
> a<-c() # 빈 숫자 벡터 생성
> for(i in 1:3) {  
+   a[i]=i*i  # 1~3까지 제곱해서 빈 숫자 벡터 a에 차례로 값 넣어줌
+ }
> a
[1] 1 4 9 
# 반복문 while 구문 # ( )안의 조건이 만족될 때 까지 { }부분을 반복함
> x=3
> while(x<6){  
+   x=x+1
+   print(x)
+ }
[1] 4
[1] 5
[1] 6

# 조건문 if문 ( )안의 조건이 만족하면 { }실행, 그렇지 않을 경우 else 다음의 { } 실행
> variable=7
> if(variable%%2==0) {   # n%%m = n을 m으로 나눴을 때의 나머지값  
  print("even")
  }else{print("odd")}
[1] "odd"
# 사용자 정의 함수 function( )을 사용하여 사용자가 원하는 기능의 함수를 구성하여 사용할 수 있음 
> test<-function(a){
+   if(a%%2==0) {
+     print("even")
+   }else{print("odd")}
+ }
> test(10)
[1] "even"
> test(11)
[1] "odd

 

(3) 기타 기능들

> price<-seq(2000,5000, by=1000)
> price
[1] 2000 3000 4000 5000
> fruit<-c("apple","banana","grape","kiwi")
 # Paste( ) : 입력받은 두 벡터를 하나로 붙여 줌 
> paste(price, fruit) [1] "2000 apple"  "3000 banana" "4000 grape"  "5000 kiwi" 
 # sep=' '옵션으로 붙이고자 하는 문자열 사이에 삽입 가능
> paste(fruit, price, sep=":") 
[1] "apple:2000"  "banana:3000" "grape:4000"  "kiwi:5000" 
 # substr(data, n, m) : data들의 n번 글자부터 m까지 글자만을 추출
> substr(fruit,1,3) 
[1] "app" "ban" "gra" "kiw"

# 자료형 데이터 구조 변환
> as.integer(3.14) # 정수형으로 변환
[1] 3
> as.numeric("fruit") # 수치형으로 변환해야하나, fruit는 문자형이므로 Not Available(NA) 출력
[1] NA
Warning message:
NAs introduced by coercion 
> as.numeric(FALSE) # TRUE = 1, FALSE = 0 으로 변환
[1] 0
> as.logical(3) # 수치가 들어있으면 TRUE 반환 
[1] TRUE
> as.data.frame(fruit) # 데이터 프레임 형식으로 변환
   fruit
1  apple
2 banana
3  grape
4   kiwi
> as.list(fruit) # 리스트 형식으로 변환
[[1]]
[1] "apple"
[[2]]
[1] "banana"
[[3]]
[1] "grape"
[[4]]
[1] "kiwi"
> as.matrix(fruit) # 행렬 형식으로 변환 
     [,1]    
[1,] "apple" 
[2,] "banana"
[3,] "grape" 
[4,] "kiwi"  
> as.factor(fruit) # factor 형식으로 변환
[1] apple  banana grape  kiwi  
Levels: apple banana grape kiwi

6) R 그래픽 기능

(1) 산점도 그래프 : plot(a, b)

(2) 산점도 행렬 : pairs(data, main='산점도 제목', pch=21(점의 모양), bg = c(구별하고자 하는 변수들))

(3) 히스토그램 : hist( ), 상자 그림 : boxplot( )

 

2. 데이터 마트

: 데이터의 한 부분으로서 특정 사용자가 관심을 갖는 데이터들을 담은 비교적 작은 규모의 데이터 웨어하우스

1) R reshape2의 melt(), cast() 함수

(1) reshape 패키지 : 보통 실제 데이터들의 형태는 분석에 알맞지 않는 형태가 많아 분석 목적, 기법에 맞게 재구조화해주는 작업이 필요하다.

- melt() 여러 변수로 구성된 데이터를 재구성함,

: melt(data, id.vars, na.rm=False)

→ 'id.vars' 옵션은 식별할 컬럼, 'na.rm=False' 옵션은 NA인 행을 결과에 포함시킬지 여부

→ 여러 변수를 하나의 명목형 변수로 재구조화하면 R에서 시각화하기 쉬워짐

- cast() melt()된 데이터를 다시 여러 칼럼으로 변환

: cast(data, variable1~variable2~variable3)

→ 행을 variable1, 열을 variable2로 각 변수들을 새롭게 배열함

* cast(data, variable1~variable3, mean)

→ mean : variable1을 기준으로 나머지 variable들의 평균

* cast(data, variable1~variable3, mean, margins = c("grand_row","grand_col"))

→ margin : 행과 열에 대한 합계를 산출하는 기능

* cast(data, variable1~variable3, mean, subset=variable=="variable2")

→ subset : 특정변수(variable2)만을 처리하도록 함

* cast(data, variable1~variable3, range)

→ range : mindms "_X1"이라는 변수를, max는 "_X2"라는 변수명을 끝에 붙여줌

* 변수명을 알고 싶을 때 names(data)

* 변수명을 소문자로 변환할 때 tolower(names(data))

(2) Sqldf 패키지 : SQL문을 사용할 줄 아는 사용자가 쉽게 데이터를 접근할 수 있게 해줌

(3) Plyr 패키지 : 데이터를 분리하고, 분할된 데이터에 특정 함수를 적용, 결과를 재결합 처리하는 함수를 제공

* ddply : 데이터프레임 입력 → 데이터 가공 후 다시 데이터 프레임으로 출력

: ddply(data, variables, function())

→ variable에 나열한 컬럼에 따라 데이터를 나눈 뒤 함수를 적용

* adply는 행 또는 컬럼 단위로 함수를 적용

* summarise() : 데이터의 요약 정보를 새로운 변수에 만드는 함수

: ddply(data, variables, summarise, mean.count=mean(count))

* transform() : 연산의 결과를 데이터 프레임의 새로운 칼럼에 저장하는 함수

: ddply(data, variables,transform, total.count=sum(count))

(4) 데이터 테이블 : 데이터 프레임과 유사하지만 보다 빠른 그룹화와 순서화, 짧은 문장 지원 및 데이터 분석 속도에서 데이터 프레임보다 연산속도가 빠르다

- 데이터 프레임과 다른 점 : 행 번호가 콜론(:)으로 제일 앞 쪽에 함께 프린트 됨

* table( ) : 모든 데이터 테이블 객체의 목록을 저장한 데이터 테이블을 반환한다.

* Sapply(x, class) : 벡터, 리스트, 데이터 프레임 형식으로 각 컬럼의 데이터 타입을 구하는 함수

* Setkey(데이터테이블, 정렬할 컬럼) : key를 사용하여 빠른 데이터 접근이 가능함

3. 결측값 처리와 이상값 검색

1) 결측값의 대치법

- 결측값의 대치법 : 결측/무응답을 가진 자료를 분석할 수 있는 대치법(imputation)

(1) 완전히 응답한 개체분석 : 불완전한 자료는 모두 무시, 완전하게 관측된 자료만으로 분석

(2) 평균대치법 : 관측 또는 실험되어 얻어진 자료의 적절한 평균값으로 결측값을 대치.

(3) 단순확률 대치법 : 평균대치법에서 추정량 표준오차의 과소추정 문제를 보완하고자 고안된 방법으로

Hot-deck2 방법, nearestneighbour 2 방법이 있음

(4) 다중대치법 : 단순확률대치법을 여러 번 사용하는 것으로, 통계량이 효율성, 일치성 등의 문제를 부분적으로 보완해주기는 하나, 추정량 표준오차의 과소 추정 또는 계산의 난해성 문제를 여전히 가지고 있음

2) 결측값 처리

- 결측값 처리: Amelia 2, Mice, mistools 패키지 사용

(결측값은 NA, not available, 불가능한 값은 NaN, not a number)

> y <- c(1, 2, 3, NA)
> is.na(y)  # 벡터 y의 결측값 확인
[1] FALSE FALSE FALSE  TRUE

> x <- c(1, 2, NA, 3)
> mean(x)
[1] NA
> mean(x, na.rm = T) # 결측값이 있으면 제거하고 평균값 계산
[1] 2

* Is.na(y) : 벡터 y의 결측값 확인

* Mean(y, na.rm=T) : 결측값이 있으면 제거하고 평균값 계산

* complete. case( ) : 해당 행의 결측값이 없으면 TRUE, 결측값이 있으면 FALSE

→ data[!complete.case()] : NA가 포함된 행을 찾아냄

3) 이상값 검색

- 이상값은 의도하지 않게 잘못 입력된 경우, 분석 목적에 부합되지 않아 제거해야 하는 경우, 의도되지 않은 현상이지만 분석에 포함해야 하는 경우(이상값), 의도된 이상값으로 구성

(1) ESD, MADM 이상값 처리 알고리즘

- ESD(Extreme Studentized Deviation) : 평균으로부터 k*표준편차만큼 떨어져 있는 값들을 이상값으로 판단하고 일반적으로 k는 3으로 적용.

(2) boxplot, summary 함수를 사용

- boxplot : 이상값을 시각적으로 확인

[출처] boxplot, https://towardsdatascience.com/understanding-boxplots-5e2df7bcbd51

- summary( ) : 데이터의 기초 통계량 확인을 통해, 최대, 최소, 중위값, 1분위, 3분위수 파악 가능

(3) Outlier( ) 패키지를 사용할 경우, outlier(y) = 평균과 가장 차이가 많이 나는 값을 출력

댓글