python计算方差代码_方差分析python实现

单因素方差分析

同时,让我们先导入数据。

[En]

In the meantime, let’s import the data first.

案例:我们探究施肥与否是否对植物的生长有影响,试验为: – 对照组:清水 – 实验组: 某肥料四个浓度梯度,分别是A,B,C,D,施肥一段时间之后测量树高(要控制其他变量保持一致,比如施肥之前的树高要基本保持一致,生长势基本保持一致等等)

当方差分析满足方差的独立性、正态和齐性时,虽然不满足方差的齐性,但可以进行非参数检验。让我们开始处理数据。

[En]

The nonparametric test can be carried out when the analysis of variance satisfies, independence, normality and homogeneity of variance, although it does not satisfy the homogeneity of variance. Let’s start to deal with the data.

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

df = {‘baseline’:list(np.random.normal(10, 5, 10)),

‘treat1’:list(np.random.normal(15, 5, 10)),

‘treat2’:list(np.random.normal(20, 5, 10)),

‘treat3’:list(np.random.normal(30, 5, 10)),

‘treat4’:list(np.random.normal(31, 5, 10))}

data = pd.DataFrame(df)

让我们来看看随机生成的数据是什么样子。

[En]

Let’s see what the randomly generated data looks like.

python计算方差代码_方差分析python实现

请看描述性统计数据

[En]

Take a look at descriptive statistics

python计算方差代码_方差分析python实现

为了方便计算,我们把所有的数据放在一列中,画出框线图来看看。

[En]

In order to facilitate the calculation, we put all the data into a column and draw a box line diagram to have a look.

import seaborn as sns

data_melt = data.melt()

data_melt.columns = [‘Treat’, ‘value’]

sns.boxplot(x = ‘Treat’, y = ‘value’, data = data_melt)

python计算方差代码_方差分析python实现

由于我们希望在生成随机数时使结果更加明显,因此很容易从该图中看出差异仍然很明显。

[En]

Since we want to make the results more obvious when we generate random numbers, it is easy to see that the difference is still obvious from this diagram.

方差分析

方差分析

from statsmodels.formula.api import ols

from statsmodels.stats.anova import anova_lm

from statsmodels.stats.multicomp import pairwise_tukeyhsd

model = ols(‘value ~C(Treat)’, data = data_melt).fit()

anova_table = anova_lm(model, type = 2)

pd.DataFrame(anova_table)

进行事后比较分析

print(pairwise_tukeyhsd(data_melt[‘value’], data_melt[‘Treat’]))

经方差分析得出的结果如下:

[En]

The results obtained from the analysis of variance are as follows:

python计算方差代码_方差分析python实现

我们可以看到因子(Treat)的不同水平,对于因变量的影响还是很显著的,p值显然小于0.05.

然后我们进行多次比较和事后分析:

[En]

Then we make multiple comparisons and analyze afterwards:

python计算方差代码_方差分析python实现

group1以及group2表示的是因子的不同水平,然后分析他们两个组是否有显著性差异,最后面的reject表示是否拒绝原假设,True表示的是拒绝原假设,说明两组均值有显著性差异

多因素方差分析

首先,让我们导入数据,看看分布情况。

[En]

First, let’s import the data and take a look at the distribution.

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from statsmodels.formula.api import ols

from statsmodels.stats.anova import anova_lm

from statsmodels.stats.multicomp import pairwise_tukeyhsd

data = pd.read_csv(‘anovaa.csv’)

data = pd.DataFrame(data)

data.head()

python计算方差代码_方差分析python实现

便于理解,我们可以将people因子认为是不同的操作员,group因子可以理解成使用不同的方法操作,因变量就是value结果怎么样

按照惯例,让我们来看看数据的描述性统计数据

[En]

By convention, let’s take a look at the descriptive statistics of the data

python计算方差代码_方差分析python实现

我们看一下箱线图情况

sns.boxplot(x = ‘group’, y = ‘value’, data = data)

python计算方差代码_方差分析python实现

sns.boxplot(x = ‘people’, y = ‘value’, data = data)

python计算方差代码_方差分析python实现

model = ols(‘value ~C(group) + C(people) + C(group):C(people)’, data = data).fit()

anova_table = anova_lm(model, type = 2)

pd.DataFrame(anova_table)

python计算方差代码_方差分析python实现

在这里,我们得到了每个因素在不同水平上的平均值差异的检验。

[En]

Here we get the test of the difference of the mean value at different levels of each factor.

