1-1. 데이터 분석 기법의 이해
1. 데이터 처리 과정 | • 데이터 분석을 위해서 데이터웨어하우스(DW)나 데이터마트(DM)를 통해 분석데이터 구성 • 신규데이터나 DW에 없는 데이터는 기존 운영시스템(Legacy)에서 직접 가져오거나 운영데이터저장소(ODS)에서 정제된 데이터를 가져와서 DW의 데이터와 결합하여 활용 |
2. 시각화 기법 | • 가장 낮은 수준의 분석 but 잘 사용하면 복잡한 분석보다 더 효율적 • 대용량 데이터를 다룰 때 & 탐색적 분석을 할 때 필수 |
3. 공간 분석 | • 공간적 차원과 관련된 속성들을 시각화하는 분석 • 지도 위에 관련된 속성들을 생성하고 크기모양, 선 굵기 등을 구분하여 인사이트를 얻음 |
4. 탐색적 자료 분석 (EDA) |
• 다양한 차원과 값을 조합해가며 특이점이나 의미있는 사실 도출하여 최종 목적에 달성하는 과정 • EDA의 4가지 주제 : 저항성의 강조, 잔차 계산, 자료변수의 재표현, 그래프를 통한 현시성 |
5. 통계 분석 | • 어떤 현상을 종합적으로 한눈에 알아보기위해 일정한 체계에 따라 숫자와 표, 그림의 형태로 나타낸 것 |
6. 데이터 마이닝 | • 대용량의 자료로부터 정보를 요약하고 미래에 대한 예측을 목표로 자료에 존재하는 관계, 패턴, 규칙 등을 탐색하고 이를 모형화함으로써 이전에 알지 못한 유용한 지식을 추출 • 방법론 : 기계학습(인공신경망, 의사결정나무, 클러스터링, SVM), 패턴인식(연관규칙, 장바구니분석) |
2-1. R 소개
01. R의 탄생
- 오픈소스 프로그램
- 통계, 데이터마이닝과 그래프를 위한 언어
- 다양한 최신 통계분석과 마이닝 기능 제공(5,000개에 이르는 패키지가 수시로 업데이트)
02. 통계분석 도구의 비교
구분 | SAS | SPSS | R |
프로그램 비용 | 유료, 고가 | 유료, 고가 | 오픈소스 |
설치 용량 | 대용량 | 대용량 | 모듈화로 간단 |
다양한 모듈 지원 및 비용 | 별도구매 | 별도구매 | 오픈소스 |
최근 알고리즘 및 기술반영 | 느림 | 다소 느림 | 매우 빠름 |
학습자료 입수의 편의성 | 유료 도서 위주 | 유료 도서 위주 | 공개 논문 및 자료多 |
질의를 위한 공개 커뮤니티 | 없음 | 없음 | 매우 활발 |
03. R의 특징
- 오픈소스 프로그램
- 뛰어난 그래픽 및 성능
- 시스템 데이터 저장 방식
- 모든 운영체제에서 사용 가능(윈도우, 맥, 리눅스)
- 표준 플랫폼(S 언어 기반)
- 객체 지향언어이면서 함수형 언어
2-2. R 기초
01. 편리한 기능
- R의 작업환경 설정 : R 단축아이콘 우클릭 → 속성 → 바로가기 → 시작위치에 현재 작업위치를 입력 → 저장
- 프로그램에서 작업환경 설정 : setwd("작업디렉토리")
- 도움말 : help(함수), ?함수, RSiteSearch("함수명")
- 히스토리 : history(), savehistory(file="파일명"), loadhistory(file="파일명")
- 콘솔 청소 : Ctrl + L
02. 스크립트 사용하기
- 한줄 실행 : Ctrl + R
- 여러줄 실행 : 드래그 후 Ctrl + R
- 주석처리 : #
03. 패키지
- 패키지 : R 함수, 데이터 및 컴파일 코드의 모임
- 패키지 자동설치 : install.packages("패키지명")
- 패키지 수동설치 : install.packages("패키지명","패키지 위치")
04. 배치 실행
- 매일 실행되어야하는 프로그램을 시스템의 프로세스에서 자동으로 구동하는 작업
- 배치파일 실행 명령 : 윈도우 창에서 batch.R 실행파일이 있는 위치에서 R CMD BATCH batch.R
- Path 지정 : 내컴퓨터에 우클릭 → 속성 → 고급시스템 설정 → 환경변수 → 변수명 path 선택 → R프로그램의 실행파일의 위치를 찾아서 추가 → 저장
05. 변수 다루기
- R에서는 변수명만 선언하고 값을 할당하면 자료형태를 스스로 인식하고 선언함
- 화면에 프린트하고자 할 때, print()를 사용해도 되지만 변수 값만 표현해도 내용을 출력함
- 변수에 값을 할당할 때는 대입연산자(<-,<<-,=,->,->>)를 사용할 수 있으나 <-를 추천함
- 메모리에 불필요한 변수가 있는지 확인하기 위해서는 is()를 활용하고 삭제는 rm()을 활용함
06. 기본적인 통계량 계산
기능 | 함수 | 기능 | 함수 |
평균 | mean() | 중앙값 | median() |
표준편차 | sd() | 분산 | var() |
공분산 | cov() | 상관계수 | cor() |
07. 함수의 생성 및 활용
- R은 함수형 언어이기 때문에 프로그래머가 직접 활용 가능한 함수를 생성하여 활용 가능
- 함수는 function(매개변수1, 매개변수2, ...) 로 선언하고 표현식이 2줄 이상인 경우에는 {}로 묶어서 범위 설정
- 표현식은 변수 할당, 조건문(if문)과 반복문(for문, while문, repeat문), 전달값(return)으로 구성
08. 연산자 우선순위
연산자 우선순위 | 뜻 | 사용 예시 |
[ [[ | 인덱스 | a[1] |
$ | 요소 or 슬롯 뽑아내기 | a$coef |
^ | 지수 | 5^2 |
- + | 단항 마이너스와 플러스 부호 | -3, +5 |
: | 수열 생성 | 1:10 |
%any% | 특수 연산자 | %/% 나눗셈 몫, %%나눗셈 나머지, %*% 행렬의 곱 |
* / | 곱하기, 나누기 | 3*5, 3/5 |
+ - | 더하기, 빼기 | 3+5, 3-5 |
== != <> <= => | 비교 | 3==5 |
! | 논리 부정 | |
& | 논리 "and", 단축(short-circuit) "and" | TRUE & TURE |
| | 논리 "or", 단축(short-circuit) "or" | TRUE | TRUE |
~ | 식(formula) | lm(log(brain)~log(body),data=Animals) |
-> ->> | 대입(왼쪽을 오른쪽으로) | 3->a |
= | 대입(오른쪽을 왼쪽으로) | a=3 |
<- <<- | 대입(오른쪽을 왼쪽으로) | a<-3 |
? | 도움말 | ?lm |
09. R의 정규분포 함수
- rnorm(난수함수)
- dnorm(확률밀도함수)
- pnorm(누적분포함수)
- qnorm(분위수함수)
✔ 알파벳 r, d, p, q 가 의미하는 것 출제
2-3. 입력과 출력
01. 데이터 입력과 출력
- R에서는 텍스트 데이터 뿐만 아니라 데이터베이스와 다양한 통계프로그램에서 작성된 데이터를 불러들여서
적절한 데이터 분석 수행 가능 - 부동소수점 표현시 7자리 수가 기본 셋팅되어있음
option()함수, digit="숫자"를 지정해 자릿수 변경 가능 - 문자열을 파일로 저장 : cat("저장할 문자열", file="파일명")
- 역슬래쉬(\) 인식 불가 → 슬래쉬(/) or 이중 역슬래쉬(\\)로 파일 경로 지정
02. 외부 파일 입력과 출력
고정자리 변수 파일 | read.fwf("파일명", width=c(w1, w2, ...)) |
구분자 변수 파일 | read.table("파일명", sep="구분자") |
csv 파일 읽기 | read.csv("파일명", header=T) # 1행이 변수인 경우 : header=T |
csv 파일 출력 | write.csv(데이터 프레임, "파일명") |
03. 웹페이지(Web Page)에서 데이터 읽어오기
파일 다운로드 | read.csv("http://www.example.com/download/data.csv") |
ftp에서 파일 다운로드 | read.csv("ftp://ftp.example.com/download/data.csv") |
html에서 테이블 | readHTMLTable("url") |
2-4. 데이터 구조와 데이터 프레임
01. 데이터 구조의 정의
특징 | 벡터 | 리스트 | 데이터 프레임 |
원소 자료형 | 동질적 | 이질적 | 이질적 |
원소를 위치로 인덱싱 | 가능 | 가능 | 가능 |
인덱싱으로 여러개 원소로 구성된 하위 데이터 생성 |
가능 | 가능 | 가능 |
원소들에 이름 부여 | 가능 | 가능 | 가능 |
단일값(Scalar) | 원소가 하나인 벡터로 인식/처리 |
행렬(Matrix) | 원소가 하나인 벡터로 인식/처리 |
배열(Array) | 3원소가 하나인 벡터로 인식/처리 |
요인(Factor) | 유일값이 요인의 수준(Level)으로 구성된 벡터(범주형 변수, 집단 분류) |
데이터 프레임 | 벡터 |
iris[1,] iris[,c(1,2)] iris[1] iris["Sepal.Length"] ⇐ 변수의 이름과 값이 같이 출력 |
iris[[1]] iris$Sepal.Length ⇐ 데이터$변수 : 변수를 값으로만 출력 iris[["Sepal.Length"]] iris[,1] |
✔ 데이터 프레임, 벡터 인덱싱 구분
02. 리스트 다루기
- 리스트 원소 선택 : L[[n]], L[["name"]], L$name
03. 행렬 다루기
- 행렬 설정 : dim(vec) <- c(2, 3)
- 행과 열 이름 붙이기 : rownames(mtrx) <- c("rowname1", "rowname2", ...)
colnames(mtrx) <- c("colname1", "colname2", ...)
04. 데이터 구조 변환
변환 | 방법 | 변환 | 방법 |
벡터 → 리스트 | as.list(vec) | 행렬 → 벡터 | as.vector(mat) |
벡터 →행렬 | 1열짜리 : cbind(vec) or as.matrix(vec) 1행짜리 : rbind(vec) n x m : matrix(vec, n, m) |
행렬 → 리스트 | as.list(mat) |
백터 → 데이터 프레임 | 1열짜리 : as.data.frame(vec) 1행짜리 : as.data.frame(rbind(vec)) |
행렬 → 데이터 프레임 | as.data.frame(mat) |
리스트 → 벡터 | unlist(lst) | 데이터 프레임 → 벡터 | 1열짜리 : dfm[[1]] or dfm[,1] 1행짜리 : dfm[1,] |
리스트 → 행렬 | 1열짜리 : as.matrix(lst) 1행짜리 : as.matrix(rbind(lst)) n x m : matrix(lst, n, m) |
데이터 프레임 → 리스트 | as.list(dfm) |
리스트 → 데이터 프레임 | 목록 원소들이 데이터의 열 : as.data.frame(lst) 리스트 원소들이 데이터의 행 : rbind(obs[[1]], dbs[[2]]) |
데이터 프레임 → 행렬 | as.matrix(dfm) |
05. 집단으로 분할하기
- 벡터 : split(vec, fac) - 벡터값과 팩터값의 길이가 같아야 함
- 데이터프레임 : split(dfm, fac)
06. 함수 적용하기
- 벡터 : 행렬 : apply(mtr, 1, func), apply(mtr, 2, func)
- 리스트 : lapply(lst, func), sapply(lst, func)
- 데이터 프레임 : lapply(dfm, func), sapply(dfm, func), apply(dfm, 1or2, func)
07. 집단별로 함수 적용하기
- tapply(vec, fac, func)
- by(dfm, fac, func)
08. 병렬 벡터들과 리스트들에 함수 적용하기
- 벡터 : mapply(func, vec1, vec2, vec3, ...)
- 리스트 : mapply(func, lst1, lst2, lst3, ...)
09. 문자열 다루기
문자열 길이 | nchar("문자열") |
벡터의 길이 | length(vec) |
문자열 연결하기 | paste("단어", "문장", scalar) |
하위 문자열 추출하기 | substr("문자열", 시작번호, 끝번호) |
구분자로 문자열 추출하기 | strsplit("문자열", 구분자) |
문자열 대체하기 | sub("대상문자열", "변경문자열", s), gsub("대상문자열", "변경문자열", s) |
10. 날짜 다루기
- 문자열 → 날짜 : as.Date("2024-12-25")
as.Date("12,25,2024", format="%m/%d/%Y") - 날짜 → 문자열 : format(Sys.Date(), format ="%m/%d/%Y")
- format 인자값
R 표현 | 표시 형태 | R 표현 | 표시 형태 |
%b | 축약된 월 이름("Jan") | %B | 전체 월 이름("January") |
%d | 두 자리 숫자로 된 일("31") | %m | 두 자리 숫자로 된 월("12") |
%y | 두 자리 숫자로 된 년("24") | %Y | 네 자리 숫자로 된 년("2024") |
11. 벡터의 연산(벡터들 길이가 동일하지 않은 경우)
- 두 벡터의 원소가 개수가 다르더라도 연산과정에서 원소의 개수가 적은 쪽의 벡터는 원소의 개수가 많은 쪽의 벡터와 동일하게 원소의 개수를 맞춤
- ex) x <- c(1,2,3) y<-(1, 2, 3, 4, 5, 6)
x + y 의 값은 2 4 6 5 7 9
✔ 단답형, 객관식으로 출제된 적 있음
12. 데이터 종류
- 한가지 유형 데이터 타입만 가능한 것은 벡터, 행렬, 배열
- 리스트, 데이터프레임, 데이터테이블은 복수의 데이터타입이 가능하기때문에 복합형이라고 한다
- R에서 결측값은 Na, NaN은 수학적으로 불가한 수를 표시할 때, NULL은 데이터 유형과 자료의 길이도 0인 비어있는 값을 의미
- 난수 발생시 동일한 난수가 발생되도록 초기화하는 R함수 : set.seed()
표본 무작위 추출시 괄호 안 아라비아숫자를 넣으면 같은 숫자끼리 동일한 표본 추출
✔ 데이터 유형 특징과 함수의 의미 출제
13. 데이터 분포의 흩어짐(산포)
- 변동계수 : 표준편차 / 평균, 측정단위가 서로 다른 데이터를 비교할 때 사용
- IQR(사분위수범위) : Q3 - Q1 상자그림에서 25% 위의 값 & 75% 아래의 값의 변동 확인 할 수 있는 값
- 범위 : 최대값 - 최소값
- 왜도 : 정규분포이면 왜도는 '0', '0'보다 크면 왼쪽으로 치우친 분포
- 첨도 : 첨도가 3보다 크면 정규분포보다 뾰족한 모양
✔ 용어문제 출제, 특히 사분위수 범위와 사분위수는 서로 다른 개념
14. 대푯값의 비교(평균, 중위수, 최빈치)
✔ 중앙값과 평균값 크기를 통해 비대칭도를 추정하는 객관형 문제 출제
15. BOXPLOT(상자그림)
- 하한값(최소값) = Q1(1사분위수) - 1.5*IQR(Q3-Q1)
- 상한값(최대값) = Q3(3사분위수) + 1.5*IQR(Q3-Q1)
- boxplot 으로 이상치 검색 가능
3-1. 데이터 변경 및 요약
01. 데이터 마트
- 데이터 웨어하우스와 사용자 사이의 중간층에 위치
- 하나의 주제 또는 하나의 부서 중심의 데이터 웨어하우스
- apply 함수에 기반해 데이터와 변수를 동시에 배열로 치환 split → apply → combine 기능 제공
즉, 데이터 분할 → 함수 적용 → 재결합
✔ plyr 패키지 기능
02. 요약변수와 파생변수
요약변수 | 파생변수 | |
정의 | • 수집된 정보를 분석에 맞게 종합한 변수 • 데이터 마트에서 가장 기본적인 변수 • 많은 모델이 공통으로 사용 가능 → 재활용성 높음 |
• 사용자(분석가)가 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미를 부여한 변수 • 주관적일 수 있으므로 논리적 타당성을 갖출 필요 있음 |
예시 | • 기간별 구매 금액, 횟수, 여부 / 위클리 쇼퍼 / 상품별 구매 금액, 횟수, 여부 / 상품별 구매 순서 / 유통 채널별 구매 금액 / 단어 빈도 / 초기 행동변수 / 트랜드 변수 / 결측값과 이상값 처리 / 연속형 변수의 구간화 |
• 근무시간 구매자수 / 주 구매 매장 변수 / 주 활동 지역 변수 / 주 구매 상품 변수 / 구매상품 다양성 변수 / 선호하는 가격대 변수 / 시즌 선호 고객 변수 / 라이프 스테이지 변수 / 라이프스타일 변수 / 휴면가망변수 / 최대가치 변수 / 최적 통화시간 등 |
03. reshape 패키지
- 2개의 핵심적인 함수로 구성
melt() | 쉬운 casting을 위해 데이터를 적당한 형태로 만들어주는 함수 |
cast() | 데이터를 원하는 형태로 계산 또는 변형시켜주는 함수 |
- 변수를 조합해 변수명을 만들고 변수들을 시간, 상품 등의 차원에 결합해 다양한 요약변수와 파생변수를
쉽게 생성하여 데이터마트를 구성할 수 있게 해주는 패키지
04. sqldf 패키지
- R에서 sql 명령어를 사용가능하게 해주는 패키지
- SAS의 proc sql 과 같은 기능
- head([df]) → sqldf("select * from [df] limit 6")
- subset([df], [col] %in% c("BF", "HF")) → sqldf("select * from [df] where [col] in('BF', 'HF')")
- merge([df1], [df2]) → sqldf("select * from [df1], [df2]")
05. plyr 패키지
- apply 함수를 기반으로 데이터와 출력변수를 동시에 배열로 치환하여 처리하는 패키지
- split - apply - combine 방식으로 데이터를 분리하고 처리한 후 다시 결합하는 필수적인 데이터 처리 기능 제공
array | data frame | list | nothing | |
array | aaply | adply | alply | a_ply |
data frame | daply | ddply | dlply | d_ply |
list | laply | ldply | llply | l_ply |
n replicates | raply | rdply | rlply | r_ply |
function arguments | maply | mdply | mlply | m_ply |
06. data.table 패키지
- R에서 가장 많이 사용하는 데이터 핸들링 패키지 중 하나
- 대용량 데이터의 탐색, 연산, 병합에 유용
- 기존 data.frame 방식보다 월등히 빠른 속도
- 특정 column을 key 값으로 색인을 지정한 후 데이터 처리
- 빠른 grouping과 ordering, 짧은 문장 지원 측면에서 데이터프레임보다 유용
07. 자료의 척도
- "명목척도는 중앙값 또는 평균계산이 가능" ← 오답 보기문제로 출제
- 명목척도는 이퀄(=)만 존재. 평균 계산 불가 - "구간척도는 측정대상이 갖고있는 속성의 질을 측정" ← 오답 보기문제로 출제(속성의 질→속성의 양)
- 구간척도는 측정 대상이 가지고 있는 양을 측정. 크기나 각각의 척도간의 간격 동일 - "구간척도는 절대 영점이 존재" ← 오답 보기문제로 출제(구간척도는 절대 영점 존재X)
- 구간척도는 곱하기, 나누기 불가
- 사칙연산이 모두 가능한 것은 비율척도밖에 없음
✔ 척도의 특징 출제
3-2. 데이터 가공
01. 변수의 구간화
- 신용평가모형, 고객 세분화 등의 시스템으로 모형 적용 ⇒ 각 변수들을 구간화하여 점수를 적용하는 방식 활용
- 변수의 구간화를 위한 rule 존재햄
- 10진수 단위로 구간화, 구간을 5개로 나누는 것이 보통 / 7개 이상의 구간을 잘 만들지 않음
02. 변수 구간화의 방법
Binning | 연속형 변수를 범주형 변수로 변환하기 위해 50개 이하의 구간에 동일한 수의 데이터를 할당하여 의미를 파악하면서 구간을 축소하는 방법 |
의사결정나무 | 모형을 통해 연속형 변수를 범주형 변수로 변환하는 방법 |
3-3. 기초 분석 및 데이터 관리
01. 결측값 처리
(1) 결측값 처리
- 변수에 데이터가 비어있는 경우 NA, ., 99999999, Unknown, Not Answer 등으로 표현
- na.omit() # NA 가 있는 행 전체 삭제
- na.rm=TRUE # na.rm 은 NA 값이 있을 때 해당 값을 연산에서 제외할 것인지 결정하는데 사용
- boxplot() 시각화하기
boxplot(수치형자료 ~ 범주형자료, 데이터명) - 0/0 의 R 출력값은?
- NaN(Not a Number) : 정의되지 않거나 할 수 없는 연산으로 나타내는데 사용
(2) 단순 대치법(Single Imputation)
- Completes Analysis : 결측값의 레코드를 삭제
- 평균대치법 : 관측 및 실험을 통해 얻어진 데이터의 평균으로 대치
- 비조건부 평균 대치법 : 관측 데이터의 평균으로 대치
- 조건부 평균 대치법 : 회귀분석을 통해 데이터를 대치 - 단순 확률 대치법 : 평균대치법에서 추정량 표준 오차의 과소 추정문제를 보완한 방법
- Hot-Deck 방법
- Nearest Neighbor 방법
(3) 다중 대치법(Multiple Imputation)
- 단순 대치법을 m번 실시하여, m개의 가상적 자료를 만들어 대치하는 방법
02. R의 결측값 처리 관련 함수
complete.cases() | 데이터 내 레코드에 결측값이 있으면 FALSE, 없으면 TRUE 반환 |
is.na() | 결측값이 NA 인지의 여부를 TRUE/FALSE 로 반환 |
DMwR 패키지 : centralImputation() |
NA 값을 가운데 값(Central Value)으로 대치 (숫자-중위수, Factor-최빈값) |
DMwR 패키지 : knnImputation() |
NA 값을 k최근 이웃 분류 알고리즘을 사용하여 대치 (k개 주변 이웃까지의 거리를 고려하여 가중 평균한 값을 사용) |
Amelia 패키지 : amelia() |
time-series-cross-sectional data set(여러 국가에서 매년 측정된 자료)에서 활용 |
03. 이상값 처리
(1) 이상값
- 의도하지 않은 현상으로 입력된 값 or 의도된 극단값 → 활용 가능
- 잘못 입력된 값 or 의도하지 않은 현상으로 입력된 값이지만 분석 목적에 부합되지 않는 값 → Bad Data이므로 제거
⇒ 이상값을 꼭 제거해야 하는 것은 아니기 때문에 분석 목적이나 종류에 따라 판단
(2) 이상값의 인식
- ESD(Extreme Studentized Deviation) : 평균으로부터 3표준편차 떨어진 값
- 기하평균-2.5*표준편차 < data < 기하평균+2.5*표준편차
- Q1-1.5*IQR < data < Q3+1.5*IQR 을 벗어나는 데이터(IQR(사분위수범위) = Q3 - Q1)
✔ ESD 알고리즘의 정의 및 "이상값은 무조건 제거하고 분석한다" 오답 출제
(3) 이상값의 처리
- 절단(Trimming) : 이상값이 포함된 레코드 삭제
- 조정(Winsorizing) : 이사값을 상한 또는 하한 값으로 조정
⇒ 조정의 경우, 제거에 비해 데이터 손실율이 낮아 설명력이 높아지는 장점이 있음
'CERTIFICATION > ADsP' 카테고리의 다른 글
[D-7/핵심포인트 정리] 3과목 데이터 분석(2) (0) | 2024.02.18 |
---|---|
[D-7/핵심포인트 정리] 2과목 데이터 분석 기획 (0) | 2024.02.18 |
[D-7/핵심포인트 정리] 1과목 데이터 이해 (0) | 2024.02.17 |