

データサイエンティストにとって、データの可視化は楽しみのひとつです。地味で、仕事時間の大半を使うデータの前処理が終わり、いよいよデータ分析の始まりである、データの可視化はわくわくします。
今回は、棒グラフと円グラフを描いていきましょう。
棒グラフはデータの個数を確認する場合と、平均値や標準偏差を表す場合があります。平均値や標準偏差を表す方法はあまり良くないので、今回は紹介しません。そもそもデータの分布が分からないのに、基本統計量を使ったグラフを作るべきではないためです。下の論文や過去の記事を参照して下さい。
【Python初心者が知らない】ドットプロットでデータを可視化する簡単な方法
円グラフはデータの割合を確認するために使われます。棒グラフや円グラフは一般的な方法なので、データ分析をしたことがなくても、よく目にすると思います。
Pythonの環境構築はAnacondaからJupyter Labを使っています。以下を参照して下さい。
【2021年最新】M1 mac でanacondaをインストールする方法
【2021年最新】WindowsでAnacondaをインストールする方法
必要なライブラリをインポート
import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline import japanize_matplotlib plt.style.use("ggplot") import warnings warnings.filterwarnings('ignore')
seabornのデータセットから、「tips」を読み込む
df = sns.load_dataset('tips') df
データの中身を確認する
- total_bill : 総支払額(食事代、税込み) (USドル)
- tip : チップ(USドル)
- sex : 性別
- smoker : 喫煙者か否か
- day : 曜日(木・金・土・日のいずれか)
- time : 食事の時間(昼食か夕食か)
- size : 人数
棒グラフ
plt.figure(figsize=(8, 6)) plt.bar(df["smoker"].value_counts().index, df["smoker"].value_counts()) plt.show()
棒ブラフが描けました。このグラフは喫煙者が何人か、非喫煙者が何人かを表しています。
少し、コードの意味を確認してみましょう。
print(df["smoker"].value_counts().index) print("===========================================================") print(df["smoker"].value_counts())
出力:
CategoricalIndex([‘No’, ‘Yes’], categories=[‘Yes’, ‘No’], ordered=False, dtype=’category’)
===========================================================
No 151
Yes 93
Name: smoker, dtype: int64
これは、棒グラフを描画させたコードがなにを意味するかを出力させています。
1行目は「No」と「Yes」のカテゴリー変数ということが分かります。
3行目は「No」の数が151、「Yes」の数が93ということです。
つまり、plt.bar()のカッコの中には、群分けするカテゴリー変数とその変数の個数を指定すれば棒グラフが描画さるということです。
もう少し、グラフをカスタマイズしてみましょう。
喫煙の有無別のチップの量をグラフ化
plt.figure(figsize=(8, 6)) plt.bar(df["smoker"].value_counts().index, df.groupby("smoker").sum()["tip"], width=0.5) plt.xlabel("喫煙", fontsize=20) plt.ylabel("チップ", fontsize=20) plt.title("喫煙の有無とチップの量", fontsize=30) plt.show()
このグラフは喫煙の有無別のチップの量を表しています。
横方向の棒グラフ
plt.figure(figsize=(8, 4)) plt.barh(df["sex"].value_counts().index, df.groupby("sex").sum()["tip"], height=0.3) plt.xlabel("チップ", fontsize=20) plt.ylabel("性別", fontsize=20) plt.title("性別とチップの量", fontsize=30) plt.show()
曜日別のチップ
plt.figure(figsize=(8, 6)) plt.bar(df["day"].value_counts().index, df.groupby("day").sum()["tip"], width=0.5, alpha=0.5) plt.xlabel("曜日", fontsize=20) plt.ylabel("チップ", fontsize=20) plt.title("曜日とチップの量", fontsize=30) plt.show()
seabornを使って、曜日別の客数をグラフ化する
fig=plt.figure(figsize=(8, 6)) sns.countplot(x="day", data=df) plt.show()
データの個数をグラフ化するのは、このseaborn.countplotが簡単ですね。
グラフをカスタマイズする
fig=plt.figure(figsize=(8, 6)) sns.countplot(y="day", data=df, palette="hls", order=["Sun","Thur","Fri","Sat"]) plt.show()
この辺は好みの問題ですかね。
棒グラフをさらに群分けする
fig=plt.figure(figsize=(8, 6)) sns.countplot(x="smoker", data=df,hue="sex", palette="hls") plt.show()
seabornを使えば、簡単に群分けできます。
円グラフ
plt.figure(figsize=(8, 8), facecolor='w') plt.pie(df['sex'].value_counts(), labels=df["sex"].value_counts().index) plt.show()
円グラフが出来上がりました。でも味気ないですね。
グラフをカスタマイズする
plt.figure(figsize=(8, 8), facecolor='w') plt.pie(df['sex'].value_counts(), labels=df["sex"].value_counts().index, autopct='%.1f%%', startangle=90, counterclock=False, textprops={'fontsize':20}, wedgeprops={'linewidth':3, 'edgecolor':'white'}) plt.axis('equal') plt.show()
配置を整えて、割合を%で表示しました。また、境界が分かりやすいように、白い線が入っているほうが見やすいですね。
曜日別の円グラフ
plt.figure(figsize=(8, 8), facecolor='w') plt.style.use('default') # グラフをスタイルをデフォルトに sns.set() # スタイル変更させるよ sns.set_style('whitegrid') # スタイルを'whitegrid'に指定 sns.set_palette('Set2') # グラフの配色を'Set2'に指定 plt.pie(df['day'].value_counts(), labels=df["day"].value_counts().index, autopct='%.1f%%', startangle=90, counterclock=False, textprops={'fontsize':20}, wedgeprops={'linewidth':3, 'edgecolor':'white'}) plt.axis('equal') plt.show()
グラフのスタイルや配色を変えてみました。なかなか良さそうですね。パステルカラーなので、色の自己主張がなく、情報のみが入ってきます。
ドーナツグラフ
plt.figure(figsize=(8, 8), facecolor='w') plt.pie(df['day'].value_counts(), labels=df["day"].value_counts().index, autopct='%.1f%%', counterclock=False, startangle=90, textprops={'fontsize':20}, wedgeprops={'linewidth':1.5, 'edgecolor':'white'}) plt.axis('equal') centre_circle = plt.Circle((0, 0), 0.65, fc='white') fig = plt.gcf() fig.gca().add_artist(centre_circle)
ちょっとコードが多いですね。
もう少し簡単なコードで描いてみましょう。
plt.figure(figsize=(8, 8), facecolor='w') plt.pie(df['day'].value_counts(), explode=(0.1, 0, 0, 0), labels=df["day"].value_counts().index, autopct='%1.1f%%', textprops={'fontsize':20}, counterclock=False, wedgeprops={'width':0.3, 'edgecolor':'w'}, startangle=90) plt.axis('equal') plt.show()
簡単に書くつもりが、コードを追加したものもあります。「Sat」を少しずらして、強調しました。これは、プレゼンの内容に従って、変更してください。
なんとなく、円グラフよりカッコいいですね。自己主張が強くないグラフで分かりやすいと思います。好きですね。


コメント