분류 전체보기

1. R 패키지 설치

2018. 12. 28. 16:56

패키지 설치방법

  • R의 함수와 R명령어의 집합
  • 데이터가 포함되는 경우도 있다.
  • 패키지당 1MB 정도
  • 온라인 저장소 (Cran)에서 다운로드 가능 , 2017. 11 기준 11700개 이상 존재
    - 설치시 dependency : 다른 패키지도 필요하다는 의미, 자동 설치 됨. 만약 자동 설치 안된다면, 해당 패키지를 cran에서 찾아서 설치해야한다.
  • 인터넷이 안되는 경우 ( 망 분리, 큰 패키지 등)
    install.package( 패키지명, repo = NULL, type = "source")
    - cran.r-project.org > Packages > name정렬 > OS에 따라서 설치
    - 인터넷되서 설치한 PC에서 > (windows)문서 > R> win-library > 패키지폴더 > USB


패키지 종류별 설치

setwd('c:/users/is2js/R_da/')

#### 패키지 설치 ####


install.packages("beepr")
# 사용 / 따옴표를 안쓰면 에러 날 수 도 있다.(변수와 중복)
library("beepr")
# 다른 사용(library()안쓰고 바로 사용)
beepr::beep(sound=1)

beep(sound=1)
beep(sound=2)

for(n in 1:10){
   beep(sound = n)
   Sys.sleep(2)
}

#### 유용한 패키지 ####


# 1. dplyr : 파이프라인 관련 join, merge 등 함수 제공
# - Left join / right join 등 sql 비슷한 작업. 기본 R 함수는 어렵고 헤깔림
# - sqldf 패키지를 쓰면 sql과 동일하게 사용가능하기도 함.
# 2. reshape2 : melt <-> decast 함수 지원 -> 통계/시각화 전 피벗팅
# - melt(그림참고) / 반대는 decast
image
# 3. data.table : f.read() f.write() -> read.csv 등과 비교해서 5~10배 이상 빠르다. / data.frame을 발전시킨 형태의 data.table을 제공
# 4. ggplot2, ggmap, ggvis : 데이터 시각화
# 5. lattice : 데이터 시각화
# 6. plotly : 데이터 시각화를 반응형으로
# 7. 기계학습용 : CART, e1071, C50, DMwR
# 8. 시계열 데이터 처리 : lubridate(필수*), xtm
# 9. 텍스트 처리 : splitstackshape(cSplit이 가장 빠름*), KoNLP(한국자연처 처리)


#### 재미난 패키지 ####


# beepr, coinmarketcapr, Rfacebook : API 사용 -> 크롤링으로 대신하는 경우가 많음

Sanger sequecing

  • 1977년 생거 등에 의해 개발된 염기서열 분석법
  • 1980년 생거가 2번째 노벨상을 받게 됨

일반적인 template DNA의 염기서열 분석

3'-ATGACTGAGC-5'와 같은 template DNA 서열 분석에서는
d{A,C,G,T}TP (dNTP)만 넣어주면 DNA polymerase는 이에 상보적인 DNA를 합성하게 된다

DNA polymerase가 상보적인 염기를 합성하려면, 소위 primer라는 DNA 조각이 결합된 이중나선 부위가 존재하여야 그 뒤의 단일가닥 부위에 상보적인 합성이 가능하다 (참고 그림). 우리가 시퀀싱하고자 하는 DNA는 일반적으로 그 서열을 모르는데, 어떻게 primer를 합성하여 반응에 사용할 수 있을까?


 

  • Single stranded ( 5말단 -> 3말단 )가 있다고 가정하고, T C A A C G - 순으로 염기서열이 있다고 가정하자.
    4배수 Primer(프라이머)를 연구자가 미리 넣어주면, 5말단->3말단순으로 (A-G-T-C에 대해) T-C-A-G 상보적으로 결합되면서, 해당 부분이 Double stranded가 된다.

  • 이 때, DNA 폴리머라아제는 나머지 Single Stranded 부분을 -> Double Stranded가 되도록 리액션 하게 된다.
    여기에 필요한 것이 dATP, dTTP, dCTP, dGTP이며, 이것을 따로 넣어줘야한다.
    - (T에 대해) dATP를 잘라서 A를 붙히고 , (A에 대해) dTTP를 잘라서 T를 붙히고... 이런식으로 Single-stranded를 메꾸도록 한다.


Sanger Sequencing 기본 원리

dNTP  + 소량의 dd{A,C,G,T}TP (ddNTP)를 섞어주게 되면, DNA polymerase가 template DNA에 상보적인 서열을 합성해 나가다가, 중간중간에 ddNTP가 끼어 들어간 DNA 분자가 합성되게 된다. 그러한 분자는 더 이상 길어지지 않고 합성이 중단되게 된다. 이들 ddNTP에는 각각을 구별할 수 있는 형광물질이 결합되어 있기에, 새로이 합성된 DNA 들의 마지막 염기 종류에 따라 서로 다른 형광을 띄게 된다. 여기에서 주목할 것은, 합성된 DNA 분자들은 모든 자리에서 4개 중의 어느 하나의 ddNTP가 끼어 들어간 것이기에, 정확히 한 염기씩 길이의 차이가 나는 것들이다. 이들은 전기영동법에 의해 크기 순으로 나열할 수 있으며, 레이저 빛을 각 전기영동 밴드에 쬐면, 형광물질에 따라 특이적인 파장의 빛을 발하게 되며, 이를 순서대로 읽으면 원래 염기서열(3'-ATGACTGAGC-5')과 상보적인 5'-TACTGACTCG-3'을 얻게 된다.

  • DNA polymerase가 상보염기를 형성해 나가다가 ddNTP 4개 중 하나인 ddTTP가 섞여 들어가게 되면, 합성을 멈추게 된다.
    정상적인 dTTP가 들어올 때는 합성이 진행하다가 ddT가 합성되어버릴 경우 끝에 ddT로 멈추게 된다.
  • 이 때, 멈추게 되는 간격은 정확히 한 염기의 길이씩 차이가 날 수밖에 없다.
  • 종류는 3'-ATGACTGAGC-5' 에 대해서 총 10가지이다. size는 모두 제각각의 unique한 size를 갖는다.(끝나는 자리가 T,A,C,G 모두 다르므로)
    - T로 멈추는 경우 3 ( 1bp, 4bp, 8bp)
    - A로 멈추는 경우 2 ( 2bp, 6bp)
    - C로 멈추는 경우 3 ( 3bp, 7bp, 9bp)
    - G로 멈추는 경우 2 ( 5bp, 10bp)
  • 이 10가지를 한 well-plates에 넣은 다음(모두 음전하를 띄고있음), 전기영동으로 (양전하로 땡겨주면) 양전하쪽으로 이동시킨다.
    - 제일 가벼운 1bp가 가장 가까이 이동하고 size대로 순서대로 거리를 이루게 된다.
  • 이 때, ddT, ddA, ddG, ddC는 서로 다른 형광물질을 입혀넣았기 때문에, T로 끝나는 것들은 서로 같게 된다. 4가지 서로 다른 색을 가진다.
  • 여기에 Photomultiplier로 불빛을 켜서 비추면, 가장 가까운 곳에 1bp의 T가 보일 것이다.
    - 1배수 T(1bp - 빨간색), 2배수 A(2bp - 보라색) 등등으로 sequencing이 이루어진다.


