Односторонняя функция ANOVA, которую я использую, продолжает выдавать значения F, которые не имеют смысла

Я работаю над проектом для колледжа, и это надирает мне задницу.

Я скачал файл данных из https://www.kaggle.com/datasets/majunbajun/himalayan-climbing-expeditions

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

Значение F, которое я возвращаю, кажется, не имеет никакого смысла. Какие-либо предложения?

#import pandas
import pandas as pd

#import expeditions as csv file
exp = pd.read_csv('C:\\filepath\\expeditions.csv')

#extract only the data relating to everest
exp= exp[exp['peak_name'] == 'Everest']

#create a subset of the data only containing 
exp_peaks = exp[['peak_name', 'member_deaths', 'termination_reason', 'hired_staff_deaths', 'year', 'season', 'basecamp_date', 'highpoint_date']]

#extract successful attempts
exp_peaks = exp_peaks[(exp_peaks['termination_reason'] == 'Success (main peak)')]

#drop missing values from basecamp_date & highpoint_date
exp_peaks = exp_peaks.dropna(subset=['basecamp_date', 'highpoint_date'])

#convert basecamp date to datetime
exp_peaks['basecamp_date'] = pd.to_datetime(exp_peaks['basecamp_date'])
#convert basecamp date to datetime
exp_peaks['highpoint_date'] = pd.to_datetime(exp_peaks['highpoint_date'])

from datetime import datetime

exp_peaks['time_taken'] = exp_peaks['highpoint_date'] - exp_peaks['basecamp_date']

#convert seasons from strings to ints
exp_peaks['season'] = exp_peaks['season'].replace('Spring', 1)
exp_peaks['season'] = exp_peaks['season'].replace('Autumn', 3)
exp_peaks['season'] = exp_peaks['season'].replace('Winter', 4)
#remove summer and unknown
exp_peaks = exp_peaks[(exp_peaks['season'] != 'Summer')]
exp_peaks = exp_peaks[(exp_peaks['season'] != 'Unknown')]

#subset the data according to the season
exp_peaks_spring = exp_peaks[exp_peaks['season'] == 1]
exp_peaks_autumn = exp_peaks[exp_peaks['season'] == 3]
exp_peaks_winter = exp_peaks[exp_peaks['season'] == 4]

#calculate the average time taken in spring
exp_peaks_spring_duration = exp_peaks_spring['time_taken']
mean_exp_peaks_spring_duration = exp_peaks_spring_duration.mean()

#calculate the average time taken in autumn
exp_peaks_autumn_duration = exp_peaks_autumn['time_taken']
mean_exp_peaks_autumn_duration = exp_peaks_autumn_duration.mean()

#calculate the average time taken in winter
exp_peaks_winter_duration = exp_peaks_winter['time_taken']
mean_exp_peaks_winter_duration = exp_peaks_winter_duration.mean()

# Turn the season column into a categorical
exp_peaks['season'] = exp_peaks['season'].astype('category')
exp_peaks['season'].dtypes


from scipy.stats import f_oneway

# One-way ANOVA
f_value, p_value = f_oneway(exp_peaks['season'], exp_peaks['time_taken'])
print("F-score: " + str(f_value))
print("p value: " + str(p_value))
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, что f_oneway требует, чтобы различные выборки непрерывных данных были аргументами, а не принимали аргумент категориальной переменной. Вы можете добиться этого, используя groupby.

f_oneway(*(group for _, group in exp_peaks.groupby("season")["time_taken"]))

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

f_oneway(exp_peaks_spring_duration, exp_peaks_autumn_duration, exp_peaks_winter_duration)

Я бы подумал, что в этом распространенном случае будет более простой способ выполнить ANOVA, но не могу его найти.

Большое спасибо за вашу помощь, это работает. Странно то, что использование категориальной переменной в качестве аргумента в некоторых случаях работает.

McJizzle91 04.05.2022 14:27

Любая идея, почему этот сюжет не работает? import matplotlib.pyplot as plt exp_peaks['time_taken'].groupby(exp_peaks['season']).mean().‌​plot( kind='bar', title='Mean time taken grouped by season') plt.show() Постоянно выдает эту ошибку: TypeError: значение должно быть «Timedelta», «NaT» или их массивом. Вместо этого получил «int».

McJizzle91 04.05.2022 14:45

Я думаю, что когда вы передаете категориальную переменную в качестве аргумента, она, вероятно, игнорирует категории и рассматривает ее как отдельную группу со значениями одной и той же непрерывной переменной. Вы можете проверить свои результаты, используя линейную регрессию в статистические модели.

Stuart 04.05.2022 15:46

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

Stuart 04.05.2022 15:58

Другие вопросы по теме

Python dataframe конвертирует эпоху в удобочитаемую дату и время, часы, минуты, секунды как ноль
Использование индекса Жаккара для поиска наилучшего соответствия между требуемыми навыками и учителями
Самый эффективный способ проверить, являются ли все метки времени в индексе Pandas DataFrame рабочими днями
Как разделить на ноль в Pandas Dataframe и сделать 1 столбец из 2
Как добавить из итерированной строки фрейма данных вычисленное значение в новый столбец в ту же строку
Добавить столбцы суммы обратно в фреймворк данных pandas через стиль цепочки
Самый быстрый способ добавить специальный символ в несколько индексов, используя значения из другого списка
Создание переменных с использованием индексов в цикле for
Сравнение двух кадров данных панд на основе состояния двух столбцов
Получить последнее значение из pandas groupeddataframe, суммированное по другому столбцу