还有这两个因素之间的相互作用。

[En]

There is also the interaction between the two factors.

结果得到:group组是小于0.05的,people和两者的交互效应是大于0.05的,所以这样就明白了他们的交互效应

接下来,我们将进行进一步的多项测试。

[En]

Next, we will conduct further multiple tests.

print(pairwise_tukeyhsd(data[‘value’], data[‘people’]))

print(pairwise_tukeyhsd(data[‘value’], data[‘group’]))

这是people因子不同水平的比较结果

python计算方差代码_方差分析python实现

这是group不同水平的比较结果

python计算方差代码_方差分析python实现

Original: https://blog.csdn.net/weixin_42129300/article/details/113677222
Author: 中国制造网黄晨
Title: python计算方差代码_方差分析python实现



相关阅读

Title: pandas 不要编号 加一行_在pandas.DataFrame中添加一行

@ Nasser的答案示例:

import pandas as pd >>> df = pd.DataFrame(columns=[‘lib’, ‘qty1’, ‘qty2’]) >>> for i in range(5): >>> df.loc[i] = [randint(-1,1) for n in range(3)] >>> >>> print(df) lib qty1 qty2 0 0 0 -1 1 -1 -1 1 2 1 -1 1 3 0 0 0 4 1 -1 -1 [5 rows x 3 columns]

你可以使用pandas.concat()或DataFrame.append() 。 有关详细信息和示例,请参阅合并,联接和连接 。

您可以创build一个字典列表,每个字典对应一个input数据行。 一旦列表完成,然后创build一个数据框。 这是一个更快的方法。

我有一个类似的问题,如果我为每一行创build一个数据框,并将其附加到主数据框,它花了30分钟。 另一方面,如果我使用下面的方法,几秒钟内就能成功。

rows_list = [] for row in input_rows: dict1 = {} # get input row in dictionary format # key = col_name dict1.update(blah..) rows_list.append(dict1) df = pd.DataFrame(rows_list)

如果您事先知道条目的数量,您应该通过提供索引(从不同答案获取数据示例)来预先分配空间:

[En]

If you know the number of entries in advance, you should pre-allocate space by providing an index (obtaining data examples from different answers):

import pandas as pd import numpy as np # we know we’re gonna have 5 rows of data numberOfRows = 5 # create dataframe df = pd.DataFrame(index=np.arange(0, numberOfRows), columns=(‘lib’, ‘qty1’, ‘qty2’) ) # now fill it up row by row for x in np.arange(0, numberOfRows): #loc or iloc both work here since the index is natural numbers df.loc[x] = [np.random.randint(-1,1) for n in range(3)] In[23]: df Out[23]: lib qty1 qty2 0 -1 -1 -1 1 0 0 0 2 -1 0 -1 3 0 -1 0 4 -1 0 0

速度比较

In[30]: %timeit tryThis() # function wrapper for this answer In[31]: %timeit tryOther() # function wrapper without index (see, for example, @fred) 1000 loops, best of 3: 1.23 ms per loop 100 loops, best of 3: 2.31 ms per loop

而且,正如你从评论中看到的,6000的速度差距变得更大了:

[En]

And, as you can see from the comments, the speed difference of 6000 has become even greater:

增加arrays(12)的大小和行数(500)使速度差异更加显着:313ms vs 2.29s

要有效追加,请参阅如何向”pandas”数据框添加额外的行以及” 使用放大设置” 。

在不存在的键索引数据上通过loc/ix添加行。 例如:

In [1]: se = pd.Series([1,2,3]) In [2]: se Out[2]: 0 1 1 2 2 3 dtype: int64 In [3]: se[5] = 5. In [4]: se Out[4]: 0 1.0 1 2.0 2 3.0 5 5.0 dtype: float64

要么:

In [1]: dfi = pd.DataFrame(np.arange(6).reshape(3,2), …..: columns=[‘A’,’B’]) …..: In [2]: dfi Out[2]: AB 0 0 1 1 2 3 2 4 5 In [3]: dfi.loc[:,’C’] = dfi.loc[:,’A’] In [4]: dfi Out[4]: ABC 0 0 1 0 1 2 3 2 2 4 5 4 In [5]: dfi.loc[3] = 5 In [6]: dfi Out[6]: ABC 0 0 1 0 1 2 3 2 2 4 5 4 3 5 5 5

mycolumns = [‘A’, ‘B’] df = pd.DataFrame(columns=mycolumns) rows = [[1,2],[3,4],[5,6]] for row in rows: df.loc[len(df)] = row