ddNTP와 dNTP의 차이(과제)

  • ddNTP와 dNTP의 차이는 무엇인지. 왜 ddNTP합성을 멈추는 chain-terminating 반응을 하는지에 대해서 알아보자.
  • ddNTP는 어느 정도를 섞어줘야할지 비율도 알아보자.
  • 생거는 형광물질을 사용하지 않았다고 한다. 방사선 동위원소를 이용하여, 전기영동하면 나타나는 방사선을 X-선 필름에 감광시켜 위치를 알아냈다. 하지만 4가지 모두 동일한 방사선을 나타내기 때문에 어떻게 이것을 구분했을까?
  • Primer가 있어야 DNA sequencing이 가능한데, 우리가 sequencing하고 싶은 Single-stranded DNA는 순서를 모르니까 sequencing 하는 것인데 Primer를 어떻게 구성할지도 난감하다.


미국 인간게놈 연구소에서 만든 애니메이션 -  How to Sequence a Genome - part 6, 7, 8, 9 (강추!)

https://www.genome.gov/25019885/

https://www.genome.gov/edkit/flash/section6.html

https://www.genome.gov/edkit/flash/section7.html

https://www.genome.gov/edkit/flash/section8.html

https://www.genome.gov/edkit/flash/section9.html

  • 2001년 논문으로 publishing된 인간게놈 프로젝트 in Nature , 동시에 교육자료도 제공했음.
  • Part 6
  • Part 7
    image

    - 한 base pair씩 차이나는 DNA 분자가 얻어지고 종류에 따라 다른 색의 DNA들이 500-800base 정도가 얻어진다.image
    - 얻어진 products들은 위와 같은 자동화 기기에 삽입된다.

  • Part 8
    image
    image
    image
    image
    - 전기영동으로 분리되는 과정이다.
    - DNA들은 (-)전하를 띄고 있기 때문에, 전기영동 장치의 하단에 있는 (+)전하로 짧은 순으로 끌려간다.

  • Part 9
    image
    image
    image
    image
    image

    - (+)전하쪽으로 빠져나올 때, Laser를 쏘면, 각 종류별 형광물질이 나오게 되면서, 기본적인 Sanger Sequencing이 완성된다.

    image

    - 연속적으로 500번 ~ 800번의 전기영동을 통해서 최종적으로는 시퀀싱기계에 기록되어, 인간의 Single sequncing이 reveal된다.

    - 아래는 560번 정도의 생거 시퀀싱 결과의 크로마토그램

    - 각 자리별로 가장 높은 것이 명확하게 들어나고, 색도 명확하다(검은색 G, 초록색 A..) 이 하나하나가 DNA 분자이다.
    - 가장 앞과, 가장 나중에 뭉개지고 색이 겹쳐지는 경향이 있긴하다.

Base call quality score

위의 560base 전기영동 결과 중 색이나 peark가 겹친 부분이 있다. 이것을 확률적으로 나타내는 것base call quality score라고 한다.
예를 들어, T라고 얘기했는데, error율도 같이 이야기 해주는 것이다.

1% 이상의 error가 연속적으로 나타난다면 잘라내서 버리는 작업을 Trimming이라고 하며, 생거 시퀀싱을 한번 할 경우 560base 중 500base 정도가 남는다고 한다.


  • 뭉개지는 앞부분도 제거를 해야할까?
  • 1%이하의 에러율이 너무 작은 수로 표시되므로, Phred 라는 염기서열분석 소트트웨어를 통해  자체적으로 변환시킨 값인 phred score를 출력하게 되는데,
    Phred score :  [ 에러율 ] 에 로그를 취한 뒤 -10을 곱한 것
    - 1% error  : ( 0.01 -> Log ( ) -> -2  * -10 = 20 phred score
    - 0.1% error :  ? phred score 30
    - ?  error : 40 phred score ( -10^-4 )
  • my) 1% = 0.01 -> 20   /  0.1% -> 0.001 -> 30  /  0.01% -> 0.0001 -> 40

생각하기

  • 생거 시퀀싱은 자동화가 되므로, 처음에는 agarose gel plate에다가 여러 개의 샘플을 동시에 전기영동 분리 하였다. ( plate 당 32개 정도)
  • 이후에는 모세관을 이용한 capillary 전기영동을 함.  96개의 유리관을 사용. ( 유리관 1개당 1 sample)
    - 이러한 과정을 로버트 팔을 이용해서 자동화 하였음.(ABI 37000)
    - 하루에 10개 plate를 시퀀싱하였으니 10 * 96 well(유리관)   ->  10 * 384 well( 유리관) 개의 DNA sequencing  개의  sample
    - sample당 500 염기씩 읽음.
    - 500(DNA) * 384 well(sample) * 10 (하루당)   개의  염기 시퀀싱
    - 인간의 30억개 염기  -->  1번 읽는데 3000일 소요, /  평균 10번 읽어야하므로 30000일 소요
    - 기계 100대를 동시에 --> 300일 소요

반복문

setwd('c:/users/is2js/R_da/')

#### for() 반복문 ####
for( number in 1:3){
   print(number) # for()문 속에는 진행상황을 알기 위해 print()함수를 자주 쓴다.
   Sys.sleep(2) # 각 반복문마다 2초 sleep시키는 방법
}

for( number in c(1, 3, 5)){
   print(number)
   Sys.sleep(0.2)
}

for( number in letters[1:5]){
   print(number)
   Sys.sleep(0.2)
}

for( number in 1:5){
   print(number^2)   # R에서 제곱은 ^2로 나타낼 수 있다.
   Sys.sleep(0.2)
}

# 특정한 df에서 특정칼럼을 생성할 때, (다른 칼럼의 값 이용해서..) for문 사용
df = data.frame(aa = letters[1:4],
                 bb = 1:4 )
df
for( num in 1:4){
   df[num, "new"] = num^2
}
# 보통은 dataframe의 각 행을 for문을 이용하여 돌때는 1:nrow(df)를 사용한다.
for( num in 1:nrow(df)){
   df[num, "new"] = num^2
}
df


조건문


#### 조건문 if()함수 ####
n = 4
if (n != 4){
   print("n은 4가 아니다.")
}else{
   print( "n은 4다" )
}

#  df에서 if와 for를 같이 사용
df
for ( n in 1:nrow(df) ){ # df의 row를 n으로 받기
   if( n>=3 ){ # 3행이상부터는 bb컬럼을 출력
     print(df[n, "bb"])
   }else{
     print("아직 3행까지 못갔어요!")
   }
}


#### 조건 연산자 ####
# my)행 인덱싱을 $을 이용해서 하위구조인 칼럼에 조건을 담
df
df[df$bb >= 3, ]
df[df$aa == "b", ]
df[df$aa != "b", ]
# 2개 이상의 조건에서는 항상 괄호 () & () 를 입력해주는 습관을 가지자.
df[ (df$bb>1) & (df$bb<4) ,] # OR 는 |   / and는 &



산출물 저장 및 기타


#### 기타 연산자#####
# 할당 연산자
# <<- 화살표 머리가 2개 인 할당자 : 함수내에서 활용 / try catch문에서나 활용...
# 산술 연산자
# %/% : 몫
# %% : 나머지
# 제곱 : ^(hat) or  **

