01. R 기초
1. R 언어와 문법
*주석 : # 이후에 작성
1) R의 데이터 구조
)
(출처 R in Action(23p))
2) 벡터
벡터 데이터구조는 하나의 스칼라 값, 혹은 하나 이상의 스칼라 원소를 갖는 자료구조이다.
벡터는 자바에서 사용하는 일차원 배열과 느낌이 비슷하다. 그 이유는 동일한 데이터 형태를 가진 원소들의 집합이기 때문이다.
벡터 생성하는 법 : c()
벡터의 원소 유형 | 숫자형 벡터 | 문자형 벡터 | 논리 연산자 벡터 |
---|---|---|---|
사례 | x = c(1,2,3,4) | y = c(“사과”,”망고”) | z = c(TRUE, FALSE) |
여기서 알아 두어야하는 것은,
- TRUE를 숫자로 사용하면 1, FALSE는 0이 된다는 것이다. 그리고 논리값은 항상 모두 대문자로 사용해야한다.
- 서로 다른 유형의 데이터를 섞으면 한가지 타입으로 자동 변환된다. 예를들어, 문자와 정수가 합쳐지면 정수가 문자로 처리된다.
- 벡터를 활용해서도 벡터를 만들 수 있다. ( a = c( b,c) # b,c는 벡터 )
- factor type의 벡터는 순서형과 명목형 변수를 표현하는 데이터 타입이다.
3) 행렬
행렬은 자바에서 비유하면 2차원 배열의 느낌이다.
행과 열의 수가 지정된 구조이다.
행렬 생성 함수는 matrix()를 활용한다.
생성함수의 파라미터로 생성하고자 하는 데이터를 넣고 nrow(행의 수), ncol(열의 수), byrow(FALSE이면 열을 우선으로 채움)을 설정할 수 있다.
이미 만들어진 행렬에는 dimnames()를 이용하여 행과 열 이름을 부여할 수 있다.
M <- matrix(c(1,2,3,4,5,6), ncol = 2)
M
위처럼 실행하면 3행 2열의 행렬이 생성이 되는데, byrow값이 주어지지 않았으므로 R은 항상 열을 우선으로 채우게 되어, (1,1)위치에 1 (1,2)에 4가 들어가게 됩니다. (컴퓨터가 아니라 핸드폰으로 블로그 작업을 하다보니 직접 실행한 환경은 보여드릴 수가 없습니다. 위 코드를 직접 R studio에서 입력해보시며 공부해주시길 바랍니다.)
여기서 추가로 알아야 할 것은,
- R은 항상 열을 우선으로 채우게 된다.(by row로 변경 가능하다.)
- dimnames를 활용하여 행과 열에 이름을 부여할 수 있다.
#위에서 생성한 M을 활용하는 경우 dimnames(M) = list(c(“a1”, ”a2”, “a3”), c(“b1”,”b2”)) # 3개의 행에 a로 이름 붙이고, 2개의 열에 b로 이름 붙였음
- rbind(행렬에 행을 추가)와 cbind(행렬에 열을 추가)를 활용하여 추가 가능하다.
M = matrix(c(1,2,3,4,5,6), ncol = 2 ) r1 = c(100,100) rbind(M,r1) #M의 맨 밑에 행이 추가된다. 이 때 추가된 행의 이름은 r1이 된다.
4) 데이터 프레임
행렬과 유사한 구조이지만, 가장 큰 차이점은 각 열이 서로 다른 데이터 타입을 가질 수 있다는 것이다. 따라서 데이터의 크기가 커지더라도 다루기 쉽다.
데이터 프레임은 벡터들을 합쳐서 만드는데 반드시 벡터들의 길이가 같아야 한다.
생성하는 함수는 dataframe()을 활용한다.
a1 = c(1,2,3)
b1 = c(“a”,”b”,”c”)
c1 = c(TRUE,FALSE,FALSE)
D = data.frame(first =a1,second =b1,third = c1)
5) 배열
행렬이 2차원의 배열이라면 배열은 다차원의 데이터를 의미한다.
배열을 만드는 함수는 array()이다.
array(1:12, dim = c(2,2,3))
# 1부터 12까지의 데이터를 3차원으로 넣는데, 2*2차원의 데이터가 3개 있는 구조임
6) 리스트
리스트는 사전과 같은 느낌으로 key와 value를 가진다.
list()함수를 사용한다.
X = list( name = “jin seop”, height = 178, weight = 78)
# name, height, weight는 key값으로 활용된다.
2. 외부 데이터 불러오기
# csv파일 가져오기
read.csv(“C:\\data\\data.csv”,header = T)
# 데이터가 있는 경로를 지정함
# 헤더가 있다면 header = T 옵션으로 첫줄을 변수명으로 가져올 수 있음
# txt 파일 가져오기
read.table(“C:\\data\\data.txt”,header=T, Sep=“;”)
# Sep옵션을 통하여 데이터가 어떤것으로 구분되는지 알려줌(여기서는 세미클론으로 구분되는 것을 알 수 있음)
# 엑셀 파일 불러오기
library(RODBC)
new = odbcConnectExcel(“C:/data/data”)
df = sqlFetch(new, “data”)
# RODBC패키지를 활용해 엑셀파일을 불러올 수 있지만, 사실 엑셀파일을 csv로 저장하고 csv를 가져오는 것이 더 효율적이다.
3. R의 기초 함수
1) 수열 생성하기
# 반복적으로 생성 rep
rep(1,3) # 1을 3번 생성 (결과 : 1 1 1)
# 등차수열 seq
seq(1,3) # 1부터 3까지 1씩 증가하며 생성 (결과 : 1 2 3)
seq(1,11, by=2) # 1부터 11까지 2씩 증가하며 생성 (결과 : 1 3 5 7 9 11)
seq(1,9, length = 5) # 1부터 10까지 5가지의 수로 표현 (결과 : 1 3 5 7 9)
2) 기초적인 행렬 계산
행렬들과 벡터들의 연산은 기본적으로 연산의 길이가 모두 맞아야한다.
# 벡터들의 기본 연산
a = 1:5
a + a # 2 4 6 8 10
a - a # 0 0 0 0 0
a / a # 1 1 1 1 1
# 전치행렬 생성 t() : 임의의 행렬에 대하여 행과 열을 바꾸는 행렬
a = c(2,7,3) # a는 1행 3열의 벡터
b = t(a) # b는 3행 1열의 벡터
#행렬 곱 %*% 위에서 a,b 사용
z = a%*%b
# (2) (4 14 6 )
# (2 7 3) * (7) = (14 49 21)
# (3) ( 6 21 9 )
# 역행렬 계산 : solve()
A = Matrix(1:9, nrow = 3)
A = 5*A #(스칼라곱도 가능함)
solve(A) # A의 역행렬
3) 기초적인 대푯값 및 분산 계산
# mean, var, sd 함수를 활용해 평균, 분산, 표준편차를 계산할 수 있다.
c = 1:10
mean(c) # 평균 5.5
var(c) # 분산 9.166667
sd(c) # 표준편차 3.02765
4) 기초적인 변환 및 상관계수, 공분산
# 벡터들의 합 계산 : sum
c = 1:10
sum(c) # 55
# 벡터들의 중앙 값 계산 : median
median(c) # 55
# 벡터들의 자연로그 값 계산 : log
log(c) # 자연로그 값이 계산됨
#서로다른 두 벡터에 대해 공분산 계산 : cov
a = 1:10
b = log(a)
cov(a,b) #공분산 결과값 나옴
#공분산 : a,b 변수중 a의 변수가 상승할 때 b도 상승하면 양의 값을 가지고, 반대면 음의 값을 가짐
# 서로다른 두 벡터에 대해 상관계수 계산 : cor
cor(a,b) # 상관계수가 나옴
#상관계수 -1과 1사이의 값이 나오며 두 변수의 관계에 따라 값이 나오게 됨
#summary함수를 이용하여 벡터에 대한 사분위수 최솟값, 최댓값, 중앙값 평균을 구할 수 있음
summary(a)
5) 기초통계 정리
- 변동계수 : ‘표준편차 / 평균’으로 계산하며 변동계수가 크면 편차가 큰 것이다. (주로 측정단위가 서로 다른 데이터를 비교할 때 사용한다.
- IQR(InterQuartileRange) : ‘3사분위수 - 1사분위수’로 계산되며 R에서는 IQR()함수를 쓴다.
- 최대값과 최소값을 구해주는 것으로 range() 라는 함수를 사용하면 된다.
- 사분위수 : quantile()를 활용하면 사분위수의 중심위치를 볼 수 있다.
5. R 데이터 핸들링
벡터에서 특정원소만 가져오거나, 특정원소를 제외한 나머지를 가져오는 연산이 가능하다.
자바의 배열처럼 인덱스로 접근이 가능하다는 의미인데, 자바와 다른점은 첫번째 원소의 인덱스가 0이 아닌 1로 시작한다는 것이다.
#벡터에서 인덱싱하기
a = c(“a”,”b”,”c”)
a[2] # b
a[-2] # a c
a[c(1,2)] # a b
1) 반복구문과 조건문
반복구문은 파이썬과 자바와 굉장히 유사하지만, 조건문은 조금 생소할 수있다. 조건문은 삼항연산자같은 느낌을 받는다.
# for 반복 구문(for문 괄호의 데이터를 처음부터 끝까지 반복
a = c() #a는 빈 벡터, 여기에 반복적으로 데이터 삽입
for(i in 1:10){
a[i] = i #a에 1부터 10까지 순차적으로 데이터 삽입
}
# while 반복 구문(조건이 맞으면 계속 반복)
x = 0
while(x < 5){
x = x+1
print(x)
}
# If~else 조건문
name = c( “j”, “j”, “k”)
name = ifelse(name == “j”,0,1) # name이 j이면, 0 아니면 1
name # 0 0 1
2) 사용자 정의 함수
직접 함수를 정의해서 사용할 수 있다.
sumation <- function(a){
isum = 0
for(i in a){
isum = isum + i
}
print(isum)
}
sumation(3) #6 (호출 방법)
3) 기타 유용한 기능들
#paste(입력받은 문자열을 붙여주는 역할
a = 1:4
b = c(“a”,”b”)
paste(a,b, sep = “to the”) # 1 to the a,2 to the b,1 to the a,2 to the b
#sep를 활용하여 두 문자열 사이에 붙이고 싶은 말 삽입 가능
#substr(특정 문자열만 추출)
contry = c(“korea”,”china”)
substr(contry,1,2) # contry의 1번 문자부터 2개의 문자 뽑기
# ko, ch
# as.type(자료형 데이터 구조 변환)
as.data.frame(x)
as.list(x)
as.matrix(x)
as.vector(x)
as.factor(x)
as.integer(3.14) # 3
as.numeric(“abc”) # NA 숫자형 자료가 아니므로 NA출력됨
as.logical(0.32) # TRUE
# 문자열을 날짜로 변환
as.Date(“2020/05/05”,format = “%Y/%m/%d”) # 2020-05-05
# 디폴트값으로 날짜를 yyyy-mm-dd로 생각을 하는데, format으로 원하는 형식으로 변경할 수 있다.
# 날짜 변환 format활용
format(Sys.Date()) #현재 날짜를 알 수 있음
format(Sys.Date(), format = “%m/%d/%Y”) #05/05/2020 (* 현재 날짜에 따라 다르게 나옴)
# format옵션에 준 것 처럼 데이터가 나옴
format(Sys.Date(), ‘%a’) # 요일 출력
format(Sys.Date(), ‘%b’) # 월 출력
format(Sys.Date(), ‘%y’) # 두 자리 숫자로 연도를 출력
format(Sys.Date(), ‘%b’) # 네 자리 숫자로 연도를 출력
6. R 그래픽 기능
1) 산점도 그래프
산점도는 기본이 되는 그래프로 x변수와 y변수를 평면에 점을 찍어 표현하는 것이다.
plot(x,y)를 활용해 점을 찍을 수 있다.
math = c(50,40,30,80,90)
korean = c(80,79,38,67,99)
plot(math, korean) # math가 x축, korean이 y축으로 산점도 그래프 생성됨
2) 산점도 행렬
여러 변수에 대해 각각의 산점도를 한번에 판단할 수 있도록 구현된 기능이다.
#pairs를 활용하여 산점도를 그릴 수 있음. 데이터는 붓꽃 데이터 활용
pairs(iris[1:4], pch = 21, bg = c(“red”, “green3”, “blue”)[unclass(iris$species)])
# iris[1:4] : 붓꽃의 4가지 변수에 대하여 처리
# main옵션을 주면 최 상단에 제목을 붙일 수 있음
# pch는 점의 모양을 의미함
# bg는 species에 따른 색상을 의미함
(출처 - 데이터분석 준전문가 한 권으로 끝내기 부록_황소걸음)
3) 히스토그램과 상자그림
hist와 boxplot을 활용하여 히스토그램과 상자그림을 그릴 수 있다.
height = c(174,164,177,167,188)
hist(height)
boxplot(heigh)
#추가 옵션 기능
hist(height, break = 3) # 계급 구간의 수 설정(막대 수)
hist(height, probability = T) # 상대도수 히스토그램으로 보여줌
hist(height, probability = T, main = “키” ylim = c(0,0.04)) # 그래프 제목(main)과 y축 범위 설정(ylim) 가능
02. 데이터 마트
데이터 마트는 데이터의 일 부분을 의미하며, 특정 사용자가 관심을 갖는 데이터를 담은 비교적 작은 규모의 데이터 웨어하우스이다.
1. R reshape2의 melt(), cast() 함수
함수 | 정의 |
---|---|
melt() | 여러 변수로 구성된 데이터를 데이터 id, variable, value 형태로 재구성하는 함수 |
melt(data,id.vars,na.rm=FALSE | id.vars : 식별하는 칼럼, na.rm = FALSE : NA행을 포함시킬지의 여부 |
cast() | melt()된 데이터를 다시 여러 칼럼으로 변환하는 것 |
2. reshape 활용
library(reshape)
library(reshape2)
data(airquality)
names(airquality) # 변수명을 알아내는 방법
names(airquality) = tolower(names(airquality)) # 소문자로 변수명을 반환한다.
# melt 활용
T = melt(airquality, id = c(“month”,”day”), na.rm = TRUE) # month와 day를 key로 활용, na는 삭제
# month day variable value
# 1 5 1 ozone 41.0
# 2 5 2 ozone 36.0
# 3 5 3 ozone 12.0
# melt결과 month와 day를 key값으로 하여 변수명이 variable 그리고 그 값이 value
# cast 활용
# melt된 값을 시각화하기에 좋음
cast(T, day~month~variable) # 행을 day, 열을 month로 각 변수들을 새롭게 배열
# 각 변수별로 Matrix가 생성됨, x축과 y축 교차지점이 value
cast(T,day~month~variable,mean) # 각 변수들의 월별 평균을 알 수 있음
# 월별로 각 변수들의 평균이 나옴
cast(T, month~variablee, mean, margins = c(“grand_row”, “grand_col”))
# margin 관련 옵션으로, 행과 열에 대한 합계를 산출 가능함
cast(T, day~month, subset = variable == “ozone”)
# subset 기능을 활용해 특정 변수만 처리하도록 함.
cast(T,month~variable, range)
#range는 min(_X1)과 max(_X2)의 값을 추가해 보여준다.
melt와 cast를 하는 이유는 데이터 시각화에 있다.
3. sqldf를 이용한 데이터 분석
sqldf는 sql문을 활용할 줄 아는 사용자가 쉽게 데이터에 접근할 수 있도록 해준다.
library(sqldf)
data(iris)
sqldf(“select * from iris”) # 질의문 입력 모든 붓꽃 데이터 보여줌
sqldf(“select * from iris limit 10”) # 데이터의 특정 행수만 조회할 때(head와 동일)
4. plyr
ply()함수는 앞에 두개의 문자를 접두사로 가지는데, 첫 번째 문자는 입력하는 데이터의 형태이고 두 번째 문자는 출력하는 데이터의 형태이다. 예를 들면 ddply는 데이터 프레임을 입력받아서 가공하고 데이터프레임으로 출력해주는 것이다.
Plyr 패키지는 데이터를 분리(split)하고 분할된 데이터에 특정 함수를 적용(apply)하고 결과를 재결합(combine) 처리하는 함수를 제공한다.
set.seed(1) # 난수를 생성할 때마다 같은 값의 난수 생성
d <- data.frame(year = rep(2012:2014, each = 6, count = round(runif(9,0,20)))
# 2012~2014년으로 각각 6개씩 만들고, count라는 난수를 생성하는 runif(생성할 난수의 수, 최대값, 최소값) 0에서 20사이의 정수(round)를 9개 저장한다.
# ddply를 활용해 sd(표준편차), mean(평균)의 비율인 cv(변동계수)를 구하는 기능 구현
# ddply()는 데이터프레임을 분할하고 함수를 적용한 뒤 결과를 데이터프레임으로 반환한다.
# adply()는 행 또는 칼럼 단위로 함수를 적용하지만 ddply()는 variables에 나열한 칼럼에 따라 데이터를 나눈 뒤 함수를 적용한다.
# ddply(data, variables, func) variable은 분리할 변수, func는 적용할 함수, 그 결과는 재 결합된 결과임
library(plyr)
ddply(d, “year”,
function(x){
mean.count = mean(x$count) #평균
sd.count = sd(x$count) #표준편차
cv = sd.count / mean.count (변동계수 : 클수록 편차가 큼)
data.frame(cv.count = cv)
})
# 실행 결과
# year cv.count
# 2012 0.5985621
# 2013 0.4382254
# 2014 0.3978489
# summarise() : 데이터의 요약정보를 새로운 변수에 만드는 함수
ddply(d, .(year),summarise,mean.count = mean(count))
# year mean.count
# 2012 10.5
# 2013 11.3333
# 2014 14.16667
#transform() : 연산 결과를 데이터 프레임의 새로운 칼럼에 저장하는 함수
ddply(d, .(year), transform, total.count = sum(count))
# year count total.count
# 2012 5 63
# 2012 7 63
# 2012 11 63 ...
#transform은 기존 데이터에 칼럼을 하나 더 붙여주는 것이고, summarize는 데이터의 요약정보를 새로운 변수를 생성하는 것이다.
5. 데이터 테이블
데이터 프레임과 유사하지만 그룹화,순서화, 짧은 문장 지원 측면 및 데이터 분석 속도에서 데이터프레임보다 연산속도가 빠르다.
# 데이터 테이블 생성하는 법
library(data.table)
DT = data.table(x = c(“b”, “b”, “b”, “a”, “a”), v = rnorm(5)) # data.table()로 생성
CARS <- as.data.table(cars) # 데이터 프레임인 cars를 as를 활용해 변경
# 모든 데이터 테이블을 보는 법
tables() #모든 테이블보기
# NAME NROW NCOL MB COLS KEY
#[1] CARS 50 2 1 speed,dist
#[2] DT 5 2 1 x,v
# Total 2MB
# 데이터프레임과 데이터테이블의 차이
sapply(CARS.class) # class 데이터 타입 확인
# speed dist
# “numeric” “numeric”
# key를 사용한 빠른 데이터 접근
# setkey(데이터 테이블, 정렬할 컬럼) # x 컬럼에 key 지정
setkey(DT, x) # tables() 확인하면 KEY에 x가 들어간것을 확인가능
DT[“b”] # key가 “b”인 모든 데이터
# x v
# 1: b 1.709116
# 2: b 1.338267
# 3: b 0.607690
# 데이터프레임과 달리 데이터 테이블은 클론으로 행을 표시함
DT[“b”, mult = “first”] # b가 들어간 첫 번째 결과
# x v
#1: b 1.709116
DT[“b”, mult = “last”] # b가 들어간 마지막 결과
# x v
#1: b 0.60769
03. 결측값 처리와 이상값 검색
1. 결측치 대치법
- 결측치가 없는 데이터에 대해서만 학습한다. 결측치가 있으면 날려버린다.
- 결측치를 해당 데이터의 평균으로 처리한다.
- 단순확률을 활용해 대치한다. NearestNeighbour과 같은 방법을 사용한다.
- 다중대치법을 활용한다.
2. 데이터 기초 통계
data(iris) # iris 데이터 불러옴
str(iris) # 데이터의 구조를 파악할 수 있음
summary(iris) #iris의 기초 통계량을 확인할 수 있음
cov(iris[,1:4]) # 각 변수 간의 공분산을 확인가능
# iris[,1:4] iris data 중 1~4변수 추출
# 공분산 값이 양수면 증가할 때 함께 증가하는 형태
cor(iris[,1:4]) # 각 변수 간의 상관계수를 확인
# -1과 1사이의 값으로 1에 가까우면 강한 양의 상관관계
# -1에 가까우면 강한 음의 상관관계
3. 결측치 처리
# 결측 여부 확인하는 법
y = c(1,2,3, NA)
is.na(y) # 결측값의 여부를 확인함
# FALSE FALSE FALSE TRUE
# 결측처리를 하는 법
data(iris)
iris[iris$Petal.Width == 0.2, “Petal.Width”] = NA #결측처리 하는 법
# 결측치 제거를 위해 해당 결측값 제외하는 법
x = c(1,2,NA,3)
mean(x) #NA (결측치가 있어서 평균 내면 항상 NA)
mean(x,na.rm = T) # 2 (na.rm으로 결측치 제거)
# 해당 행이 완벽히 입력되어있는지 알아내는 방법 (reshape활용)
library(reshape)
data(french_fries)
french_fries[!complete.cases(french_fries),] # 완벽하지 않은 경우만 들어있게 됨
#complete.cases() 는 완벽이 입력되어있으면 TRUE임
# Amelia 패키지를 이용한 결측값 처리법(삭제 안시키는 법)
library(Amelia)
data(freetrade)
a.out <- amelia(freetrade, m = 5, ts = “year”, cs = “country”)
# m은 imputation 데이터셋의 수이다.
freetrade$tariff <- a.out$ imputations[[5]]$tariff
#imputation 값을 데이터셋에 적용함 ( 결측치 해결 )
4. 이상값 검색
이상값 검색은 분석에서 전처리를 어떻게 할지를 결정할 때와 부정사용방지 시스템에서 규칙을 발견하는데 사용할 수 있다.
이상값은 아래와 같이 4가지 경우가 있다.
- 이상값은 의도하지 않게 잘못 입력된 경우
- 분석 목적에 부합되지 않아 제거해야하는 경우
- 의도되지 않은 현상이지만 분석에 포함해야하는 경우
- 의도된 이상값
#outlier 패키지 이용
library(outlier)
set.seed(1234)
y = rnorm(100) #100개의 데이터 생성
outlier(y) # 평균과 가장 차이가 많이 나는 값을 출력함
# [1] 2.548991
outlier(y,opposite = TRUE) # 반대 방향으로 가장 차이가 많이 나는 값을 출력
# [1] -2.345698
dim(y) = c(20,5) # 행 20, 열 5 행렬으로 생성
outlier(y) # 각 열의 평균과 가장 차이가 많은 값을 열별로 출력
# [1] 2.415835 1.102298 1.647817 2.548991 2.121117
outlier(y, opposite = TRUE) # 각 열 별로 반대방향으로 열 평균과 가장 차이가 많은 값 출력
왜도(skew), 첨도(kurtisis) 확인하기
x = rchisq(100,5)
# 자유도가 5인 카이제곱분포에서 난수 100개를 생성(오른쪽으로 기울어진 그래프 = 왼쪽으로 치우친 그래프)
library(psych)
describe(x)
# skew와 kurtosiis 확인 가능
왜도(skew) 는 비대칭도라고도 부르며, 그래프가 좌측 혹은 우측으로 치우쳐진 정도를 의미합니다. 중앙값이 평균보다 크다면( 왼쪽으로 데이터가 밀집된 경우) 0보다 큰 양수가 되며 그 반대는 음수가 됩니다.
좌우가 대칭이라면 왜도는 0이 됩니다.
첨도(kurtosis)는 자료의 분포가 뾰족한 정도를 의미합니다. 자료가 정규분포를 따른다면(종모양) 첨도는 0이 됩니다. 하지만, 정규분포보다 뾰족하다면 양수값을 가지고 평평하다면 음수값을 가집니다.
이들은 보통 변동계수와 함께 확인합니다. 변동계수는 평균에서 어느정도 퍼져있는지에 대한 정보입니다. 다만, 변동계수는 표준편차를 평균으로 나눈 결과이므로 평균이 0에 매우 가까운 수라면 값이 매우 커져 활용에 어려워질 수 있습니다.
포스팅을 마치며
어린이날을 너무 알차게 보낸것 같습니다.. 무려 5시간을 공부했네요.. 통계학적 지식이 상당히 부족해서 이번에 자격증을 공부하며 기초부터 탄탄히 다지려고 찾아가며 공부하다보니 오래 걸렸네요. 내일부터는 다시 일과가 시작되네요.. 지금까지 1일 1 포스팅을 했으나, 내일부터는 조금 힘들것 같습니다. 아무튼 다들 화이팅하세요! 감사합니다.
추후 추가사항
최근 서울에서 다시 코로나가 크게 유행을 하게되며, 시험을 보기에 제한이 될 수도 있다는 생각이 들어 이번 시험을 취소하게 되었습니다. 코로나가 잠식되거나 잠잠해질때 다시 공부하여 시험을 보기로 결정하여서, 추가적으로 남은 2개의 챕터는 따로 기재를 하지 않았습니다. 죄송합니다.
코로나와 훈련이 겹쳐 시험이 계속 미루어져 21년도에 도전을 하여 취득할 수 있었습니다. 모두 화이팅해서 자격증 취득하시기 바랍니다!(21.07.16)
'Etc > Adsp' 카테고리의 다른 글
ADsP 시험준비 2과목 데이터 분석 기획(2) (0) | 2021.07.16 |
---|---|
ADsP 시험준비 2과목 데이터 분석 기획(1) (0) | 2021.07.16 |
ADsP 시험준비 1과목 데이터의 이해(3) (0) | 2021.07.16 |
ADsP 시험준비 1과목 데이터의 이해(2) (0) | 2021.07.16 |
ADsP 시험준비 1과목 데이터의 이해(1) (0) | 2021.07.16 |