解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python の matplotlib の描画速度を計測した



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で色々な分析結果をグラフにしたいのですが、 matplotlib の描画スピードがとても遅かったので、どんな使い方をすれば良いのか検証しました。



動作環境


Windows 7
・winpython 64bit 3.4.4



入力データ

読み込むデータは Excel で作成しました。

Excel の 10,48,576 行を全て使いました。

Data1 〜 Data5 は以下の関係性を持たせています。

Data1 = No. / 10,000
Data2 = cos(radians(Data1))
Data3 = sin(radians(Data1))
Data4 = 2*cos(radians(Data1))
Data5 = 2*sin(radians(Data1))

そして、 Excel から csv 出力したファイルを作成しました。

図1 入力データ



プログラム

2つのソースコードを準備しました。

ソースコード
dask で csv ファイルを読み込んで matplotlib でグラフを描画するプログラム

ソースコード
dask で csv ファイルを読み込んで dask.dataframe を numpy 配列に変換してから matplotlib でグラフを描画するプログラム

2つのソースコードは matplotlib に入れる値が dask.dataframe か numpy 配列かの違いがあります。

ソースコード

dask で csv ファイルを読み込んで matplotlib でグラフを描画するプログラム


###############################################################################
# グラフの描画時間を計測するプログラム
###############################################################################
# インポート
from time import time
import dask.dataframe as dd
import matplotlib.pyplot as plt
 
# 時間計測関数
def calc_time(func):
    start = time()
    r = func()
    return{'value':r, 'time':time()-start}
 
# 表題行 + 1,048,575 行のデータ
file_dir  = 'C:\\Users\\UserName\\Desktop\\'
file_name = 'driven_test'
 
# ファイル読み込み
ddf = calc_time(lambda:dd.read_csv(file_dir + file_name + '.csv', header=0,
                                   names=('No.', 'Date', 'Data1', 'Data2', 'Data3', 'Data4', 'Data5')))
print('データ読込時間 : ' + str(ddf['time']) + ' sec')
all_time = ddf['time']
 
# グラフの描画
graph = calc_time(lambda:plt.plot(ddf['value']['No.'], ddf['value']['Data2']))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ddf['value']['No.'], ddf['value']['Data3']))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ddf['value']['No.'], ddf['value']['Data4']))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ddf['value']['No.'], ddf['value']['Data5']))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
# 画像の出力
output = calc_time(lambda:plt.savefig(file_dir + file_name + '0.0.jpg', bbox_unches="tight"))
print('グラフ出力時間 : ' + str(output['time']) + ' sec')
all_time += output['time']
 
print('合計時間 : ' + str(all_time) + ' sec')



ソースコード

dask で csv ファイルを読み込んで dask.dataframe を numpy 配列に変換してから matplotlib でグラフを描画するプログラム


###############################################################################
# グラフの描画時間を計測するプログラム
###############################################################################
# インポート
from time import time
import dask.dataframe as dd
import numpy as np
import matplotlib.pyplot as plt
 
# 時間計測関数
def calc_time(func):
    start = time()
    r = func()
    return{'value':r, 'time':time()-start}
 
# 表題行 + 1,048,575 行のデータ
file_dir  = 'C:\\Users\\UserName\\Desktop\\'
file_name = 'driven_test'
 
# ファイル読み込み
ddf = calc_time(lambda:dd.read_csv(file_dir + file_name + '.csv', header=0,
                                   names=('No.', 'Date', 'Data1', 'Data2', 'Data3', 'Data4', 'Data5')))
print('データ読込時間 : ' + str(ddf['time']) + ' sec')
all_time = ddf['time']
 
ex = calc_time(lambda:np.array(ddf['value']))
print('データ変換時間 : ' + str(ex['time']) + ' sec')
all_time += ex['time']
 
graph = calc_time(lambda:plt.plot(ex['value'][0:,0], ex['value'][0:,3]))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ex['value'][0:,0], ex['value'][0:,4]))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ex['value'][0:,0], ex['value'][0:,5]))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
graph = calc_time(lambda:plt.plot(ex['value'][0:,0], ex['value'][0:,6]))
print('グラフ作成時間 : ' + str(graph['time']) + ' sec')
all_time += graph['time']
 