setwd('c:/users/is2js/R_da/')
aws = read.delim("data/AWS_sample.txt",
                  sep = "#",
                  stringsAsFactors = FALSE)
head(aws)


#### 기본 그래프 ####
# 실제로는 ggplot2를 쓰기때문에,, 나중엔 안쓴다.
plot(aws$TA) # 칼럼을 $으로 인덱싱해서 그린다.
plot(1:10, 1:10) # 일반 숫자는 x축, y축을 넣어준다.
plot(x = 1:10, y = 1:10)
plot(x = 1:10, y = 1:10, col="red") # 색상
plot(x = 1:10, y = 1:10, col="red", type = "b") # 선 스타일

#### 데이터 저장 ####
# 원하는 wd를 먼저 설정해주자.
# row.names = FALSE옵션을 주지 않으면, 행번호 칼럼이 저장되어 버린다.
# 필요없는 컬럼이 저장할때마다 생겨버림

# 1. 작업폴더 설정
setwd('c:/users/is2js/R_da/')
# 2. 데이터 읽어오기
aws = read.delim("data/AWS_sample.txt",
                  sep = "#",
                  stringsAsFactors = F)
# 3. csv로 저장하기
write.csv(aws, "aws_test.csv", row.names = F )
# 4. 저장한 csv 읽어보기
read.csv("aws_test.csv", stringsAsFactors = F)


#### 스크립트 저장하기 ####
# ctrl + s ->choose encoding에서 UTF-8 -> 전체 적용
# 이미 설정한 사람은 Tools > global options > code > saving > UTF-8 > 전체 적용
# cp949, 1ckr은 윈도우만 사용하는 인코딩이므로 사용 ㄴㄴ


#### plot save ####
# Export -> selection

setwd('c:/users/is2js/R_da/')

#### 기술 통계량 ####

# 숫자 생성해보기

number = c(1:1000) # c()은 안붙혀도 상관없음 연속이라...
number = 1:1000

# 시드 -> sample(data, n) : 데이터 내에서 n개의 난수 생성
# ****블록지정 set.seed()와 sample(data,n)을 같이 해서 실행해야 난수의 재현성 유지*****
set.seed(50) # 재현성을 위해난수여도 시드 만들어주기
number = sample(number, 30) # 30개 뽑기

# 정렬하기 :
# 1. order(변수)는 원래 숫자 자리에 order만 나타내줌
# 2. 변수[ order(변수) ] 해주면, 오름차순으로 정렬됨.

number[order(number)]
number[order(-number)] # 안의 변수에 -를 붙혀주면 역순으로 나온다.
number = number[order(number)]
number

# 최소값, 최대값, 평균
min(number)
max(number)
mean(number)

#### 중앙값 ####
# 1. 숫자가 홀수개인 경우 - 가운데 위치한 수
# 2. 숫자가 짝수개인 경우 - 가운데 2수의 평균
median(number)

length(number) # 30개
number[15] # 30/2     = 15
number[16] #30/2 + 1  = 16

#### 최빈값 ####
# 주어진 숫자중에 가장 빈번하게 나타나는 값
# R의 기본함수 중에는 사용자정의 함수를 정의해서 사용해야한다.
# 사용자 정의함수여야 가장 속도가 빠르다.

mode = function(x){
   ux = unique(x)
   ux[which.max(tabulate(match(x,ux)))]
}
mode(c(1, 2, 1, 1, 2, 3))
mode(number)

# table에 씌워서, dataframe처럼 해주면, 빈도수가 출력되기도 한다.
# 그러나 속도가 많이 느려진다.
as.data.frame(table(c(1, 2, 1, 1, 2, 3)))


# 분산(Variance)과 표준편차(Standard deviation )
# 분산 : 평균과의 차이= 편차   를 제곱한 뒤, 개수로 나눈 것
# 표준편차 : 분산에 루트를 씌워 데이터가 어느정도 분포하고 있는지 보는 것

var(c(1, 3, 5, 2, 7, 10))
sd(c(1, 3, 5, 2, 7, 10))


#### 기술 통계량(결측 처리) ####
# 결측치를 포함한 평균 계산 - mean()함수에 인자로 na.rm = TRUE 인자를 넣어준다.!
mean(c(1:3, NA, 23)) # 기본적으로 mean을 하면 NA로 출력된다!
mean(c(1:3, NA, 23), na.rm = TRUE) # NA와 갯수를 제외(NA를 romove)시키고 나머지로 평균 구함
mean(c(1:3, "사과", 23)) # 문자열을 포함한 경우, na.rm으로 안된다. 아예 빼고 계산해야한다.

image

병합 및 요약

getwd()
setwd('c:/users/is2js/R_da/')
aws = read.delim('data/AWS_sample.txt',
                  sep='#',
                  stringsAsFactors = FALSE)
head(aws)

#### 데이터 병합 ####
# bind함수를 이용한 data.frame을 묶어준다.
# cbind()-columns으로서 가로로 붙혀주기와 rbind()-row로서 세로로 붙혀주기가 있다.
aaa = aws[1:3,2:4]
bbb = aws[9:11,2:4]

#cbind()
cbind(aaa, bbb)
#rbind()
rbind(aaa, bbb, aaa, bbb, aaa, bbb)

#### 유의사항! ####
# row의 수가 다를 경우 cbind()시 에러가 난다.! -> data.frame은 사각형으로 구성되어야 함.!
ccc = aws[1:3, 2:4]
ddd = aws[9:10, 2:4]
cbind(ccc, ddd)

# col의 수가 다를 경우 rbind()시 에러가 난다. -> 사각형 안만들어짐
# 사실 rbind()는  컬럼의 이름과 속성도 똑같아야 함

ccc = aws[1:3, 2:4]
ddd = aws[9:11, 2:3]
rbind(ccc, ddd)


#### table()함수를 이용한 표를 만들어 데이터 요약 ####
# my) 요약은 칼럼추출($, [a:b] 요약정보를 의미하는 것 같다.
aws = read.delim('data/AWS_sample.txt',
                  sep='#',
                  stringsAsFactors = FALSE)
# 1. 데이터프레임 aws에서 $을 이용해 하위 컬럼을 요약한다.
# 2. 요약 정보는, 해당 칼럼의 데이터값 별로 원소의 갯수를 알려주는데, 모양도 안이쁘고 한글이 들어가면 엉망이 된다. 이 때, 패키지 등이 필요하다.
# 3. 아래와 같이 하나의 칼럼만 요약한다면, 칼럼형식으로 원소의 갯수를 알려줌
table(aws$AWS_ID)
# 4. 2차원 이상이 되면, 앞의 정보는 row로 / 뒤의 정보는 칼럼으로 가서 원소의 개수를 알려준다.
table(aws$AWS_ID, aws$X.)

# 5. 요약정보에 칼럼명을 명시하여 요약하고 싶다면,
#    $를 이용한 추출이 아니라 벡터연산[my)인덱싱]으로 칼럼을 추출한 뒤 table()로 감싸주자.
table( aws[,c("AWS_ID", "X.")])

aws[2500:3100, "X."] = "modified"
table(aws$AWS_ID, aws$X.)

