データ分析で最初に行うことは、項目(変数)ごとに平均、標準偏差、ヒストグラムを知ることです。なかでも、ヒストグラムは「値の分布傾向」を視覚的に把握できるので重宝します。
例えば、今まで左右対称な山型の分布をしていた月間売上高のヒストグラムが、ある頃から山が右に偏り始めたとすれば、特売日への依存増大を疑うことができます。このようにデータをヒストグラムで可視化することで、ビジネスの異変にいち早く気付くことが可能になります。
非常に重宝するヒストグラムですが、エクセルで書くのは結構面倒です。本当ならば、複数のヒストグラムを比較したい場合が多いのに、作成の手間を考えると躊躇してしまいます。
Pythonであれば、matplotlibライブラリを使用して簡単にヒストグラムを作成できます。しかも、プログラムを一度作成すれば、再利用できるので、次回からは実行するだけで再現できます。
今回は、エクセルとPythonの両方でヒストグラムを作成してみます。ぜひビジネスツールとしてのPythonの凄さを理解していただければと思います。
本記事の目次
ヒストグラムの作成手順
どのような方法を用いるにしても、ヒストグラムを作成する手順は同じです。
ヒストグラムを作成するには、まずデータ値の範囲と個数に基づき「階級」を決めます。階級はデータ値を刻む区間なので、その区間にあるデータ数(度数)をカウントして「度数分布表」を作成します。度数分布表が出来上がれば、それを図化してヒストグラムを作成するだけです。
- データ値の範囲(最大値、最小値)と個数を調べる。
- 階級を決める。
- 度数分布表を作成する。
- ヒストグラムを作成する。
ここで、「階級の数」を決めるには、以下のスタージェス(Sturges)の公式が目安になります。ここで、log2は「底を2とする対数」で、nは「データ個数」になります。
数式は難しそうですが、エクセルでセルに「= 1 + LOG(nのセル番地,2)
」と入力するだけで計算できます。
サンプルデータ
サンプルには、以下のような仮想店舗の月間売上表を用います。
このサンプルのファイルは以下からダウンロードできます。
サンプルファイル(hist_sample_data.zip)のダウンロード
エクセルの準備
エクセルでヒストグラムを作成するには、2つの方法があります。1つはFREQUENCY関数やCOUNTIF関数を用いて自分で「度数分布表」を作成する方法です。もう一つは、Excelアドインの「分析ツール」を使う方法です。
今回は、手っ取り早くヒストグラムを作成できるExcelアドインによる方法で作成します。このアドインはデフォルトでは有効になっていないので、以下の手順でまず使えるようにします。
1.「Excelのオプション」画面を開く
「ファイル」メニューで開いた画面で、以下の 「オプション」をクリックします。
2.「Excelアドイン」の設定をクリック
左側のメニューから「アドイン」を選択すると、以下のような画面が表示されるので、プルダウンメニューを「Excelアドイン」にして「設定」ボタンをクリックします。
3.「分析ツール」の有効化
以下のような画面が表示されるので、「分析ツール」をチェックして「OK」をクリックします。
これで、「データ」タブ内のメニューに「分析 ▶ データ分析」が追加されます。
エクセルでヒストグラム作成
1. データ範囲と個数の確認
エクセルの関数(MAX()
、MIN()
、COUNTA()
)を用いて、以下のように最大値、最小値、個数を求めます。なお、COUNTA()
は空白でないセルの個数を返します。
2. 階級を決める
範囲(最大値 – 最小値)とスタージェスの公式の計算値を求めます。
この結果から、範囲は「約3,000」、スタージェスの公式による階級数の目安が「約6」なので、500程度で区切るのが良さそうです。そこで、すべてのデータをカバーできるように、以下のように階級を設定します。
3.ヒストグラムの作成
以下の「ヒストグラム」ダイアログが表示されるので、「入力範囲」に売上のデータ、「データ区間」に階級のセル範囲を指定します。「グラフ作成」をチェックしたら、OKをクリックします。
すると、新しいシートに以下のように、度数分布表とヒストグラムが作成されます。
このヒストグラムは縦棒グラフを使用しているだけなので、自由にカスタマイズできます。
ヒストグラムでは階級は連続しているので、グラフの棒と棒はピッタリと繋がっていないといけません。そのためには、棒の間隔をゼロにします。
以下のように棒の上で右クリックして、「データ系列の書式設定」を選択してください。
以下のようなダイアログが表示されるので、「系列のオプション」のメニューのなかの「要素の間隔」を0%にします。
これで、ヒストグラムは完成です。後は細かな体裁を調整します。以下のヒストグラムは棒の枠を黒色にしています。
Pythonの準備(ライブラリのインストール)
今回は以下の2つのライブラリを使用します。2つともpip
でインストールします。
- グラフ描画のためのmatplotlib
- エクセルファイルを扱うためのOpenPyXL
matplotlibのインストール
Pythonでヒストグラムを作成するには、matplotlib というスタンダードなグラフ描画ライブラリを使用します。インストールは、Windowsでは以下のコマンドを実行するだけです。
C:¥Users¥Ichiro> py -m pip install matplotlib
インストールを実行すると以下のように、最後に「Successfully installed 〜」とだけ表示されればインストール成功です。
py -m numpy.f2py
で呼び出せます。
matplotlibをインストールすると、以下のように依存関係にあるNumPyというライブラリも一緒にインストールされます。NumPyは数値計算を効率的に行うライブラリであり、matplotlibと一緒によく用いられます。今回は単純なケースなので、NumPyを利用しないでプログラミングします。
matplotlibは強力なグラフ描画ライブラリです
matplotlibはヒストグラムだけでなく、多種多様なグラフを描画できます。どのようなグラフを描けるかは以下のグラフギャラリーでご覧になれます。
OpenPyXLのインストール
OpenPyXLもインストールします。OpenPyXL はエクセルファイルをエクセルなしで読み書きできるライブラリです。以下のコマンドを実行すれば簡単にインストールできます。
C:¥Users¥Ichiro> py -m pip install openpyxl
Pythonでヒストグラム作成
PythonプログラムとExcelデータのファイルは、以下の構成で配置します。
# プログラムフォルダの中身
├ Files/
│ ├ 新宿店_201907.xlsx # ヒストグラムを作成するデータ
│
├ hist_sales.py # 今回作成するPytyonプログラム
Pythonプログラムのコードは以下のようになります(これでコード全部です)。
# hist_sales.py
from pathlib import Path
import math
import openpyxl
from matplotlib import pyplot
jp_font = "Yu Gothic" # 日本語フォント
pyplot.style.use("seaborn") # グラフスタイル
# エクセルファイルの読み込み
def xl_read(xl_path, cell_range, col_idx):
lst = []
wb = openpyxl.load_workbook(xl_path)
ws = wb["Sheet1"]
for r in ws[cell_range]:
lst.append(r[col_idx].value)
return lst
# ヒストグラム作成(売上)
def draw_hist_sales(sales_list, bin_edges):
pyplot.hist(sales_list, bins=bin_edges, edgecolor="black", linewidth=1.0)
pyplot.xlabel("売上/日 (千円)", fontname = jp_font)
pyplot.ylabel("度数", fontname = jp_font)
# データ読み込み
file_path = Path("./Files/新宿店_201907.xlsx")
data_list = xl_read(file_path, "B2:B32", 0)
# 最大値、最小値、個数の出力
data_max, data_min, data_n = max(data_list), min(data_list), len(data_list)
print("最大値:", data_max)
print("最小値:", data_min)
print("個数:", data_n)
print()
# 範囲、スタージェス
print("範囲:", data_max - data_min)
print("スタージェス:", 1 + math.log2(data_n))
print()
# 階級の入力
bin_min = int(input("階級の下限値="))
bin_max = int(input("階級の上限値="))
bin_w = int(input("階級の幅="))
# ヒストグラム作成
edges = range(bin_min, bin_max + bin_w, bin_w)
draw_hist_sales(data_list, edges)
# ヒストグラム出力
pyplot.show()
matplotlibライブラリでヒストグラムを作成するには、matplotlibからpyplot.hist()
を呼び出します。かっこ内にデータのリストを渡すだけでも作成できますが、今回はbins=
に階級の区切りを指定しています。
階級の区切りを指定するには、range()
を使います。今回は整数で指定しましたが、小数を使用する場合はNumPyのnumpy.arange()
を使用します。
軸ラベルなどに日本語を使う場合は、fontname=
にフォント名を指定します。今回は游ゴシック(Yu Gothic
)を用いましたが、他にイメリオ(Meiryo
)やMSゴシック(MS Gothic
)も利用できます(matplotlib3.1.0 + Windows10で確認)。
プログラムの実行
上記のプログラムをhist_sales.py
というファイルに保存して、Windowsではダブルクリックすれば以下のようなコマンドプロンプトが表示されます。
データ値の「範囲」と階級数の目安の「スタージェス公式の計算結果」が表示されるので、その値を参考に階級の上限、下限、幅を入力すると、以下のような画面にヒストグラムが表示されます。
画面の下にある保存ボタンをクリックすれば、PNGやJPEGの各種形式で画像ファイルとして保存できます。以下のようにpyplot.savefig()
を使えば、直接ファイルに保存することも可能です。
.....
# ヒストグラム出力
# pyplot.show()
# ヒストグラム保存
pyplot.savefig("hist_sales_shinjyuku.png")
最後に
今回のヒストグラムを作成する上で、Pythonを利用する大きな利点は以下の2つです。
- 「作業のドキュメント化」=作業を1つのプログラムファイル(.py)にまとめられる。
- 「エクセルからグラフの分離」=データはエクセル、グラフはPythonに作業を分担できる。
エクセルでは手順の多い作業ですが、Pythonではコードに記述できるため、プログラムを実行するだけで再現できます。修正する場合もコードを手直しして実行するだけです。このようにPythonの第一の利点は、作業をドキュメント化できることです。
さらなる利点は、エクセルをデータ専用ファイルにできることです。グラフが複数のエクセルファイルにある場合は、それぞれのファイルからWordやPowerPointにコピペするのは相当な労力です。Pythonを用いれば、グラフはまとめて画像ファイルに出力できるので、貼り付け作業を格段に省力化できます。データとグラフを分離するだけで、作業を効率的に行うことが可能になります。
このように、Pythonを普段の仕事に活かすことで、かなりの効用を得ることができます。慣れてくると仕事をプログラミングすることが楽しくなってきます。ぜひビジネスパーソンこそ、Pythonでプログラミングにチャレンジすることをおすすめします。