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)
파이썬과 C++ 도서의 평균 대출건수가 같다고 가정하고 가설이 맞는지 검정
두 모집단의 평균에 대한 z 점수 공식
두 모집단의 평균에 대한 z 점수 공식
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
사이파이에 두 표본의 평균을 비교하는 ttest_ind() 함수가 있다. t-분포인 두 표본을 비교하는 t-검정을 수행
t,pvalue=stats.ttest_ind(python_books['대출건수'], cplus_books['대출건수'])
print(t, pvalue)
순열검정은 모집단의 분포가 정규분포를 따르지 않거나 모집단의 분포를 알 수 없을 때 사용할 수 있는 방법이다
모집단의 파라미터를 추정하지 않기 때문에 비모수검정 방법 중에 하나이다
두 개의 배열을 받아 평균을 구하는 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)
결정계수
선형 회귀는 선형 함수를 사용해 모델을 만드는 알고리즘
x
는 입력이고 는 타깃. 입력에 기울기 를 곱하고 축과 만나는 절편 를 더하여 만드는 것
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)