# 画像の出力
output = calc_time(lambda:plt.savefig(file_dir + file_name + '0.1.jpg', bbox_unches="tight"))
print('グラフ出力時間 : ' + str(output['time']) + ' sec')
all_time += output['time']
 
print('合計時間 : ' + str(all_time) + ' sec')



結果

numpy 配列に変換する処理に時間をさいても dask で csv ファイルを読み込んで dask.dataframe を numpy 配列に変換してから matplotlib でグラフを描画するプログラムのほうが速い結果となりました。

値の処理計算も numpy 配列が速いですし、当たり前といえば当たり前の結果でした。

作成したグラフももちろん同じモノが出来上がりました。

ソースコード①の結果


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/graph0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
データ読込時間 : 0.01200103759765625 sec
グラフ作成時間 : 3.650207996368408 sec
グラフ作成時間 : 3.7332139015197754 sec
グラフ作成時間 : 3.2911880016326904 sec
グラフ作成時間 : 3.101177930831909 sec
グラフ出力時間 : 0.8210470676422119 sec
合計時間 : 14.608835935592651 sec


図2 ソースコード①のグラフ


ソースコード②の結果


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/graph0.1.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
データ読込時間 : 0.01100015640258789 sec
データ変換時間 : 1.9661130905151367 sec
グラフ作成時間 : 0.18301010131835938 sec
グラフ作成時間 : 0.13800787925720215 sec
グラフ作成時間 : 0.1370079517364502 sec
グラフ作成時間 : 0.14200782775878906 sec
グラフ出力時間 : 0.4520261287689209 sec
合計時間 : 3.0291731357574463 sec


図3 ソースコード②のグラフ



コメント

本来であればデータの読み込みからグラフを描画する間にデータの加工や分析処理が入ると思います。

なので、データの加工や分析処理を考えるとデータは読み込んだら numpy 配列に変換して持っておくのが良さそうだということが分かりました。



以上

Python で Excel ファイルと csv ファイルを読み込む



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析をするにあたって、データの読み込みは避けて通れません。
データの読み込みはやはり速いに越したことはありません。

そこで、 pandas と dask の使い方と読み込み速度を比べてみました。



動作環境


Windows 7
・winpython 64bit 3.4.4



入力データ

読み込むデータは Excel で作成しました。

Excel の 10,48,576 行を全て使いました。

Data1 〜 Data4 は乱数で Data5 は Data1 〜 Data4 の合計です。

また、 Excel から csv 出力したファイルも作成しました。

図1 作成した入力データ



プログラム

ソースコード


###############################################################################
# Excel ファイルと csv ファイルを読み込み時間を計測するプログラム
###############################################################################
# インポート
from time import time
import pandas as pd
import dask.dataframe as dd
 
# 時間計測関数
def calc_time(func):
    start = time()
    r = func()
    return{'value':r, 'time':time()-start}
 
# 表題行 + 1,048,575 行のデータ
file_dir  = 'C:\\Users\\UserName\\Desktop\\'
file_name = 'driven_test'
 
csv = calc_time(lambda:pd.read_csv(file_dir + file_name + '.csv'))
print( 'pd.read_csv で読込にかかった時間 : ' + str(csv['time']) + ' sec')
 
xls = calc_time(lambda:pd.ExcelFile(file_dir + file_name + '.xlsx', encoding='utf-8'))
print( 'pd.ExcelFile で読込にかかった時間 : ' + str(xls['time']) + ' sec')
 
csv = calc_time(lambda:dd.read_csv(file_dir + file_name + '.csv', header=0))
print( 'dd.read_csv で読込にかかった時間 : ' + str(csv['time']) + ' sec')



結果

3 回分の実行結果を表示します。

100万行程度であれば、 csv ファイルは pandas でも実用に耐えると思います。

Excel をそのまま読み込むのはやめたほうがいいですね。

dask が噂通りものすごく速いという結果になりました。

