본문 바로가기
파이썬/데이터 분석

[240927] 데이터 분석 #4 평균에 대하여

by 황오독 2024. 9. 27.

고등학교 이후로 진짜 오랜만에 듣는 평균, 분산, 표준편차 어쩌구들..

분명 이과가 아니었던 적이 없는데,, 기본 개념들을 다시 마주하니 익숙한듯 익숙하지 않다ㅜ_ㅜ

 

1. 분산과 표준편차 (분산 = (표준편차)**2)

- 값들이 평균으로부터 얼마나 벗어나 있는지 (이탈도, deviation)를 나타내는 값

- 평균 : .mean() / 분산 : .var() / 표준편차 : .std()

a = np.array([180,173,165,166,171])

print(f'평균 : {a.mean()}')
print(f'분산 : {a.var()}')
print(f'표준편차 : {a.std()}')

 

2. 평균 비교

  (1) 표준오차 (SE, standard error)

    - 표준오차는 표준편차와 아예! 다른 개념 (표준편차와 비교X)

    - 표본의 평균과 모집단의 평균과의 오차!!

  

   (2) 95% 신뢰구간

     ① 임의의 모집단 준비

        - 원래는 모집단을 알 수 없음! 전지적 분석가 시점에서 살펴보는 것임.

# 임의의 모집단 생성
pop = [round(rd.normalvariate(172, 7),1) for i in range(800000)]

# 시각화
plt.figure(figsize=(10,6))
sns.histplot(pop, bins = 100)
plt.axvline(np.mean(pop), color = 'r')
plt.text(np.mean(pop)+1, 30000, f'pop mean : {np.mean(pop).round(3)}', color = 'r')
plt.show()

임의의 모집단 생성

 

     ② 표본 조사 (50명을 임의로 샘플링)

x_mean = []
 # rd => import random as rd : 랜덤으로 처리
 # 아래 표본조사(50씩) 100번 실행
 # 랜덤으로 처리하기 때문에 돌릴 때마다 달라짐
 
for i in range(100):
    s1 = rd.sample(pop, 50)
    s1 = pd.Series(s1)
    x_mean.append(round(s1.mean(),3))리

x_mean (표본조사 랜덤한 50개의 평균이 100개 들어있음)

plt.figure(figsize=(10,6))
sns.kdeplot(x_mean)
plt.axvline(np.mean(x_mean), color = 'r')
plt.text(np.mean(x_mean)+1, 0.1, f'pop mean : {round(np.mean(x_mean),3)}', color = 'r')
plt.show()

 

     ③ 95% 신뢰구간

s1.mean() - (1.96 * s1.sem()), s1.mean() + (1.96 * s1.sem())

# 결과
(170.3997394714916, 173.85626052850836)

 

     ④ 95% 신뢰구간에 대한 실험

        - 샘플조사 100번 수행하였을때, 그때마다 신뢰구간을 계산한 후

        - 그 중 몇번이 모평균ㅇ르 포함하는지 확인

        - 95% 신뢰구간일 경우, 100번 중 95번은 모평균을 포함함.

# 100번 샘플링
samples = { 'id' : [], 'value' : []}
for i in range(100) :
    samples['id'] += [i]* 100
    samples['value'] += rd.sample(pop,100)

samples = pd.DataFrame(samples)
samples.shape # (10000, 2) 10,000개의 행과 2개의 열
# errorbar 라는 차트
# 신뢰구간, 표준오차 구간을 시각화 하는 방법

plt.figure(figsize = (18, 8))
sns.pointplot(x = 'id', y = 'value', data = samples, join = False)
plt.axhline(np.mean(pop), color = 'r')
plt.show()

100개의 표본집단의 평균의 평균과 모평균의 차이가 표준오차이고, 그로부터 신뢰구간 95% 계산한다.

 

 

3. 중심극한 정리

- 표본이 클수록, 표집분포는 정규분포에 가까워짐.

  ① 정규분포 실험

# 임의의 모집단 만들기
pop = [round(rd.expovariate(.3)+165,2) for i in range(10001)]

# 표본의 크기
n = 100

# 표본의 갯수
m = 200

sample_mean = [np.mean(rd.sample(pop,n)) for i in range(m)]

plt.figure(figsize=(10,6))
sns.kdeplot(sample_mean)

plt.axvline(x=np.mean(sample_mean), color = 'red') #표본평균들의 평균
plt.axvline(x=np.mean(pop), color = 'grey') # 모평균

plt.text(np.mean(sample_mean)-.2, 0.02, round(np.mean(sample_mean),3), color = 'red') #표본평균들의 평균
plt.text(np.mean(pop)+.1,0.02, round(np.mean(pop),3), color = 'grey') #모평균

plt.show() # show

 

   ② 표본의 크기에 따른 정규분포

      - 표본의 크기가 클수록 정규분포의 모양에 가까워지며 밀도가 높아진다.