エクセルより便利?Pythonで散布図の特異なデータを色分け表示させる方法

黒板に書いた手書きビジネスグラフ

 

別記事「気温が上がるとビールの出荷量は増えるのか?」で、気温とビールの出荷量の回帰分析を行った内容を紹介しましたが、その記事の中で、相関性の考察の過程で、次にようなグラフを示しました。

このグラフは、Pythonで作成したグラフとなります。

 

スーパドライの出荷数量の散布図ver3

 

ということで、今回の記事では、

  • Pythonで特異なデータを識別させるグラフ描画手法に興味がある
  • Pythonの実際のコードを写経してみたい

 

という人に向けて、ビールの出荷量と気温の相関を示す散布図において、特異な点をグラフ上で識別化させるために、私がコーディングしたPythonのコードを紹介していきます

 

 

エクセルより便利?Pythonで散布図の特異なデータを色分け表示させる方法

CSVの読み出しから基本的な散布図の出力まで

 

最初のステップとして、ライブラリのインポートおよびCSVの読み込みから、基本的な散布図を出力させるところまでを紹介していきます。

 

① ライブラリのインポート

 

今回使用するライブラリはpandasとmatplolibです。

import pandas as pd
import matplotlib.pyplot as plt

 

 

② CSVファイルの読み出し

 

はじめにCSVファイルの読み出しを行います。

日本語コードを含むShift_JISで保存したCSVファイルであるため、Shift_JISでエンコーディングオプションをつけます。

df = pd.read_csv("スーパードライ月別出荷数量気温.csv", encoding="shift-jis")
df.head()

 

CSVファイルの読み出しと同時に、データフレームの中身を確認します。

データフレームの先頭行の表示1

 



<付録>スーパードライ月別出荷数量気温.csv(クリックでテキストが展開されます。)


 

③ 散布図の出力

 

手始めに、X軸を”気温”、Y軸に”出荷数量”をとった散布図を出力させます。

グラフに添えるラベルも適当に設定します。

 

X = df["気温"]
Y = df["出荷数量"]

# 散布図+回帰直線
plt.figure(figsize=(12,6))
plt.scatter(X,Y, alpha=0.6, s=70)


plt.title("平均気温 vs スーパードライ出荷数量(2011年8月~2019年7月)",size=16)
plt.xlabel("東京都の月平均気温 (℃)",size=14)
plt.ylabel("出荷数量 [万箱]",size=14) #ひと箱=大瓶(633ml)×20本
plt.grid(True)
plt.show()

 

スーパドライの出荷数量の散布図ver1

 

matplotlibのscatterメソッドを用いることで、簡単にグラフを得ることが出来ました。

 

12月データの色分け

 

ここから、12月のデータをグラフ上で識別させるための、コーディング法について紹介していきます。

 

④ 12月データの識別化

 

データの中身に応じて散布図のプロットの色を分けるために、データフレームに新たな列を追加します。そして、12月のデータに対してのみ、識別化させるための変数を設定させる処理を行います。

 

#12月を特別な月として識別させる
dec_flag = df["月"] == "12月"

# "色"という名前で新しい列を作る
# 値にはすべて"steelblue"を入れておく
df["色"] = "steelblue"

# 12月のみ値を"darkblue"とする
# locはデータフレームに付随する機能
df.loc[dec_flag==True, "色"] = "darkred"

# 処理後のデータフレームの表示
df.head()

 

データフレームの先頭行の表示2

データフレームの中に新しく”色”の列が作られ、12月に”darkred”が設定されました。

 

⑤ 12月を色分けした散布図の出力

 

# 散布図を色分けして表示
# cは色の指定、alphaは透明度、sは点の大きさ
plt.figure(figsize=(12,6)) # グラフサイズを1200x600に指定(デフォルトは640x480)
plt.scatter(df["気温"], df["出荷数量"], c=df["色"] ,alpha=0.6, s=70, label="出荷数量")
plt.title("平均気温 vs スーパードライ出荷数量(2011年8月~2019年7月)",size=16)
plt.xlabel("東京都の月平均気温 (℃)",size=14)
plt.ylabel("出荷数量 [万箱]",size=14) #ひと箱=大瓶(633ml)×20本

