생물정보분석 #2 pandas numpy 데이터 처리 #
#2026-01-09
#1 데이터 처리
pandas scipy sklearn
- pandas로 데이터프레임으로 데이터를 확인하고
- scipy와 sklearn에서 통계 패키지와 머신러닝 패키지를 사용한다
numpy
- python이 제공하는 머신러닝 패키지는 sklearn인데 이를 사용하려면 numpy를 알아야 한다.
- tensorflow같은 딥러닝 패키지들이 입출력을 위해 numpy를 사용한다
- numpy는 다차원 배열인데 포함된 모든 데이터는 같은 형식이어야한다
- 머신러닝을 하고싶으면 float 형식으로 만들어진 다차원 배열이 필요하다.
pandas 쓰는 이유
- 데이터가 표 형식이라도 그 안에는 여러 type의 데이터가 혼재되어 있고 행과 열의 라벨 등이 문자열일것인데, 이를 읽어들이는 도구가 pandas.
- 텍스트 파일이나 엑셀 파일을 데이터프레임으로 통째로 옮겨올 수 있다.
#
#2 데이터 확인
import pandas as pd
assoc = pd.read_csv('gwas-association-downloaded_2026-01-09-rsId_rs7329174.tsv', sep="\t")
keep_columns = ["SNPS", "P-VALUE", "P-VALUE (TEXT)", "OR or BETA", "95% CI (TEXT)", "MAPPED_TRAIT"]
assoc = assoc[keep_columns]
assoc
- 원래 책에서는 Variant and risk allele, P-value, P-value annotation, RAF, OR, Beta, CI, Mapped gene, Reported trait, Trait(s)를 컬럼으로 갖고있어서 수정해줬다.
- assoc를 확인해보면 비어있는 데이터도 많고
- 숫자 사이에 텍스트가 들어가있는 경우도 있다
- 파이썬은 루프를 돌면서 작업을 하는 것을 매우 꺼린다.
- 대부분의 언어에서는 for loop를 돌면서 값을 채워야 하지만 파이썬은 이런 경우에 누가 만들어두었을 가능성이 크다.
#
#3 데이터 전처리 - pandas
전처리 상황
- 파일은 보통 비어있는 데이터가 있거나
- 숫자 사이에 텍스트가 들어가있어서 제대로 읽히지 않을 수 있고
- 클래스로 나눠야 할때도 있다.
텍스트로 된 열을 숫자형으로 바꾸기
- 수치로 표현되는 P-value와 OR을 확인해보기.
- 내 데이터에서는 모두 float이지만 책에서는 P-value의 dtype이 object이다.
- “8 x 10-9"와 같이 적혀있기 때문.
- pandas는 8E-9 식으로 된 문자열은 쉽게 float로 바꾼다. 따라서 ‘x 10’ 대신에 ‘E’를 넣으면 된다.
# 책에서 쓴 방법 (난 안함)
pvalue = pd.to_numeric(assoc['P-value'].strreplace('x 10', 'E'))
float가 아닌 데이터를 사용하기 위해 클래스로 나누기
- 데이터로 머신러닝을 돌려보려면 float 형식이 일반적이고
- 여기서는 2개 컬럼을 쓸수있는 셈이다
- float만 아니라 trait 같은 문자열 데이터도 사용하고 싶으면 categorial(범주형) 데이터로 바꿔주면 된다.
원핫 인코딩
- 범주값을 0,1로 표현하는 것
- 이미지를 분석하는 딥러닝 모델을 만들었을때 자동차, 비행기, 고양이, 개 이렇게 4개의 이미지를 학습시켰다고 하면
- 데이터에 1번 사진은 고양이, 2번 비행기 이런식으로 정답을 지정해줘야 하는데
- 이럴때 원핫 인코딩을 쓴다.
#
#4 데이터 전처리 - numpy
numpy로 만들기
- 작업을 pandas로 한 뒤에 머신러닝을 하기 위해서는 numpy로 만들어야 한다.
- 위에서 말했듯 numpy의 요소들은 모두 같은 형식을 갖게 된다.
trait = pd.get_dummies(assoc['MAPPED_TRAIT']).astype(int)
pvalue = assoc['P-VALUE']
new_assoc = pd.concat([trait, pvalue, assoc['OR or BETA']], axis=1)
assoc_np = np.array(new_assoc)
assoc_np
numpy로 데이터 다루기
- 수학이나 과학의 연산에서 행렬을 통째로 연산하는 경우가 많은데 이를 위한 파이썬 패키지가 numpy
- ndarray는 특정 타입의 데이터로 이루어진 다차원 배열(array).
- numpy는 파이썬의 문법만 가지고 있을 뿐 내부 구현이 C 등의 컴파일 언어로 작성되어 있어서 실행속도가 빠르다.
- 그래서 수치 데이터 처리에서 파이썬을 사용할 때 대부분의 라이브러리가 numpy를 기반으로 한다.
numpy와 broadcasting
- 행렬과 하나의 수를 곱하면 행렬의 모든 값에 그 수를 곱한 효과가 나타난다.
- C같은 다른 프로그램에서 배열에 하나의 수를 곱하려면 for loop를 사용해야 하는데 numpy가 있으면 빠르게 할수있다.
- array와 수 하나의 연산이 가능하듯이 높은 차원 array와 낮은 차원 array 사이 연산도 가능한데
- 이때 낮춘 차원의 수가 높은 차원 쪽으로 broadcasting 된다.
ar1 = np.ones((4,4))
ar4 = np.array([1,2,3,4])
ar1+ar4
array([[2., 3., 4., 5.],
[2., 3., 4., 5.],
[2., 3., 4., 5.],
[2., 3., 4., 5.]])
- ar4는 1차원 배열 1x4였고 ar1은 4x4 2차원 배열이었는데 그 두개를 더하면 ar4의 첫번째 열의 요소인 1이 ar1의 첫번째 열의 모든 요소인 1,1,1,1에 더해진다.
ar4T = ar4.reshape(4,1)
ar1+ar4T
array([[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.]])
- ar4T는 1차원 배열 4x1이고 ar1과 더하면 ar4T의 첫번째 행의 요소인 1이 ar1의 첫번째 행의 모든 요소인 1,1,1,1에 더해진다.
- broadcasting의 활용처?
- 1만개 샘플에 대해서 데이터가 100개씩 있는데, 각 샘플 단위로 표준화를 하려고 할때
- 먼저 각 샘플별로 평균과 표준편차 1만개를 구하고
- 1번 샘플의 100개 데이터를 모두 1번 샘플의 평균으로 빼고 표준편차로 나눠야 한다.
- 이를 차원별 broadcasting을 쓰면 빠르게 할수있다.
- 1만개 샘플에 대해서 데이터가 100개씩 있는데, 각 샘플 단위로 표준화를 하려고 할때
numpy의 차원축소 평균(reduce mean)
- 1만개 샘플에 100개 데이터면 데이터 크기는 (10000,10)이다.
- 평균은 100개에 대해서만 구하면 된다(1만번).
- 즉 첫번째 차원(행)을 건드리지 말고 두번째 차원(컬럼)을 축소시키면서 평균을 구하면 된다.
- 두번째 차원은 axis=1이다.
ar10000x100 = np.ones([10000,100])
ar10000x100.shape
mean10000 = ar10000x100.mean(axis=1)
mean10000.shape
mean10000
(10000, 100)
(10000,)
array([1., 1., 1., ..., 1., 1., 1.])
numpy와 이미지 데이터
- 딥러닝 데이터로 400*300 픽셀의 컬러(보통 RGB 채널) 이미지를 1000개 모아둔 array
- 즉 1000개 이미지 데이터 만들고 확인하기
images = np.random.uniform(low=0.0, high=1.0, size=(1000, 400, 300, 3))
images.shape
im0 = images[0]
im0.shape
import matplotlib.pyplot as plt
plt.imshow(im0)
(1000, 400, 300, 3)
(400, 300, 3)
array([[[0.15803955, 0.53070813, 0.23028102],
[0.03046594, 0.71824138, 0.6132949 ],
[0.14313671, 0.85473338, 0.08050516],
...,
[0.55311171, 0.30301276, 0.43692709],
[0.71987098, 0.1831894 , 0.46999118],
[0.90894427, 0.36563462, 0.11932334]],
[[0.22748435, 0.11342641, 0.20375297],
[0.74990687, 0.39259791, 0.89839901],
[0.49410067, 0.50020934, 0.31407056],
...,
[0.16491718, 0.32278871, 0.51828544],
[0.01768351, 0.32579107, 0.96513924],
[0.34394196, 0.89497986, 0.32538921]],
[[0.82667255, 0.0786744 , 0.59081717],
[0.40552692, 0.23736656, 0.66925875],
[0.52977153, 0.01900526, 0.76249299],
...,
[0.90784801, 0.30743188, 0.14436875],
[0.43217459, 0.47489089, 0.41977113],
[0.4981564 , 0.95670171, 0.59169221]],
...,
[[0.94956282, 0.18778288, 0.66148401],
[0.676509 , 0.89498117, 0.58301496],
[0.40377479, 0.95204886, 0.33086594],
...,
[0.89345276, 0.33817896, 0.92274179],
[0.52940438, 0.80392045, 0.97242388],
[0.21712928, 0.83004634, 0.65837659]],
[[0.19185282, 0.48719912, 0.23206957],
[0.17535998, 0.73622178, 0.76553086],
[0.58051576, 0.55703541, 0.09824059],
...,
[0.82784742, 0.30698869, 0.49851545],
[0.41532795, 0.73754853, 0.96632835],
[0.51647138, 0.75000081, 0.47228711]],
[[0.82070939, 0.69901723, 0.94569433],
[0.88131093, 0.54632989, 0.30624773],
[0.72893268, 0.20950326, 0.18348824],
...,
[0.40544816, 0.39691107, 0.05120597],
[0.71382013, 0.06693004, 0.5864878 ],
[0.36108079, 0.07574143, 0.63901886]]])
- 이미지 데이터로 딥러닝을 하기 위해서는
- 먼저 이미지 파일을 읽어서 numpy array로 만든다.
- 딥러닝은 수천개 이상의 이미지를 동시에 입력해서 학습하는데
- 때문에 이 numpy array들을 하나의 큰 array로 묶어두게된다
- 이때
- 일부 이미지는 크기를 바꾸거나 노이즈를 입히는 등 가공해야할수도 있다.
- 중간중간에 이미지가 제대로 가공되는지 확인해야하는 경우도 있다.
- 최근 딥러닝에 tensorflow가 많이 사용된다.
- tensorflow의 연산도 numpy와 비슷하다.
#
#출처
책 빅데이터&인공지능 with 생물정보학