DA 6

Tae Yoon·2024년 1월 11일
0

통계적으로 추론하기

z 점수 구하기

넘파이로 z 점수 구하기

import numpy as np

x=[0,3,5,7,10]

s=np.std(x)
m=np.mean(x)
z=(7-m)/s
print(z)

사이파이로 구하기

x=[0,3,5,7,10]
from scipy import stats
stats.zscore(x)

누적분포 구하기

stats 모듈의 norm.cdf() 메서드는 누적된 분포를 반환해 준다

stats.norm.cdf(0)

특정 비율에 해당하는 z 점수를 구하려면 norm.ppf() 메서드 사용

stats.norm.ppf(0.9)

샘플링하기

무작위로 1000개의 표본을 샘플링하여 각 평균을 리스트로 저장 -> 무작위 샘플링을 위해 판다스 데이터프레임의 sample() 메서드 사용

np.random.seed(42)
sample_means=[]
for _ in range(1000):
  m=ns_book7['대출건수'].sample(30).mean()
  sample_means.append(m)

plt.hist(sample_means, bins=30)
plt.show()

샘플링 크기와 정확도

np.mean(sample_means) #표본의 통계량 11.54
ns_book7['대출건수'].mean() #모집단의 통계량 11.59

모집단의 평균 범위 추정하기: 신뢰구간

주제분류번호가 '00'으로 시작하고 도서명에 '파이썬'이 포함된행을 추출
파이썬 도서의 대출건수 평균 계산

python_books_index=ns_book7['주제분류번호'].str.startswith('00') & ns_book7['도서명'].str.contains('파이썬')
python_books=ns_book7[python_books_index]
python_mean=np.mean(python_books['대출건수'])
python_mean

파이썬 도서 대출건수로 표준편차를 구한 다음, 표준오차 계산

python_std=np.std(python_books['대출건수'])
python_se=python_std/np.sqrt(len(python_books))
python_se

평균을 중심으로 95% 이내 구간에 포함된다고 확신하려할 때
norm.ppf() 메서드에 0.975를 넣으면 1.96이 나온다
따라서 신뢰구간은

print(python_mean-1.96*python_se, python_mean+1.96*python_se)

z 점수로 가설 검증하기

파이썬과 C++ 도서의 평균 대출건수가 같다고 가정하고 가설이 맞는지 검정
두 모집단의 평균에 대한 z 점수 공식
H0:μpythonμC++=0H_0: \mu_{python} - \mu_{C++} = 0
H1:μpythonμC++0H_1: \mu_{python} - \mu_{C++} \neq 0
두 모집단의 평균에 대한 z 점수 공식
z=(x1x2)(μ1μ2)σ12/n1+σ22/n2z=\frac{(x_1 - x_2)-(\mu_1 - \mu_2)} {\sqrt{σ_1^2/n_1 + σ_2^2/n_2}}

C++도서에 대한 데이터프레임을 만들고 평균, 표준오차 계산

cplus_books_index=ns_book7['주제분류번호'].str.startswith('00') & ns_book7['도서명'].str.contains('C++', regex=False)
cplus_books=ns_book7[cplus_books_index]
cplus_mean=np.mean(cplus_books['대출건수'])
cplus_se=np.std(cplus_books['대출건수']/np.sqrt(len(cplus_books)))
# z 값 계산
(python_mean-cplus_mean)/np.sqrt(python_se**2+cplus_se**2) # 2.5
# z 점수를 이용해 누적분포 확인
stats.norm.cdf(2.5) # 0.99

t-검정으로 가설 검증하기

사이파이에 두 표본의 평균을 비교하는 ttest_ind() 함수가 있다. t-분포인 두 표본을 비교하는 t-검정을 수행

t,pvalue=stats.ttest_ind(python_books['대출건수'], cplus_books['대출건수'])
print(t, pvalue)

정규분포가 아닐 때 가설 검증하기: 순열검정

순열검정은 모집단의 분포가 정규분포를 따르지 않거나 모집단의 분포를 알 수 없을 때 사용할 수 있는 방법이다
모집단의 파라미터를 추정하지 않기 때문에 비모수검정 방법 중에 하나이다

도서 대출건수 평균 비교하기: 파이썬 vs C++

