ysk_son’s diary

勉強の記録

Pythonを使ったデータ分析の学習 - その9(単回帰モデルをDeep Analyticsへ投稿する、重回帰分析とは、重回帰モデルの作成)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(予測モデル(単回帰モデル)の作成)はこちらから。

セクション5: CASE1:お弁当大作戦~お弁当の売り上げを予測してみよう~ (続き)

DeepAnalyticsに結果を投稿しよう①

前回エントリで作成したsubmit1とsubmit2をDeep Analyticsへ投稿する。

まずDeep Analyticsへアクセスする。
f:id:ysk_son:20180220133742p:plain


コンテスト一覧から『お弁当大作戦After【練習問題】』を探し、アクセスする。
f:id:ysk_son:20180220134102p:plain


ページ内の『解析結果を送信』をクリックする。
f:id:ysk_son:20180220134259p:plain


投稿画面に切り替わるので、submit1を投稿ファイルとして参照させ、使用した解析手法はLinear Regression を、使用したソフトウェアはPythonを選択する。
コメントに「説明変数をTemperatureにしました」と記載して、『データを投稿』ボタンを押す。
f:id:ysk_son:20180220134539p:plain

2分ほど待つとスコアがメールで届く。
F5で画面更新すると以下のように投稿スコアが反映される。
f:id:ysk_son:20180220134852p:plain

submit1のスコアは41.98742とある。


同様の手順でsubmit2についても投稿をする。
コメントは「説明変数をKcalにしました」と記載する。
投稿後の結果は以下となる。
f:id:ysk_son:20180220135214p:plain

submit2のスコアは39.59674とある。


今回のスコアは低い方が良い評価であるので、submit2の方がより良いということがわかる。
以下の画像にあるランキングページから今回の自分の投稿が何位だったのかわかる。
f:id:ysk_son:20180220135505p:plain
とても低い。。


今回はモデルの評価についての詳細なロジックについては触れないが、今回の評価指標はRMSEと呼ばれ、誤差を数値化する指標であるため、値(誤差)が小さいほうが望ましいモデルであるということだけは覚えておく必要がある。
その他の評価関数の種類や数式についてはどこか別の詳しい方の説明を参照してほしい。

重回帰モデルとダミー変数化とは

ここまでは単回帰モデルについて学習してきたが、ここからは重回帰モデルについて学習する。

重回帰モデルの説明は以下。
・2つ以上の説明変数を使った回帰モデル
・予測するための手がかりを複数使うイメージ
・数式は y = ax1*bx2*cx3... と表される

今回で言うと
a = 気温
b = 来店数
c = 天気
といった具合に、複数の説明変数を使って目的変数を求めることができるのである。


しかし上記の例でいくと c = 天気 は数値化しなければいけない。
そこでダミー変数を使う。

以降の作業で実際にダミー変数を活用しながら、実際に重回帰モデルを作っていく。

重回帰モデルを作ってみよう

早速描いていく。

# いつもの
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR

# 次は必要なファイルの読み込み
# sampleを読み込む時はheader=Noneオプションを忘れないように注意
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sample = pd.read_csv("sample.csv",header=None)

# trainのweekの各値がそれぞれいくつあるか数えてみる(今回の注目ポイント)
train["week"].value_counts()

ここで以下のようなリアクションがあればOK。
f:id:ysk_son:20180220141113p:plain


このままではweekの値をモデリングに使えないので、trainのweekを試しにダミー変数化する。
・ダミー関数への変換にはpd.get_dummies関数を使う
・カッコの中にダミー変数化したい変数を書く

pd.get_dummies(train["week"])

このように表示される。
f:id:ysk_son:20180220141616p:plain


やり方がわかったので、今回使用するデータweekとtemperatureを抜きだし、ダミー変数化したものを変数trainXに代入する。
※ ダミー変数化できるかできないかはPythonの方で識別してくれるので、weekもtemperatureの両方を指定してOK。

trainX = pd.get_dummies(train[["week","temperature"]])

trainX.head() で中身を確認すると、以下のように表示される。
f:id:ysk_son:20180220141909p:plain


作業を続ける。

# trainからyを取り出し、変数yに代入する
y = train["y"]

# 回帰モデルの箱を用意する(modelという名前で作成する)
model = LR()

# 重回帰モデルを作る
model.fit(trainX,y)

ここでこのように表示されればOK。
f:id:ysk_son:20180220142218p:plain


傾きを確かめる。

model.coef_

このように表示される。
f:id:ysk_son:20180220142400p:plain

