這是兩款鍵盤布局不一樣的手機(A版本,B版本),你作為公司的產品經理,想在正式發布產品之前知道,哪個鍵盤布局對用戶體驗更好呢? 首先,我們需要設置目標,用來衡量各個版本的優劣,如果是電商網站,目標可以是點擊率,注冊率,頁面停留時間等。 在這個鍵盤布局案例里,如果一個鍵盤布局對用戶打字時拼錯產生的影響較小,那么這個布局是符合用戶體驗習慣的。所以我們將目標定為用戶打字時拼錯字產生的影響。 有了目標以后,下一步就是采集數據。在這一部分,用戶會隨機分配到不同版本中,通過他們的交互行為會被直接檢測,並收集起來作為以后分析的重要數據。 我們隨機抽取實驗者,將實驗者分成2組,每組25人,A組使用鍵盤布局A,B組使用鍵盤布局B。讓他們在30秒內打出標准的20個單詞文字消息,然后記錄打錯字的數量。 我們將數據記錄在Excel中,A列是使用鍵盤布局A打錯字的數量,B列是使用鍵盤布局B打錯字的數量。 現在我們開始A/B測
A/B test是什么?
簡單來說,A/B測試是一種用於提升App/H5/小程序產品轉化率、優化獲客成本的數據決策方法。
什么時候適合做A/B test
一個產品在遇到“影響大,選擇難”問題的時候,是最適合做AB測試的。

A/B test工具的選擇
怎么做?
一、描述統計分析
我們開展調查研究並計算統計結果時,我們會在報告的第一部分進行描述統計分析,例如平均值和標准差。
描述統計量是研究的核心。告訴我們研究中發生的情況,應該始終報告出來。
#導入包 import pandas as pd import numpy as np import matplotlib.pyplot as plt #文件路徑 fileNameStr='鍵盤AB測試.xlsx' #讀取Ecxcel數據,統一先按照字符串讀入,之后轉換 xls = pd.ExcelFile(fileNameStr) data = xls.parse('Sheet1') data.head()
#查看每一列的數據類型 data.dtypes

#描述統計信息 data.describe()

#字符串轉換為數值(浮點型) data['A'] = data['A'].astype('int') data['B'] = data['B'].astype('int') print('轉換后的數據類型:\n',data.dtypes)

#樣本平均值 a_mean=data['A'].mean() b_mean=data['B'].mean() print('A版本平均值=',a_mean,'單位:打錯字數量') print('B版本平均值=',b_mean,'單位:打錯字數量') ''' 這里要區別:數據集的標准差,和樣本標准差 數據集的標准差公式除以的是n,樣本標准差公式除以的是n-1。 樣本標准差,用途是用樣本標准差估計出總體標准差 pandas計算的標准差,默認除以的是n-1,也就是計算出的是樣本標准差 pandas標准差官網地址:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.std.html ''' #樣本標准差 a_std=data['A'].std() b_std=data['B'].std() print('A版本樣本大小25,樣本標准差=',a_std,'單位:打錯字數量') print('B版本樣本大小25,樣本標准差=',b_std,'單位:打錯字數量')

二、推論統計分析
推論統計分析報告中包括:假設檢驗,置信區間,效應量
1. 問題是什么?
零假設和備選假設
要研究的問題是:哪個鍵盤布局對用戶體驗更好呢?
根據這個問題我提出來下面兩個互為相反的假設。
零假設:A版本和B版本沒有差別,也就是A版本平均值=B版本平均值。
零假設總是表述為研究沒有改變,沒有效果,不起作用等,這里就是不滿足標准。
備選假設:A版本和B版本有差別,也就是A版本平均值 不等於 B版本平均值。
檢驗類型
檢驗類型有很多種,因為這里有2組樣本,是不同的人,所以選擇雙獨立樣本檢驗。
抽樣分布類型
我們還要判斷抽樣分布是哪種?因為抽樣分布的類型,決定了后面計算p值的不同。
在我們這個AB測試案例中,樣本大小是25(小於30),屬於小樣本。
那小樣本的抽樣分布是否滿足t分布呢?因為t分布還要求總體分布近似正態分布,但是總體分布我們是不知道的,我們可以通過樣本數據集的分布來推斷總體分布。
"""設置字體,用於顯示中文""" plt.rcParams['font.sans-serif']=['FangSong'] """SimSun 宋體,Microsoft YaHei微軟雅黑 YouYuan幼圓 FangSong仿宋""" plt.rcParams['font.size']=20 plt.rcParams['axes.unicode_minus']=False# 負號亂碼 ''' 直方圖能夠粗略估計數據密度,如果想給數據一個更精確的擬合曲線(專業術語叫:核密度估計kernel density estimate (KDE)), Seaborn 可以很方便的畫出直方圖和擬合曲線。 查看數據集分布官網教程地址:https://seaborn.pydata.org/tutorial/distributions.html ''' ''' 需要在conda中先安裝繪圖包seaborn: conda install seaborn ''' import seaborn as sns #查看數據集分布 sns.distplot(data['A']) plt.title('A版本數據集分布') plt.show() sns.distplot(data['B']) plt.title('B版本數據集分布') plt.show()'
通過觀察上面數據集分布圖,兩個樣本數據集都近似正態分布,滿足t分布的使用條件,所以抽樣分布是t分布
檢驗方向
單尾檢驗(左尾,右尾),還是雙尾檢驗?
因為備選假設是A版本和B版本有差別,也就是A版本平均值 不等於 B版本平均值,所以我們使用雙尾檢驗。
總結
綜合以上分析,本次假設檢驗是雙獨立樣本t檢驗,雙尾檢驗。
2.證據是什么?
在零假設成立前提下,得到樣本平均值的概率p是多少?
獨立雙樣本t檢驗,計算標准誤差和自由度的公式想要深入了解的可以看這里: https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test
''' Scipy的雙獨立樣本t檢驗不能返回自由度,對於后面計算置信區間不方便。所以我們使用另一個統計包(statsmodels) 需要在conda中當前notebook文件所在的python環境下安裝統計包(statsmodels),安裝命令: conda install statsmodels 雙獨立(independent)樣本t檢驗(ttest_ind) statsmodels.stats.weightstats.ttest_ind 官網使用文檔http://www.statsmodels.org/dev/generated/statsmodels.stats.weightstats.ttest_ind.html ''' import statsmodels.stats.weightstats as st ''' ttest_ind:獨立雙樣本t檢驗, usevar='unequal'兩個總體方差不一樣 返回的第1個值t是假設檢驗計算出的(t值), 第2個p_two是雙尾檢驗的p值 第3個df是獨立雙樣本的自由度 ''' t,p_two,df=st.ttest_ind(data['A'],data['B'], usevar='unequal') #自由度一般只保留整數部分 print('t=',t,'p_two=',p_two,',df=',df)
3. 判斷標准是什么?
#判斷標准(顯著水平)使用alpha=5% alpha=0.05
4. 做出結論
''' 雙尾判斷條件:p < 判斷標准(顯著水平)alpha/2 時,拒絕零假設,有統計顯著,也就是有顯著差異 ''' #做出結論 if(p_two< alpha/2): print('拒絕零假設,有統計顯著,也就是接受備選假設') print('備選假設:A版本和B版本有差異') else: print('接受零假設,沒有統計顯著') print('零假設:A版本和B版本沒有差異')

