# ',' 가 들어있는지 확인 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 #
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
느티나무와 왕벚나무 평균 데이터의 가설검정
✅귀무가설
느티나무와 왕벚나무의 평균수는 같을 것이다. (차이가 없을 것이다)
✅대립가설
느티나무와 왕벚나무의 평균수는 다를 것이다.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
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