[PYTHON] Man Whitney U test anti-motif

Le test U de Man Whitney, un moyen pratique et non paramétrique de tester si les populations de deux groupes de données sont identiques, non? ?? ?? J'ai énuméré quelques exemples d'erreurs lorsque je me vide la tête (c'est juste un mémo personnel, donc des erreurs typographiques, etc.)

Qu'est-ce que le test U de Man Whitney?

Aperçu

[Wikipédia](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%B3%E3%83%BB%E3%83%9B%E3%82%A4%E3%83 Voir% 83% E3% 83% 88% E3% 83% 8B% E3% 83% BC% E3% 81% AEU% E6% A4% 9C% E5% AE% 9A). Si vous souhaitez en savoir plus, veuillez contacter Article original ou [Livre](https://www.amazon.co.jp/Introduction-Nonparametric- Statistics-Chapman-Statistical / dp / 03767194848).

Il est important de noter que pour tous les éléments des données d'un groupe, comptez le nombre de valeurs dans les données fusionnées des deux groupes et utilisez la somme (ci-dessous) dans la quantité de test.

T_U = \sum_{i=1}^{N_x} \sum_{j=1}^{N_y} I(X_i < Y_j)

Par conséquent, par exemple, si le nombre de données dans les deux groupes est le même ($ N_x = N_y = N $) et la population est la même, ce sera approximativement $ T_U \ approx N (N + 1) / 2 $. Utilisez ceci pour créer un anti-motif.

Des exemples qui fonctionnent

Un exemple utilisé entre des distributions normales avec des valeurs moyennes et des écarts types différents. Un total de 1000 calculs de p-Value ont été effectués, et avec le paramétrage suivant, la p-Value est de 0,0125, ce qui est suffisamment petit même avec 75% de carreaux de p-Value.

N = 1000
iter = 1000
np.random.seed(seed=1145141919)

display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=1,scale=10,size=N)).pvalue for i in range(iter)]).describe())
count   1000.0000
mean       0.0212
std        0.0563
min        0.0000
25%        0.0001
50%        0.0011
75%        0.0125
max        0.4742
dtype: float64

Anchipatan

Créez un anti-pattern en gardant à l'esprit que $ T_U \ approx N (N + 1) / 2 $ ne peut pas être distingué.

Même distribution

Pour comparaison avec d'autres cas.

Distribution uniforme

N = 1000
iter = 1000
np.random.seed(seed=1145141919)

display(pd.Series([mannwhitneyu(uniform.rvs(loc=0,scale=1,size=N), uniform.rvs(loc=0,scale=1,size=N)).pvalue for i in range(iter)]).describe())
count   1000.0000
mean       0.2583
std        0.1438
min        0.0001
25%        0.1361
50%        0.2613
75%        0.3835
max        0.5000
dtype: float64

Distributions normales

N = 1000
iter = 1000
np.random.seed(seed=1145141919)

display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=0,scale=1,size=N)).pvalue for i in range(iter)]).describe())
count   1000.0000
mean       0.2524
std        0.1426
min        0.0001
25%        0.1259
50%        0.2572
75%        0.3713
max        0.5000
dtype: float64

Distribution normale avec la même moyenne mais des écarts-types significativement différents

L'écart type de un a été multiplié par 100. Puisque la distribution avec un petit écart-type est localisée près du centre de la distribution avec un grand écart-type, la plupart des échantillons de la distribution avec un petit écart-type occupent le rang autour de la valeur moyenne parmi les données fusionnées des deux groupes. .. Par conséquent, s'il occupe tout, $ T_U \ approx \ frac {N} {2} \ sum_ {i = 1} ^ {N} 1 = N (N + 1) / 2 $.

N = 1000
iter = 1000
np.random.seed(seed=1145141919)

display(pd.Series([mannwhitneyu(norm.rvs(loc=0,scale=1,size=N), norm.rvs(loc=0,scale=100,size=N)).pvalue for i in range(iter)]).describe())
count   1000.0000
mean       0.2211
std        0.1498
min        0.0000
25%        0.0844
50%        0.2090
75%        0.3511
max        0.4996
dtype: float64

Lorsqu'il y a une distribution uniforme entre des distributions uniformes mixtes

Considérons une distribution uniforme mixte composée de deux distributions uniformes, où les régions ne se croisent pas et il existe une autre distribution uniforme entre les deux. Un test est effectué entre cette distribution uniforme mixte et la distribution uniforme. De même, par exemple, une distribution gaussienne mixte unidimensionnelle et une distribution localisée seulement près de la vallée peuvent être discutées de la même manière.

Dans ce qui suit, des données uniformes pour l'intervalle $ [0, M) \ cup [3M, 4M) $ et des données uniformes pour l'intervalle $ [M, 3M) $ ont été créées et testées. L'échantillonnage a été effectué à partir de la distribution mixte comme suit. La page de référence est ici.

def get_mixture_uniform(sample_size, M):
    distributions = [
    {"type": np.random.uniform, "kwargs": {"low": 0, "high": M}},
    {"type": np.random.uniform, "kwargs": {"low": 3 * M, "high": 4 * M}},
    ]
    coefficients = np.array([0.5, 0.5])

    num_distr = len(distributions)
    data = np.zeros((sample_size, num_distr))
    for idx, distr in enumerate(distributions):
        data[:, idx] = distr["type"](size=(sample_size,),**distr["kwargs"])
    random_idx = np.random.choice(np.arange(num_distr), size=(sample_size,), p=coefficients)
    samples = data[np.arange(sample_size), random_idx]
    return samples
N = 1000
M = 10

display(pd.Series([mannwhitneyu(np.random.uniform(low=M, high=3*M, size=N), get_mixture_uniform(N, M)).pvalue for i in range(iter)]).describe())
count   1000.0000
mean       0.2287
std        0.1555
min        0.0000
25%        0.0909
50%        0.2194
75%        0.3784
max        0.5000
dtype: float64

Recommended Posts

Man Whitney U test anti-motif