python 实现无重复双因素方差分析(2)

案例:

分析品牌和地区对销售量是否有显著影响(\large \alpha =0.05

提出假设:

为了检验两个因素的影响,需要对两个因素分别提出如下假设。

对行因素提出的假设为:

由于变量品牌有4个水平,分别是品牌1、品牌2、品牌3和品牌4,那么为了检验这4个水平(每个水平代表一个总体)的均值是否相等。

\large H_{0}: \mu _{1}= \mu _{2}= \mu _{3}= \mu _{4}       品牌对销售量没有显著影响

\large H_{1}: \mu _{1}, \mu _{2},\mu _{3}, \mu _{4} 不完全相等  品牌对销售量有显著影响

对列因素提出的假设为:

由于变量地区有5个水平,分别是地区1、地区2、地区3、地区4 和地区5,那么为了检验这5个水平(每个水平代表一个总体)的均值是否相等。

\large H_{0}: \mu _{1}= \mu _{2}= \mu _{3}= \mu _{4}== \mu _{5}       地区对销售量没有显著影响

\large H_{1}: \mu _{1}, \mu _{2},\mu _{3}, \mu _{4}, \mu _{5}不完全相等          地区对销售量有显著影响

 

由于变量品牌(有4个水平)和变量地区(有5个水平),分别是零售业、旅游业、航空公司和家电制造业,那么为了检验这4个水平(每个水平代表一个总体)的均值是否相等,需要提出如下的假设:

# 导入相关包
import pandas as pd
import numpy as np
import scipy

# 自定义函数

def level_avg(data, x_name, y_name):
    df = data.groupby([x_name]).agg(['mean'])
    df = df[y_name]
    dict_ = dict(df["mean"])
    return dict_

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

def SSA(data, x_name, y_name):
    total_avg = np.mean(data[y_name])
    df = data.groupby([x_name]).agg(['mean', 'count'])
    df = df[y_name]
    ssa = sum(df["count"]*(np.power(df["mean"] - total_avg, 2)))
    return ssa

def SSE(data, y_name):
    
    data_ = data.copy()
    total_avg = np.mean(data[y_name])
    x_var = set(list(data.columns))-set([y_name])
   
    cnt=1
    for i in x_var:
        dict_ = level_avg(data, i, y_name)
        var_name = 'v_avg_{}'.format(cnt)
        data_[var_name] = data_[i].map(lambda x: dict_[x])
        cnt += 1
   
    sse = sum(np.power(data_[y_name] - data_["v_avg_1"] - data_["v_avg_2"] + total_avg, 2))
    return sse

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())    # 列变量水平个数
    
    sst = SST(data[y_name])             # 总平方和
    ssr = SSA(data, row_name, y_name)   # 行变量平方和
    ssc = SSA(data, col_name, y_name)   # 列变量平方和
    sse = SSE(data, y_name)             # 误差平方和
    
    msr = ssr / (k-1)
    msc = ssc / (r-1)
    mse = sse / ((k-1)*(r-1))
    
    Fr = msr / mse  # 行变量 统计量F
    Fc = msc / mse  # 列变量 统计量F
    pfr = scipy.stats.f.sf(Fr, k-1, (k-1)*(r-1))  # 行变量 统计量F的P值
    pfc = scipy.stats.f.sf(Fc, r-1, (k-1)*(r-1))  # 列变量 统计量F的P值
    
    Far = scipy.stats.f.isf(alpha, dfn=k-1, dfd=(k-1)*(r-1))   #行 F临界值
    Fac = scipy.stats.f.isf(alpha, dfn=r-1, dfd=(k-1)*(r-1))   #列 F临界值
    
    r_square = (ssr+ssc) / sst      # 联合效应/总效应
    
    table = pd.DataFrame({'差异源':[row_name, col_name, '误差', '总计'],
                          '平方和SS':[ssr, ssc, sse, sst],
                          '自由度df':[k-1, r-1, (k-1)*(r-1), k*r-1],
                          '均方MS':[msr, msc, mse, '_'],
                          'F值':[Fr, Fc, '_', '_'],
                          'P值':[pfr, pfc, '_', '_'],
                          'F临界值':[Far, Fac, '_', '_'],
                          'R^2':[r_square, '_', '_', '_']})
    
    return table
# 导入数据
df = pd.read_excel("E:\\xx业务数据.xlsx", sheet_name='source_03')

# 输出方差分析结果
two_way_anova(df, '品牌', '地区', '销售量', alpha=0.05)

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

(1)品牌:P-value=9.45615e-05 < \large \alpha =0.05 (或 F值=18.1078>F临界值=3.49029),拒绝原假设。表明竞品牌对销售量有显著影响。

(2)地区:P-value=0.143665     > \large \alpha =0.05 (或 F值=2.10085<F临界值=3.25917),不拒绝原假设。没有证据表明地区对销售量有显著影响。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值