【Python初心者】matplotlibで棒グラフと円グラフを描いてみよう(データの可視化)

スポンサーリンク
Python
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...
【2021年】ゼロから統計学を独学したい人が読むべき書籍10冊
データサイエンスについて興味があり、統計学を学びたいけど、どんな学習方法がいいか分からない 統計学を独学するために必要な書籍が知りたい 統計...

データサイエンティストにとって、データの可視化は楽しみのひとつです。地味で、仕事時間の大半を使うデータの前処理が終わり、いよいよデータ分析の始まりである、データの可視化はわくわくします。

今回は、棒グラフと円グラフを描いていきましょう。

棒グラフはデータの個数を確認する場合と、平均値や標準偏差を表す場合があります。平均値や標準偏差を表す方法はあまり良くないので、今回は紹介しません。そもそもデータの分布が分からないのに、基本統計量を使ったグラフを作るべきではないためです。下の論文や過去の記事を参照して下さい。

【Python初心者が知らない】ドットプロットでデータを可視化する簡単な方法

Beyond Bar and Line Graphs: Time for a New Data Presentation Paradigm
A systematic review of research articles reveals widespread poor practice in the presentation of continuous data. The authors recommend training for investigato...

円グラフはデータの割合を確認するために使われます。棒グラフや円グラフは一般的な方法なので、データ分析をしたことがなくても、よく目にすると思います。

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」を少しずらして、強調しました。これは、プレゼンの内容に従って、変更してください。

なんとなく、円グラフよりカッコいいですね。自己主張が強くないグラフで分かりやすいと思います。好きですね。

【Python初心者】matplotlibとseabornで折れ線グラフを描いてみよう(データの可視化)
折れ線グラフは主に時系列データを可視化する場合に用います。 今回はseabornにあるデータセットのflightsを使って、折れ線グラフを描いてみましょう。 Pythonの環境構築は下の過去記事を参照して下さい。 ...
【Python初心者】matplotlibとseabornで散布図を描いてみよう(データの可視化)
散布図とは、2つの変数の関係を表すために用いされる、データの可視化のひとつです。 X軸の変数、Y軸の変数に対応したデータがひとつの点で表されます。 X軸の変数とY軸の変数が関係ないのか(点がバラバラ) 関係しているのか(右上が...

コメント

タイトルとURLをコピーしました