데이터 분석 공부
[ADSP 정리] (과목 3) 제1장 R 기초와 데이터 마트 본문
과목 3 데이터 분석
제1장 R 기초와 데이터 마트
제 1절 R 기초
- SAS, SPSS : 유료, 고가, 대용량, 모듈 별도 구매, 최근 경향 반영 느림, 유료 도서 위주, 공개 커뮤니티 X
- R : 오픈소스, 용량 적음, 최근 경향 반영 빠름, 공개 도서 많음, 커뮤니티 활발
1. 분석 환경의 이해
가. 통계 패키지 R
- 오픈소스, 사용자들 직접 제작 패키지 사용 가능
- 강력한 시각화 요소
나. R의 역사
- S : 통계 프로그래밍 언어, Fortran의 서브루틴 통해 통계 계산 수행
- New S : 객체 개념 도입, 많은 변경 -> 코드 새로 작성 필요
- R : 'Scheme' 이라는 언어로부터 렉시컬 스코프 (정적 스코프) 개념 도입한 또 다른 S 언어 프로그램
- 처음 발표 2년째, 자유 소프트웨어 재단 (Free Software Foundation)의 GNU 일반 공중 사용 허가서 (GPL, GNU Public General License)로 인해 무료 재공
- 기존 S로 작성했던 대부분의 코드 실행 가능
- 이후 대부분의 UNIX계열 플랫폼에 다채롭게 대응하도록 컴파일 -> Windows, Linux, Mac OS
- 현재 S언어 기반의 프로그램 중 가장 널리 사용
다. R의 특징
1) 그래픽 처리 - 그래프와 그림, 고해상도 이미지 생산 가능
2) 데이터 처리 및 계산 능력 : 벡터, 행렬, 배열, 데이터 프레임 등 다양한 형태의 데이터 구조 지원
3) 패키지 : 사용자들이 스스로 개발하는 새로운 함수들의 모음, 확장성
라. R Studio - R 사용, 통합 개발 환경 (Integrated Development Environment, IDE)
2. 기본 사용법
가. R과 R Studio의 구성
1) R의 구성
- (1) 메뉴 바 : 다양한 기본 기능 나열
- (2) 단축 아이콘 툴바 : 자주 사용 기능의 단축 아이콘
- (3) R 콘솔 : R 명령어 입력, 결과가 출력 (한 번에 한 줄의 명령어 입력, 바로 실행) -> 핵심 작업공간
- (4) 스크립트 창 : 긴 프로그래밍 코드 작성 용이, 별도 실행, 여러 줄의 코드 한 번에 작성하고 한 줄씩 실행 가능, 별도의 스크립트 파일로 저장 가능
2) R Studio의 구성 - 여러 정보 동시 확인 가능
- (1) 스크립트 창 : 동일, 저장한 스크립트 불러오기, 여러 스크립트 동시 열어 작업
- (2) R 콘솔 : 동일, 명령어 입력하여 실행, 결과 나타남, 한 줄씩의 코드만 입력 가능
- (3) 환경 및 히스토리 : 탭으로, 환경 창에는 현재 실행중인 R 프로젝트에서 선언된 변수, 함수, 데이터셋 등의 정보 확인 가능, 히스토리 창에는 현재까지 정상적으로 실행한 명령어들 나열
- 현재 문서들의 저장 폴더, 그림, 불러온 패키지, 도움말 등을 별도의 영역에서 확인 가능
나. R 패키지 설치하기
- 상단 메뉴바의 '패키지툴' -> 패키지(를) 설치하기
- CRAN 미러사이트가 설정되어 있지 않으면 지정 창이 뜸 -> 설정되면 현재 설치할 수 있는 모든 패키지들의 목록이 알파벳 순서로 나열 // R로 설치
- R Studio) 우측 하단 'Packages' -> Install -> 패키지 이름 입력, 설치 (대소문자 구분) -> CRAN 미러사이트 지정 -> 미러사이트에서 패키지 다운로드
# 패키지 설치
install.packages("패키지 이름")
# 설치 후 패키지를 R 콘솔에 불러오기
library(패키지 이름)
# 패키지 설치 명령과 불러오는 명령어에 따옴표 사용 유무 다름
다. R 도움말 (help)
# par 함수에 대한 도움말
?par
help(par)
라. R 언어와 문법 - S, C언어와 유사
- '>' : 자동적으로 출력되는 기호, 따로 적지 X
- # 이후는 주석
1) R의 데이터 구조
(1) 벡터 : 하나의 스칼라값 또는 하나 이상의 스칼라 원소들을 갖는 단순 형태의 집합
- 원소는 숫자, 문자, 논리 연산자 등 -> 숫자만은 숫자 벡터, 문자만은 문자 벡터
- 가장 단순 형태
- 명령어 c로 선언 (c : concentration (연결))
- TRUE는 1, FALSE는 0
- 대소문자 구분 -> 논리 연산자는 반드시 대문자로
- '=', '<-' : 우측의 값을 좌측의 변수에 할당
- 벡터 + 벡터 (문자형 벡터가 포함시 결과는 문자형 벡터)
x <- c(1, 10, 24) # 문자형 벡터
y <- c("사과", "바나나") # 문자형 벡터
z = c(TRUE, FALSE, TRUE) # 논리 연산자 벡터
xy <- c(x, y) # 새로운 벡터 형성, 결과는 문자형 벡터
(2) 행렬 : m x n 형태의 직사각형 데이터 나열
- 명령어 matrix로 선언
- 첫 번째 인수 : 들어가는 데이터들을 묶은 벡터
- ncols = column 수, nrows = row 수
- 기본적으로 열을 우선 채우는 방향으로
- 행 우선 채우는 방향 : byrow=T
- 행렬+벡터, 벡터+벡터 = 행렬 : rbind (row, 행 추가), cbind(column, 열 추가)
- 단, 데이터 프레임을 서로 합치는 경우 결과는 데이터 프레임 형태
# 행렬 선언
mx = matrix(c(1,2,3,4,5), ncols=2) # 3행 2열 행렬
(3) 데이터 프레임 : 행렬과 유사한 2차원 목록 데이터 구조
- 행렬과 달리, 각 열이 서로 다른 데이터 타입을 가질 수 있음
- 데이터 크기 커져도 다루기 수월
- 명령어 data.frame : 여러 벡터를 하나의 데이터 프레임으로 합치기
- 각 행 - 하나의 관측치, 각 열 - 하나의 변수
2) 외부 데이터 불러오기
(1) CSV 파일 불러오기
- 명령어 read.table : csv파일을 데이터 프레임 형태로 불러오기
- header=T : csv 파일 첫 줄을 변수명으로 지정
- sep="," : 쉼표로 구분된 데이터 파일(csv 파일)임을 지정
- 파일 경로에 \ 대신 \\ 이용 or / 사용 가능
- 명령어 read.csv 사용 가능 : sep=","으로 구분자 명시 X
(2) txt파일 불러오기
- 명령어 read.table : txt파일을 데이터 프레임 형태로
- sep="," X -> txt 파일로 불러오기 가능
- 구분자나 형식 등을 잘 지켜야
(3) 엑셀 파일 (xls/xlsx) 불러오기
- 1) 엑셀 파일 엑셀로 실행, csv 파일로 저장, csv 파일 불러오기 방법 사용
- 2) 패키지 설치 : RODBC
> library(RODBC) # 패키지 열기
> new <- odbcConnectExcel("c:\\data\\mydata") # 엑셀파일의 경로 입력 / 확장자 생략하고 작성
> youdata <- sqlFetch(new, "Sheet1") # 엑셀파일의 워크시트(sheet) 이름 입력 / 대소문자 구분
> close(new)
3) R의 기초 함수
(1) 수열 생성하기
- rep(인수1, 인수2) : 인수1을 인수2만큼 반복하는 숫자 벡터 생성
- seq(인수1, 인수2) : 인수1부터 인수2까지 1씩 증가하는 숫자 벡터 생성
- (=) 인수1:인수2
- seq(인수1, 인수2, length=m) : 전체 수열의 개수가 m개가 되도록 자동적으로 증가하는 수열 생성
- rep(인수1:인수2, 3) : 인수1부터 인수2까지 증가하는 수열이 3번 반복
(2) 기초적인 수치 계산
- 벡터와 벡터의 사칙연산 수행 : 벡터들의 길이가 같아야
- 벡터 생성시 기본적으로 열벡터
- t(a) : 행렬 a의 전치행렬 (transpose matrix)
- %*% : 두 행렬 사이의 행렬곱
- * : 행렬에 대한 스칼라 곱
- solve(A) : 행렬 A의 역행렬 (inverse matrix)
- 기초적인 기술통계량 계산 : mean(A), var(A), sd(A), sum(A), median(A), log(A), cov(a, b), cor(a,b) / 평균, 분산, 표편, 합, 중앙값, 자연로그값, 공분산, 상관계수
- summary(a) : 벡터의 각 사분위수, 최소값, 최대값, 중앙값, 평균 / 다른 형태의 데이터 타입도 사용 가능
4) R 데이터 핸들링 - 객체지향 언어 -> 변수(객체) 불러오기, 변수 내 요소 참조 직관적, 간단
(1) 벡터형 변수
- b[n] : b벡터 내의 n번째 원소 해당 값 불러오기 / 대괄호 [] 이용
- b[-n] : n번째 원소에 해당하는 값 제외한 b벡터 불러오기
- b[ c(2,3) ] : c 명령어를 이용하여 해당 원소값 위치 나열해주기
(2) 행렬/데이터 프레임 형태의 변수
- 대괄호 [] 이용하여 참조 가능
- mydat[3,2] # 데이터 프레임의 3행 2열 값 가져오기
- mydat[ ,2] # 데이터 프레임의 2열 값 모두 가져오기
- mydat[4,] # 데이터 프레임의 4행 값 모두 가져오기
5) 반복 구문과 조건문
(1) for 반복 구문
- 괄호 안 조건 하에 i값 하나씩 증가, 중괄호 { } 안의 구문 반복 실행
> a = c()
> for (i in 1:9) {
+ a[ i ] = i * i
+ }
(2) while 반복 구문
- 괄호 안의 조건 하에서 중괄호 { } 안의 구문 반복
- 괄호 안의 조건을 만족하지 않을 때까지 반복 -> 몇 회 반복할건지 미리 정하지 X
- 조건에 해당하는 변수를 변화시켜야
> x = 1
> while ( x<5 ) {
+ x=x+1
+ print(x)
+ }
(3) if~else 조건문
- if 조건문은 특정 조건이 만족되는 경우 구문 실행
- if~else : if의 조건이 만족되지 않는 경우 else 이하의 조건을 이용해 또 다른 조건 부여
> for (i in 1:40) {
+ if (StatScore[ i ] >= 70) over70[ i ] = 1 # StatScore i번째 값이 70 이상이면 over70 i번째 값은 1
+ else over70[ i ] = 0 } # 아니면 0
6) 사용자 정의 함수
- 명령어 function : 사용자 정의 함수
- 함수 이름 = function (x, y, z) : x, y, z는 인수(argument)
> addto = function (a) { # 사용자 정의 함수 addto
+ isum = 0
+ for (i in 1:a) {
+ isum = isum + i
+ }
+ print (isum)
+ }
> addto (100) # 사용자 정의 함수 addto 사용
[1] 5050
(7) 기타 유용한 기능들
(1) paste
- 입력받은 문자열들을 하나로 붙여줌
- sep= 옵션 : 붙이고자 하는 문자열들 사이에 구분자 (separator) 삽입
- paste( number, alphabet, sep=" to the ")
(2) substr
- 주어진 문자열에서 특정 문자열을 추출하는 기능
> substr("BigDataAnalysis", 1, 4) # 1번째 글자부터 4개 글자 추출
[1] "BigD"
> country = c("Korea", "Japan", "China", "Singapore", "Russia")
> substr(country, 1, 3) # 1번째 글자부터 3개 글자씩만 추출
[1] "Kor" "Jap" "Chi" "Sin" "Rus"
(3) 자료형 데이터 구조 변환
- as.data.frame(x) : 데이터 프레임 형식으로 변환
- as.list(x) : 리스트 형식으로
- as.matrix(x) : 행렬 형식으로 (문자형 데이터로 변환)
- as.vector(x) : 벡터 형식으로
- as.factor(x) : 팩터 (factor) 형식으로
- as.integer(3.14) : 정수형 벡터(스칼라)로
- as.numeric(x) : 수치형 벡터로
- False는 0으로, TRUE는 1로
- as.character(x) : 문자형으로
- as.logical(x) : 논리값으로
- 0은 FALSE, 0이 아니면 TRUE
(4) 문자열을 날짜로 변환
- Data 객체 (날짜 데이터)
- Sys.Date() : 현재 날짜 반환
- as.Date() : 날짜 객체로 변환
- 기본 : yyyy-mm-dd, 그외 형식을 format= 옵션으로 ex) mm/dd/yy 형식은 format="%m/%d/%Y"
(5) 날짜를 문자열로 변환
- format(데이터, 포맷)
- 부분 추출 : %a (요일), %b (월), %m (두자리, 월), %d (두자리, 일), %y (두자리, 연도), %Y (네자리, 연도)
- as.character() : 같은 결과
마. R 그래픽 기능
1) 산점도 그래프
- plot(x, y)
- plot(y ~ x)
2) 산점도 행렬
- 여러 변수들에 대해 각각의 산점도를 한눈에 살펴볼 수 있음
- 명령어 pairs 사용
- main= 옵션 : 그래프 최상단에 제목 표기
- pch = 옵션 : 그래프상 찍히는 점의 모양 변경
- bg= 옵션 : 데이터의 각 변수에 따라 다른 색상 부여
3) 히스토그램과 상자그림
- hist( StatScore, prob=T) : 히스토그램
- 기본적으로 세로축 (Y축)에 도수 표기
- prob=T : 상대도수 표시
- boxplot ( StatScore ) : 상자그림
제 2절 데이터 마트
- 데이터 마트 : 데이터의 한 부분, 특정 사용자가 관심을 갖는 데이터들을 담은 비교적 작은 규모의 데이터 웨어하우스
- 데이터 웨어하우스 : 정부 기관 또는 정부 전체의 상세 데이터를 포함
- 구분 - 사용자의 기능 및 제공 범위 기준
1. R reshape를 활용한 데이터 마트 개발
- cf. 밀집화 (aggregation) : 복잡한 데이터를 더 단순, 축소 또는 재정렬 예) excel의 pivot
- reshape 패키지 : 데이터 재정렬, 모든 정보 그대로 유지, melt, cast 이용
- head(dataset명) : 6행의 데이터 표시 / head(data, 10) : 10개
- names(data) : 변수들 나열
- tolower(data) : 소문자로
- aqm = melt(data, id=c('month', 'day'), na.rm=TRUE) : id 변수들 기준으로, 나머지 각 변수를 variable이란 이름의 데이터로 만들기, 결측값 제거 옵션 TRUE
- a <- cast (melt한 data, y ~ x ~ variable) : 엑셀 피벗팅 하듯이, variable 마다
- b <- cast(melt한 data, month ~ variable, mean) : y축 month, variable은 x축으로 평균 내기
- c <- cast(aqm, month ~ .|variable, mean) : y축 month, 모든 변수에 대해 평균 구하고, 산출물 분리, 데이터마트 만들기는 불편
- margins = c('grand_row', 'grand_col') : 행 평균, 열 평균
- subset=variable=="ozone" : ozone 변수만 처리
- range : min (X1), max (X2) 동시 표시
2. sqldf를 이용한 데이터 분석
- 표준 SQL 문장 사용 가능
- sqldf("select * from iris") : limit 10 특정 10개의 행만 조회
- sqldf("select count(*) from iris where Species like 'se%' ") : se 포함 문자열 count
3. plyr
- 데이터 분리, 처리, 결합 기능
- apply 함수 기반, 데이터와 출력변수를 동시에 배열로 치환하여 처리하는 패키지
- 앞 두 개의 문자를 접두사로 : 첫 번째는 입력, 두 번쨰는 출력
- d = 데이터프레임(data.frame), a = 배열(array), l = 리스트(list
- ddply, ldply 많이 이용
- runif(생성할 난수의 개수, 최소값, 최대값)
- summarise 옵션 : 계산 결과만
- transform 옵션 : 계산에 사용된 변수도 출력
4. 데이터 테이블
- 빠른 그룹화, 순서화, 짧은 문장 지원
- 특성에 맞게 사용
- 특히 64비트 환경, RAM 충분히 많을 때 효율적
- data.table(x=c(~~~~), v=rnorm(5)) : 데이터 프레임 생성과 같음
- 차이 : 행 번호가 콜론 (:)으로 프린트
- 기존 데이터 프레임 형식의 객체를 데이터 테이블로 쉽게 변환 가능
- tables() : 이제까지 생성된 데이터 테이블의 크기, key, 용량 확인 가능
- sapply(데이터테이블, class) : 어떤 데이터 타입인지 확인
- DT[2,] : 2번째 행 조회 / DT[DT$x=="b",] : x값이 b인 데이터 조회
- setkey(DT, x) : x를 key로 지정 -> 순서가 x에 의해 ordering
- DT["b",] DT["b"] / mult = "first" 첫 번째 결과, mult= "last" 마지막 결과
- head 앞 조회, tail 뒤 조회
- dim(DF) : 행, 열 개수 조회
- R은 기본적으로 모든 자료를 비교해 찾는 벡터 검색 방식 -> 비효율적 (데이터 프레임)
- 데이터 테이블을 index 활용한 바이너리 검색 binary serach -> 빠름
- 단, 데이터 테이블을 데이터 프레임처럼 사용하면 성능은 비슷해짐
- DT[,sum(v), by x] : x 기준으로 summary / 데이터 테이블에서 by는 tapply보다 빠름
- summary 또는 grouping을 x와 y 변수 이용시 by="x,y"
제 3절 결측값 처리와 이상값 검색
1. 데이터 탐색
가. 데이터 기초 통계
- str(데이터셋) : 데이터 구조 파악
- summary(iris) : 기초통계량 - 연속형 : 4분위수, 최소값, 최대값, 중앙값, 평균 / 범주형 : 빈도수
- cov(iris[, 1:4]) : 연속형 변수, 공분산행렬
- cor(iris[,1:4}) : 연속형 변수, 상관계수행렬
2. 결측값 처리
- 시간 많이 쓰는 것 비효율적, 결측값 자체가의미 있는 경우 있음
- 여기서는 Amelia 패키지 사용
- 결측값 -> NA (not available)
- is.na(y) -> 결측값인 경우 TRUE
- mydata[mydata$v1==99, "v1"] <- NA : v1열의 99를 결측치 처리
- mean(x, na.rm=T) : 평균 산출 시 결측치 제외
- 결측값이 포함된 관측치 삭제 : complete.cases()
- 결측값 처리 방법 : 삭제 (정보 획득 어려움), 대표값 대체 (문제점 있음), 변수들 간의 관계 이용해 imputation (이 방법 이용)
- a.out <- amelia(freetrade, m = 5, ts = "year", cs = "country" ) : m=몇 개의 imputation 데이터세트, ts=시계열 정보, cs=cross-sectional 분석에 포함될 정보
- missmap(a.out) : 결측치 확인 그래프
3. 이상값 검색
- 전처리 어떻게 할지 결정, 부정사용방지 시스템 (Fraud Detection System, FDS)에서 규칙 발견하는데 사용
- a1 = 의도하지 않게 잘못 입력한 경우 -> bad data
- a2 = 의도하지 않게 입력됐으나 분석 목적에 부합되지 않아 제거해야 하는 경우 -> bad data
- a3 = 의도되지 않은 현상이지만 분석에 포함해야 하는 경우 -> 이상값
- b1 = 의도된 이상값 -> 대부분 사기 (fraud), 이상값
- ESD (Extreme Studentized Deviation) : 가장 잘 알려진 알고리즘, 평균으로부터 k*표준편차만큼 떨어져 있는 값들을 이상값으로 판단, 일반적으로 k=3, 이상값에 매우 민감
- 이상값 찾기에 너무 많은 시간 쓰면 X
- summary, 제 1사분위수와 제 3사분위수 보면서 1차 판단, 시간되면 주요 변수(dimension) 별로 플롯
- 그러나 부정사용방지 프로젝트에는 많은 시간을 할당해야
- 분석 기준 수립하여 드러나지 않은 것을 무시하고 진행해야
- 상자그림 (boxplot) 으로 식별 가능 : boxplot(x)
- outwith=boxplot(x)
- outwith$out # 이상값 프린트
- outliers 패키지 이용 - outlier() : 평균과 가장 큰 차이가 있는 값 알려줌
- 인수로 opposite=TRUE : 반대편으로 평균과 가장 큰 차이가 있는 값
- +) dim(y) = c(20,5) # 행 20 열 5의 행렬 생성
- +) outlier(y) # 각 열의 평균과 가장 차이가 많은 값을 각 열별로 출력
'기타 > ADSP' 카테고리의 다른 글
[ADSP 정리] (과목 3) 제3장 정형 데이터 마이닝 (0) | 2020.02.11 |
---|---|
[ADSP 정리] (과목 3) 제 2장 통계 분석 (0) | 2020.02.06 |
[ADSP 정리] (과목 2) 제 2장 분석 마스터 플랜 (0) | 2020.01.21 |
[ADSP 정리] (과목 2) 제 1장 - 제 4절 분석 프로젝트 관리 방안 (0) | 2020.01.21 |
[ADSP 정리] (과목 2) 제 1장 - 제 3절 분석 과제 발굴 (0) | 2020.01.21 |