목록으로

분포 시각화와 이상치

히스토그램, ECDF, box plot, violin plot으로 분포를 읽고 이상치를 자동 삭제하지 않고 원인·민감도 분석으로 판단하는 실전 절차를 설명합니다.

입문
|
25
|
검증 완료 (2026-08-07)
BioStatPy이상치 처리분포 시각화box plotPython ECDF
진행률0/33 (0%)

분포 시각화와 이상치

이 토픽을 마치면

히스토그램, 점 그래프, 상자그림이 각각 어떤 정보를 보여주는지 설명할 수 있습니다. 눈에 띄는 관측값을 곧바로 오류나 제거 대상으로 분류하지 않고, 데이터 품질 점검과 연구 질문의 재검토에 연결할 수 있습니다.

출발점: 평균표에 보이지 않는 것

stat-004에서 중심과 산포를 계산했습니다. 그러나 요약표는 값의 순서와 밀집 정도를 압축합니다. 두 조건의 평균과 IQR이 비슷해도 한쪽에 여러 봉우리나 긴 꼬리가 있을 수 있습니다.

시각화의 목적은 “예쁜 그림”을 만드는 데 있지 않습니다. 한 행의 의미와 측정 단위를 유지한 채, 값의 분포·그룹 차이·누락·비정상적인 범위를 눈으로 점검하는 것입니다.

세 가지 그림의 질문

점 그래프

각 관측값을 점으로 표시하면 실제 데이터의 개수와 위치를 확인할 수 있습니다. 표본이 많지 않을 때 점 하나가 하나의 분석 단위인지, 기술적 반복인지 설명하기 좋습니다. 점이 겹치면 임의로 퍼뜨리는 jitter를 사용할 수 있지만, 퍼뜨린 위치가 새 측정값을 뜻하지 않는다는 설명이 필요합니다.

히스토그램

값의 구간별 빈도를 보여줍니다. 구간 폭에 따라 모양이 달라질 수 있으므로, 특정 모양을 자연의 고정된 구조로 해석하지 않습니다. 긴 꼬리, 비어 있는 구간, 여러 봉우리의 가능성을 탐색하는 출발점으로 사용합니다.

상자그림

중앙값, 사분위수, 범위와 함께 극단적으로 떨어진 점을 요약합니다. 상자그림의 바깥 점은 “제거해야 할 오류”라는 판정이 아닙니다. 해당 규칙에서 멀리 떨어진 관측이라는 시각적 신호입니다.

Python으로 분포를 그리기

아래 코드는 stat-004와 같은 자체 합성 구조를 사용합니다. 시각화에 들어가기 전에 conditionoutcome의 자료형, 결측, 분석 단위를 확인해야 합니다.

python
import matplotlib.pyplot as plt
import seaborn as sns
fig, axes = plt.subplots(1, 2, figsize=(9, 3.5))
sns.stripplot(data=data, x="condition", y="outcome", ax=axes[0])
sns.boxplot(data=data, x="condition", y="outcome", ax=axes[1])
axes[0].set_title("individual observations")
axes[1].set_title("distribution summary")
fig.tight_layout()

이 코드는 data가 앞 편에서 만든 DataFrame이라는 전제에서 실행됩니다. 점 그래프는 개별 값의 위치를, 상자그림은 분포의 요약과 떨어진 점을 보여줍니다. 축 이름과 임의 단위는 실제 데이터 계약에 맞게 바꿔야 합니다. 이미지 파일을 만들었다면 생성 코드·환경·입력 hash를 manifest에 기록합니다.

히스토그램을 추가할 때도 같은 원칙을 적용합니다.

python
fig, ax = plt.subplots(figsize=(5, 3.5))
sns.histplot(
data=data,
x="outcome",
hue="condition",
bins=8,
element="step",
stat="count",
common_norm=False,
ax=ax,
)
ax.set_xlabel("outcome (arbitrary unit)")
ax.set_ylabel("number of observations")
fig.tight_layout()