獨立雙樣本t(45)=-4.05 , p=.00019 (α=5%),雙尾檢驗
統計上存在顯著差異,拒絕零假設,從而驗證A版本和B版本存在顯著差異。
5.置信區間
圖片里是APA格式的置信區間:平均值的置信區間,95% CI=(a,b)
在報告告置信區間時,提供了這樣幾個信息: 1)開頭會說是哪種類型的置信區間 例如在單樣本檢驗中是單個平均值的置信區間,
但是在我們后面要講到的相關樣本檢驗是兩個平均值之間差異的置信區間。 在這個案例里,我們是單個平均值的置信區間 2)置信水平和區間的上下限。
置信水平(簡寫為CI),括號里寫上下限。這里是955的置信水平
''' 1)置信水平對應的t值(t_ci) 查t表格可以得到,95%的置信水平,自由度是n-1對應的t值 2)計算上下限, 置信區間上限a=樣本平均值 - t_ci ×標准誤差 置信區間下限b=樣本平均值 - t_ci ×標准誤差 ''' ''' 95%的置信水平,自由度df對應的t值,可以查找t表格獲取, 也可以通過這個工具獲取:https://www.graphpad.com/quickcalcs/statratio1/(利用這個工具獲取t值,需要注意輸入的概率值是1-95%=0.05) 注意:課程中這里對應的下面t_ci值有誤,以下面的值為准 ''' t_ci=2.0141 #樣本大小n a_n = 25 b_n = 25 ''' numpy.square 平方 numpy.sqrt開方 標准誤差計算公式: https://en.wikipedia.org/wiki/Student%27s_t-test#Independent_two-sample_t-test ''' se=np.sqrt( np.square(a_std)/a_n + np.square(b_std)/b_n ) ''' 對於雙獨立樣本檢驗 置信區間的樣本平均值=A版本平均值 - B版本平均值 ''' sample_mean=a_mean - b_mean #置信區間上限 a=sample_mean - t_ci * se #置信區間下限 b=sample_mean + t_ci * se
print('兩個平均值差值的置信區間,95置信水平 CI=[%f,%f]' % (a,b))

置信區間是[-2.76,-2.68],平均下來,使用A鍵盤的錯誤數量要比B鍵盤的要少大約3到2個
6.效應量
為什么要給出效應量?
在判斷某個調查研究的結果,是否有意義或者重要時,要考慮的另一項指標是效應量。效應量太小,意味着處理即使達到了顯著水平,也缺乏實用價值。
所以,在假設檢驗中,我們給出了是否具有統計顯著性,也要給出效應量,一起來判斷研究結果是否有意義。
效應量報告格式:d=x.xx ,R2=.xx
''' 效應量:差異指標Cohen's d 這里的標准差,因為是雙獨立樣本,需要用合並標准差(pooled standard deviations)代替 ''' #合並標准差 sp=np.sqrt(((a_n-1)*np.square(a_std) + (b_n-1)* np.square(a_std) ) / (a_n+b_n-2)) #效應量Cohen's d d=(a_mean - b_mean) / sp print('d=',d)

三、數據分析報告
1、描述統計分析
A版本打錯字數量 平均是5.08個,標准差是2.06個
B版本打錯字數量 平均是7.8個,標准差是2.65個
2、推論統計分析 1)假設檢驗 獨立雙樣本t(45)=-4.05 , p=.00019 (α=5%) , 雙尾檢驗
拒絕零假設,統計顯著。
2)置信區間 兩個平均值差值的置信區間, 95%置信水平 CI=[-2.76,-2.68]
3)效應量 d= - 1.32,效果顯著