데이터 분석 기획
R의 연산자 우선 순위
연산자 우선순위 | 의미 | 예 |
---|---|---|
^, ** | 지수 | 2^4 |
+, - | 양수, 음수부호 | +4, -2 |
: | 수열 생성 | 1:5 |
%any% | 특수 연산자 | %/% : 몫, %% : 나머지, %*% : 행렬곱 |
*, / | 곱셈, 나눗셈 | 2*4, 10/3 |
== | 같음 비교 | 3 == 5 # False |
!= | 다름 비교 | 3 != 5 # True |
>=, <=, <, > | 이상, 이하, 작다, 크다 | 3>=5, 3<=5 # False, True |
! | 논리 부정 | !(3==5) |
&, && | 논리 AND | & : 논리 연산 데이터가 하나 이상인 경우 사용 && : 논리 연산 데이터가 하나인 경우 사용 |
|, || | 논리 OR | 논리 AND와 같은 규칙 |
~ | 식(formula) | 종속변수1 + 종속변수2 … ~ 독립변수1 + 독립변수2 … |
->, -» | 왼쪽값을 오른쪽으로 대입 | 3 -> a, 3 -» a |
= | 오른쪽 값을 왼쪽으로 대입 | a = 3 |
<-, «- | 오른쪽 값을 왼쪽으로 대입 | a <- 3, a «- 3 |
R의 데이터 형(=타입)
R의 데이터 형은 기본형, 구조형, 복합형으로 나눌 수 있으며, Special Values가 존재함
데이터 형 | 특징 |
---|---|
numeric(기본형) | 정수, 실수, 복소수, 수학적 연산 및 통계적 계산 |
character(기본형) | 문자, 단어로 구성, “ “또는 ‘ ‘내에 표현됨 |
logical(기본형) | TRUE, FALSE, 산술 연산시 1, 0으로 사용됨 |
데이터형 | 차원 | 원소 | 원소의 타입 |
---|---|---|---|
scalar(구조형) | 단일 | 수치/문자/논리 | 단일 |
factor(구조형) | 1D | 수치/문자 | 단일, 범주형 |
vector(구조형) | 1D | 수치/문자/논리 | 단일 |
matrix(구조형) | 2D | 수치/문자/논리 | 단일 |
data.frame(복합형) | 2D | 수치/문자/논리 | 복합 가능 |
array(구조형) | 2D 이상 | 수치/문자/논리 | 단일 |
list(복합형) | 2D 이상 | 수치/문자/논리 | 복합 가능 |
Special Values
- NULL : 변수 값이 초기화 되지 않음
- NA(Not Available) : 데이터 값 없음(결측치)
- NaN(Not Available Number) : 계산 불가능
- INF(infinite) : 무한대
R의 데이터 구조 - vector
vector - c 함수로 생성
- 하나 이상의 스칼러(=길이가 1인 벡터)원소들을 갖는 단순한 형태의 집합
- 숫자, 문자, 논리형 데이터를 원소(Element)로 사용할 수 있음
- 동일한 자료형 을 갖는 값들의 집합으로 **하나의 열(Column)로 구성됨
- 백터 생성 함수 : c(value1, value2, …), seq(from, to, by), rep(x, time, each)
R의 데이터 구조 - matrix
matrix(행렬)
- 데이터의 형태가 2차원으로 행(row)과 열(column)로 구성
- 하나의 데이터 유형만 가능, 역행렬은 solve( )로 구함
행렬 생성 함수
- matrix(data= NA, nrow=1, ncol=1, byrow=False, dimnames=NULL)
- rbind(vectors or matrics), cbind(vectors or matrices)
R의 데이터 구조 - data.frame
data.frame
- 엑셀의 WorkSheet와 같은 구조의 2차원 데이터
- ‘여러가지 데이터 유형’을 가질 수 있음, 벡터 별로 다른 데이터 유형 가능
- 벡터가 모여 데이터 프레임을 구성함
data.frame 생성 함수
- data.frame(vectors or matrices, stringsAsFactors) * 벡터의 길이는 모두 같아야함
- data.frame(변수명=벡터, …, stringsAsFactors * stringsAsFactors를 TRUE로 지정하면 문자열을 factor형으로 저장함
R의 데이터 구조 - list
list
- 서로 다른 데이터 타입을 담을 수 있음
- 리스트에 저장된 데이터를 index 또는 key를 사용해 접근함
- 생성 함수 : list(key=value, key=value … )
외부 데이터 사용
작업 환경 설정
- setwd(‘디렉터리 이름’) > setwd(‘c:/r_workspace’)
- getwd( ) : 현재 작업 디렉터리 반환 > getwd()
csv 파일 불러오기, 저장하기
- read.csv(‘파일이름’, fileEncoding=’UTF-8-BOM’)
- write.csv(‘파일이름’, row.names=FALSE)
data.frame 핸들링
새로운 변수 만들기 | 데이터프레임 $변수명 또는 데이터 프레임 [‘변수명’] <- 추가할 데이터 벡터 |
---|---|
조건으로 선택 | subset(x, subset=(조건)) * subset=생략 가능 |
목록으로 선택 | subset(x, subset=(조건), select=열/열 목록) |
열, 열 목록 제거 | subset(x, subset=(조건), select=열/ - 열 목록) |
열 이름 바꾸기 | colnames(x) <- , colnames(x)[index] <- |
R의 데이터셋 사용
x : 데이터 셋 이름 / v : 데이터 / n : 숫자
head(x, n) | 데이터 셋 처음 여섯 개 반환, n지정 시 해당 개수 만큼 반환 |
---|---|
tail(x, n) | 데이터 셋 마지막 여섯 개 반환, n 지정 시 해당 개수 만큼 반환 |
View(x) | 창을 열고 엑셀과 유사한 형태로 데이터 셋을 보여줌 |
summary(x) | 데이터 셋을 구성하는 항목의 기초 통계량을 보여줌 (최솟값, 1사분위수, 중간값, 평균, 3사분위수, 최댓값) |
str(x) | 데이터의 구성을 표시함 |
attach(x) | 데이터셋을 고정으로 사용하겠다고 선언함, detach할 때까지 유효 변수명만으로 바로 데이터에 접근 가능 iris$Sepal.Width -> Sepal.Width |
detach(x) | 고정된 데이터셋 사용을 해체 선언함 |
head, tail, summary, str : vector, matrix 등의 다양한 객체에 적용 가능
View : matirx, data.frame, list 등 Data 구조에 적용 가능
그래프 종류
산점도 | 산점도 행렬 | 상자그림 | 히스토그램 | 막대그래프 |
---|---|---|---|---|
plot(x, y) | pairs( ) | boxplot( ) | hist( ) | barplot( ) |
2개 수치형 변수의 상관관계 알아보기 |
여러개의 변수관계 알아보기 | 이상치 존재 확인, IQR 길이, 최소, 최대, 1사분위, 3사분위, 중위값 확인 NA제거하고 그려짐 |
연속형 수치에 적합 히스토그램의 사각형 | 명목형 변수의 빈도에 활용, 막대 사이가 끊겨있는 모양 |
Boxplot
데이터의 분포를 파악하는 도구이다.
Histogram
- 도수 분포ㅛㅍ의 각 계급을 가로축에 나타내고, 해당 계급에 속하는 측정값의 도수를 세로축에 표시하여 직사각형 모양으로 그림
- 왼쪽으로 치우친 모양이라면 데이터가 전체 범위에서 수치가 낮은 쪽에 몰려 있음을 의미, 오른쪽에 치우쳐 있다면 높은 쪽에 몰려 있음을 의미
- 할 쪽으로 치우치는 것 없이 비슷한 높이로 그려진다면 균일한 분포
- 막대 높이는 빈도를 나타내며, 폭은 의미가 없음
- 가로, 세로축 모두 연속적임, 범주형에는 막대그래프를 사용함
- 많은 데이터를 가지고 있는 경우보다 정확한 관계 파악을 할 수 있음
apply 계열 함수
- 데이터 조작에 편리한 기능 제공, apply 함수가 가장 많이 사용됨
- for문 없이 multi-core 사용으로 빠르게 연산 가능
- split -> apply -> combine 기능 제공, (데이터 분할 -> 함수 적용 -> 재결합)
- apply
- apply(input : array / output : array)
- array 에 행 또는 열 별로 함수를 적용한 다음 그 결과를 vector 또는 array로 변환
- lapply
- lapply(input : vector, list / output : list)
- vector, list에 함수를 원소별 적용하여 결과를 list로 반환
- vector로 변환을 위해 unlist 사용
- sapply
- (input : list or vector / output : vector or array)
- lapply와 유사하지만 결과를 vector, matrix 또는 array로 반환
- tapply
- tapply(input : list or vector and factor / output : vector or array)
- 입력 데이터를 특정 기준 ㅇㅡ로 묶은 다음 각 그룹마다 주어진 함수를 적용하고 그 결과를 반환
패키지 설치, 대표적인 패키지
패키지 설치와 로딩
- 패키지 설치
- install.packages(‘패키지이름’) * 패키지 이름은 문자열로
- 패키지 로딩
- library(‘패키지이름’), library(패키지이름) * 패키지 이름은 문자열로 / 이름 자체
주요 패키지
- reshape
- melt(data, id=…) : id에 저장한 변수를 기준(=고정)으로 데이터 구조를 변경함
- cast(data, formula=…, [func=…]) : 데이터를 formula에 있는 형태로 변환하고 func 적용
- formula=행변수(고정)~열변수(변경), 여러 개 변수는 + 로 묶음
- reshape2
- cast 대신 acast, dcast 사용
- sqldf
- sqldf(‘sql 문자열’)
- plyr
- ??ply, **adply(), ddply() …
유용한 함수들
- past()
- 입력 받은 객체들의 같은 위치 요소를 하나의 문자열로 붙임
- number <- 1:5
- alphabet <- c(‘a’, ‘b’, ‘c’)
- paste(numberm alphabet) * “1a” “2b” “3c” “4d” “5b”
- substr()
- 주어진 문자열에서 특정 문자열 추출, substr(대상, 시작위치, 끝위치)
- fruit <- c(“apple”, “banana”, “orange”)
- substr(fruit, 1, 2) * “ap” “ba” “or”
- split()
- 데이터를 분리할 때 사용, split(데이터, 분리조건)
- split(iris, iris$Species) * 3개 data.frame 을 갖는 list로 생성됨
- subset()
- 특정 부분만 추출하는 용도
- subset(iris, Species==’setosa’ & Sepal.Length > 5.0)
- select()
- subset에 select 인자를 지정하면 특정 열을 선택하거나 제외 용도로 사용
- subset(iris, select = c(Sepal.Length, Species))
객체의 속성 관련 함수
is.numeric(x) | 객체 유형이 numeric 인지 판단 | TRUE/FALSE 반환 |
---|---|---|
is.logical(x) | 객체 유형이 logical 인지 판단 | TRUE/FALSE 반환 |
is.character(x) | 객체 유형이 caracter 인지 판단 | TRUE/FALSE 반환 |
is.integer(x) | 객체 유형이 정수 인지 판단 | TRUE/FALSE 반환 |
is.double(x) | 객체 유형이 실수 인지 판단 | TRUE/FALSE 반환 |
is.factor(x) | 객체 유형이 factor 인지 판단 | TRUE/FALSE 반환 |
is.null(x), is.na(x) | 객체 유형이 NULL/NA 인지 판단 | TRUE/FALSE 반환 |
length(x) | 객체 원소의 개수 반환, matrix의 경우 행 * 열의 수 | |
nrow(x) | 행의 개수 반환(백터, 스칼라 등에서 사용 못함) | |
NROW(x) | 백터의 행의 개수 반환(스칼라에서도 사용 가능) |
결측치 대치법
단순 대치법(Single Imputation)
- 완전히 응답한 개체 분석
- completes analysis, 불완전 자료는 모두 무시
- 부분적으로 관측된 자료를 무시하므로 생기는 효휼성 상힐, 통꼐적 추론의 타당성 문제 존재
- 평균대치법
- 관측 또는 실험을 통해 덛어진 데이터의 평균으로 결측값 대치
- 비조건부 평균 대치법 : 관측 데이터의 평균값으로 대치
- 조건부 평균 대치법 : 회귀분석을 활용한 대치법
- 단순 확률 대치법
- 평균대치법에서 추정한 표준오차의 과소추정문제를 보완하고자 고안됨
- Hot-deck, nearest neighbor 방법 등이 있음
다중 대치법
- 단순 대치법을 한번이 아닌 m번 수행하여 m개의 가상적 완전 자료를 만듦
- 추정량 표준오차의 과소추정 또는 계산의 난해성 문제를 가지고 있음
결측치 인식, 선택, 삭제
- is.na(x)
- x의 포함된 값이 NA인지 아닌지 각각에 대해 TRUE, FALSE 값을 반환함
- logical을 산술 연산이 가능하기 때문에 is.na 함수 적용 후, sum함수를 사용해 결측치 개수를 파악할 수 있음 sum(is.na(x))
- complete.cases(x)
- x가 결측치를 가지고 있지 않은 완전한 데이터인지 확인하는 함수
- 행 별 로 결측치가 없으면 TRUE, 있으면 FALSE를 반환함
- x[!complete.cases(x), ] : indexing을 사용하여 결측치(NA) 행만 추출
- x[complete.cases(x), ] : indexing을 사용하여 결측치(NA)를 포함하지 않은 행만 추출
- na.omit(x) : 결측치(NA)가 있는 행 전체 삭제
이상값 검색
- 이상값(Outlier)
- 의도하지 않게 잘못 입력된 경우(bad data)
- 분석 목적에 부합되지 않아 제거해야 하는 경우
- 의도되지 않은 현상이지만 분석에 포함해야 하는 경우
- 이상값 판단
- ESD : 평균으로부터 3 * 표준편차 밖의 값
- boxplot 사용 : IQR*1.5 밖의 값
- summary() 사용 : 평균, 중앙값, IQR을 보고 판단함
- 이상값 처리
- 이상값도 분석 대상이 될 수 있어 무조건 삭제는 안 됨