1,000 万行、 1 億行といったデータを扱いたいなら dask ですね!


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.8201038837432861 sec
pd.ExcelFile で読込にかかった時間 : 101.72981905937195 sec
dd.read_csv で読込にかかった時間 : 0.010999917984008789 sec
 
In [2]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.755100965499878 sec
pd.ExcelFile で読込にかかった時間 : 102.36885499954224 sec
dd.read_csv で読込にかかった時間 : 0.009999990463256836 sec
 
In [3]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/split_file0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
pd.read_csv で読込にかかった時間 : 1.801103115081787 sec
pd.ExcelFile で読込にかかった時間 : 100.0787239074707 sec
dd.read_csv で読込にかかった時間 : 0.009999990463256836 sec



コメント

dask の速さは異常ですね。

読み込みがこれだけ速いと、処理は値の計算とグラフ出力の時間で決まる様なものですね。

グラフの出力の高速化について調べてみたくなりました。



以上

Python を exe ファイルに変換する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方、ファイル選択ダイアログの使い方を調べてきました。
ここで、気分転換に exe ファイルに変換してみたいと思います。

ファイル選択ダイアログでファイルを選択して、選択されたファイルのパスをメッセージボックスで表示する exe ファイルを作成します。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

以下の2つのソースコードは共に下記の【保存ディレクトリ】に保存しました。
ファイルもそれぞれ書いておきます。

【保存ディレクトリ】
C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3

exe ファイルソースコード : GUI0.py
変換実行ソースコード : GUI_Ex0.0.py

下の『結果』で今回発生したエラーについても、まとめていますが、ファイル名でには要注意です。

exe ファイル ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    fTyp = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    fTyp = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    fTyp = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    fTyp = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    fTyp = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    fTyp = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    fTyp = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
#initDir = os.path.abspath(os.path.dirname(__file__))
initDir = 'C:\\'
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, '処理ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = fTyp, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = fTyp, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



変換実行ソースコード


import sys
from cx_Freeze import setup, Executable
 
base = None
 
if sys.platform == 'win32':
    base = 'Win32GUI'
 
exe = Executable(script='GUI0.py', base=base)
 
setup(name='GUI',
      version='0.1',
      description='converter',
      executables=[exe])



コマンドプロンプト

図1 コマンドプロンプト



結果

上の exe ファイルソースコードを最初は『 GUI0.0.py 』として保存していました。 exe ファイルは生成できたのですが、 exe ファイル実行時に図2 のエラーメッセージが表示されました。

図2 エラーメッセージ


なんのことかよくわかりませんが、『 GUI0.0.py 』というファイルが悪さをしている感じがしたので、exe ファイルソースコードを『 GUI0.py 』というファイル名で保存し直して、再度 exe ファイルに変換しました。

すると、 exe ファイルは生成できたのですが、 exe ファイル実行時に図3 のエラーメッセージが表示されました。

図3 エラーメッセージ


ファイル選択ダイアログで、最初に表示するディレクトリ設定をスクリプトファイルがあるディレクトリとしていたのですが、 exe ファイルに変換すると取得できなくなるみたいなので、 C ドライブ直下を指定する様にソースコードを変更して再度 exe ファイルに変換しました。
すると、正常に動作する様になりました。


exe ファイルは上の2つのソースコードを保存したディレクトリ『 C:\WinPython-64bit-3.4.4.6Qt5\settings\.spyder-py3 』に新しく『 build 』というフォルダができます。その中に exe ファイルと付帯ファイルが出来ています。

起動スピード、実行速度共に普通なスピードでした。

まぁ、簡単なファイル選択のみのプログラムなので当たり前ですが…



コメント

exe ファイルに変換出来ると自動化や効率化に大きく影響してくると思います。

今のプログラムのままでは使い道がないので、もうちょっと実用的なクラス、関数を作って組み込みたいです。



以上

Python で ファイル選択ダイアログを使う



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べました。
まだ、基本的なグラフの書き方だけですが…

今回は ファイル選択ダイアログを使ってみます。

グラフの描き方は少しわかってきたので、グラフにする値の読み込みに少し力を入れたいと思います。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    extension = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    extension = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    extension = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    extension = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    extension = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    extension = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    extension = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
initDir = os.path.abspath(os.path.dirname(__file__))
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, 'ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = extension, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = extension, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



