3 분 소요

이 장에서 배울 것

이번 장에서는 시각화(visualization)를 배웁니다. 시각화는 숫자와 표를 그림으로 바꾸어 보는 일입니다. 표만 보면 잘 안 보이던 패턴도 그림으로 보면 바로 보일 때가 많습니다.

핵심 용어를 먼저 정리하겠습니다.

  • 시각화(visualization): 데이터를 그래프나 그림으로 표현하는 작업입니다.
  • 맷플롯립(matplotlib): 파이썬에서 기본적으로 많이 쓰이는 시각화 라이브러리입니다.
  • 히스토그램(histogram): 값들이 어느 구간에 얼마나 많이 모여 있는지 보여주는 그래프입니다.
  • 산점도(scatter plot): 두 숫자 변수의 관계를 점으로 보여주는 그래프입니다.
  • 막대그래프(bar plot): 범주별 값을 막대로 비교하는 그래프입니다.
  • 상자그림(box plot): 그룹별 값의 분포를 요약해서 보여주는 그래프입니다.
  • 열지도(heatmap): 숫자 표를 색으로 표현하는 그림입니다.
  • 축(axis): 그래프에서 가로축과 세로축입니다.
  • 범례(legend): 색이나 점 모양이 무엇을 뜻하는지 알려주는 설명입니다.

시각화

가장 쉬운 비유: 표를 사진으로 바꾸기

숫자 표는 정확하지만 한눈에 들어오지 않습니다.

gene,expression
BRCA1,12.5
TP53,8.2
EGFR,20.1

이 표를 그래프로 바꾸면 어떤 유전자의 값이 큰지 더 빨리 알 수 있습니다. 시각화는 데이터를 예쁘게 꾸미는 일이 아니라, 데이터를 제대로 이해하기 위한 도구입니다.

matplotlib 불러오기

맷플롯립은 보통 이렇게 불러옵니다.

import matplotlib.pyplot as plt

여기서 plt는 맷플롯립의 그래프 기능을 짧게 부르는 별명입니다.

선 그래프

선 그래프는 순서가 있는 값의 변화를 보여줄 때 씁니다.

import matplotlib.pyplot as plt

days = [1, 2, 3, 4]
cells = [100, 180, 300, 520]

plt.plot(days, cells)
plt.xlabel("Day")
plt.ylabel("Cell count")
plt.title("Cell growth")
plt.show()

xlabel은 가로축 이름, ylabel은 세로축 이름, title은 그래프 제목입니다.

막대그래프

막대그래프는 범주별 값을 비교할 때 씁니다.

genes = ["BRCA1", "TP53", "EGFR"]
expression = [12.5, 8.2, 20.1]

plt.bar(genes, expression)
plt.ylabel("Expression")
plt.show()

유전자별 발현량처럼 “이름이 있는 대상들”을 비교할 때 이해하기 쉽습니다.

히스토그램

히스토그램은 값들이 어느 구간에 많이 몰려 있는지 보여줍니다.

values = [1, 2, 2, 3, 3, 3, 10]

plt.hist(values)
plt.xlabel("Value")
plt.ylabel("Count")
plt.show()

품질 점수 분포, 발현량 분포, 샘플별 read 수 분포를 볼 때 유용합니다.

산점도

산점도는 두 숫자 변수의 관계를 볼 때 씁니다.

gene_a = [1, 2, 3, 4]
gene_b = [2, 4, 6, 8]

plt.scatter(gene_a, gene_b)
plt.xlabel("Gene A")
plt.ylabel("Gene B")
plt.show()

점들이 오른쪽 위로 올라가면 두 값이 함께 커지는 경향이 있다고 볼 수 있습니다. 단, 그래프가 관계를 보여준다고 해서 바로 원인이라고 말하면 안 됩니다.

상자그림

상자그림은 그룹별 분포를 비교할 때 씁니다.

cancer = [10, 12, 11, 14]
normal = [4, 5, 6, 5]

plt.boxplot([cancer, normal], labels=["cancer", "normal"])
plt.ylabel("Expression")
plt.show()

암 그룹과 정상 그룹의 발현량 분포를 비교할 때 유용합니다.

열지도

열지도는 큰 숫자 표를 색으로 바꿔 보여줍니다.

import numpy as np

matrix = np.array([
    [1, 2, 3],
    [4, 5, 6]
])

plt.imshow(matrix)
plt.colorbar()
plt.show()

유전자 × 샘플 표나 세포 × 유전자 표를 한눈에 요약할 때 많이 쓰입니다.

그래프를 저장하기

화면에 보여주는 대신 파일로 저장할 수도 있습니다.

plt.savefig("figure.png", dpi=150)

