Matplotlib & Seaborn 入門講座 | 05.【実践】売上管理表で棒グラフでグラフ化してみよう

挨拶

こんにちは。キノコードです。
Matplotlib & Seaborn入門講座の第5回です。
前回のレッスンでは、単純なデータを使って、Matplotlibで棒グラフ、積み上げ棒グラフなどの棒グラフ全般の作成方法について解説をしました。
今回は、売上管理表という実践的なデータを使って棒グラフの作成方法について学んでいきます。
PythonのライブラリPandasを使えばデータ集計やデータ加工が簡単にできます。
また、このレッスンでお教えしているmatplotlibを使えば、集計したデータを見える化、データ可視化も容易にできます。
また、Pythonはプログラミング言語などで集計や可視化を一気に自動化することも可能です。
ぜひこのレッスンで棒グラフの作成方法をマスターしてください。
キノコードでは、YouTubeのメンバーシップを募集しています。
キノコードを応援してくださる方は、メンバーになるをクリックをお願いします。
メンバーシップをはじめた理由などの動画もありますので、そちらもご視聴ください。
概要欄にURLを貼っておきます。
それではレッスンスタートです。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」
Jupyter Labのファイルはこちら
CSVファイルはこちら

ライブラリインポート

import matplotlib.pyplot as plt
import matplotlib.dates as dt
import pandas as pd
%matplotlib inline

早速、ライブラリをインポートする記述をしましょう。
matplotlibのPyplotをpltという名前でインポートします。
また、matplotlibの中のdatesを使うことで、時系列グラフの軸ラベルを自由に変更することができます。
こちらはdtという名前でインポートしておきます。
そして、今回はpandasを使ってデータ加工をします。 pdという名前でインポートしましょう。
pandasを使うことで、csvやexcelファイルなどのデータを簡単に読み込み、効率的にデータを加工することができます。
最後のこの記述は、ノートブック内にグラフを表示させるために必要です。
実行します。
インポートが完了しました。

データ読み込み

