ABtest原理及python程式碼

專注的阿熊發表於2021-08-04

# coding=utf-8

import numpy as np

import pandas as pd

from scipy import stats

import statsmodels.stats.weightstats as sw

# 兩個樣本長度相同

x1 = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])

x2 = np.array([1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,1,1])

# 大量資料匯入

# df_x1 = pd.read_excel()

# df_x2 = pd.read_excel()

# np.array(df_x1['lable'].tolist())

# np.array(df_x2['lable'].tolist())

# 樣本均值是否顯著差異檢驗

def ABTest(x1,x2,alpha = 0.05):

     '''

     :param x1: 樣本 1

     :param x2: 樣本 2

     :param alpha: 1 類錯誤容許值

     :return: z/t p 統計量 p

     '''

     # 樣本量大於 30 時,使用 Z 檢驗

     if len(x1) >30:

         z,p = sw.ztest(x1, x2, value=0)

         # 詳細計算公式

         # 樣本標準誤差,分母使用 n-1

         # x1_mean,x1_std,x2_mean,x2_std = x1.mean(),x1.std(ddof = 1),x2.mean(),x2.std(ddof = 1)

         # z = (x1_mean - x2_mean) / np.sqrt(x1_std ** 2 / len(x1) + x2_std ** 2 /len(x2))

         # p = 2*stats.norm.sf(abs(z))

         # 根據 alpha 計算置信區間 外匯跟單gendan5.com Z 分數服從標準正態分佈

         d = stats.norm.ppf(1 - alpha / 2)

         floor = - d

         ceil = d

         print(' 使用 Z 檢驗 ')

         print('Z 分數為 {}'.format(z))

         print(' 置信區間為 [{0},{1}]'.format(floor,ceil))

         print('p 值為 {0},{1}alpha, 認為 x1,x2 均值差異 {2}'.format(p,' 大於 ' if p > alpha else ' 小於 ',' 顯著 ' if p < alpha else ' 不顯著 '))

         return z,p

     # 樣本量不夠大,使用 t 檢驗

     else:

         x = x1 - x2

         t,p = stats.ttest_1samp(x,0)

         d = stats.norm.ppf(1 - alpha / 2)

         floor = - d

         ceil = d

         print(' 使用 T 檢驗 ')

         print('T 分數為 {}'.format(t))

         print(' 置信區間為 [{0},{1}]'.format(floor,ceil))

         print('p 值為 {0},{1}alpha, 認為 x1,x2 均值差異 {2}'.format(p,' 大於 ' if p > alpha else ' 小於 ',' 顯著 ' if p < alpha else ' 不顯著 '))

         return t,p

ABTest(x1,x2)

結果:

使用 Z 檢驗

Z 分數為 -7.1414284285428495

置信區間為 [-1.959963984540054,1.959963984540054]

p 值為 9.236596617174027e-13, 小於 alpha, 認為 x1,x2 均值差異顯著

Out[21]: (-7.1414284285428495, 9.236596617174027e-13)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2785265/,如需轉載,請註明出處,否則將追究法律責任。

相關文章