🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

974閲覧

Pythonによる単回帰分析が、エクセルでの分析結果と値が違うので、どこに間違いがあるか教えていただきたいです。

KTG

総合スコア1

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/09 14:15

私は先日、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の計算のどこに間違いがあるか教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/12/09 14:23

> エクセルでの単回帰分析結果とでは、少しばかりの値の違いが出てしまいました。 どのぐらい差があるのか不明ですが、sklearn等で実装した結果と比べてみたらどうでしょうか? 差がほとんどなければ(計算誤差の範囲内であれば)質問の実装は合っているのではないでしょうか。
jbpb0

2020/12/09 15:16 編集

csvを読むところで、 row[1] = '{:.4f}'.format(float(row[1])) と、桁数を制限しているからでは?
jbpb0

2020/12/09 15:19 編集

あと、計算結果を表示する桁数も、 '{:.2f}'.format より、もうちょっと増やした方がいいような
KTG

2020/12/11 12:37

ご回答くださった皆様、 大変助かりました。ありがとうございます!
guest

回答1

0

csvを読むところの
row[1] = '{:.4f}'.format(float(row[1]))
の桁数を増やすのと、計算結果を表示するところの
'{:.2f}'.format
の桁数を増やしてみてください

投稿2020/12/31 09:30

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問