SPSS Modelerの棒グラフノードをPythonのmatplotlibやpandasのplotで書き換えてみます。
#0.データ
サンプルで利用するデータは以下です。
M_CD: マシンコード
UP_TIIME: 起動時間
POWER: 電力
TEMP: 温度
PRESSURE:圧力フラグ
ERR_CD: エラーコード
各マシンコードごとに起動時間にそって電力や温度の変化、圧力スイッチ、そしてエラーがあればそれが時系列に記録されています。
#1m.棒グラフ。Modeler版
まず、データ型ノードの尺度でPRESSUREをフラグ型、ERR_CDを名義型に設定します。Modelerはデータの尺度によって使える設定項目が変わり、間違った設定を防止しています。
一つ目のグラフとして、各ERR_CDの件数で棒グラフを作成します。
フィールドにERR_CDを選択して実行します。事前に集計をしなくていいので簡単です。
結果は以下です。
2つ目のグラフとして積み上げ棒グラフを作成します。
フィールドにERR_CDを選択することに加えて、実行します。オーバーレイの色でPRESSUREを設定します。
結果は以下です。ERR_CDの件数が棒グラフで出ることは同じなのですが、各ERR_CDでのPRESSUREのフラグの件数で色分けされます。
件数ではなく、各ERR_CDでのPRESSUREの件数の割合が表現されましたERR_CD=0や202でのPRESSURE1の割合が高いことがわかります。
#1p.棒グラフ。matplotlib,pandas版
matplotlibやpandasのplot()メソッドをつかって棒グラフを作成します。
まず、PRESSUREとERR_CDについてはデータ型をカテゴリ型に設定します。
df['PRESSURE'] = df['PRESSURE'].astype('category')
df['ERR_CD'] = df['ERR_CD'].astype('category')
print(df.dtypes)
M_CD int64
UP_TIME int64
POWER int64
TEMP int64
PRESSURE category
ERR_CD category
dtype: object
これでカテゴリ値が認識され、以下のようにアクセス可能になります。
df['ERR_CD'].cat.categories
Int64Index([0, 101, 202, 303], dtype='int64')
一つ目のグラフとして、各ERR_CDの件数で棒グラフを作成します。
以下のようにまずERR_CDごとの件数をdf.groupby('ERR_CD').size()で集計します。
dfErrcdGrp=df.groupby('ERR_CD').size()
dfErrcdGrp
ERR_CD
0 4589
101 531
202 549
303 133
dtype: int64
plt.barのxにindex,yにvalueを設定し、棒グラフを表示します。
plt.bar(dfErrcdGrp.index.astype('str'), dfErrcdGrp)
なお、indexはastype('str')で文字列型に変換しないと、カテゴリ値ではなく連続値扱いになるため、読みにくいグラフになります。
- 参考:matplotlib で棒グラフを描く – Python でデータサイエンス
同じグラフをpandasのplotメソッドをつかって書いてみます。pandasのplotメソッドはmatplotlibのラッパー関数ですが、pandasのDataframeやSeriesからmatplotlibよりも簡単にグラフを書くことができます。
以下だけで棒グラフを書くことができます。Seriesデータのindexをx、valueをyに自動的にセットしています。
dfErrcdGrp.plot.bar()
- 参考:pandasのplotメソッドでグラフを作成しデータを可視化
2つ目のグラフとして積み上げ棒グラフを作成します。これはmatplotlibで書くと大変なので、pandasのplotメソッドで書きます。
まず、crosstabでERR_CDとPRESSUREでクロス集計表を作ります。ModelerのようにPRESSURE=1から積み上げたいので、reindexで1,0の順序になるように入れ替えています。通常は0よりも1に注目したいことが多いので、Modelerと同様に1から積み上げたほうが見やすいグラフになります。
dfcross=pd.crosstab(df['ERR_CD'],df['PRESSURE'])
dfcross=dfcross.reindex(['1','0'],axis="columns")
dfcross
- 参考:Python - pandasクロス集計で行と列の位置を調整するにはどうすればよいですか?
後は積み上げを有効にするstacked=Trueをオプションで指定して表示します。
dfcross.plot.bar(stacked=True)
3つ目のグラフとして100%積み上げ棒グラフを作成します。
crosstabでnormalize='index'のオプションをつけてクロス集計表を作ります。
dfcross=pd.crosstab(df['ERR_CD'],df['PRESSURE'], normalize='index')
dfcross=dfcross.reindex(['1','0'],axis="columns")
dfcross
後はやはりstacked=Trueをオプションで指定して表示します。
dfcross.plot.bar(stacked=True)
- 参考:Pythonで簡単!2行で描ける100%積み上げ棒グラフ(帯グラフ) - おうちだいすき
#2. サンプル
サンプルは以下に置きました。
ストリーム
https://github.com/hkwd/200611Modeler2Python/blob/mastergraph/graph.str?raw=true
notebook
https://github.com/hkwd/200611Modeler2Python/blob/master/graph/graph.ipynb
データ
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond5n_e.csv
■テスト環境
Modeler 18.3
Windows 10 64bit
Python 3.8.5
pandas 1.0.5
#3. 参考情報
棒グラフの「作図」タブ - IBM Documentation