# 원소의 개수가 아닌, 비율로 보고 싶다면!
# prop.table()함수로 table을 감싸준다.
prop.table( table(aws$AWS_ID) )


# 비율을 퍼센트로 바꾸고 싶다면, * 100씩을 해주면 된다.
prop.table( table(aws$AWS_ID) ) * 100


# 퍼센트(%)를 붙혀주고 싶다면, paste0() 안에  (table(), "%")를 인자로 준다.
# - paste0는 글자를 간격없이 붙히는 함수인데, 대신 칼럼정보가 사라진다.
paste0( prop.table( table(aws$AWS_ID) ) * 100, "%")



문자열 처리


#### 실습 데이터 만들어보기 ####
sample = data.frame(aa = c("abc_sdfsdf",
                            "abc_KKdfsfsfs",
                            "ccd"),
                     bb = 1:3,
                     stringsAsFactors = FALSE)
sample


# 문자 개수 세기 - nchar()
nchar(sample[1,1])
nchar(sample[2,1])

# 특정 문자 위치(row) 확인 - which() 함수 /  칼럼인덱싱 == "찾고싶은문자"
which(sample[,1] == "ccd")

# 대소문자 변환 - toupper(), tolower()
toupper(sample[1,1])
tolower(sample[2,1])

# 문자열 분리 - library("splitstackshape")로 패키지 불러온 뒤 -> cSplit()함수를쓴다.
# 1. 패키지 설치
install.packages("splitstackshape")
# 2. 패키지 불러오기 - library()
library("splitstackshape")
# 3. 패키지내 cSplit()함수 사용하기 - S만 대문자 조심!
cSplit(sample, splitCols = "aa", sep="_") #구분자가 없다면 NA가 분리됨

# 문자열 결합 - paste0() : 공간없이 / paste() : 중간에 끼워줘서 합치기
# 각 행별로, 컬럼1과 컬럼2의 문자열을 <공백없이> 결합한다.
paste0(sample[,1], sample[,2])
# 각 행별로, 컬럼1과 컬럼2의 문자열을 <구분자를 끼워서> 결합한다.
paste(sample[,1], sample[,2], sep="@@") #sep인자가 결합하는 것이 됨.
paste(sample[,1], sample[,2],sample[,1], sep="@@@")

# 특정 문자추출 - substr(,,)
substr(sample[,1], start = 1, stop = 2) # 첫글자부터 2번째 글자까지
substr(sample[,1], 2, 4)

6. data 추출 -> 치환 & 삽입

2018. 12. 27. 16:58

데이터 추출

aws = read.delim('data/AWS_sample.txt',
                  sep='#',
                  stringsAsFactors = FALSE)
#### $를 사용한(객체%칼럼명) 하위구조 데이터 추출 ####
# 1. 컬럼명 확인
colnames(aws)
# 2. 특정칼럼 추출 - 1000개까지 추출하고 나머지는 생략된다.
aws$TA


# 벡터연산을 사용한 하위구조 중간데이터 추출
#### row 추출 ####
# 객체[ 원하는 row, ]
aws[2, ]
aws["2",] # 잘안씀.

# 연속적인 데이터 추출
aws[3:10, ]

# c()을 활용한 이산(각각의) 데이터 추출
aws[ c(2, 135, 3:10) , ]


#### columns 추출 ####
aws[ , 3]
aws[ , 3:4]
aws[ , c(1, 3)]
aws[ , c("Wind")]
aws[ , c("AWS_ID", "Wind")] #순서를 바꿔주면, 칼럼의 순서를 바꿀 수 있다.

#### 행X열 동시 추출 ####
aws[1, 3]
aws["1", "TA"]
aws[2:5, c("AWS_ID", "TA")]


데이터 추출 실습

#### 데이터 추출 실습 #####
# $는 list같은 상위구조에서 하위구조 접근시 편하다.
aws$AWS_ID # $뒤에는 자동완성으로 하면 편함
aws$Wind

# 벡터연산 - 먼저 대괄호[]안에 콤마(,)를 찍어놓고 연산해서 실수안하게 하자.
aws[3,]
aws[15, ]
aws[1:6,]
aws[c(2, 6, 7, 8),]
aws[c(10:5, 2),] # 연속적으로 할때는, 역순이어두 된다.

aws[,3]
aws[,c(2, 4)]
aws[,"Wind"]

aws[1, 3]
aws[1:3, 2] #칼럼이 1개일 경우는 <1차원의 벡터>형식으로 나오고***
aws[1, 2:3] #칼럼이 2개 이상일 경우 칼럼명과 함께<2차원의 벡터 data.frame>형태로 나온다.
aws[1:3, 2:3]
aws[c(3, 4, 1, 2),c(3, 4, 1, 2)] # 벡터연산으로 칼럼의 순서를 바꿀 수 있다!


데이터 치환 및 삽입 바로 실습

aws = read.delim('data/AWS_sample.txt',
                  sep='#',
                  stringsAsFactors = FALSE)
# 데이터 치환은 추출한 것에 대입만 해주면 된다.
aws[1,] = 1
head(aws, 3)

aws[c(1, 3, 6),] = 9999
head(aws)

# 데이터 삽입은 추출할 때, 새로운 행이나 칼럼 번호를 입력해주면 된다.
# 하지만 새로운 숫자로 생성한 칼럼명은 자동으로 v6, v7 식으로 표기된다.
# 새로운 칼럼명""을 입력해주면 되는데, 기존 칼럼명과 같을 경우덮어쓴다.

aws[ , 6] = "안녕?" # 숫자로 새로운 칼럼을 삽입시, 마지막 칼럼 다음 숫자이어야 에러가 안난다.
head(aws)

aws[ , ncol(aws) + 1] = "hi!" # 숫자로 마지막칼럼의 다음 칼럼을 추가해줄 때는 ncol(aws)+1을 이용하면 쉽다.
head(aws)

aws[,"칼럼추가!"] = "asdf" # 문자로 새로운 칼럼명을 입력해 추가하면 자동으로 다음으로 추가해준다.
head(aws)

#### 칼럼명 바꿔주기 ####
# 컬럼명 확인함수 colnames()를 이용하여 [6] 인덱싱해서 바꾸는 것이다.
colnames(aws)[6] # 1차원 벡터인 colnames()에서 [6]번째 추출
colnames(aws)[6] = "col_6"
head(aws)
colnames(aws)[7:8] = c("7번째", "8번째") # 여러 칼럼을 바꿀 때, 대입시는 c()를 활용해서 각각 넣어준다.

AWS_sample.txt

iris.csv

데이터 입력

# 데이터 입력
read.csv("파일명") # csv 전용
read.delim("파일명", sep=",") # 구분자 선택해서 아무거나
read.table("파일명", sep=",") # 구분자 선택해서 아무거나
# tsv일 경우 read.table로
read.table("파일명", sep="\t")
# 특정 구분자일 경우 - 쉼표(,)나 탭(\t)이 아닐 경우
read.delim("파일명", sep="구분자")

# 예제 기상청 파일 - R은 통계프로그램이라 자동으로 factor(통계처리요소)로 변환하는데, 그것을 방지하는 코드도 넣어준다.
aws = read.delim("AWS_sample.txt", sep="#", stringsAsFactors = FALSE)
head(aws) # 처음 6개 자료 읽어오기