この内容から、月曜は売り上げが上がる傾向にあり、木曜には売り上げが落ちやすいということが推測できる。


続いて傾きを確かめる。

model.intercept_

このように表示される。
f:id:ysk_son:20180220142455p:plain

この内容からは切片が136であるということがわかる。


ここから実習。

# 1.testからweekとtemperatureを抜きだし、ダミー変数化したものを変数testXに代入する
testX = pd.get_dummies(test[["week","temperature"]])

# 2.testXの中身を確認する
testX.head()

# 3.modelとtestXを使って予測をして、予測結果を変数名predに代入しよう
pred = model.predict(testX)

# 4.sample[1]にpredを代入して、"submit3.csv"というファイル名でファイル出力しよう
sample[1] = pred
sample.to_csv("submit3.csv",index=None,header=None)

これで重回帰モデルの作成は完了した。
最後にモデルをDeep Analyticsへ投稿してスコアを確認する。

DeepAnalyticsに結果を投稿しよう②

上の実習にて作成したsubmit3.csvをDeep Analyticsへ投稿する。
投稿の方法については本エントリの序盤に触れたのでここでの説明は割愛する。
前回同様に解析手法はLinear Regression を、使用したソフトウェアはPythonを選択する。
コメントは「説明変数はweekとtemperatureにしました」としておく。

結果は以下のスコア。
f:id:ysk_son:20180220143403p:plain


submit3のスコアは40.73978とある。

単回帰モデルであるsubmit2と比べて性能が悪くなってしまった。
重回帰モデルを使えば予測をするための手がかりが多くあるので、精度が高くなるような気がするが、なかなか現状では上手くいっていない。


なぜうまくいかないのか。
次回のエントリにて学習する。

本エントリはここまで。

Pythonを使ったデータ分析の学習 - その8(予測モデルの作成)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(『予測する』とは?)はこちらから。

セクション5: CASE1:お弁当大作戦~お弁当の売り上げを予測してみよう~

ここではお弁当の売上データを使い、モデルを作成する。
また、作成したモデルを使って予測したデータをDeep Analyticsへ投稿する。

モデリングの手順

1・説明変数を決め、データを準備
 どのデータを使ってモデルを作るか?を決める
 今回で言うとお弁当データを学習データ(Train)と評価データ(Test)の2つにわけてモデルを作成する

2・モデルの準備
 どの手法を使ってモデルを作るか?を決める
 今回は単回帰モデルを作る

3・モデルの作成
 学習データから取り出した説明変数と目的変数のデータを使い、モデルを作成する

4・モデルを使い予測
 評価データから取り出した説明変数のデータを使い、3で作ったモデルを当てはめることで予測値を出す

5・モデルの評価
 評価データに対するモデルの予測結果と実際の値を比較することで、作成したモデルの評価をする

単回帰モデルとは

単回帰モデルとは、1つの目的変数を1つの説明変数のみでモデル化する方法であり、
y = ax + b の式で表せられる。

ここでいう a は傾きであり、直線の場合は右肩上がりなら正の傾き、右肩下がりなら負の傾きである。また、 b は切片であり、直線とX=0がぶつかるところである。

f:id:ysk_son:20180219170801p:plain

例えばこのグラフの場合、傾きは-0.5であり、切片は105となる。

モデルを作成する

早速描いていく。

# まずは必要なもののインポート
# sklearn.linear : サーキットラン,回帰モデルを作るのに便利なライブラリ
# LinearRegression : 線形回帰という意味

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR

# 次は必要なファイルの読み込み
# sampleを読み込む時はheader=Noneオプションを忘れないように注意

train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sample = pd.read_csv("sample.csv",header=None)

train.head()

ここまで入力して以下のように先頭行が表示されればOK。
f:id:ysk_son:20180219171639p:plain

引き続きモデルを作成していく。

# trainから説明変数と目的変数となるデータを取り出す
# 説明変数はtrainからtemperatureを選択し、変数名をtrainXとして代入する
# 目的変数はtrainからyを選択し、変数名をyとして代入する

trainX = train["temperature"]
y = train["y"]

# testから説明変数となるデータを取り出す
# 説明変数はtrainと同じtemperatureを選択し、変数名をtestXとして代入する

testX = test["temperature"]

# 単回帰の場合のみ、説明変数に対しておまじないが必要となる
# 単回帰の場合はややこしいが、train,testの説明変数ともに、データの形を整える必要がある
# 具体的にはvalues.reshape(-1,1)というおまじないをする
# 整えた後、再び変数Xに代入する

