python 实现可重复双因素方差分析(3)

案例:

一家超市连锁店进行一项研究,以确定超市所在的位置和竞争者的数量对其销售额是否有显著影响。

取显著性水平\large \alpha =0.01, 检验:

(1)竞争者的数量对销售额是否有显著影响。

(2)超市的位置对销售额是否显著影响。

(3)竞争者的数量和超市的位置对销售额是否有交互影响。

# 导入相关包
import pandas as pd
import numpy as np
import math
import scipy
from scipy import stats 
import matplotlib.pyplot as plt
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# 自定义函数
def level_n(data, row_name, col_name):
    r_level = list(data[row_name].unique())
    c_level = list(data[col_name].unique())
    tuple_ = [(i,j) for i in r_level for j in c_level]
    row_n = []
    for i, j in tuple_:
        p = data.query("{}=='{}'".format(row_name, i)).query("{}=='{}'".format(col_name, j)).shape[0]
        row_n.append(p)
    m = max(row_n) 
    return m

def SST(Y):
    sst = sum(np.power(Y - np.mean(Y), 2))
    return sst

def SSA(data, row_name, col_name, y_name):
    n = len(data[col_name].unique())
    m = level_n(data, row_name, col_name)
    
    total_avg = np.mean(data[y_name])
    df = data.groupby([row_name]).agg(['mean', 'count'])
    df = df[y_name]
    
    ssa = n * m * sum((np.power(df["mean"] - total_avg, 2)))
    return ssa

def SSRC(data, row_name, col_name, y_name):
    
    m = level_n(data, row_name, col_name)
    
    df_row = data.groupby([row_name]).agg(['mean'])
    row_dict = dict(df_row[y_name]["mean"])
    
    df_col = data.groupby([col_name]).agg(['mean'])
    col_dict = dict(df_col[y_name]["mean"])
    
    df_rc  = data.groupby([row_name, col_name]).agg(['mean'])
    rc_dict = dict(df_rc[y_name]["mean"])
    
    total_avg = np.mean(data[y_name])
    
    sum = 0
    for i in rc_dict:
        rc_avg= rc_dict[i]
        r_avg = row_dict[i[0]]
        c_avg = col_dict[i[1]]
        sum += np.power(rc_avg - r_avg - c_avg + total_avg, 2)
        
    ssrc = m * sum   
        
    return ssrc

def two_way_anova(data, row_name, col_name, y_name, alpha=0.05):
    """可重复双因素方差分析"""
    
    n = len(data)                          # 总观测值数
    k = len(data[row_name].unique())       # 行变量的水平个数
    r = len(data[col_name].unique())       # 列变量的水平个数
    m = level_n(data, row_name, col_name)  # 行变量中每个水平的行数
    
    sst = SST(data[y_name])                         # 总平方和
    ssr = SSA(data, row_name, col_name, y_name)     # 行变量平方和
    ssc = SSA(data, col_name, row_name, y_name)     # 列变量平方和
    ssrc = SSRC(data, row_name, col_name, y_name)   # 交互作用平方和
    sse = sst - ssr - ssc - ssrc                    # 误差平方和
    
    msr = ssr / (k-1)
    msc = ssc / (r-1)
    msrc = ssrc / ((k-1)*(r-1))
    mse = sse / (k*r*(m-1))
    
    Fr = msr / mse
    Fc = msc / mse
    Frc = msrc / mse
    
    pfr = scipy.stats.f.sf(Fr, k-1, k*r*(m-1))
    pfc = scipy.stats.f.sf(Fc, r-1, k*r*(m-1))
    pfrc = scipy.stats.f.sf(Frc, (k-1)*(r-1), k*r*(m-1))
    
    Far = scipy.stats.f.isf(alpha, dfn=k-1, dfd=k*r*(m-1))   # 行 F临界值
    Fac = scipy.stats.f.isf(alpha, dfn=r-1, dfd=k*r*(m-1))   # 列 F临界值
    Farc = scipy.stats.f.isf(alpha, dfn=(k-1)*(r-1), dfd=k*r*(m-1))   # 交互 F临界值
    
    r_square = (ssr+ssc+ssrc) / sst
    
    table = pd.DataFrame({'差异源':[row_name, col_name, '交互作用', '内部(误差)', '总计'],
                          '平方和SS':[ssr, ssc, ssrc, sse, sst],
                          '自由度df':[k-1, r-1, (k-1)*(r-1), k*r*(m-1), n-1],
                          '均方MS':[msr, msc, msrc, mse, '_'],
                          'F值':[Fr, Fc, Frc, '_', '_'],
                          'P值':[pfr, pfc, pfrc, '_', '_'],
                          'F临界值':[Far, Fac, Farc, '_', '_'],
                          'R^2':[r_square, '_', '_', '_', '_']})
    
    return table
# 导入数据
df = pd.read_excel("E:xx业务数据.xlsx", sheet_name='source_05')

# 输出方差分析结果
two_way_anova(df, '超市位置', '竞争者数量', '销售额', alpha=0.01)

根据以上方差分析结果解释如下:

(1)竞争者数量:P-value=1.57485e-05 < \large \alpha =0.01 (或 F值>F临界值=4.71805),拒绝原假设。表明竞争者的数量对销售额有显著影响。

(2)超市位置:P-value=9.17534e-08    < \large \alpha =0.01 (或 F值>F临界值=5.61359),拒绝原假设。表明超市的位置对销售额有显著影响。

(3)交互作用:P-value=0.0160501       > \large \alpha =0.01 (或 F值>F临界值=3.66672),不拒绝原假设。没有证据表明竞争者的数量和超市的位置对销售额有交互影响。

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中,可以使用统计分析库来进行双因素方差分析。通过引用和引用[2]的内容,我们可以了解到双因素方差分析的基本思想和方法与单因素方差分析相似,但是双因素方差分析中可能会存在交互作用。在进行双因素方差分析之前,需要确保数据满足独立、正态和方差齐性的前提条件。 要在Python中进行双因素方差分析,可以使用一些统计分析库,如statsmodels和scipy。其中,statsmodels库提供了一个方便的函数anova_lm()来执行方差分析。 具体步骤如下: 1. 导入所需的库:import statsmodels.api as sm 2. 准备数据:将因素的数据按照需要的格式准备好,可以使用pandas库来处理数据。 3. 进行方差分析:使用anova_lm()函数进行方差分析。将因素的数据作为参数传入该函数,并设置参数typ=2来指定双因素方差分析。 4. 解释结果:根据方差分析的结果,可以得到各个因素、交互作用和误差部分的方差分解和显著性检验结果。 需要注意的是,在进行双因素方差分析之前,还应该进行一些前提条件的检验,比如正态性检验和方差齐性检验,以确保结果的准确性。 以上是使用Python进行双因素方差分析的基本步骤。希望对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [十六、 方差分析--使用Python进行双因素方差分析](https://blog.csdn.net/qq_35125180/article/details/108031734)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [使用Python进行数据分析——方差分析](https://blog.csdn.net/csdn1561168266/article/details/129216380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值