데이터 입력 실습

#실습 시작
# 1. working directory 확인
getwd()
# 2. iris 데이터(따로 다운받음)  - getwd()자리에 있는 경우,
dd = read.csv("iris.csv", stringsAsFactors = FALSE) # dd라는 객체로 받아야, environment창에 뜬다.
# 3. 불러온 후, 작업하기
head(dd)

# 1. working directory 변경 - \가 아닌 / 로 경로 설정되어야함.
setwd('C:/Users/is2js/R_da/data/')
# 2. 디렉토리내 파일확인
list.files()

# 3. AWS(기상청 데이터)
# 윈도우 폴더에서 경로를 복사한 경우, \(|)을 ---> / 로 바꿔줘야함.
aa = read.delim("C:/Users/is2js/R_da/data/AWS_sample.txt",
                 sep="#",
                 stringsAsFactors = FALSE)
# 4. 확인하기
head(aa)

aa = read.delim("AWS_sample.txt",
                 sep="#",
                 stringsAsFactors = FALSE)
head(aa)



데이터 확인

# 작업영역 설정 다시해주기
getwd()
setwd("C:/Users/is2js/R_da/")
aa = read.delim('data/AWS_sample.txt',
                 sep='#',
                 stringsAsFactors = FALSE)
head(aa)

# 데이터 확인
head(aa) # 첨부터 6개 확인
head(aa, 10)
tail(aa) # 마지막 6개 확인
tail(aa, 10)

# 전체 구조 확인 - str() - string(X) structure
str(aa) # 스트럭쳐 / 각칼럼의 이름 : 속성 , 몇개의 데이터를 보여줌

# 요약정보 - summary()
# 숫자는 최소값, 제 1/3 4분위수(제 25/75 백분위수), 중앙값(제 50 백분위 수), 평균값, 최대값
# 문자열은 속성 / 결측치를 알려준다.
summary(aa)

# 객체 구조 및 변수별 기술통계 확인
nrow(aa) # 행의 개수
ncol(aa) # 열의 개수
dim(aa) # 차원(행 X 열) 개수 한꺼번에 확인
colnames(aa) # 컬럼 명만 확인

View(dd) # 창으로 깔끔하게 확인


데이터 확인 실습

TIP ) 주석표시를 4개(좌우 or 우) 넣으면 책갈피처럼 이용 가능하다.
image
image


#### 데이터 확인 실습 ####
# 1. 데이터 입력 및 확인
aws = read.delim('data/AWS_sample.txt',
                 sep='#',
                 stringsAsFactors = FALSE)
head(aws, 3)
head( x = aws, n = 5)

tail(aws, 1)

# R에서는 print함수를 for문 돌 때, 몇번째 루프 도는지 확인할 때 쓴다.

# 객체 구조 및 변수별 기술통계 확인
str(aws)
summary(aws) # AWS_ID 기기 번호 / TM 시간 / TA 기온 / wind 풍속 / x는 의미x


nrow(aws)
ncol(aws)
dim(aws)

# 데이터를 5887번째로 집어넣고 싶다면 위의 함수들을 이용한다.
# 제일 마지막 끼워넣을 때 / 제일 마지막 지울 때 / 등등에 이용한다

nrow(aws) + 1


colnames(aws)


TIP) 콘솔창의 메뉴 빈칸( terminal메뉴 옆 빈칸)을 더블클릭하면, script창을 덮어서 쭈욱 올라가서 보기 편해진다.
다시 더블클릭하면 내려온다.

image
image

image

  • 1990년 인간 게놈프로젝트 시작

  • 2000년 초안 발표

  • 2003년 게놈 서열의 완성을 선언

  • 프로젝트 초반 가장 노력을 쏟은 분야는 1977년 개발된 Sanger sequencing 방법을 발전시킨 고속 시퀀싱 개발
    - 1990년대 말, 많은 량의 시퀀스를 자동화 시퀀싱하는 기기가 개발 -> 1-2년만에 대부분 시퀀싱 데이터 생산 완료
    - 하루 밤 사이 1,000개 정도의 DNA조각을 500bp씩 자동으로 시퀀싱 ( ~500bp/day)
    - 아래의 plate에 dna조각을 넣고 자동화 기기에 장착해주면, 자동적으로 시퀀싱 함(96-well-plate, 한 well 속 dna 당 500bp)
    * bp = genome size인 base pair
    96 well plate에 대한 이미지 검색결과
    - 인간의 게놈은 30억개의 염기쌍 --> 이것을 10배수로 읽는 것이 프로젝트의 목표(시퀀스는 에러가 많기 때문에 10번 반복해서 에러 제거)
    - 30억 * 10 = 300억 bp 를 당시 1개의 시퀀싱 기기를 이용할 경우, 60000일 소요... 200대가 사용되었다면 300일 1년 걸림(20개 센터 200대 사용)
    - 당시 직접비만 계산시 = 기기값(대당 5억 * 200대 = 1000억) + 인건비 + 시약비  = 약 1000억원 이상 소요
    - 그 외 게놈 서열 조립 및 분석 등의 생명정보학적 비용은 제외

  • 2003년 인간 게놈 프로젝트의 완성을 선언한 미국보건원 산하 인간게놈연구소(NIH)는 이후 새로운 기술을 개발하는 프로젝트를 공모함.
    - $1000 정도로 인간 1명의 인간게놈 시퀀싱이 가능한 기술 개발이 목표
    - 그 공모의 결과는 아래와 같다 (10팀 정도가 참여했다고 함)
    image
    - Megabase(100만 염기쌍)의 DNA sequence 비용 변화
    2003년  $10,000 의 비용이 들던 것이
    2008년 인텔 회장 고든 무어의 무어의법칙(18개월마다 2배 it기술 발달)을 파괴하여 100배 정도 좋아짐/
    - 1년 사이에 비용이 1/100로 줄어들었는데 이것은 생거시퀀싱과 차별화되는 차세대 기술이라 하여
    - Next Generation Sequencing(NGS)라고 불리운다.

  • DNA 시퀀싱 비용이 저렴해짐으로 인해, 연구자들은 더 많은 샘플들을 확보함(연구 비용을 줄이진 않음)
    - 새로운 종, 유전자 발현량 측정에도 시퀀싱 기법을 활용함
    image
    - 노란색 : NGS가 나타나기 전에 DNA시퀀싱 비용(bp/$) -> 19개월마다 2배 발달
    - 주황색 : NGS -> 5개월마다 2배 발달
    - 파란색 : hard disk 저장량 (mb/$) -> 14개월마다 2배 발달

  • NGS기술의 단점은 생거 시퀀스보다 정확도가 떨어지는 것이다.
    - 이를 해결하기 위해, 반복/배수를 높혀서 실험한다.(싱거는 10배수를 줬다면 그 배 이상으로..)
      결과적으로 반복이 많아졌으므로 샘플데이터 대용량이다. -> 데이터 복사 / 전송도 오래 걸린다.
    - 정확도를 떨어지는 것을 보완하기 위해서, 더 복잡한 분석 알고리즘을 필요로 한다.
      따라서 많은량의 데이터를 고급IT기술로 무장한 생명정보학 전문가의 수요가 더욱 높아지고 있다.
    - 고 메모리 / 병렬컴퓨터인 클러스터를 필요로 함.
      운영체제도 윈도우즈 계열보다 파이프라인 구성이 자유로인 리눅스 계열이 사용되고 있다.