dpi는 그림의 해상도와 관련된 값입니다. 값이 클수록 더 선명하지만 파일 크기도 커질 수 있습니다.

좋은 그래프의 조건

좋은 그래프는 화려한 그래프가 아닙니다. 독자가 무엇을 보고 있는지 바로 알 수 있는 그래프입니다.

좋은 그래프에는 보통 다음이 필요합니다.

  • 제목
  • 가로축 이름
  • 세로축 이름
  • 단위
  • 색이나 점 모양의 의미
  • 너무 복잡하지 않은 구성

생물정보학에서 왜 중요한가

PCA 그림, 화산그림, 발현량 히스토그램, heatmap, single-cell UMAP 그림은 모두 시각화입니다. 분석 결과가 맞는지 의심하고, 패턴을 발견하고, 논문 그림으로 전달하려면 시각화 능력이 필수입니다.

데이터 질문에 맞는 그래프 고르기

그래프는 예쁘게 그리는 것이 목표가 아니라 질문에 맞게 고르는 것이 목표입니다. 시간에 따른 변화를 보고 싶으면 선 그래프, 그룹별 크기를 비교하려면 막대그래프, 값의 분포를 보고 싶으면 히스토그램이나 상자그림, 두 숫자 변수의 관계를 보고 싶으면 산점도를 씁니다.

예를 들어 “암 그룹과 정상 그룹의 BRCA1 발현량 분포가 다른가?”라는 질문에는 상자그림이 적절합니다. “유전자 A와 유전자 B 발현량이 함께 증가하는가?”라는 질문에는 산점도가 적절합니다. “샘플 전체의 발현 패턴이 비슷한가?”라는 질문에는 heatmap이나 PCA 그림이 도움이 됩니다.

초보자가 자주 하는 오해는 산점도에서 두 값이 함께 움직인다는 이유만으로 원인관계라고 말하는 것입니다. 상관관계는 원인관계를 증명하지 않습니다. 또 축 이름과 단위가 없는 그래프는 독자가 무엇을 보는지 알 수 없게 만듭니다.

생물정보학에서 시각화는 결과 발표용 장식이 아니라 품질관리 도구입니다. 이상치 샘플, 배치 효과, 특정 그룹의 분리, 데이터 분포의 치우침을 그래프로 먼저 발견하는 경우가 많습니다.

미니 실습 블록: QC 결과를 막대그래프로 저장하기

이 실습은 QC 결과를 막대그래프로 저장하기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, 보고서에서는 화면에 띄운 그림보다 파일로 저장된 재현 가능한 그림이 중요하기 때문입니다.

import matplotlib.pyplot as plt

samples = ["S1", "S2", "S3"]
mapped_reads = [1200000, 950000, 300000]

plt.bar(samples, mapped_reads)
plt.xlabel("sample_id")
plt.ylabel("mapped reads")
plt.title("Mapping result")
plt.tight_layout()
plt.savefig("figures/mapped_reads_barplot.png")

각 코드 요소의 의미를 풀어보면 다음과 같습니다. xlabel, ylabel, title은 그래프 의미를 설명하고, savefig는 그림을 파일로 저장합니다.

생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. mapping rate, read count, detected gene 수 같은 QC 지표를 샘플별로 비교할 때 씁니다.

흔한 오해 또는 주의점도 있습니다. 한 샘플만 낮게 보여도 그래프만으로 원인을 확정하지 말고 FASTQ 품질, reference, batch를 함께 확인해야 합니다.

핵심 정리

시각화는 데이터를 그림으로 바꾸어 패턴을 보는 작업입니다. 선 그래프는 변화, 막대그래프는 범주 비교, 히스토그램은 분포, 산점도는 두 변수 관계, 상자그림은 그룹별 분포, 열지도는 큰 표의 패턴을 보는 데 유용합니다.

문제 풀이

시각화

0 / 40
Gemini AI 채점

주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.

