0Pricing
Pandas & NumPy Academy · 강의

단변량 분석

각 열을 독립적으로 분석합니다. 수치형 열은 분포를, 범주형 열은 값의 개수를 그리고 이상값과 왜도를 확인합니다.

단변량 분석은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

단변량 분석이란 무엇인가요?

단변량 분석은 열 간의 관계를 고려하지 않고 한 번에 하나의 열만 따로 분석합니다. 목표는 모델링을 시작하기 전에 각 변수의 분포를 이해하고, 이상치를 탐지하며, 왜도를 확인하고, 데이터 품질 문제를 찾는 것입니다. 단변량 분석 방법은 수치형 열과 범주형 열에 따라 다릅니다. 수치형 열에는 분포 도표와 요약 통계가 필요하고, 범주형 열에는 빈도와 비율이 필요합니다.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()

print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)

수치형 열의 히스토그램

각 수치형 열의 분포 형태를 확인하려면 열마다 히스토그램을 그리세요. 대칭성과 왜도(한쪽으로 치우친 꼬리), 봉우리 개수(하나인지 여러 개인지), 그리고 명백한 이상 현상(양 끝에 있으며 현실적으로 타당해 보이지 않는 값)을 살펴보세요. Pandas에서는 df.hist()를 사용하면 반복문을 작성하지 않고도 여러 열의 히스토그램을 빠르게 격자로 만들 수 있지만, 개별 열을 더 세밀하게 조정하려면 Seaborn의 histplot이 좋습니다.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()

수치형 열의 요약 통계

각 수치형 열에 대해 mean과 median을 계산하고 비교하세요. mean이 median보다 크게 높으면 분포가 오른쪽으로 치우친 것입니다(오른쪽 꼬리가 길며, 소득과 가격 데이터에서 흔합니다). mean이 median보다 작으면 왼쪽으로 치우친 것입니다. 또한 mean에 대한 표준편차도 확인하세요. 음수가 아닌 변수에서 std가 mean보다 크다면 변동성이 높거나 이상치가 있다는 신호입니다. df.skew()로 왜도를 직접 계산할 수 있습니다.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

summary = pd.DataFrame({
    'mean': numeric.mean(),
    'median': numeric.median(),
    'std': numeric.std(),
    'skewness': numeric.skew(),
    'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)

print(summary)

이상치 탐지를 위한 상자 그림

상자 그림은 수치형 열의 이상치를 찾는 가장 빠른 시각화 도구입니다. 수염 바깥에 있는 모든 점( Q1 또는 Q3에서 1.5×IQR을 벗어난 값)은 개별적으로 표시되며 잠재적인 이상치로 표시됩니다. 이상치가 많이 나타나는 열은 조사해야 합니다. 데이터 입력 오류인지, 실제로 극단적인 값인지, 아니면 정규분포가 아님을 보여주는 증거인지 확인하세요. 상자 그림은 상자 안에서 median이 비대칭적으로 위치하는 모습을 통해 오른쪽 또는 왼쪽 왜도도 보여 줍니다.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 3, figsize=(14, 5))

for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
    df[[col]].boxplot(ax=ax)
    ax.set_title(f'Box Plot: {col}')

plt.tight_layout()
plt.show()

IQR 기반 이상치 개수

IQR (사분위 범위) 방법에서는 Q1 - 1.5×IQR보다 작거나 Q3 + 1.5×IQR보다 큰 값을 이상치로 정의합니다. 이를 프로그래밍 방식으로 계산하면 도표를 그리지 않고도 모든 수치형 열의 이상치 개수를 세고 확인할 수 있습니다. 이는 차트를 생성하는 대신 이상치 개수를 기록해야 하는 자동화된 처리 과정에서 유용합니다. 이상치를 어떻게 처리할지(제거, 상한값 적용, 표시)는 도메인 지식을 바탕으로 신중하게 결정해야 합니다.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])

범주형 열의 값 개수

각 범주형 열에 value_counts()를 호출하여 관측값이 범주별로 어떻게 분포하는지 확인하세요. 항상 다음을 점검해야 합니다. 특정 하나의 범주가 지배적입니까(>80%)? 이는 분류 작업에서 클래스 불균형을 일으킵니다. 관측값이 1~2개뿐인 희귀 범주(오타나 데이터 입력 오류)가 있습니까? 분포가 비즈니스의 예상과 일치합니까(예: '국가' 열에서 예상하지 못한 국가의 주문이 대부분을 차지하는 경우)?

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

for col in ['sex', 'embarked', 'class', 'who']:
    counts = df[col].value_counts(dropna=False)
    pct = (counts / len(df) * 100).round(1)
    result = pd.DataFrame({'count': counts, 'pct%': pct})
    print(f'\n--- {col} ---')
    print(result)

범주형 변수의 막대 차트

