おうちだいすき

自宅警備員からデータサイエンティストになった人の雑記的ななにか。

Pythonで簡単!2行で描ける100%積み上げ棒グラフ(帯グラフ)

Python 100%積み上げ棒グラフ」「Python 帯グラフ」「Python barplot percentile」などいろんな条件で検索してもなかなか直感的に100%積み上げ棒グラフを描く事ができる記事に巡り逢う事がありませんでしたので、同じ様な悩みを持つ方を減らす目的で今回の記事を投稿します。
先日社内で共有したから記事の投稿が楽という話はないしょにしといてください。

答えは簡単。pandasのcrosstabで集計取ったdfでpandasのplot機能を使えばイッパツです。

import pandas as pd
import seaborn as sns

df = sns.load_dataset('titanic')

# pd.crosstabで瞬殺クロス集計
# 引数なしだとただのカウント
# normalize='index'で行ごとの割合で集計される
cross_survive1 = pd.crosstab(df['sex'], df['survived'], normalize='index')
# データフレーム形式なのでpandasのplotを使う
# stacked=Trueで積み上げ機能オン
cross_survive1.plot.bar(stacked=True)


f:id:hiro-i2:20181205232257p:plain

プロット
f:id:hiro-i2:20181205232401p:plain

複雑な集計もあら不思議

# 第二引数をリスト化するとさらに複雑なクロス集計が可能
cross_survive2 = pd.crosstab(df['class'], [df['sex'], df['survived']], normalize='index')
# 複雑な100%積み上げ棒グラフの描画が可能
cross_survive2.plot.bar(stacked=True)


f:id:hiro-i2:20181205232630p:plain

プロット
f:id:hiro-i2:20181205232726p:plain

凡例の位置にケチつけるのは勘弁してください>< 少ないタイプ量でザザッとEDAしたい時なんかには有効かと思います。

是非ご活用くださいませ