trainX = trainX.values.reshape(-1, 1)
testX = testX.values.reshape(-1, 1)

# 回帰のモデルの箱を用意する
# モデルを作る為にはまず、モデルを表す箱が必ず必要となる
# 変数名をmodel1として、LR()を代入する

model1 = LR()

# 単回帰モデルを作る
# fit関数を使う
# カッコの中に、説明変数、目的変数の順番に書く

model1.fit(trainX,y)

ここでこのようなリアクションがあればOK。
単回帰モデルが作れた。
f:id:ysk_son:20180219172357p:plain


次に作ったモデルの傾きや切片を確かめる。

# 傾きはcoef_を使う
model1.coef_

# 切片はintercept_を使う
model1.intercept_

このように表示された。
f:id:ysk_son:20180219172552p:plain

なぜ傾きが array([-2.5023821]) と配列で表示されるのかはわからないが、調べてもわからなかったので「こういうもんだ」と自分に言い聞かせて先に進む。
(エラーではないと思われる)

次はテストデータに対する予測を行う。
予測にはpredict関数を使う。
予測結果は変数predに代入する。

pred = model1.predict(testX)

# predで中身を見てみる
pred

このように表示され、テストデータに対する予測値が求められたことが確認できる。
f:id:ysk_son:20180219173424p:plain

ここも先程同様、なぜ数値が array([……………]) と配列で表示されるのかはわからないが、調べてもわからなかったので「こういうもんだ」と自分に言い聞かせて先に進む。
(エラーではないと思われる)


ここからDeep Analyticsへ投稿する準備を行う。
まずはsampleの中身を確認する

sample.head()

このように表示される。
日付の右の列(列1)に予測値が並んでいる。
f:id:ysk_son:20180219174121p:plain

今回求めた予測結果は列1に該当するので、ここに先ほど求めたpredを代入する。

# 代入
sample[1] = pred

sampleに正しく代入がされたか確認をするために、もう一度sampleの中身を確認する。

sample.head()

このように表示される。
f:id:ysk_son:20180219174633p:plain

当初と違う値が列1に代入されていることがわかる。


最後に投稿するために、代入をしたsampleをファイルで書き出す。
csv出力にはto_csv関数を使う。
今回必要なオプションは、"submit1.csv", index=None, header=None の3つである。

sample.to_csv("submit1.csv",index=None,header=None)

正しく処理されている場合はマイドキュメント内のcase1にsubmit1.csv というタイトルのファイルが書き出される。
↓無事できた。
f:id:ysk_son:20180219175204p:plain


本日はここまで。
次回は作成したファイルをDeep Analyticsへ投稿していく。

Pythonを使ったデータ分析の学習 - その7(『予測する』とは?)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(相関関係を見る)はこちらから。

# 本エントリ(セッション4)はプログラミングは無く、簡単な座学のみ

セクション4: 予測するってどういうこと?

目的変数と説明変数

「予測」とは、『データに基づいて』予測を行うことである。
根拠がないとただの占いである。

とのことで、数値の予測にしろラベルの予測にしろ、いずれにしてもデータに基づいた予測が必要である。

予測に必要となるデータは
・過去の売上実績数
・予測のヒントになりそうなもの(天気、来客数、気温)
と大きく2つに分別できる。

これを統計的な言葉で説明すると、
・過去の売上実績数=目的変数
・予測のヒントになりそうなもの(天気、来客数、気温)説明変数

となるので、覚えておく必要がある。

代表的な予測問題

代表的な2種類の予測問題がある。

1・回帰問題

 目的変数が数値
 例:明日の豆腐の売り上げは?

2・分類問題

 目的変数がカテゴリ
 例:この画像の料理名は何?

その他としてテキストマイニングなどのジャンルもある。

予測モデルを作るキホン

これから予測モデルを作っていく上での注意点を紹介する。
まずは以下の例を読んでみてほしい。

Aさんは上司から予測モデルを作ってくれと頼まれました。
Aさんは『全てのデータを使って』『すぐにモデリングを始めよう』と決め、作業を開始しました。
結果、予測精度99%の高精度のモデルができました。

Aさんは早速作成したモデルを使って運用を始めたが、全く予測精度が出ず、上司に叱られてしまいました。


さぁ、なにがマズかったのだろうか?


答えは『全てのデータを使った点』と『すぐにモデリングを始めた点』である。
# 『』が付いている時点でお察しだが

しかしバカにはできない。
これは実際に起こり得る事象なのである。

具体的にどうすればよかったのか、以下にて説明する。

