데이터 분석 준전문가 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) = 평균과 가장 차이가 많이 나는 값을 출력
'데이터분석 > 데이터분석준전문가(ADsP)' 카테고리의 다른 글
ADsP 대비 Part3.정형 데이터마이닝 (0) | 2019.05.16 |
---|---|
ADsP 대비 Part3.통계분석 (0) | 2019.05.16 |
ADsP 대비 Part2.분석 마스터플랜 (0) | 2019.05.13 |
ADsP 대비 Part2.데이터 분석 기획의 이해 (0) | 2019.05.12 |
ADsP 대비 Part1.가치창조를 위한 데이터 사이언스와 전략 인사이트 (0) | 2019.04.04 |
댓글