0
0

More than 1 year has passed since last update.

SPSS Modelerの棒グラフノードをPythonで書き換える

Last updated at Posted at 2021-11-18

SPSS Modelerの棒グラフノードをPythonのmatplotlibやpandasのplotで書き換えてみます。

0.データ

サンプルで利用するデータは以下です。
M_CD: マシンコード
UP_TIIME: 起動時間
POWER: 電力
TEMP: 温度
PRESSURE:圧力フラグ
ERR_CD: エラーコード

各マシンコードごとに起動時間にそって電力や温度の変化、圧力スイッチ、そしてエラーがあればそれが時系列に記録されています。

image.png

1m.棒グラフ。Modeler版

まず、データ型ノードの尺度でPRESSUREをフラグ型、ERR_CDを名義型に設定します。Modelerはデータの尺度によって使える設定項目が変わり、間違った設定を防止しています。

image.png

一つ目のグラフとして、各ERR_CDの件数で棒グラフを作成します。
フィールドにERR_CDを選択して実行します。事前に集計をしなくていいので簡単です。
image.png
結果は以下です。
image.png

2つ目のグラフとして積み上げ棒グラフを作成します。
フィールドにERR_CDを選択することに加えて、実行します。オーバーレイの色でPRESSUREを設定します。
image.png

結果は以下です。ERR_CDの件数が棒グラフで出ることは同じなのですが、各ERR_CDでのPRESSUREのフラグの件数で色分けされます。
image.png

3つ目のグラフとして100%積み上げ棒グラフを作成します。
image.png

件数ではなく、各ERR_CDでのPRESSUREの件数の割合が表現されましたERR_CD=0や202でのPRESSURE1の割合が高いことがわかります。
image.png

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)

image.png

なお、indexはastype('str')で文字列型に変換しないと、カテゴリ値ではなく連続値扱いになるため、読みにくいグラフになります。
image.png

  • 参考:matplotlib で棒グラフを描く – Python でデータサイエンス

同じグラフをpandasのplotメソッドをつかって書いてみます。pandasのplotメソッドはmatplotlibのラッパー関数ですが、pandasのDataframeやSeriesからmatplotlibよりも簡単にグラフを書くことができます。

以下だけで棒グラフを書くことができます。Seriesデータのindexをx、valueをyに自動的にセットしています。

dfErrcdGrp.plot.bar()

image.png

  • 参考: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

image.png

  • 参考:Python - pandasクロス集計で行と列の位置を調整するにはどうすればよいですか?

後は積み上げを有効にするstacked=Trueをオプションで指定して表示します。

dfcross.plot.bar(stacked=True)

image.png

3つ目のグラフとして100%積み上げ棒グラフを作成します。

crosstabでnormalize='index'のオプションをつけてクロス集計表を作ります。

dfcross=pd.crosstab(df['ERR_CD'],df['PRESSURE'], normalize='index')
dfcross=dfcross.reindex(['1','0'],axis="columns")
dfcross

image.png

後はやはりstacked=Trueをオプションで指定して表示します。

dfcross.plot.bar(stacked=True)

image.png

- 参考: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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0