・いきなりモデリングを始めた = 基礎分析を怠ってはいけない
基礎分析は基本中の基本!

・全てのデータを使った = モデルが過学習(※)と呼ばれる状態となってしまった
過学習=Overfittingと言われ、モデル製作に使ったデータだけに特化したモデルを使ってしまうこと

過学習がわかりずらい。
例えばこんな状態を過学習と言う。

【部署A】
理系の男子は全員メガネをしている

 →「よし、男子がメガネしていれば100%理系や!これでモデル作ったろ!」

【部署B】
理系でメガネしていない男性が存在

 →「予測できない!」

これが過学習
部署Aに特化しすぎたモデルであるため、部署Bに対応できていない。

要するに、
モデルは汎用性が求められる。

言い換えると、
モデルは”未知のデータ”も予測できることが望ましい


ではどのように未知のデータに対応できるモデルを作るのか??

答えはシンプルである。
元になるデータセットをデータAとデータBとの2つにわけて、
一方(データA)をモデルを作成する際の学習用データとし、
もう一方(データB)をモデルの評価用のデータとするのである。

つまり、
データAを元にモデルを作成し、
データBを使って予測をさせる。
そうすることで作成したモデルが未知のデータに対応できているか検証するのである。


こうすることで汎用的な予測モデルを作成できるのである。

まとめ

・予測とは
 データに基づき、値を想定すること

・代表的な予測問題
 回帰と分類

・汎用的な予測モデルを作るべし
 データを分割する / 過学習に注意



セッション4はこれで終わり。
比較的軽めの内容だったがキリが良いので本エントリはここまで。
次回はセッション5から着手する。

Pythonを使ったデータ分析の学習 - その6(相関関係を見る)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(箱ひげ図、欠損値の処理)はこちらから。

セクション3: まずデータに向き合おう(続き)

相関関係を見てみよう - Section3_5.ipynb -

早速資料に沿って学習していく。

# おまじない

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

# データ読み込み

train = pd.read_csv("train.csv")

# trainの先頭行の確認(データ読み込みが正しいかのチェック)

train.head()

ここまではいつもどおりなので画面ショットは割愛。
ここから相関関係について調べていく。

まずはtrainのyとtemperatureの相関関係を調べる。

相関関係とは、Aという事象とBという事象の間、双方向の動きに関係があることを指す。
例えば、気温が上がると弁当の売り上げ数もあがる関係があった場合、正の相関があると言い、
逆に、気温が上がると弁当の売り上げが下がる関係があった場合、負の相関があると言う。
※ なお、相関関係と因果関係は異なる為、注意が必要である(ここでは詳しくは触れない)

・この関係の度合は相関係数と呼ばれる数値で表される
・具体的にはcorr関数を使う

train[["y","temperature"]].corr()


このように表示される。
いつも思うがPythonのライブラリは本当に便利。
f:id:ysk_son:20180216162938p:plain

この結果から得られる情報は以下。
・対角線は自分自身なので必ず1になる(意味不明)
・yとtemperatureの相関係数は-0.65
・負の関係なのでどちらかが増えれば、もう一方は減る関係
・係数が1に近ければ関係が強く、0に近ければ関係が弱いと言える


今度はyとkcalの相関関係を調べる。
本来、欠損値があると相関係数は測定でないが、プログラムでは自動的に欠損値の行は削除されて計算される(便利)。

train[["y","kcal"]].corr()

このように表示される。
f:id:ysk_son:20180216163611p:plain


この結果から得られる情報は以下。
・プラスの関係なのでyとkcalは正の相関があると言える
 (どちらかが増えればもう一方も増える関係)
相関係数が0.14と小さな数字なので、相関は弱いと言える
相関係数からどういった散布図になるかの検討がつく


相関係数は数量の値で関係を表せるが、散布図を書くことで、視覚的にもっとわかりやすく書くことができる。

そこでyとtemperatureとの散布図を描いてみる。
散布図はplot.scatter関数を使う。
オプションとして、x="temperature", y="y", figsize=(5,5)と書く。

train.plot.scatter(x="temperature", y="y", figsize=(5,5))

このように表示される。
f:id:ysk_son:20180216164150p:plain


確かにyの値が減るとtemperatureの値も減っているように見える。
確かに負の相関である。

続いてyとkcalとの散布図も描いてみる。
書き方は全く同じ。
負の相関関係であるので異なるかたちになると想像できる。

train.plot.scatter(x="kcal", y="y", figsize=(5,5))

このように表示された。
f:id:ysk_son:20180216164413p:plain

確かに先程の散布図よりも特徴が見出しづらい。
まんべんなくバラバラに見える。


