株価予測1　Chapter1

[Aidemy](https://aidemy.net/)　2020/10/30
#はじめに
　こんにちは、んがょぺです！バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます！
　今回は、株価予測1のメモの投稿になります。どうぞよろしくお願いします。

＊本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。

今回学ぶこと
・株価予測の流れ確認
・①ツイートの取得
・②感情分析（ネガポジ分析）

#株価予測の流れ
・__テクニカル分析__と__ファンダメンタルズ分析__というものがあり、今回はテクニカル分析を行う。流れは以下の通りである。（このChapterでは①と②を行う）
　①TwitterAPIで、あるアカウントの過去の__ツイートを取得__する。
　②極性辞書で日毎の__ツイートの感情分析（ネガポジ分析）__を行う。
　③日経平均株価の__時系列データを取得__する。
　④日毎のsentimentから、次の日の株価の上下を予測する__モデルを作成__する。

#①ツイートの取得
・まずは__TwitterAPI__に登録する。
・登録の仕方は省略。
・登録し、__「Consumer Key」,「Consumer Secret」,「Access Token Secret」,「Access Token」__を入手したら、それを使ってツイートを取得する。

##キーワードでツイートを取得
・コード![スクリーンショット 2020-10-17 17.17.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/126526e1-9450-c2db-5e75-dfbda9b2f3cd.png)

・上記コード__「res」__の__'python'__の部分が、取得するキーワードになる。

##アカウント単位でツイートを取得

・コード![スクリーンショット 2020-10-17 17.24.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/eb60f385-4acc-774c-b11e-7d4bb2cbeb06.png)

・上記コード「tweets」の__'@nikkei_bizdaily'__の部分が、取得するアカウントになる。
（@nikkei_bizdailyは「日経産業新聞」のアカウント）


#②ツイートの感情分析（ネガポジ分析）
・感情分析（ネガポジ分析）とは、自然言語処理によって、__テキストがポジティブな意味合いなのか、ネガティブな意味合いなのかを判断すること__である。
・判断基準になるものが__「極性辞書」__というものに入っている。テキストの各単語を辞書を参照することで感情分析を行う。
・今回は極性辞書として、__「単語感情極性対応表」__を使う。これは「岩波国語辞書（岩波書店）」を参考に、単語を-1~1までの値に当てはめたもの（PN値）である。値が大きいほどポジティブ、小さいほどネガティブな意味合いを示す。

##ツイートの感情分析の流れ
ⅰ.ツイートを取得し、__DataFrameに変換__。(株価予測の手順①参照)
ⅱ.極性辞書のインポート/DataFrame化。
ⅲ.MeCabで__形態素解析__。
ⅳ.形態素解析した単語ごとに__PN値を極性辞書から取得__し、辞書に追加。
Ⅴ.各ツイートごとに__PN値の平均を算出__する。
ⅵ.__標準化__を行い、PN値の値の変化を__グラフに表示__する。

###ⅱ.極性辞書のインポート/DataFrame化
・極性辞書のインポートは__pd.read_csv()__で行う。「単語感情極性対応表」の中でも、__「names=('Word','Reading','POS', 'PN')」__と指定して、単語やPN値を読み込む。
・極性辞書の単語の部分を__word_list__に、PN値の部分__pn_list__にリスト化して格納し、合わせて辞書化する（__pn_dict__）。

・コード
![スクリーンショット 2020-10-19 21.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/da8bf11e-1831-012a-ab24-2e8f3882dcdc.png)

###ⅲ.MeCabで形態素解析
・ツイートそのままでは極性辞書に渡すことができないので、__形態素解析__で単語ごとに分割する。ここでは__「get_diclist」__という関数を自分で定義して使用する。
・形態素解析は__MeCab__で行う。また、解析したものは一語ごとに改行されているので、__一行ごとに分けてリスト化__する。
・また、最後の二行は不要なので削除する。
・分割した各行はタブと間まで区切られているので、__re.split()__で完全に分割し、単語ごとにリストに追加する。（dic_list）

・コード
![スクリーンショット 2020-10-19 22.27.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/edfae7aa-df56-a07e-d6e4-a9621b186b5b.png)


###ⅳ.形態素解析した単語ごとにPN値を極性辞書から取得し、辞書に追加
・形態素解析により、極性辞書を参照できるようになったら、__単語ごとのdictデータに極性辞書のPN値を追加する__。これは関数「__add_pnvalue__」を定義して使用する。
・前項で作成した__「get_diclist」__で取得できる、単語の基本形__「'BaseForm'」__を辞書で探し、その後が辞書にあればその形で取得し、辞書になければ__'notfound'__として、それぞれ__diclist_new__という空のリストに追加する。

・コード![スクリーンショット 2020-10-20 12.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/2930203a-1917-18c9-bee1-d40ef901380e.png)


###Ⅴ.各ツイートごとにPN値の平均を算出する
・上記のdiclist_newで返されたリストから、__PN値の平均を求める__。
・平均算出にあたって、前項で'notfound'だった箇所はPN値の算出から除外する。また、算出時にpn_listに何も入っていなかったら平均0で算出する（値が入っていないとエラーになるため）。

・コード![スクリーンショット 2020-10-20 11.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/fa7c1dac-8bb0-7e65-d938-8e76b71e6e9d.png)

###標準化を行い、PN値の値の変化をグラフに表示する
・最後に、__PN値をグラフにして可視化する__。ただし、そのままだと極性辞書全体でポジティブな意味合いが多いかネガティブな意味合いが多いかで__グラフの結果も変わってしまう__ので、__標準化__を行うことで結果を調整する。
・またグラフについては__plt.plot()__で作成する。縦軸は__「pn値の平均」__、横軸は__「日付」__である。この時、PN値以外の情報である__'text'__の部分はグラフに必要ない情報なので削除する。

・（復習）標準化の方法（教師なし学習3） ： __(データと平均の差)÷標準偏差__
__X = (X - X.mean(axis=0))/X.std(axis=0)__

・コード（あるツイートdf_tweetsのpn値の平均「means_list」について標準化を行った場合）
![スクリーンショット 2020-10-20 12.32.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/596ccba0-d246-63cb-2472-7b3b13b4f565.png)

・グラフ![スクリーンショット 2020-10-20 11.57.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/80c50519-c43f-7dbc-4860-5899f7e19aa3.png)

#まとめ
・株価予測には、「ツイートの取得」「感情分析（ネガポジ分析）」「株価の時系列データ取得」「株価予測モデルの作成」という流れで行われる。
・Twitter APIに登録することで、ツイートを取得できる。
・感情分析のやり方は「ネガポジ分析」を参照。

今回は以上です。最後まで読んでいただき、ありがとうございました。