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




댓글
댓글 쓰기