Python玩轉數據分析——雙因素方差分析概念一、無交互作用的情況二、有交互作用的情況


概念

方差分析(Analysis of Variance,簡稱ANOVA),又稱“變異數分析”或“F檢驗”,用於兩個及兩個以上樣本均數差別的顯著性檢驗。雙因素方差分析即影響試驗的因素有兩個,且分為無交互作用和有交互作用兩種情況。

一、無交互作用的情況

由於不考慮交互作用的影響,對每一個因素組合 ( Ai , Bj ) 只需進行一次獨立試驗,稱為 無重復試驗

准備數據

考慮三種不同形式的廣告和五種不同的價格對某種商品銷量的影響。選取某市15家大超市,每家超市選用其中的一個組合,統計出一個月的銷量如下(設顯著性水平為0.05): 在這里插入圖片描述 將數據導入python,代碼如下:

    dic_t2=[{'廣告':'A1','價格':'B1','銷量':276},{'廣告':'A1','價格':'B2','銷量':352},
          {'廣告':'A1','價格':'B3','銷量':178},{'廣告':'A1','價格':'B4','銷量':295},
          {'廣告':'A1','價格':'B5','銷量':273},{'廣告':'A2','價格':'B1','銷量':114},
          {'廣告':'A2','價格':'B2','銷量':176},{'廣告':'A2','價格':'B3','銷量':102},
          {'廣告':'A2','價格':'B4','銷量':155},{'廣告':'A2','價格':'B5','銷量':128},
          {'廣告':'A3','價格':'B1','銷量':364},{'廣告':'A3','價格':'B2','銷量':547},
          {'廣告':'A3','價格':'B3','銷量':288},{'廣告':'A3','價格':'B4','銷量':392},
          {'廣告':'A3','價格':'B5','銷量':378}]
  df_t2=pd.DataFrame(dic_t2,columns=['廣告','價格','銷量'])

無交互作用的雙因素方差分析

接下來進行無交互作用的雙因素方差分析,代碼如下:

    def f_twoway(df_c,col_fac1,col_fac2,col_sta,interaction=False):
      df=df_c.copy()
      list_fac1=df[col_fac1].unique()
      list_fac2=df[col_fac2].unique()
      r=len(list_fac1)
      s=len(list_fac2)
      x_bar=df[col_sta].mean()
      list_Qa=[]
      list_Qb=[]
      for i in list_fac1:
          series_i=df[df[col_fac1]==i][col_sta]
          xi_bar=series_i.mean()
          list_Qa.append((xi_bar-x_bar)**2)
      for j in list_fac2:
          series_j=df[df[col_fac2]==j][col_sta]
          xj_bar=series_j.mean()
          list_Qb.append((xj_bar-x_bar)**2)
      Q=((df[col_sta]-x_bar)**2).sum()
      df_res=pd.DataFrame(columns=['方差來源','平方和','自由度','均方','F值','Sig.'])
      if interaction==False:
          Qa=s*sum(list_Qa)
          Qb=r*sum(list_Qb)
          Qw=Q-Qa-Qb
          Sa=Qa/(r-1)
          Sb=Qb/(s-1)
          Sw=Qw/((r-1)*(s-1))
          sig1=stats.f.sf(Sa/Sw,r-1,(r-1)*(s-1))
          sig2=stats.f.sf(Sb/Sw,s-1,(r-1)*(s-1))
          df_res['方差來源']=[col_fac1,col_fac2,'誤差','總和']
          df_res['平方和']=[Qa,Qb,Qw,Q]
          df_res['自由度']=[r-1,s-1,(r-1)*(s-1),r*s-1]
          df_res['均方']=[Sa,Sb,Sw,'-']
          df_res['F值']=[Sa/Sw,Sb/Sw,'-','-']
          df_res['Sig.']=[sig1,sig2,'-','-']
          return df_res
      elif interaction==True:
          list_Qw=[]
          t=len(df[(df[col_fac1]==list_fac1[0]) & (df[col_fac2]==list_fac2[0])])
          for i in list_fac1:
              for j in list_fac2:
                  series_ij=df[(df[col_fac1]==i) & (df[col_fac2]==j)][col_sta]
                  list_Qw.append(((series_ij-series_ij.mean())**2).sum())
          Qa=s*t*sum(list_Qa)
          Qb=r*t*sum(list_Qb)
          Qw=sum(list_Qw)
          Qab=Q-Qa-Qb-Qw
          Sa=Qa/(r-1)
          Sb=Qb/(s-1)
          Sab=Qab/((r-1)*(s-1))
          Sw=Qw/(r*s*(t-1))
          sig1=stats.f.sf(Sa/Sw,r-1,r*s*(t-1))
          sig2=stats.f.sf(Sb/Sw,s-1,r*s*(t-1))
          sig3=stats.f.sf(Sab/Sw,(r-1)*(s-1),r*s*(t-1))
          df_res['方差來源']=[col_fac1,col_fac2,col_fac1+'*'+col_fac2,'誤差','總和']
          df_res['平方和']=[Qa,Qb,Qab,Qw,Q]
          df_res['自由度']=[r-1,s-1,(r-1)*(s-1),r*s*(t-1),r*s*t-1]
          df_res['均方']=[Sa,Sb,Sab,Sw,'-']
          df_res['F值']=[Sa/Sw,Sb/Sw,Sab/Sw,'-','-']
          df_res['Sig.']=[sig1,sig2,sig3,'-','-']
          return df_res
      else:
          return 'interaction參數錯誤'
  f_twoway(df_t2,'廣告','價格','銷量')