API KEY 미등록
  1. 1. [쉬움] 객관식

    시각화의 의미로 가장 적절한 것은?

    선택지
  2. 2. [코드] 객관식

    matplotlib를 보통 불러오는 코드로 적절한 것은?

    선택지
  3. 3. [보통] 객관식

    히스토그램(histogram)은 무엇을 보는 데 적합한가?

    선택지
  4. 4. [보통] 객관식

    산점도(scatter plot)는 무엇을 보는 데 적합한가?

    선택지
  5. 5. [코드] 객관식

    plt.xlabel("Day")의 역할은?

    선택지
  6. 6. [코드] 객관식

    plt.ylabel("Expression")의 역할은?

    선택지
  7. 7. [코드] 객관식

    plt.title("Cell growth")의 역할은?

    선택지
  8. 8. [보통] 객관식

    막대그래프가 가장 어울리는 상황은?

    선택지
  9. 9. [보통] 객관식

    상자그림(box plot)이 유용한 상황은?

    선택지
  10. 10. [보통] 객관식

    열지도(heatmap)의 설명으로 적절한 것은?

    선택지
  11. 11. [코드] 객관식

    plt.plot(days, cells)는 어떤 그래프를 그리는가?

    선택지
  12. 12. [코드] 객관식

    plt.bar(genes, expression)은 어떤 그래프를 그리는가?

    선택지
  13. 13. [코드] 객관식

    plt.hist(values)의 역할은?

    선택지
  14. 14. [코드] 객관식

    plt.scatter(gene_a, gene_b)의 역할은?

    선택지
  15. 15. [코드] 객관식

    plt.savefig("figure.png", dpi=150)의 역할은?

    선택지
  16. 16. [쉬움] 객관식

    좋은 그래프에 필요한 요소로 가장 적절한 것은?

    선택지
  17. 17. [보통] 객관식

    산점도에서 점들이 오른쪽 위로 올라가는 경향은 무엇을 시사하는가?

    선택지
  18. 18. [쉬움] 객관식

    그래프에 범례(legend)가 필요한 이유는?

    선택지
  19. 19. [쉬움] 객관식

    PCA 그림, heatmap, UMAP 그림은 모두 무엇의 예인가?

    선택지
  20. 20. [보통] 객관식

    시각화를 할 때 조심해야 할 점으로 적절한 것은?

    선택지
  21. 21. [중간] 객관식

    시간에 따른 read 수 변화를 보여주기에 가장 적절한 그래프는?

    선택지
  22. 22. [중간] 객관식

    암/정상 두 그룹의 발현량 분포를 비교하기에 적절한 그래프는?

    선택지
  23. 23. [중간] 객관식

    두 유전자 발현량의 관계를 보고 싶을 때 적절한 그래프는?

    선택지
  24. 24. [중간] 객관식

    산점도에서 두 값이 함께 증가한다는 사실만으로 바로 말하면 안 되는 것은?

    선택지
  25. 25. [중간] 객관식

    값의 분포가 한쪽으로 치우쳤는지 보고 싶을 때 적절한 그래프는?

    선택지
  26. 26. [중간] 객관식

    heatmap이 특히 유용한 상황은?

    선택지
  27. 27. [중간] 객관식

    좋은 그래프에 축 이름과 단위가 필요한 이유는?

    선택지
  28. 28. [중간] 객관식

    생물정보학에서 시각화가 품질관리 도구가 되는 예로 가장 적절한 것은?

    선택지
  29. 29. [실전] 객관식

    plt.savefig('figures/qc.png')의 역할은?

    선택지
  30. 30. [실전] 객관식

    한 샘플의 mapped reads만 매우 낮을 때 가장 적절한 태도는?

    선택지
  31. 주관식 31. [실습] 주관식 · Gemini 채점

    days=[1,2,3], cells=[100,200,400]를 선 그래프로 그리고 축 이름을 붙이는 코드를 작성하라.

  32. 주관식 32. [실습] 주관식 · Gemini 채점

    유전자 이름과 발현량 리스트를 막대그래프로 그리는 기본 코드를 작성하라.

  33. 주관식 33. [실습] 주관식 · Gemini 채점

    히스토그램과 산점도의 차이를 설명하라.

  34. 주관식 34. [실습] 주관식 · Gemini 채점

    좋은 그래프에 축 이름이 필요한 이유를 설명하라.

  35. 주관식 35. [실습] 주관식 · Gemini 채점

    plt.savefig("result.png", dpi=150)가 하는 일을 설명하라.

  36. 주관식 36. [실습] 주관식 · Gemini 채점

    생물정보학에서 시각화가 필요한 이유를 설명하라.

  37. 주관식 37. [실습] 주관식 · Gemini 채점

    연구 질문 3개를 만들고 각각 어떤 그래프가 적절한지 이유와 함께 설명하라.

  38. 주관식 38. [실습] 주관식 · Gemini 채점

    산점도에서 두 유전자의 발현량이 함께 증가하는 패턴을 보았을 때 바로 원인관계라고 말하면 안 되는 이유를 설명하라.

  39. 주관식 39. [실습] 주관식 · Gemini 채점

    샘플별 read 수 막대그래프를 그리고 figures/read_counts.png로 저장하는 코드를 작성하라.

  40. 주관식 40. [실습] 주관식 · Gemini 채점

    보고서용 생물정보학 그래프가 최소한 갖춰야 할 요소 4가지를 쓰라.