Skip to content

유전체 데이터 분석 교육 제1회 #
Find similar titles

생물정보 분석을 위한 리눅스 및 파이썬 기초 #

개요 #

  • 일시: 2019-08-22(목) ~ 2019-08-23(금)
  • 선발인원: 30명
  • 교육대상
    • 생물정보 분석을 진행하고자 하는 연구원 또는 대학원생
    • 모든 교육 일정에 참석이 가능한 교육생
  • 교육비: 무료 (중식 무료 제공)
  • 준비물: 유무선 인터넷 가능한 개인 노트북
  • 교육 프로그램
  • 설문조사 : http://naver.me/5pOUr2Ud

강의 특징 #

  • 이론과 실습 병행
  • 리눅스는 putty 프로그램으로 원격 접속하여 실습
  • 파이썬은 개인 PC에 직접 설치하여 실습
  • 둘째날 데이터 분석 파트는 개인 PC에 anaconda 설치하여 실습

교육 환경 #

로컬컴퓨터에 파이썬을 설치하여 실습하거나 원격 서버에서 실습, 실습서버 원격접속 방법은 아래 참고

Windows #

  1. Putty 프로그램 설치: Putty download page에서 Windows용 MSI 설치 파일 putty-version-installer.msi 다운로드 및 실행
  2. Putty 프로그램 실행 후 주어진 접속 정보를 통해 서버 접속

Linux/OS X #

터미널 프로그램(iTerm 등)을 실행하여 다음과 같은 방식으로 서버 접속 $ ssh -p {Port} {user id}@{ip OR host}

기타 #

Jupyter 설치 방법 (Anaconda_jupyter-설치방법.pdf) 참고하여 설치

filezilla 설치: https://filezilla-project.org

파이썬 참고 정보 #

리눅스 연습문제 #

참고 #

  1. # 표시는 주석으로 아래 명령에 대한 설명을 적은 것입니다.
  2. $ 표시는 쉘에서 일반 유저로 로그인 한 상태를 나타냅니다. $ 표시 뒤에가 쉘에 칠 명령어입니다.
  3. 그 외 아무 표시가 없는 것은 쉘에서 명령어를 실행한 결과물을 뜻합니다. 명령어 실행 후 화면에 출력된 내용입니다.

Multiple Fasta 파일에 몇개의 서열이 들어있는지 확인해보기 #

Fasta 포맷은 생물정보 분야에서 쓰이는 대표적인 파일 포맷중 하나 입니다. Fasta 파일에 몇개의 서열이 들어있는지 알아봅니다.

예시 파일은 Acanthaster_planci 의 Protein 서열 파일을 사용합니다.

# wget 명령을 통해 파일을 다운로드 합니다.
$ wget https://ftp.ncbi.nlm.nih.gov/genomes/Acanthaster_planci/protein/protein.fa.gz
# gunzip 명령을 통해 압축을 풉니다.
$ gunzip protein.fa.gz
# grep 명령어를 통해 ">" 가 들어간 라인을 찾습니다.
# Fasta 서열은 ">"를 기준으로 구분할 수 있습니다.
# wc -l 명령을 통해 출력된 라인 수를 셉니다.
# wc 명령어는 단어나 라인등의 숫자를 세주는 명령어 입니다. -l 옵션을 주어 라인수를 셉니다.
# | 를 통해 두 명령어를 연결하여 사용할 수 있습니다.
# 왼쪽 실행 결과가 오른쪽 명령어의 입력으로 들어갑니다.
$ grep ">" protein.fa  | wc -l
   33214

Genbank 파일에 몇개의 서열이 들어있는지 확인해보기 #

Genbank 포맷은 생물정보 분야에서 쓰이는 대표적인 파일 포맷중 하나 입니다. 서열데이터와 함께 여러가지 정보를 같이 저장할 수 있습니다. Genbank 파일에 몇개의 서열이 들어있는지 알아봅니다.

예시 파일은 Acanthaster_planci 의 Protein 파일을 사용합니다.

# wget 명령을 통해 파일을 다운로드 합니다.
$ wget https://ftp.ncbi.nlm.nih.gov/genomes/Acanthaster_planci/protein/protein.gbk.gz
# gunzip 명령을 통해 압축을 풉니다.
$ gunzip protein.gbk.gz
# grep 명령어를 통해 "//" 가 들어간 라인을 찾습니다.
# Genbank 서열은 "//"를 기준으로 구분할 수 있습니다.
# wc -l 명령을 통해 출력된 라인 수를 셉니다.
# wc 명령어는 단어나 라인등의 숫자를 세주는 명령어 입니다. -l 옵션을 주어 라인수를 셉니다.
# | 를 통해 두 명령어를 연결하여 사용할 수 있습니다.
# 왼쪽 실행 결과가 오른쪽 명령어의 입력으로 들어갑니다.
$ grep "//" protein.gbk  | wc -l
   33214

