Вы правы, если вы делаете односторонний тест, он должен иметь большое значение p. ttest_ind
выполняет двусторонний тест, который дает вероятность того, что вы наблюдаете нечто более экстремальное, чем абсолют вашего t-statisti c.
Чтобы выполнить односторонний t-тест, вы можете использовать cdf , которая является суммой вероятностей с точностью до вашей статистики c.
Изменение этот код слегка:
def welch_ttest(x1, x2,alternative):
n1 = x1.size
n2 = x2.size
m1 = np.mean(x1)
m2 = np.mean(x2)
v1 = np.var(x1, ddof=1)
v2 = np.var(x2, ddof=1)
t = (m1 - m2) / np.sqrt(v1 / n1 + v2 / n2)
df = (v1 / n1 + v2 / n2)**2 / (v1**2 / (n1**2 * (n1 - 1)) + v2**2 / (n2**2 * (n2 - 1)))
if alternative == "equal":
p = 2 * t.cdf(-abs(t), df)
if alternative == "lesser":
p = 1-t.cdf(abs(t), df)
if alternative == "greater":
p = t.cdf(abs(t), df)
return t, df, p
Я моделирую некоторые данные:
import numpy as np
from scipy.stats import ttest_ind
from scipy.stats import t
np.random.seed(seed=123)
data1 = np.random.normal(4.3,4.8,size=40000)
np.random.seed(seed=123)
data2 = np.random.normal(4.9,4.4,size=30000)
ndf = len(data1) +len(data2) - 2
ttest_ind(data1,data2,equal_var = False)
Ttest_indResult(statistic=-16.945279258324227, pvalue=2.8364816571790452e-64)
Вы получаете что-то похожее на ваш результат, мы можем проверить приведенный выше код для альтернативы == "равный", который является двусторонним тестом:
welch_ttest(data1,data2,"equal")
(<scipy.stats._continuous_distns.t_gen at 0x12472b128>,
67287.08544468222,
2.8364816571790452e-64)
Вы можете использовать то же значение p, что и для двустороннего t-теста, теперь мы проводим односторонний тест нужно:
welch_ttest(data1,data2,"greater")
(<scipy.stats._continuous_distns.t_gen at 0x12472b128>, 67287.08544468222, 1.0)