본문 바로가기

기초통계

통계학 기초 문제풀이

문제1. 변동계수 구하기

변동계수(coefficient of variation) = 표준편차 / 평균
표준 편차를 산술 평균으로 나눈 값

 

변동 계수는 같은 단위를 가지는 평균값으로 나누어주기 때문에, 측정단위가 서로 다른 자료를 비교하고자 할 때 쓰인다. 변동 계수의 값이 클수록 상대적인 차이가 크다는 것을 의미하며,

상대 표준 편차라고도 부른다. 

풀이1. Numpy

(1) a와 b의 평균 구하기

mean_a = np.mean(com_a)
mean_b = np.mean(com_b)
print(mean_a, mean_b)

 

(2) 표준 편차 구하기

std_a = np.std(com_a, ddof=1) #자유도가 1이다. 표본이기 때문에 자유도 : 자료의 개수 -1
std_b = np.std(com_b, ddof=1)

 

(3) 변동 계수 구하기

cv_a = std_a/mean_a
cv_b = std_b/mean_b
print(f'A회사의 변동계수:{cv_a:.3f}, B회사의 변동계수:{cv_b:.3f}')

 

✅자유도

평균을 구할 때 나누어 주는 숫자. 합쳐진 값들 중에서 실질적으로 '자유로운' 값들의 개수

표준편차를 구할 때 자유도는 '자료의 개수 - 1' 

 

풀이2. Pandas

data = pd.DataFrame({'Company A': com_a, 'Company_B': com_b})
data

mean_a_pd = data['Company A'].mean()
std_a_pd = data['Company A'].std()
cv_a_pd = std_a_pd / mean_a_pd


mean_b_pd = data['Company_B'].mean()
std_b_pd = data['Company_B'].std()
cv_b_pd = std_b_pd / mean_b_pd


print(f'A회사의 변동계수 {cv_a_pd:.3f}')
print(f'B회사의 변동계수 {cv_b_pd:.3f}')

 

 


 

문제2. 신뢰구간 구하기

z분포를 이용한 모평균을 95%의 신뢰구간으로 구하는 공식

 

(1) 스켈레톤 코드 

#스켈레톤 코드
import scipy.stats as stats
import numpy as np

# 주어진 값들
sigma = 8  # 모집단의 표준편차
n = 25  # 표본 크기
x_bar = 42.7  # 표본 평균
confidence_level = 0.95  # 신뢰 수준

 

 

(2) 신뢰구간 구하기

se = sigma / np.sqrt(n)
lower_bound = x_bar - 1.96 * se
upper_bound = x_bar + 1.96 * se
print(f'95% 신뢰구간: ({lower_bound:.3f}, {upper_bound:.3f})')

 

 

📝내가 푼 풀이

 

T분포를 이용한 풀이. 하지만 현실은 아름답지 않다. 모든 값들이 주어지는 경우는 잘 없음

scale = round(8/np.sqrt(24),2)
scale

conf_interval = stats.t.interval(0.95, 24, 42.7, 1.63)
lower_bound = conf_interval[0]
upper_bound = conf_interval[1]


print(f"95% 신뢰 구간: ({lower_bound:.3f}, {upper_bound:.3f})")

 

 


문제3. 이표본 t검정

stats.ttest_ind(nature, artificial, alternative ='greater', equal_var = True) #앞에 있는 전달인자가 큰 경우에 greater를 넣어야 함.

scipy: ttest_ind 참고

 


문제4. 카이제곱 검정

# 적합도 검정
chi2_stat, p_value, dof, expected = stats.chi2_contingency(clicks)
print(f"chisq: {chi2_stat:.3f}, pvalue: {p_value:.3f}")

# 결론
alpha = 0.05  # 유의수준
if p_value < alpha:
    print("귀무가설 기각: 헤드라인과 페이지 클릭율에는 관련이 있다..")
else:
    print("귀무가설 채택: 헤드라인과 페이지 클릭율에는 관련이 없다.")

 

- Correction = True, 자유도가 1일 때 수치 보정해주는 옵션 일반적으로 2*2 일때 적용한다. 

 

scipy.stats.chi2_contingency 함수는 카이제곱 검정을 수행하여 두 개 이상의 범주형 변수 간의 독립성을 검정합니다. 이 함수는 관측 빈도를 담고 있는 교차표(contingency table)를 입력으로 받아 카이제곱 통계량, p-값, 자유도, 그리고 기대 빈도(expected frequencies)를 반환합니다.

 

문제5. 중심극한정리

import matplotlib.pyplot as plt
import scipy.stats 
from scipy.stats import *
np.random.seed(42)


sample_size = 1000
uniform_data = uniform.rvs(loc = 0, scale = 10, size = sample_size)
binomial_data = binom.rvs(n = 10, p = 0.5, size = sample_size)
binomial_data[:10]
normal_data = norm.rvs(loc = 0, scale = 1, size = sample_size)

문제6. 중심극한정리 - 각 분포의 표본의 평균 시각화

num_samples = 500
sample_means = {
    "Binomial": [],
    "Uniform": [],
    "Normal": []
}

 

for _ in range(num_samples):
    sample_means["Binomial"].append(np.mean(np.random.choice(binomial_data, size = 30, replace = True)))
    sample_means["Uniform"].append(np.mean(np.random.choice(uniform_data, size=30, replace = True)))
    sample_means["Normal"].append(np.mean(np.random.choice(normal_data, size=30, replace=True)))