(例:低所得が多く高所得少ない所得分布)ふた山データに複数の性質が違う集団が含まれている可能性がある。外れ値がある(例:例外、不良品データが混ざっている)このように様々なことがヒストグラムから読み取れます。最後の外れ値には注意が必要です。外れ値の入ったデータで機械学習を行うと、予測結果が本来の結果からズレてしまうことがあるため、外れ値を除外するなどの対応が必要になります。ヒストグラムを描くそれでは実際にヒストグラムを描いてみましょう。下のコードを実行して下さい。train[‘y’].plot(figsize=(10,4))hist関数を使うことでヒストグラムを描けます。ここでは変数train内の「y(販売数)」に関するヒストグラムを描いています。実行結果は次のようになります。左右非対称のヒストグラムが表示されました。1日の販売数が大体50個程度の日が最も多い(最頻値)ことがわかります。実際に平均値と中央値に線を引いて確認してみましょう。下のコードを実行して下さい。color=’red’)axvline関数を使うことで縦線を描けます。ここでは「x=train[‘y’].mead()」としてxに「y(販売数)」の平均値を指定しています。「color=’red’」として線の色を赤色に設定しています。color=’greenyellow’)ここでもaxvline関数を使って縦線を描いています。ここでは「x=train[‘y’].median()」としてxに「y(販売数)」の中央値を指定しています。「color=’greenyellow’」として線の色を黄緑色に設定しています。train[‘y’].plot.hist(figsize=(10,4))横10インチ、縦4インチのサイズでヒストグラムを描いてます。ax.set_title(‘yのヒストグラム’)ヒストグラムに「yのヒストグラム」というタイトルを付けています。ax.set_xlabel(‘y’)X軸に「y」というラベルを付けています。ax.set_ylabel(‘分布量’)Y軸に「分布量」というラベルを付けています。実行結果は次のようになります。最頻値、中央値(黄緑線)、平均値(赤線)に差があることがわかります。この例のように平均値だけではデータの全容はわかりません。データを可視化して自分の目で確かめることが大切です。有効な説明変数の選定ここでは「y(販売数)」を予測するためにはどの説明変数(特徴量)を使って学習するのが有効だと考えられるかを探っていきます。データの変化を可視化するまず目的変数(予測対象)となる「y(販売数)」がどのように変化しているか確認してみましょう。折れ線グラフ折れ線グラフはデータの変化を確認するのに便利なグラフです。折れ線グラフを描く「y(販売数)」を折れ線グラフとして描画しましょう。下のコードを実行して下さい。折れ線グラフの描画train['y'].plot()コード解説train[‘y’].plot()plot関数を使うと折れ線グラフを描けます。ここでは変数train内にある「y(販売数)」のデータを折れ線グラフにしています。実行結果は次のようになります。このように簡単に折れ線グラフが描けます。折れ線グラフを見やすく描く折れ線グラフは描けましたが、タイトル付けや、サイズ調整をしてもう少し見やすくしてみましょう。下のコードを実行して下さい。train[‘y’].plot(figsize=(10,4))先程と同じく販売数に関する折れ線グラフを描いています。ここでは「figsize=(10,4)」とオプションを指定することで、グラフのサイズを横10インチ、縦4インチに設定しています。このあとタイトルなどの設定をするため、グラフを変数axの中に格納しています。ax.set_title(‘yの折れ線グラフ’)set_title関数を使うと折れ線グラフにタイトルを設定できます。ここでは「yの折れ線グラフ」というタイトルを付けています。ax.set_xlabel(‘時間’)set_xlabel関数を使うとX軸にラベルを設定できます。ここでは「時間」というラベルを付けています。ax.set_ylabel(‘y’)set_ylabel関数を使うとY軸にラベルを設定できます。ここでは「y」というラベルを付けています。実行結果は次のようになります。先程より少し見やすくなりましたね。グラフ化したことで、お弁当の販売数が時間の経過とともに少なくなってきているのがわかるかと思います。このことから「datetime(日付)」と「y(販売数)」には関連性があると考えられます。販売数が減ってきてもトゲのように突出した箇所があり以前と変わらず売れている日もあるようです。量的データ同士の相関関係を確認する次は「y(販売数)」とそれ以外のデータの相関関係を見てみましょう。相関とは、あるデータ同士、例えば「データA」と「データB」の関連性のことです。データ同士の相関を数値化したもので、-1?1の間の数値で表されます。相関あり(正の相関)表のように「1」または「-1」に近いほど相関が強く、「0」に近いほど相関は少ないことを表します。相関係数を確認するPythonでは数値型データ同士の相関係数を簡単に確認できます。下のコードを実行して下さい。相関係数の表示train.corr()コード解説train.corr()corr関数を使うと数値型データ同士の相関係数を表示できます。ここでは変数train内に含まれる数値型データの全ての組み合わせの相関係数を表示しています。実行結果は次のようになります。「y(販売数)」との相関を知りたいので、「y」列に注目しましょう。「temperature(天気)」が約-0.6、「year(年)」が約-0.5と「y」と相関が高いことを確認できます。(※「1」となっている箇所は「y」と「y」など同じデータの相関係数で、同じデータなので当然相関は最大の1となります)ヒートマップヒートマップを使うと損関係数を視覚的に把握できます。下のコードを実行して下さい。train_new.corr()corr関数を使って変数train内のデータ同士の相関係数を取得し、変数df_corrに入れています。cmap=’Blues’)heatmap関数を使うとヒートマップを描けます。ここでは「(df_corr)」とすることで変数df_corrに入れた相関係数をヒートマップ化しています。実行結果は次のようになります。黒い箇所と白い箇所が相関が高いところです。先ほど見た「temperature」と「year」が黒くなっています。今回のケースでは必須というわけではありませんが、データ数が多くなるとヒートマップが便利です。質的データと量的データの相関関係を確認する次は質的データと量的データの相関を見てみましょう。箱ひげ図を使うと、質的データと量的データの関係を確認できます。(前述:中央値・四分位数とは)上のように、箱の部分には上・下25%を除いた中心から50%のデータが含まれています。箱ひげ図は高さが低いほど、データが密集していることを表しています。この図では、50~60くらいの値を持つデータが最も多いことがわかります。箱ひげ図でもヒストグラムと同じように外れ値を確認できます。外れ値があると上のように小さな点として表示されます。質的データの区分ごとに量的データの分布を表示することで、質的データと量的データの間に相関があるかどうか視覚的にチェックできます。相関がある箱ひげ図このように区分ごとに量的データの分布が異なる場合、この質的データと量的データの間には何らかの関連性があると考えられます。相関がない箱ひげ図このように区分に分けても量的データの分布に差がない場合、この質的データと量的データの間には関連性がないと考えられます。箱ひげ図を描くそれでは箱ひげ図を描いてみましょう。下のコードを実行して下さい。‘week’]].boxplot(by=’week’)boxplot関数を使うことで箱ひげ図を描けます。ここでは「y(販売数)」と「week(曜日)」の関係性を箱ひげ図にしています。「by=’week’」を指定することで、曜日別の販売数の分布を表示します。実行結果は次のようになります。月曜日は販売数が多い、木曜日は少ないなどある程度の関連性があることが見て取れるのではないでしょうか。同じ要領で他の質的データとの相関も見てみましょう。下のコードを実行して下さい。objcol]].boxplot(by=objcol)上と同じくboxplot関数で箱ひげ図を描いています。こちらではobjcolsという名前で質的データの列名が入ったリストを作り、それをfor文でループ処理することでまとめてグラフを出力しています。実行結果は次のようになります。「soldout(完売フラグ)」からは、完売した日(1)は販売数が多いことが読み取れます。完売したかどうかわかるのはその日の営業終了後なので、販売数の予測に完売フラグを利用するのは無理がある気がします。「name(メニュー名)」は種類が多すぎてこの箱ひげ図から情報を読み取るのは難しいです。下の項目名が見にくいですが、「remarks(特記事項)」に「お楽しみメニュー」がある日は販売数が多いようです。「event(イベント)」を見ると、キャリアアップ支援セミナーがある時は販売数が落ちるようです。「payday(給料日)」からは、給料日の時(1.0)にはお弁当の販売数がやや多い傾向にあることが読み取れます。「weather(天気)」からは「快晴」の日は売れ行きが良く、「薄曇」の日は売れ行きが良くないことなどが読み取れます。使用する説明変数(特徴量)の目星がついたら、次は学習モデルと評価関数を決めましょう。学習モデル機械学習といっても学習モデルには様々なものがあります。それぞれ得意・不得意があり万能なモデルは今のところ存在しないため、自分の持つ課題にはどのモデルが適しているか試していくことが大切です。正解の回数が多いほど高く評価。誤差が大きいほどペナルティを与える。誤差を少なくしたい時に使用。解釈しやすいが、データ数のバランスが悪いと評価がズレる。データ数のバランスが悪くても上手く評価。多値分類問題でも使用可能。今回は数値の予測結果を評価し、なるべく誤差を少なくしたいことからRMAEという評価関数を使用します。過学習とは、モデルが学習データに過剰適用してしまうことです。モデルが過学習になると、学習データに対する予測精度は非常に高い反面、実際に予測したい未知のデータに対する予測精度は低くなってしまいます。ここでは過学習を防ぐために擬似的に未知のデータを作成します。学習データでモデルを作成したあと、未知のデータを使って予測を行い評価することで、未知のデータに対する予測精度を測ります。擬似的に未知のデータを作成するそれでは学習データ「train」を分割して評価用データ(未知のデータ)を作成しましょう。今回は学習データ80%、評価データ20%程度になるように分割します。下のコードを実行して下さい。train[:165]train[a:b]でtrainのa行目~b行目までを取得できます。ここではtrain1という新しい変数にtrainの最初から164行目までのデータを入れています。train[165:]ここではtrain2という新しい変数にtrainの165行目から最後までのデータを入れています。train1の末尾5行、train2の先頭5行をそれぞれ確認してみましょう。train1には164行目までの2004年7月25日までのデータが、train2には165行目以降の2004年7月28日以降のデータが入っているのが確認できます。今回作成する線形回帰モデルは「教師あり」学習といわれるもので、学習するためには「説明変数(y以外)」と「目的変数(y:販売数)」の2つが必要です。学習用データtrain1を説明変数と目的変数に分割しましょう。下のコードを実行して下さい。pd.get_dummies(train1[[‘year’,’month’,’temperature’,’week’]])train1の中から「year(年)」「month(月)」「temperature(気温)」「week(曜日)」の列を取り出して、新たな変数train1_Xの中に入れています。get_dummies関数を使って文字型データをダミー変数化しています。train1[‘y’]train1の中から「y(販売数)」の列だけを取り出して、新たな変数train1_Yの中に入れています。ダミー変数化とはダミー変数化とは、文字型データを数値型データに変換することです。ともに数値型データである必要がありますが、今回は文字型データである「week(曜日)」も説明変数として使いたいので、この「week」をダミー変数化する必要があります。「week」には上のように曜日が文字型データで入っています。ダミー変数化すると、上のように月~金それぞれの列が新しく作成され、該当するデータにのみ「1」が設定されます。それでは先程作成したtrain1_X、train1_Yの中身をhead関数で確認してみましょう。train1_Xには「year」「month」「temperature」とダミー変数化された「week」が、train1_Yには「y」が入っているのが確認できます。評価用データtrain2も全く同じように準備しましょう。下のコードを実行して下さい。train2['y']これで線形回帰モデルに使うデータの準備ができました。モデルの作成・学習それではいよいよモデルを作成します。下のコードを実行して下さい。LR()先のセットアップの項目で読み込んだ線形回帰モデル作成モジュール「LinearRegression(LR)」を使ってモデルを作成しています。train1_Y)fit関数を使ってモデルにデータを学習させています。train1_Y)」として説明変数に「train1_X」を、目的変数に「train1_Y」を指定しています。これで学習済みモデルができました。モデルから予測するそれでは作成したモデルを使って予測してみましょう。下のコードを実行して下さい。model.predict(train1_X)predict関数を使うと予測データを取得できます。ここでは「(train1_X)」として既知の学習用データを目的変数として渡し、新しい変数train1_Pの中に予測結果を入れています。model.predict(train2_X)上と同じですが、こちらは「(train2_X)」として未知の評価用データを目的変数として渡し、新しい変数train2_Pの中に予測結果を入れています。予測結果(train1_Pまたはtrain2_P)を見てみましょう。下のコードを実行して下さい。予測結果を表示コード解説print(train2_P)print関数を使うとデータの中身を表示できます。ここでは「(train2_P)」として評価用データからの予測結果を表示しています。実行結果は次のようになります。このようにtrain2_Pにはモデルが予測した日々の「y(販売数)」が入っています。予測結果を評価するそれでは予測したデータの精度を確認してみましょう。下のコードを実行して下さい。train1_P))ここでは既知のデータの実測値(train1_Y)と予測値(train1_P)の誤差の平均値を取得しています。train2_P))ここでは未知のデータの実測値(train2_Y)と予測値(train2_P)の誤差の平均値を取得しています。train2_R))print関数を使うとデータを表示できます。format関数を使うと文字の中に数値を埋め込めます。ここでは「{}」の部分ににtrain1_R、train2_Rを表示させています。実行結果は次のようになります。学習用データ(既知データ)での予測誤差は約19個、評価用データ(未知データ)での予測誤差は約20個となりました。既知データと未知データで予測精度にほぼ差がないため、過学習の心配はなさそうです。モデルの予測精度を高める誤差約20個という予測結果が出ましたが、もう少し予測精度を上げてみましょう。誤差の多いデータを見つけるtrain1・train2に予測結果を付け足して実測値(y)との差を求めましょう。誤差が大きいデータを見つけて何らかの対応が見つかれば、更に精度を上げられます。下のコードを実行して下さい。train2.assign(prev=train2_P)assign関数を使うと新たな列を追加できます。ここでは「(prev=train1_P)」として、「prev」という名前の列を新しく追加し、そこにtrain1_Pの予測データを入れています。train2[‘prev’])「y(販売数)」から「prev(予測販売数)」を引いた値を「diff」という新しい列を作成してそこに入れています。引いた値はasb関数を使ってマイナスを消した絶対値に変換しています。train2])concat関数を使うとデータを結合できます。ここではtrain1とtrain2を結合してtrainWというデータを作成しています。ascending=False)[:10]sort_values関数を使うとデータを並べ替えて表示できます。ascending=False)」として「diff」の値を降順でソートしています。「[:10]」として先頭10行だけを表示しています。誤差の最も大きいもの順に10個を表示しています。実行結果は次のようになります。「diff(誤差)」の大きいデータには「remarks(特記事項)」に「お楽しみメニュー」と書かれているものが多いことがわかります。説明変数(特徴量)を作るそれでは「remarks(特記事項)」と「y(販売数)」の相関関係を再度確認してみましょう。先の項目で描いた「remarks(特記事項)」の箱ひげ図です。これを見ると一番左の「お楽しみメニュー」の50%が販売数100~120であること、左から二番目の「なし」では50%が販売数60~110であることから、「お楽しみメニュー」があるときは販売数が多くなる傾向が強いことが見て取れます。それより右の項目では箱ひげ図がキレイに描かれておらず、これはデータがほとんどないことを意味しています。以上のことから、「お楽しみメニュー」がある日を「1」、それ以外の日を「0」とした新しい説明変数(特徴量)を作ってみましょう。下のコードを実行して下さい。0ここではis_otanoshimi_funcionという関数を定義しています。引数「x」が「お楽しみメニュー」なら「1」を返し、それ以外なら「0」を返すだけの単純な関数です。is_otanoshimi_funcion(x))apply関数を使うと、データ1つ1つに対して関数を実行できます。ここでは上で定義したis_otanoshimi_funcionという関数に「remarks」の値を渡し、返ってきた値を新しく作成した列「fun」に入れています。train[‘fun’].astype(np.str)astype関数を使って「fun」列を文字型に変換しています。中身を確認してみましょう。下のコードを実行して下さい。train[train['remarks']=='お楽しみメニュー'].head()コード解説train[train[‘remarks’]==’お楽しみメニュー’].head()head関数を使って先頭5行を表示しています。ここでは「train[train[‘remarks’]==’お楽しみメニュー’]」として、「remarks」に「お楽しみメニュー」と設定されている行だけを表示しています。実行結果は次のようになります。「remarks」に「お楽しみメニュー」がある行の「fun」に「1」が設定されています。これで新しい説明変数を作成できました。それでは先にモデルを作成した時に使った説明変数「year、month、week、temperature」に「fun」を加え、もう一度モデル作成→予測→評価をしてみましょう。下のコードを実行して下さい。train2_R))実行結果は次のようになります。学習用データでの誤差が約19→16、評価用データでの誤差は約20→14と、ともに予測精度が向上しました。まとめ最後まで読み進めて頂きありがとうございます。お疲れ様でした!機械学習の流れは理解できたでしょうか。機械学習=モデル作成というイメージですが、実際は多くの時間をデータの準備に費やしていることを感じられたと思います。機械学習はデータ選択やモデル選択によって予測結果が大きく変わります。ここで挙げた流れも一例で、学習に使うデータを少し変えたり採用する学習モデルを変えるだけでも予測精度を上げることができます。誤記・間違い、わからない箇所、上手くいかない箇所、または、上手くいった!もっといい方法があるよ!などなどありましたら下のコメント欄からお気軽にコメント頂けると幸いです。IDの作成方法【無料で簡単】このページではGoogleアカウントの作成方法をご説明します。Googleアカウントがあると『Goog...AI・機械学習Googleドライブにファイルをアップロードする方法このページではGoogleドライブに学習データをアップロードする方法をご説明します。アップロードは簡単で2~3分で完了します。Colaboratory)」ですが、欠点があるとすればグラフに日本語が使えないという点です。実は簡単な設定で日本語が使えるようになります。Colabのパワーレベル、コーギーモード、猫モードって何?Googleコラボの「その他設定」に最近追された「パワーレベル」「コーギーモード」「猫モード」が気になったので実際設定してみました。p...AI・機械学習SIGNATEのアカウント作成方法【無料で簡単】このページではAI・機械学習を学ぶ上で必要な学習データを入手するのにに便利な『SIGNATE』のアカウントの作成方法をご説明します。アカウントは無料かつ2~3分で簡単に作成できます。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。日本語が含まれないコメントはブロックされます。ふーじんプログラミング、Webサイト作成、イラスト・デザインなどをしています。「日本を再び元気に、20年後の子供達に明るい未来を」を胸に日々精進しています。ご質問ありがとうございます。9tproを購入したんですけど、ソフトバンクのSIMカードを入れたんですけど同様に外でのネットが使えません。APN設定もしたんですがうまく繋がりません。ご紹介までして頂きありがとうございます!Wordpressテーマ『Cocoon』のスキン『tecurio』を作りました!キャシー2020.01.31はじめまして、キャシーといいます。ブログで紹介させてもらいました。ふーじんプログラミング、Webサイト作成、イラスト・デザインなどをしています。「日本を再び元気に、20年後の子供達に明るい未来を」を胸に日々精進しています。ご質問ありがとうございます。9tproを購入したんですけど、ソフトバンクのSIMカードを入れたんですけど同様に外でのネットが使えません。APN設定もしたんですがうまく繋がりません。ご紹介までして頂きありがとうございます!Wordpressテーマ『Cocoon』のスキン『tecurio』を作りました!キャシー2020.01.31はじめまして、キャシーといいます。ブログで紹介させてもらいました。まとめタイトルとURLをコピーしました。