두 개의 배열을 받아 평균을 구하는 statistic 함수를 만든다

def statistic(x,y):
  return np.mean(x)-np.mean(y)

def permutation_test(x,y):
  # 표본의 평균 차이 계산
  obs_diff=statistic(x,y)
  # 두 표본을 합친다
  all=np.append(x,y)
  diffs=[]
  np.random.seed(42)
  # 순열검정을 1000번 반복
  for _ in range(1000):
    # 전체 인덱스를 섞는다
    idx=np.random.permutation(len(all))
    # 랜덤하게 두 그룹으로 나눈 다음 평균 차이를 계산한다
    x_=all[idx[:len(x)]]
    y_=all[idx[:len(y)]]
    diffs.append(statistic(x_,y_))
  # 원본 표본보다 작거나 큰 경우의 p-값을 계산
  less_pvalue=np.sum(diffs<obs_diff)/1000
  greater_pvalue=np.sum(diffs>obs_diff)/1000
  # 둘 중 작은 p-값을 선택해 2를 곱하여 최종 p-값을 반환
  return obs_diff,np.minimum(less_pvalue,greater_pvalue)*2

permutation_test(python_books['대출건수'], cplus_books['대출건수'])

머신러닝으로 예측하기

알아 두면 좋은 머신러닝 용어

머신러닝은 더 커다란 인공지능의 하위 분야이다. 머신러닝은 지도학습과 비지도 학습으로 나뉜다
파이썬의 대표적인 머신러닝 패키지는 사이킷런
모델: 머신러닝으로 학습된 패턴을 저장하는 소프트웨어 객체
지도학습: 데이터에 있는 각 샘플에 대한 정답을 알고 있는 경우. 이런 정답을 보통 타깃이라 부른다
입력: 타깃을 맞추기 위해 모델이 재료로 사용하는 데이터
비지도 학습: 입력 데이터는 있지만 타깃이 없는 경우

모델 훈련하기

훈련 세트와 테스트 세트로 나누기

train_test_split() 함수는 기본적으로 입력된 데이터를 무작위로 섞은 후 75% 훈련 세트로 25%를 테스트 세트로 나눈다
이 함수는 분할된 훈련 세트와 테스트 세트를 리스트로 반환하기 때문에 리스트 개수에 맞는 변수를 왼쪽에 나열하여 반환되는 값을 지정할 수 있다

from sklearn.model_selection import train_test_split
train_set, test_set=train_test_split(ns_book7, random_state=42)
print(len(train_set), len(test_set))

선형 회귀 모델 훈련하기

사이킷런의 linear_model 모듈 아래에 있는 LinearRegression 클래스를 임포트하여 선형 회귀 모델을 훈련

x_train= train_set[['도서권수']]
y_train= train_set[['대출건수']]
from sklearn.linear_model import LinearRegression
lr=LinearRegression()
lr.fit(x_train, y_train)

훈련된 모델을 평가하기: 결정계수

score() 메서드를 사용해 훈련된 머신러닝 모델이 얼마나 유용한지 평가

x_test= test_set[['도서권수']]
y_test= test_set['대출건수']
lr.score(x_test, y_test)

결정계수
R2=1(타깃예측)2(타깃평균)2R^2=1-\frac{(타깃-예측)^2}{(타깃-평균)^2}

연속적인 값 예측하기: 선형 회귀

선형 회귀는 선형 함수를 사용해 모델을 만드는 알고리즘
y=ay=a x x+bx + b

xx는 입력이고 yy는 타깃. 입력에 기울기 aa를 곱하고 yy축과 만나는 절편 bb를 더하여 만드는 것
lr 객체의 coef속성과 intercept속성에 학습된 기울기와 절편이 각각 저장되어 있다

print(lr.coef_, lr.intercept_)

카테고리 예측하기: 로지스틱 회귀

로지스틱 회귀 모델 훈련하기

borrow_mean= ns_book7['대출건수'].mean()
y_train_c= y_train> borrow_mean
y_test_c=y_test>borrow_mean

from sklearn.linear_model import LogisticRegression

logr=LogisticRegression()
logr.fit(x_train, y_train_c)
logr.score(x_test, y_test_c)

0개의 댓글

관련 채용 정보