'한의대 생활 > └ NGS 와 CDM' 카테고리의 다른 글

3. CDM ( 공통 데이터 모델 정리 )  (0) 2019.01.08
2. Sanger sequencing의 기본원리  (0) 2018.12.28

4. R의 기본 문법

2018. 12. 26. 21:59

산술 함수

# 삼각함수
sin( pi/3 )
cos( pi/3 )
tan(pi/3)

# 어림하기
abs(3)
abs(-3)

round(24.51)
round(24.49)      # 반올림에 자리수 지정하기 default 0
round(24.51, -1) # -1이면 1의 자리에서 실시
round(24.51, 1)  #  1이면 소수점 둘째자리에서 반올림
floor(24.51)      # 내림(바닥)
ceiling(24.51)    # 올림(천장)

# 팩토리얼
factorial(2)
factorial(4)
factorial(6)

image


기본 연산자

# 산술연산자
30 + 50
30 - 50
30 * 20
30 / 50

# 논리연산자
10 > 20
10 < 20
10 >= 20
10 <= 20
10 >= 10
10 == 10
"감자" == "고구마"
"감자" != "고구마"


기초 연산

# 특수기호(:)를 사용한 숫자 생성
1:5 # 파이선 인덱싱과 다르게 0 이 아닌 1부터 시작, 마지막 인덱싱 5도 포함시킴
1.5:5  # 소수점이 붙어서 생성하면, 소수점으로 1씩 증가
1.5:6
1.5:1.5

# seq()함수를 사용한 숫자 생성
seq(from = 1, to = 3)
seq(from = 1, to = 3, by = 0.5 )
seq(from = 1, to = 3, by = 1.2 )
seq(from = 1, to = 3, length.out = 8 ) # 구간 8등분

# rep()함수를 사용한 숫자 생성
rep(1:3, 5)
rep("안녕", 5)


실습

sin(pi/3)

pi
letters
LETTERS

round(123.123)
round(123.123, -3) # 백의 자리에서 반올림-> 천의 자리가 없으므로 반올림시 0으로 떨어져버림
round(123.123, -2) # 십의 자리에서 반올림
round(123.123, -1) # 일의 자리에서 반올림

floor(34.51)
floor(34.51*10)/10 # 내림의 자리수를 정할 때는, 10을 나누거나 곱하기를 미리 준다음 회복시키면 된다.
floor(34.51/10)*10


TRUE
true # 트루/폴스는 대문자여야한다.
FALSE

TRUE + FALSE # 연산시에는 1 + 0 이 된다.
TRUE + FALSE - TRUE
TRUE + FALSE - TRUE - TRUE


1:5
1:100



rep(1:3, 5)
rep(1:3, times = 5) # 한 뭉치씩 5번 반복
rep(1:3, each = 5) # each 인자는 원소별로 5번 반복!

3. R의 기본 자료형

2018. 12. 26. 21:16

인프런 김승옥님의 R 기초강의를 정리해놓은 포스터입니다!


기본 자료형 유형

  1. 수치형(numeric) : 숫자 -  정수 or 실수
  2. 문자형(character) : 수치형 제외 대부분(띄워쓰기 포함)
  3. 팩터형(factor) : 명목/ 순서형 변수
  4. 논리형(logical) : TRUE or FALSE( R에서는 모두 대문자로 써야 인식된다 )


특수 데이터 유형

  1. NA : 결측값(missing value) - 관측/측정에 실패한 값..시간은 있는데 값이 있어야하는데 비어버린 경우
  2. NULL : 데이터형과 길이가 0으로 비어있음
  3. NaN : 수학적으로 정의 불가한 수
  4. Inf : 무한값(infinite)


객체 속성

image

  1. 벡터 : c() 명령어로 생성하는 1차원 배열 & 한 속성(문자형)으로 알아서 통일 된다.
    -  나머지 3개의 기본자료형

  2. 데이터 프레임 : data.frame() 명령어로 생성 & 속성이 다른 칼럼들을 만듬
    - 보통 읽어들이는 자료가 데이터 프레임으로 받는다.

  3. 행렬 : matrix() 2차원 백테 & 하나의 속성임 &  행렬 연산이 사용 가능하다.

  4. 리스트 : list()  벡터, 데이터프레임, 행렬 모든 형식을 묶는 것

다른 언어에서는 list가 많이 쓰지만, R에서는 데이터프레이나 행렬을 많이 handling한다.


R 실습



벡터


image


데이터프레임


image


행렬


image


리스트


image

R studio에서 코드 실행방법

  1. Script에서 코드를 입력후 실행방법 : 커서 코드의 처음이나 끝에 위치 시킨 뒤, [ Ctrl + Enter ]
  2. Console에서 코드 입력후 Enter


R studio 기본적인 설정

글자 크기 조정

  1. Tools > Global options
    image

  2. Apperance > Edit Font size
    image
    imageimage


code 글자에 대한 조정도 마찬가지로

  1. Tools > global options > Appearance > Code > Display 를 아래와 같이 선택
    - margin과 whitespace 옵션은 껐음.
  2. image