散布図を書くことによって視覚的に関係を読み取ることができるので非常に便利。


しかし、一方で注意点として、相関係数を鵜呑みにせず、散布図を書くことが非常に大切である。
というのも、散布図に1つでも外れ値があると本来の相関係数よりも過剰に大きくなったり、小さくなったりすることがあるのである。
データ分析ではこういった外れ値に対しての処理を考えることも非常に大切だと言われている。


ここまででセッション3は全て終了!
次回はセッション4から!

Pythonを使ったデータ分析の学習 - その5(箱ひげ図、欠損値の処理)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(ヒストグラムの学習)はこちらから。

セクション3: まずデータに向き合おう(続き)

グラフを描いてみよう(箱ひげ図) - Section3_3.ipynb (教材PART3) -

早速資料に沿って学習していく。

箱ひげ図とは…
・データ分布を確認するための図
・英語ではBoxplot
・最大値、最小値、中央値、上側ヒンジ、下側ヒンジがわかる

上側ヒンジ:大きい順に並べた時の上25%にある数字
下側ヒンジ:小さい順に並べた時の下25%にある数字

早速描いていく。

# yとweekの関係を調べる為に、箱ひげ図を描く
train[["y","week"]].boxplot(by="week")

このように表示される。
f:id:ysk_son:20180216150926p:plain

Matplotlibの設定が不正だから曜日の表示がお豆腐(白いしかく)になってるが、今はスルー・

・曜日の順番はぐちゃぐちゃ
・何曜日が売れたか視覚的にわかりやすい
・月曜日には最も売れた日が含まれている


ここから実習。

# 1.trainのtemperatureの折れ線グラフを描いてみよう。タイトルとx軸、y軸にもそれぞれ名前をつけよう
#    x軸とy軸に名前を付ける為に、グラフは一旦変数axに代入しよう
#   タイトル名は「気温」、x軸は「time」、y軸は「temperature」としよう

ax = train["temperature"].plot(title="気温")
ax.set_xlabel("time")
ax.set_ylabel("temperature")

# 2.trainのkcalのヒストグラムを描いてみよう。trainのkcalの平均を表す赤線も入れよう

plt.axvline(x=train["kcal"].mean(),color="red")
train["kcal"].plot.hist()

# 3.trainのyとweatherとの関係を調べる為に、箱ひげ図を描いてみよう
#    x軸はweatherにしましょう

train[["y","weather"]].boxplot(by="weather")


それぞれこのように表示される。

1・
f:id:ysk_son:20180216151511p:plain


2・
f:id:ysk_son:20180216151532p:plain


3・
f:id:ysk_son:20180216151608p:plain

折れ線グラフ、ヒストグラム、箱ひげ図。グラフの可視化についてはここまで。

欠損値を調べてみよう

続いて欠損値を調べる。
使用するデータは例によって train.csv
気がついたのだけど、データがしっかりとCSVで保管されているのであれば、データ分析は容易なのだろう。

# おまじない

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

# データ読み込み

train = pd.read_csv("train.csv")

# trainの先頭行の確認(データ読み込みが正しいかのチェック)

train.head()

ここまではいつもどおりなので画面ショットは割愛。
ここから欠損値を取り扱う。

まず、各値が欠損値か否かを出力する。

・欠損とは、何らかの理由で、データの値が入っていない状態のこと
・データ分析において欠損がある場合の対応はとても重要である
・欠損の有無を確認する為にはisnull関数を使う
・欠損値の時、Trueと表示される

train.isnull()

f:id:ysk_son:20180216153629p:plain

このように表示される。
Trueの箇所が欠損値であることがわかる。
(欠損値の定義をしなくていいのは捗る)


しかしこれでは見づらいので、各列(カラム)にTrueが1つ以上あるかないかを確かめてみる。

・isnull関数のあとにany関数を付け加える。
・付け加える時はドット(.)で繋ぐ。
・1つ以上欠損値を含んでいる場合、Trueと表示される。

train.isnull().any()

このように表示される。
f:id:ysk_son:20180216153921p:plain


次に具体的に各列(カラム)に欠損値が幾つあるか数える。

・isnull関数のあとにsum関数を付け加える

train.isnull().sum()

このように表示される。
f:id:ysk_son:20180216154045p:plain


kcal,remarks,eventあたりは欠損値だらけであるとがわかったので、続けて欠損値の処理をする。

・欠損値の処理は別のなんらかの値を代入(補間)するか、欠損値を含む行を削除するかで対応する
・ここではまず、欠損値を0で補間する
・補間にはfillna関数を使う