結果

意外と楽でした。

図1 は実行して表示されたファイル選択ダイアログです。

図1 ファイル選択ダイアログ


図2 は『 dir.txt 』というファイルを選択した時の表示です。

図2 ファイル選択結果表示


図3 は『 dir.txt 』と『 dir1.txt 』いうファイルを選択した時の表示です。

図3 複数ファイル選択結果表示



コメント

グラフ出力のコードと合わせれば、アプリケーションっぽくなると思います。

これをテンプレートみたいに使いまわして、ソースコードの『 # ファイル処理プログラム 』よりも下の行に処理プログラムを入れれば、簡単にいろんなファイルの処理プログラムが作れます。

単一ファイル選択の時は下の様にファイルパスが文字列として取得できます。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
C:/Users/UserName/Desktop/dir.txt
 
complete!!



また、複数ファイル選択の時は下の様にファイルパスが配列として取得できます。

In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
['C:/Users/UserName/Desktop/dir1.txt', 'C:/Users/UserName/Desktop/dir.txt']
 
complete!!



以上

Python でパレート図を描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回はパレート図の描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# パレート図を作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 100, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# グラフの作成 ------------------------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント ---------------------------------------------------------------
data_num = len(sample_df)
 
accum_to_plot = [0] + sample_df["accum_percent"].tolist()
 
percent_labels = [str(i) + "%" for i in np.arange(0, 100 + 1, 10)]
 
# 棒グラフのプロット ---------------------------------------------------------------
ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
ax1.tick_params(axis="x", which="major", direction="in")
ax1.set_ylim([0, sum(sample_df["data"])])
 
# 横軸に名前をつける -------------------------------------------------------------
ax1.set_xlabel("label")
 
# 縦軸に名前をつける -------------------------------------------------------------
ax1.set_ylabel("counts")
 
# 第 2 軸のグラフの作成 ----------------------------------------------------------
ax2 = ax1.twinx()
 
# 押せ連グラフのプロット ------------------------------------------------------------
ax2.set_xticks(range(data_num + 1))
ax2.plot(range(data_num + 1), accum_to_plot, c="red", marker="o")
ax2.set_xticklabels([])
ax2.set_xlim([0,data_num])
ax2.set_ylim([0, 100])
ax2.set_yticks(np.arange(0, 100 + 1, 10))
ax2.set_yticklabels(percent_labels)
ax2.grid(True, which='both', axis='y')
 
# グラフタイトル設定 ---------------------------------------------------------------
ax1.set_title("PARETO_CHART")
 