sns.countplot을 사용하거나 value_counts().plot(kind='bar')를 호출하여 범주형 값 개수를 막대 차트로 시각화하세요. 막대를 빈도가 높은 순서에서 낮은 순서로 정렬하면 보는 사람이 지배적인 범주를 즉시 파악할 수 있습니다. 이진 변수(예/아니요, 남성/여성)에는 원형 차트를 사용해도 되지만, 범주가 3개를 넘으면 막대 차트가 항상 더 명확합니다. 범주 이름이 길 때는 눈금 레이블을 45도 회전하세요.

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(12, 5))

sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')

sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')

plt.tight_layout()
plt.show()

왜도 확인 및 변환 적용

오른쪽으로 크게 치우친 수치형 열(왜도 > 1.5)은 더 대칭적인 형태로 만들기 위해 로그 변환을 적용하면 좋은 경우가 많습니다. 이는 정규성을 가정하는 많은 통계 검정과 일부 ML 알고리즘에서 중요합니다. np.log1p()(log(x+1), 0 근처의 값에도 안전함)를 적용한 다음 왜도를 다시 확인하세요. 변환 전후의 히스토그램을 비교하여 분포가 종 모양에 가까워졌는지 확인하세요.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

df = sns.load_dataset('titanic')

fig, axes = plt.subplots(1, 2, figsize=(10, 4))

sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')

log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')

plt.tight_layout()
plt.show()

분산이 0인 열 확인

분산이 0인 열(모든 값이 동일함)은 어떤 모델에도 정보를 제공하지 않으므로 삭제해야 합니다. 분산이 거의 0인 열(행의 99%가 같은 값을 가짐)도 마찬가지로 쓸모가 없습니다. df.var()로 분산을 계산하고 필터링하세요. 또한 nunique() == len(df)인 열도 확인하세요. 이러한 열은 feature로 사용해서는 안 되는 ID 열일 가능성이 높지만, 행 식별자로는 유용할 수 있습니다.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)

# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)

# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)

단변량 분석 자동화 반복문

각 열에 대해 같은 분석을 수동으로 반복하는 대신, 모든 수치형 열을 순회하며 핵심 통계를 구조화된 형식으로 출력하는 반복문을 작성하세요. 그러면 수십 개의 열을 빠르게 훑어보고 추가로 확인해야 할 열을 표시하기 쉽습니다. 출력 결과는 데이터가 모델링에 사용되기 전에 이해관계자가 검토할 수 있도록 처리 과정 감사 기록의 일부로 CSV 파일에 저장할 수 있습니다.

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')

rows = []
for col in numeric.columns:
    s = df[col]
    Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
    IQR = Q3 - Q1
    n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
    rows.append({
        'column': col,
        'missing_pct': round(s.isna().mean() * 100, 1),
        'mean': round(s.mean(), 2),
        'std': round(s.std(), 2),
        'skew': round(s.skew(), 2),
        'outliers': int(n_outliers)
    })

report = pd.DataFrame(rows)
print(report.to_string(index=False))

단변량 분석 결과 문서화

단변량 분석을 완료한 후에는 결과를 체계적으로 문서화하세요. 각 열에 대해 분포 형태(치우침, 두 봉우리, 대체로 정규분포), 결측값 비율과 계획한 대치 전략, 이상치 개수와 처리 결정(상한값 적용, 제거, 표시), 그리고 도메인 확인이 필요한 의심스러운 값을 기록하세요. 이 문서는 정제 단계를 안내하고 나중에 결정이 잊히거나 이의를 제기받지 않도록 보호하는 데이터 품질 기록이 됩니다.

빠른 확인

이 단원에서 배운 단변량 분석에 대한 이해도를 확인해 보세요.

단원 요약

이 단원에서는 히스토그램으로 수치형 열의 분포 형태를 확인하고, 상자 그림과 IQR 경계로 이상치를 식별하며, value_counts로 범주형 열의 범주별 빈도를 확인하는 방법을 배웠습니다. 이러한 검사를 반복문으로 자동화하면 재사용 가능한 품질 보고서를 만들 수 있습니다. 다음 단원에서는 이변량 분석과 상관관계 분석을 살펴보며, 열 쌍 사이의 관계를 이해해 보겠습니다.

자주 묻는 질문

“단변량 분석” 강의는 무료인가요?

네 — “단변량 분석” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“단변량 분석”에서 뭘 배우나요?

각 열을 독립적으로 분석합니다. 수치형 열은 분포를, 범주형 열은 값의 개수를 그리고 이상값과 왜도를 확인합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“단변량 분석” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 데이터 세트 프로파일링 점검표
  2. 단변량 분석
  3. 이변량 및 상관 분석
  4. 보고서에서 결과 요약하기
← Pandas & NumPy Academy(으)로 돌아가기