вдохновение
В R это очень просто
data("iris")
bartlett.test(Sepal.Length ~ Species,data = iris)
Важное значение в наборе данных состоит в том, что столбец Sepal.Length является числовым, вид является категоричным.
проблема
В Python scipy.stats.bartlett
потребуются отдельные массивы для каждого вида, см. Документы.
Каким будет самый простой способ достичь этого?
Простой способ получить набор данных в python:
from sklearn import datasets
iris = datasets.load_iris()
iris = pd.DataFrame(data= np.c_[iris['data'], iris['target']],
columns= ["sepal.length","sepal.width","petal.length","petal.width"] + ['species'])
Я действительно хотел, чтобы это работало:
iris.groupby("species")["sepal.length"].apply(ss.bartlett)
но это не связано с тем, что ему нужно несколько векторов образцов.
После шаблона groupby вы можете немного манипулировать и сделать это:
gb = iris.groupby('species')["sepal.length"]
ss.bartlett(*[gb.get_group(x).values for x in gb.groups])
*
распаковывает список в функцию, остальное - это просто, чтобы группы были в правильной форме для функции. Как уже упоминалось в комментариях, здесь .values
здесь не нужны, поэтому мы можем написать это как:
gb = iris.groupby('species')["sepal.length"]
ss.bartlett(*[gb.get_group(x) for x in gb.groups])
И только для завершения, если вы действительно хотите сделать это в одной строке:
ss.bartlett(*[x[1] for x in iris.groupby('species')["sepal.length"]])
Но я лично считаю это менее читаемым.
.values
не нужен, поэтому это решение еще круче, чем казалось! Мне немного грустно, что для этого нужны две строки, но на самом деле с такими данными, где есть только один категорический столбец, я полагаю, вы в groupby
случае сразу сделаете groupby
, поэтому я думаю, что все в порядке :) (Я учу курс статистики, используя R
и параллельно я выясняю все на python, так как обычно это язык, который я использую, и теперь, когда я нашел некоторые изящные возможности pandas
я снова думаю, что, вероятно, python лучше в целом: D) ,
ss.bartlett(*(gb.get_group(g) for g in gb.groups))
import scipy.stats as ss