train.fillna(0)

f:id:ysk_son:20180216154329p:plain
確かにさっきまで NaN だった欄に 0 が補間された。

続いて欠損値を削除してみる。

・dropna関数を使う
・ある列に欠損値があった場合のみ、その行を削除したい場合はオプションとしてsubset=[ ]を使う

train.dropna()

このように表示される。
f:id:ysk_son:20180216154545p:plain

確かにkcalに欠損値がある行が削除されている!


最後にprecipitationには本当に欠損値がないか確認する

・行の中の値がそれぞれ幾つあるかを確認したい場合は、value_counts関数を使う

train["precipitation"].value_counts()

このように表示される。
f:id:ysk_son:20180216154750p:plain

欠損値が169個あることがわかった。


欠損値についてはここまで、次回は相関関係を見ていく。

# ここまでで セッション3.39 欠損値を調べてみよう まで終わり。

Pythonを使ったデータ分析の学習 - その4(視覚化の基礎、ヒストグラム)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(Pythonの基礎,データを詳しく見てみる)はこちらから。

セクション3: まずデータに向き合おう(続き)

簡単なグラフを描いてみよう - Section3_3.ipynb (教材PART3) -

早速資料に沿って学習していく。
データ読み込みまでは例によっておなじないとして。

# おなじない
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

# データ読み込み
train = pd.read_csv("train.csv")

# データ読み込みが正しくできているか確認
train.head()

ここで以下のように表示されればOK。
f:id:ysk_son:20180205154055p:plain

さて、ここから早速グラフを描いていく。
折れ線グラフを描くにはplot関数を使う。
とても簡単でいい。

train["y"].plot()

そうするとこのように表示される。
f:id:ysk_son:20180205154419p:plain

意図した表示と異なる。
とりあえずグラフは表示されているので今は無視してすすめる。

次にグラフのサイズを大きくする。
figsize オプションでサイズを指定してあげる。

train["y"].plot(figsize=(12,4))

そうするとこのように表示される。
f:id:ysk_son:20180205154725p:plain

ピンク色の警告文は依然表示されているが、表示は正しくされているので無視して進める。
確かにグラフのサイズはさきほどよりも大きくなっている。

このグラフはお弁当の売り上げを表しており、X軸は時間、Y軸は売り上げを表しているので、
・時間が経つにつれてお弁当の売れ行きが下がっている
・時系列に関係なく、時々売り上げに関係する何者かによって、時々スパイク(売り上げが急増)している
ということがわかる。
ふむ。分析している感する。

続いてグラフにタイトルをつけてみる。
以下のように記載。

train["y"].plot(figsize=(12,4),title="グラフ")

このように表示される。
f:id:ysk_son:20180205155235p:plain

タイトルが「グラフ」と表示されない!
日本語化がうまくいかない場合、以前行ったmatplotlibの設定が正しく行われていない可能性があるらしい。
matplotlibにて日本語化の設定をやり直す必要があるということだが、今はこのまま続ける。


次にグラフのx軸とy軸に名前を付けてみる。
これが意外と面倒くさい。

このような手順で行う。
1・plot関数の結果を別の変数(ax)に代入
2・set_xlabel関数を使ってx軸のラベル付け
3・set_ylabel関数を使ってy軸のラベル付け

早速描いてみる。

ax = train["y"].plot(figsize=(12,4),title="グラフ")
ax.set_xlabel("time")
ax.set_ylabel("y")

このように表示される。
ピンク色の警告文は日本語化の設定不良によるものなので今は無視して進める。
f:id:ysk_son:20180205160123p:plain

よし。
ちゃんとラベルに名前がついている。
ということで次へ進む。

グラフを描いてみよう(ヒストグラム) - Section3_3.ipynb (教材PART3)続き -

ヒストグラムについて

折れ線グラフに続いてヒストグラムについて学習する。

ヒストグラムとは】
・縦軸と横軸で帯状
・横軸は階級と呼ばれ、数値の幅がどのくらいなのかを表す
・縦軸は度数と呼ばれ、数値の頻度がどのくらいなのかを表す

以下が代表的な4つのヒストグラムの形状。
f:id:ysk_son:20180205163239p:plain

1:山が一つのグラフ(左上)
・非常にきれいなデータの形状といえる
正規分布とかガウス分布などといわれる
・真ん中の平均が一番高いグラフとなる

1:山が複数あるグラフ(右上)
・できる集団とできない集団とに別れた場合に見られるグラフ
・難しいテストの時などに見受けられる
・こういったデータを処理する場合は「このグラフ中には2種類の集団がいるな」と考えられる

