Helpers - компьютеры, интернет, программирование

python3 — панды определяют, являются ли события статистически значимыми

У меня есть большой набор данных, который выглядит так, как показано ниже. Я хотел бы знать, есть ли значительная статистическая разница между тем, когда событие происходит, и когда оно не происходит. Здесь предполагается, что чем выше процент изменения, тем значимее/лучше.

В другом наборе данных столбец «происходит событие» имеет значение «Истина, Ложь, Нейтрально». (Пожалуйста, игнорируйте индекс, так как это индекс панд по умолчанию.)

   index    event occurs            percent change
    148       False                  11.27
    149        True                  14.56
    150       False                  10.35
    151       False                   6.07
    152       False                  21.14
    153       False                   7.26
    154       False                   7.07
    155       False                   5.37
    156        True                   2.75
    157       False                   7.12
    158       False                   7.24

Каков наилучший способ определения значимости, когда это «Верно/Ложно» или когда «Верно/Ложно/Нейтрально»?

08.11.2019

  • Что вы пробовали? :) 08.11.2019
  • Obv, ничего не работает (пока)! :) 08.11.2019
  • Давайте разделим event_occurs на те False и те True. Найдите среднее значение percent_change для обоих, а затем запустите тест Шапиро-Фрэнсиса, чтобы убедиться, что данные в норме. Если это так, попытайтесь выяснить, является ли разница в средних значениях статистически значимой. Если это ненормально, вернитесь ко мне. 08.11.2019
  • Как происходит событие Neutral? 08.11.2019
  • Если данные для каждой группы не являются нормальными, просто используйте тесты без распространения. Не так сильно, но сойдет. 08.11.2019
  • Вместо того, чтобы вставлять весь новый набор данных с тремя значениями, я просто добавил нейтральное значение, которое логически эквивалентно. Нашел решение здесь: stackoverflow.com/questions/13404468/t-test-in-pandas 08.11.2019
  • Убедитесь, что вы подтверждаете предположения теста Стьюдента. Это не работает для всех видов данных. Поэтому я рекомендую вам провести тест на нормальность для рассматриваемых групп. 08.11.2019
  • @ DarkDrassher34 - К вашему сведению. похоже, что некоторые наборы данных слишком велики для шапиро, поэтому я использовал scipy.stats import normaltest. Вот ошибка от shapiro: /usr/local/lib/python3.6/dist-packages/scipy/stats/morestats.py:1309: UserWarning: значение p может быть неточным для N > 5000. warnings.warn(p -значение может быть неточным для N › 5000.) 08.11.2019
  • Хорошо, @DarkDrassher34. Набор данных не выглядит нормальным: NormaltestResult (статистика = 48,571451210317122, pvalue = 2,8368957760644641e-11) 08.11.2019
  • Ok. Я хочу, чтобы вы знали, что вам нужно будет провести обычный тест для каждой отдельной группы. Попробуйте вернуть percent_change, где event_occurs — каждое уникальное значение. Затем запустите тест для каждого percent_change, соответствующего каждому отдельному значению event_occurs. 08.11.2019

Ответы:


1

Загрузить пакеты, установить глобальные переменные, создать данные.

import scipy.stats as stats
import numpy as np

n = 60
stat_sig_thresh = 0.05

event_perc = pd.DataFrame({"event occurs": np.random.choice([True,False],n),
                          "percent change": [i*.1 for i in np.random.randint(1,1000,n)]})

Определите, является ли распределение нормальным

stat_sig = event_perc.groupby("event occurs").apply(lambda x: stats.normaltest(x))
stat_sig = pd.DataFrame(stat_sig)
stat_sig = pd.DataFrame(stat_sig[0].values.tolist(), index=stat_sig.index).reset_index()
stat_sig.loc[(stat_sig.pvalue <= stat_sig_thresh), "Normal"] = False
stat_sig["Normal"].fillna("True",inplace=True)

