☑️ 문제1. 표본 집단의 변동계수 구하기
[문제]
- 회사 주식에 투자하고자 합니다. 하지만 보수적인 나는 변동성이 크지 않은 회사를 골라 안정적인 투자를 희망합니다.
이를 위해 2가지 회사로 좁혔고 A,B회사의 6일간 주가 데이터를 수집하였습니다. Numpy 혹은 Pandas를 이용하여 회사의 변동계수를 구해봅시다.
[문제 풀이]
내 코드 -numpy 모듈 (오답)
import numpy as np
com_a = [76300, 77400, 77900, 77200, 76900, 78800]
com_b = [6400, 7000, 7400, 6900, 7300, 7600]
cv_a_np = np.std(com_a) / np.mean(com_a)
cv_b_np = np.std(com_b) / np.mean(com_b)
# 결과 출력
print(f'A회사의 변동계수 {cv_a_np:.3f}')
print(f'B회사의 변동계수 {cv_b_np:.3f}')
수정 코드 -numpy 모듈
import numpy as np
com_a = [76300, 77400, 77900, 77200, 76900, 78800]
com_b = [6400, 7000, 7400, 6900, 7300, 7600]
#표본 표준편차 이므로 자유도 옵션 설정 필요
cv_a_np = np.std(com_a,ddof= 1) / np.mean(com_a)
cv_b_np = np.std(com_b,ddof= 1) / np.mean(com_b)
# 결과 출력
print(f'A회사의 변동계수 {cv_a_np:.3f}')
print(f'B회사의 변동계수 {cv_b_np:.3f}')
수정 코드 - pandas 모듈
import numpy as np
import pandas as pd
com_a = [76300, 77400, 77900, 77200, 76900, 78800]
com_b = [6400, 7000, 7400, 6900, 7300, 7600]
#리스트 -> 데이터프레임으로 변환
data = pd.DataFrame({'Company A': com_a, 'Company B': com_b})
cv_a_np = data['Company A'].std() / data['Company A'].mean()
cv_b_np = data['Company B'].std() / data['Company B'].mean()
# 결과 출력
print(f'A회사의 변동계수 {cv_a_np:.3f}')
print(f'B회사의 변동계수 {cv_b_np:.3f}')
이슈 및 해결 과정
- 표본집단 변동계수 구하는법 : 표본 표준편차 / 평균
- 표본 표준편차는 자유도 n-1
- 문제) numpy표준편차 계산
- numpy : 모 표준편차 기준으로 자유도 디폴트는 n 임 ( ddof =0)
- np.std(변수) 로 표본 표준편차 계산시 자유도 n-1 설정 필요 (ddof=1)
- 따라서 np.std(변수,ddof=1) 옵션 설정 해주어야 정확한 표본 표준편차를 구할수 있음
-
cv_a_np = np.std(com_a,ddof= 1) / np.mean(com_a)
- 추가
- pandas 표준편차 함수는 표본 표준편차 기준임. 자유도 디폴트 n-1
한줄 포인트
- 표본의 변동계수 계산시
- numpy : np.std(변수,ddof=1) / np.mean(변수)
- pandas : 변수.std() / 변수.mean()
- 모집단과 표본집단의 기술통계 함수 사용시 자유도 고려해야함.
☑️ 문제2. 정규분포 신뢰 구간 구하기
[문제]
[문제 풀이]
내 코드 - 오답
import scipy.stats as stats
import numpy as np
# 주어진 값들
sigma = 8 # 모집단의 표준편차
n = 25 # 표본 크기
x_bar = 42.7 # 표본 평균
confidence_level = 0.95 # 신뢰 수준
#신뢰구간 : 표본크기가 30미만 t 분포 사용 & interval 메소드
# conf_interval = stats.t.interval(confidence_level,n-1,x_bar,sigma/np.sqrt(n))
#상하한치 저장
lower_bound = conf_interval[0]
upper_bound = conf_interval[1]
# 결과 출력
print(f"95% 신뢰 구간: ({lower_bound:.3f}, {upper_bound:.3f})")
수정 코드 - 신뢰구간 직접 구하기
import scipy.stats as stats
import numpy as np
# 주어진 값들
sigma = 8 # 모집단의 표준편차
n = 25 # 표본 크기
x_bar = 42.7 # 표본 평균
confidence_level = 0.95 # 신뢰 수준
#표본 오차 구하기
se= sigma/np.sqrt(n)
#신뢰구간 직접 계산 (1.96 직접 ppf 에서 직접 구해주면 됨)
lower_bound = x_bar - 1.96 * se
upper_bound = x_bar + 1.96 * se
# 결과 출력
print(f"95% 신뢰 구간: ({lower_bound:.2f}, {upper_bound:.2f})")
수정 코드 - `norm.interval` 메소드로 구하기
import scipy.stats as stats
import numpy as np
# 주어진 값들
sigma = 8 # 모집단의 표준편차
n = 25 # 표본 크기
x_bar = 42.7 # 표본 평균
confidence_level = 0.95 # 신뢰 수준
#신뢰구간 메소드로 구현하기
conf_interval =stats.norm.interval(confidence_level, loc=x_bar, scale= sigma/np.sqrt(n))
#상하한치 저장
lower_bound = conf_interval[0]
upper_bound = conf_interval[1]
# 결과 출력
print(f"95% 신뢰 구간: ({lower_bound:.3f}, {upper_bound:.3f})")
이슈 및 해결 과정
- 문제에서 모 표준편차가 주어진 정규분포 이므로 정규분포 메소드 적용했어야함
- (내코드 오답) 모집단의 크기가 30미만이라 t 분포 적용했음..
- 신뢰구간 구하기
- `norm.interval` 메소드 활용 : norm.interval(신뢰수준,loc=표본평균, scale=표본표준오차)
-
stats.norm.interval(confidence_level, loc=x_bar, scale= sigma/np.sqrt(n))
-
- 계산식으로 직접 구하기
- 표본표준평균 +- 신뢰수준의 검정통계량 * 표본 오차
-
#표본 오차 구하기se= sigma/np.sqrt(n)#신뢰구간 직접 계산 ( 신뢰수준이 5% 이므로 1.96)lower_bound = x_bar - 1.96 * seupper_bound = x_bar + 1.96 * se
- `norm.interval` 메소드 활용 : norm.interval(신뢰수준,loc=표본평균, scale=표본표준오차)
- ▶ z 분포 vs t 분포 선택 기준 ( 두개다 정규분포를 따른다는 가정 필요)
- 모 표준편차 or 모 분산을 안다 → `z분포`
- 모 표준편차 or 모 분산을 모름 & 표본 >= 30 → 원칙적으로는` T 분포` but 중심극한정리에 의해 z분포 사용하는 경우도 있음(유사)
- 모 표준편차 or 모 분산을 모름 & 표본 <30 → `T분포`
☑️ 문제3. 이표본 T 검정
[문제]
목초에 따른 우유의 생산량을 알아보기위하여 25마리 젖소를 대상으로 3주동안 임의로 추출된 12마리 젖소에게 건조시킨 목초를 주고 13마리 젖소에게는 들판에서 말린 목초를 주었다.
- 두 종류의 모 표준편차는 같다고 가정하고 또한 우유생산량의 자료는 정규분포를 따른다고 가정한다.
- 자연적으로 말린 목초의 사육하는 젖소의 우유생산량이 인공적으로 말린 목초로 사용하는 젖소보다 많다고 할 수 있는지 유의수준 0.05 에서 검정하세요.(단측 검정)
[문제 풀이]
내 코드
import numpy as np
from scipy.stats import ttest_ind
nature = [44, 44, 56, 46, 47, 38, 58, 53, 49, 35, 46, 30, 31] # 자연적으로 말린 목초
artificial = [35, 47, 55, 29, 40, 39, 32, 41, 42, 57, 51, 39] # 인공적으로 말린 목초
#ttest_ind 메소드
t_stat, p_value = ttest_ind(nature, artificial, equal_var=True,alternative='greater')
print('귀무가설(H0) : 자연 목초로 사육한 젖소와 인공 목초로 사육한 젖소의 우유생산량 차이는 없다')
print('대립가설(H1) : 자연 목초로 사육한 젖소가 인공 목초로 사육한 젖소보다 우유 생산량이 더 많다')
print(f't-통계량 : {t_stat:.3f}')
print(f'단측검정 p-값 : {p_value:.3f}')
#유의수준 설정
alpha = 0.05
if p_value < alpha:
print('귀무가설을 기각합니다')
else:
print('귀무가설을 기각하지 않습니다')
이슈 및 해결 과정
- 독립 이표본 T검정 : 2개의 독립변수의 평균 비교시 사용하는 검정법
- 이표본 T검정 적용 조건
- 두 모집단이 정규분포를 따른 다른 가정 or 표본 크기 >=30 ( 실무에서는 표본 집단이 정규분포를 따르면 됨)
- 두 표본이 독립적
- 등분산 가정 여부
- 등분산 0 : Student’s t 분포
- 등분산 x : Welch’s t 분포
- 문제 적용
- 표본 크기 25마리 & 독립표본 2개
- 두 그룹의 표준편차 동일 (등분산 )
- 정규분포를 따름 (정규성 만족)
- → 따라서 2표본 T검정 진행
- 이표본 T검정 적용 조건
- 양측 검정과 단측 검정
- 양측 검정 : 방향성 갖지 않으면 양측검정(two-sided test)
- 단측 검정 : 대립가설의 주장이 방향성을 가지면 단측검정(one-sided test)
- 독립 이표본 t검정 메소드 : `ttest_ind`
- 반환값 : 검정통계량, p-value
- `equal_var` 옵션 :등분산 여부
- 등분산 0 : True
- 등분산 X : False
- `alternative` 옵션 : 양측 or 단측 검정 옵션
- 디폴트는 양측 검정
- 문제에서 nature(첫번째변수) > artifical(두번째 변수) → 'greater'
- 만약 반대라면 'less'
- 문제 적용
-
t_stat, p_value = ttest_ind(nature, artificial, equal_var=True,alternative='greater')
-
- 정규성 검정 과 등분산 검정 코드
- 만약, 문제에서 독립 2표본에 정규성/등분산성 가정이 없다면 정규성 검정과 등분산 검정이 선행되어야함
- 정규성 검정
- 표본 <50 (작은 표본) : Shapiro-Wilk 검정 → `shapiro(변수)`
- 표본>=50 (충분) : Kolmogorov-Smirnov 검정 → ` kstest(변수,'norm')
- 반환값 : 검정통계량, p값
- 등분산 검정
- Levene : levene(data1, data2)
- Bartlett (정규분포를 따른다는 가정이 있다면) : bartlett(data1, data2)
- bartlett 가 levene 보다 검정력이 높음
- 반환값 : 검정통계량 , p값
import numpy as np
from scipy import stats
#1.정규성 검정 선행
for data in [nature,artificial]:
stat,pvalue = stats.shapiro(data)
print(stat,pvalue)
#2. 등분산성 검정
stats.levene(nature,artificial)
'통계,검정,머신러닝' 카테고리의 다른 글
머신러닝 | Supervised Leaning 지도학습 알고리즘 비교 정리 (0) | 2025.01.21 |
---|---|
통계 실습2 | 카이제곱 검정 /분포별 난수로 샘플 생성하기 / 중심극한정리 (+subplots/subplot 시각화) (0) | 2025.01.18 |
머신러닝 실습 | 캐글의 Titanic 데이터로 로지스틱 회귀 분석 실습 하기 (+K fold 교차검증) (0) | 2025.01.15 |
머신러닝 | 이상치/ 결측치/ 범주형 데이터 인코딩/ 수치형 데이터 스케일링(+sklearn 모듈) (0) | 2025.01.15 |
가설 검정 | 카이 제곱 검정 (+ scipy.stats 모듈 ) (0) | 2025.01.14 |