데이터분석 준전문가 3과목 1, 2, 3장 요약입니다.
워드파일과 R코드도 첨부합니다 필요하신 분 사용하세요
(나눔바른고딕 폰트 사용하였습니다.
R 버젼은 3.6.1, 인코딩은 utf8입니다.)
제1장 데이터 분석 개요
제1절 데이터 분석 기법의 이해
• 데이터 처리
- 데이터 웨어하우스(DW)와 데이터 마트(DM)을 통해 분석 데이터를 구성한다.
- 신규 데이터나 DW에 없는 데이터는 기존 운영시스템(legacy)에서 가져오기 보다는 운영시스템에서 임시로 데이터를 저장하는 스테이징 영역(Staging area)에서 데이터를 전처리해서 DW, DM과 결합하여 데이터를 구성하도록 한다.
- 또는 ODS(Operational Data Store)에서 운영시스템과 유사한 정제된 데이터를 가져와서 DW에서 가져온 내용과 결합하여 활용한다.
- 최종 데이터 구조로 가공한다.
· 시뮬레이션: 모델링에 적합한 단계별 처리시간에 대한 분포를 파악할 수 있는 내용과 유형, 그에 따른 특성을 속성으로 만든다.
· 최적화: 제약값에 대한 내용과 목적 함수, 제약 조건에 들어갈 계수 값을 프로세스 별로 산출
· 분류: 분류값과 입력 변수들을 연관시켜, 인구통계, 요약변수, 파생변수 등을 산출
· 비정형 데이터나 소셜 데이터는 정형화된 패턴으로 처리해야 한다.
• 시각화(Visualization)
- 그래프 등을 통해 데이터의 분포, 특성을 파악
• 공간분석(Spatial analysis)
- 공간적 차원과 관련된 속성들을 시각화하는 분석. 지도 위에 관련 속성들을 생성하고 크기, 모양, 선 굵기 등으로 구분하여 인사이트를 얻는다.
• 탐색적 자료 분석(EDA)
- 다양한 차원과 값을 조합해가며 특이한 점이나 의미 있는 사실을 도출하고 분석의 최종 목적을 달성해가는 과정
- 데이터의 특징과 내재하는 구조적 관계를 알아내기 위한 기법들의 통칭
- 의미가 있을 것으로 판단되는 변수 집단과 아닌 집단을 1차 구분한다.
• 통계분석
- 통계: 어떤 현상을 종합적으로 한 눈에 알아보기 쉽게 일정한 체계에 따라 숫자와 표, 그림의 형태로 나타내는 것
- 기술통계(descriptive statistics): 모집단으로부터 표본을 추출하고 표본이 가지고 있는 정보를 쉽게 파악할 수 있도록 데이터를 정리하거나 요약하기 위해 하나의 숫자로 또는 그래프의 형태로 표현하는 절차
- 추측통계(inferential statistics): 모집단으로부터 추출된 표본의 표본 통계량으로부터 모집단의 특성인 모수에 관해 통게적으로 추론하는 절차
• 데이터마이닝(Data mining)
- 대용량의 자료로부터 정보를 요약하고 미래에 대한 예측을 목표로 자료에 존재하는 관계, 패턴, 규칙 등을 탐색하고 이를 모형화 함으로써 이전에 알려지지 않은 유용한 지식을 추출하는 분석
· 기계학습(machine learning): 컴퓨터가 학습할 수 있도록 알고리즘과 기술을 개발하는 분야
· 패턴인식(pattern recognition): 원자료를 이용해서 사전 지식과 패턴에서 추출된 통계 정보를 기반으로 자료 또는 패턴을 분류하는 방법
• 시뮬레이션(Simulation)
- 복잡한 실제 상황을 단순화해 컴퓨터 상의 모델로 만들어 재현하거나 변경함으로써 현상을 보다 잘 이해하고 미래의 변화에 따른 결과를 예측하는 데 사용하는 고급분석 기법
• 최적화(Optimization)
- 목적함수 값을 최대화 또는 최소화하는 것을 목표로 하는 분석 방법. 제약조건 하에서 목표값을 개선하는 방식으로 목적함수와 제약조건을 정의하여 문제를 해결
제2장 R 프로그래밍 기초
제1절 R 소개
- R은 오픈소스 프로그램으로 통계, 데이터마이닝을 위한 언어이다.
- 윈도우, 맥, 리눅스 OS에서 사용 가능하다.
- 객체 지향 언어이며 함수형 언어이다. 즉, 통계 기능뿐만 아니라 일반 프로그래밍 언어처럼 자동화하거나 새로운 함수를 생성하여 사용 가능
- 객체 지향 언어는 필요한 부분을 프로그래밍으로 골라 추출하여 활용이 가능하다.
- 함수형 언어는 깔끔하고 단축된 코드, 매우 빠른 수행 속도, 디버깅 노력 감소, 병렬 프로그래밍의 전환이 용이하다는 특징을 가진다.
• R Studio
- 메모리에 변수가 어떻게 되어있는 지와 타입이 무엇인지를 볼 수 있고 스크립트 관리와 도큐먼테이션이 편리하다.
- 스크립트용 프로그래밍으로 어렵지 않고 쉽게 자동화가 가능하다.
제2절 R 프로그래밍 기초
• 패키지(Package)
- R 함수, 데이터 및 컴파일된 코드의 모임
- 패키지 자동설치: install.packages("패키지")
- 패키지 수동설치: install.packages("패키지명", "패키지 위치")
• 스크립트로 프로그래밍 된 파일 실행
- source("파일명.R")
- pdf( ): 그래픽 출력을 pdf 파일로 지정
•배치모드
- 사용자와 인터랙션이 필요하지 않은 방식으로, 매일 실행되어야 하는 프로그램에서 프로세스를 자동화할 때 유용하다.
- 배치파일 실행 명령: batch.R 실행파일이 있는 위치에서 윈도우 창에 "R CMD BATCH batch.R" 명령어 실행
•R 명령어
· print( ): 출력 형식을 지정할 필요 없음. 한 번에 하나의 객체만 출력
· cat( ): 여러 항목을 묶어서 연결된 결과로 출력. 복합적 데이터 구조(행렬, list 등)를 출력 불가
· 대입 연산자: " <-, <<-, =, ->"
· 변수 목록보기: ls( )
· 변수 삭제하기: rm( )
· 벡터 생성하기: c( )
- 벡터의 원소 중 하나라도 문자가 있으면 모든 원소의 자료형은 문자형태로 변환
· 지역변수: 단순히 값을 대입하기만 하면 지역변수로 생성. 함수가 종료되면 지역변수는 삭제됨
· 조건부 실행문: if문
· 반복 실행문: for문, while문, repeat문
· 전역변수: "<<-"를 사용하여 전역변수를 변경할 수 있지만 추천하지 않음
· 수열: "시작값:끝값". 시작값에서 최종값까지의 연속적인 숫자 생성. seq( )함수는 간격과 결과값의 길이를 제한 가능
· 반복: rep( ) 함수는 숫자나 변수의 값들을 반복해서 생성 가능.
· 문자열 붙이기: paste( ) 함수
· 문자열 추출: substr(문자열, 시작점, 끝점) 함수는 문자열의 특정 부분을 추출 가능
· 논리값: T는 True, F는 False
· 논리연산자
== |
같다 |
!= |
같지 않다 |
<, <= |
작다, 작거나 같다 |
>, >= |
크다, 크거나 같다 |
· 벡터의 원소 선택하기: V[n], n은 원소의 자릿수, 논리형 벡터, 벡터의 이름.
· 벡터의 원소 제외하기: V[-n], n은 제외하고자 하는 원소의 자릿수
• 벡터의 연산
· [, [[: 인덱스
· $: 요소, 변수 뽑아내기
· ^ : 지수 계산. 예) 5^2 = 25
· -, +: 단항 마이너스, 플러스 부호
· ":" : 수열 생성
· %/%: 나눗셈 결과의 몫 반환
· %%: 나눗셈 결과의 나머지 반환
· %*%: 행렬 곱
· *, / : 곱하기, 나누기
· +, -: 더하기, 뻬기
· ! : 논리 부정. !T = F
· &: 논리 "and".
· | : 논리 "or".
· ~ : 식(formula)
· ->, ->>: 오른쪽 대입
· =: 오른쪽을 왼쪽으로 대입
· <-, <<-: 오른쪽을 왼쪽으로 대입
· ?: 도움말
• 기초통계 명령어
· mean(변수): 변수의 평균 산출
· sum(변수): 변수의 합계 산출
· median(변수): 변수의 중앙값 산출
· log(변수): 변수의 로그값 산출
· sd(변수): 변수의 표준편차 산출
· var(변수): 변수의 분산 산출
· cov(변수1, 변수2): 변수 간 공분산 산출
· cor(변수1, 변수2): 변수 간 상관계수 산출
· length(변수): 변수의 길이를 값으로 산출
제3절 입력과 출력
· 테이블로 된 데이터 파일 읽기 (변수 구분자 포함): read.table("파일이름", sep="구분자")
· CSV 데이터 파일 읽기(변수 구분자는 쉼표): read.csv("파일이름", header=T)
· CSV 데이터 파일로 출력(변수 구분자는 쉼표): write.csv(행렬 또는 데이터프레임, "파일이름", row.names=F)
제4절 데이터 프레임과 데이터 구조
• 벡터(Vector)
- 벡터들은 동질적이다: 한 벡터의 원소는 모두 같은 자료형을 가진다.
- 벡터는 위치로 인덱스된다: V[2]는 V벡터의 2번째 원소이다.
- 벡터는 인덱스를 통해 여러 개의 원소로 구성된 하위 벡터를 반환할 수 있다.: V[c(2, 3)]은 V 벡터의 2번째, 3번째 원소로 구성된 하위벡터
- 벡터 원소들은 이름을 가질 수 있다.
기능 |
R 코드 |
벡터에 |
v <- c(v, newItems) v[length(v)+1] <- newItems |
벡터에 |
append(vec, newvalues, after=n) |
요인 생성 |
f <- factor(v) f <- factor(v, levels) |
여러 벡터를 |
comb <- stack(list(v1=v1, v2=v2)) |
벡터 내 |
V[c(1, 3, 5, 7)] V[-c(2, 4)] |
• 리스트(List)
- 리스트는 이질적이다: 여러 자료형의 원소들이 포함될 수 있다.
- 리스트는 위치로 인덱스된다: L[[2]]는 L 리스트의 2번째 원소이다.
- 리스트에서 하위 리스트를 추출할 수 있다.: L[c(2, 3)]은 L 리스트의 2번째, 3번째 원소로 이루어진 하위 리스트
- 리스트의 원소들은 이름을 가질 수 있다.: L[["Moe"]]와 L$Moe는 둘 다 "Moe"라는 이름의 원소를 지칭한다.
기능 |
R 코드 |
리스트 생성 |
L <- list(x, y, z) L <- list(valuename1=vec, valuename2= data) |
리스트 |
L[[n]]: n번째 원소 L[c(n1, n2, … nk)]: 목록 |
이름으로 |
L[["name"]] L$name |
리스트에서 |
L[["name"]] <- NULL |
NULL 원소를 리스트에서 제거 |
L[sapply(L, is.null)] <- NULL L[is.na(L)] <- NULL |
• 행렬(Matrix)
- R에서는 차원을 가진 벡터로 인식
기능 |
R 코드 |
행렬 생성 |
matrix(데이터, 행개수, 열개수) e <- matrix(1:20, 4, 5) |
차원 |
dim(행렬) |
대각행렬 |
diag(행렬) |
전치행렬 |
t(행렬) |
역행렬 |
solve(matrix) |
행렬곱 |
행렬 %*% 행렬 |
행 이름 부여 |
rownames(행렬) <- c("행이름") |
열 이름 부여 |
colnames(행렬) <- c("열이름") |
행렬 연산 |
행렬 + 행렬, 행렬 - 행렬 행렬 + 상수, 행렬 - 상수, 행렬*상수 |
행렬에서 행, 열 선택하기 |
vec <- matrix[1, ] vec <- matrix[, 3] |
• 단일값(scalars)
- R에서는 원소가 하나인 벡터로 인식/처리
• 배열(Arrays)
- 행렬이 3차원 또는 n차원까지 확장된 형태
- 주어진 벡터에 더 많은 차원을 부여하여 생성
• 요인(Factors)
- 벡터처럼 생겼지만, R에서는 벡터에 있는 고유값(unique value)의 정보를 얻어 내는데, 이 고유값들을 요인의 수준(level)이라고 한다.
• 데이터프레임(Data frame)
- 데이터 프레임 리스트의 원소는 벡터 또는 요인이다. 벡터와 요인은 데이터 프레임의 열이다.
- 벡터와 요인들은 동일한 길이이다.
- 동일한 벡터와 요인들은 데이터프레임을 사각형으로 만든다.
- 열에는 이름이 있어야 한다.
- 각각의 열에 대해 문자형인지 수치형인지 자동적으로 구분되어 편리
- 데이터프레임은 메모리 상에서 구동된다.
R 코드 |
|
데이터프레임 생성 |
data.frame(벡터, 벡터, 벡터) |
행결합 |
rbind(dfrm1, dfrm2) newdata <- rbind(data, row) |
열결합 |
cbind(dfrm1, dfrm2) newdata <- cbind(data, col) |
데이터프레임 조회 |
dfrm[dfrm$gender="m"] dfrm[dfrm$변수1>4 & dfrm$변수 2>5, c(변수3, 변수4)]
dfrm[grep("문자", dfrm$변수1, ignore.case=T), c("변수2, 변수3")]
subset(dfrm, select=변수, subset=조건) |
데이터 선택 |
lst1[[2]], lst1[2], lst1[2,], lst1[, 2] lst1[["name"]], lst1$name lst1[c("n1", "n2", .., "nk")] |
데이터 병합 |
merge(df1, df2, by="공통열") |
열이름 조회 |
colnames(데이터프레임) |
행, 열 선택 |
subset(dfm, select=열이름) subset(dfm, select=c(열이름1, 열이름2, 열이름n)) subset(dfm, select=열이름, subset(조건)) |
이름으로 열 제거 |
subset(dfm, select=-"열이름") |
열이름 변경 |
colnames(dfm) <- newcolname |
NA 행 삭제 |
df <- na.omit(dfm) |
데이터프레임 |
cbind_dfm <- cbind(dfm1, dfm2) rbind_dfm <- rbind(dfm1, dfm2) |
• 데이터 구조 및 자료형 변환
기능 |
R 코드 |
자료형 변환 |
as.character( ) as.integer( ) |
구조 변환 |
as.data.frame( ) |
• 데이터 구조 변경
기능 |
R 코드 |
벡터 → 리스트 |
as.list(vector) |
벡터 → 행렬 |
1열짜리 행렬: cbind(vector) 또는 as.matrix(vector)
1행짜리 행렬: rbind(vector) n * m 행렬: matrix(vector, n, m) |
벡터 → |
1열짜리 데이터프레임: as.data.frame(vector)
1행짜리 데이터프레임: as.data.frame(rbind(vector)) |
리스트 → 벡터 |
unlist(list) |
리스트 → 행렬 |
1열짜리 행렬: as.matrix(list) 1행짜리 행렬: as.matrix(rbind(list)) n * m 행렬: matrix(list, n, m) |
리스트 → |
리스트 원소들이 데이터의 열이면: as.data.frame(list)
리스트 원소들이 데이터의 행이면: rbind(list[[1]], list[[2]]) |
행렬 → 벡터 |
as.vector(matrix) |
행렬 → 리스트 |
as.list(matrix) |
행렬 → |
as.data.frame(matrix) |
데이터프레임 → 벡터 |
1열짜리 데이터프레임: dfm[[1]] 또는 dfm[, 1]
1행짜리 데이터프레임: dfm[1, ] |
데이터프레임 → 리스트 |
as.list(dfm) |
데이터프레임 |
as.matrix(dfm) |
• 벡터의 기본 연산
기능 |
R 코드 |
벡터 연산 |
벡터1 + 벡터2 벡터1 - 벡터2 벡터1 * 벡터2 벡터1 ^ 벡터2 |
함수 적용 |
sapply(벡터, 연산함수) |
파일저장 |
write.csv(변수이름, "파일이름") save(변수이름, file=".RData") |
파일읽기 |
read.csv("파일이름") load("파일.R") source("파일.R") |
데이터 삭제 |
rm(변수) rm(list=ls()) |
제5절 데이터 변형
기능 |
R 코드 |
요인으로 |
v <- c(24, 23, 52) w <- c(87, 86, 92) f <- factor(c("A", "B", "C") |
벡터를 여러 |
groups <- split(v, f) groups <- split(w, f) groups <- unstack(data.frame(v, f)) |
데이터프레임을 |
sp <- split(Car93$MPG.city, Cars93$Origin) |
리스트의 각 |
lapply(결과를 리스트로 반환) list <- lapply(list, func)
sapply(결과를 벡터 또는 행렬로 반환) vec <- sapply(list, func) |
행렬에 함수 적용 |
m <- apply(mat, 1, func) m <- apply(mat, 2, func) |
데이터프레임에 |
dfm <- lapply(dfm, func) dfm <- sapply(dfm, func) dfm <- apply(dfm, func): 데이터프레임이 동질적인 경우만(모두 문자 or 숫자) 활용 가능. 데이터프레임을 행렬로 변환 후 함수 적용 |
대용량 데이터에 함수 적용 |
cors <- sapply(dfm, cor, y=targetVariable) mask <- (rank(-abs(cors)) <= 10) best.pred <- dfm[, mask] lm(targetVariable ~ bes.pred) |
집단별 함수 적용 |
tapply(vec, factor, func) |
병렬 벡터, |
mapply(factor, v1, …, vk) mapply(factor, list1, …, list k) |
• 문자열, 날짜 다루기
기능 |
R 코드 |
문자열 길이 |
nchar("단어") |
문자열 연결 |
paste("word1", "word2", sep="-") |
부분 문자열 추출 |
substr("statistics", 1, 4) |
구분자로 문자열 추출 |
strsplit(문자열, 구분자) |
하위 문자열 대체 |
sub(old, new, string) gsub(old, new, string) |
쌍별 조합 |
mat <- outer(문자열1, 문자열2, paste, sep="") |
현재 날짜 반환 |
Sys.Date( ) |
날짜 객체로 변환 |
as.Date( ) format(Sys.Date(), format=%m%d%y) |
날짜 조회 |
format(Sys.Date(), "%a") 요일 format(Sys.Date(), "%b") 월 format(Sys.Date(), "%B") 월
format(Sys.Date(), "%d") 일 format(Sys.Date(), "%m") 월 format(Sys.Date(),"%y") 연도 format(Sys.Date(), "%Y") 연도 |
날짜 일부 추출 |
d <- as.Date("2014-12-25") p <- as.POSIXlt(d) p$yday start <- as.Date("2014-12-01") end <- as.Date("2014-12-25") seq(from=start, to=end, by=1) |
제3장 데이터 마트
제1절 데이터 변경 및 요약
• 데이터 마트(Data Mart)
- 데이터 웨어하우스(DW)와 사용자 사이의 중간층에 위치한 것으로, 하나의 주제 또는 하나의 부서 중심의 데이터 웨어하우스라고 할 수 있다.
- 데이터 마트 내 대부분의 데이터는 DW로부터 복제되지만, 자체적으로 수집될 수도 있으며, 관계형 DB나 다차원 DB를 이용하여 구축한다.
- 동일한 데이터 셋을 활용할 경우 최신 분석기법들을 이용하면 분석가의 역량에서는 분석 효과가 크게 차이가 나지 않는다.
- 데이터 마트를 어떻게 구축하느냐에 따라 분석 효과는 크게 차이난다.
• 요약변수
- 수집된 정보를 분석에 맞게 종합한 변수
- 많은 모델에서 공통적으로 사용될 수 있어 재활용성이 높다.
- 합계, 횟수와 같이 간단한 구조이므로 자동화하여 상황에 맞게 또는 일반적인 자동화 프로그램으로 구축이 가능
- 연속형 변수를 범주화하여 사용해도 좋다.
• 파생변수
- 사용자가 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미를 부여한 변수이다.
- 매우 주관적일 수 있으므로 논리적 타당성을 갖추어 개발해야 한다.
- 파생변수는 특정 상황에만 유의미하지 않도록 대표성을 띄게 생성해야 한다.
• plyr을 이용한 데이터 분석
- plyr은 apply 함수에 기반해 데이터와 출력변수를 동시에 배열로 치환하여 처리하는 패키지
- split-apply-combine: 데이터를 분리하고 처리한 다음 다시 결합하는 등 필수적인 데이터 처리기능을 제공한다.
• data.table을 이용한 데이터 분석
- data.table은 큰 데이터를 탐색, 연산, 병합하는 데 아주 유용하다.
· 기존 data frame 방식보다 월등히 빠른 속도
- 특정 column을 key 값으로 색인을 지정한 후 데이터를 처리한다.
- 빠른 grouping과 ordering, 짧은 문장 지원 측면에서 데이터프레임보다 유용하다.
제2절 데이터 가공
• Data Exploration
- 데이터 분석을 위해 구성된 데이터의 상태를 파악한다. head( ), summary( )
• 변수 중요도
- 모형을 생성하여 사용된 변수의 중요도를 살피는 과정이다.
• 변수의 구간화
- 신용평가모형, 고객 세분화 등 시스템으로 모형을 적용하기 위해서는 각 변수들을 구간화해서 구간별로 점수를 적용할 수 있어야 한다.
- bining: 연속형 변수를 범주형 변수로 변형하는 방식. 각각 동일한 개수의 레코드를 50개 이하의 구간에 데이터를 할당하여 구간들을 병합하면서 구간을 줄여나가는 방식의 구간화 방법이다.
제3절 기초 분석 및 데이터 관리
• EDA(Exploratory Data Analysis)
- 데이터 분석에 앞서 전체적으로 데이터의 특징을 파악하고 데이터를 다양한 각도로 접근한다.
• 결측값(Missing value)
- 결측값 자체가 의미있는 경우도 있다.
- 결측값이나 이상값을 꼭 제거해야 하는 것은 아니기 때문에 분석의 목적이나 종류에 따라 적절한 판단이 필요
• 결측값 처리 방법(Imputation)
· 단순 대치법(Simple imputation)
- completes analysis: 결측값이 존재하는 레코드를 삭제한다
- mean imputation: 관측 또는 실험을 통해 얻어진 데이터의 평균으로 대치한다.
1) 비조건부 평균 대치법: 관측 데이터의 평균
2) 조건부 평균 대치법: 회귀분석을 활용
· single stochastic imputation: 평균 대치법에서 추정량 표준 오차의 과소 추정문제를 보완하고자 고안된 방법으로 Hot-deck, nearest-neighbour 방법 등이 있다.
· 다중 대치법(Multiple imputation)
- 단순 대치법을 한 번 적용하지 않고 m번의 대치를 통해 m개의 가상적 완전 자료를 생성
• R에서 결측값 처리
· 랜덤포레스트는 결측값이 존재할 경우, 에러 발생: randomForest 패키지의 rfImpute() 함수를 활용하여 결측값을 대치한 후 알고리즘에 적용
· complete.cases(): 데이터 내 레코드에 결측값이 있으면 FALSE, 없으면 TRUE 반환
· is.na(): 결측값이 NA인지 여부를 반환
· DMwR::centralImputation(): NA 값에 가운데 값(central value)으로 대치. 연속형 변수 - 중위값, 범주형 변수 - 최빈값
· DMwR::knnImputation(): NA 값을 knn 알고리즘을 사용하여 대치. k개 주변 이웃까지의 거리를 고려하여 가중 평균한 값을 사용
• 이상값(Outlier)
- 의도하지 않게 잘못 입력한 경우
- 의도하지 않게 입력되었으나 분석 목적에 부합되지 않아 제거해야 하는 경우
- 의도하지 않은 현상이지만 분석에 포함해야 하는 경우
- 의도된 불량(fraud)인 경우
• 이상값 탐지(detection)
- ESD(Extreme Studentized Deviation): 평균으로부터 3 표준편차 떨어진 값
- (기하평균 - 2.5 * 표준편차 < data < 기하평균 + 2.5 * 표준편차)의 범위를 벗어나는 값
- (-1.5 * IQR(Q3-Q1) < data < 1.5 * IQR)의 범위를 벗어나는 값
• 극단값 절단(trimming)
- 기하평균을 이용한 제거
- 상, 하위 5%에 해당되는 데이터 제거
• 극단값 조정(winsorizing)
- 상한값과 하한값을 벗어나는 값들을 상한, 하한값으로 바꾸어 활용하는 방법
'자격증 > ADsP' 카테고리의 다른 글
ADsP 제3과목 데이터 분석 - 5장 정형 데이터마이닝 (0) | 2020.02.18 |
---|---|
ADsP 제3과목 데이터 분석 - 4장 통계분석 1, 2, 3절 (2) | 2020.02.17 |
ADsP 제2과목 데이터 분석 기획 (0) | 2020.02.17 |
ADsP 제1과목 데이터의 이해 (0) | 2020.02.17 |
데이터분석 준전문가(ADsP) 시험 소개, 시험 일정, 응시 자격, 응시료 (0) | 2020.02.16 |