본문 바로가기
자격증

[통계] 빅데이터 분석기사를 위한 기초 통계 상식!

by 포 키 2023. 8. 11.
728x90

 

 

빅분기 통계

빅데이터 분석기사를 위해서, 데이터 분석 공부를 하기 위해서, 데이터 분석가를 꿈꾸기 위해서 공부해야할 통계파트

오늘 배운 내용을 포스팅으로 그대로 옮기는 이유는 조금의 예제로 쉽게 이해할 수 있었으면 좋겠다.

오늘 진행 내용은 구글 코랩을 기반으로 했지만, 주피터 노트북에서 해도 상관없다.

코랩 파일은 수업 내용을 그대로 따라친거라 올리지 않지만, 아래의 포스팅 내용이 모두 코랩에 작성된 부분이다.

 

1. 기초통계 검정방법론

  • 모수통계
    • A 통계검정 방법론 (가정1, 가정2, 가정3 모두 충족할 때)
  • 비 모수통계(= 모수가 아닌 통계)

 

2. 베이지안 통계 vs 모수 통계

  • 모수 통계 : 평균에 기반한 통계 검정
  • 베이지안 통계 : 확률에 기반한 통계 검정

 

3. t-test : z-test

  • 평균의 비교
  • z-test 용어
    : 실무에서 정말 쓸모없는 test
  • 전제 조건
    : 모집단의 평균과 표준편차를 알아야 함
  • 가설 검정
    • 귀무가설 : 표본평균이 모집단의 평균과 같음
    • 대립가설 : 표본 평균이 모집단의 평균과 같지 않음
  • 왜 하는가?
    • 추출된 표본이 동일 모집단에 실제로 속하는지 가설 검증

 

예제

  • 모집단의 평균과 표준편차를 알고 있음
    • 평균 : 67.5 (심리학 점수)
    • 표준편차 : 9.5
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/ethanweed/pythonbook/main/Data/zeppo.csv")
df.head()

# _____따로 결과 확인하기_____
df['grades'].min(), df['grades'].max()

 

시각화

  • 평균이 67.5, 표준편차가 9.5인 그래프 작성
  • 모집단의 수는 100개
  • 히스토그램이 의미하는 것은 20개의 샘플을 추출함
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import scipy.stats as stats

mu = 67.5
sigma = 9.5

x = np.linspace(mu -3 * sigma, mu + 3 * sigma, 100)
y = 100 * stats.norm.pdf(x, mu, sigma)

fig, ax = plt.subplots()
ax1 = sns.histplot(df['grades'])
ax2 = sns.lineplot(x = x, y = y, color = 'black')
plt.show()

 

가설 세우기

  • 귀무가설 : 표본샘플(N=20)의 평균은 67.5이다.
  • 대립가설 : 표본샘플(N=20)의 평균은 67.5가 아니다.
import statistics
statistics.mean(df['grades'])

 

  • 모집단의 평균 67.5
  • 표본의 평균 72.3

> 모집단의 평균과 표본의 평균은 다르다고 할 수 있나?

> 우연히 샘플링 에러로 72.3으로 나올 수도 있지 않나?

> 결정을 어떻게 내릴까?

>> 통계 검정을 하겠다!

 

z-통계량

  • 각 데이터 값이 평균으로부터 얼마나 떨어져 있는지를 나타내는 통계향
    • 표준화된 수치
grades = df['grades'] # 샘플
sample_mean = statistics.mean(grades)
sample_mean # 표본의 평균값
sd_true = 9.5 # 모집단=표본의 표준편차
mu_null = 67.5 # 모집단의 평균값
N = len(grades) # 표본의 크기

# 표준오차 / 표준편차
import math
sem_true = sd_true / math.sqrt(N)
sem_true

# z_score (= z 통계량)
z_score = (sample_mean - mu_null) / sem_true
z_score

 

  •  NormalDist().cdf(-z_score)
    • NormalDist() : 평균이 0이고 표준편차가 1인 정규분포 객체 생성
    • cdf() : 확률변수 x가 주어진 값보다 작거나 같을 확률값을 알려줌
    • cdf() : 주어진 값에서 정규 분포의 누적 분포 함수를 계산할 때 사용
