def brown_forsythe(M):
A, B = M[:, :n1], M[:, n1:]
dA = np.abs(A - np.median(A, axis=1, keepdims=True))
dB = np.abs(B - np.median(B, axis=1, keepdims=True))
mA, mB = dA.mean(axis=1), dB.mean(axis=1)
gesamt = (mA * n1 + mB * n2) / (n1 + n2)
zwischen = n1 * (mA - gesamt) ** 2 + n2 * (mB - gesamt) ** 2
innen = ((dA - mA[:, None]) ** 2).sum(axis=1) + ((dB - mB[:, None]) ** 2).sum(axis=1)
return zwischen / (innen / (n1 + n2 - 2))
kf = stats.f.ppf(.95, 1, n1 + n2 - 2)
print({"bf_normal": round(float((brown_forsythe(normal) > kf).mean()), 4),
"bf_exponential": round(float((brown_forsythe(exponential) > kf).mean()), 4),
"woelbung_normal": round(float(stats.kurtosis(normal.ravel(), fisher=False)), 4),
"woelbung_exponential":
round(float(stats.kurtosis(exponential.ravel(), fisher=False)), 4)})