[python] Machine Learning 통계 목적에 따른 분류
통계 목적에 따른 분류
Statistical Hypothesis Testing
통계 목적에 따른 분류
통계의 목적에 따른 분류
- 기술통계와 추리통계
# 통계의 목적에 따른 분류 # 1. 기술통계(Descriptive statistics) # - 우리에게 주어진 데이터를 요약, 설명, 분석하는 통계기법을 의미 # - pandas(EDA - 탐색적 데이터 분석) # - 평균(대표값), 분산(데이터의 흩어져있는 정보인 분포) # 2. 추리통계(Inferential statistics) # - 수집한 데이터를 기반으로 어떠한 사실을 예측하고 검정하는 통계기법을 의미 # - 통계적 가설 검증 : 표본으로부터 얻은 어떠한 사실을 근간으로 가설이 맞는지를 통계적으로 검정하는 방법 # - 데이터에 대한 제일 먼저 할일은 가설을 정의하는 것. # -- 귀무가설(H0)(null hypothesis) : 관계가 없다. 영향력이 없다. 관련이 없다. 등 # 채택되기 원하는 가설이 아니다. reject가 되는것을 기대하는 가설 # -- 대립가설(H1)(alternative hypothesis) : 관계가 있다. 영향력이 있다. 관련이 있다. 등 # 통계에 근거해서 채택되기를 원하는 가설. 내가 주장하고 싶은것.
Q. 통계적 가설 검정 문제
# 통계적 가설 검정 예시
# 우리나라 남자의 평균 수명 75, 표준편차는 10
# 의학기술의 발달로 수명이 더 높아졌을 것이라는 의견
# 최근 사망한 남성 30명의 수명을 조사 => 평균 79
# 유의수준 0.1에서(90%의 신뢰수준)에서 가설을 검정
# 내가 푼것
H0 = "평균 수명은 변화가 없다." # 귀무가설 : 내가 주장하고 싶은 것의 역
H1 = "평균 수명이 더 증가했다." # 대립가설 : 내가 주장하고 싶은 것
#CV = (79 - 75) / (10 / 30 ** 0.5)
CV = (10 / 30 ** 0.5)
CV = CV * 1.28
CV = CV + 75
print(CV)
if CV > 75:
print("대립가설")
else:
print("귀무가설")
# 결과값 :
77.3369495786887
대립가설
# 강사님이 푼것
import numpy as np
H0 = "평균 수명은 변화가 없다." # 귀무가설 : 내가 주장하고 싶은 것의 역
H1 = "평균 수명이 더 증가했다." # 대립가설 : 내가 주장하고 싶은 것
last_mean = 75 #지난 평균
last_std = 10 #표준편차
num_of_sample = 30 # 샘플 수
mean_of_sample = 79 # 샘플의 평균 수명
z = 1.28 #alpha = 0.1 # 유의수준 10%(alpha = 0.1 이면 z값 = 1.28)
# z = (CV - mean) / (std / squr(사람수))
CV = z * (last_std / np.sqrt(num_of_sample)) + last_mean
print(CV)
if mean_of_sample > CV:
print(H1)
else:
print(H0)
# 결과값 :
77.3369495786887
평균 수명이 더 증가했다.
Q. 카이제곱 검정 문제
# 내가 푼것(1)
import numpy as np
import pandas as pd
H0 = "흡연량과 음주량 사이에는 연관성이 없다."
H1 = "흡연량과 음주량 사이에는 연관성이 있다."
data = {"1갑 이상" : [23,31,13,67],
"1갑 이하" : [21,48,23,92],
"안피움" : [63,159,119,341],
"계" : [107,238,155,500]}
df = pd.DataFrame(data,
columns=["1갑 이상","1갑 이하","안피움","계"],
index=["반병 이상","반병 이하","못마심","계"])
display(df)
aa = df.loc["반병 이상","1갑 이상"]
ba = df.loc["반병 이하","1갑 이상"]
ca = df.loc["못마심","1갑 이상"]
da = df.loc["계","1갑 이상"]
ab = df.loc["반병 이상","1갑 이하"]
bb = df.loc["반병 이하","1갑 이하"]
cb = df.loc["못마심","1갑 이하"]
db = df.loc["계","1갑 이하"]
ac = df.loc["반병 이상","안피움"]
bc = df.loc["반병 이하","안피움"]
cc = df.loc["못마심","안피움"]
dc = df.loc["계","안피움"]
ad = df.loc["반병 이상","계"]
bd = df.loc["반병 이하","계"]
cd = df.loc["못마심","계"]
dd = df.loc["계","계"]
expected_result_aa = (da / dd * ad / dd) * dd
observed_value_aa = aa - expected_result_aa
_observed_value_aa = observed_value_aa ** 2
chi_aa1 = (((observed_value_aa - expected_result_aa) ** 2) / expected_result_aa)
_chi_aa1 = chi_aa1 ** 2
print("기대값 :", expected_result_aa)
print("관측값 :", observed_value_aa)
print("관측값-기대값의 제곱 :", _observed_value_aa)
print("카이스퀘어 :", _chi_aa1)
# 내가 푼것(2)
import numpy as np
import pandas as pd
H0 = "흡연량과 음주량 사이에는 연관성이 없다."
H1 = "흡연량과 음주량 사이에는 연관성이 있다."
arr = np.array([[23,21,63,107],
[31,48,159,238],
[13,23,119,155],
[67,92,341,500]])
arr_d1 = 67
arr_d2 = 92
arr_d3 = 341
arr_a1 = 107
arr_a2 = 238
arr_a3 = 155
arr_sum = 500
expected_result = (arr[3,0] / arr_sum * arr[0,3] / arr_sum) * arr_sum
observed_value = arr[0,0] - expected_result
observed_value_sq = observed_value ** 2
chi = observed_value_sq / expected_result
print("값 :", arr[0,0])
print("기대값 :", expected_result)
print("관측값-기대값 :", observed_value)
print("제곱 :", observed_value_sq)
print("카이스퀘어 :", chi)
# 결과값 :
값 : 23
기대값 : 14.338000000000001
관측값-기대값 : 8.661999999999999
제곱 : 75.03024399999998
카이스퀘어 : 5.232964430185519
# 강사님이 푼거
import numpy as np
from scipy import stats
arr = np.array([[23,21,63],
[31,48,159],
[13,23,119],
[67,92,341]])
chi2, pvalue, free, _table = stats.chi2_contingency(arr)
print("카이제곱값 : {}".format(chi2))
print("pvalue : {}".format(pvalue))
print("자유도 : {}".format(free))
if pvalue < 0.05:
print("대립가설 accept")
else:
print("귀무가설 accept")
print(arr)
# 결과값 :
카이제곱값 : 12.826630603041854
pvalue : 0.045873182714106564
자유도 : 6
대립가설 accept
[[ 23 21 63]
[ 31 48 159]
[ 13 23 119]
[ 67 92 341]]
통계란
- 기술통계와 추리통계
# matplotlib을 이용한 graph 그리기 # data간의 관계, 방향성등을 눈으로 파악하기 위해서 사용 # [통계] # 통계는 목적에 따라서 크게 두가지 분류로 구분 # 1. 가지고 있는 데이터를 분석해서 해당 데이터를 요약 # - 특정한 사실을 이끌어내는 통계 기법 # - 기술통계 : EDA(탐색적 데이터 분석) # 2. 수집한 데이터를 기반으로 모집단의 특성을 유추 # - 독렵변수에 따른 종속변수의 변화를 예측하기 위해서 사용하는 통계기법 # - 추리(추론)통계 # - 통계적 가설 검정 : 표본에 대한 내용을 근거로 모집단의 특성을 유추하는 것 # 가설 : 귀무가설(기각이 목표), 대립가설(채택이 목표) # 또 다른 목적으로 통계적 가설 검정을 이용한다. # 머신러닝을 위해 여러가지 입력 parameter들이 들어간다. # 특정 parameter는 머신러닝을 위해 필요하며, 어떤 parameter는 그닥 필요가 없다. # parameter간의 관계성을 고려해서 입력 parameter를 설정해주는 작업이 필요하다. # parameter간의 관련성을 검증하기 위해 통계적 가설검증이 사용된다. # 음주량과 흡연량의 관계를 통계적으로 가설검증 기법으로 알아본다. # 범주형으로 되어 있고 밀도 값이 데이터로 사용되는 이런 검증에 카이제곱검증이 이용된다.
독립표본 t검정(2Sample t-test)
- stats.ttest_ind(x,y)
# 독립표본 t검정 연습문제 # 두 집단의 평균을 이용해서 두 집단이 서로 차이가 있는지를 판단하는 검정 방법 # 그룹1과 그룹2의 평균키를 조사해서 그 차이가 있는지 혹은 차이를 무시할 정도인지를 판별 # 귀무가설 : 두 그룹간의 평균키의 차이가 없다. # 대립가설 : 두 그룹간의 평균키의 차이는 의미가 있다. import numpy as np from scipy import stats np.random.seed(1) group1 = [170 + np.random.normal(2,1) for _ in range(10)] # 사용하지 않는 변수는 _를 쓴다 group2 = [174 + np.random.normal(0,3) for _ in range(10)] print("Group1의 평균 : {}".format(np.mean(group1))) print("Group2의 평균 : {}".format(np.mean(group2))) print(stats.ttest_ind(group1,group2)) # 결과값 : Ttest_indResult(statistic=-1.4774069798043346, pvalue=0.15685018595907008) # pvalue가 0.05보다 크니 귀무가설을 선택한다. # pvalue가 0.05보다 작으면 대립가설을 채택한다. #_, pvalue => 값이 두개니깐 첫번째꺼는 안쓰니깐 _, 두번째꺼는 pvalue 변수로 지정 _, pvalue = stats.ttest_ind(group1,group2) print(pvalue) if pvalue < 0.05: print("대립가설 선택 : 평균키의 차이는 의미가 있다.") else: print("귀무가설 선택 : 평균키의 차이는 의미가 없다.") # 결과값 : Group1의 평균 : 171.9028591091939 Group2의 평균 : 173.4912348536539 Ttest_indResult(statistic=-1.4774069798043346, pvalue=0.15685018595907008) 0.15685018595907008 귀무가설 선택 : 평균키의 차이는 의미가 없다.
대응표본 t검정(pared t-test)
- 어느 한 독립표본에 대해서 전과 후를 비교
- stats.ttest_rel(x,y)
# 대응표본 t검정 연습문제 # 다이어트약의 복용전과 복용후의 값을 통계적으로 검증하여 약의 효과를 알아보기 위해서 사용. # 귀무가설 : 복용전후의 체중의 차이가 없다. # 대립가설 : 복용전후의 체중의 차이가 있다. import numpy as np from scipy import stats before = [60 + np.random.normal(0,5) for _ in range(20)] after = [w - np.random.normal(2,1) for w in before] _, pvalue = stats.ttest_rel(before,after) print(pvalue) if pvalue < 0.05: print("대립가설이 채택 : 다이어트 약이 효과가 있다.") else: print("귀무가설이 채택 : 다이어트 약이 효과가 없다.") # 결과값 : 1.1068298590940042e-09 대립가설이 채택 : 다이어트 약이 효과가 있다.
분산분석(ANOVA)
- 2개의 데이터를 비교할 때는 대응표본 t검증을 사용
- 3개의 이상일 땐 ANOVA를 사용
- stats.f_oneway(a,b,c,d.,)
# ANOVA 검정 # 비교대상이 3개 이상일 경우 t-test 대신 사용 from scipy import stats #교육 훈련 데이터 a = [67,45,98,67,34,22] b = [56,48,80,37,32,62] c = [47,47,58,37,84,12] d = [77,65,38,87,24,32] _, pvalue = stats.f_oneway(a,b,c,d) print(pvalue) if pvalue < 0.05: print("대립가설이 채택 : 교육 효과가 있다.") else: print("귀무가설이 채택 : 교육 효과가 없다.") # 결과값 : 0.9447776342385614 귀무가설이 채택 : 교육 효과가 없다.
References
개발자님들 덕분에 많이 배울 수 있었습니다. 감사의 말씀 드립니다.