from statistics import NormalDist
lower_area = NormalDist().cdf(-z_score)
upper_area = lower_area
p_value = lower_area + upper_area
p_value

 

결론

  • p_value가 0.02이고 z_score가 2.22이기 때문에, 귀무가설을 기각하고 대립가설을 채택한다.
    • 대립가설 : 표본샘플(N=20)의 평균은 67.5가 아니다.
  • 실무적으로 적용 >> 감자칩 과자 총 150g 있다고 표기!!

 

4. One sample t-test

  • z-test 와 t-test 의 가장 큰 차이점
    • z-test : 모집단의 표준편차를 안다.
    • t-test : 모집단의 표준편차를 안다.
  • 이것이 의미하는 것은 무엇인가?
    • 여러번 샘플링을 통해서 모집단의 표준편차를 추정(Estimation)
    • 수동으로 여러번 테스트 할 수 없음 (데이터 수집 비용 증가, 부트스트랩 샘플링)

 

데이터 불러오기

import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/ethanweed/pythonbook/main/Data/zeppo.csv")
df.head()

import statistics
print("표본의 평균 : ", statistics.mean(df['grades']))
print("표본의 표준편차 : ", statistics.stdev(df['grades']))

 

가설 설정

  • 귀무가설 : 모집단의 월급 평균은 3억이다.
  • 대립가설 : 모집단의 월급 평균은 3억이 아니다.
  • one-sample t-test를 통해 실제로 모집단의 평균을 추정

 

추정

  • 전체모수에서 일부 샘플의 평균을 구함. 전체모수를 추정하는건 어떻게 가능하지?
  • 만약 모수(모집단의 수)가 3만명일 때, 표본의 갯수를 늘리면 좀 더 정확해질 수 있지 않을까?

 

테스트

  • 전제조건
    • 전국 고등학교의 평균 국어 점수가 67.5
    • 우리 고등학교의 평균 국어 점수가 72.3
  • 가설설정
    • 귀무가설 : 전국 고등학교의 평균 국어 점수와 우리 고등학교의 평균 국어 점수는 통계적으로 유의하게 같다.
    • 대립가설 : 전국 고등학교의 평균 국어 점수와 우리 고등학교의 평균 국어 점수는 통계적으로 유의하게 다르다.

 

t통계량, p-value 값 구하기

  • 매우 쉬움!
from scipy.stats import ttest_1samp
t_statistic, p_value =  ttest_1samp(a = df['grades'], popmean=67.5)
t_statistic, p_value

 

신뢰구간 구하기

  • 샘플의 평균은 72.3, 70.0, 75.0
  • 우리 고등학교의 학생 수 1000명 / 전국 고등학교 학생수의 40만명
    • 비교 1 : 67.5 vs 70.0 ==> p.value 0.045
    • 비교 2 : 67.5 vs 75.0 ==> p.value 0.01
from scipy import stats
confidence_level = 0.95 # 오류를 허용할 확률 신뢰도 95%
degrees_freedom = len(df['grades']) -1 # sample을 활용하는 모든 통계기법은 자유도 공식 N-1
sample_mean = statistics.mean(df['grades'])
sample_standard_error = stats.sem(df['grades'])
confidence_interval = stats.t.interval(confidence_level, degrees_freedom, sample_mean, sample_standard_error)
confidence_interval

 

  • 평균 72.3을 기록한 우리 고등학교 학생들의 평균 점수는 전국 고등학교 평균 국어 점수 67.5와 다르다. (t(19) = 2.25, p<0.05(*), 신뢰도 9 5% 신뢰구간 [67.8, 76.8]).
    $t(19) = 2.25, p<.05, CI_{95} = [67.8, 76.8]$
  • 결과값을 pandas dataframe로 변환하는 문제!

 

pingouin 테스트

!pip install --upgrade pingouin

from pingouin import ttest
result = ttest(df['grades'], 67.5)
result.iloc[:,0:5]

 

One Sample t-test의 가정

  • 정규성(Normality)을 가정
    • 데이터의 갯수가 N<=30 이하면 shapiro.wilk 검정 실시
      • 정규성을 만족 못하면, 비모수 검정 실시 또는 데이터를 추가 수집한다.
    • 데이터의 갯수가 N>=30 이상이면 중심극한정리에 의해서 정규성을 만족한다고 가정
728x90