>>>stat_sig

    event occurs  statistic             pvalue                  Normal
0   False         [2.9171920993203915]  [0.23256255191146755]   True
1   True          [2.938332679486047]   [0.23011724484588764]   True

Определить статистическую значимость

normal = [bool(i) for i in stat_sig.Normal.unique().tolist()]

rvs1 = event_perc["percent change"][event_perc["event occurs"] == True]
rvs2 = event_perc["percent change"][event_perc["event occurs"] == False]

if (len(normal) == 1) & (normal[0] == True):
    print("the distributions are normal")
    if stats.ttest_ind(rvs1,rvs2).pvalue >= stat_sig_thresh:
        # we cannot reject the null hypothesis of identical average scores
        print("we can't say whether there is statistically significant difference")
    else:
        # we reject the null hypothesis of equal averages
        print("there is a statisically significant difference")

elif (len(normal) == 1) & (normal[0] == False):
    print("the distributions are not normal")
    if stats.wilcoxon(rvs1,rvs2).pvalue >= stat_sig_thresh:
        # we cannot reject the null hypothesis of identical average scores
        print("we can't say whether there is statistically significant difference")
    else:
        # we reject the null hypothesis of equal averages
        print("there is a statisically significant difference")
else:
    print("samples are drawn from different distributions")

the distributions are normal
we can't say whether there is statistically significant difference
08.11.2019
  • спасибо за ваш ответ и пример кода, который я рассмотрел. Я тоже опубликовал один. Мысли об этом? 08.11.2019

  • 2

    Спасибо @DarkDrassher34 и @ChrisDanger. Я собрал этот пример кода из различных источников, первоначально из ответа Дарка, а затем просмотрел его после сообщения Криса. Мысли?

    corr_data = df[['event occurs','percent change']]
    cat1 = corr_data[corr_data['event occurs']==True]
    cat2 = corr_data[corr_data['event occurs']==False]
    
    
    #----------------------
    # is the sample normal / gaussian
    #----------------------
    from scipy.stats import shapiro # test for normalcy in small samples
    from scipy.stats import normaltest
    
    if (len(cat1['percent change'].index) <= 20 ):
        stat1, p1 = shapiro(cat1['percent change'])
    else:
        stat1, p1 = normaltest(cat1['percent change'])
    
    if (len(cat2['percent change'].index) <= 20 ):
        stat2, p2 = shapiro(cat2['percent change'])
    else:
        stat2, p2 = normaltest(cat2['percent change'])
    
    
    alpha = 0.05 # stat threshold
    # both groups are normal
    if ((p1 > alpha) and (p2 > alpha)):
        print('Samples looks Gaussian (fail to reject H0)')
    
        #----------------------
        # if normal / gaussian run these tests
        #----------------------
        from scipy.stats import ttest_ind
        stat, p = ttest_ind(cat1['percent change'], cat2['percent change'])
        print('Statistics=%.3f, p=%.3f' % (stat, p))
        if p > alpha:
            print('Same distribution (fail to reject H0)')
        else:
            print('Different distribution (reject H0)')
    
    
    else:
        print('Samples do not look Gaussian (reject H0)')
        #----------------------
        # if not normal / gaussian run these tests
        #----------------------
        from scipy.stats import mannwhitneyu
        stat, p = mannwhitneyu(cat1['percent change'], cat2['percent change'])
        print('Statistics=%.3f, p=%.3f' % (stat, p))
        if p > alpha:
            print('Same distribution (fail to reject H0)')
        else:
            print('Different distribution (reject H0)')
    
    08.11.2019
  • AnonPyDev, молодец. Мне нравится, как вы справились с n ‹ = 20. Хорошая работа. 08.11.2019
  • Спасибо. Очень ценю @chris. 08.11.2019
  • AnonPyDev, если вам понравился мой пример кода, не могли бы вы проголосовать за него? 08.11.2019
  • Готово 09.11.2019
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..