您可以使用ignore_index选项将单个行附加为字典。

f = pandas.DataFrame(data = {‘Animal’:[‘cow’,’horse’], ‘Color’:[‘blue’, ‘red’]}) >>> f Animal Color 0 cow blue 1 horse red >>> f.append({‘Animal’:’mouse’, ‘Color’:’black’}, ignore_index=True) Animal Color 0 cow blue 1 horse red 2 mouse black

这不是一个OP问题的答案,而是一个玩具的例子来说明@ShikharDua的答案,以上我发现它非常有用。

虽然这个片段是微不足道的,在实际的数据我有1000行和许多列,我希望能够按不同列分组,然后执行多个塔列的统计。 所以有一个可靠的方法来一次一行地构build数据框是非常方便的。 谢谢@ShikharDua!

import pandas as pd BaseData = pd.DataFrame({ ‘Customer’ : [‘Acme’,’Mega’,’Acme’,’Acme’,’Mega’,’Acme’], ‘Territory’ : [‘West’,’East’,’South’,’West’,’East’,’South’], ‘Product’ : [‘Econ’,’Luxe’,’Econ’,’Std’,’Std’,’Econ’]}) BaseData columns = [‘Customer’,’Num Unique Products’, ‘List Unique Products’] rows_list=[] for name, group in BaseData.groupby(‘Customer’): RecordtoAdd={} #initialise an empty dict RecordtoAdd.update({‘Customer’ : name}) # RecordtoAdd.update({‘Num Unique Products’ : len(pd.unique(group[‘Product’]))}) RecordtoAdd.update({‘List Unique Products’ : pd.unique(group[‘Product’])}) rows_list.append(RecordtoAdd) AnalysedData = pd.DataFrame(rows_list) print(‘Base Data : \n’,BaseData,’\n\n Analysed Data : \n’,AnalysedData)

为了Pythonic的方式,在这里添加我的答案:

res = pd.DataFrame(columns=(‘lib’, ‘qty1’, ‘qty2’)) res = res.append([{‘qty1’:10.0}], ignore_index=True) print(res.head()) lib qty1 qty2 0 NaN 10.0 NaN

创build一个新的logging(数据框)并添加到old_data_frame 。

通过值列表和相应的列名创build一个new_record (data_frame)

new_record = pd.DataFrame([[0,’abcd’,0,1,123]],columns=[‘a’,’b’,’c’,’d’,’e’]) old_data_frame = pd.concat([old_data_frame,new_record])

另一种方法(可能不是很高效):

add a row def add_row(df, row): colnames = list(df.columns) ncol = len(colnames) assert ncol == len(row), “Length of row must be the same as width of DataFrame: %s” % row return df.append(pd.DataFrame([row], columns=colnames))

您也可以像这样增强DataFrame类:

import pandas as pd def add_row(self, row): self.loc[len(self.index)] = row pd.DataFrame.add_row = add_row

import pandas as pd t1=pd.DataFrame() for i in range(len(the number of rows)): #add rows as columns t1[i]=list(rows) t1=t1.transpose() t1.columns=list(columns)

简单一点。 通过将列表作为input,将在数据框中作为行添加:

import pandas as pd res = pd.DataFrame(columns=(‘lib’, ‘qty1’, ‘qty2’)) for i in range(5): res_list = list(map(int, input().split())) res = res.append(pd.Series(res_list,index=[‘lib’,’qty1′,’qty2′]), ignore_index=True)

您也可以build立一个列表清单并将其转换为数据框 –

import pandas as pd rows = [] columns = [‘i’,’double’,’square’] for i in range(6): row = [i, i2, ii] rows.append(row) df = pd.DataFrame(rows, columns=columns)

我双广场

0 0 0 0

1 1 2 1

2 2 4 4

3 3 6 9

4 4 8 16

5 5 10 25

这将负责将项目添加到空的DataFrame。 问题是,第一个索引df.index.max()== nan:

df = pd.DataFrame(columns=[‘timeMS’, ‘accelX’, ‘accelY’, ‘accelZ’, ‘gyroX’, ‘gyroY’, ‘gyroZ’]) df.loc[0 if math.isnan(df.index.max()) else df.index.max() + 1] = [x for x in range(7)]

Original: https://blog.csdn.net/weixin_31880471/article/details/114906503
Author: 拐个王子回古墓
Title: pandas 不要编号 加一行_在pandas.DataFrame中添加一行

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/295581/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总