Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

데이터 분석 공부

[ADSP 정리] (과목 3) 제1장 R 기초와 데이터 마트 본문

기타/ADSP

[ADSP 정리] (과목 3) 제1장 R 기초와 데이터 마트

data-data-science 2020. 2. 5. 16:58

과목 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) # 각 열의 평균과 가장 차이가 많은 값을 각 열별로 출력