자주 쓰는 단축키

  1. Ctrl + L : 콘솔 창 지우기(spyder랑 동일하네)
  2. Ctrl + 1, 2 : Script창 <--> Console창 왔다갔다하기
  3. Ctrl + shift + n : 새 스크립트 창
  4. Ctrl + shift + o : 주석(####) 메뉴 불러오기
  5. Ctrl + shift + c : 한 줄 주석처리
  6. 그외 단축키 보기 : Help > keyboard shortcuts help( Alt + Shift + K)
    image


R

  1. 통계학자가 디자인하고 만들어진 언어/소프트웨어
  2. 오픈소스라 무료
  3. 활용 분야 : 다양한 자료들을 가져올 수 있음.
    imageimage


R 과  R Studio 설치

R은 메인 엔진이고, R studio는 R의 옷을 입혀주는 격이다. 사용은 R studio만 할 것이다.

  1. https://cran.r-project.org/
    image

  2. base 선택
    image

  3. 다운로드
    image

  4. 설치
    image

  5. www.R studio.com 접속 > 다운로드 > free
    image
    image

  6. R studio 설치
    image




R의 장점

  1. 진입장벽이 낮은 언어
    - 단, 1부터 시작하는 언어라서 헤깔릴 수 있다.
  2. 시각화, 시스템화를 위한 각종, 편의 도구 제공
    - ggplot2라는 시각화 패키지가 대박
  3. 오픈소스라 무료
  4. 방대한 양의 Package를 통하여 수많은 기능 추가 가능


R의 단점

  1. In-Memory 기술 이용( 대용량 데이터 처리시 불편)
  2. 크롤링 등 웹 관련 작업 불편
  3. 상용프로그램 대비 GUI관련 기능 미흡


R studio

  1. IDE로서 R 코딩을 쉽게 해준다
  2. R이 사전에 설치되어있어야 가능하다

R studio의 구성

image
image
image

dataframe에서 slice 개념

깃허브 3. 은행 이탈고객 예측

깃허브 4. 인디안 당뇨병 예측

[ 0:3 ]  -> 0, 1, 2 : 0번 칼럼부터 3전 까지
[ 3:13 ] -> 3번(0부터니까 4번째) 칼럼부터 13번 전 까지
* 시작은 0번 칼럼부터 세서, 앞쪽은 포함 뒤쪽은 불포함이다. 수학에서 ●-----○ 개념

개수는 쉽게 13-3 = 10으로 계산하면 되지만,
처음부터 세려면 index 3은 0부터 시작하므로, 4번째 칼럼부터다.

*쉽게하기 (my)

인덱싱의 앞부분 : 뒷부분 중 앞부분만 해석 / 뒷부분은 그냥 읽기
[a:b] =========>  읽을 때는(+1) (a+1)번째 칼럼부터 b번째 칼럼까지
c번째 칼럼부터 d번째 칼럼까지 작성할 때는 (-1) ====> [c-1:d]

image
- 첫번째 칼럼처럼 보이는 index는 칼럼이 아니다!
- 0번 칼럼은 RowNumber 13번 칼럼인 Exited는 불포함!



sklearn.preprocessing.py에 있는 Label Encoder와 OneHot Encoder 클래스

DataFrame에 values값이 문자열일 때, 연산이 불가능하므로

  1. 딕셔너리를 이용해서 mapping(0, 1, 2)해도 되지만
  2. sklearn이라는 라이브러리를 이용하여 Label Encoder클래스를 이용하면, 특정칼럼의 값을 자동으로 0, 1, 2, 3으로 배정해준다.
    - 하지만 이럴경우, 0과 1,2,3은 크다작다의 대소관계가 생겨버려 연산시 잘못된 계산을 할 수 있다.
    - LabelEncoder( 문자열 칼럼-> 숫자)  ====>  OneHotEncoder( 숫자 -> 각 행당 1을 한개만 가지는 2진 matrix)  ====> to.array()
  3. OneHot Encoder는  대소관계를 가지는 숫자들 0, 1, 2에 대해서, 각 행당 1개만 1로 주고 나머지는 0으로 주어 절대적인 크기가 1로서 다 같도록 만든다.
    - 2진 코드로 만들어 진다.
    image
    - 따로 이것을 .toarray()를 통해 array로 만들어줘야 딥러닝 모델에 넣을 수 있는 데이터가 된다.


train_test_split

이전에는 from sklearn.cross_validation import train_test_split 를 통해서 train/test -> train/valid 를 나누었지만
- trainX, testX, trainY, testY = train_test_split(X, y, test_size= 0.2, random_state=42)
- trainX, valX, trainY, valY = train_test_split(trainX, trainY, test_size=0.2, random_state=42)


여기서는 cross validation을 사용하지 않으면서 & valid set 없이 & random_state라는 seed도 주지않고 0.2만큼 잘라내는 것을
from sklearn.model_selection import train_test_split 을 통해서 수행한다.
- X_train, X_Test, y_train, y_test = train_test_split(X, y, test_size=0.2)


StandardScaler 과 Normalization

참고 사이트 : https://datascienceschool.net/view-notebook/f43be7d6515b48c0beb909826993c856/

스케일링

스케일링은 자료 집합에 적용되는 전처리 과정으로 모든 자료에 선형 변환을 적용하여 전체 자료의 분포를 평균 0, 분산 1이 되도록 만드는 과정이다.스케일링은 자료의 오버플로우(overflow)나 언더플로우(underflow)를 방지하고 독립 변수의 공분산 행렬의 조건수(condition number)를 감소시켜 최적화 과정에서의 안정성 및 수렴 속도를 향상시킨다.

my)
StandardScaler는 수치적으로는 평균은 0, 분산(표준편차) 1을 만들어주는  Z = X-m/a를 적용하여
값의 범위가 어떤 값을 가지든지 간에 표준 정규분포 안의 곡선으로 들어가도록 잡아준 것이다.

.

Scikit-Learn에서는 스케일링을 위한 함수와 클래스를 각각 제공한다. 스케일링 함수는 다음과 같다.

  • scale(X): 기본 스케일. 평균과 표준편차 사용
  • robust_scale(X): 중앙값(median)과 IQR(interquartile range) 사용. 아웃라이어의 영향을 최소화
  • minmax_scale(X): 최대/최소값이 각각 1, 0이 되도록 스케일링
  • maxabs_scale(X): 최대절대값과 0이 각각 1, 0이 되도록 스케일링

.

만약 파이프라인을 이용하면 스케일링을 함수가 아닌 Scaler 클래스로 구현해야 한다. scale 함수에 대응하는 클래스는 StandardScaler 클래스이다.

StandardScaler클래스의 사용 방법은 다음과 같다.

  1. 클래스 객체 생성
  2. fit() 메서드와 트레이닝 데이터를 사용하여 변환 계수 추정
  3. transform() 메서드를 사용하여 실제로 자료를 변환

또는 fit_transform() 메서드를 사용하여 계수 추정과 자료 변환을 동시에 실행할 수도 있다.


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(data1)
data2 = scaler.transform(data1)

data1.std(), data2.std()
(1.974000985027335, 1.0)

정규화 (Normalization)

정규화(Normarlization)는 스케일링과 달리 개별 데이터의 크기를 모두 같게 만들기 위한 변환이다. 따라서 개별 데이터에 대해 서로 다른 변환 계수가 적용된다.

정규화는 다차원 독립 변수 벡터가 있을 때 각 벡터 원소들의 상대적 크기만 중요한 경우에 사용된다.

from sklearn.preprocessing import normalize

x = np.vstack([np.arange(5, dtype=float) - 20, np.arange(5, dtype=float) - 2]).T
y1 = scale(x)
y2 = normalize(x)

print("original x:\n", x)
print("scale:\n", y1)
print("norms (scale)\n", np.linalg.norm(y1, axis=1))
print("normlize:\n", y2)
print("norms (normalize)\n", np.linalg.norm(y2, axis=1))
original x:
 [[-20.  -2.]
 [-19.  -1.]
 [-18.   0.]
 [-17.   1.]
 [-16.   2.]]
scale:
 [[-1.41421356 -1.41421356]
 [-0.70710678 -0.70710678]
 [ 0.          0.        ]
 [ 0.70710678  0.70710678]
 [ 1.41421356  1.41421356]]
norms (scale)
 [2. 1. 0. 1. 2.]
normlize:
 [[-0.99503719 -0.09950372]
 [-0.99861783 -0.05255883]
 [-1.          0.        ]
 [-0.99827437  0.05872202]
 [-0.99227788  0.12403473]]
norms (normalize)
 [1. 1. 1. 1. 1.]
from sklearn.datasets import load_iris
iris = load_iris()

data1 = iris.data[:,:2]
data3 = normalize(data1)

In [8]:

sns.jointplot(data1[:,0], data1[:,1])
plt.show()

In [9]:

sns.jointplot(data3[:,0], data3[:,1])
plt.show()



인코딩(Encoding)

인코딩은 카테고리 값이나 텍스트 정보를 처리가 쉬운 정수로 변환하는 과정이다.

One-Hot-Encoder