plt.legend(loc='upper right',fontsize=12) #凡例表示
plt.grid(True)
plt.show()

 

スーパドライの出荷数量の散布図ver2

 

次のように、12月のデータをダークレッドで表示させたことで、散布図左上に位置する「平均気温が低いのにビールの出荷量が多い月」は、12月であることを確認することが出来ました。

 

しかし、このグラフには足りないものが1つあります。

それは、ダークレッドのプロット(点)とスチールブルーのプロットがそれぞれ何を示しているのか、グラフを見ただけでは読み取れないことです

 

データフレームの複製によるデータラベルの識別化

 

最後に、プロットの色が何を示しているのかをグラフのなかで識別できるようにするための処理を行っていきます。

 

⑥ 12月データを別のデータフレーム化

 

12月用のデータフレームと、12月以外のデータフレームをそれぞれ新たに用意します。

 

#データベースから12月だけを抽出する
df_dec = df[df["月"].isin(["12月"])]
#データベースから12月を抜く
df_no_dec = df.copy()
df_no_dec.drop(df_no_dec.index[df_no_dec["月"] == '12月'], inplace=True)

 

⑦ 散布図

 

そして、新たに用意した2つのデータフレームを、それぞれ散布図形式で描きます。

この際に、2つの散布図のラベルに、それぞれデータを識別できる説明を記述させます。

 

# 散布図を色分けして表示
# cは色の指定、alphaは透明度、sは点の大きさ
plt.figure(figsize=(12,6)) # グラフサイズを1200x600に指定(デフォルトは640x480)
plt.scatter(df_dec["気温"], df_dec["出荷数量"], c=df_dec["色"] ,alpha=0.6, s=70, label="出荷数量(12月のみ)")
plt.scatter(df_no_dec["気温"],df_no_dec["出荷数量"],c=df_no_dec["色"],alpha=0.6, s=70, label="出荷数量(12月含まない)")

plt.title("平均気温 vs スーパードライ出荷数量(2011年8月~2019年7月)",size=16)
plt.xlabel("東京都の月平均気温 (℃)",size=14)
plt.ylabel("出荷数量 [万箱]",size=14) #ひと箱=大瓶(633ml)×20本

plt.legend(loc='upper right',fontsize=12) #凡例表示
plt.grid(True)
plt.show()

 

スーパドライの出荷数量の散布図ver3

 

このように、2色で色分けされた散布図は、12月の出荷数量データと、12月以外の出荷数量データであることを、グラフの中だけで表現することが出来ました

 
 

まとめ

 

今回の記事は、ビールの出荷量と気温の相関を示す散布図において、特異な点をグラフ上で識別化させるために、私がコーディングしたPythonのコードを紹介していきました。

 

何かのグラフを作成する場合、多くのビジネスパーソンはエクセルを選択することと思います。

一方で、Pythonにはグラフ描画のためのライブラリが提供されており、エクセルでグラフを作成するよりも、効率的に表現の自由度が高いグラフを作成することが出来るようになります。

グラフ作成を含めた資料作成のデザイン力を高めることは、ビジネスパーソンが習得しておきたいスキルのひとつです。

そのため、データサイエンスに興味がないビジネスパーソンであっても、Pythonを習得するメリットはあるのかもしれません。

 

じゃあ。

 

関連記事

気温が上がるとビールの出荷量は増えるのか?

PythonでWebスクレイピング結果を自動でLINEに送る方法 ~写経用コードあり~

[article-banner-2]

ABOUTこの記事をかいた人

パラレルキャリア研究会創設メンバー 岩手県出身。東北大学工学部卒、同大学院工学研究科修了。半導体メーカーに入社後、エンジニアとして半導体製品の企画・開発に従事。30代後半に軸ずらし転職でキャリアをシフト。本業の傍ら独学でPython&統計学を学習中。1児のパパ。趣味は日本酒、ロードバイク。中小企業診断士、SAKE DIPLOMA。