こんにちは!
データサイエンティストのウマたん(@statistics1012)です!
この記事では、Pythonで頻出するデータ可視化のためのライブラリMatplotlibの使い方についてまとめていきたいと思います!
ぜひMatplotlibの基本についてしっかりおさえて扱えるようになっておきましょう!
以下の動画でも詳しく解説していますので参考にしてみてください!
またより実践的な内容に関しては当メディアが運営するオンラインスクール「スタアカ」で学べますのであわせてチェックしてみてください!
目次
Matplotlibの基本情報と利用方法
Pythonでよく使うライブラリの中でも必ず名前があがるMatplotlib!
Pandas、Numpy、MatplotlibあたりはPythonを扱う上で必須なライブラリです。
Matplotlibは2003年にリリースされ現在も開発がされているデータ分析の可視化に必須のライブラリ。
データ分析においては探索的データ分析(EDA)と呼ばれる工程が非常に重要で、その工程においてMatplotlibによる可視化は非常に便利です。
Jupyter labやJupyter notebookには最初から入っているので、そのままImportすることで利用することができます。
以下のように記述してあげましょう!
import matplotlib.pyplot as plt
%matplotlib inline
2行目はJupyter環境でグラフを描画する上で必要なおまじないであるとおぼえておきましょう。
タイタニックのデータセットを題材にMatplotlibを使って可視化!
まずはタイタニックのデータセットを題材にMatplotlibを使っていきましょう!
まずは各種ライブラリをインポートしていきます。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
今回Pandasも一緒にインポートしています。
Pandasはデータフレームの処理に非常に長けているのでPythonにおいて必ず使うと言っても過言ではありません。
また、今回seabornも一緒にインポートしていますがこちらはタイタニックのデータセットを使うためにインポートしています。
実はSeabornはMatplotlibよりも綺麗に詳細なグラフ描画・可視化を行うことができるのですが、今回は使いません。
続いてSeabornを使ってタイタニックのデータをインポートしていきましょう!
df = sns.load_dataset("titanic")
タイタニックのデータはタイタニック号事件の乗客の生死が様々な特徴量と共に入っている有名なデータセットです。
Matplotlibでヒストグラムを描画してみよう!
まずはヒストグラムを見ていきましょう!
plt.hist(df["fare"], bins=40, range=(0, 100))
plt.show()
このように1行記述するだけで以下のようにヒストグラムを描画することができます。
この時、binsで階級の細かさを調整することができます。またrangeでグラフの幅を調整することができます。
またMatplotlibではないのですが以下のように記述することでヒストグラムを描画することが可能で、さらに性別で層別して描画なんてこともできちゃいます。
df["fare"].hist(by=df["sex"])
plt.show()
Matplotlibで折れ線グラフを描画してみよう!
続いて通常の折れ線グラフを描画していきましょう!
今回のタイタニックデータは時系列データではないので折れ線グラフは意味がないのですが、練習として描画してみます。
plt.figure(figsize= (20,5))
plt.plot(df["fare"])
plt.title("test")
plt.xlabel("data_index")
plt.ylabel("fare")
plt.show()
plt.plot(df[“fare”])と1行だけで折れ線グラフを書くことができました。
plt.figure(figsize = (20,5))でグラフの大きさを調整することが可能です。
またタイトルやX軸、そしてY軸も記載することが可能です。
Matplotlibで複数のグラフを描画してみよう!
続いて複数のグラフを描画してみましょう!
複数のグラフを描画する方法はいくつかあるのですが、ここではsubplotsを使います。
fig, axes = plt.subplots(2, 2, figsize=(20,10))
このように記述してあげることで、2×2のグラフを描画する箱を作ってくれます。
その箱に対してそれぞれのグラフを描画していくことになります。
axes[0][0].hist(df["age"], bins=20)
axes[0][1].hist(df["fare"], bins=20)
axes[0][1].set_xlim(0,200)
axes[1][0].hist(df["sex"], bins=20)
axes[1][1].hist(df["pclass"], bins=20)
plt.show()
このように記述することでそれぞれの箱にグラフを描画していくことができるんです!
Matplotlibで棒グラフを描画してみよう!
続いてMatplotlibで棒グラフを描画していきましょう!
plt.bar(df.groupby("pclass").count().index, df.groupby("pclass").count()["survived"])
plt.show()
ちょっと複雑なコードですが、X軸にはpclassの3種類の質的変数を設定していて、Y軸には生き残った乗客の数を設定しています。
すなわちpclass別に生き残った乗客の数に差があるのかを見ているということになります。
Matplotlibで散布図を描画してみよう!
plt.scatter(df["fare"], df["age"], alpha=0.2)
plt.show()
散布図を描画するのにはscatterという関数を使います。
これだけで簡単にfareとageの散布図を描画することが可能なんです!
データコンペのデータを使ってMatplotlibで可視化をしてみよう!
続いてより実践的なデータ分析コンペのデータを使ってMatplotlibによる可視化を行っていきます。
Nishikaというデータコンペプラットフォームの中の「中古マンション価格」データを使います。
Nishikaに会員登録をして「中古マンション価格」データからtrain.zipをダウンロードしてください(※会員登録をしないとデータをダウンロードできません)。
train.zipを開くと中には以下のように複数のCSVファイルが入っています。
今回はこれらをデータフレームとして結合させるところからデータの確認・可視化をおこなっていきます。
そのためにMatplotlib以外のライブラリも必要になるのでImportしてあげましょう!
import glob
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
globはディレクトリに格納されたファイル名を抽出するのに便利なライブラリで、今回は複数のファイルがtrainフォルダ内にデータとして格納されているのでそれらのファイル名を抽出するのに必要になります。
現在trainというフォルダにファイルが入っているとすると、以下のように記述することでtrain内のファイル名を全て抽出することができます。
files = glob.glob("train/*.csv")
この時、*はワイルドカードと呼ばれ、このようにワイルドカードを指定することで全てのファイル名を該当させることができます。
filesを見てみると以下のようになっていることが分かります。
[‘train/40.csv’,
‘train/41.csv’,
‘train/43.csv’,
‘train/42.csv’,
‘train/46.csv’,
‘train/47.csv’,
‘train/45.csv’,
‘train/44.csv’,
‘train/37.csv’,
‘train/23.csv’,
‘train/22.csv’,
・・・
各ファイル名がリスト形式で格納されていることが分かります。
このデータフレームの中身を見てみると・・・
pd.read_csv(files[0])
以下のようになっていることが分かります。
各ファイルそれぞれの格納されているサンプル数は違いますが、全て同じカラムになっています。
そのため、これらのデータをfor文で回して結合させ1つのデータフレームにしていきましょう!
data_list = []
for file in files:
data_list.append(pd.read_csv(file, index_col=0))
df = pd.concat(data_list)
これにて使うデータの準備が完了です。
データが結構汚いので詳細は割愛しますが、前処理をおこなっていきます。
全てが欠損値になっているカラムを削除して、「最寄り駅・面積・建築年・取引時点」に関して変換をおこなっています。
def data_pre(df):
nonnull_list = []
for col in df.columns:
nonnull = df[col].count()
if nonnull == 0:
nonnull_list.append(col)
df = df.drop(nonnull_list, axis=1)
df = df.drop("市区町村名", axis=1)
df = df.drop("種類", axis=1)
dis = {
"30分?60分":45,
"1H?1H30":75,
"2H?":120,
"1H30?2H":105
}
df["最寄駅:距離(分)"] = df["最寄駅:距離(分)"].replace(dis).astype(float)
df["面積(㎡)"] = df["面積(㎡)"].replace("2000㎡以上", 2000).astype(float)
y_list = {}
for i in df["建築年"].value_counts().keys():
if "平成" in i:
num = float(i.split("平成")[1].split("年")[0])
year = 33 - num
if "令和" in i:
num = float(i.split("令和")[1].split("年")[0])
year = 3 - num
if "昭和" in i:
num = float(i.split("昭和")[1].split("年")[0])
year = 96 - num
y_list[i] = year
y_list["戦前"] = 76
df["建築年"] = df["建築年"].replace(y_list)
year = {
"年第1四半期": ".25",
"年第2四半期": ".50",
"年第3四半期": ".75",
"年第4四半期": ".99"
}
year_list = {}
for i in df["取引時点"].value_counts().keys():
for k, j in year.items():
if k in i:
year_rep = i.replace(k, j)
year_list[i] = year_rep
df["取引時点"] = df["取引時点"].replace(year_list).astype(float)
for col in ["都道府県名", "地区名", "最寄駅:名称", "間取り", "建物の構造", "用途", "今後の利用目的", "都市計画", "改装", "取引の事情等"]:
df[col] = df[col].astype("category")
return df
df = data_pre(df)
これでデータがだいぶ綺麗になりました!
Matplotlibでヒストグラムを描画
さてここからMatplotlibを使ったデータの可視化をおこなっていきます。
まずはヒストグラムを描画してみましょう!
plt.hist(df["最寄駅:距離(分)"], bins=20)
この時、グラフの上にデータが表示されてしまうので以下のように1行追加してあげることでグラフだけを描画させることが出来ます。
plt.hist(df["最寄駅:距離(分)"], bins=20)
plt.show()
また、binsのパラメータで階級の数を調整することができ、ここを増やすことで細かいヒストグラムを作成することができます。
例えば、binsを100にすると・・・
こんな感じで階級数が増えて細かいヒストグラムになっていることが分かります。
この時、rangeというパラメータでデータの範囲を指定してあげることができます。
plt.hist(df["最寄駅:距離(分)"], bins=20, range=(0,30))
plt.show()
x軸が0~30の範囲に絞られていることが分かります。
また、描画されるグラフの大きさを調節したい時は以下のようにあげます。
plt.figure(figsize = (20,10))
plt.hist(df["最寄駅:距離(分)"], bins=20, range=(0,30))
plt.show()
見づらい場合はこちらでグラフを調節してあげましょう!
Matplotlibで複数のグラフを描画してみよう!
続いて、先ほどタイタニックのデータでもやってみましたが、複数のグラフを描画してみましょう!
まずは、以下のようにグラフを描画する箱を作ってあげます。
fig, axes = plt.subplots(2, 2, figsize=(20,10))
この場合、最初の引数に2 , 2を指定しているので、2行×2列の箱が出来上がります。
そして、それぞれの箱に対してグラフを描画していきます。
fig, axes = plt.subplots(2, 2, figsize=(20,10))
axes[0][0].hist(df["最寄駅:距離(分)"], bins=20)
axes[0][1].hist(df["面積(㎡)"], bins=200)
axes[1][0].hist(df["建築年"], bins=20)
axes[1][1].hist(df["取引価格(総額)_log"], bins=20)
plt.show()
このように4つの箱に対してそれぞれのヒストグラムを表示させることが出来ます。
axes[0][0]であれば1行目1列目の左上の箱を指定しています。
複数プロットにおいて軸の範囲を指定する場合は以下のように記述してあげます。
fig, axes = plt.subplots(2, 2, figsize=(20,10))
axes[0][0].hist(df["最寄駅:距離(分)"], bins=20)
axes[0][1].hist(df["面積(㎡)"], bins=200)
axes[0][1].set_xlim(0,250)
axes[1][0].hist(df["建築年"], bins=20)
axes[1][1].hist(df["取引価格(総額)_log"], bins=20)
plt.show()
だいぶ見やすくなりました!axes[0][0].set_xlim(0,250)でx軸の範囲を指定しています。
Matplotlibで散布図を描画
続いて散布図を描画していきましょう!
散布図はある変数と変数の間の関係を見るのに非常に便利です。
例えば今回の例では中古マンションの価格に対して面積や最寄り駅からの距離は相関関係があるかどうかを見ることができます。
fig, axes = plt.subplots(3, 1, figsize=(10,10))
axes[0].scatter(df["最寄駅:距離(分)"], df["取引価格(総額)_log"], alpha=0.1)
axes[1].scatter(df["面積(㎡)"], df["取引価格(総額)_log"], alpha=0.1)
axes[2].scatter(df["建築年"], df["取引価格(総額)_log"], alpha=0.1)
plt.show()
それぞれの変数間の関係を散布図によって見ることができました!!
Matplotlibの使い方 まとめ
ここまででMatplotlibについてまとめてきました。
データを可視化する際にはMatplotlibをしっかりおさえておきましょう!
さらに綺麗で複雑なグラフの描画に興味のある方は是非SeabornやPlotlyについても学んでみましょう!
他にもPythonで出来ることはたくさんあります。
Pythonについて詳しく学びたい方は以下のUdemyの講座で僕自身が講師を務めていますので是非チェックしてみてください!
【実践】ビジネスケースとつなげてPythonで出来ること5つを学べる3日間集中コース
【オススメ度】 | |
---|---|
【講師】 | 僕! |
【時間】 | 3.5時間 |
【レベル】 | 初級~中級 |
手前味噌ですが、まずPythonについて理解してみるのにオススメなコースを僕自身が出しています!
Pythonで出来ることのうち以下の5つを網羅して学んでいきます。
・データ集計・加工・描画
・機械学習を使ったモデル構築
・Webスクレイピング
・APIの利用
・Webアプリケーション開発
データ集計・加工・描画と機械学習モデル構築に関してはKaggleというデータ分析コンペティションのWalmartの小売データを扱いながら学んでいきます。
WebスクレイピングとAPI利用とWebアプリケーション開発に関しては、楽天の在庫情報を取得してSlackに自動で通知するWebアプリケーションを作成して学んでいきます。
Pythonで何ができるのか知りたい!という方には一番はじめにまず受けていただきたいコースです!
Twitterアカウント(@statistics1012)にメンションいただければ1500円になる講師クーポンを発行いたします!
より実践的な内容に関しては当メディアが運営するオンラインスクール「スタアカ」で学べますのであわせてチェックしてみてください!
公式サイト:https://toukei-lab.com/achademy/
【価格】 | ライトプラン:1280円/月 プレミアムプラン:149,800円 |
---|---|
【オススメ度】 | |
【サポート体制】 | |
【受講形式】 | オンライン形式 |
【学習範囲】 | データサイエンスを網羅的に学ぶ 実践的なビジネスフレームワークを学ぶ SQLとPythonを組みあわせて実データを使った様々なワークを行う マーケティングの実行プラン策定 マーケティングとデータ分析の掛け合わせで集客マネタイズ |
データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「スタアカ」!!
他のスクールのカリキュラムはPythonでの機械学習実装だけに焦点が当たっているものが多く、実務に即した内容になっていないものが多いです。
そんな課題感に対して、実務で使うことの多いSQLや機械学習のビジネス導入プロセスの理解などもあわせて学べるボリューム満点のコースになっています!
ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったり・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践してもらったりする盛りだくさんの内容になってます!
・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析
・世界最大手小売企業のウォルマートの実データを用いた需要予測
・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定
・Webサイト構築してデータ基盤構築してWebマーケ×データ分析実践して稼ぐ
また、Pythonで出来ることを知りたい場合は以下の記事でまとめていますので是非チェックしてみてください!
また、Pythonの勉強法については以下の記事で詳しくまとめています!