파일에서 특정 문구를 다른 문구로 교체해보기 #

위에서 예제로 사용한 Fasta 서열을 보면 ">"로 시작하는 제목 라인이 아래와 같이 되어 있습니다.

$ head -3 protein.fa
>ref|XP_022079556.1| dickkopf-related protein 2-like [Acanthaster planci]
MANTVVSYSCWVKVGLVLLLCALTSTNGVYVHERRRELLLDTSIDSSDRPSIQGDTSKHHENQNPAELGM
TSPKRKPFQRTLVLCNGDDDCEQKSFCHGGEGHKSCLPCRRSRRRCQRNGMCCHGNVCRQGRCVPKEMRY

ref 라는 문구를 reference로 전부 바꾸어 보겠습니다.

# 화면에 바로 출력하기
$ sed 's/ref/reference/' protein.fa

# 바꾼 결과물을 다른 파일로 저장하기
$ sed 's/ref/reference/' protein.fa > changed_protein.fa

# 확인하기
$ head -3 changed_protein.fa
>reference|XP_022079556.1| dickkopf-related protein 2-like [Acanthaster planci]
MANTVVSYSCWVKVGLVLLLCALTSTNGVYVHERRRELLLDTSIDSSDRPSIQGDTSKHHENQNPAELGM
TSPKRKPFQRTLVLCNGDDDCEQKSFCHGGEGHKSCLPCRRSRRRCQRNGMCCHGNVCRQGRCVPKEMRY

공백이나 탭, 콤마(',') 등으로 구분된 파일 다루기 #

(Case-1) [GFF] 파일은 어떤 서열의 각 부분별 주석등을 탭으로 구분한 테이블 형식으로 표현한 포맷입니다. 이 파일에서 ID 만 뽑아보겠습니다.

[GFF] 파일 미리보기 ( '#' 기호는 주석 표시입니다. )

##gff-version 3
NW_019091355.1  RefSeq  region  1   6091339 .   +   .   ID=id0;Dbxref=taxon:133434;Name=Unknown;chromosome=Unknown;collection-date=2013-05-28;country=Japan:Okinawa%2C Motobu;dev-stage=adult;gbkey=Src;genome=genomic;isolation-source=sperm of marine coral reef;mol_type=genomic DNA;sex=male

예시 파일은 Acanthaster_planci 의 [GFF] 파일을 사용합니다.

# 예시 파일 다운로드
$ wget https://ftp.ncbi.nlm.nih.gov/genomes/Acanthaster_planci/GFF/ref_OKI-Apl_1.0_top_level.gff3.gz
# 압축 풀기
$ gunzip ref_OKI-Apl_1.0_top_level.gff3.gz
# 파일 내용 살펴보기
$ head -20 ref_OKI-Apl_1.0_top_level.gff3
(출력내용 생략)
# ID만 출력하기 (GFF 각 라인의 첫번째 컬럼) 
# 출력 내용이 길어 3줄만 보기 옵션 추가( | head -3)
$ awk '{printf $1 "\n"}' ref_OKI-Apl_1.0_top_level.gff3  | head -3
##gff-version
#!gff-spec-version
#!processor
# #로 시작하는 라인은 주석 라인이므로 제거하기
$ awk '{printf $1 "\n"}' ref_OKI-Apl_1.0_top_level.gff3  | sed '/^#/d' | head -3
NW_019091355.1
NW_019091355.1
NW_019091355.1
# 중복 아이디 제거
$ awk '{printf $1 "\n"}' ref_OKI-Apl_1.0_top_level.gff3  | sed '/^#/d' | uniq | head -3
NW_019091355.1
NW_019091356.1
NW_019091357.1
# 결과를 별도 파일로 저장하기
$ awk '{printf $1 "\n"}' ref_OKI-Apl_1.0_top_level.gff3  | sed '/^#/d' | uniq > id_list.txt
# 저장된 결과 확인하기
$ head id_list.txt