bins의 선택은 보이는 모양에 영향을 줍니다. 따라서 구간 폭을 바꿔도 유지되는 패턴인지 확인하고, 히스토그램 하나만으로 분포의 본질을 선언하지 않습니다. hue로 그룹을 겹쳐 그릴 때는 색만으로 분석 단위나 표본 수를 숨기지 않도록 범례와 관측 수를 함께 제공합니다.

시각화 결과는 이미지보다 생성 조건이 중요합니다. 그림의 제목, 축 단위, 사용한 subset, 결측 제외 규칙, 그룹별 관측 수를 기록해야 다른 사람이 같은 그림을 재생성할 수 있습니다.

이상치를 발견한 뒤의 순서

눈에 띄는 값을 발견하면 먼저 데이터를 삭제하지 않고 기록을 확인합니다.

  1. 값의 행 ID와 분석 단위를 확인합니다.
  2. 입력·변환·측정 로그에 해당 값이 존재하는지 봅니다.
  3. 단위, 소수점, 날짜, 그룹 라벨이 맞는지 점검합니다.
  4. 측정 오류라면 수정 근거와 원본을 보존합니다.
  5. 실제 변동이라면 임의 삭제 대신 포함 기준과 민감도 분석을 기록합니다.

이 순서는 특정 값이 이상하다는 시각적 판단을 연구 기록과 연결합니다. “상자 밖이면 제거”라는 규칙은 관측값의 원인을 설명하지 못합니다.

민감도 분석으로 판단을 분리하기

측정 로그를 확인해도 값의 처리 여부가 결정되지 않는 경우가 있습니다. 그때는 원자료를 보존한 채, 사전에 정한 규칙으로 포함한 결과와 별도 규칙을 적용한 결과를 비교할 수 있습니다. 이 비교는 어느 결과가 “진짜”인지 자동으로 고르는 장치가 아니라, 결론이 특정 관측에 얼마나 의존하는지 드러내는 방법입니다.

단, 민감도 분석을 하면서 결과가 더 좋아 보이는 규칙만 선택하면 분석의 목적이 바뀝니다. 제외 기준, 적용 이유, 결과 차이를 함께 기록하고, 어떤 기준이 연구 질문에 부합하는지 설명해야 합니다.

반복 구조를 그림에 표시하기

동일한 biological replicate에서 여러 technical replicate가 나왔다면, 모든 점을 같은 독립 표본처럼 표현하지 않습니다. 상위 단위별 연결선, 색상, facet 또는 요약 표시를 사용할 수 있지만, 시각적 장식이 독립성의 구조를 대신하지는 않습니다. 그림 설명에 “점 하나가 무엇을 뜻하는가”를 적는 것이 먼저입니다.

연구 질문으로 돌아가 해석하기

분포 시각화는 조건별 데이터가 어떤 형태로 관측됐는지 질문을 더 구체화합니다. 중심 차이가 모든 구간에서 나타나는지, 일부 값이 결과를 끌어가는지, 측정 단위가 섞였는지 확인할 수 있습니다.

그러나 그림 하나로 조건의 인과 효과나 생물학적 중요성을 확정하지 않습니다. 시각화는 품질과 가설을 점검하는 단계이며, 독립성·불확실성·연구설계를 대신하지 않습니다.

그림을 읽는 순서

그림을 만들고 바로 차이를 말하지 않습니다. 다음 순서로 읽습니다.

  1. 축의 단위와 변환을 확인합니다.
  2. 각 점이 어떤 분석 단위인지 확인합니다.
  3. 조건별 관측 수와 결측을 확인합니다.
  4. 중심, 퍼짐, 꼬리, 여러 봉우리의 가능성을 나눠 봅니다.
  5. 특정 점이 결과에 미치는 영향을 원자료와 기록에서 확인합니다.