One-Hot-Encoder는 one-of-K 인코딩이라고도 불리며 0 ~ K-1 의 값을 가지는 정수 스칼라값을 0 또는 1 값을 가지는 K-차원 벡터로 변환한다. 만약 입력이 스칼라가 아니라 벡터이면 각 원소에 대해 인코딩된 결과를 모두 연결한다. 각 원소의 위치 정보는 feature_indices_ 속성에 저장된다. 또 입력이 벡터인 경우에 특정한 열만 카테고리 값이면 categorical_features 인수를 사용하여 인코딩이 되지 않도록 지정할 수 있다. 이 때 인코딩 결과의 순서가 바뀔 수 있으므로 주의한다.

fit 메서드를 호출하면 다음과 같은 속성이 지정된다.

  • n_values_ : 각 변수의 최대 클래스 갯수
  • feature_indices_ : 입력이 벡터인 경우 각 원소를 나타내는 슬라이싱(slice) 정보
  • active_features_ : 실제로 사용된 클래스 번호의 리스트

One-Hot-Encoding 결과는 메모리 절약을 위해 스파스 행렬(sparse matrix) 형식으로 출력된다. 일반적인 배열로 바꾸려면 toarray 메서드를 사용한다.


from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()


X = np.array([[0], [1], [2]])
X
array([[0],
       [1],
       [2]])


ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))


ohe.transform(X).toarray()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])


X = np.array([[0, 0, 4], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) 
X
array([[0, 0, 4],
       [1, 1, 0],
       [0, 2, 1],
       [1, 0, 2]])


ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([2, 3, 5]), array([ 0,  2,  5, 10]), array([0, 1, 2, 3, 4, 5, 6, 7, 9]))


ohe.transform(X).toarray()
array([[1., 0., 1., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 1., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 1., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0., 0., 1., 0.]])


ohe = OneHotEncoder(categorical_features=[False, True, False])
ohe.fit_transform(X).toarray()
array([[1., 0., 0., 0., 4.],
       [0., 1., 0., 1., 0.],
       [0., 0., 1., 0., 1.],
       [1., 0., 0., 1., 2.]])


ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))



Sigmoid와 Relu

image

  1. sigmoid는 마이너스->0 부분에서 왜곡된 부분을 가지므로
  2. relu가 은닉층에서 마이너스를 모두 0으로 치환시킨 다음
  3. 마지막에만 sigmoid를 activation func으로 써주는게 관례이다.


py파일

깃허브 3. 은행 이탈고객 예측

깃허브 4. 인디안 당뇨병 예측

필요 패키지

깃허브 2. 유방암 남/녀 예측

  1. cython : c계열의 라이브러리 사용 / c방식으로 파이썬 코딩 가능
    - https://anaconda.org/anaconda/cython
    - conda install -c anaconda cython
  2. numpy : 수치 처리 / matrix 계산 가능
  3. pandas : 데이터 과학에 필수적인 dataframe 등을 사용 / csv, 텍스트 파일 등을 사용한다.
  4. keras : 딥러닝 라이브러리, 프론트 엔드를 담당
  5. sklearn : 사이킷런, 파이썬이 기본적으로 제공하는 머신러닝 라이브러리
  6. tensorflow : 딥러닝 백엔드

Sequential과 Dense

Sequential은 선형으로 설명가능한 모델일 경우 사용할 수 있다. 즉, 어떤 선을 기준으로 구분할 수 있을 때이다.
선형 회귀분석용 / 분류용 가설 모델들은 대부분 Sequential을 사용한다.
예를 들어, 암이다 / 암이 아니다.
마이너스 방향으로도 선형으로 설명가능한 모델일 경우, Sequential을 쓰면 된다.

image

Dense는 입력층과 출력층을 모두 연결하는 Layer이다. 그래서 은닉층으로 많이 사용된다.


그외 라이브러리들

  1. sklearn의 cross_validation 클래스 안에 있는 train_test_split
    예를 들어, 100개의 문제가 있는데, 이것을 trainset과 validationset 그리고 testset으로 구분지어야하는 상황이다.
    image
    이 때, 검증셋과 시험셋에 대해서 시험셋에 예측하기 쉬운 것만 들어가서 100점을 맞을 수 있고,
    검증셋에 모르는 것만 들어가서, 학습자체가 제대로 안될 수 있다.
    이 때 생각해낸 것이 여러번 교차적으로 짤라내서 정밀도를 높이는 방법이 교차검증이다.
    image

  2. IPython.display 클래스의  clear_output
    콘솔에 출력할 때, 기존의 내용들을 지운 다음 다시 출력해주는 클래스이다.

  3. sklearn.metrics 클래스의 confusion_matrix
    주로 이진분류에서 사용되는 혼동행렬은, 원래 데이터와 예측값을 출력해주는 오류의 갯수를 나타내는 이진분류 결과표로서
    아래와 같이 생각하면 된다.

                      원래1                               원래2                             원래3
    원래1     원래1 예측1 표본수     원래1 예측2인 표본의 수     원래1 예측3인 표본의 수  -> a/a+b+c : 민감도
    원래2     원래2 예측1 표본수     원래2 예측2인 표본의 수    원래2 예측3인 표본의 수
    원래3     원래3 예측1 표본수     원래3 예측2인 표본의 수    원래3 예측3인 표본의 수
                   d/ d+e+f  = precision

Spyder로 작성한 py 파일

깃허브 2. 유방암 남/녀 예측

Spyder 설치 in anaconda

깃허브 1. 기초

이상하게 노트북에서 아나콘다 통합환경실행 및 Spyder 실행이 안된다...

https://anaconda.org/anaconda/spyder

cmd창에서

conda install -c anaconda spyder

image


Keras

구글 엔지니어가 개발한 것으로, 백엔드로 Tensor나 Theano를 지정할 수 있다.


list와 tuple

[ , , , ] 은 list이다. 하나의 리스트는 [ 0 ]하나로 나타내지만,

(, , , )은 tuple이다. 하나의 튜블은 빈 콤마라도 찍어야한다. ( 0 , )

- list의 대괄호는 생략가능하지만, tuple은 ( , )의 소괄호는 생략해서는 안된다.


keras model

  1. Sequential()은 선형 모델을 사용하겠다는 의미
  2. Dense라는 layers는 input과 output을 모두 연결하는 layer이므로, 은닉층에서 쓰기 좋다.
    - 이 때, 첫번째 파라미터는 output계층의 수이다.
    - 2번째 파라미터는 input계층의 수이다.
  3. complie은 컴퓨터가 알아들을 수 있게 하는 함수인데, 이 때 들어가는 파라미터로 이해하면 쉽다.
    - SGD : <최적화 방식>stochastic gradient Descent 통계적 경사하강의 방법으로 최적의 weight와 bias를 예측한다.
    - mse : <손실 함수> mean square error 평균을 제곱하여 에러를 확장시켜 차이가 명확하게 보이게 한다.
  4. fit은 training, 학습 한다는 의미이다.
    - X, y, 학습횟수, 메세지 출력형태 정도 이다.
  5. predict는 학습을 통해 얻어진 예측값들을 받아오는 함수이다.
    - 이 때, flatten()은 array형태로 얻어지는 예측값(행렬형태)를  1차원 배열로 바꾼 것이다.

  6. 이제 Target값인 y(정해진 답)과  예측한값 predict를 같이 print해서 비교해보자.


예제파일

깃허브 1. 기초

+ Recent posts