* 본 블로그 포스트에서 사용된 표, 이미지 및 기타 관련 자료는 "PROBABILITY AND STATISTICAL INFERENCE 9th Edition"에서 발췌한 것입니다. 이 자료들은 내용을 요약하고 이해를 돕기 위한 참고용으로 제공됩니다. 또한, 해석 과정에서 일부 오류가 있을 수 있으니 원본을 참고하여 확인하시기 바랍니다
1. 이론 정리
1) 탐색적 자료 분석(EDA)의 개념
탐색적 자료 분석(Exploratory Data Analysis, EDA)은 데이터를 시각적으로 표현하고 기본적인 통계를 계산하여 데이터의 구조를 이해하는 과정이다. 이를 통해 데이터의 분포, 중심 경향, 변동성, 이상치(outlier) 등을 파악할 수 있다.
EDA는 주로 다음과 같은 기법을 사용한다.
- 줄기-잎 그림(stem-and-leaf plot): 데이터를 정렬하고 분포를 시각적으로 표현하는 기법.
- 다섯 숫자 요약(five-number summary): 최소값, 제1사분위수(Q1), 중앙값(median), 제3사분위수(Q3), 최대값을 포함하는 요약.
- 상자-수염 그림(box-and-whisker plot, box plot): 데이터의 분포와 이상치를 한눈에 보여주는 도표.
- 히스토그램(histogram): 데이터의 분포를 막대 그래프로 표현한 것.
EDA의 주요 목표는 데이터의 특성을 시각적으로 이해하고, 이상치나 왜곡된 분포를 발견하여 적절한 통계적 분석 방법을 결정하는 것이다.
2) 줄기-잎 그림 (Stem-and-Leaf Display)
줄기-잎 그림은 John W. Tukey가 제안한 기법으로, 데이터를 작은 그룹으로 나누고 정렬하여 쉽게 해석할 수 있도록 한다.
(1) 구성 방법
- 데이터의 각 숫자를 두 부분으로 분리하여 표현한다.
- 줄기(stem): 숫자의 앞자리(십의 자리 등)를 사용.
- 잎(leaf): 숫자의 마지막 자리(일의 자리 등)를 사용.
(2) 예제
50명의 학생 시험 점수 데이터를 줄기-잎 그림으로 표현해보자.
```
34, 38, 42, 42, 45, 47, 51, 52, 54, 57, 58, 58, 59, 60, 61, 63, 65, 65, 66, 67,
68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 76, 77, 79, 81, 81, 82, 83,
83, 84, 84, 85, 87, 89, 90, 91, 93, 93, 97, 95
```
줄기 | 잎
3 | 4 8
4 | 2 2 5 7
5 | 1 2 4 7 8 8 9
6 | 0 1 3 5 5 6 7 8 9 9
7 | 0 1 1 2 3 3 4 5 5 6 6 7 9
8 | 1 1 2 3 3 4 4 5 7 9
9 | 0 1 3 3 7 5
# Python code
import numpy as np
# 데이터 정의
data = [34, 38, 42, 42, 45, 47, 51, 52, 54, 57, 58, 58, 59, 60, 61, 63, 65, 65,
66, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 76, 77, 79,
81, 81, 82, 83, 83, 84, 84, 85, 87, 89, 90, 91, 93, 93, 97, 95]
# 줄기-잎 딕셔너리 생성
stem_leaf = {}
for num in sorted(data):
stem = num // 10 # 십의 자리 (줄기)
leaf = num % 10 # 일의 자리 (잎)
if stem in stem_leaf:
stem_leaf[stem].append(leaf)
else:
stem_leaf[stem] = [leaf]
# 출력
print("줄기 | 잎")
for stem, leaves in stem_leaf.items():
print(f"{stem} | {' '.join(map(str, leaves))}")
# R code
# 데이터 정의
data <- c(34, 38, 42, 42, 45, 47, 51, 52, 54, 57, 58, 58, 59, 60, 61, 63, 65, 65,
66, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 76, 77, 79,
81, 81, 82, 83, 83, 84, 84, 85, 87, 89, 90, 91, 93, 93, 97, 95)
# 줄기-잎 그림 출력
stem(data)
- 데이터 분포와 중심 위치를 쉽게 파악할 수 있음.
- 히스토그램과 유사하지만 원본 데이터를 그대로 유지한다.
3) 다섯 숫자 요약 (Five-Number Summary)
데이터의 전반적인 분포를 나타내는 다섯 가지 숫자로 요약한다.
- 최소값 (Minimum): 가장 작은 데이터 값.
- 제1사분위수 (Q1, 25th percentile): 데이터의 하위 25% 지점.
- 중앙값 (Median, Q2, 50th percentile): 데이터를 절반으로 나누는 값.
- 제3사분위수 (Q3, 75th percentile): 데이터의 상위 25% 지점.
- 최대값 (Maximum): 가장 큰 데이터 값.
(1) 예제
100개의 불소 농도 데이터에서 다섯 숫자 요약을 구하면 다음과 같다.
```
최소값: 0.85
제1사분위수 (Q1): 0.89
중앙값 (Q2): 0.92
제3사분위수 (Q3): 0.97
최대값: 1.06
```
- 이러한 값은 상자-수염 그림을 만들 때 사용된다.
4) 상자-수염 그림(Box-and-Whisker Plot)
상자-수염 그림(Box plot)은 다섯 숫자 요약을 바탕으로 데이터를 시각적으로 표현하는 방법이다.
(1) 구성 요소
- 상자(Box): Q1에서 Q3까지를 연결하며, 길이는 IQR(Interquartile Range, Q3 - Q1)을 나타냄.
- 중앙선(Line inside box): 중앙값(Q2)을 나타냄.
- 수염(Whisker): 상자의 양 끝에서 최소값과 최대값까지 연결됨.
- 이상치(Outlier): IQR을 기준으로 이상값을 감지하여 점으로 표시.
(2) 이상치 탐색 방법
이상치를 정의하는 Tukey의 방법:
- 내부 울타리(inner fence): Q1 - 1.5×IQR 및 Q3 + 1.5×IQR을 초과하는 값은 의심스러운 이상치.
- 외부 울타리(outer fence): Q1 - 3×IQR 및 Q3 + 3×IQR을 초과하는 값은 강한 이상치.
(3) 예제
불소 농도 데이터의 상자-수염 그림:
```
Q1 = 0.89, Q3 = 0.97, IQR = 0.08
내부 울타리: 0.89 - 1.5(0.08) = 0.77, 0.97 + 1.5(0.08) = 1.09
외부 울타리: 0.89 - 3(0.08) = 0.65, 0.97 + 3(0.08) = 1.21
```
0.77 미만 또는 1.09 초과하는 데이터는 이상치로 간주.
2. 예제
1) 문제
(1) 문제 1
다음은 20명의 학생이 받은 시험 점수이다.
```
52, 63, 71, 84, 90, 95, 78, 65, 72, 88, 91, 55, 60, 73, 80, 85, 92, 67, 69, 83
```
(a) 다섯 숫자 요약을 계산하시오.
(b) 상자-수염 그림을 그리시오.
(2) 문제 2
다음은 30개의 제품 무게(단위: g)이다.
```
100.2, 101.5, 103.7, 99.8, 105.6, 102.4, 101.8, 99.2, 104.3, 100.9,
102.1, 101.7, 103.5, 100.5, 99.7, 104.1, 101.2, 102.6, 100.3, 103.8,
101.4, 99.5, 103.2, 102.8, 100.7, 104.5, 101.9, 102.3, 99.9, 103.1
```
(a) 히스토그램을 작성하시오.
(b) 이상치를 찾으시오.
2) 답
(1) 문제 1
(a) 다섯 숫자 요약
- 최소값 (Min): 52
- 제1사분위수 (Q1, 25%): 69
- 중앙값 (Q2, 50%): 78.5
- 제3사분위수 (Q3, 75%): 88.5
- 최대값 (Max): 95
(b) 상자-수염 그림
- IQR(사분위 범위) = Q3 - Q1 = 88.5 - 69 = 19.5
- 내부 울타리 = [69 - 1.5(19.5), 88.5 + 1.5(19.5)] = [39.75, 117.75]
- 외부 울타리 = [69 - 3(19.5), 88.5 + 3(19.5)] = [10.5, 147]
- 이상치 없음 (모든 데이터가 내부 울타리 안에 존재)
(2) 문제 2
(a) 히스토그램
제품 무게 데이터의 분포를 시각화하여 확인. 하기 R, Python code 참조
(b) 이상치 탐색
- 다섯 숫자 요약
- Min = 99.2
- Q1 = 100.7
- Q2 (Median) = 101.85
- Q3 = 103.2
- Max = 105.6
- IQR 계산 = Q3 - Q1 = 103.2 - 100.7 = 2.5
- 이상치 범위
- 내부 울타리: [100.7 - 1.5(2.5), 103.2 + 1.5(2.5)] = [96.95, 106.95]
- 이상치 없음 (모든 값이 내부 울타리 안에 존재)
# R code
# 문제 1
data <- c(52, 63, 71, 84, 90, 95, 78, 65, 72, 88, 91, 55, 60, 73, 80, 85, 92, 67, 69, 83)
# 다섯 숫자 요약
summary(data)
# Box Plot
boxplot(data, main="시험 점수 Box Plot")
# 문제 2
data <- c(100.2, 101.5, 103.7, 99.8, 105.6, 102.4, 101.8, 99.2, 104.3, 100.9,
102.1, 101.7, 103.5, 100.5, 99.7, 104.1, 101.2, 102.6, 100.3, 103.8,
101.4, 99.5, 103.2, 102.8, 100.7, 104.5, 101.9, 102.3, 99.9, 103.1)
# 히스토그램
hist(data, breaks=7, col="lightblue", main="제품 무게 히스토그램", xlab="무게 (g)")
# Python code
# 문제 1
import numpy as np
import matplotlib.pyplot as plt
data = [52, 63, 71, 84, 90, 95, 78, 65, 72, 88, 91, 55, 60, 73, 80, 85, 92, 67, 69, 83]
# 다섯 숫자 요약
Q1 = np.percentile(data, 25)
Q2 = np.median(data)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1
min_val = min(data)
max_val = max(data)
print(f"최소값: {min_val}, Q1: {Q1}, 중앙값: {Q2}, Q3: {Q3}, 최대값: {max_val}")
# Box Plot
plt.boxplot(data)
plt.title("시험 점수 Box Plot")
plt.show()
# 문제 2
import numpy as np
import matplotlib.pyplot as plt
data = [100.2, 101.5, 103.7, 99.8, 105.6, 102.4, 101.8, 99.2, 104.3, 100.9,
102.1, 101.7, 103.5, 100.5, 99.7, 104.1, 101.2, 102.6, 100.3, 103.8,
101.4, 99.5, 103.2, 102.8, 100.7, 104.5, 101.9, 102.3, 99.9, 103.1]
# 히스토그램
plt.hist(data, bins=7, edgecolor='black')
plt.xlabel("무게 (g)")
plt.ylabel("빈도")
plt.title("제품 무게 히스토그램")
plt.show()
3. 연습문제
1) 문제
(1) 문제 1
다음은 어느 도시의 연평균 기온(°C) 데이터이다.
```
11.2, 10.5, 12.3, 13.1, 9.8, 8.5, 14.2, 15.3, 11.9, 10.7
```
(a) 줄기-잎 그림을 작성하시오.
(b) 중앙값과 사분위수를 구하시오.
# Python code
import matplotlib.pyplot as plt
data = [11.2, 10.5, 12.3, 13.1, 9.8, 8.5, 14.2, 15.3, 11.9, 10.7]
# 줄기-잎 그림
stem_leaf = {int(x): [] for x in data}
for x in data:
stem_leaf[int(x)].append(round(x - int(x), 1))
for k, v in sorted(stem_leaf.items()):
print(f"{k} | {' '.join(map(str, v))}")
# 중앙값 및 사분위수 계산
import numpy as np
Q1 = np.percentile(data, 25)
Q2 = np.median(data)
Q3 = np.percentile(data, 75)
print(f"Q1: {Q1}, 중앙값: {Q2}, Q3: {Q3}")
(2) 답
줄기 | 잎
8 | 5
9 | 8
10 | 5 7
11 | 2 9
12 | 3
13 | 1
14 | 2
15 | 3
중앙값(Q2) 계산
데이터 개수 = 10 (짝수 개수이므로 중간 두 값의 평균)
중앙값 = (11.2 + 11.9) / 2 = 11.55
제1사분위수(Q1, 25%) 계산
하위 절반: 8.5, 9.8, 10.5, 10.7, 11.2
Q1 = (10.5 + 10.7) / 2 = 10.6
제3사분위수(Q3, 75%) 계산
상위 절반: 11.9, 12.3, 13.1, 14.2, 15.3
Q3 = (12.3 + 13.1) / 2 = 12.7
# R code
# 데이터 정의
data <- c(11.2, 10.5, 12.3, 13.1, 9.8, 8.5, 14.2, 15.3, 11.9, 10.7)
# 1. 줄기-잎 그림 생성
stem(data)
# 2. 다섯 숫자 요약 (최소값, Q1, 중앙값, Q3, 최대값)
summary(data)
# 개별 사분위수 확인
Q1 <- quantile(data, 0.25)
Q2 <- median(data)
Q3 <- quantile(data, 0.75)
cat("Q1:", Q1, "중앙값:", Q2, "Q3:", Q3, "\n")
# Python code
import numpy as np
# 데이터 정의
data = [11.2, 10.5, 12.3, 13.1, 9.8, 8.5, 14.2, 15.3, 11.9, 10.7]
# 1. 줄기-잎 그림 생성
stem_leaf = {}
for num in sorted(data):
stem = int(num) # 줄기 (정수 부분)
leaf = round(num - stem, 1) * 10 # 잎 (소수 첫째 자리)
if stem in stem_leaf:
stem_leaf[stem].append(int(leaf))
else:
stem_leaf[stem] = [int(leaf)]
print("줄기 | 잎")
for stem, leaves in sorted(stem_leaf.items()):
print(f"{stem} | {' '.join(map(str, leaves))}")
# 2. 중앙값 및 사분위수 계산
Q1 = np.percentile(data, 25)
Q2 = np.median(data)
Q3 = np.percentile(data, 75)
print(f"Q1: {Q1}, 중앙값: {Q2}, Q3: {Q3}")
'통계' 카테고리의 다른 글
| 6.4 Maximum Likelihood Estimation (0) | 2025.01.03 |
|---|---|
| 6.3 Order Statistics (0) | 2025.01.03 |
| 6.1 Point Estimation -Descriptive Statistics (0) | 2025.01.03 |
| 5.9 Distributions of Functionsof Random Variables -Limiting Moment-Generating Functions (2) | 2025.01.03 |
| 5.8 Distributions of Functionsof Random Variables -Chebyshev’s Inequality and Convergence in Probability (0) | 2025.01.03 |