(Case-2) Type이 Gene인 라인의 아이디 및 시작, 끝 위치만 출력하기 ( 맨 뒤의 | head -3 은 3줄씩만 미리 보기 위한 옵션 명령을 추가한 것입니다.)

# 일단 #이 들어간 주석 라인을 제거
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | head -3
NW_019091355.1  RefSeq  region  1   6091339 .   +   .   ID=id0;Dbxref=taxon:133434;Name=Unknown;chromosome=Unknown;collection-date=2013-05-28;country=Japan:Okinawa%2C Motobu;dev-stage=adult;gbkey=Src;genome=genomic;isolation-source=sperm of marine coral reef;mol_type=genomic DNA;sex=male
NW_019091355.1  Gnomon  gene    4080    16305   .   -   .   ID=gene0;Dbxref=GeneID:110973211;Name=LOC110973211;gbkey=Gene;gene=LOC110973211;gene_biotype=protein_coding
NW_019091355.1  Gnomon  mRNA    4080    16305   .   -   .   ID=rna0;Parent=gene0;Dbxref=GeneID:110973211,Genbank:XM_022223864.1;Name=XM_022223864.1;gbkey=mRNA;gene=LOC110973211;model_evidence=Supporting evidence includes similarity to: 9 Proteins%2C and 100%25 coverage of the annotated genomic feature by RNAseq alignments%2C including 9 samples with support for all annotated introns;product=dickkopf-related protein 2-like;transcript_id=XM_022223864.1
# gene 타입을 가진 라인만 필터링
# GFF는 탭으로 구분되어있기 때문에 \tgene\t 으로 검색
# 탭은 기호로 `\t`로 표시 가능
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t"
NW_019091355.1  Gnomon  gene    4080    16305   .   -   .   ID=gene0;Dbxref=GeneID:110973211;Name=LOC110973211;gbkey=Gene;gene=LOC110973211;gene_biotype=protein_coding
NW_019091355.1  Gnomon  gene    24137   33190   .   +   .   ID=gene1;Dbxref=GeneID:110973192;Name=LOC110973192;gbkey=Gene;gene=LOC110973192;gene_biotype=protein_coding
NW_019091355.1  Gnomon  gene    34979   38126   .   -   .   ID=gene2;Dbxref=GeneID:110973241;Name=LOC110973241;gbkey=Gene;gene=LOC110973241;gene_biotype=protein_coding
# awk를 통해 원하는 컬럼만 출력
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $1, $4, $5}' | head -3
NW_019091355.1 4080 16305
NW_019091355.1 24137 33190
NW_019091355.1 34979 38126
# 최종 결과를 원하는 파일에 저장하기
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $1, $4, $5}'  > my_result.txt

(Case-3) Type이 Gene인 라인에서 마지막 컬럼에서 geneID만 출력하기 ( 맨 뒤의 | head -3 은 3줄씩만 미리 보기 위한 옵션 명령을 추가한 것입니다.)

# gene 라인만 가져오기(Case-2 참고)
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | head -3
NW_019091355.1  Gnomon  gene    4080    16305   .   -   .   ID=gene0;Dbxref=GeneID:110973211;Name=LOC110973211;gbkey=Gene;gene=LOC110973211;gene_biotype=protein_coding
NW_019091355.1  Gnomon  gene    24137   33190   .   +   .   ID=gene1;Dbxref=GeneID:110973192;Name=LOC110973192;gbkey=Gene;gene=LOC110973192;gene_biotype=protein_coding
NW_019091355.1  Gnomon  gene    34979   38126   .   -   .   ID=gene2;Dbxref=GeneID:110973241;Name=LOC110973241;gbkey=Gene;gene=LOC110973241;gene_biotype=protein_coding
# gene id가 들어가 있는 마지막 컬럼(9번째 컬럼)만 출력하기
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $9}'  | head -3

ID=gene0;Dbxref=GeneID:110973211;Name=LOC110973211;gbkey=Gene;gene=LOC110973211;gene_biotype=protein_coding
ID=gene1;Dbxref=GeneID:110973192;Name=LOC110973192;gbkey=Gene;gene=LOC110973192;gene_biotype=protein_coding 
ID=gene2;Dbxref=GeneID:110973241;Name=LOC110973241;gbkey=Gene;gene=LOC110973241;gene_biotype=protein_coding