이 순서는 시각적 인상을 데이터 계약과 연결합니다. 예를 들어 B 그룹의 상자그림이 더 넓어 보여도, B의 관측 수가 적거나 일부 단위가 빠졌다면 동일한 조건의 비교로 읽기 전에 그 사실을 기록해야 합니다. 그룹 간 색 대비는 해석을 돕지만, 색만으로 조건의 의미·순서·우월성을 전달하지 않습니다.

접근성과 보고

색상만으로 그룹을 구분하면 색각 특성이나 흑백 출력에서 정보가 사라질 수 있습니다. 범례의 텍스트, 축 라벨, 점 모양 또는 패널 구분을 함께 사용합니다. 이미지 설명에는 데이터가 무엇을 의미하는지, 점 하나의 단위가 무엇인지, 처리하지 않은 관측을 포함했는지 적습니다.

그래프를 보고서에 넣을 때는 그림 파일만 복사하지 않고 생성 코드와 데이터 버전을 연결합니다. 같은 파일명으로 다른 subset을 그리지 않도록 figure_id, 입력 hash, 코드 버전, 생성 시점을 기록합니다. 시각화도 분석 산출물이므로 provenance의 일부입니다.

그림에서 말할 수 없는 것

분포가 한쪽으로 기울었다는 관찰은 “왜 기울었는가”라는 기전을 제공하지 않습니다. 한 조건의 값이 더 넓게 퍼졌다는 관찰도 변동 원인이 생물학적인지, 측정 과정인지, batch 구성 때문인지 알려주지 않습니다. 그림의 관찰과 원인에 대한 설명을 같은 문장으로 쓰지 않습니다.

또한 두 상자그림이 겹친다는 이유만으로 조건이 같다고 결론내리지 않습니다. 겹침은 시각적 범위의 관계를 보여줄 뿐이며, 연구 질문에 필요한 효과크기·불확실성·설계 판단은 별도의 분석이 필요합니다. 반대로 상자가 떨어져 보인다고 해서 인과 효과가 확정되는 것도 아닙니다.

그림을 저장할 때에는 다음 메타데이터를 함께 기록합니다.

항목기록 예
figure_idstat-005-eda-01
input합성 DataFrame, 생성 규칙 버전
unit한 행의 분석 단위
missing_rule결측 제외 또는 없음
group_rulecondition의 허용값
code_version실행한 원고 commit 또는 hash

이 기록은 시각적 결과를 나중에 다시 보고, 어떤 전제에서 만들어졌는지 확인하기 위한 것입니다.

자주 생기는 실패와 점검법

  • 축을 자르거나 단위를 숨겨 차이를 과장하지 않습니다.
  • jitter의 가상 위치를 실제 측정값으로 읽지 않습니다.
  • 상자그림 바깥 점을 자동으로 제거하지 않습니다.
  • 기술적 반복과 biological replicate를 같은 색의 독립 점으로 표시하지 않습니다.
  • 그룹별 관측 수와 결측 수를 그림 설명에서 숨기지 않습니다.

핵심 정리

  • 점 그래프는 개별 관측, 히스토그램은 구간별 빈도, 상자그림은 분포 요약을 보여줍니다.
  • 이상치는 삭제 명령이 아니라 기록·측정·변환을 재확인하라는 신호입니다.
  • 시각화에는 축, 단위, 관측단위, 결측과 반복의 의미가 필요합니다.
  • 그림은 데이터 품질과 질문을 점검하지만 인과 결론을 자동으로 만들지 않습니다.

다음 토픽으로

다음 편에서는 결측·중복·변환을 다룹니다. 그림에서 발견한 빈칸과 비정상 범위를 어떤 가정과 기록으로 처리할지 연결합니다.

참고 자료

본 편의 시나리오와 시각화 코드는 BioStatPy가 독립적으로 작성한 교육용 구성입니다.

💬 질문과 댓글

0개의 댓글

로그인 없이 작성할 수 있습니다. 비로그인 댓글은 작성 후 직접 수정·삭제할 수 없습니다.

0/2000

로딩 중...