Проверьте, являются ли случайные величины независимыми Python

#python #pandas #probability

Вопрос:

Приведена таблица ниже

X Y пиар
0 1 0.30
0 2 0.25
1 1 0.15
1 2 0.30

Я намеревался создать функцию для проверки независимости между двумя переменными X и Y . Обратите внимание, что третий столбец pr в таблице-вероятность. Например P(X=0 ^ Y=1) = 0.3 . Аналогично, P(Y=1) = 0.3 0.15 = 0.45 .

Две случайные величины независимы, если для каждого возможного значения x для X и для каждого возможного значения y для Y. P(X =x ^ Y = y) = P(X = x)*P(Y = y)

Я понимаю, что мы можем использовать iterrows() или itertuples() перебирать фрейм данных. Но у меня возникают проблемы с получением предельных вероятностей в for цикле.

Примечание: Предельные вероятности равны P(X = x) и P(Y = y) .

Вот мой основной код

 import pandas as pd

#you can use this table as an example
distr_table = pd.DataFrame({'X': [0, 0, 1, 1], 'Y': [1, 2, 1, 2], 'pr': [0.3, 0.25, 0.15, 0.3]})

x_0,x_1 = distr_table.groupby('X').pr.sum()
y_1,y_2 = distr_table.groupby('Y').pr.sum()

x_u = distr_table.X.unique()
y_u = distr_table.Y.unique()
for index, row in distr_table.iterrows():
    print(row['X'], row['Y'], row['pr'])

 

Ответ №1:

Однако предельные вероятности можно легко получить groupby :

 >>> distr_table.groupby('Y')['pr'].sum()
Y
0    0.45
1    0.55
Name: pr, dtype: float64
>>> distr_table.groupby('X')['pr'].sum()
X
0    0.55
1    0.45
Name: pr, dtype: float64
 

Таким образом, отсюда мы можем легко восстановить независимую вероятность с помощью pd.merge(…, how='cross') :

 >>> cmp = pd.merge(distr_table.groupby('X', as_index=False)['pr'].sum(), distr_table.groupby('Y', as_index=False)['pr'].sum(), how='cross')
>>> cmp['indep_pr'] = cmp['pr_x'] * cmp['pr_y']
>>> cmp
   X  pr_x  Y  pr_y  indep_pr
0  0  0.55  0  0.45    0.2475
1  0  0.55  1  0.55    0.3025
2  1  0.45  0  0.45    0.2025
3  1  0.45  1  0.55    0.2475
 

Наконец, сравните его с вашим начальным распределением вероятности:

 >>> cmp[['X', 'Y', 'indep_pr']].merge(distr_table, on=['X', 'Y'])
   X  Y  indep_pr    pr
0  0  0    0.2475  0.30
1  0  1    0.3025  0.25
2  1  0    0.2025  0.15
3  1  1    0.2475  0.30
 

Если вы хотите сравнить эти распределения, так как мы используем здесь числа с плавающей точкой, я бы предложил np.allclose() , т. Е.

 >>> np.allclose(cmp['indep_pr'], df['pr'])
False