自定義單因素方差分析

定義總平方和分解公式:
在這裏插入圖片描述
在這裏插入圖片描述
利用檢驗統計量F定義檢驗方法:

'''實現單因素方差分析'''
# 導入相關包
import pandas as pd
import numpy as np
import math
import scipy
from scipy import stats 
 
# 自定義函數
 
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, x_name, y_name):
    df = data.groupby([x_name]).agg(['mean'])
    df = df[y_name]
    #dict_ = dict(df["mean"]) 用dict函數報錯
    dict_=df["mean"].to_dict()
    data_ = data[[x_name, y_name]]
    data_["add_mean"] = data_[x_name].map(lambda x: dict_[x])
    sse = sum(np.power(data_[y_name] - data_["add_mean"], 2))
    return sse
 
def one_way_anova(data, x_name, y_name, alpha=0.05):
    n = len(data)                     # 總觀測值數
    k = len(data[x_name].unique())    # 變量水平個數
    
    sst = SST(data[y_name])           # 總平方和
    ssa = SSA(data, x_name, y_name)   # 組間平方和
    sse = SSE(data, x_name, y_name)   # 組內平方和
    
    msa = ssa / (k-1)  # 組間均方 或 組間方差
    mse = sse / (n-k)  # 組內均方 或 組內方差
    F = msa / mse      # 檢驗統計量F
    pf = scipy.stats.f.sf(F, k-1, n-k)  
    Fa = scipy.stats.f.isf(alpha, dfn=k-1, dfd=n-k)   # F臨界值
    
    r_square = ssa / sst  # 自變量與因變量的關係強度表示
    
    table = pd.DataFrame({'差異源':['組間', '組內', '總和'],
                          '平方和SS':[ssa, sse, sst],
                          '自由度df':[k-1, n-k, n-1],
                          '均方MS':[msa, mse, '_'],
                          'F值':[F, '_', '_'],
                          'P值':[pf, '_', '_'],
                          'F臨界值':[Fa, '_', '_'],
                          'R^2':[r_square, '_', '_']})
    
    return table

實例測試結果:

d1=pd.read_excel(r'C:/Users/LHL/Desktop/方差分析.xlsx')
one_way_anova(d1, 'X', 'Y', alpha=0.05)

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章