

#티스토리 윈도우 사이즈 맞추기
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
import scipy as sp
import numpy as np
from scipy import stats
1. 마트 홈런볼¶
1-1. 데이터 수집¶
Mart = [1.4, 1.7, 1.5, 1.6, 1.7, 1.2, 1.7, 1.5, 1.6, 1.6,
2.0, 1.8, 1.9, 1.7, 1.6, 1.8, 1.8, 1.6, 1.3, 1.2,
1.5, 1.7, 1.7, 2.0, 1.6]
1-2. 데이터 평균¶
Mart_mu = np.mean(Mart)
Mart_mu
1.6280000000000001
1-3. 데이터 샘플수¶
n_Mart = len(Mart)
1-4. 총 중량¶
np.sum(Mart)
40.7
1-5 히스토그램¶
import matplotlib.pyplot as plt
plt.hist(Mart, alpha=0.5)
(array([2., 1., 1., 3., 0., 6., 6., 3., 1., 2.]),
array([1.2 , 1.28, 1.36, 1.44, 1.52, 1.6 , 1.68, 1.76, 1.84, 1.92, 2. ]),
<BarContainer object of 10 artists>)
1-6 표준편차¶
# 표준편차
Mart_sigma = round(np.std(Mart, ddof = 1),3)
Mart_sigma
0.209
2. 편의점 홈런볼¶
1-1. 데이터 수집¶
Cstore = [1.5, 1.8 ,1.5, 1.7, 1.8, 1.4, 1.3, 1.9, 2.0, 1.7,
1.7, 1.6, 1.5, 1.9, 2.0, 1.9, 2.1, 1.4, 1.7, 2.1,
1.6, 0.9, 1.9, 2.0, 2.0, 1.9]
1-2. 데이터 평균¶
Cstore_mu = np.mean(Cstore)
Cstore_mu
1.7230769230769232
1-3. 데이터 샘플수¶
n_Cstore = len(Cstore)
1-4. 총 중량¶
np.sum(Cstore)
44.800000000000004
1-5 히스토그램¶
import matplotlib.pyplot as plt
# plt.hist(Mart, range=(0.9, 2.1), bins=12, alpha=0.5)
plt.hist(Cstore, alpha=0.5)
(array([1., 0., 0., 1., 2., 5., 4., 2., 5., 6.]),
array([0.9 , 1.02, 1.14, 1.26, 1.38, 1.5 , 1.62, 1.74, 1.86, 1.98, 2.1 ]),
<BarContainer object of 10 artists>)
1-6. 표준편차¶
# 표준편차
Cstore_sigma = round(np.std(Cstore, ddof = 1),3)
Cstore_sigma
0.283
3. 마트와 편의점 히스토그램 분포도¶
plt.hist(Cstore, alpha=0.5) # 파랑 : 편의점
plt.hist(Mart, alpha=0.5) # 주황 : 마트
(array([2., 1., 1., 3., 0., 6., 6., 3., 1., 2.]),
array([1.2 , 1.28, 1.36, 1.44, 1.52, 1.6 , 1.68, 1.76, 1.84, 1.92, 2. ]),
<BarContainer object of 10 artists>)
4. 홈런볼이 어디서 왔을까?¶
두 집단의 평균의 차이가 우연에 의한 것인지 알아보는 방법입니다.
"마트와 편의점의 홈런볼 1알의 중량차이가 있다"라는 것을 알아보려면 매우 유사한 방법을 씁니다.
우리가 얻어낸 차이가 우연인지 아닌지 알기 위해서는
① 측정에 사용된 마트(25알)와 편의점(26알) 홈런볼 각각 알 개수,
② 두 곳의 평균 중량 차이(1.72 - 1.62 = 0.1 g),
③ 그리고 마트와 편의점의 1알 중량 데이터가 흩어진 정도가 필요합니다.
$t값 = \frac{\overline{평균_{편의점}} - \overline{평균_{마트}}}{\frac{{표준편차_{편의점}}}{\sqrt{알 개수_{편의점}}}+{\frac{{표준편차_{마트}}}{\sqrt{알 개수_{마트}}}}}$
</h3>
이것을 일반화하여 써보면 아래와 같습니다.
$t = \frac{\overline{X_{a}} - \overline{X_{b}}}{\frac{{S_{a}}}{\sqrt{n_{a}}}+{\frac{{S_{b}}}{\sqrt{n_{b}}}}}$
</h3>
$\overline{X_{a}} : a집단의 평균, \overline{X_{b}} : b집단의 평균, {S_{a}} : a집단의 표준편차 {S_{b}} : b집단의 표준편차, {n_{a}} : a집단의 샘플수 {n_{b}} : b집단의 샘플수 $
여러분들은 지금까지 그 어려운 t검정을 하신 겁니다.
보다 구체적으로 마트와 편의점의 홈런볼 차이를 검증하는 것은 서로 다른 두 집단의 차이를 검증하는 방법인 독립표본 t검정입니다.
t 검정¶
t검정 종류
- 대응표본 t검정(영어로는 Paired t-Test) : 사전 vs 사후 비교
동일한 대상에게 실험을 하고, 실험 전과 후에 결과가 차이가 있는지를 알아보는 방법
- 독립표본 t검정(영어로는 Independent t-Test)
: 서로 다른 두 집단 비교, 서로 다른 두 집단에서 뽑은 표본 간에 나타난 차이가 의미가 있는지를 알아보는 방법
# t값
t_value = (Cstore_mu-Mart_mu) / (sigma_Cstore/np.sqrt(n_Cstore)+sigma_Mart/np.sqrt(n_Mart))
t_value
3.8821328495139538
독립표본 t검정은 t test independent 함수로 간단히 계산 가능합니다.¶
stats.ttest_ind(Mart, Cstore, equal_var = False)
Ttest_indResult(statistic=-1.3670503390114912, pvalue=0.17825468212021833)
p값이 0.17<0.05 이라는 것은 두 집단간의 평균 차이가 유의미 하지 않다는 것을 의미합니다.
결과적으로 마트 홈런볼과 편의점 홈런볼 1알의 무게는 차이가 없다는 결론입니다.¶
참고인자 equal_var = False 인자값¶
t검정을 하기에 앞서 등분산성을 검정해야 하는데,
equal_var = False 인자값은 분산이 다르다고 가정하고 welch 검정을 사용하겠다는 의미입니다.
##### 마트와 편의점 홈런볼 분포도
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 5
plt.rc('font',family='NanumGothic')
mu1, sigma1 = Mart_mu, Mart_sigma
mu2, sigma2 = Cstore_mu, Cstore_sigma
x = np.linspace(0.9, 2.5, 1000)
y1 = (1 / np.sqrt(2 * np.pi * sigma1**2)) * np.exp(-(x-mu1)**2 / (2 * sigma1**2))
y2 = (1 / np.sqrt(2 * np.pi * sigma2**2)) * np.exp(-(x-mu2)**2 / (2 * sigma2**2))
# y3 = (1 / np.sqrt(2 * np.pi * sigma3**2)) * np.exp(-(x-mu3)**2 / (2 * sigma3**2))
# y1 = stats.t(3).pdf(t)
# y1 = stats.t(3).pdf(t)
plt.plot(x, y2, alpha=0.7, label='편의점')
plt.plot(x, y1, alpha=0.7, label='마트')
# plt.plot(x, y3, alpha=0.7, label=r'PDF of N(3.0, $2.0^2$)')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
#bbox_to_anchor=(1.0, -0.2))
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('default')
plt.rcParams['figure.figsize'] = (6, 3)
plt.rcParams['font.size'] = 12
plt.rcParams['lines.linewidth'] = 5
plt.rc('font',family='NanumGothic')
mu1, sigma1 = Mart_mu, Mart_sigma
mu2, sigma2 = Cstore_mu, Cstore_sigma
x = np.linspace(0.9, 2.5, 1000)
y1 = (1 / np.sqrt(2 * np.pi * sigma1**2)) * np.exp(-(x-mu1)**2 / (2 * sigma1**2))
y2 = (1 / np.sqrt(2 * np.pi * sigma2**2)) * np.exp(-(x-mu2)**2 / (2 * sigma2**2))
y3 = np.random.normal(mu1, sigma1, 10000)
y4 = np.random.normal(mu2, sigma2, 10000)
plt.plot(x, y2, alpha=0.7, label='편의점')
plt.plot(x, y1, alpha=0.7, label='마트')
plt.hist(y4, bins=1000, density=True, histtype='stepfilled', color='C0', alpha=0.5)
plt.hist(y3, bins=1000, density=True, histtype='stepfilled', color='C1', alpha=0.5)
plt.xlabel('홈런볼 1알 중량')
plt.ylabel('나타날 확률')
plt.xlim(0.5, 3.0)
plt.legend()
plt.show()
# 분산 계산
# ddof는 자유도. ddof =0은 샘플수로 나눠주는 것. ddof=1은 샘플수-1 로 나눠주는 것
ddof 란?¶
ddof인수란 표본표준편차 계산에 사용되는 분모인 n-ddof 값을 말합니다.
이는 자유도 라고 하며 모표준편차와 표본 표준편차에서 반드시 발생하는 괴리율을 줄이기 위해 사용됩니다.
numpy.std의 ddof 는 n에서 몇을 뺀 값으로 나눌 것인가를 의미한다 (기본값 = 0, ddof =1은 (n-1)로 나눌 것을 의미함
'빅데이터(Big Data) 이론과 코드 > 6. 통계지식' 카테고리의 다른 글
최대 우도 추정법(Maximum Likelihood Estimation, MLE) (0) | 2025.01.06 |
---|---|
예산과 전문가 없이 데이터로 인포그래픽을 만들기 (1) | 2024.06.25 |
홈런볼 슈링크플레이션과 소비자 물가지수 (2) | 2023.01.09 |
[홈런볼로 배우는 데이터 경제] t검정 (1) | 2022.12.26 |
왜도(skewness)와 첨도(kurtosis) (0) | 2022.02.28 |