Я работаю над проектом для колледжа, и это надирает мне задницу.
Я скачал файл данных из 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))
Кажется, что 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, но не могу его найти.
Любая идея, почему этот сюжет не работает? 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».
Я думаю, что когда вы передаете категориальную переменную в качестве аргумента, она, вероятно, игнорирует категории и рассматривает ее как отдельную группу со значениями одной и той же непрерывной переменной. Вы можете проверить свои результаты, используя линейную регрессию в статистические модели.
Что касается вашей сюжетной ошибки, я не знаю причины. Для меня это работает как линейный график, но не гистограмма. Попробуйте задать это как еще один вопрос.
Большое спасибо за вашу помощь, это работает. Странно то, что использование категориальной переменной в качестве аргумента в некоторых случаях работает.