# `;` 로 구분되어 있는 것 확인
# `;` 구분자로 하여 잘라서 첫번째 컬럼만 보기
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $9}' | cut -d ';' -f 1  | head -3
ID=gene0
ID=gene1
ID=gene2
# `=` 구분자로 되어 있는 것 확인
# `=` 로 잘라서 두번째 컬럼만 보면 gene id만을 얻을 수 있다.
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $9}' | cut -d ';' -f 1 | cut -d '=' -f 2  | head -3
gene0
gene1
gene2
# 최종 결과를 저장하기
$ sed '/^#/d' ref_OKI-Apl_1.0_top_level.gff3 | grep "\tgene\t" | awk '{print $9}' | cut -d ';' -f 1 | cut -d '=' -f 2 > my_result2.txt

파이썬 연습문제 #

1. 기본자료형, 배열형 자료형 #

(문제. 1-1) 두개의 숫자 A, B를 입력받아, 덧셈, 뺄셈, 곱셈, 나눗셈, 몫, 나머지, 제곱을 출력하세요.

$ python number.py
A: 5
B: 4

덧셈: 9
뺄셈: 1
곱셈: 20
나눗셈: 1.25
몫: 1
나머지: 1
제곱: 625

(풀이. 1-1)

#!python
A = int(input('A: '))
B = int(input('B: '))

