[TIL] 21.05.13 t-test

Seung Joo·2021년 5월 14일
0

TIL

목록 보기
5/31
post-thumbnail

1. str.contains()의 사용 및 str.replace()의 활용

# ',' 가 들어있는지 확인
epop_trees_df['이팝나무'].str.contains(',').sum()


# out
# 6
#

pd.to_numeric()에 str.replace() 활용

# ',' 지우고 숫자형으로 변환
epop_trees_df['이팝나무'] = pd.to_numeric(epop_trees_df['이팝나무'].str.replace(',', ''))
epop_trees_df.dtypes


# out
# 이팝나무    int64
#

2. scipy 의 stats t-test

from scipy import stats

epop_trees_df.mean()[0]
# 688.64

# 서울시의 구별 평균 이팝나무의 수가 400개일 것이다는 것에 대한 가설검정
ttest_epoptrees = stats.ttest_1samp(epop_trees_df, popmean=400)
ttest_epoptrees



# out
# Ttest_1sampResult(statistic=array([3.38092056]), pvalue=array([0.00247071]))
#

P-value가 0.002470.... 이므로 유의 수준인 0.05보다 낮기 때문에
귀무가설이 "틀리다" 라고 판단할 수 있고 그에 따라 귀무가설을 기각하고
대립가설인 서울시 구별 이팝나무의 수가 평균 400개가 아니다라는 것으로
채택할 수 있음.

Two-Sample test

# 서울시 가로수 데이터에서 느티나무(Zelkova tree), 
# 왕벚나무(Yoshino_cherry_tree) 데이터만 추리기
zelkova_trees_df = pd.DataFrame(new_trees_df['느티나무'])
yoshino_cherry_trees_df = pd.DataFrame(new_trees_df['왕벚나무'])
print(zelkova_trees_df.head())
print(yoshino_cherry_trees_df.head())


# out
#   느티나무
# 1   619
# 2   460
# 3   373
# 4  1,975
# 5  1,057
#   왕벚나무
# 1   421
# 2   289
# 3   262
# 4   602
# 5   940


# 느티나무, 왕벚나무 데이터 숫자형 변환
zelkova_trees_df['느티나무'] = pd.to_numeric(zelkova_trees_df['느티나무'].str.replace(',', ''))
yoshino_cherry_trees_df['왕벚나무'] = pd.to_numeric(yoshino_cherry_trees_df['왕벚나무'].str.replace(',', ''))
print(zelkova_trees_df.dtypes)
print(yoshino_cherry_trees_df.dtypes)


# out
# 느티나무    int64
# dtype: object
# 왕벚나무    int64
# dtype: object


# 가설검정 테스트 전 평균 확인
print(zelkova_trees_df.mean(), yoshino_cherry_trees_df.mean())


# out
# 느티나무    1415.12
# dtype: float64 왕벚나무    1292.0
# dtype: float64

느티나무와 왕벚나무 평균 데이터의 가설검정
H0=μ1=μ2H0=μ1=μ2
H1=μ1μ2H1=μ1\not=μ2
✅귀무가설
느티나무와 왕벚나무의 평균수는 같을 것이다. (차이가 없을 것이다)
✅대립가설
느티나무와 왕벚나무의 평균수는 다를 것이다.

t_samp_o_tail_ttest = stats.ttest_ind(zelkova_trees_df, yoshino_cherry_trees_df)
t_samp_o_tail_ttest


# out
# Ttest_indResult(statistic=array([0.4629256]), pvalue=array([0.64550969]))

느티나무와 왕벚나무의 P-value가 0.64550... 이므로 귀무가설이 옳을 확률이 50% 이상이고 다르다고 단정 지을 수 없다. 하지만 t-stastics의 값으 0.4629... 이므로 오차가 어느정도 있다고 판단할 수 있다. 결국 귀무가설을 신뢰할 수 없다.

Two-Sample One-tailed test

# one side tailed 계산
# one side tailed 일 경우 p-value 값을 2로 나누어 주어야 한다.
# 95% 신뢰도를 기준으로 유의수준(alpha) = 0.05
# 만약 귀무가설을 기각하고 왕벚나무의 평균이 느티나무보다 크다면 P-value / 2 < alpha & t_statistics < 0
# 만약 귀무가설을 기각하고 왕벚나무의 평균이 느티나무보다 작다면 P-value / 2 < alpha & t_statistics > 0
# 만약 귀무가설을 기각하지 않고 왕벚나무의 평균이 느티나무보다 크다면 P-value / 2 > alpha & t_statistics < 0
# 만약 귀무가설을 기각하지 않고 왕벚나무의 평균이 느티나무보다 작다면 P-value / 2 > alpha & t_statistics > 0
print("유의미하며 기각하며 왕벚나무의 평균이 느티나무보다 크다. = {}".format((ttest_pval / 2 < 0.05) & (ttest_t_statistics < 0)))
print("유의미하며 왕벚나무의 평균이 느티나무보다 작다. = {}".format((ttest_pval / 2 < 0.05) & (ttest_t_statistics > 0)))
print("유의미 하지 않으며 왕벚나무의 평균이 느티나무보다 크다. = {}".format((ttest_pval / 2 > 0.05) & (ttest_t_statistics < 0)))
print("유의미 하지 않으며 없으며 왕벚나무의 평균이 느티나무보다 작다. = {}".format((ttest_pval / 2 > 0.05) & (ttest_t_statistics > 0)))
#
#
# out
# 유의미하며 기각하며 왕벚나무의 평균이 느티나무보다 크다. = False
# 유의미하며 왕벚나무의 평균이 느티나무보다 작다. = False
# 유의미 하지 않으며 왕벚나무의 평균이 느티나무보다 크다. = False
# 유의미 하지 않으며 없으며 왕벚나무의 평균이 느티나무보다 작다. = True

3. 표본추출(Sampling)

import numpy as np
np.random.seed(123)

# 이팝나무 수 샘플 뽑기
samp_epop_tree = np.random.choice(epop_trees_df['이팝나무'].values, size=10, replace=False)
# replace=False -> 비복원 추출
print(samp_epop_tree)
print(samp_epop_tree.mean())


# out
# [1176  446  768 1281 1426  575  853  443  760  709]
# 843.7

systematic_sampling 함수

# 체계적 추출 함수 만들기 systematic_sampling
def systematic_sampling(data, step):
    indexes = np.arange(0, len(data), step=step)
    systematic_sample = data.iloc[indexes]
    return systematic_sample
   
# 샘플 데이터의 데이터 프레임
df = pd.DataFrame(data=sample_data, columns=['num'])

# 체계적 추출 systematic sampling
systematic_sample = systematic_sampling(df, 5)
print(systematic_sample.head())
print('-'*20)
print("추출 갯수 :", len(systematic_sample))


# out

#     num
# 0     1
# 5     6
# 10   11
# 15   16
# 20   21
# --------------------
# 추출 갯수 : 20
profile
조금씩 천천히

0개의 댓글