- 어떤 제조회사의 부품에 대한 95% 신뢰구간이 [100mm ~ 120mm]라고 한다면, 부품이 100mm ~ 120mm 사이일 가능성이 95%라고 확신할 수 있다.
- 표본을 100개 추출했을 때, 95개 정도가 [100mm ~ 120mm] 사이에 존재한다.
데이터의 개수 - 1
- 월요일부터 일요일이 존재한다고 가정할 때, 월요일부터 토요일까지를 결정하면, 토요일 다음은 무조건 일요일이 됩니다.
- 일요일은 토요일에 종속되게 됩니다.
- 회귀 분석을 할 때, 하나의 값에 의해서 다른 하나의 값이 결정된다면 다중 공선성 문제가 발생
- 회귀분석을 할 때, feature들 사이의 관계를 잘 파악해야 합니다.
- feature의 중요도 같은 것을 판단할 때 중요합니다.
- 데이터 과학에서는 자유도를 중요하게 생각하지 않지만, 머신러닝에서능 중요하게 평가합니다.
- 어떤 동전을 15번 던졌을 때, 앞면이 12번 나온 경우에, 이 동전은 공정한 것인가?
- 유의 수준을 5%라 하자
- 귀무 가설 : 15번 던졌을 때, 12번 정도 나오는 것은 공정하다
- 동전은 앞 뒷면만 존재하기에 이항(베르누이) 분포이다.# 시행 횟수 N=15 # 앞면이 나올 확률 mu=0.5 # 이항 분포를 생성 rv=sp.stats.binom(N,mu) xx=np.arange(N+1) # 확률 질량 함수를 출력 (pmf) # 각각이 나올 수 있는 확률에 대한 함수가 확률 질량 함수이다. plt.subplot(211) plt.stem(xx,rv.pmf(xx)) plt.ylabel('확률질량 함수') plt.title('N=15 인 이항 분포의 확률 질량 함수') plt.annotate('검정 통계량 t=12', xy=(12,0.02),xytext=(12,0.1), arrowprops={'facecolor':'black'}) plt.show() # 12이 나올 확률 # print(rv.pmf(12-1)) # 이거 말고 누적 밀도함수(cdf)로 봐야한다. plt.subplot(212) plt.stem(xx,rv.cdf(xx)) plt.ylabel('누적 밀도 함수') plt.title('N=15 인 이항 분포의 누적 밀도 함수') plt.show() # 유의 확률 x=2*(1-rv.cdf(12-1)) print(x) #0.035
- 유의 수준을 5%로 설정한 경우, 유의 확률이 유의 수준보다 낮기 때문에, 귀무 가설을 기각합니다.
- 이 동정은 공정하지 않다.
ttest_1samp
함수를 사용
- 성적 데이터가 있을 때, 평균이 몇 점이라고 할 수 있는가?
- tdata.csv 파일의 성적을 읽어서, 평균이 75점이라고 할 수 있는지 유의 수준 5%로 검정해보자.
# tdata.csv 파일의 성적을 읽어서 평균이 75점이라고 할 수 있는지 # 유의 수준 5% 로 검정하자 items=pd.read_csv('./data/tdata.csv', encoding='cp949') # items.head() # 성적의 평균이 75라고 했을 떄의 유의 확률 result=sp.stats.ttest_1samp(items['성적'], popmean=75).pvalue # print(result) if result>=0.05: print("유의 확률이 유의 수준보다 크므로 귀무 가설 채택") print("평균은 75라고 할 수 있습니다.") else: print("유의 확률이 유의 수준보다 작으므로 귀무 가설 기각") print("평균은 75라고 할 수 없습니다.")
ttest_ind
함수를 이용# 첫 번쨰 데이터 집단 N_1=10 mu_1=0 sigma_1=1 # 두 번쨰 데이터 집단 N_2=10 mu_2=0.5 sigma_2=1 # 데이터 생성 np.random.seed(0) x1=sp.stats.norm(mu_1,sigma_1).rvs(N_1) x2=sp.stats.norm(mu_2,sigma_2).rvs(N_2) # print(x1) # print(x2) ax=sns.distplot(x1,kde=False,fit=sp.stats.norm, label='1번 데이터 집단') ax=sns.distplot(x2,kde=False,fit=sp.stats.norm, label='2번 데이터 집단') ax.lines[0].set_linestyle(":") plt.show() print(sp.stats.ttest_ind(x1,x2,equal_var=False)) # 유의 확률이 0.684 # 유의 수준을 얼마로 지정하더라고 귀무 가설을 기각할 수 없음 # 분명히 평균이 0과 0.5 다른데도 두 집단의 평균이 같다는 유의확률이 0.684 # 귀무 가설이 거짓인데 참이라고 나왔습니다. # 이런 경우를 2종 오류라고 하며, 원인은 대부분 데이터 개수의 부족
- 두 집단의 데이터 개수를 이전보다 크게(10->100) 설정해서 해결할 수 있다.
- 서로 다른 10명에게 수면제 1을 복용했을 때 수면 증가 시간과, 수면제 2를 복용했을 때 수면 증가 시간을 조사한 경우, 수면제 1과 2의 성능이 같다고 할 수 있을까?
# 서로 다른 수면제를 복용한 경우, # 약의 효과가 다른지 여부를 판단해보자. # pvalue가 0.05보다 크다면 귀무가설 채택 # 채택한다면 두개의 평균은 같다. x1=np.array([0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]) x2=np.array([1.9,0.8, 1.1, 0.1, -0.1, 4.5, 5.5, 1.6, 4.6, 3.4]) r=sp.stats.ttest_ind(x1,x2, equal_var=True) # print(r) if r.pvalue>=0.05: print("유의 확률이 유의 수준보다 크므로 귀무 가설 채택") print("두 수면제의 평균은 같다.") else: print("유의 확률이 유의 수준보다 작으므로 귀무 가설 기각") print("두 수면제의 평균은 다르다.")
ttest_rel
함수를 이용# 동일한 집단에게 수면제1과 2를 복용시켰을 때, 수면 시간의 변화 x1=np.array([0.7, -1.6, -0.2, -1.2, -0.1, 3.4, 3.7, 0.8, 0.0, 2.0]) x2=np.array([1.9,0.8, 1.1, 0.1, -0.1, 4.5, 5.5, 1.6, 4.6, 3.4]) r=sp.stats.ttest_rel(x1,x2) print(r)
# 윌콕슨의 부호 순위 검정 training_rel=pd.read_csv('./data/training_rel.csv') training_rel.head() # 데이터 6개 복제 toy_df=training_rel[:6].copy() # print(toy_df) # 2개 데이터의 차이를 구하기 toy_df['차']=toy_df['후']-toy_df['전'] # print(toy_df) # 차의 절대값을 가지고 순위를 구하자. toy_df['순위']=sp.stats.rankdata(abs(toy_df['차'])).astype(int) print(toy_df) # 차이가 음수일 때와 양수일 떄의 순위 합 구하기 r_minus=np.sum((toy_df['차']<0)*toy_df['순위']) r_plus=np.sum((toy_df['차']>0)*toy_df['순위']) print(r_minus,r_plus) # 2개의 값 중에 작은쪽이 검절 통계량 : 8 # 이 값과 임계값(직접 설정한 값)과 비교해서 # 임계값 보다 작은 경우에 귀무 가설이 기각되는 단측검정
-범주 별로 관츨 빈도와 기대 빈도의 차이를 통해서 확률 모형이 데이터를 얼마나 잘 설명하는지를 검정
헤드라인 별 클릭수를 조사해서 동일한 클릭률을 갖는지 확인
헤드라인 A : 14, 헤드라인 -8, 헤드라인 C : 12
클릭x : 988, 988, 988
헤드라인 A : 14, 헤드라인 -8, 헤드라인 C : 12
클릭x : 988, 988, 988
- 전체 클릭율을 조사 - 34/3000
- 피어슨 전차 =
(관측값-기대값)/기대값의 제곱근
- 카이제곱 통계량 구하기 - 피어슨 잔차들의 제곱합 : 1.666
- 이 값과 재표본 재표본 추출 알고리즘으로 나온 값 ㅣㅂ교 ***
- chisquare라는 함수를 이용해서 검정이 가능
- 5가지 음료를 각각 선택하도록 만들었을 때, 사람들이 선호하는 음료가 있는지 여부를 검정
41, 30, 51, 71, 61
- 유의 수준이 5% 로 카이 제곱 검정 수행: 카이제곱 검정은 T-test와 반대로 해석
- 유의 수준이 유의 확률보다 크면 귀무가설 식 채택
- 유의 수준이 유의 확률보다
data=[41,30,51,71,61] # 카이제곱검정을 수행 print(sp.stats.chisquare(data)) # 유의 수준을 5%로 설정하면 유의 수준이 유의 확률보다 크기에 # 선호도의 차이가 있다라고 해석 # 평균을 가지고 있는 검정과 분산을 가지고 하는 검정은 겨로가 해석을 반대로 합니다.
# 붓꽃 데이터 가져오기 from sklearn.datasets import load_iris\ # 항상 sklearn의 데이터는 data 속성에 feature가 존재하고 # target에 target이 존재합니다. iris=load_iris() print(iris)
# 붓꽃 데이터 가져오기 from sklearn.datasets import load_iris\ # 항상 sklearn의 데이터는 data 속성에 feature가 존재하고 # target에 target이 존재합니다. iris=load_iris() # print(iris) # 벡터는 하나의 행 # 가로나 세로 방향으로 여러 개의 스칼라 데이터가 모이면 벡터 # 여러 개의 데이터 묶음에서 하나의 데이터를 선택한 경우를 특징 벡터(Feature Vector) print(iris.data[0,:]) # 스칼라 print(iris.data[0,0]) # sklearn에서는 벡터를 대입할 때, 열 개수가 1개인 2차원 배열 객체를 대입해야 함 x1=np.array([5.1,3.5,1.4,0.2]) print(x1) # skearn에서는 위의 경우 아래처럼 생성해서 대입 x1=np.array([[5.1],[3.5],[1.4],[0.2]]) print(x1)
- 2차원 벡터가 들어오더라도 ML에서는 1차원으로 변환해서 사용함
2
ar=np.array([[1,2,3],[4,5,6]]) print(ar) print(ar.T) print(ar.transpose()) # 2차원 배열에서는 t랑 traspose 결과가 같음 # 3차원의 경우는 순서를 정해서 arr=np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) print(arr) print(arr.T) print(arr.transpose(2,1,0)) print(arr.transpose(1,0,2))
csr_matrix
함수이용toarray
함수를 이용합니다.
- 넥플릭스와 같은 사이트에서 유저와 영화간의 관계를 행렬로 나타내는 경우, 영화의 개수가 많고 실제 유가 본 영화의 개수는 몇 편 안되는데, 이것을 밀집 행렬로 나타내면 메모리 낭비가 발생하기 때문에, 이런 경우는 희소행렬을 사용한다.
from scipy import sparse # 대각 행렬 (대각선으로만 1이 있는 행렬)을 만드는데 # 기준선은 하나 위로 설정합니다. ar=np.eye(3,k=1) print(ar) # 희소 행렬로 변환 # 희소 행렬은 한눈에 알아보기가 어렵다.]] sp=sparse.csr_matrix(ar) print(sp) # 밀집 행렬로 변환 print(sp.toarray())
# 스칼라, 벡터, 행렬의 산술 연산 # 동일한 차원의 벡터 간의 산술 연산 # - shape가 같아야 합니다. x=np.array([10,11,12,13,14]) y=np.array([20,13,22,11,23]) print(x+y) # 다른 차원의 벡터 간의 산술 연산 # - shape가 다르면 작은 쪽의 shape를 큰 쪽에 맞추어 계산 print(x+5) # 벡터와 행렬의 계산 # 벡터의 데이터 개수와 행렬의 열의 개수가 같아야 가능합니다. ar=np.array([1,2,3]) matrix=np.array([[6,7,8],[16,17,18]]) # - shape가 다르면 작은 쪽의 shape를 큰 쪽에 맞추어 계산 print(ar+matrix)
numpy dot
함수나 @
연산자를 이용해도 됩니다.# 벡터의 내적 x=np.array([1,2,3]) y=np.array([4,5,6]) # 일차원 배열은 전치를 하지 않아도 내적 계산 가능 print(np.dot(x,y)) print(x@y) # 벡터의 내적은 행과 열의 개수가 크로스 방향으로 같을 때 가능함 print(x.T@y) x=np.array([[1],[2],[3]]) y=np.array([[4],[5],[6]]) # print(np.dot(x,y)) # 오류 # 내적을 할 때는 한 쪽을 전치해줘야 한다. print(np.dot(x.T, y))
내적을 사용하는 대표적인 경우는 가중치 적용이다.
score=np.array([90,70,85]) # 단순한 평균 print(score.mean()) # 학점이 3,2,3 학점일 때, 그냥 평균으로 처리해야 할까? # 이럴 때 쓰는 것이 가중합이다. # 가중 평균 구하기 su=np.array([3,2,3]) print(score@su / 8)
유사도 계산
# 이미지의 유사도 계산 from sklearn.datasets import load_digits import matplotlib.gridspec as GridSpec digits=load_digits() # print(digits) # 이미지 가져오기 # 숫자 0 d1=digits.images[0] d2=digits.images[10] # 숫자 1 d3=digits.images[1] d4=digits.images[11] # 이미지 데이터 - 2차원이지만 이를 일차원으로 만들자. v1=d1.reshape(64,1) v2=d2.reshape(64,1) v3=d3.reshape(64,1) v4=d4.reshape(64,1) plt.figure(figsize=(9,9)) gs=gridspec.GridSpec(1,8, height_ratios=[1], width_ratios=[9,1,9,1,9,1,9,1]) for i in range(4): plt.subplot(gs[2*i]) # 원본 이미지 출력 plt.imshow(eval("d"+str(i+1)),aspect=1, interpolation='nearest', cmap=plt.cm.bone_r) plt.grid(False) plt.xticks([]) plt.yticks([]) plt.title("image {}".format(i+1)) plt.subplot(gs[2*i+1]) plt.imshow(eval("v"+str(i+1)),aspect=0.25, interpolation='nearest', cmap=plt.cm.bone_r) plt.grid(False) plt.xticks([]) plt.yticks([]) plt.show() # 유사도 계산하기 # 1차원으로 하면 값이 하나로 나옴 print(d1.T@d2) print(v1.T@v2) # 내적이 가장 큼 print(v1.T@v3) print(v1.T@v4) print('==============') print(v3.T@v1) print(v3.T@v2) print(v3.T@v4) # 내적이 가장 큼
가중치1 독립변수1 + 가중치2 독립변수2 ...+절편(intercept,상수)=종속변수
np.dot
에 차원이 1을 초과한 행렬을 2개 대입하면 행렬의 곱a=np.array([[1,2,3],[4,5,6]]) #2x3 b=np.array([[1,2],[3,4],[5,6]]) # 3x2 # 결과물은 2x2 print(np.dot(a,b))
행렬과 단위 행렬을 곱셈하면 자기 자신이 리턴됩니다.
ar=np.array([[1,2,3],[4,5,6],[7,8,9]]) i=np.eye(3) print(ar@i)
# 행렬과 벡터의 곱셈을 이용한 이미지 모핑(Morphing) #얼굴 이미지 데이터 가져오기 from sklearn.datasets import fetch_olivetti_faces faces=fetch_olivetti_faces() f,ax=plt.subplots(1,3) new_face=0.65*faces.images[13]+0.35*faces.images[26] ax[0].imshow(faces.images[13],cmap=plt.cm.bone) ax[0].grid(False) ax[0].set_xticks([]) ax[0].set_yticks([]) ax[0].set_title("image 1") ax[1].imshow(faces.images[26],cmap=plt.cm.bone) ax[1].grid(False) ax[1].set_xticks([]) ax[1].set_yticks([]) ax[1].set_title("image 2") ax[2].imshow(new_face,cmap=plt.cm.bone) ax[2].grid(False) ax[2].set_xticks([]) ax[2].set_yticks([]) ax[2].set_title("image 3") plt.show()
# 잔차 제곱합 구하기 x=np.array([1,2,3]) A=np.arange(1,10).reshape(3,3) # 잔차 제곱합 print(x.T@A@x)
(행벡터 @ 정방행렬 @ 열벡터)
형태로 존재하는 것numpy.trace
함수를 이용해서 구할 수 있음vector=np.eye(3) print(vector) print(np.trace(vector))
numpy.linalg.det
함수를 이용해서 행렬식으로 계산할 수 있습니다.# 행렬식 mat=np.array([[1,2],[3,4]]) print(np.linalg.det(mat))
(1/(ad-bc) 곱셈 [[d-b],[-c,a]])
numpy.linalg.inv
함수로 역행렬을 구할 수 있습니다.# 역행렬 구하기 a=np.array([[1,2],[3,4]]) inv=np.linalg.inv(a) print(inv) print(a.T@inv)
인공지능 > 머신러닝 > 딥러닝
머신러닝은 가능성 있는 공간을 사전에 정의하고 피드백 신호의 도움을 받아서 입력 데이터에 대한 유용한 변환을 찾는 것입니다.