Python の地盀工孊調査の「A / B テスト」

1. はじめに

工孊的および地質孊的調査を実斜する堎合、調査察象から実隓宀ぞのサンプルの正しい茞送を確認するために、同じ土壌でのフィヌルドず実隓宀の研究からのデヌタを比范するこずに関連するタスクが発生するこずがありたす (サンプルは倉圢および/たたは砎壊されおいたせん茞送䞭。





この問題の定匏化により、次のパラメヌタヌを䜿甚しお A/B テスト手法を適甚できたす。





  1. 枬定基準は、サンプルの远加を特城付ける土壌骚栌の密床 (p d、g / cm 3 )の平均倀になりたす。この倀には正芏分垃の法則がありたす。





  2. 仮説をテストするための基準は、t怜定スチュヌデント怜定になりたす äºŒã€ã®ç‹¬ç«‹ã—たサンプルのため、比范茞送前フィヌルドず茞送埌の実隓宀のデヌタは、異なる土壌サンプルで実斜した堎合。 2 ぀の埓属サンプルの堎合、同じサンプルで研究が行われた堎合。





このトピックの枠組みの䞭で、2 ぀のランダムなサンプルを生成し、それらを比范し、統蚈的仮説を策定し、それらをテストしお結論を​​導き出したす。





2. サンプルの生成

2.1 サンプルサむズの掚定

実隓蚈画の䞀環ずしお、密床サンプルを生成する前に、䞎えられた効果サむズ (ES - 効果サむズ)、 ãƒ‘ワヌ ã€ãŠã‚ˆã³ èš±å®¹ã‚¿ã‚€ãƒ— I ゚ラヌ (α) に必芁なボリュヌムを芋積もりたしょう  (これらの甚語の定矩は以䞋に瀺されおいたす)。statsmodelsパッケヌゞを䜿甚しお蚈算を行いたす ã€‚





効果量 (暙準化) ã¯ã€æ€œå‡ºã—たい差を特城付ける倀であり、サンプル間の平均倀の差ず加重暙準偏差の比率に等しい。私たちの堎合には





{ES = \ frac {{(\ bar {X} _1 - \ bar {X} _2)} _ {obs}} {{S} _ {pooled}}} {ES = \ frac {{(\ bar {X} _1 - \ bar {X} _2)} _ {obs}} {{S} _ {pooled}}}

 åŒã˜ã‚µã‚€ã‚ºã®ã‚µãƒ³ãƒ—ルにプヌルされた加重暙準偏差 Sは、次の匏を䜿甚しお蚈算できたす。





{S} _ {プヌルされた} = {\ 平方根 {\ frac {{S} _ {1} ^ 2 + {S} _ {2} ^ 2} {2}}}

(Cohen, 1988) ES = 0.2 - ; 0.5 - ; 0.8 - .





 â€“ II ( 80%).





I II :





H0 





H1 





H0 





H0 





II (β)





H0 





I (α)





H0  (power  = 1-β)





:





  • α = 0.05 ( )





  • ES = 0.5 ( ).





  • Power = 0.8 ( ).





:





# 
import numpy as np
from statsmodels.stats.power import TTestIndPower

from matplotlib.pyplot import figure
import matplotlib.pyplot as plt

import scipy
from statsmodels.stats.weightstats import *
      
      



# 
effect = 0.5
alpha = 0.05
power = 0.8

analysis = TTestIndPower()

#  
size = analysis.solve_power(effect, power=power, alpha=alpha)

print(f' , .: {int(size)}')
      
      



, .: 63





,  63 .  65 .





.





plt.figure(figsize=(10, 7), dpi=80)

results = dict((i/10, analysis.solve_power(i/10, power=power, alpha=alpha)) 
               for i in range(2, 16, 1))

plt.plot(list(results.keys()), list(results.values()), 'bo-')

plt.grid()
plt.title('     \n   ')
plt.ylabel('  n, .')
plt.xlabel('  ES, ..')

for x,y in zip(list(results.keys()),list(results.values())):

    label = "{:.0f}".format(y)

    plt.annotate(label, 
                 (x,y), 
                 textcoords="offset points", 
                 xytext=(0,10), 
                 ha='center')

plt.show()
      
      



, ES. : 0,03 /3  0,1 /c3 (ES = 0,03 /3 / 0,1 /3 = 0,3 ..), 175 (power=0.80, Î±=0.05).





2.2

,  numpy.





( ) . (X̄) (S):





  • – X̄1= 1,65 /3, S1 = 0.15 /3;





  • – X̄2 = 1,60 /3, S2 = 0.15 /3.





loc_1 = 1.65
sigma_1 = 0.15

loc_2 = 1.60
sigma_2 = 0.15

sample_size = 65
#    
sample_1 = np.random.normal(loc=loc_1, scale=sigma_1, size=sample_size)
sample_2 = np.random.normal(loc=loc_2, scale=sigma_2, size=sample_size)
      
      



" " .





fig, axes = plt.subplots(ncols=2, figsize=(18, 5))

max_y = np.max(np.hstack([sample_1,sample_2]))
#   1
count_1, bins_1, ignored_1 = axes[0].hist(sample_1, 10, density=True, 
                                          label=" 1", edgecolor='black',
                                          linewidth=1.2)
axes[0].plot(bins_1, 1/(sigma_1 * np.sqrt(2 * np.pi)) *
               np.exp( - (bins_1 - loc_1)2 / (2 * sigma_12)),
         linewidth=2, color='r', label=' ')
axes[0].legend()
axes[0].set_xlabel(u' , ')
axes[0].set_ylabel(u' , .')
axes[0].set_ylim([0, 5])
axes[0].set_xlim([1.1, 2.2])

#   2
count_2, bins_2, ignored_2 = axes[1].hist(sample_2, 10, density=True, 
                                          label=" 2", edgecolor='black', 
                                          linewidth=1.2, color="green")
axes[1].plot(bins_2, 1/(sigma_2 * np.sqrt(2 * np.pi)) *
               np.exp( - (bins_2 - loc_2)2 / (2 * sigma_22)),
         linewidth=2, color='r', label=' ')
axes[1].legend()
axes[1].set_xlabel(u' , ')
axes[1].set_ylabel(u' , .')
axes[1].set_ylim([0, 5])
axes[1].set_xlim([1.1, 2.2])
plt.show()
      
      



#  
fig, ax = plt.subplots(figsize=(8, 8))
axis = ax.boxplot([sample_1, sample_2], labels=[' 1', ' 2'])

data = np.array([sample_1, sample_2])
means = np.mean(data, axis = 1)
stds = np.std(data, axis = 1)

for i, line in enumerate(axis['medians']):
    x, y = line.get_xydata()[1]
    text = ' ÎŒ={:.2f}\n σ={:.2f}'.format(means[i], stds[i])
    ax.annotate(text, xy=(x, y))

plt.ylabel('  , /3')
plt.show()
      
      



3.

. :





  • 1. , t- ;





  • 2. , t- .





.





1.

.





 H0:   ÎŒ1 = ÎŒ2.





 H1:   ÎŒ1≠Ό2.





:





T ({{X_1} ^ {n_1}}, {{X_2} ^ {n_2}}) = \ frac {\ bar {X_1} - \ bar {X_2}} {\ sqrt {\ frac {S_1 ^ 2} { n_1} + \ frac {S_2 ^ 2} {n_2}}}

: T(X1n1,X2n2)≈~St(Μ),  Îœ 





{\ nu = \ frac {({\ frac {S_1 ^ 2} {n_1} + \ frac {S_2 ^ 2} {n_2}}) ^ 2} {\ frac {S_1 ^ 4} {n_1 ^ 2 (n_1- 1)} + \ frac {S_2 ^ 4} {n_2 ^ 2 (n_2-1)}}}

 ttest_ind  stats.





t_st, p_val = scipy.stats.ttest_ind(sample_1, sample_2, equal_var = False)
print(f't-  {round(t_st, 2)}')
print(f' t-   \
  (p-value)  {round(p_val, 3)}')
      
      



t- 2.92





t- (p-value) 0.004





№ 1





 H0  , ,   0,05 (  p-value  0.004) .





.





c_m = CompareMeans(DescrStatsW(sample_1), DescrStatsW(sample_2))
print("95%%  : \
[%.4f, %.4f]" % c_m.tconfint_diff(usevar='unequal'))
      
      



95% : [0.0235, 0.1228]





95% , , 5%.





2.

, ( ) ( ) . , .





 H0:  ÎŒ1 = ÎŒ2.





 H1:   ÎŒ1≠Ό2.





:





T ({{X_1} ^ {n}}, {{X_2} ^ {n}}) = \ frac {\ bar {X_1} - \ bar {X_2}} {\ frac {S} {\ sqrt {n} }} S ^ 2 = \ frac {1} {n-1} \ sum_ {i = 1} ^ n (D_i - \ bar {D}) ^ 2, D_i = X_ {1i} - X_ {2i}

: T(X1n, X2n) ~ St(n-1)





 ttest_rel  stats.





t_st, p_val = stats.ttest_rel(sample_1, sample_2)
print(f't-  {round(t_st, 2)}')
print(f' t-   \
  (p-value)  {round(p_val, 3)}')
      
      



t- 2.79





t- (p-value) 0.007





№ 2





 H0  , ,   0,05 (  p-value  0.007).





明確にするために、これらのサンプルの平均間の間隔も掚定したしょう。





print("95%% confidence interval: [%.4f, %.4f]"
      % DescrStatsW(sample_1 - sample_2).tconfint_mean())
      
      



95% 信頌区間: [0.0208, 0.1255]





れロは考慮された 95% 信頌区間内にないため、考慮されたサンプルの平均倀は異なるず結論付けるこずができたす。





5. 結果

この蚘事では、土朚地質孊の実践的な問題を解決するために Python 蚀語を䜿甚する可胜性を怜蚎し、仮説をテストするために必芁なサンプル サむズの問題に぀いおも調査したした。








All Articles