df = pd.read_csv(sample.csv')

続いて、pandasのread_csvメソッドを使ってcsvファイルを読み込む記述をします。
dfという変数に、あらかじめダウンロードいただいた「sample.csv」というファイルを格納します。
pdドット、readアンダースコア、csvと書いて丸括弧。
丸括弧の中に、読み込むファイル名を書き、シングルコーテーションでくくります。
実行します。

df.head()

それでは、dfの中身を確認してみましょう。最初の5件を表示します。
データが格納されているようです。

df.info()

では、データフレームの情報を見てみましょう。
infoメソッドを使用すると、列の名前やそのデータ型、データ数などを知ることができます。
実行します。
売上日という列がありますが、文字列になっていることがわかります。

df['売上日'] = pd.to_datetime(df['売上日'])

続いて、データフレームの中の売上日という列を、文字列から日付型に変更しましょう。
pandasのto_datetimeメソッドを使います。
実行します。

df.info()

もう一度infoで確認してみましょう。
売上日の列が、日付型になっています。

df2 = df.set_index('売上日')
df2.head()

時系列データでは、データフレームのインデックスが日時のデータになっている必要があります。
従って、日付型に変更した売上日の列をインデックスにします。
時系列データの詳しい扱い方に関しては、pandas入門講座でも解説をしています。
是非そちらもご覧ください。
ここでは、pandasのsetアンダースコアindex関数を使って売り上げ日の列をインデックスに指定します。
これを、df2という変数に格納しましょう。
実行します。
売上日がインデックスになりました。

月ごとの合計データフレーム作成

sum_df = df2[['売上金額']].resample('M').sum()
sum_df

続いて、グラフを作成しやすいように、データを整理しましょう。
まずは、月ごとの売上金額の合計を算出します。
sumアンダースコアdfという変数に、データを格納します。
先ほど作成したdf2の中の、合計を算出したい列のカラム名「売上金額」を二重括弧の中に記述します。
これで、売上金額の列を取り出したデータフレームができます。
さらに、resampleと書いて丸括弧、月平均を算出したいので、monthの頭文字のMを指定します。
最後に合計を意味するsumと書いて丸括弧です。
作成したsum_dfを表示してみましょう。
実行します。
月ごとの売上金額の合計を算出したデータフレームを作成できました。

月ごとの売上棒グラフ

volume = sum_df['売上金額']
date = sum_df.index

作成したデータフレームを基に、棒グラフを作成してみましょう。
volumeという変数に、先ほど作成した売上金額のカラムを代入します。
dateという変数には、日付型に変更したインデックスを代入します。
実行します。

plt.figure(figsize=(9,6))
plt.bar(date,volume, width=20)
plt.show()

続いて、棒グラフを作成する記述をします。
今回は、figsizeを9対6としておきます。
棒グラフを意味するbarと書いて丸括弧、丸括弧の第一引数にX軸として先ほど設定した変数のdate、第二引数にY軸としてvolumeと記述します。
このままだとX軸の日付の最終日にだけデータがあることになるので、他の日が空白となってしまいます。
見やすくするために、widthで棒グラフの幅を太くする指定します。
今回は20とします。
実行します。
月ごとの売上金額の合計を示した棒グラフを作成できました。

時間軸ラベルの表示変更、全ての棒グラフに日付ラベル追加

fig = plt.figure(figsize=(9,6))
ax = plt.subplot()

ax.bar(date,volume, width=20)
ax.set_xticks(date)
ax.xaxis.set_major_formatter(dt.DateFormatter("%m"))

plt.show()

x軸の日付の表示を変更してみましょう。
ここでは、時間軸の2020年の表示は消して、月のみ表示させてみます。
matplotlibには、時間軸の表示を自由に変更できるsetアンダースコアmajorアンダースコアformatterという関数が用意されています。
この関数は、axisという、日本語で軸を意味するオブジェクトで使用することができます。
従って、axisの省略名のaxという名前で、axisオブジェクトを使用できるようにする記述をします。
axイコールの後に、pltドット、subplot、丸括弧です。
棒グラフは、このaxというオブジェクトに対して描画をするので、このように記述します。
setアンダースコアxticks丸括弧の中には、先ほど設定した変数のdateを渡します。
そして、axドット、xaxisの部分の丸括弧の中に、matplotlib.dateの省略名dtを記述しドット、DateFormatterの丸括弧の中には、パーセントエムと記述します。
monthの頭文字を取ったmを記述することで、軸のラベルが月のみになります。
実行します。
x軸のラベルが月のみになりました。

fig = plt.figure(figsize=(9,6))
ax = plt.subplot()

ax.bar(date,volume, width=20)
ax.set_xticks(date)
ax.xaxis.set_major_formatter(dt.DateFormatter("%b"))

plt.show()

先ほどパーセントの後にmと指定したところに、小文字のbを指定すると、英語の月の名前の頭文字を表示させることができます。
実行します。
表示を変更できました。

グラフ色変更、タイトル、軸ラベル付与

# !pip install japanize_matplotlib
import japanize_matplotlib 

fig = plt.figure(figsize=(9,6))
ax = plt.subplot()

ax.bar(date, volume, width=20, color='darkcyan')
ax.set_xticks(date)
ax.xaxis.set_major_formatter(dt.DateFormatter("%b"))
ax.set_title('月別売上金額', fontsize=18)
ax.set_xlabel('月', fontsize=15)
ax.set_ylabel('売上金額(円)', fontsize=15)

plt.show()

続いて、グラフの色を変更してみましょう。
同時に、グラフのタイトルと、軸のラベルも追加してみます。
日本語を表示させるために、japanize matplotlibをインポートします。
なお、Googleコラボを使用している方やインストールがまだの方は、この記述でインストールできます。
bar丸括弧の中に、引数colorで指定したい色を記述します。
そして、オブジェクトaxのタイトルの設定は、axドット、セットアンダースコア、タイトルと記述します。
xラベルとyラベルに関しても同様にsetを記述し、丸括弧の中に表示させたい名前をシングルコーテーションでくくります。
引数fontsizeでフォントのサイズを指定します。
実行します。
グラフの色を変更できました。
タイトルとラベルも表示できています。

グラフ保存

fig = plt.figure(figsize=(9,6))
ax = plt.subplot()

ax.bar(date, volume, width=20, color='darkcyan')
ax.set_xticks(date)
ax.xaxis.set_major_formatter(dt.DateFormatter("%b"))
ax.set_title('月別売上金額', fontsize=18)
ax.set_xlabel('月', fontsize=15)
ax.set_ylabel('売上金額(円)', fontsize=15)
plt.savefig('sample1.png')

作成したグラフを保存しましょう。
プロットした領域を画像にするので、ここはpltドットと書きます。そしてsavefig丸括弧の中に、好きな名前をシングルコーテーションでくくります。
今回はpng形式のファイルを指定してみます。
実行します。
グラフを保存できました。

氏名ごとの売上棒グラフ

df_name = df[['氏名','売上金額']].groupby('氏名').sum()
df_name

続いて、氏名ごとにデータを分類してみましょう。
pandasのgroupbyメソッドを使用します。
groupbyの詳しい使い方については、pandas入門講座でも解説をしています。
是非そちらもご覧ください。
今回は、氏名ごとに売上金額の合計を算出してみます。
二重括弧の中に使用する列の氏名と売上金額を記述しドット、groupby丸括弧の中に氏名と記述します。
最後に、合計を意味するsumを書いて丸括弧です。
これを、dfアンダースコアnameというデータフレームに格納しましょう。
実行します。
氏名ごとのデータフレームを作成できました。

volume = df_name['売上金額']
labels = df_name.index

plt.bar(labels, volume)
plt.show()

氏名ごとの売上金額を、棒グラフにしてみましょう。
volumeという変数に、先ほど作成した売上金額のカラムを代入します。
labelsという変数にはインデックスを代入します。
ここでのインデックスは、氏名です。
bar丸括弧の中に、X軸、Y軸の順に設定した変数を渡します。
実行します。
棒グラフを作成できました。

plt.bar(labels, volume, width=0.5)
plt.show()

棒グラフの太さを変更してみましょう。
bar丸括弧の中の引数widthで指定します。
ここでは、0.5とします。
実行します。
棒グラフの太さを変更できました。

タイトル、軸ラベル付与

plt.bar(labels, volume, width=0.5)
plt.xlabel('氏名', fontsize=12)
plt.ylabel('合計', fontsize=12)
plt.title('氏名別売上金額', fontsize=16)
plt.show()

続いて、軸のラベルとグラフタイトルを追加しましょう。
xlabel丸括弧の中に表示したい名前を記述し、シングルコーテーションでくくります。
y軸に関しても同様の記述をします。
グラフタイトルは、pltドットtitleで設定します。
実行します。
軸のラベルとグラフタイトルを追加できました。

色変更

plt.bar(labels, volume, width=0.5, color='coral')
plt.xlabel('name', fontsize=12)
plt.ylabel('total', fontsize=12)
plt.title('氏名別売上金額', fontsize=16)
plt.show()

グラフの色も変更してみましょう。
bar丸括弧の中に、引数colorで指定します。
実行します。
グラフの色を変更できました。

サイズ変更

plt.figure(figsize=(9,6))
plt.bar(labels, volume, width=0.5, color='coral')
plt.xlabel('name', fontsize=12)
plt.ylabel('total', fontsize=12)
plt.title('氏名別売上金額', fontsize=16)
plt.show()

グラフのサイズを変更するには、pltドット、figure丸括弧の中にfigsizeと記述します。
9対6としてみます。
実行します。
グラフのサイズを変更できました。

plt.figure(figsize=(9,6))
plt.barh(labels, volume, height=0.5, color='coral')
plt.xlabel('売上金額(円)', fontsize=15)
plt.ylabel('氏名', fontsize=15)
plt.title('氏名別売上金額', fontsize=18)
plt.show()

続いて、水平方向の棒グラフを作成してみましょう。
barエイチとすることで、水平方向の棒グラフになります。エイチは水平のhorizon(ホライズン)を意味します。

widthはheightに変更します。
実行します。
水平方向の棒グラフを作成できました。

商品分類棒グラフ

df_name2 = df[['氏名', '商品分類', '売上金額']].groupby(['氏名','商品分類']).sum()
df_name2

続いて、氏名ごと、商品分類ごとの積み上げ棒グラフを作成しましょう。
まずは、データフレームを作成します。
二重括弧の中に、氏名、商品分類、売上金額を記述します。
groupby丸括弧の中には、氏名と商品分類をリストで記述します。
合計を算出するために、sumと書いて丸括弧です。
これを、dfアンダースコアname2というデータフレームに格納しましょう。
実行します。
データフレームを作成できました。

df_name2 = df_name2.unstack()
df_name2

作成したデータフレームは、氏名と商品分類というふたつのインデックスが表示されています。
このようなデータフレームをマルチインデックスと言います。
このままではうまくグラフにできないので、インデックスを氏名だけにしましょう。
マルチインデックスのデータフレームは、縦に積み上げたように見えるので、その逆のunstackメソッドを使います。
これを変数dfアンダースコアname2に入れ直します。
実行します。
インデックスに氏名、カラムが商品分類のデータフレームになりました。

df_name2.plot(kind='bar')
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名')
plt.ylabel('売上金額(円)')
plt.title('氏名/商品別売上')
plt.show()

pandasデータフレームのplotメソッドで、データフレームをそのままグラフにすることもできます。
グラフにしたいデータフレームに、plotと記述します。
丸括弧の中には、グラフの種類を指定するkindと書いて、棒グラフを意味するbarを指定します。
続いて、legendで凡例の名前をリストで記述します。
実行します。
商品分類ごとのグラフを作成できました。
しかし、x軸の名前が少し見づらいです。

df_name2.plot(kind='bar',rot=0)
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名')
plt.ylabel('売上金額(円)')
plt.title('氏名/商品別売上')
plt.show()

plotメソッドの引数rot(ロート?)に0を渡すことでラベルを90度回転させることができます。rotは回転を意味するrotation(ローテーション)の略です。
実行します。
ラベルの名前が見やすくなりました。

figsize変更

df_name2.plot(kind='bar',rot=0, figsize=(9,6))
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名', fontsize=15)
plt.ylabel('売上金額(円)', fontsize=15)
plt.title('氏名/商品別売上', fontsize=20)
plt.show()

グラフのサイズを変更してみましょう。
pandasのplotメソッドで作成したグラフのサイズは、引数figsizeで指定できます。
9対6としましょう。
実行します。
グラフのサイズを変更できました。

グラフの色変更

df_name2.plot(kind='bar',rot=0, figsize=(9,6), color=['coral','limegreen','gold'])
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名', fontsize=15)
plt.ylabel('売上金額(円)', fontsize=15)
plt.title('氏名/商品別売上', fontsize=20)
plt.show()

グラフの色を変更してみましょう。
こちらも引数colorで指定します。
色を3種類、リストで指定します。
実行します。
グラフの色を変更できました。

商品分類積み上げ棒グラフ

df_name2.plot(kind='bar',rot=0, figsize=(9,6), stacked=True)
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名', fontsize=15)
plt.ylabel('売上金額(円)', fontsize=15)
plt.title('氏名/商品別売上', fontsize=20)
plt.show()

氏名ごとの商品分類を、積み上げ棒グラフにしてみましょう。
plotメソッドで、引数stackedにTrueを指定するだけで、積み上げの棒グラフにすることができます。
実行します。
積み上げ棒グラフを作成できました。

商品分類積み上げ棒グラフ(水平)

df_name2.plot(kind='barh',rot=0, figsize=(9,6), stacked=True)
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名', fontsize=15)
plt.ylabel('売上金額(円)', fontsize=15)
plt.title('氏名/商品別売上', fontsize=20)
plt.show()

水平方向の積み上げ棒グラフも作成してみましょう。
plotメソッドの引数kindに、バーエイチを指定します。
実行します。
水平方向の積み上げ棒グラフを作成できました。

fig保存

df_name2.plot(kind='barh',rot=0, figsize=(9,6), stacked=True)
plt.legend(['アウター','トップス','ボトムス'])
plt.xlabel('氏名', fontsize=15)
plt.ylabel('売上金額(円)', fontsize=15)
plt.title('氏名/商品別売上', fontsize=20)

plt.savefig('Sales.png')

最後に、作成したグラフを保存しましょう。
savefig丸括弧の中に、好きなファイル名を記述し実行します。
グラフを保存できました。

挨拶

実践的なデータを使っての棒グラフの作成方法でした。
難しい点などありませんでしたでしょうか?
キノコードではmatplotlibやSeabornのレッスンだけではなく、Pythonそのもの基本的な使い方、仕事の自動化のプログラムの作成方法、人工知能のレッスンなども配信しています。
キノコードの新着動画はチャンネル登録をしていただければ、通知が届きますので、ぜひチャンネル登録をお願いします。
それでは、次のレッスンでお会いしましょう。

レッスンで使ったファイルはこちら

■保存方法
Mac:右クリック⇒「リンク先を別名で保存」
Windows:右クリック⇒「名前を付けてリンク先を保存」
Jupyter Labのファイルはこちら
CSVファイルはこちら