1:山が偏っているグラフ(左下)
ロングテールでだんだん数が減っていく
・Webのログデータなどに見られる
・べき乗分布と呼ばれる
・このデータの平均値は40~60あたりを指すことが多いが、ボリュームゾーンは20あたりを指すことが多い
・データの分布と平均値が一致しない代表的なヒストグラム
・平均値だけを追っているとデータの実際のかたちとアンマッチを起こしてしまう
ヒストグラムを書くことが大切を思わせられるかたち

1:外れ値があるグラフ(右下)
・外れ値を放置すると想定と異なる結果が返ってくることがある
・「外れ値がある」と発見することが大切
・外れ値を正しく処理することが大切
・データの処理の中でも外れ値の取り扱いは大切であり、難しい


以上がそれぞれのヒストグラムの特徴である。
総じて言えることは「グラフにして可視化することで、データの形状を把握することが大切」ということである。

ヒストグラムを描いてみる

ここからヒストグラムの作成に入る。
ヒストグラムの作成はplot.hist関数を使う。

train["y"].plot.hist()

このように表示される。
f:id:ysk_son:20180205170216p:plain


簡単に書けた。
とても便利でいい。

続いて見やすくするためにグリット線を表示させる。
グリット線を表示させるためにはカッコの中にオプションとして、grid=Trueと書く。

train["y"].plot.hist(grid=True)

このように表示される。
f:id:ysk_son:20180205170524p:plain

こうすることで40-60がボリュームゾーンだとわかる。
次に、「山が偏っている場合は平均値がグラフの山の盛り上がっている箇所と異なる場合がある」ので、平均線を赤く指定して入れて見やすくする。

平均値を入れる関数はplt.axvline(x=NUMBER, color="red") を使う。
まずはx=2のところに赤線を入れてみる。

plt.axvline(x=2, color="red")

こうなる。
f:id:ysk_son:20180205170942p:plain

使い方がわかったところで、先程のグラフと合体させる。

plt.axvline(x=train["y"].mean(), color="red")
train["y"].plot.hist()

こうなる。
f:id:ysk_son:20180205171353p:plain

「グラフ上の山の盛り上がったところが平均ではない」ことが確認できた。
最後にこのグラフを保存する。
その際はサイズを大きくして、タイトルをヒストグラムとして、pngファイルとして保存する。

その際の注意点は
1・plt.savefig("FILE_NAME.拡張子")を一番最後に書く
2・ファイル名は「sample_fig.png」とする
とある。
早速描いてみる。

plt.axvline(x=train["y"].mean(), color="red")
train["y"].plot.hist(figsize=(12,4),title="ヒストグラム")
plt.savefig("sample_fig.png")

こうなる。
f:id:ysk_son:20180205171737p:plain

# タイトルがお豆腐(白い□)になっているのはmatplotlibの設定が正しくないため
# 正しく処理されている場合はマイドキュメント直下に指定したファイルが作成されている

f:id:ysk_son:20180205172027p:plain
ちゃんと作成できてる!


ヒストグラムのセッションはここで終わり。
今回はここまで。
次回は次のグラフ(箱ひげ図)について学習する。

だんだん分析っぽくなってきていて楽しい。

Pythonを使ったデータ分析の学習 - その3(Pythonの基礎、データを詳しく見てみる)

巷で評判の良いPythonオンライン教材、『【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門 | Udemy』を購入し、学習してみた。

前回エントリ(jupyter使い始め,データの読み込み,データの表示)はこちらから。

セクション3: まずデータに向き合おう(続き)

Pythonの基礎

旋回は突然のプログラミングだったが、ここで改めてPythonの説明をしてもらえる。

・変数
・関数
・よくあるみす
の3点をそれぞれについて説明。

変数

変数は箱。
数字の5も”あいうえお”という文字も、データフレームも入れられる。
箱の名前は自由につけられる。

関数

エクセルのSUM関数と同じ。
ある規則のある処理をおこないた場合に使う。
関数を使いたい場合は

変数名.関数名(オプション)

train.plot(option)

と記載する必要があり、オプションはカンマで区切ることで複数指定することができる。
※ このオプションのことを引数と言う

変数名.関数名(オプション,オプション)

train.plot(option,option)
よくあるミス

シンプルに説明。
Pythonに限らずだろうが、プログラミング初心者にありがちなミスについて説明があった。

1・スペルミス
 一番よくある。
 なにかエラーが出たらまずはスペルミスを疑うべき。

