私は先日、Pythonでライブラリなしの単回帰分析スクリプトを書きました。
参考サイトは、こちらを利用しました。
高校数学でわかる単回帰分析
Python
1 2import csv 3import math 4import os 5 6class Data(): # データクラスインスタンス->data 7 def __init__(self): 8 self.temp_data_list = [] 9 self.IF_data_list = [] 10 11class Average(): # 平均クラスインスタンス->ave 12 def __init__(self): 13 self.temp_ave = None 14 self.IF_ave = None 15 16 def averageCalc(self): 17 temp_total = 0 18 IF_total = 0 19 for (temp, IF) in zip(data.temp_data_list, data.IF_data_list): 20 temp_total += float(temp) 21 IF_total += float(IF) 22 self.temp_ave = temp_total / len(data.temp_data_list) 23 self.IF_ave = IF_total / len(data.IF_data_list) 24 25class Deviation(): # 偏差クラスインスタンス->dev 26 def __init__(self): 27 self.temp_deviation_list = [] 28 self.IF_deviation_list = [] 29 30 def deviationCalc(self): 31 for (temp, IF) in zip(data.temp_data_list, data.IF_data_list): 32 self.temp_deviation_list.append(float(temp) - float(ave.temp_ave)) 33 self.IF_deviation_list.append(float(IF) - float(ave.IF_ave)) 34 35class Dispersion(): # 分散クラスインスタンス->disp 36 def __init__(self): 37 self.S_temp2 = None 38 self.S_IF2 = None 39 40 def dispersionCalc(self): 41 temp = 0 42 IF = 0 43 for (temp_dev, IF_dev) in zip(dev.temp_deviation_list, dev.IF_deviation_list): 44 temp += float(temp_dev) * float(temp_dev) 45 IF += float(IF_dev) * float(IF_dev) 46 self.S_temp2 = temp / len(dev.temp_deviation_list) 47 self.S_IF2 = IF / len(dev.IF_deviation_list) 48 49class standardDeviation(): # 標準偏差クラスインスタンス->sd 50 def __init__(self): 51 self.S_temp = None 52 self.S_IF = None 53 54 def standardDevationCalc(self): 55 self.S_temp = math.sqrt(disp.S_temp2) 56 self.S_IF = math.sqrt(disp.S_IF2) 57 58class Covariance(): # 共分散クラスインスタンス->co 59 def __init__(self): 60 self.S_temp_IF = None 61 62 def covarianceCalc(self): 63 dev_total = 0 64 for (temp_dev, IF_dev) in zip(dev.temp_deviation_list, dev.IF_deviation_list): 65 dev_total += float(temp_dev) * float(IF_dev) 66 self.S_temp_IF = dev_total / len(dev.temp_deviation_list) 67 68class regressionLine(): # 回帰直線クラスインスタンス->reg 69 def __init__(self): 70 self.inclination = None 71 self.intercept = None 72 73 def inclinationCalc(self): 74 inc = float(co.S_temp_IF) / float(disp.S_temp2) 75 self.inclination = inc 76 77 def interceptCalc(self): 78 itc = float(ave.IF_ave) - (((float(co.S_temp_IF) / float(disp.S_temp2))) * float(ave.temp_ave)) 79 self.intercept = itc 80 81 def regressionLinePrint(self, path): 82 self.inclination = '{:.2f}'.format(float(self.inclination)) 83 self.intercept = '{:.2f}'.format(float(self.intercept)) 84 print('-----------------------------------') 85 print(os.path.basename(path).split('.', 1)[0]) # ファイル名 86 print('回帰直線') 87 print('y = ' + str(self.inclination) + 'x + ' + str(self.intercept)) 88 89class Coefficient(): # 係数クラスインスタンス->coef 90 def __init__(self): 91 self.correlation_coef = None # 相関係数 92 self.determination_coef = None # 決定係数 93 94 def correlationCalc(self): 95 r = float(co.S_temp_IF) / (float(sd.S_temp) * float(sd.S_IF)) 96 self.correlation_coef = r 97 return r 98 99 def determinationCalc(self): 100 rr = float(self.correlationCalc()) * float(self.correlationCalc()) 101 self.determination_coef = rr 102 103 def coefPrint(self): 104 self.correlation_coef = '{:.2f}'.format(float(self.correlation_coef)) 105 self.determination_coef = '{:.2f}'.format(float(self.determination_coef)) 106 print('相関係数') 107 print(self.correlation_coef) 108 print('決定係数') 109 print(self.determination_coef) 110 print('-----------------------------------') 111 112class Plot(): # グラフクラス 113 def __init__(self): 114 pass 115 116 117##インスタンス 118data = Data() # データクラスのインスタンス 119ave = Average() # 平均計算クラスのインスタンス 120dev = Deviation() # 偏差クラスのインスタンス 121disp = Dispersion() # 分散クラスのインスタンス 122sd = standardDeviation() # 標準偏差クラスのインスタンス 123co = Covariance() # 共分散クラスのインスタンス 124reg = regressionLine() # 回帰直線クラスのインスタンス 125coef = Coefficient() # 係数クラスのインスタンス 126 127#csvのパス 128path_list = [] 129 130for path in path_list: 131 ##CSV読み込み処理 132 with open(path, encoding = "utf-8-sig") as f: 133 reader = csv.reader(f) 134 for row in reader: 135 data.temp_data_list.append(float(row[0])) 136 row[1] = '{:.4f}'.format(float(row[1])) 137 data.IF_data_list.append(row[1]) 138 139 ##起動 140 ave.averageCalc() 141 dev.deviationCalc() 142 disp.dispersionCalc() 143 sd.standardDevationCalc() 144 co.covarianceCalc() 145 reg.inclinationCalc() 146 reg.interceptCalc() 147 reg.regressionLinePrint(path) 148 coef.determinationCalc() 149 coef.coefPrint()
しかし、エクセルでの単回帰分析結果とでは、
少しばかりの値の違いが出てしまいました。
しかし計算方法は合っているはずなので、
どこに間違いがあるかわからない状況です。
誰か統計学の知見があるかたに、
このPyhtonの計算のどこに間違いがあるか教えていただきたいです。