print('덧셈:', A + B)
print('뺄셈:', A - B)
print('곱셈:', A * B)
print('나눗셈:', A / B)
print('몫:', A // B)
print('나머지':, A % B)

(문제. 1-2) 10자보다 큰 임의의 문자열을 입력받아, 두번째 문자, 세번째부터 7번째까지, 거꾸로 두칸씩 문자열을 출력하세요.

$ python string.py
input: Month python

두번째 문자: o
세번째부터 7번째: nty P
거꾸로 두칸씩: nhy to

(풀이. 1-2)

#!python
s = input('input: ')

print()
print(f'두번째 문자: {s[1]}')
print(f'세번째부터 7번째: {s[2:6]}')
print(f'거꾸로 두칸씩: {s[::-2]}')

(문제. 1-3) 임의의 DNA 서열을 입력받아, GC content를 출력하는 프로그램을 작성하세요.

$ python gc_content.py
DNA sequence: AGTCCAGTCAAGTCCAGTCA

GC content: 0.5

(풀이. 1-3)

#!python
seq = input('DNA sequence:')
G = seq.count('G')
C = seq.count('C')
total = len(seq)
gc_content = (G + C) / total

print()
print('GC content: %4.2f' % gc_content)
print('GC content: {:4.2f}'.format(gc_content))
print(f'GC content: {gc_content:4.2f}')

2. 집합형 자료형, iF 구문 #

(문제. 2-1) 사용자로부터, 국어, 영어, 수학, 과학 과목의 점수를 입력받아, 사전에 등록하고, 총점과 평균, 최고점수 과목을 출력하세요.

$ python score.py
국어: 100
영어: 90
수학: 80
과학: 70

총점: 340
평균: 85.0
최고점수 과목: 국어

(풀이. 2-1)

#!python
score = {}
score['국어'] = int(input('국어: '))
score['영어'] = int(input('영어: '))
score['수학'] = int(input('수학: '))
score['과학'] = int(input('과학: '))

total = sum(score.values())
average = total / len(score)
best_subject, best_score = list(sorted(score.items(), lambda x: x[1]))[-1]

print()
print(f'총점: {total}')
print(f'평균: {average}')
print(f'최점수 과목: {best_subject}')

(문제. 2-2) 사용자로부터, A, B 두개의 집합을 입력받아, 교집합, 합집합, 차집합을 출력하는 프로그램을 작성하세요.

$ python set.py
Set A: 1 2 3 4 5
Set B: 4 5 6 7 8

Union ---> 1 2 3 4 5 6 7 8
Intersection --> 4 5
Difference --> 1 2 3

(풀이. 2-2)

#!python
a = set(map(int, input('Set A: ').split()))
b = set(map(int, input('Set B: ').split()))

print()
print(f'Union ---> {a | b}')
print(f'Intersection ---> {a & b}')
print(f'Difference ---> {a - b}')

(문제. 2-3) 숫자맞추기 게임 1 - 임의 숫자를 생성하고, 이를 맞춥니다. 못맞출 경우, 더 큰지, 작은지 여부를 출력합니다.

$ python number_game.py
임의 숫자를 생성했습니다. 맞춰보세요: 34
땡! 틀렸습니다. 34보다 작습니다. 
정답은 25입니다.

(풀이. 2-3)

#!python
import random

n = random.randint(0, 10)

x = int(input('임의 숫자를 생성했습니다. 맞춰보세요: '))

if n == x:
    print('정답입니다')
elif n < x:
    print(f'땡! 틀렸습니다. {x}보다 작습니다')
else:
    print(f'땡! 틀렸습니다. {x}보다 큽니다')

print(f'정답은 {n}입니다')

3. 집합형 자료형, iF 구문 #

(문제. 3-1) 구구단을 출력합니다.

$ python gugudan.py
2 x 1 = 2
2 x 2 = 4
...

(풀이. 3-1)

#!python
for x in range(2, 10):
    for y in range(1, 10):
        print(f'{x} x {y} = {x * y}')
    print()

(문제. 3-2) 2-3의 숫자맞추기 게임은 1회만 가능합니다. 이를 맞출 때 까지 계속 입력할 수 있도록 변경합니다.

$ python number_game2.py
임의 숫자를 생성했습니다. 맞춰보세요: 34
땡! 틀렸습니다. 34보다 작습니다. 다시!: 23 
땡! 틀렸습니다. 23보다 작습니다. 다시!: 20
땡! 틀렸습니다. 20보다 큽니다. 다시!: 21
정답입니다.
정답은 25입니다.

(풀이. 3-2)

#!python
import random

n = random.randint(0, 10)

while True:
    x = int(input('임의 숫자를 생성했습니다. 맞춰보세요: '))

    if n == x:
        print('정답입니다')
        break
    elif n < x:
        print(f'땡! 틀렸습니다. {x}보다 작습니다')
    else:
        print(f'땡! 틀렸습니다. {x}보다 큽니다')

print(f'정답은 {n}입니다')

4. 파일다루기, 함수 #

(문제. 4-1) 임의의 텍스트 파일에 있는 단어의 빈도를 계산하여, 가장 높은 단어 20개를 순서대로 출력하세요.

$ python word_frequency.py < a.txt
the: 50
boy: 45
girl: 30
to: ...

(풀이. 4-1)

#!python
import sys

frequencies = {}
special_characters = ['"', "'", '%', '(', ')', ':', '=', ']', '[', ',']
for line in sys.stdin:
    for sc in special_characters:
        line = line.replace(sc, ' ')
    words = line.strip().split()
    for word in words:
        if word in frequencies:
            frequencies[word] += 1
        else:
            frequencies[word] = 2

for word, frequency in sorted(
        frequencies.items(), key=lambda x: x[1], reverse=True)[:20]:
    print(f'{word}: {frequency}')

(문제. 4-2) 구구단 함수를 사용하여, 원하는 단만 출력

$ python gugudan2.py
단: 2
2 x 1 = 2
2 x 2 = 2
...

(풀이. 4-2)

#!python
def print_gugudan(x):
    for y in range(1, 10):
        print(f'{x} x {y} = {x * y}')
    print()

x = int(input('단: '))
print_gugudan(x)

5. 모듈 #

(문제. 5-1) 임의의 연도, 월, 날짜를 입력받아, 원하는 날수 후 날짜를 출력하는 프로그램

$ python date.py
연도: 2019
월: 8
일: 10
몇일뒤?: 100

2019-08-10의 100일뒤는 2019-11-18 입니다.

(풀이. 5-1)

#!python
import datetime as dt

year = int(input('연도: '))
month = int(input('월: '))
day = int(input('일: '))
day_after = int(input('몇일뒤?: '))

input_day = dt.date(year, month, day)
the_day = input_day + dt.timedelta(days=day_after)

print(f'{input_day.strftime("%Y-%m-%d")}의 {day_after}일뒤는 '
      f'{the_day.strftime("%Y-%m-%d")} 입니다.')

(문제. 5-2) 임의의 multi fasta 파일을 입력받아, reverse complement를 출력하는 프로그램 (biopython의 SeqIO 이용)

$ cat test.fasta
>name1
AGTCAGTCAGTC
>name2
GGGGCCCCA
$ python reverse_complement.py < test.fasta
>name1 rc
GACTGACTGACT
>name2 rc
TGGGGCCCC

(풀이. 5-2)

#!python
import sys
from Bio import SeqIO

for record in SeqIO.parse(sys.stdin, 'fasta'):
    record.seq = record.seq.reverse_complement()
    print(record.format('fasta'))

파이썬 문제 풀이 및 강의 내용에 대한 질문은 으로 연락주세요.

Suggested Pages #

0.0.1_20140628_0