2・大文字と小文字のミス
 Falseとfalseと間違えるとエラーがでる。
 Pythonでは大文字と小文字を別物として区別される。

3・カッコの有無、種類
 [],{},()の使い分け、head()をheadとしてしまう、など

4・ドットとカンマの間違い
 これは慣れれば少なくなるらしい。

データをもう少し詳しく見てみよう

Section3_2.ipynb (教材PART2)

ここから実習。
jupyter/Documents/case1/Section3_2.ipynb を解いていく。

# おまじない
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline

# データの読み込み
train = pd.read_csv("train.csv")

# データ先頭行の確認
train.head()

このように表示される。
f:id:ysk_son:20180201140354p:plain

次は基本統計量を確認する。
どんどん分析計の方向に進んでいる感じがして素晴らしい。
ここでは describe関数を使うとある。
※ スペルミス注意

train.describe()

このように表示される。
f:id:ysk_son:20180201141105p:plain

この中から読み取れる情報は以下の通り。
・数字の情報のみ基本統計量を引っ張り出す
・count行y列はyが入力されている行数から207行あることがわかる
・count行kcal列は166とあり、入力されていない欄があることがわかる
・meanは平均値
・stdは(standard deviation)標準偏差の略だが今は深く触れない
・minは最小値
・maxは最大値
・50%は中央値(median)


次はデータの型を確認する。
info関数を使う。

train.info()

このように表示される。
f:id:ysk_son:20180201141240p:plain

この中から読み取れる情報は以下の通り。
なかなか難しいが頑張る。
・non-nullは入力されている欄の数であり、この数はdescribeのときと同じである(例えばyは207入力されている)
・intは整数
・floatは小数点付きの値
・objectは文字列

ここまではtrainの全体感を見てきた。
ここからは特定の値(カラム)に注目していく。

train["y"]

このように表示される。
(ただy列が207行抜き出されただけの状態)
f:id:ysk_son:20180201142735p:plain


ここからyの平均値と中央値を見てみる。
平均値はmean関数、中央値はmedian関数を使う。

# yについての平均値を求める
train["y"].mean()

# このように返ってくる
86.6231884057971

# yについての中央値を求める
train["y"].median()

# このように返ってくる
78.0


ちなみに中央値と平均値は全然別物である(初めて知った)。
わかり易い(しかし極端な)例とともに一応記載しておく。

【平均値】
全部足してそのデータ個数で割った数。
10,20,30,40,1,000の5つの数がある場合の平均値は、
(10+20+30+40+1,000)÷5=220
となる。

【中央値】
全部の数を大きい順(または小さい順)に並べた時に真ん中にくる数。
10,20,30,40,1,000の5つの数がある場合の中央値は、
単純に真ん中(三番目)にある30
となる。


話を戻す。
次はyの値が150以上のデータのみを見てみる。

train[train["y"]>=150]

このように表示される。
f:id:ysk_son:20180201144356p:plain

だんだん難しくなってきたが、無事表示された。

次は曜日が月曜日だけのデータのみを見てみる。
注意点として、イコールは"=="と記載する必要がある。
これは"="だと代入を表すためである。

train[train["week"]=="月"]

このように表示される。
f:id:ysk_son:20180201144541p:plain


疲れてきた。
けどあと3つで課題は終わり。頑張る。


続いて曜日が火となっているデータをyで昇順・降順にする。
注意点は以下2点。

・ソートはsort_values関数を使う。sort_values(by="XXX")と書く
・降順にしたい場合はカッコの中にオプションとしてscending=Falseを記載
※昇順にしたい場合はオプションをつけばければ自動で昇順になる

train[train["week"]=="火"].sort_values(by="y")

このように表示される。
f:id:ysk_son:20180201145111p:plain

確かに火曜日のみが抽出されている。
さらにyがsort(昇順)になっている。


今度は同じように火曜日を抽出し、yで降順に表示させてみる。
※ sort_values関数の最後のsを忘れないように注意
※ Falseの最初の文字は大文字のFなので注意

train[train["week"]=="火"].sort_values(by="y",ascending=False)

このように表示される。
f:id:ysk_son:20180201145708p:plain

確かに火曜日のみが抽出されている。
さらにyが降順になっている。成功。


最後に曜日が月曜日の時のyの平均値を表示させる。

train[train["week"]=="月"]["y"].mean()

# このように表示される
94.05128205128206


これでセクション3: まずデータに向き合おう(続き)の中の『データをもう少し詳しく見てみよう』までを終えた。

今回はここまで。