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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1163閲覧

2次関数を微分して接線を求めたい

sarupip

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/02/06 04:59

編集2018/02/06 11:31

前提・実現したいこと

python初めて2日目の初心者です。
2次関数を微分し、接線の傾きが0となる
xおよびyを計算してます。
csvファイルを読み込み、価格と個数の回帰分析を行いました。
そのデータを用いて2次関数を作成します。

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

return p[1] * x ** 2 + (p[0] - p[1] * 99) * x - p[0] * 99 TypeError: 'int' object is not subscriptable

該当のソースコード

python

1# 必要なモジュールのインポート 2import pandas as pd 3import numpy as np 4import matplotlib.pyplot as plt 5 6# ファイルの読み込み 7df = pd.read_csv('lm_analysis.csv') 8 9# 売り上げ個数の予想する回帰分析を行う 10y = np.array(df['sales'].tolist()) 11x = np.array(df['price'].tolist()) 12z = np.polyfit(x, y, 1) 13 14p = np.poly1d(z) 15p30 = np.poly1d(np.polyfit(x, y, 30)) 16xp = np.linspace(0, 500, 100) 17 18plt.plot(x, y, '.', xp, p(xp), '-', xp, p30(xp), '*') 19plt.ylim(0, 10) 20plt.show() 21# 切片と傾きの表示 22# p[0]:傾き 23# p[1]:切片 24print("p0:", p[0]) 25print("p1:", p[1]) 26 27# 一旦原価は99で固定 28def f(x, p): 29 return p[1] * x ** 2 + (p[0] - p[1] * 99) * x - p[0] *99 30 31dx0 = -p[0] + p[1] * 99 / (2 * p[1]) 32dy0 = f(dx0,0) 33print(dx0, dy0) 34plt.plot(p[1] * x ** 2 + (p[0] - p[1] * 99) * x - p[0] * 99) 35plt.show() 36

最終的に出したグラフ

回帰分析の絵
イメージ説明
想定利益の絵
イメージ説明

補足情報(FW/ツールのバージョンなど)

---補足情報---
x軸:価格(price)
y軸:想定利益
※想定利益→(価格ーcost)×個数
個数を回帰分析で予想し、個数=p[0] + p[1]×価格
として、価格(price)をx軸にした2次関数にしようとしています。
(x-cost)*(p[0]+p[1]*x)
=p[1]*x^2 +(p[0]-p[1]*cost)x - costp[0]
これから頂点を求めると、最大利益が出る

という想定です。

python3.6
Pycharm: 2017.3.3

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

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

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

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

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

guest

回答2

0

解決済みですので参考情報の提供です。
今回の想定利益を最大にする価格という変数を求める方法として、scypy.optimizeにあるminimizeがあります。これは、所定の関数において結果が最小になる値を探索的に計算するものです。今回の想定利益の関数は上に凸なので、想定利益に-1を乗算する必要がありますが、この関数をminimizeに引数として設定することで最適な価格を求めることができます。
コードは以下の感じです
minimize(下に凸の関数,x0=初期値)
下に凸の関数は、defなどで定義したものです。x0は計算のスタートポジションのようなものなので、作成済みのグラフから決めて構いません

投稿2018/02/07 03:25

R.Shigemori

総合スコア3376

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

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

0

ベストアンサー

求めたい結果が把握できているか分かりませんが、単純にnumpy.polyfitで価格から個数を求める1次式の係数を求め、利益を求める2次式より傾き0の値を求めればよいかと思います。
参考:NumPy で回帰分析をする

Python

1import pandas as pd 2from io import StringIO 3 4# 0円で100個,1000円で0個売れる 5s = """ 6price,sales 70,100 81000,0 9""" 10df = pd.read_csv( StringIO(s), sep=",") 11 12import numpy as np 13x = np.array(df['price'].tolist()) 14y = np.array(df['sales'].tolist()) 15 16# 価格から予想個数を線形回帰 17import scipy as sp 18p = sp.polyfit(x, y, 1) 19print(p) # [ -0.1 100] 20 21cost = 100# 原価 22 23# 利益が最大となる価格、個数、利益額 24price = - ( p[1] - cost * p[0] ) / (2 * p[0]) 25sales = p[0] * price + p[1] 26profits = p[0] * price ** 2 + ( p[1] - cost * p[0]) * price - cost * p[1] 27 28print(price, sales, profits) # 550.0 45.0 20250.0

結果をどのように表示すべき(したい)かについては不明ですので回答は保留します。

投稿2018/02/06 06:28

編集2018/02/06 09:24
can110

総合スコア38262

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

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

sarupip

2018/02/06 07:45

回答ありがとうございます。 試してみましたが、2次関数のグラフを描こうとしたときに、思うような結果が出ませんでした。 今回のグラフについては、 x軸:価格(price) y軸:想定利益   ※想定利益→(価格ーcost)×個数    個数を回帰分析で予想し、個数=p[1] + p[1]×価格    として、価格(price)をx軸にした2次関数にしようとしています。
can110

2018/02/06 07:54

想定利益やcostなど、補足すべき内容は、質問を修正することで追記ください。 また、具体的な入力データ例を挙げ、その場合の欲しい結果=回帰分析結果の(理論)値およびグラフ(Excelでも手書きでも)などなどを追記すると回答得られやすいかと思います。
sarupip

2018/02/06 08:16

補足情報に追記いたしました。 お手数をおかけします。
can110

2018/02/06 08:37

すみません。何が分からないかがちょっと分かりません。 想定利益の式p[1]*x^2~から微分式 2*p[1]*x + ~ = 0 を解くとxが求まり そのxから想定利益も求まりますよね?
sarupip

2018/02/06 09:05

何度もすみません。ガチャガチャいじっている現在の状況へ更新しました。 現時点では、式を定義する際に 'int' object is not subscriptable というエラーが出ています。 どこを変更すればよいのでしょうか。
can110

2018/02/06 09:25

やはり結果として何を求めたいのかが分かりかねますので、こちらで理解した範囲のみで回答を修正しました。
sarupip

2018/02/06 09:40

ご丁寧にありがとうございます。 ご面倒をおかけし申し訳ありません。 結果は、今回の2次関数をplotで表示したいのです。
sarupip

2018/02/06 11:33

何度もやりとりありがとうございました。 x = sym.symbols('x') x = np.arange(1, 500, 0.1) best_profits = p[1] * x ** 2 + (p[0] - cost * p[1]) * x - cost * p[0] plt.plot(x, best_profits ) にてグラフを作成できました。
can110

2018/02/06 11:41

無事解決されたようでよかったです。 なお蛇足ながら「x = sym.symbols('x')」の行は不要かと思います (次行のx=で数列を代入しているので)。
sarupip

2018/02/06 11:56

ありがとうございます。 その行はガチャガチャいじっているときの名残でした。 pythonを勉強し始めて2日でわからないことだらけなので、今後ともよろしくお願いします。 (その前に質問をもう少しまともになるようにします・・・)
can110

2018/02/06 12:04

いえいえ。 他言語の素養があると察しますが、短時間での解決、素晴らしいと思います。 質問内容についてですが、やはり可能な限り再現可能なサンプルデータ、コード、求める結果が提示されていると実際に各自が検証でき、結果として回答は得られやすいかと思います。
sarupip

2018/02/06 23:48

おはようございます。 プログラミング自体ほぼ初めてです。 (R言語を多少やったくらいです)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問