# 実データで学ぶMatplotlibとSeabornの違いと描画方法！

> 当サイト【スタビジ】の本記事では、Pythonでの可視化に非常によく利用されるMatplotlibとSeabornの違いについて見ていきます！それぞれの違いを理解するためにも実データを用いて可視化を行っていきますよ！MatplotlibとSeabornを使いこなしてデータの可視化を進めよう！

- URL: https://toukei-lab.com/python-matplotlib
- 公開: 2022.11.29 / 更新: 2026.10.28
- サイト: スタビジ（https://toukei-lab.com）

:::talk{who="umatan"}
本記事では、Pythonでの可視化に非常によく利用されるMatplotlibとSeabornの違いについて見ていきます！それぞれの違いを理解するためにも実データを用いて可視化を行っていきますよ！
:::

こんにちは！

データサイエンティストのウマたん([@statistics1012](https://twitter.com/statistics1012?lang=ja))です！

この記事では、Pythonで頻出するデータ可視化のためのライブラリ[Matplotlib](/matplotlib)と[Seaborn](/seaborn)の違いについてまとめていきたいと思います！

:::talk{who="robotan"}
データ可視化の工程はデータ分析において非常に重要だよねー！
:::

:::talk{who="umatan"}
そうなんだよー！データ可視化を侮ってはいけないよ！ぜひMatplotlibやSeabornをしっかり使えるようになっておこう！
:::

ぜひMatplotlibとSeabornの基本についてしっかりおさえて扱えるようになっておきましょう！

## MatplotlibとSeabornの違い

![Matplotlib](/wp-content/uploads/2021/03/6327ab985020bff8f94315941754bb98.png)

まずは、MatplotlibとSeabornの違いについて見ていきましょう！

端的に言うと、<mark>SeabornはMatplotlibの使い勝手を良くしたライブラリ</mark>です。

Pythonでよく使うライブラリの中でも必ず名前があがる[Matplotlib](/matplotlib)！

[Pandas](/python-pandas)、[Numpy](/numpy)、[Matplotlib](/matplotlib)あたりはPythonを扱う上で必須なライブラリですよねー。

Matplotlibは2003年にリリースされ現在も開発がされているデータ分析の可視化に必須のライブラリ。

データ分析においては[探索的データ分析（EDA）](/eda)と呼ばれる工程が非常に重要で、その工程においてMatplotlibによる可視化は非常に便利です。

Jupyter labやJupyter notebookには最初から入っているので、そのままImportすることで利用することができます。

以下のように記述してあげましょう！

```python
import matplotlib.pyplot as plt
%matplotlib inline
```

2行目は[Jupyter環境](/python-how)でグラフを描画する上で必要なおまじないであるとおぼえておきましょう。

ただMatplotlibは<mark>若干描画がダサい</mark>という弱点があります。

R言語のggplot2などと比べるとどうしても見劣りしてしまうんですね。

そこで登場するのが[Seaborn](/seaborn)！

![Seaborn](/wp-content/uploads/2021/04/Seaborn.png)

**Seabornの内部ではMatplotlibが動いている**のですが、Seabornを使うことで<mark>よりきれいなグラフを描画することが可能</mark>なんです！

ただグラフの調整の仕方やルールはMatplotlibと一緒なので、Matplotlibと同時にSeabornを使えるようになりデータの可視化をおこなっていきましょう！

Seabornを使うにはMatplotlibとあわせて以下のようにSeabornのライブラリをインポートしていきます。

```python
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
%matplotlib inline
```

この時、sns.set()と記載しないとSeabornの描画が反映されないので注意しましょう！

## Matplotlib＆Seabornで可視化をする上でのデータ準備

![Charts](/wp-content/uploads/2020/12/Charts-amico-min-e1617510278389-1024x620.png)

それでは早速MatplotlibやSeabornを使って可視化をおこなっていくための実データの準備をおこなっていきましょう！

[DataDojo](https://data-dojo.org/competitions/0aedc9c6-9bb1-45a5-a4b6-a1be3002dbd3)というデータコンペプラットフォームの中の「中古マンション価格予測チャレンジ」のデータを使います。

国産データコンペのNishika（2026年3月にサービス終了）で開催されていた「中古マンション価格予測」のコンペで、今はDataDojoで同じデータを使ってコンペに参加できます。

[DataDojo](https://data-dojo.org/competitions/0aedc9c6-9bb1-45a5-a4b6-a1be3002dbd3)にGoogleアカウントでログインして、コンペの「データ」タブからtrain.zipをダウンロードしてください（※ログインしないとデータをダウンロードできません）。

train.zipを開くと中には以下のように複数のCSVファイルが入っています。

![Matplotlib](/wp-content/uploads/2021/03/1dba507671ff61d7333c3fad5739b39d.jpg)

今回はこれらをデータフレームとして結合させるところからデータの確認・可視化をおこなっていきます。

そのためにMatplotlibやSeaborn以外のライブラリも必要になるのでImportしてあげましょう！

```python
import glob
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
```

<mark>globはディレクトリに格納されたファイル名を抽出するのに便利なライブラリ</mark>で、今回は複数のファイルがtrainフォルダ内にデータとして格納されているのでそれらのファイル名を抽出するのに必要になります。

<https://toukei-lab.com/glob>

現在trainというフォルダにファイルが入っているとすると、以下のように記述することでtrain内のファイル名を全て抽出することができます。

```python
files = glob.glob("train/*.csv")
```

この時、\*はワイルドカードと呼ばれ、このようにワイルドカードを指定することで全てのファイル名を該当させることができます。

filesを見てみると以下のようになっていることが分かります。

:::box
\[‘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’,\
・・・
:::

各ファイル名がリスト形式で格納されていることが分かります。

このデータフレームの中身を見てみると・・・

```python
pd.read_csv(files[0])
```

以下のようになっていることが分かります。

![Nishika data](/wp-content/uploads/2021/03/Nishika-data-min-1024x444.jpg)

各ファイルそれぞれの格納されているサンプル数は違いますが、全て同じカラムになっています。

そのため、これらのデータをfor文で回して結合させ1つのデータフレームにしていきましょう！

```python
data_list = []
for file in files:
    data_list.append(pd.read_csv(file, index_col=0))
df = pd.concat(data_list)
```

これにて使うデータの準備が完了です。

データが結構汚いので詳細は割愛しますが、前処理をおこなっていきます。

![Nishika data2](/wp-content/uploads/2021/03/Nishika-data2-724x1024.jpg)

全てが欠損値になっているカラムを削除して、「最寄り駅・面積・建築年・取引時点」に関して変換をおこなっています。

```python
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).astype(float)

    year = {
        "年第１四半期": ".25",
        "年第２四半期": ".50",
        "年第３四半期": ".75",
        "年第４四半期": ".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でヒストグラムを描画

![stories Data-pana](/wp-content/uploads/2021/01/Data-pana-e1615808087658-1024x875.png)

さてここからMatplotlibやSeabornを使ったデータの可視化をおこなっていきます。

まずはヒストグラムを描画してみましょう！

```python
plt.hist(df["最寄駅：距離（分）"], bins=20)
```

このように1行記述するだけで以下のようにヒストグラムを描画することができます。

![Nishika　ヒストグラム　最寄り駅からの距離](/wp-content/uploads/2021/04/8b55eaeb636c1bd387aa146076f113a0.png)

この時、グラフの上にデータが表示されてしまうので以下のように1行追加してあげることでグラフだけを描画させることが出来ます。

```python
plt.hist(df["最寄駅：距離（分）"], bins=20)
plt.show()
```

また、binsのパラメータで階級の数を調整することができ、ここを増やすことで細かいヒストグラムを作成することができます。

例えば、**binsを100**にすると・・・

![Nishika　ヒストグラム　最寄り駅からの距離](/wp-content/uploads/2021/04/822d157d3c564a1e7314ad99863b24ad.png)

こんな感じで**階級数が増えて細かいヒストグラム**になっていることが分かります。

この時、rangeというパラメータでデータの範囲を指定してあげることができます。

```python
plt.hist(df["最寄駅：距離（分）"], bins=20, range=(0,30))
plt.show()
```

x軸が0\~30の範囲に絞られていることが分かります。

![Nishika　ヒストグラム　最寄り駅からの距離](/wp-content/uploads/2021/04/cbe0ab91f2a64780c72d2dd05acbe1ad.png)

また、描画されるグラフの大きさを調節したい時は以下のようにあげます。

```python
plt.figure(figsize = (20,10))
plt.hist(df["最寄駅：距離（分）"], bins=20, range=(0,30))
plt.show()
```

見づらい場合はこちらでグラフを調節してあげましょう！

## Matplotlibで複数のグラフを描画してみよう！

![python](/wp-content/uploads/2019/08/Admin-amico-min-e1613730531228-1024x914.png)

続いて、複数のグラフを描画してみましょう！

複数のグラフを描画する方法はいくつかあるのですが、ここでは**subplots**を使います。

まずは、以下のようにグラフを描画する箱を作ってあげます。

```python
fig, axes = plt.subplots(2, 2, figsize=(20,10))
```

この場合、最初の引数に2 , 2を指定しているので、2行×2列の箱が出来上がります。

そして、それぞれの箱に対してグラフを描画していきます。

```python
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つの箱に対してそれぞれのヒストグラムを表示させることが出来ます。

![Nishika　複数ヒストグラム　最寄り駅からの距離](/wp-content/uploads/2021/04/ed388b06cfef267790721be6c66a4e93-1024x498.png)

axes\[0]\[0]であれば1行目1列目の左上の箱を指定しています。

この時、右上の面積のグラフが見づらくなっているので、X軸の範囲を指定してあげましょう！

複数プロットにおいて軸の範囲を指定する場合は以下のように記述してあげます。

```python
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()
```

![Nishika　複数ヒストグラム　最寄り駅からの距離](/wp-content/uploads/2021/04/7401de5f3ee56a0ea3fc30fc7f7edc10-1024x498.png)

だいぶ見やすくなりました！axes\[0]\[0].set_xlim(0,250)でx軸の範囲を指定しています。

## Matplotlibで散布図を描画

続いて<mark>散布図を描画</mark>していきましょう！

散布図は**ある変数と変数の間の関係**を見るのに非常に便利です。

例えば今回の例では<mark>中古マンションの価格に対して面積や最寄り駅からの距離は相関関係があるかどうか</mark>を見ることができます。

先程学んだ、複数プロットの方法を使って複数の散布図を描画してみましょう！

```python
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()
```

散布図を描画するのにはscatterという関数を使います。

![Nishika　複数散布図](/wp-content/uploads/2021/04/73b286c7074c174f827bc6715f02706e-1024x994.jpg)

それぞれの変数間の関係を散布図によって見ることができました。

## Seabornでヒートマップを描画

先程の散布図をながめてみると、なんとなくそれぞれ関係がありそうな気がします。

ただ、<mark>どれくらい関係があるのかは分からない。</mark>

実際にどのくらい関係があるかは[相関係数](/correlation-causal)を算出して見ることができます！

相関係数には負の相関と正の相関があり、-1から+1の範囲で見ることが出来ます。

以下のように記述することで各変数の相関係数を算出することが出来ます。

```python
df[["取引価格（総額）_log", "最寄駅：距離（分）", "面積（㎡）", "建築年"]].corr()
```

![Nishika　相関係数](/wp-content/uploads/2021/04/132df0e7a2f5f5c0e7df8e5bd291e230-1024x286.png)

corrは相関(correlation)を表しています。

このそれぞれの相関関係をヒートマップで見てみましょう。

ここでSeabornの出番です。

```python
sns.heatmap(df[["取引価格（総額）_log", "最寄駅：距離（分）", "面積（㎡）", "建築年"]].corr())
```

![Nishika　ヒートマップ](/wp-content/uploads/2021/04/681bc2bdab8ca963cbd5c72b4a14fbc9.png)

このように1行だけ記述してあげるだけでヒートマップを描画することが出来るんです！

このケースでは変数が少ないのでヒートマップにしなくても問題ないですが、<mark>変数がものすごい量になってくるとヒートマップを描画してあげることで見やすくなります</mark>。

また引数cmapを指定してあげることで**カラーレイアウトを変更**することも可能です。

```python
sns.heatmap(df[["取引価格（総額）_log", "最寄駅：距離（分）", "面積（㎡）", "建築年"]].corr(), cmap="Reds")
```

![Nishika　ヒートマップ](/wp-content/uploads/2021/04/42e746bad8c5a1c719def99556c391ad.png)

この場合、cmapにRedsを指定してあげています。

ぜひヒートマップを駆使していきましょう！

ちなみに日本語だと上手く表示されないので事前にMatplotlibの内部フォントを以下のように変更しておいてあげるとよいでしょう！

```python
import matplotlib
matplotlib.rcParams["font.family"] = "AppleGothic"
```

## seabornで時系列棒グラフを描画

続いて、Seabornのcountplotを使って**データ量を綺麗に描画**して見ていきます。

countplotを使うことで、棒グラフを見やすく描画することが出来るんです！

```python
fig, axes = plt.subplots(2, 1, figsize=(20,10))
df["取引年"] = df["取引時点"].apply(lambda x:str(x)[:4])
sns.countplot(x="取引年", data=df.sort_values("取引年"), ax=axes[0])
sns.countplot(x="取引時点", data=df, ax=axes[1])
```

今まで同様に複数プロットの場合はsubplotsを使います。

そしてseabornで描画する場合は引数axを指定してあげて描画の箱を制御します。

![Nishika　カウントプロット](/wp-content/uploads/2021/04/d72fbf778db9a1f5b7ee197b71db8135-1024x504.png)

この時、取引時点をそのまま描画しているものと、取引時点の4半期データを年単位に丸めたデータを描画しています。

データが見やすく並んでいることが分かります。

2005年から2010年までは取引量が線形で伸びていて、それ以降は横ばいであることが分かります。

## MatplotlibとSeabornの違いや描画方法 まとめ

本記事では、**MatplotlibとSeabornの違い**についてまとめてきました。

Seabornの方が綺麗に描画が出来るということが少しでも理解いただけたと思います。

<mark>データを可視化する際にはこの2つのライブラリをしっかりおさえておきましょう！</mark>

:::talk{who="umatan"}
可視化はとっても重要！
:::

他にもPlotlyという優秀な描画ライブラリがあるので興味のある方はあわせてチェックしてみてください！

<https://toukei-lab.com/plotly>

他にもPythonで出来ることはたくさんあります。

Pythonについて詳しく学びたい方は以下のUdemyの講座で僕自身が講師を務めていますので是非チェックしてみてください！

:::box
**[【実践】ビジネスケースとつなげてPythonで出来ること5つを学べる3日間集中コース](https://www.udemy.com/course/python-can/?referralCode=2CBAD21040FF57199084)**
:::

ちなみに当メディアが運営するAIデータサイエンス特化スクールの「[スタアカ（スタビジアカデミー）](https://toukei-lab.com/achademy/)」では、Pythonを中心に機械学習やデータサイエンスのエッセンスを学べます！

もちろんMatplotlibとSeabornもより実践的に学んでいきますよ！

:::box
**[業界最安級AIデータサイエンス特化スクール：スタアカ（スタビジアカデミー）](https://toukei-lab.com/achademy/)**
:::

[![スタアカ（スタビジアカデミー）のトップページ](/wp-content/uploads/2026/10/achademy-top.jpg)](https://toukei-lab.com/achademy/)

公式サイト：<https://toukei-lab.com/achademy/>

<table class="table">
<tbody>
<tr>
<th>【価格】</th>
<td>ライトプラン：1,280円/月（全コースが受講し放題）<br>
プレミアムプラン：129,800円（通常149,800円・買い切り）</td>
</tr>
<tr>
<th>【オススメ度】</th>
<td><span class="stars" role="img" aria-label="5点中5点" data-value="5"></span></td>
</tr>
<tr>
<th>【サポート体制】</th>
<td><span class="stars" role="img" aria-label="5点中4点" data-value="4"></span></td>
</tr>
<tr>
<th>【受講形式】</th>
<td>オンライン形式</td>
</tr>
<tr>
<th>【学習範囲】</th>
<td>統計学・機械学習・ディープラーニングを網羅的に学ぶ<br>
生成AI（LLM・RAG・プロンプトエンジニアリング）を学ぶ<br>
SQLとPythonを組み合わせて実データを使った様々なワークを行う<br>
実践的なビジネスフレームワークを学ぶ<br>
マーケティングの実行プラン策定</td>
</tr>
</tbody>
</table>

データサイエンティストとしての自分の経験をふまえてエッセンスを詰め込んだのがこちらのスタビジアカデミー、略して「[スタアカ](https://toukei-lab.com/achademy/)」！！

当メディアが運営するスクールです。

月額1,280円のライトプランで、統計学から機械学習・生成AIまで全コースが受講し放題です！

<mark>プレミアムプランでは、24時間以内の質問対応と現役データサイエンティストとの1on1（30分×4回）を実施します！</mark>

カリキュラム自体は、他のスクールと比較して圧倒的に良い自信があるのでぜひ受講してみてください！

ウォルマートのデータを使って商品の予測分析をしたり、実務で使うことの多いGoogleプロダクトのBigQueryを使って投球分析をしたり、データサイエンティストに必要なビジネス・マーケティングの基礎を学んでマーケティングプランを作ってもらったりする盛りだくさんの内容になってます！

:::box
**・BigQuery上でSQL、Google Colab上でPythonを使い野球の投球分析**\
**・世界最大手小売企業のウォルマートの実データを用いた需要予測**\
**・ビジネス・マーケティングの基礎を学んで実際の企業を題材にしたマーケティングプランの策定**\
**・生成AIのAPIを使ってチャットボットやAIエージェントを作る**
:::

::button[スタアカの受講はこちら]{href="https://toukei-lab.com/achademy/" note="＼今すぐ試す／"}

また、Pythonで出来ることを知りたい場合は以下の記事でまとめていますので是非チェックしてみてください！

<https://toukei-lab.com/python-can>

また、Pythonの勉強法については以下の記事で詳しくまとめています！

<https://toukei-lab.com/python-learn>