- はじめに
- レッスンで使ったファイルはこちら
- ファイルの説明
- データ解析を支援するpandas
- 日付の操作(datetime、date、timedelta)
- 変数の設定
- Excelファイルを読み込むread_excel関数
- 前年比を作成(データフレームを結合:merge)
- 前年比を作成(カラム名を変更:rename)
- 前年比を作成(インデックスの変更:set_index)
- 前年比を作成(インデックスの並び替え:sort_index)
- ピボットテーブル
- 前週比の計算(行方向にずらす:shift)
- 日付で条件抽出
- 棒グラフの作成
- 重回帰分析とは
- 上下に結合(concat関数)
- 曜日の追加(weekday_name)
- 空のデータの行を削除(dropnaメソッド)
- グループごとの集計(groupby)
- 棒グラフの作成 その2
- 散布図と回帰直線の作成
- 平日と週末のカラムの作成(関数の作成)
- 平日と週末のカラムの作成(関数の適用:apply)
- ダミー変数の作成:get_dummies
- 説明変数と目的変数の作成
- 重回帰分析の実行(LinearRegression)
- 各種係数の確認
- 決定係数
- 予測データの作成
- Excelを操作できるopenpyxl
- 変数に代入
- Excel書き出すto_excelメソッド
- ファイル読み込み
- 操作するシートを指定
- フォント変更
- Excelファイル保存
- セルを塗りつぶす
- セルの幅を調整する
- セルの操作
- 表示フォーマット指定
- セルに値を入力する
- 画像貼り付け
- Jupyter Labのセルを一括で実行
はじめに
Excelには様々な関数、機能、グラフなどがあります。それらのことはPythonでもできるのでしょうか?結論からいうと、できるといって過言ではないでしょう。この動画では、一部ではありますが、「Excelの関数、機能、グラフ作成」と「Pythonでのやり方」を比較しながら学んでいきます。
前回の「面倒なExcel作業をPythonで自動化しよう」の第一弾、第二段はご覧いただけましたでしょうか?
第一弾では、動画では、Excelを読み込んだり、逆にExcelに書き込んだり、ファイルを複数に分割したり、ひとつにまとめたりということを。
第二弾では、エクセルでの関数、機能、グラフ化をPythonではどうやるのかをザッとみてきました。
この動画では、冒頭のダイジェストでお見せしたような、上司や同僚、取引先へのレポート作成を自動化する方法を説明したいと思います。
では、Pythonでは、なぜレポートを自動化できるのでしょうか?
Pythonでは職場のデータベースと接続して、SQLを使ってビッグデータからデータ取得することも可能です。また、データベースのデータを開発部の人などに特定のディレクトリにエクセルファイルで書き出してもらえればPythonで自動でデータ読み込みが可能です。そして、そのデータを使って、データ集計データ加工をして、棒グラフや線グラフを挿入するということも自動でできます。
また、Pythonは予測分析が得意です。かなり高度な予測分析も可能です。そのため、今月の売上の予測結果を入れることもできます。
上司は、売上の予測をみれば、早め早めに打ち手を打てます。集計に加えて予測まで添えてあげれば、非常に喜ばれるはずです。
この動画では、昨年比や前週比などのデータ集計・加工、そして、グラフ化。それに加えて、重回帰分析を使った売上予測のやり方を説明をしていきたいと思います。
そして、最後にエクセルファイルを操作して、体裁を整え、レポート作成していくところまで見ていきたいと思います。
エクセルからのステップアップでプログラミングを覚えたい方、予測分析までやってみたい方、営業をサポートする事務の方やマーケティング担当者にお勧めの内容です。
この動画では、実践的な内容を含んでいます。もし理解して実践できるようになれば、PythonやPandasを業務レベルにまでできるといっても過言ではないでしょう。仮に、理解できなかったとしても心配ないです。
ソースコードの理解については、Pandas超入門コースやPython超入門コースでやっていますので、そちらをご覧ください。今はこんなことができるのだと理解するだけでも良いと思います。
とはいえ、初心者の方でもわかりやすいような説明を心がけました。最後まで頑張ってご視聴ください。
レッスンで使ったファイルはこちら
キノクエストでアカウントの新規登録に進み、メール認証を完了します。
ログインした状態(プラン選択画面が表示されます)で下記のボタンをクリックしてください。
ファイルの説明
まず、このレッスンの全体像から説明します。
このレッスンで使うExcelの説明をします。
レッスンで使うエクセルのファイル名は、sample_auto03.xlsxです。
このファイルは、日付としてdate、売上としてsales、広告代としてcostが記載されていいます。
このエクセルデータがどのようなものかイメージしやすいようにこのようなケースをイメージしてください。
あなたは200人くらい座れる大きめのレストランを経営する会社の管理本部で働いていたとします。
あなたは毎日上司に対して、昨日までの売上結果をエクセルで報告していました。
上司は忙しいのにその集計結果をみながら経験に頼りつつ、今月の売上がいくらになるか予測しています。
なぜなら、上司は、できるだけコストを抑えながら目標達成をしたいし、達成しないようであれば広告費をかけてでも達成したいと考えています。
また、売上予測に基づいて、食材も発注をしているので、大切な業務でもあります。
しかし、あなたがこの集計をするのにも時間がかかっているし、上司も忙しい中、売上予測をするのに時間がかかっています。
もし、あなたがこの集計と売上予測を自動化できたら、あなたの集計にかかった時間が浮きますし、上司も売上予測の時間がなくなれば、コア業務に注力できます。
また、上司に対する売上予測を、広告費をこのぐらいかけた場合はこのぐらいの売上になり、かけなければこのぐらいの売上になるということを添えてレポートしてあげれば、きっとあなたの評価はあがることでしょう。
この面倒な作業はすべてPythonにやってもらいましょう
それでは、ファイルを読み込んで、売上予測をする前準備をしていきます。
データ解析を支援するpandas
import pandas as pd
まず、Pandasをインポートして、データフレームを使えるようにします。
Pandasは、データ解析を支援する機能を提供するPythonのライブラリです。
Pandasには、PythonでExcelやcsv操作、グラフ化、人工知能開発で大切なデータの集計や加工などの機能が入っています。
Pandasで扱うデータ構造としてよく使うもので、「Series」と「Dataframe」があります。
1次元のデータを扱うときは「Series」、2次元のデータを扱うときは「Dataframe」というデータ構造になっています。
つまり、1列だと「Series」、2列以上だと「Dataframe」です。
詳しくは、pandas超入門コースで説明していますが、データ構造が1列のものと2列以上のものがあるのだと覚えておいてください。
さて、Pandasもインポートしましょう。
「import pandas as pd」を書きます。
「import pandas as pd」の「as」は、ライブラリ名(pandas)を好きな名前にすることができます。
したがって、「pd」という名前で「pandas」を使えることができます。
日付の操作(datetime、date、timedelta)
#読み込みファイル
import_file = ‘excel03.xlsx’
#シート名
excel_sheetname = ‘201909’
次に日付を操作できるようにdatetimeのモジュールをインポートします。
このモジュールがあると、todayと記述すると今日の日付を取得できたり、その日付をもとに月末や月初の日付を取得できたりします。
さて、コードを書いていきます。この動画では、今日が2020年9月14日として進めていきましょう。
datetimeの中のdateというものを使いましょう。
これを使うと、日付を生成することができます。
datetimeドット、dateと記述します。
2020と書いてコンマ、9コンマ、14と記述します。
そうすると、2020年9月14日が生成されているはずです。
生成されています。
念のため、データ型も確認してみましょう。
typeと書いて丸括弧、丸括弧の中に知りたい変数などを記述します。
datetimeのdate型になっています。
あわせて、月初と月末の日付も作成しておきましょう。
datetimeの中にあるdateでは、年月日を順に記述をすれば日付を生成できました。
日付にドットyearと記述するとその日付の年が取得できて、monthと記述すると月が取得できます。
そのため、今日の日付の月初を取得したい場合は、今日の日付にyearとmonthを記述して、日の部分に1を記述すればオッケーですよね。
実行してみます。2020年9月1日となっています。
これをmonth_startという変数に代入しておきましょう。
また月末の作成方法についても説明します。
月末は、30日で終わる日も、31日出終わる日もありますよね。
なので、月初で作成した時のように日の部分に30や31と書くことはできません。
でも、翌月の1日から1を引くと月末になりますよね。
したがって、today.yearと書いて、次はtoday.monthに1を足して翌月にしましょう。そして、1日にします。
そうすると10月1日になります。
そこから1を引けば月末ですね。
日付の差分を算出するには、datetimeの中のtimedeltaを使います。
timedaltaと書いて1日分という意味で、days=1と記述します。
これで引くと1日分が引かれた日を作成できます。
実行してみます。
9月30日の月末が取得できましたね。
これをmonth_endという変数に格納しましょう。
もしこのコードを実際に使うときには、このコメントアウトをしたように記述をすれば本日の日付を取得できます。
変数の設定
次に、エクセルのファイル名やシート名を変数に代入していきましょう。
変数にしておくことで、ファイルが変わった時など、ここだけ編集すれば良いことになり楽です。
まず、ファイル名を記述しましょう。
import_fileという変数にします。
イコールを書いてエクセルのファイル名を記述します。
ファイル名は、シングルクオテーションでくくればよいです。
エクセルファイルはjupyter labのファイルがある同じディレクトリに置いておきましょう。
次に、シート名を代入する変数を記述しましょう。
excel_sheet_name01を2019年09月のワークシートを、excel_sheet_name02に2020年09月のワークシート名を代入します。
イコールを書いて、エクセルのシート名を記述します。
Excelファイルを読み込むread_excel関数
次に、「pandas」を使って、Excelファイルの内容を読み込みます。
Excelファイルの内容を読み込みは、pandasのread_excel関数でできます。
その読み取ったデータを格納する変数名を、「df_201909」としましょう。
「import pandas as pd」で「pandas」の名前を「pd」としたため、「pd」と書きます。
次に、ドットを書いて、「read_excel」を書きます。
これが先ほど説明したread_excelで、これでExcelファイルを読み込むことができます。
次に、丸括弧を書きます。
丸括弧の中には、引数を記述します。
例えば、ファイルの場所とファイル名、他には読み取るシート名を記述します。
まず最初に、ファイルの場所とファイル名を記述しましょう。
先ほど「import_file」という変数にファイル名と場所を記述したので、この変数を記述。
次に、カンマを書いて、シート名を記述します。
sheet_nameという引数にイコールで、excel_sheet_name01を代入しましょう。
また日付部分をインデックスに設定したいので、index_colという引数に、dateを記述します。
これで、Excelファイルの内容を読み込む記述が完了しました。
df_201909
次に、変数(df_201909)を書いて、中身を確認してみます。
では、実行してみましょう。
「201909」シートの内容が読み込まれています。
前年比を作成(データフレームを結合:merge)
この2019年9月のデータを、2020年9月のデータと結合して前年比を算出してみましょう。
では、どのように結合すれば良いでしょうか?
結合をするにはmergeメソッドを使います
mergeメソッドは前回の「「面倒なExcel作業をPythonで自動化しよう」の第二段」で説明をしました。
まだみていない方はそちらも是非ご覧ください。今、右上にカードがでているはずです。
このmergeメソッドを使うには、結合をするための共通キーが必要です。
その共通キーを日付にしましょう。
では、2019年9月に、2020年9月のカラムを追加しましょう。
でも、単純に2019年9月1日のデータに、2020年9月1日の日付をくっつけるのは今回の場合だとよくありません。
というのも、飲食店やECサイトなど、週末に売上が伸びるケースがあるからです。
したがって、同週同曜日の日付をくっつけることにしましょう。
2020年9月1日の前年同週同曜日は、9月1日ではなく、このように2019年9月3日です。
したがって、indexの日付を2日ほど前にずらした364日後のデータを取得しましょう。
日付をずらすには、offsetsを使用します。
このような記述をします。
そして、日付に対してオフセットを足してあげると、そのオフセット分ずらした日付を取得できます。
df_201909のインデックスは日付方です。この日付型に+364のオフセットを足してあげます。
実行してみます。
2019*8*30からスタートしているはずの日付が2日前倒しされて2019-08-28のデータが取得できています。
これは、next_yearというカラムに代入をしましょう。
上位10件をひょうじしてみます 。
2日ずれています。
エクセルで想定したように2019-09-03に対応した日付が2020-09-01になっています。
next_yearをキーに2020年のデータと結合してみましょう。
このnext_yearのカラムをインデックスに指定します。
インデックスの設定方法は、set_indexを使います。
インデックスに設定したいカラム名を丸括弧の中に記述します。
costのカラムは使わないのでdropメソッドで削除しておきましょう。
dropメソッドは、カラムやインデックスを削除することができます。
データフレームのあとに、dropと書いて、削除したいカラム名を記述します。
列を削除したい時はaxis=1を記述します。仮に、インデックスを削除したい場合はaxis=0と記述します。
実行してみます。
salesとcostの列が削除されています。
2019年のデータの前処理は以上です。
次に2020年のデータを読み込みいましょう。
2019年のデータの読み込みの時と同じようにread_excelのメソッドを使います。
読み込んで上位5件を表示させてみます。
それでは、さきほど説明をしたように、mergeを使って2019年のnext_yearのカラムと、2020年のdateのカラムをキーに結合をしてみましょう。
結合をするコードを書く前に結合方法については説明をしたいと思います。
結合方法には4つあります。
innerとleftとrightとouterです。
SQLをやったことがある人であればピンときますよね。
SQLのinner joinとleft join right join outer join の4つと同じです。
例えば2つのデータフレームがあったとします。
日付が共通キーとします。
日付の共通キーは9月1日から9月4日まで一緒です。
これでinnerという方法で結合をすると、共通部分だけ結合されます。結果、このようなテーブルができあがります。
leftの場合だとどうなるでしょう?
left、つまり、左のデータフレームをもとに結合します。
左のデータフレームは全部残ります。右のテーブルは共通している部分だけ残ります。
結果、このようなデータフレームになります。
rightの場合は、右のデータフレームを元に結合をするので、右のデータフレームは全部残り、左のテーブルは共通している部分だけ残ります。
結果、このようなデータフレームになります。
outerの場合は、どちらかのデータフレームに存在していれば結合されます。
結果、このようなデータフレームとなります。
さて今回はこのようなデータフレームになっています。
2019年のデータフレームには2019年と同じ2020年の同週同曜日がくっついています。
2020年の同週同樣日と、右のデータフレームの日付を共通キーに結合をします。
ただし、右のデータフレームの方がデータが多いです。
したがって、右のデータフレームをキーに結合します。つまり、結合方法はrightになります。
それではコードを書いてみていきましょう。
pd.mergeと書いて丸括弧、丸括弧の最初の引数に左のデータフレームを記述します。今回は2019のデータフレームです。
次に、右のデータフレームを記述します。2020年のデータフレームです。
そして、左のデータフレームのキーを指定します。
left_onと書いて、キーにするカラム名を指定します。
次に右のテーブルのキーです。
2020年の日付はインデックスになっています。インデックスをキーにするには、right_indexと書いて、Trueを渡します。
そして、最後に結合方法です。結合方法はrightなのでhowとかいてrightを渡します。
これをdf_this_yearという変数に代入しましょう。さて、実行してみましょう。そして、上位15件を表示させましょう。
前年比を作成(カラム名を変更:rename)
カラム名を変更しましょう。
カラム名を変更するにはrenameメソッドを使います。
データフレームのあとにドット、リネーム。
丸括弧。丸括弧の中にcolumnsを記述しましょう。
ここでindexと記述するインデックスの名前を変更することができます。
columnsのあとにイコールを書いて辞書型を記述します。
コロンの前が、変更前のカラム名。コロンの後が、、変更後のカラム名となります。
sale_xとthis year salesに。sale_yとlast year sales。next_yearをdateにしましょう。
表示もしてみます。
実行します。
カラム名が変更されました。
前年比を作成(インデックスの変更:set_index)
次に、dateをインデックスとしましょう。
df_this_yearと書いて、set_index。丸括弧の中にシングルクオテーションでインデックスにしたいカラム名を記述しましょう。
今回はdateと記述します。
実行してみます。
dateがインデックスになっています。
前年比を作成(インデックスの並び替え:sort_index)
しかし、8月25日のデータがここにあり綺麗にならなんでいないです。
したがって、インデックスで並び替えをしましょう。
インデックスで並び替えるにはsort_indexを使います。
データフレームのあとにsort_indexです。
実行してみます。
8月25日が上に来て綺麗に並んでいます。
ピボットテーブル
それでは次にピボットテーブルについてみていきましょう。
まずは、エクセルでのピボットテーブルの使い方をみていきます。
ピボットテーブルはエクセルにある機能の1つで、クロス集計ができる機能です。
クロス集計とは、例えば、ある企業の購入者を年齢や性別などの切り口を変えて集計する方法です。
早速、エクセルでやってみましょう。
例えば、実績管理表のワークシートに対して、ピボットテーブルを作るのであれば、挿入→ピボットテーブル→テーブルの範囲を選び、OKです。
商品分類ごとの担当者や性別などの切り口を変えて集計できます。
ちなみに、ピボットテーブルは挿入ができなかったり不便なので、その場合はINDEX関数とMATCH関数を使えば扱いが簡単になりますよね。
列を入れて計算式をいれたり、ピンポイントで集計をしたり。indexとmatchの組み合わせは便利です。
こういった関数の使い方については、エクセルの最強関数という動画を作る予定なので、そちらをご覧ください。
さて、それがピボットテーブルです。
では、Pythonでのやり方をみてみましょう。
前週比の計算(行方向にずらす:shift)
では、前年比を計算してみましょう。
今年の売上が記載されたthis year salesのカラム割る、last year salesのカラムでオッケーです。
表示もさせてみましょう。
実行してみます。
割合が算出されています。
次に、前週比を算出してみましょう。
前週比の算出方法はどのようにやるのでしょうか?
図で説明します。
まずこのようにデータがあったとします。
9月1日からずらっとデータがあります。
ここからデータを抜き出します。
それを1週間しらにずらします。
そして、これをよこにくっつけます。
その上で、これと、これを割り算すればいいですよね。
それでは、コードを書いてみていきます。
まず、this year salesのカラムを抜き出します。
データフレームを書いて、カラム名のthis year salesを記述します。
このようになります。
これにシフトメソッドを使うと、日付をずらすことができます。
ドットシフト。丸括弧の中にずらしたい日付を記述します。
今回は1週間ずらしたいので7と記述します。
これをもともとのdf_this_yearのデータフレームに追加すれば良いですね。
新しいカラムはlast week salesとします。これにイコールで代入をすれば、新しいカラムであるlast week salesに値が代入されます。
あわせて表示もしてみましょう。
実行してみます。
1週間ずれたデータがくっついたようです。
これを使って、前週比を計算してみましょう。
今年の売上が記載されたthis year salesのカラム割る、前週比のカラム、last week salesのカラムでオッケーです。
表示もさせてみましょう。
実行してみます。
割合が算出されています。
日付で条件抽出
次に、これを9月1日から今日までのデータに絞ってみます。
この方法についても「面倒なExcel作業をPythonで自動化しよう」の第二弾で解説しましたが、日付の絞り方は、不等号を使ってやればよかたですよね。
dateはインデックスに設定したので、データフレームにドットインデックス。大なりイコールと書いてtodayとしましょう。
そうすると、今日より大きい日付のみがTrueとして返ってくるはずです。
実行してみましょう。
エラーとなってしまいました。
これは、pandasの日付のデータ型とpythonの日付のデータ型とでは比較ができませんといっています。
では、pythonの日付型をpandasの日付型に変換しましょう。
pandasの日付型に変換するには、to_datetime関数を使います。
先ほどと同じように、df_this_yearのインデックスが日付型なので、df_this_yearドットindex。
大なりイコールを書いて、pd.to_datetime。丸括弧の中にtodayを記述します。
これでオッケーです。実行してみましょう。
エラーになりませんでした。
これを月初以上、今日未満としましょう。つまり、9月1日以上、9月14日未満です。
これをアンドで結べば、両方の条件にあったもののみTrueが返ってきます。
実行してみます。
よさそうです。
これをdf_this_yearの角括弧の中に入れると、9月1日以上9月14日未満のデータが返ってくるはずです。
実行してみます。
よさそうです。
df_this_yearのデータフレームに再度代入をしておきましょう。
棒グラフの作成
さて、これをグラフ化、つまり、可視化してみましょう。
可視化にはmatplotlibを使います。
可視化については「Pythonで株価のデータ分析」にて説明をしています。
まだチェックしていない方はお時間のあるときにご覧ください。
さて、今年と去年、今週と先週の比較の棒グラフを作ってみましょう。
まず、matplotlibとpltという名前で使えるようにインポートします。
次に、jupyter labでグラフが表示できるように、パーセントmatplotlib inlineと記述します。
まず、最初にグラフの大きさを指定します。
plt.figureと書いて丸括弧。丸括弧の中にfigsize=と書きます。
今回は10と7にしましょう。
10が横の長さ、7が縦の長さです。
次に棒グラフの位置をきめます。
今年のデータはx軸が1のところ、もう一つは2のところに記述するとしましょう。
これをx1という変数に代入します。
次に棒グラフの高さの部分です。
locを使ってデータを取得しましょう。
locは角括弧の中に、インデックス名、次にカラム名を記述すると、その部分のデータを取得できます。
詳しくはPandas超入門コースのデータフレームをご確認ください。
9/13のデータを去年と比較して、もう一度9/13のデータを前週と比較します。
したがって、9/13のデータを2つ用意します。
全く同じ記述ですね。
次に後ほど出てきますが棒グラフの太さを0.2としましょう。
したがって、9/13の棒グラフの太さは、x軸でいう1.2のところまできます。
したがって、去年のデータは、x軸が1.2のところとします。1.2をx2という変数に代入します。
そのデータについては、9/13のデータの取得方法と同じです。
また、先週のデータについても、x3という変数に2.2と代入します。
データについても同樣の記述をします。
棒グラフは、barによって作成できます。
plt.barと書いて丸括弧。丸括弧の中にx軸、次にy軸を記述します。棒グラフの名前としてlabelを設定します。this yearとしましょう。棒グラフの太さは、0.2とします。グラフは中央寄せとします。
色はRGBを使って設定をします。配色に使えるサイトを概要欄に貼っておきますのでお好きな色を設定してみてください。
次に同樣の記述をします。
x軸の名前として、this year/last yearとします。もう1つはthis week/last weekとします。
plt.xticksでx軸の名前の位置と、先ほど作ったx軸の名前を設定します。
またグラフの凡例をフォント25にして、中央の上に凡例を表示させましょう。
また、最後に、このグラフをpngファイルとして保存しましょう。graph01.pngとします。
書き出すときに解像度を設定できます。dpiの引数に値を渡せばオッケーです。今回は60としましょう。
実行します。
棒グラフができました。画像もpngとして書き出せているようです。
去年より売上は伸びていて、先週よりも微増していることがグラフから読み取れます。
ちなみに、グラフの書き方については、matplotlib入門講座を作る予定です。
pythonでは本当に多様なグラフを書くことができます。
matplotlib入門講座の開始まで、チャンネル登録をしてお待ちいただければと思います。
さて次に線グラフをかいていきます。
先ほどの棒グラフと同じように、figsizeで横を10、縦を7と設定しましょう。
次に、x軸について設定します。
棒グラフと違い、線グラフのx軸は日付としましょう。
データフレームのインデックスが日付でしたね。
そこで、df_this_yearドットindexとしましょう。
線グラフは、今週と先週と前年の3つを並べましょう。
1つ目は今週のデータです。カラム名は、this year salesです。これをy1という変数に代入します。
2つ目のグラフは、先週のデータです。カラム名はlast year salesです。これをy2に代入します。
最後に去年のデータです。last week salesというカラム名です。これをy3に代入します。
線グラフはplotで描くことができます。
plt.plotと書いて丸括弧。丸括弧の最初にx軸の値、次にy軸の値を記述します。
カラーは先ほどの配色パターンで設定をします。
ラベル名は、this yearとしましょう。線の太さはここだけ太くして5とします。
他の線グラフも同樣の記述をします。
凡例の設定をします。今回は上の左に設定しますので、upper leftと記述します。
また棒グラフと同樣にpngを保存します。graph02.pngとします。解像度は60とします。
実行してみます。
線グラフを良い感じに描くことができました。
重回帰分析とは
それではいよいよ予測分析をやってみましょう。
今回の予測は重回帰分析というものを使ってやっていきます。
みなさん機械学習という単語は聞いたことがありませんか。
機械学習はマシーンラーニングをともいいます。
機械学習は人工知能の1種です。
したがって、重回帰分析をやるということは、人工知能を使うということでもあります。
今、非常に流行っていますので、張り切ってやっていきましょう。
この重回帰分析は、機械学習における基礎的な内容になります。
細かい理屈については、のちのレッスンで解説していく予定です。
今は使い方をイメージしていただき、簡単に使えることを理解してもらえればなと思います。
細かい理屈を知りたい方は、チャンネル登録をしてレッスン動画をお待ちいただけましたら非常に嬉しいです。
さて、重回帰分析です。
重回帰分析よりもっとシンプルなものとして単回帰分析があります。
単回帰分析は予測に使うデータの種類が1種類だけの分析手法のことをいいます。
一方、重回帰分析は、予測に使うデータが2種類以上の分析手法のことをいいます。
今回は重回帰分析をやってみましょう。
上下に結合(concat関数)
まず2019年のデータと2020年のデータを読み込みます。
このデータを上下にツッくけたいと思います。
上下につっくけるにはconcat関数を使います。
pdドットconcatとかきます。丸括弧の中に角括弧を書いて、2019年のデータフレームと2020年のデータフレームを記述します。
この上下にくっつけたデータフレームをdf_concatという変数に代入します。
表示させてみます。
2019年のデータと2020年のデータがうまくくっついているようです。
ただし、データの中にデータが入っていない空の行があります。
曜日の追加(weekday_name)
データをみると週末に売上が伸びているようです。これを予測するデータに使いたいと思います。
Pythonで曜日の取得してみましょう。
インデックスに設定した日付から曜日を取得します。
まず、データフレーム、ドット、index。これでindexを取得できます。それに加えて、ドット、weekday_nameを書きます。
そうすると、英語表記の曜日を取得することができます。
実行してみます。曜日が取得できました。
次に、データフレームに曜日というカラムを追加します。
まず、データフレーム、角括弧、シングルクォーテーション、カラム名を書きます。カラム名は、weekday_nameとしましょう。
イコールを書いて、先ほど書いたコードを書きます。
実行して表示してみます。
日付に対応した曜日が作られています。
空のデータの行を削除(dropnaメソッド)
その行を削除しましょう。
空の行を削除するにはdropnaメソッドを使います。
データフレームの後にドット。dropnaと記述します。
今回は行に1つでも空の値があると削除するようにしています。
他にも全部が空の場合のみ削除する方法や行ではなく、列についても同じように削除することができます。
実行してみます。
空の値がなくなったようです。
グループごとの集計(groupby)
この曜日をもとに集計をしてみたいと思います。
曜日ごとの平均値を算出してみます。
曜日ごとに集計するにはgroupbyメソッドを使います。こちらについても第二弾で説明しているのでそちらもご覧ください。
このメソッドを使うと曜日ごとにグルーピングをして、合計や平均などを算出することができます。
曜日ごとに売上の平均値を算出するので、weekday_nameとsalesのデータフレームを作成します。
データフレームを作成するので角括弧は2つです。
次にgroupbyを記述します。
weekday_nameごとに平均値を出すのでgroupbyの丸括弧の中にweekday_nameと記述します。
最後に平均値を算出するので、平均という意味のmeanを記述します。
表示もさせてみます。実行してみます。曜日ごととの集計ができたようです。
棒グラフの作成 その2
これを棒グラフにしてみます。
棒グラフはplt.barで作成できましたね。
丸括弧の最初にx軸のラベル、次に棒グラフの高さを記述するのです。
実行してみます。曜日が取得できました。
saturdayとsundayが強いようです。つまり、週末に売上が伸びるようです。
散布図と回帰直線の作成
次にコストについても分析をしてみましょう。
コストと売上に関する散布図と回帰直線をかいてみましょう。
また、matplotlibと同樣に可視化のためのライブラリのseabornを使って描いてみましょう。
その前に簡単にseabornの紹介を。seabornは、matplotlibをもとに作られています。
matplotlibではできないような可視化や美しいグラフを書くことができます。
株のデータ分析の動画で紹介しましたが、
たとえば、線グラフ、棒グラフのほかに、円グラフ。
ヒストグラム
箱ひげ図
3Dグラフまで描くことができます。
それではseabornをインストールします。
import seaborn as snsとして、seabornをsnsという名前で使えるようにします。
それでは散布図と回帰直線を描いてみます。
snsと書いて、regplot。丸括弧の中にxイコール、x軸の値を代入します。x軸はコストとします。
次にyイコールを書いて、salesを書きます。最後にdataの引数に、可視化につかうデータフレームを記述します。
実行してみましょう。
散布図と回帰直線を描くことができました。
回帰直線は、この散布図の中心を通るものです。
つまり、回帰直線は、コストごとの売上の平均値です。
これを使えば、コストに対しての売上を予測することができるます。
線グラフをみてみると、コストごとの売上の平均値が右肩上がりです。
回帰直線が右肩上がりであれば、コストをかければかけるほど売上があがることになります
一方、直線が右肩下がりであれば、コストをかければかけるほど売上がさがることになります。
今回は、右肩上がりなので、コストをかければ売上があがるようです。
つまり、売上に影響がありそうです。
したがって、今回の重回帰分析では曜日とコストを予測に使うデータとして使いましょう。
ただし、今回は、予測のために使えるデータがそれほど多くありません。
したがって、曜日ではなく、大雑把に週末と平日に分けて、それを予測に使うデータとしましょう。
平日と週末のカラムの作成(関数の作成)
それでは、曜日を平日と週末にわけてみましょう。
関数を定義をします。
pythonで関数を定義する方法は、Pythonの超入門コースの関数にて説明しています。
わからない方はそちらをご覧ください。現在、右上にカードがでているはずです。
さて、曜日をどのようのに週末と平日にわけるか。
weekday_nameのカラムを渡して、このカラムの曜日が平日の場合はweeddayという値を新しいカラムに追加をして、曜日が週末の場合はweekendという値をカラムに追加するという関数を記述しましょう。
さて、関数を定義するためにまず、defと書きます。
次に関数名です。
今回は週末を見つけたいので、find_weekendとしましょう。
丸括弧の中に、関数に渡す引数を記述します。
今回はweekend_nameのカラムを渡すので、引数名をweekend_nameとしましょう。
このweekend_nameの値がSaturdayかSundayだった場合に、weekendを返して、それ以外だった場合はweekdayを返す記述をします。
つまり、if文でweekend_nameがSaturday or weekend_nameがSundayだった場合に、改行をしてreturnでweekendを返す記述をします。
elseを書いて、それ以外の値だった場合に、weekdayである記述をします。
これで関数の定義は完了です。
平日と週末のカラムの作成(関数の適用:apply)
では、この関数をweekend_nameのカラムに適用したいと思います。
関数をカラムに適用するには、applyメソッドを使います。
データフレームであるdf_concatのweekday_nameのカラムだけ指定して、ドット。applyを記述します。
丸括弧の中に関数名を記述します。
weekendとweekdayの値が返ってきているようです。
df_cancatのデータフレームにweekendというカラムを作って、代入をしましょう。
上位14件を表示させてみたいと思います。
Fridayはweekdayに、Saturdayはweekendに、Sundayはweekendに、Mondayはweekdayになっています。
期待通りの挙動になっているようです。
weekday_nameは今後使わないのでdropで削除しておきましょう。
ダミー変数の作成:get_dummies
さて、実際に重回帰分析をやってみましょう。
重回帰分析をするために、sklearnをインポートします。
sklearnとは、色々な機械学習をすることができる便利なライブラリです。
import sklearnと記述します。
このsklearnのlinear_modelの中から、LinearRegressionをインポートします。
実行します。
ところで、先ほど、単回帰分析は予測に使うデータの種類が1種類だけの分析手法で、重回帰分析は、予測に使うデータが2種類以上の分析手法のことだと説明します。
重回帰分析の予測に使うデータは、数字でなければなりません。
しかし、weekendやweekdayは文字列ですよね。
したがって、このままでは重回帰分析の予測に使うことができません。
そこでダミー変数という手法を使いましょう。
ダミー変数とは、文字などの数字ではないデータを、数字に変換する手法のことです。
ダミー変数の手法では、数字ではないデータを「0」か「1」の数字に変換をします。
つまり、その「あるかないか」という状態を数字で表現することになります。
Pythonだとこのダミー変数をあっという間に作ることができます。
Pandasのget_dummies関数を使います。
使い方は簡単です。
pd.get_dummiesと書いて、丸括弧の中にダミー変数を作りたいデータフレームを記述します。
今回の場合は、df_concatです。
表示をして実行してみましょう。
「0」か「1」の数字に変換されています。
説明変数と目的変数の作成
それでは、重回帰分析で、予想に使うデータと、予測したいデータを変数に代入をしましょう。
xに予測に使うデータを代入します。
salesが予測したいデータです。
したがって、saleをdropしたデータをxに代入しましょう。
次に、yという変数に予測したいデータを代入します。
売上を予測したいのでsalesを代入します。
これで重回帰分析をかける準備は完了です。
ちなみに、予測に使うデータのことを説明変数といい、予測したいデータのことを目的変数といいます。
予測することが目的なので売上を予測したいならこれが目的変数。
この目的変数を説明するために使うデータなので、予測に使うデータのことを説明変数というのだと覚えておいてください。
これを覚えておくだけでもちょっとかっこいいかもしれません。
重回帰分析の実行(LinearRegression)
さて、重回帰分析をやってみましょう。
LinearRegression()と書きます。
LinearRegressionとは、線形回帰モデルのことです。
単回帰や重回帰などがこれにあたります。
この記述で、線形回帰モデルをインスタンス化します。
インスタンス化については、Python超入門コースのクラスにて説明をしています。
気になる方は概要欄に貼っておきます。また、右上にカードがでているのでそちらをご覧ください。
インスタンス化は、簡単に言ってしまうとクラスを使えるようにすることをいいます。
つまり、LinearRegressionのクラスを使えるようにすることです。
線形回帰モデルを使えようにして、modelという変数に代入をします。
そして、modelドットfitと書いて、xとyをmodelに渡します。
つまり、予測したいデータと予測に使うデータをモデルに当てはめます。
これで予測モデルができあがったはずです。
それでは、予測の各種データをみてみましょう。
modelドットinterceptアンダースコアです。
これで重回帰の切片を求めることができます。
つまり、売上のベースとなる値です。
各種係数の確認
次に、modelドットcoefアンダースコアです。
coefは、coefficient(コーフィシェント)の略で、係数という意味です。
つまり、説明変数がどのぐらい予測に影響があるのかという値です。
これではわかりにくいと思うので、データフレームの表にしてみましょう。
df_201909_dummiesのカラムは何があったでしょうか。
df_201909_dummiesドットcolumnsで表示させてみます。
salesが目的変数ですね。
つまり、予測に使っていないデータです。
これをドロップで削除してfeaturesという変数に代入をしましょう。
表示をさせてみます。
sales以外のカラムになりました。
これをデータフレームにして、みやすくしましょう。
データフレームの作成方法については、Pandas超入門コースのデータフレームで説明をしています。
気になる方はそちらもご確認ください。
データフレームを作っていきます。
pd.DataFrameと書いて、丸括弧。丸括弧の中に辞書型の波括弧を書きます。
コロンの前がカラム名、コロンのあとが実際のデータです。したがって、カラム名のfeatures_nameと書いて、データ部分はfeaturesとかきます。
コンマを書いて次のカラムのコンフィシエント。コロンを書いてmodel.coef_と書きます。
実行して表示をさせます。
表示できました。
この表から読み取れるのは、コストを1かけると8.8円の売上が上がるようです。
また、週末だと先ほど見た切片、つまり、38万円から12万3千円さがり、週末だと12万3千円あがるようです。
エクセルのデータをみると、なんだかそれっぽい感じもします。
決定係数
では、最後にこのモデルにどのぐらい精度があるのかみてみましょう。
modelドットscoreと書きます。丸括弧の中にxとyを渡しましょう。
0.91が返ってきました。
これは1に近ければ精度が高く、0に近ければ精度が低いということになります。
この数字のことを決定係数といいます。
予測するものによってこれがどのぐらいの数字以上あればいいか意見が色々ありますが、0.8以上あればそれなりの精度と考えて良いでしょう。
したがって、これを使って月末の売上がどのぐらいになるか予測してみます。
予測データの作成
df_this_yearのデータフレームを表示させてみます。this year salesには9月13日までの売上の実績値が入っています。
したがって、14日から30日まで予測の数値をいれていきましょう。
また、広告費であるコストをかけない場合の予測値とかけ場合の予測値を算出しましょう。
まず、9月14日から9月30日までのデータを作ります。
1日おきごとのデータを作るには、data_rangeメソッドを使います。
pd.data_rangeと書きます。
最初のスタートの引数にスタートの日付。
9月14日からのデータを作りたいので、その値を入れます。
動画の最初にtodayにこの値をいれましたね。
なので、startにtodayを代入。
次の引数はおわりの日付です。endに、これも動画の最初で作ったmonth_endを代入します。
freqの引数には1日おきなのでDの引数を渡します。
これにWeekのWを渡すと1週間おきごとのデータを作ることができ、Mを渡すと月末ごと、Yを渡すと年末ごとのデータを作成することができます。
実行してみましょう。
9月14日から9月30日までのデータを作成することができました。
これをdate_rangeという変数に代入をしましょう。
これをもとにデータフレームを作成します。
先ほどもpd.DataFrameと書き、インデックスに先ほど作成した日付、つまり、date_rangeを代入。
カラムは広告費をかけない場合の予測値の「this year sales」と広告費をかけた場合の予測値の「’this year sales(cost)」を作りましょう。このデータフレームをdf_predictionに代入をします。
表示させてみます。
これを先ほどと同じように曜日を作って、先ほど定義したfind_weekend関数を使ってweekendかweekdayかを判定しましょう。
表示させてみます。
先ほどみた、係数などを変数に代入しておきます。
yにインターセプトを代入。
広告費の係数はx_cost
平日の係数はx_weekday
週末の係数はx_weekendに代入しましょう。
これをfor文を使って予測値を代入していきましょう。
for index_name in df_prediction.index:と記述します。
そうすると、index_nameの変数には1行ずつインデックスが代入されていきます。
printで表示させてみましょう。
これを先ほども紹介したlocを使えば特定のセルを指定することができますよね。
データフレームにドット、locと書いて角括弧の中に行名と列名を指定します。
weekendの列がweekdayかweekendかを判定していたので、
列のところにはweekendのカラム名を指定。
行のところにはindex_nameを記載します。
そうすると、weekendかweekdayかのどちらかを取得できるはずです
表示させてみましょう。
期待通りです。
では、これを使って予測値を代入していきましょう。
あわせて、コストを10000円をかけた予測値もだしてみます。costという変数に10000を代入します。
先ほど記述したものをそのままコピペして、このセルがweekendだった場合の条件分岐を書きます。
改行してweekendだった場合の処理を書きます。
locを使って、該当の行の、「this year sales」に、予測結果を代入します。
weekendだった場合の処理なので、yにweekendの係数 + 広告費を記述します。だけど、このカラムは広告費をかけないカラムなので0を掛け算します。
同様に「this year sales(cost)」のカラムには、costまでは同様の記述をして、costの部分にはx_costに先ほど10000を代入したcostを掛け算します。
else以下には、x_cost_weekdayとします。それ以外は一緒です。
実行してみましょう。
予測値が代入されています。
weekday_nameとweekendはもう使わないのでdropで削除します。
「this year sales(cost)」のカラムに「’this year sales’」と同じ実績値を代入しましょう。
うまくいったようです。
「this year sales(cost)」のカラムにも「’this year sales’」のカラムにも14日以降は予測値を代入しましょう。
では、予測値をくっつけましょう。
先ほどと同じように上下にくっつけるので、concat関数を使います。
pdドットconcatとかきます。丸括弧の中に角括弧を書いて、実績値のデータフレームと予測値のデータフレームを記述します。
この上下にくっつけたデータフレームを改めてdf_this_yearという変数に代入します。
最後にカラム名を並び替えましょう。
データフレームにカラム名のリストを渡すとカラム名の並び替えができます。
カラム名は、’this year sales’,’this year sales(cost)’,’cost’,’last week per’,’last week sales’,’last year per’,’last year sales’]の順番に入れ替えます。
これで完成です。
最後に「this year sales」のカラム名の合計。つまり、今月の売上予想を代入します。
costありについても同様にやります。
それぞれを表示させてみましょう。
表示できました。つまり、このまま広告費をかけなければ、998万円の売上予想になり、
一方、広告費のコストをかければ、1148万円の売上になると予想できました。
このように、コストをかけないで売上予算を達成したい場合、一方コストをかけたら売上予算を達成できるのかどうか。
そういったことを上司の方に一緒に報告できれば、上司の方は非常に喜ぶと思います。
Excelを操作できるopenpyxl
import openpyxl
それでは、PythonからExcelを操作するために、「openpyxl」というライブラリを使えるようにします。
さて、コードを書いていきましょう。
「import openpyxl」を書きます。
from openpyxl.styles import Font
from openpyxl.styles.alignment import Alignment
from openpyxl.styles import colors
from openpyxl.styles import PatternFill
from openpyxl.drawing.image import Image
エクセルのセルを操作するために、関数やクラスを5つインポートしていきます。
1つめに、フォントのサイズや書体などを変更するために「Font関数」をインポートします。
まず、「from」書いて、「openpyxl」、ドット、「styles」を書きます。
つづいて、「import」を書いて、「Font」を書きます。
「from」を書くと、モジュールの中の関数やクラスを指定してインポートすることができます。
では、同じような記述方法で、どんどんインポートしていきましょう。
2つめに、セルを中央よせにするために「Alignment(アライメント)関数」をインポートします。
3つめに、文字の色を調整するために「colorsクラス」をインポートします。
4つめに、セルを塗りつぶすために「PatternFill関数」をインポートします。
最後に、画像ファイルを挿入するために「Imageクラス」をインポートします。
変数に代入
export_file = ‘excel03_after.xlsx’
次に、エクセルを書き出すために変数にファイル名を代入していきましょう。
それでは、変数「export_file」に、エクセルファイル名を代入します。
Excel書き出すto_excelメソッド
df_this_year.head()
df_this_year.to_excel(export_file)
次に、Excelにデータを書き出します。書き出したエクセルファイルをPythonを使ってセルを変えたり列幅を変える操作をしていきましょう。
まず、データフレーム(df_this_year)を書いて、ドット、to_excel、
丸括弧の中にファイル名を記述した変数名を記述します。
このメソッド(to_excel)を使うと、Excelに書き出すことができます。
最後に、丸括弧の中に、ファイル名の変数を書きます。
ここからは、エクセルファイルがどのように変化していくか、確認しながら進めていきます。
それでは、実行してみます。データフレームが書き込まれました。
ファイル読み込み
workbook = openpyxl.load_workbook(export_file)
次に、エクセルのセルを操作するために、エクセルのファイルを読み込みます。
まず、「workbook」という変数を書いて、イコールを書きます。
イコールのあとに、openpyxl、ドット、load_workbook、丸括弧を書きます。
load_workbookを使うと、ファイルを読み込むことができます。
丸括弧の中にファイル名を書きます。
操作するシートを指定
次に、操作するシートを指定します。
まず、「worksheet」という変数を書いて、イコールを書きます。
そして、「workbook」、ドット、「worksheets」を書いて、角括弧を書きます。
角括弧の中に、最初のシートを指定するために「0」を書きます。
フォント変更
font = Font(name=’メイリオ’, size=14)
sheet_range = worksheet[‘A1′:’H31’]
for row in sheet_range:
for cell in row:
worksheet[cell.coordinate].font = font
次に、Font関数を使って、フォントを変更していきます。
エクセルのこちらのデータを、フォントをメイリオ、サイズを14にしていきます。私は分析やレポーティングの仕事をやってきましたが、フォントはメイリオがおすすめです。
まず、fontという変数を書いて、イコール、Font関数を書きます。
引数に、フォントとサイズを指定します。
次に、フォントを変更するセル範囲を指定します。
まず、シートの範囲という意味のsheet_rangeという変数を書いて、イコール、worksheet変数、角括弧を書きます。
角括弧の中に、フォントを操作するセルの範囲を書きます。
セルの範囲は、ここからここまでになります。
では、sheet_rangeには、どのような値が入っているか見てみましょう。
指定した範囲のデータがタプル型で格納されています。
タプルとは、リストや辞書型と同じように複数の要素をもち、一方でリストなどとは違い、追加・変更・削除ができないデータ型の一種です。
タプルについては、Python入門講座で詳しく説明していきます。
このデータには、セルの場所が行ごとに区切られて格納されていることがわかります。
2次元配列のようになっているので、for文の中にfor文を入れて、セルを操作していきます。
for文の中にfor文が入っている構造のことをfor文のネストといいます。for文のネストについてもPython超入門コースの繰返しで説明していますので、気になる方はチェックしてください。
順を追って、まずは、外側のfor文について、説明していきます。
最初に、for文を書いて、外側のカウンタ変数を「row」、「in」、「sheet_range」を書きます。
sheet_rangeのデータを1つずつ、「row」に入れて、データがなくなるまで繰り返します。
それでは一度表示してみます。
行ごとにデータがまとまっています。
そして、この行ごとのデータを、内側のfor文を使って操作していきます。
内側のfor文を書いて、内側のカウンタ変数を「cell」、「in」、「row」を書きます。
rowのデータを1つずつ、cellに入れて、データがなくなるまで繰り返します。
内側のfor文のデータがどうなっているかみてみましょう。
セルごとに表示されていますね。
最後に、先ほど設定してフォントサイズやメイリオのフォント名を、セルを適用していきます。
まず、worksheetを書いて、角括弧を書きます。
角括弧の中にセルの場所を書きます。
そして、ドット、font、イコールを書いて、fontを代入です。
Excelファイル保存
workbook.save(export_file)
それでは、一度ファイルを保存して、フォントが変更されたか確認してみましょう。
まず、「workbook」、ドット、saveを書きます。
「save」を使うと、Excelファイルを保存することができます。
次に、丸括弧を書いて、ファイル名を書きます。
それでは、ファイルを開いてみましょう。
フォントが変わってますね。
セルを塗りつぶす
fill = openpyxl.styles.PatternFill(patternType=’solid’, fgColor=’295C82′, bgColor=’295C82′)
for col in [‘A1’, ‘B1’, ‘C1’, ‘D1’, ‘E1’, ‘F1’, ‘G1’, ‘H1’]:
worksheet[col].fill = fill
次に、こちらのセルに色をつけていきましょう。
まず、fillという変数、イコール、PatternFill関数を書きます。
引数に、patternTypeを塗りつぶしであるsolidを記述し、色を指定します。fgColorとbgColorの両方記述しないと色が変わらないので注意しましょう。
そして、for文を使って、セルを塗りつぶしていきます。
for文のinのあとにこちらのセルを書いていきます。for文を使うとこのセルのリストが前から順番にcolに入っていきます。
このcolをworksheet、角括弧に記述します。そして、ドット、fillを書きます。
最後に、イコールを書いて、先ほど設定をしたカラーパターンのfillを代入します。
セルの色が塗りつぶされるか、みてみましょう。
塗りつぶすことができました。
セルの幅を調整する
for col in [‘A’,’B’,’D’,’E’,’F’,’G’,’H’,’K’]:
次に、列の幅を調整していきます。
今回も、for文を使って、列を調整していきます。
まず、for文のinあとに、エクセルの列幅を調整するこちらの列を書いていきます。
それから、worksheet、column_dimensionsを書いて角括弧を書きます。
角括弧の中に、カウンタ変数の「col」を書いて、ドット、widthを書きます。
最後に、イコールを書いて、18を代入します。
worksheet.column_dimensions[‘C’].width = 24
worksheet.column_dimensions[‘J’].width = 30
C列の幅を24、J列の幅を30に調整します。
それでは、実行して確認してみます。
C列とJ列が調整できました。
それでは、実行して確認してみます。
列が調整できました。
セルの操作
for col in [‘B1’, ‘C1’, ‘D1’, ‘E1’, ‘F1′ ,’G1’, ‘H1’]:
worksheet[col].font = Font(name=’メイリオ’, size=14, color=’FFFFFF’)
次に、こちらのセルの文字色を白に変更します。
こちらのセルもフォントと文字色を変更します。
フォントをメイリオ、サイズを14、色は白にします。
実行して確認してみます。
指定したセルが変更されました。
表示フォーマット指定
for idx in range(2, 32):
worksheet.cell(row=idx,column=1).number_format = ‘yyyy-mm-dd’
worksheet.cell(row=idx,column=5).number_format = “0%”
worksheet.cell(row=idx,column=7).number_format = “0%”
worksheet.cell(row=idx,column=2).number_format = “#,##0”
worksheet.cell(row=idx,column=3).number_format = “#,##0”
worksheet.cell(row=idx,column=4).number_format = “#,##0”
worksheet.cell(row=idx,column=6).number_format = “#,##0”
worksheet.cell(row=idx,column=8).number_format = “#,##0”
worksheet.cell(row=idx,column=11).number_format = “#,##0”
worksheet.cell(row=idx,column=1).alignment = Alignment(horizontal=’center’)
次に、この範囲のセルに表示のフォーマットを指定していきます。
まず、for文を書いて、idx、in、rangeを書きます。
2行目から31行目を操作したいので、引数に、2と32を書きます。
次に、セルに表示フォーマットを指定していきます。
A列は日付なので年月日で表示します。
まず、worksheet、ドット、cellを書いて、丸括弧を書きます。
引数に、行番号と列番号を書いて、セルを指定します。
行番号はrowと書いて、カウンタ変数のidx。列番号はcolumnsと書いて列番号を書きます。
そして、ドット、number_formatを書きます。
number_formatで、表示のフォーマットを変更することができます。
日付を西暦のyyyy、月のmm、日にちのddを書いて、代入します。
E列は前週比、G列は前年比なので、パーセントの形式を代入します。
残りのセルは数値なので、カンマを表示する形式を代入します。
最後に、中央寄せにする方法について、説明します。
セルを指定するところは一緒で、alignmentを書いて、配置方法を変えてきます。
そして、Alignment関数を書いて、引数に中央寄せの記述を書きます。
では、確認してみましょう。
表示形式が変わってますね。
セルに値を入力する
worksheet[‘J2’].value = “今月着地(広告なし)”
worksheet[‘J3’].value = “今月着地(広告1万円)”
worksheet[‘K2’].value = prediction
worksheet[‘K3’].value = prediction_cost
次に、今月の着地予想をセルに記載していきます。
最初に、セルに値を入力していきます。
worksheetを書いて、角括弧、セルの場所を書きます。
そして、イコールを書いて、文字列を代入します。
このセルには今月着地(広告なし)、このセルには今月着地(広告1万円)としましょう。
次に、予測値の合計を代入します。先ほど合計を代入しておいた「prediction」「prediction_cost」を使いましょう。
これでセルに値が入力されました。
それでは確認してみましょう。
値が表示されていますね。
fill = openpyxl.styles.PatternFill(patternType=’solid’, fgColor=’6D9ED8′, bgColor=’6D9ED8′)
for col in [‘J2’, ‘J3’, ‘K2’, ‘K3’]:
worksheet[col].fill = fill
for col in [‘J2’, ‘J3’, ‘K2’, ‘K3’]:
worksheet[col].font = Font(name=’メイリオ’, size=14, color=”FFFFFF”)
あと、フォントと文字色を変えて、セルを塗りつぶしましょう。
フォントや色が変わって、見やすくなりましたね。
画像貼り付け
img1 = Image(‘graph01.png’)
worksheet.add_image(img1, ‘I5’)
img2 = Image(‘graph02.png’)
worksheet.add_image(img2, ‘I19’)
最後に、シートに画像を貼り付けます。
まず、画像を取り込んで、img1という変数に代入します。
次に、「worksheet」、ドット、add_imageを書きます。
「add_image」と使うと、シートに画像を張り付けることができます。
それから、丸括弧を書いて、img、ドットを書きます。
そして、画像を張り付けるセルの位置を指定します。
もう一つの画像も書きます。
それでは、確認してみましょう。
シートに画像が張り付けられてますね。
Jupyter Labのセルを一括で実行
このjupyter labをpyファイルにして実行して、自動でレポートを作成するのも方法ですが、今日は違うやり方をみていきます。
ちなみに、pyファイルが時間になったら実行されせるやり方については、別の解説動画を作る予定です。チャンネル登録をしてお待ちしていただければ幸いです。
エクセルファイルを消しておきましょう。
jupyter labで今までの実行結果をクリアにします。
Restart Kernel and Clear all outputsをクリック。
これで今までの実行結果が消えました。
そしてすぐ下のRun all cellsをクリック。
これをクリックするとJupyte Labの全部のセルが実行されます。実行してみます。
エクセルファイルができあがっています。
最初は実績値だけが記入されたエクセルデータだったのが、コードを記述してしまえば全自動で完成できます。
また実績のデータが更新されていけば売上予想も自動的に更新されていきます。非常に便利ですよね。
本当に長い間、ご視聴ありがとうございました。
この動画では、データ集計・データ加工、グラフ化に加えて、予測分析もやりましたし、エクセル操作もやりましたね。
多くの内容を学習したため頭の整理が追いつかない方もいらっしゃるかもしれません。
でも、ご自身で手を動かしながら、繰り返し動画をみてください。必ずできるようになります。
キノコードでは、業務自動化のレッスン、今後は人工知能を使った予測分析の動画などもを配信していきます。
気に入った方は是非チャンネル登録をお願いします。
それでは次のレッスンでお会いしましょう