結果如下: 在這里插入圖片描述 由於廣告的p值 Sig. = 0.000 < 0.05,價格的 Sig. = 0.006 < 0.05,即可認為不同的廣告形式、不同的價格均造成商品銷量的顯著差異。

二、有交互作用的情況

由於因素有交互作用,需要對每一個因素組合 ( Ai , Bj ) 分別進行 t 次 ( t ≥ 2 ) 重復試驗,稱這種試驗為 等重復試驗

准備數據

火箭的射程與燃料的種類和推進器的型號有關,現對四種不同的燃料與三種不同型號的推進器進行試驗,每種組合各發射火箭兩次,測得火箭的射程結果如下(設顯著性水平為0.01): 在這里插入圖片描述 將數據導入Python,代碼如下:

    dic_t3=[{'燃料':'A1','推進器':'B1','射程':58.2},{'燃料':'A1','推進器':'B1','射程':52.6},
          {'燃料':'A1','推進器':'B2','射程':56.2},{'燃料':'A1','推進器':'B2','射程':41.2},
          {'燃料':'A1','推進器':'B3','射程':65.3},{'燃料':'A1','推進器':'B3','射程':60.8},
          {'燃料':'A2','推進器':'B1','射程':49.1},{'燃料':'A2','推進器':'B1','射程':42.8},
          {'燃料':'A2','推進器':'B2','射程':54.1},{'燃料':'A2','推進器':'B2','射程':50.5},
          {'燃料':'A2','推進器':'B3','射程':51.6},{'燃料':'A2','推進器':'B3','射程':48.4},
          {'燃料':'A3','推進器':'B1','射程':60.1},{'燃料':'A3','推進器':'B1','射程':58.3},
          {'燃料':'A3','推進器':'B2','射程':70.9},{'燃料':'A3','推進器':'B2','射程':73.2},
          {'燃料':'A3','推進器':'B3','射程':39.2},{'燃料':'A3','推進器':'B3','射程':40.7},
          {'燃料':'A4','推進器':'B1','射程':75.8},{'燃料':'A4','推進器':'B1','射程':71.5},
          {'燃料':'A4','推進器':'B2','射程':58.2},{'燃料':'A4','推進器':'B2','射程':51.0},
          {'燃料':'A4','推進器':'B3','射程':48.7},{'燃料':'A4','推進器':'B3','射程':41.4},]
  df_t3=pd.DataFrame(dic_t3,columns=['燃料','推進器','射程'])

有交互作用的雙因素方差分析

接下來進行有交互作用的雙因素方差分析,代碼如下:

    f_twoway(df_t3,'燃料','推進器','射程',interaction=True)

結果如下: 在這里插入圖片描述 從表中可以看出,Sig.(燃料) = 0.026 > 0.01,Sig.(推進器) = 0.004 < 0.01,Sig.(燃料*推進器) = 0.000 < 0.01。故可以認為燃料對火箭的射程沒有顯著影響,而推進器及燃料與推進器的交互作用影響顯著。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM