暇な男子大学院生

物理系の研究をしてる理系大学院生。塾講師歴5年の知識を生かした勉強のアドバイス。時事ネタ。まぁ色々書きます。

【株を資金10万円から始めてみた件】 8/13 株は甘くないなぁ

8/13の取引

明日を楽しみにしますとか言っていましたが、株価は土日に上下しないことを知りませんでした、、、笑


そのくらいの初心者です、はい。笑


てことで月曜日になって株を見ていくと、、、








下がってるやんけ。。


甘いものではありませんね。


と言うものの、損切りラインには到達していないので、ここは保留。


まだ、勉強不足が否めないので、新たには買わず、動かずにいました。


勉強するための本探しでこの日は終わりでした。


新しく買った銘柄

なし

本日売った銘柄

なし

保有継続銘柄

ヤフー株式会社 100株

【株を資金10万円から始めてみた件】 8/11 株を初めて初日の試し買い

はじめまして、こんにちは。


まず株を始めた経緯についてです。


当方、現在大学院生として研究に励んでおり、それによって物理学の専門性であったり、論理的思考力を身につけることができています。


しかし、研究とはいかんせん狭い世界であり、社会情勢や経済の動きにあまり左右されない世界と言えるでしょう。


(もちろん、人工知能やiPS細胞などの流行はありますが、、、)


すると、毎日の中でニュースを見て、社会の動きを知る機会が減ってきていることを実感しだしました。


そこで、株を初めてみることを決めました。


それにより、能動的にニュースや企業の損益などを見るようになり、上記の問題を解決することができると考えたからです。


というわけで、とりあえずSBI証券を開き、10万円ぶち込んで、取引を開始してみます!


8/11の取引

今日始めたので、あまり仕様がわかっていない状態でした。


当方、「習うより慣れろ」をモットーとしているので、とりあえず買えそうな知っている企業の株を買ってみることにしました。


(今考えると、普通に考えていいことではないなこれ、、、)


そこで、ヤフー株式会社(4689)の株を買ってみました。


利食い損切りタイミングはそれぞれ10%、5%としました。


ドキドキしながら明日を向かえます!


新しく買った銘柄

ヤフー(4689) ¥410×100株

本日売った銘柄

なし

保有継続銘柄

なし

株を資金10万円から始めてみた件

こんにちは!


実はこの前からSBI証券に登録をし、株をはじめました。


貧困大学院生ということで、10万円という少額で始めてみたいと思います。


このブログで、10万円でどれだけ株を楽しめるか、どれだけ利益もしくは損益が出るのかを皆様にお教えしたいと思います。


また、それとともに、記録を書くことで自分のトレードの反省に活かし、よりよい株生活にしていきたいと思います。


よろしくお願いいたします!



実は今の所、マイナスなのですが、、、笑


それについてはまた別日に書いていきます!


今後共よろしくお願いいたします!

【初心者による初心者のための】python / pandas 解説

pandasとは

pandasとは、

「データ解析を容易にする機能を持ったオープンソースのライブラリ」

です!


具体的に何ができるのかというと、


・データ操作のためのDataFrameの作成

・他フォーマットとのデータのやり取り

・データの様々な処理 (欠損値処理や集計)


などなどです。


じゃあ、実際に動作させて何ができるのか見ていきましょう!


今回用いるデータについて


今回はkaggleのHouse Prices問題に掲載されている、訓練データの一部を抜粋した以下のデータを用いる。


Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape
1 60 RL 65 8450 Pave NA Reg
2 20 RL 80 9600 Pave NA Reg
3 60 RL 68 11250 Pave NA IR1
4 70 RL 60 9550 Pave NA IR1
5 60 RL 84 14260 Pave NA IR1
6 50 RL 85 14115 Pave NA IR1
7 20 RL 75 10084 Pave NA Reg


これを、"pandas_practice.csv"とする。


pandasでのデータ操作

pandasのimport


まずはpandasをインポートしましょう。

import pandas as pd

データの読み込み


"pd.read_csv()"


これを用いると、csvファイルをDataFrameの形式で読み込んでくれます。

#データをDataFrame形式で読み込み
df = pd.read_csv("pandas_practice.csv")


これによりcsvファイルをDataFrame形式で読み込むことができました。


とりあえず見てみましょう。

#DataFrame形式でデータを表示
df


f:id:mashkun:20180813231254p:plain



上手くできていますね!



データのタイプ


このデータのタイプを見ていきます。


データ処理を施す際、データが数値なのか文字なのかが非常に大事になります。


"df.dtypes"


を使うことでそれを確認できます!

#データのタイプを確認
df.dtypes
Id               int64
MSSubClass       int64
MSZoning        object
LotFrontage      int64
LotArea          int64
Street          object
Alley          float64
LotShape        object
dtype: object

データのサイズ


次にこのデータのサイズを確認する方法です。

"df.shape"


これは、shape (形)という単語を使っているので即覚えですね。

#DataFrameのサイズ(行数, 列数)を表示
df.shape
(7, 8)

データのカラム(列)


DataFrameのカラムの要素を見る方法です。


"df.columns"


カラムが多いときによく使います。

#DataFrameのカラムの要素を表示
df.columns
Index(['Id', 'MSSubClass', 'MSZoning', 'LotFrontage', 'LotArea', 'Street',
       'Alley', 'LotShape'],
      dtype='object')

必要なカラム(列)を選択


データの扱う際、カラムごとに処理を施すことは少なくありません。


その場合、カラムを選択する必要があります。

"df[""]"


これによって、objectを数値にしたりすることが多いです。

#DataFrameのカラムを選択
df["Id"]
0    1
1    2
2    3
3    4
4    5
5    6
6    7
Name: Id, dtype: int64

必要なインデックス(行)を選択


上記のものより使う機会は少ないですが、知っていると便利なコードです。


df.loc[]


#DataFrameのカラムを選択
df.loc[2;6]

f:id:mashkun:20180813231238p:plain



2-7行目を取り出せてますね!


まとめ


本記事では、pandasについての基本知識と基本操作を記しました。


他にもよく使う操作があるので時間ができたらまとめたいなぁ。


今後とも是非記事をご覧になってください!

【初心者による初心者のための】kaggleのHouse Prices問題を解説

はじめに

はじめまして。


現在、大学院で脳型コンピュータやReRAMについて研究している暇な大学院生です。


以後お見知りおきを。




その研究の過程で、機械学習の知識が必要になったのですが、机上で勉強するより実際に手を動かして勉強したいなと。


でも、これといって開発したいものや、データがないなぁ、と悩んでいたんですが、友達にkaggleというものを教わりました。


そんないいものがあるのかと。結果を出せばお金ももらえるのかと。


じゃあ、kaggleで勉強しようと心に決めて、とりあえず調べつつ「House Prices問題」にチャレンジしました。


その備忘録且つ、理解を深めていくために記事にさせていただきます!





注意点ですが、


初心者なので、単純なデータ処理しか行っていません。


まず、純粋にkaggleを楽しみつつ、知識を蓄え、今後より良い結果を出していきたいと思っています。


温かい目でご覧になってください。



また、この問題を解く際に、こちらのサイトを参考にさせていただきました。


Kaggleの練習問題(Regression)を解いてKagglerになる


かなり詳しく説明されており、わかりやすいのでおすすめです!


非常に勉強になりました。


ありがとうございました!


House Prices問題

まず、House Prices問題について見ていきましょ。



Competition Descriptionを要約してみると、


アイオワ州のエイムズにある住宅のあらゆる側面を説明する79の説明変数から、各家の最終価格を予測しよう、って感じです。


提出の形としては、IDと価格をセットで提出すれば良さそうです。


じゃあやっていきます。

データ解析


まずはじめに必要そうなライブラリをimportをしておきましょう。

import pandas as pd
import seaborn as sns
import numpy as np


pandasとは、エクセルのデータ解析を容易にするライブラリ。


seabornとは、グラフ描画ライブラリであり、有名なmatplotlibよりも綺麗に容易に書けると言われています。



その後、与えられた訓練データとテストデータを、それぞれ"train"と"test"としておきましょう。


これでとりあえず準備は完璧です!

train = pd.read_csv("train.csv") #訓練データを"train"とする
test = pd.read_csv("test.csv") #テストデータを"test"とする

で、そもそもの話、訓練データはどんなものなの?って思いますよね。


説明変数が数値(int, float)なのか文字(object)なのか。


直接、エクセルを開いて見てもいいですが、せっかくなんでpythonで見てみましょ。


print(train.dtypes) #訓練データのデータタイプを確認

f:id:mashkun:20180807013152p:plain



79の説明変数って意外と多いな。



intとfloatは数値なので、そのままモデルに入れて学習させても良さそうですね。


しかし、objectが多いこと、多いこと。


これを数値に直す必要がありそうですね。




あと、多すぎてコマンドプロンプトだと表示が省略されてしまっている。


全体が見えたほうが何かと便利なので、とりあえずその設定を変えましょう。


一応ね。


下のコードを打つことによって、、、

pd.set_option("display.max_rows", 81) #表示範囲を拡大


これで全てが表示されるようになりましたね!


データ欠損の穴埋め

次に、データに欠損ないかを見ていきましょう。


データを集められたとしても、全て完璧というわけではありません。


どのデータがどれだけ無いのかを把握することが大事になってきます。


print(train.isnull().sum()) #訓練データのカラムごとの欠損数を表示
print(test.isnull().sum()) #テストデータのカラムごとの欠損数を表示

すると、下記のように表示されるはずです。


訓練データには、



LotFrontage 259
Alley 1369
BsmtQual 37
BsmtCond 37
BsmtExposure 38
BsmtFinType1 37
BsmtFinType2 38
FireplaceQu 690
GarageType 81
GarageYrBlt 81
GarageFinish 81
GarageQual 81
GarageCond 81
PoolQC 1453
Fence 1179
MiscFeature 1406



テストデータには、



MSZoning 4
LotFrontage 227
Alley 1352
Utilities 2
Exterior1st 1
Exterior2nd 1
MasVnrType 16
MasVnrArea 15
BsmtQual 44
BsmtCond 45
BsmtExposure 44
BsmtFinType1 42
BsmtFinSF1 1
BsmtFinType2 42
BsmtFinSF2 1
BsmtUnfSF 1
TotalBsmtSF 1
BsmtFullBath 2
BsmtHalfBath 2
KitchenQual 1
Functional 2
FireplaceQu 730
GarageType 76
GarageYrBlt 78
GarageFinish 78
GarageCars 1
GarageArea 1
GarageQual 78
GarageCond 78
PoolQC 1456
Fence 1169
MiscFeature 1408
SaleType 1


結構多いやんけ。。


とりあえず、欠損数が1000以上と多すぎるデータは落としときましょ。


適当に値を入れると、それこそ予測がおかしくなるかも。。

train = train.drop(["Alley", "PoolQC", "MiscFeature", "Fence"], axis=1) #欠損多すぎ
test = test.drop(["Alley", "PoolQC", "MiscFeature", "Fence"], axis=1) #欠損多すぎ

じゃあ次は、先ほどデータタイプを見たときにobjectだったカラムを数字のデータにしていきます。


数値にしちゃえば、そのままモデルに入れられますからね。


ダミー変数を使ってやる方法もありますが、これ以上カラム増やすのもなぁ、というよくわからん理由でやめました。



ここでは、Label Encoderを使ってみましょう。


とりあえずimportします。

from sklearn.preprocessing import LabelEncoder 


しかし、objectがたくさんあるため、一つ一つやるのは大変。。


そこで、ifでobjectを判別して、forでそれを回してみます。


for i in range(train.shape[1]): #forで回す変数iの範囲を、訓練データの列の数にして、
    if train.iloc[:,i].dtypes == object: #もしその列のデータタイプがobjectだったとしたら、下の処理をする
        le = LabelEncoder() #LabelEncoderの関数をleと名付けて、
        le.fit(list(train.iloc[:,i].values)) #le.fit()に入れることで変換したいデータを選択し、
        train.iloc[:,i] = le.transform(list(train.iloc[:,i].values)) #le.transform()で数値に変換する

#以降でやってることはわかるでしょうか。


今度より深く勉強し、説明を増やしたいなと考えています。


んじゃ、これをテストデータにも同様に。

for i in range(test.shape[1]): 
    if test.iloc[:,i].dtypes == object: 
        le = LabelEncoder()
        le.fit(list(test.iloc[:,i].values)) 
        test.iloc[:,i] = le.transform(list(test.iloc[:,i].values)) 


これで、全てが数値になりました!気持ちいい!


f:id:mashkun:20180811013409p:plain



次は、それらのデータの欠損を完全に無くしましょう!


ここで、もともとobjectだったものの平均をとるとなんか気持ち悪い(理由はない)ので、中間値を取りましょう。


平均のほうがいい値になるのかな?わかんないです!!!!

train = train.fillna(train.median()) #欠損値を中間値で埋める
test = test.fillna(test.median()) #欠損値を中間値で埋める


これでデータの下準備が終わりましたね。

価格予測

それじゃこのデータを学習させて、テストデータのPriceを予測しましょ。


っと、その前に提出に必要なIdのカラムは別の名前で保存しときましょ。

train_ID = train["Id"]  #提出のため保存
test_ID = test["Id"] #提出のため保存


じゃあ、説明変数と目的変数を取り出していきます。

x_train = train.drop(["Id", "SalePrice"], axis=1) #訓練データからIDと価格を落とし、説明変数だけに
x_test = test.drop(["Id"], axis=1) #テストデータからIDを落とし、説明変数だけに
y_train = train["SalePrice"] 訓練データから価格を取り出し、目的変数に

次に目的変数がどのような分布になっているか見ていきましょう。


線形回帰という手法はデータが正規分布に従うことを仮定しています。


そのような仮定がある中で、正規分布ではないデータを用いては、その結果は怪しいものとなるでしょう。


じゃあ、seabornを使って、ヒストグラムを書いてみましょ。

plt.show(sns.distplot(y_train))

f:id:mashkun:20180811013807p:plain


んーーー、お世辞にも正規分布に乗っているとは言えませんね。。


よく見ると、データが右に間延びしている印象があります。


これはlogを取れば正規分布に乗るかも、、、


やってみましょう。


まず、訓練データの目的変数のlogをとって、、

y_train = np.log(y_train) #自然対数をとる。


再び、ヒストグラムにしてみましょ!

plt.show(sns.distplot(y_train))

f:id:mashkun:20180811013831p:plain


おおお、

正規分布っぽい!!


これで計算させましょ!

from sklearn import linear_model #回帰を行うためのライブラリをimport

reg = linear_model.LinearRegression() #線形回帰モデルをregと名付けて、
reg.fit(x_train, y_train) #regに訓練データをいれる。


こうして、学習させて、下記のようにテストデータの目的変数(価格)を出力させましょう!


ここで、注意点としては、訓練データの目的変数はlogをとったものだということです。


そのため、出力されたものはexponentialをとりましょう!

y_predict = np.exp(reg.predict(x_test)) #線形回帰モデルにテストデータを入れて出力されたものを、指数に変換

これにより価格の予測ができました!


じゃあこれをエクセルに保存しましょう。


あと一息です!!

エクセル保存

じゃあpandasを用いて、IDと価格を載せた新たなデータフレームを作りましょう。

House_Prices_sub = pd.DataFrame({"Id": test_ID, "SalePrice": y_predict}) 


これをcsvファイルにして保存しましょう!

House_Prices_sub.to_csv('houseprice_sub.csv', index=False)


できた...!!!





これをkaggleに提出してみましょう!!


結果は?























TOP37%でした!

f:id:mashkun:20180811021210p:plain




まぁ、半分以上だし、初めてにしてはいいんじゃないでしょうか!



練習になりました!



改善点としては、

・欠損を埋める値を説明変数に合わせて変更する。


・外れ値があるか確認し、それを除去する。


・線形回帰ではなく違うモデルを使う。


などなどかなぁ。


いろいろ試してみたい!!!



ではまた!!