質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

Q&A

解決済

3回答

1522閲覧

重回帰分析ライブラリのstatsmodelsでのmodel.fit()の処置がTypeErrorになってしまう

tasojiro

総合スコア16

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python

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

0グッド

0クリップ

投稿2021/10/25 19:35

前提・実現したいこと

現在、重回帰分析を利用したコードを作成しており、statsmodelsを使用して開発をしています。

問題は、model.fit()の段階で以下のエラーが起きてしまったことです。

調べてもあまり正解がつかめず、手詰まり状態です。おかしな点や間違っている点などがありましたら、ご教授して頂けると幸いです。

前提として。
①データは、小数点の数値が格納されています。(+,ーを含む(標準化済み))
②カラムは、英字です。
③「説明変数の削除」での、float型以外の削除では文字を含むデータを削除するために記述しました。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:/Users/UserName/Desktop/Test/test.py", line 93, in <module> result = model.fit() File "C:\Users\UserName\anaconda3\lib\site-packages\statsmodels\regression\linear_model.py", line 313, in fit beta = np.dot(self.pinv_wexog, self.wendog) File "<__array_function__ internals>", line 5, in dot TypeError: can't multiply sequence by non-int of type 'float'

該当のソースコード

python

1# -*- coding: utf-8 -*- 2from sklearn.preprocessing import StandardScaler 3import numpy as np 4import pandas as pd 5import statsmodels.api as sm 6 7 8#>-------------------------------------------------------------------------------< 9# データ読み込み と ノイズの削除 10#>-------------------------------------------------------------------------------< 11df = pd.read_csv("c:\Users\UserName\Desktop\Test\csv\sheet1.csv", encoding='UTF-8', sep=",") 12# print(df) 13 14x = 5 # ヘッダーの行をxに入力 15header = df.iloc[x-2] # ヘッダー情報 16# print(header) 17 18y = 8 # データ開始の行をyに入力 19deta_df = df.iloc[y-2:] # データ情報 20deta_df = pd.DataFrame(deta_df) # DF化 21# print(deta_df) 22 23deta_df.columns = header # ヘッダーを追加 24# print(df) 25 26 27#>-------------------------------------------------------------------------------< 28#欠損値の処理 29#>-------------------------------------------------------------------------------< 30dammy_df = deta_df.dropna(how='all').dropna(how='all', axis=1) # 行列のすべてがNaNの部分を削除 31df = dammy_df.dropna(how='any') # 行にNaNが含まれていたら削除 32df = df.reset_index(drop=True) # indexの振り直し 33# print(df) 34 35 36#>-------------------------------------------------------------------------------< 37# 変数の格納 (col:説明変数, res:目的変数) 38#>-------------------------------------------------------------------------------< 39res_col = 'rate' # 目的変数(カラム名)を入力 40# 説明変数と目的変数を格納 41res = np.array(df[res_col]) 42col_name = [item for item in df.columns if item != res_col] 43# print(col_name) 44 45 46#>-------------------------------------------------------------------------------< 47# 説明変数の削除 48#>-------------------------------------------------------------------------------< 49# 削除するカラムリスト 50to_remove = [] 51 52# float型以外の削除(文字情報のデータは未対応) 53for col, item in df.iteritems(): 54 try: 55 df[col].astype('float64') 56 except: 57 to_remove.append(col) 58# print(to_remove) 59 60for r in to_remove: 61 df = df.drop(r, axis=1) 62 col_name.remove(r) 63# print(df) 64# print(col_name) 65 66 67#>-------------------------------------------------------------------------------< 68# 標準化 69#>-------------------------------------------------------------------------------< 70scaler = StandardScaler() 71scaler.fit(np.array(df)) 72df_std = scaler.transform(np.array(df)) 73df_std = pd.DataFrame(df_std, columns=df.columns) 74# print(df_std) 75 76 77#>-------------------------------------------------------------------------------< 78# 学習 と 結果 79#>-------------------------------------------------------------------------------< 80x = np.array(sm.add_constant(df_std[col_name])) 81model = sm.OLS(res, x) 82result = model.fit() 83print(result.summary()) 84

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

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

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

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

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

jbpb0

2021/10/25 23:15

model = sm.OLS(res, x) のすぐ上に print(res.dtype) print(x.dtype) を追加して実行したら、何て表示されますか?
tasojiro

2021/10/25 23:27

ご返信ありがとうございます。 只今、実行したところ print(res.dtype) -> object print(x.dtype) -> float64 と出力されました。
jbpb0

2021/10/26 00:39 編集

> print(res.dtype) -> object がダメなのではないですかね 「df['rate']」に数値しか入ってないと分かってるのなら、 res = np.array(df[res_col]) ↓ 変更 res = np.array(df[res_col].astype('float64')) で、どうでしょうか?
tasojiro

2021/10/26 00:57

ご返信ありがとうございます。 確かに、データの型がfloat型で統一されていないところが原因でした。 ご提示いただいた通りに修正しましたところ、意図していた動作になりました。 ご協力本当にありがとうございます。
guest

回答3

0

can't multiply sequence by non-int of type 'float'

「df['rate']」に数値しか入ってないと分かってるのなら

python

1res = np.array(df[res_col])

↓ 変更

python

1res = np.array(df[res_col].astype('float64'))

投稿2021/10/26 01:00

jbpb0

総合スコア7651

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

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

0

自己解決

「質問への修正依頼欄」のjbpb0さんから、ご教授して頂きました。

修正内容は以下の通りになります

----------------------------------------------------------<

res = np.array(df[res_col])
↓ 変更
res = np.array(df[res_col].astype('float64'))

----------------------------------------------------------<

回答してくださった皆様、ご協力ありがとうございました!

投稿2021/10/26 01:00

tasojiro

総合スコア16

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

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

0

python

1y = 8 # データ開始の行をyに入力 2deta_df = df.iloc[y-2:] # データ情報 3deta_df = pd.DataFrame(deta_df) # DF化

python

1y = 8 # データ開始の行をyに入力 2deta_df = df.iloc[y-2:].astype(float) # データ情報 3deta_df = pd.DataFrame(deta_df) # DF化

とすれば動くかもしれません。

投稿2021/10/25 23:42

ppaul

総合スコア24666

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

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

tasojiro

2021/10/26 00:54

ご返信ありがとうございます。 ご提示いただきました通り、データ情報格納の段階で”.astype()”を叩きましたが 同じようなエラーが起きてしまいました。 しかし、質問の返信欄で返答くださった方のres宣言時に”.astype()”を叩くと 意図する動作となりました。 ご協力本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問