Day008 - 기술통계와 통계적 추론

 Day008 - 기술통계와 통계적 추론

1. 기술통계 : 데이터의 중심과 퍼짐 요약하기

데이터를 숫자 한 두 개로 요약하여 특성을 파악하는 기술통계를 집중적으로 학습했다.

Box Plot 해부도


(1) 대표값과 산포도, 그리고 이상치

- 대표값 : 산술평균, 중앙값, 최빈값, 절사평균, 이상치가 존재할 때는 평균보다 중앙값이 분포의 중심을 더 잘 반영함을 확인했다.

- 산포도 : 분산, 표준편차, IQR, 변동개수(CV), 특히 변동계수($CV = \frac{std}{mean} \times 100$)를 사용하면 단위가 전혀 다른 변수 간 퍼짐 정도를 객관적으로 비교할 수 있었다.

# 연비의 산포도 지표들

x = mpg['mpg']
print('범위(range)      :', round(x.max() - x.min(), 2))
print('IQR              :', round(stats.iqr(x), 3))
print('표본분산(ddof=1) :', round(x.var(ddof=1), 3))
print('모분산(ddof=0)   :', round(x.var(ddof=0), 3), '  ← n으로 나눠 조금 작다')
print('표준편차(ddof=1) :', round(x.std(ddof=1), 3))

# 단위가 다른 세 변수를 변동계수(CV)로 비교
print('\n[변동계수 — 단위를 지운 상대적 퍼짐]')
for col in ['mpg', 'weight', 'acceleration']:
    values = mpg[col]
    cv = values.std(ddof=1) / values.mean() * 100
    print(f'  {col:13s}: 표준편차 {values.std(ddof=1):8.2f} → 변동계수 {cv:5.1f}%')
연비의 산포도

- 이상치 탐지 : IQR의 1.5배 경계선 규칙Z-score(|Z| > 3) 기준을 사용해 튀는 값을 정밀하게 걸러내는 실습을 진행했다.

# 변동계수(CV) 계산 및 IQR 이상치 제거
import pandas as pd
mpg = pd.read_csv('data/mpg.csv')
cv = mpg['mpg'].std() / mpg['mpg'].mean() * 100

q1, q3 = mpg['mpg'].quantile(0.25), mpg['mpg'].quantile(0.75)
iqr = q3 - q1
cleaned_mpg = mpg[(mpg['mpg'] >= q1 - 1.5*iqr) & (mpg['mpg'] <= q3 + 1.5*iqr)]

2. 통계적 추론 : 확률분포와 정규성 검정

표본 데이터를 통해 보지 못한 전체 모집단의 특성을 추측하는 통계적 추론의 기초를 다졌다.

(1)정규분포의 이해와 가설검정의 출발

- 확률분포 : 연속형 데이터의 대표인 정규분포와 68-95-99.7 법칙을 익혔다.

- Z-score : 서로 다른 스케일의 데이터를 평균 0, 표준편차 1로 표준화하여 정규화하는 법을 배웠다.

- 정규성 검정 : 히스토그램, Q-Q Plot, 왜도/첨도 지표를 통해 데이터가 정규분포를 따르는지 진단했다.

# 정규성 확인 3종 세트 — 연비(mpg)와 가속(acceleration) 을 견줘 본다
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
for j, col in enumerate(['mpg', 'acceleration']):
    s = mpg[col].dropna()
    m, sd = s.mean(), s.std(ddof=1)

    # ① 히스토그램 + 정규곡선 — 종 모양과 얼마나 닮았나
    ax = axes[0, j]
    sns.histplot(s, bins=25, stat='density', color='#7fb3d5', ax=ax)
    xs = np.linspace(s.min(), s.max(), 200)
    ax.plot(xs, stats.norm.pdf(xs, m, sd), color='crimson', linewidth=2, label='정규곡선')
    ax.set_title(col + ' — 히스토그램 vs 정규곡선')
    ax.legend()

    # ② Q-Q Plot — 점이 직선에 붙을수록 정규에 가깝다
    ax = axes[1, j]
    (_, _), (_, _, r) = stats.probplot(s, dist='norm', plot=ax)
    ax.set_title(col + ' — Q-Q Plot (직선성 R\u00b2=%.4f)' % r**2)
plt.tight_layout()
plt.show()

# ③ 왜도·첨도 + 68-95-99.7 실측 대조
for col in ['mpg', 'acceleration']:
    s = mpg[col].dropna()
    m, sd = s.mean(), s.std(ddof=1)
    within1 = (abs(s - m) <= sd).mean()
    within2 = (abs(s - m) <= 2 * sd).mean()
    fmt = '%-13s 왜도=%+.3f  첨도=%+.3f  ±1σ 실제 %.1f%% (이론 68.3%%)  ±2σ 실제 %.1f%% (이론 95.4%%)'
    print(fmt % (col, stats.skew(s), stats.kurtosis(s), within1 * 100, within2 * 100))

print('\n가속(acceleration)은 세 지표가 모두 정규에 가깝습니다 — Q-Q 점들이 거의 직선(R²≈0.99).')
print('연비(mpg)는 왜도가 +0.46 으로 오른쪽으로 치우쳐, Q-Q 곡선이 전체적으로 위로 볼록하게 휩니다.')
print('특히 왼쪽 끝이 직선보다 뚜렷하게 위에 있죠 — 정규분포라면 있어야 할 \'아주 낮은 연비\' 차가')
print('실제로는 없다는 뜻입니다. 그래서 ±1σ 안에 63.1% 만 들어옵니다(이론 68.3%).')

히스토그램, Q-Q Plot
코드 실행 결과


단순히 describe() 명령어로 평균만 확인하던 방식에서 벗어나, 이상치의 영향력과 데이터 퍼짐을 왜도·첨도·CV로 다각도 분석하는 기술을 익혔다. 내일 배울 가설검정과 추론통계의 기초를 배우는 하루였다.


#데이터분석 #기술통계 #통계적추론 #정규분포 #이상치탐지 #엔코아AI캠퍼스 #DataAnalysis #DescriptiveStatistics #StatisticalInference #NormalDistribution #OutlierDetection #SKNetworks #TIL

댓글

이 블로그의 인기 게시물

[SK네트웍스 family 엔코아AI캠퍼스] 나의 목표는 머신러닝 엔지니어다.

[SK네트웍스 패밀리 엔코어AI캠퍼스] AI 머신러닝 캠프 1기_7월 3주차 회고

[SK네트웍스 패밀리 엔코어AI캠퍼스] AI 머신러닝 캠프 1기_7월 4주차 회고