# パーセンテージライン -------------------------------------------------------------
ax2.hlines(y=80, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=85, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=90, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
ax2.hlines(y=95, xmin=-1, xmax=data_num, lw=.9, color='orange', linestyle='--')
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Pareto_Chart.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

赤線は 100% 積み上げの折れ線グラフで、黄色は 80% 、 85% 、 90% 、 95% 線です。

図2 パレート図



コメント

パレート図って分析してる感じが出ますね。

全体の 80% を超えるデータなどがひと目で分かるようになりました。



以上

Python で棒グラフを描く



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べ出しました。

今回は棒グラフの描き方をまとめました。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# 棒グラフを作成するプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
 
# グラフの値の準備 ---------------------------------------------------------------
sample_label = ["a", "b", "c", "d", "e", "f", "g"]
np.random.seed(seed=42)
sample_data = np.random.randint(0, 180, size=7)
 
# グラフの値の整形 ---------------------------------------------------------------
sample_df = pd.DataFrame({"label": sample_label, "data":sample_data}, columns=["label", "data"])
 
# グラフの値のソート ---------------------------------------------------------------
sample_df = sample_df.sort_values(by="data", ascending=False)
 
# グラフの値を項目毎に加算する -----------------------------------------------------
sample_df["accum"] = np.cumsum(sample_df["data"])
 
# 全体に対する項目の割合を計算する -------------------------------------------------
sample_df["accum_percent"] = sample_df["accum"] / sum(sample_df["data"]) * 100
 
# 全体に対する項目の割合を計算する -------------------------------------------------
fig, ax1 = plt.subplots(figsize=(6,4))
 
# データ数のカウント----------------------------------------------------------------
data_num = len(sample_df)
 
# 棒グラフの棒の設定--------------------------------------------------------------
bar = 2 # 1:棒グラフの棒幅が広い 2:棒グラフの棒幅が狭い
if bar == 1:
    ax1.bar(range(1, data_num + 1), sample_df["data"], align="edge", width=-1, edgecolor='k')
    ax1.set_xticks([0.5 + i for i in range(data_num)], minor=True)
else:
    ax1.bar(range(1, data_num + 1), sample_df["data"], width=-0.5, edgecolor='k')
    ax1.set_xticks([1 + i for i in range(data_num)], minor=True)
 
# 自動で割り当てられる横軸ラベルを消去------------------------------------------------
ax1.set_xticklabels([])
 
# 横軸ラベルに "label" を設定-----------------------------------------------------
ax1.set_xticklabels(sample_df["label"].tolist(), minor=True)
 
# 横軸に名前をつける
ax1.set_xlabel("label")
 
# 縦軸に名前をつける
ax1.set_ylabel("counts")
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Bar_Graph.jpg", bbox_inches="tight")



結果

データはシード値を固定した乱数です。

棒グラフはデータが大きい順に左から並べ替えられています。

図2 棒グラフ



コメント

この棒グラフはランキングを整理する場合は良さそうですね。



以上

Python で折れ線グラフの足し算



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思い立ち、まず最初にグラフが思い浮かびました。

かなり安易な発想ですが、こういうのは蓄積していくことが大切なので、まとめておきます。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# グラフの足し算をするプログラム
###############################################################################
import matplotlib.pyplot as plt
import numpy as np
 
# グラフの値の準備 ---------------------------------------------------------------
x  = [100, 200, 300, 400, 500, 600]
y1 = [ 10,  20,  30,  50,  80, 130]
y2 = [ 10,  15,  30,  45,  60,  75]
 
# グラフの値の出力----------------------------------------------------------------
plt.plot(x, y1, marker="o", color="red",  linestyle="--")
plt.plot(x, y2, marker="v", color="blue", linestyle=":")
 
# グラフの y1, y2 を要素毎に足す --------------------------------------------------
y11 = np.array(y1)
y22 = np.array(y2)
y = y11 + y22
 
# y の出力 ---------------------------------------------------------------------
plt.plot(x, y, marker="x", markersize=8, color="green", linestyle="-.")
 
# グラフの保存 -------------------------------------------------------------------
plt.savefig("C:\\WinPython-64bit-3.4.4.6Qt5\\settings\\.spyder-py3\\Addtition_Graph.jpg", bbox_inches="tight")
 
# グラフの表示 -------------------------------------------------------------------
plt.show()
 
# linestyle の種類
# '-'  '実線'
# '--' '破線'
# '-.' '一点鎖線'
# ':'  '点線'
 
# marker の種類
# '.' 'point'
# ',' 'pixel'
# 'o' 'circle'
# 'v' 'triangle_down'
# '^' 'triangle_up'
# '<' 'triangle_left'
# '>' 'triangle_right'
# '1' 'tri_down'
# '2' 'tri_up'
# '3' 'tri_left'
# '4' 'tri_right'
# '8' 'octagon'
# 's' 'square'
# 'p' 'pentagon'
# '*' 'star'
# 'h' 'hexagon1'
# 'H' 'hexagon2'
# '+' 'plus'
# 'x' 'x'
# 'D' 'diamond'
# 'd' 'thin_diamond'
# '|' 'vline'
# '_' 'hline'



結果

赤線がソースコードの中の y1 で青線がソースコードの中の y2 です。

緑線が y1 と y2 を足し算した y です。

図2 折れ線グラフの足し算



コメント

Excel ファイルや CSV ファイルを読み込んで大量のグラフを出力できそうですね。

もうちょっと実用性のあるグラフの書き方も調べたいです。



以上