【Pandas】.plotでグラフを描画しよう!

Pandas
この記事は約13分で読めます。

こんにちは、JS2IIUです。

この記事では、データ分析に欠かせないPythonのPandasライブラリを使って、様々な種類のグラフを作成する方法を紹介します。Pandasはデータ操作や分析に強力な機能を提供してくれるライブラリですが、その中にはデータの可視化に役立つグラフ描画機能も含まれています。

本記事では、.plot系メソッドを使って、積み上げグラフ、棒グラフ、水平棒グラフ、箱ひげ図、カーネル密度推定プロット、ビニングプロット、ヒストグラム、KDEプロット、折れ線グラフ、円グラフ、散布図など、多様なグラフを作成するサンプルプログラムと解説を提供します。それぞれのグラフの特徴を理解し、データ分析に活用するためのヒントにしていただければ幸いです。

.plot.areaで積み上げグラフを作成する

積み上げグラフは、複数のデータ系列の推移を積み重ねて表示することで、全体の傾向と各系列の寄与を把握するのに役立ちます。例えば、各製品の売上推移を積み上げて全体の売上推移を見る、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (各製品の月別売上データ)
np.random.seed(0)
df = pd.DataFrame({
    'Month': pd.date_range('2024-01-01', periods=12, freq='MS'),
    'Product A': np.random.randint(100, 200, 12),
    'Product B': np.random.randint(50, 150, 12),
    'Product C': np.random.randint(30, 80, 12)
})
df.set_index('Month', inplace=True)

# 積み上げグラフの作成
df.plot.area(stacked=True)
plt.title('Monthly Sales by Product')
plt.xlabel('Month')
plt.ylabel('Sales')
plt.show()

解説:

  • pd.date_range('2024-01-01', periods=12, freq='MS') で、2024年1月1日から始まる12ヶ月分の月初のDatetimeIndexを生成し、’Month’列に代入しています。
  • np.random.randint(100, 200, 12) 等で、各製品の月別売上をランダムに生成しています。
  • df.set_index('Month', inplace=True) で、’Month’列をインデックスに設定しています。
  • df.plot.area(stacked=True) で積み上げグラフを作成します。
    • stacked=True は、各系列の値を積み上げて表示することを指定します。Falseにすると、各系列が独立して表示されます。
  • plt.title(), plt.xlabel(), plt.ylabel() で、グラフのタイトル、X軸ラベル、Y軸ラベルを設定します。

.plot.barで棒グラフを作成する

棒グラフは、カテゴリごとの値を比較するのに適しています。例えば、各地域の顧客数を比較する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (各地域の顧客数)
df = pd.DataFrame({
    'Region': ['North', 'East', 'South', 'West'],
    'Customers': [350, 280, 420, 310]
})

# 棒グラフの作成
df.plot.bar(x='Region', y='Customers', rot=0)
plt.title('Number of Customers by Region')
plt.xlabel('Region')
plt.ylabel('Customers')
plt.show()

解説:

  • df.plot.bar(x='Region', y='Customers', rot=0) で棒グラフを作成します。
    • x は、X軸に使用する列を指定します。
    • y は、Y軸に使用する列を指定します。
    • rot は、X軸のラベルの回転角度を指定します。0 は水平に表示することを意味します。
  • plt.title(), plt.xlabel(), plt.ylabel() で、グラフのタイトル、X軸ラベル、Y軸ラベルを設定します。

.plot.barhで水平の棒グラフを作成する

水平棒グラフは、カテゴリ名が多い場合や、値の大小を横方向で比較したい場合に便利です。例えば、各商品の売上ランキングを表示する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (各商品の売上)
df = pd.DataFrame({
    'Product': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    'Sales': np.random.randint(50, 200, 10)
})

# 水平棒グラフの作成
df.plot.barh(x='Product', y='Sales')
plt.title('Sales by Product')
plt.xlabel('Sales')
plt.ylabel('Product')
plt.show()

解説:

  • df.plot.barh(x='Product', y='Sales') で水平棒グラフを作成します。

.plot.boxで箱ひげ図を作成する

箱ひげ図は、データの分布(中央値、四分位数、外れ値など)を視覚的に把握するのに役立ちます。例えば、複数のグループのテストの点数分布を比較する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (各グループのテストの点数)
np.random.seed(0)
df = pd.DataFrame({
    'Group A': np.random.normal(70, 10, 100),
    'Group B': np.random.normal(80, 12, 100),
    'Group C': np.random.normal(75, 8, 100)
})

# 箱ひげ図の作成
df.plot.box()
plt.title('Test Scores by Group')
plt.xlabel('Group')
plt.ylabel('Score')
plt.show()

解説:

  • np.random.normal(70, 10, 100) 等で、各グループのテストの点数を正規分布に従ってランダムに生成しています。
  • df.plot.box() で箱ひげ図を作成します。

.plot.densityでカーネル密度推定プロットを作成する

カーネル密度推定プロットは、データの分布を滑らかな曲線で表現するのに使用されます。例えば、顧客の年齢分布を滑らかに表示する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (顧客の年齢)
np.random.seed(0)
df = pd.DataFrame({'Age': np.random.randint(20, 60, 500)})

# カーネル密度推定プロットの作成
df.plot.density()
plt.title('Customer Age Distribution')
plt.xlabel('Age')
plt.ylabel('Density')
plt.show()

解説:

  • df.plot.density() でカーネル密度推定プロットを作成します。

.plot.hexbinでビニングプロットを作成する

ビニングプロットは、2つの変数の関係を、平面を六角形のビンに分割して表現するのに使用されます。例えば、気温とアイスクリームの売上個数の関係を見る、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (気温とアイスクリームの売上個数)
np.random.seed(0)
df = pd.DataFrame({
    'Temperature': np.random.randint(20, 35, 100),
    'Ice Cream Sales': np.random.randint(100, 300, 100)
})

# ビニングプロットの作成
df.plot.hexbin(x='Temperature', y='Ice Cream Sales', gridsize=10)
plt.title('Temperature vs. Ice Cream Sales')
plt.xlabel('Temperature')
plt.ylabel('Ice Cream Sales')
plt.show()

解説:

  • df.plot.hexbin(x='Temperature', y='Ice Cream Sales', gridsize=10) でビニングプロットを作成します。
    • gridsize は、六角形のビンの数を指定します。

.plot.histでヒストグラムを作成する

ヒストグラムは、データの分布を棒グラフで表現するのに使用されます。例えば、テストの点数分布を表示する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (テストの点数)
np.random.seed(0)
df = pd.DataFrame({'Score': np.random.normal(70, 10, 500)})

# ヒストグラムの作成
df.plot.hist(bins=20)
plt.title('Test Score Distribution')
plt.xlabel('Score')
plt.ylabel('Frequency')
plt.show()

解説:

  • df.plot.hist(bins=20) でヒストグラムを作成します。
    • bins は、ビンの数を指定します。

.plot.kdeでKDEプロットを作成する

.plot.kde.plot.density のエイリアスであり、カーネル密度推定プロットを作成します。使い方は .plot.density と同じです。

.plot.lineで折れ線グラフを作成する

折れ線グラフは、データの推移を線で表現するのに使用されます。例えば、株価の推移を表示する、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (株価の推移)
np.random.seed(0)
df = pd.DataFrame({
    'Date': pd.date_range('2024-01-01', periods=100, freq='D'),
    'Price': 100 + np.random.randn(100).cumsum()
})
df.set_index('Date', inplace=True)

# 折れ線グラフの作成
df.plot.line()
plt.title('Stock Price Trend')
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()

解説:

  • pd.date_range('2024-01-01', periods=100, freq='D') で、2024年1月1日から始まる100日分のDatetimeIndexを生成し、’Date’列に代入しています。
  • 100 + np.random.randn(100).cumsum() で、ランダムな値の累積和を計算し、株価の推移をシミュレートしています。
  • df.set_index('Date', inplace=True) で、’Date’列をインデックスに設定しています。
  • df.plot.line() で折れ線グラフを作成します。

.plot.pieで円グラフを作成する

円グラフは、各カテゴリの割合を視覚的に表現するのに適しています。例えば、各製品の売上構成比を表示する、といった使い方ができます。

Python
import pandas as pd
import matplotlib.pyplot as plt

# サンプルデータの作成 (各製品の売上)
df = pd.DataFrame({
    'Product': ['A', 'B', 'C', 'D'],
    'Sales': [30, 25, 20, 25]
})

# 円グラフの作成
df.plot.pie(y='Sales', labels=df['Product'], autopct='%1.1f%%', startangle=90)
plt.title('Sales Composition Ratio')
plt.ylabel('')  # Y軸ラベルを非表示にする
plt.show()

解説:

  • df.plot.pie(y='Sales', labels=df['Product'], autopct='%1.1f%%', startangle=90) で円グラフを作成します。
    • y は、円グラフの値に使用する列を指定します。
    • labels は、各円弧のラベルを指定します。
    • autopct は、円弧内にパーセンテージを表示するフォーマットを指定します。
    • startangle は、円グラフの開始角度を指定します。
  • plt.ylabel('') でY軸ラベルを非表示にします。

.plot.scatterで散布図を作成する

散布図は、2つの変数の関係をプロットすることで、相関関係などを把握するのに役立ちます。例えば、広告費と売上高の関係を見る、といった使い方ができます。

Python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# サンプルデータの作成 (広告費と売上高)
np.random.seed(0)
df = pd.DataFrame({
    'Advertising Expenses': np.random.randint(10, 50, 100),
    'Sales': np.random.randint(100, 500, 100) + 20 * np.random.randint(10, 50, 100)
})

# 散布図の作成
df.plot.scatter(x='Advertising Expenses', y='Sales')
plt.title('Advertising Expenses vs. Sales')
plt.xlabel('Advertising Expenses')
plt.ylabel('Sales')
plt.show()

解説:

  • df.plot.scatter(x='Advertising Expenses', y='Sales') で散布図を作成します。
    • x は、X軸に使用する列を指定します。
    • y は、Y軸に使用する列を指定します。

参考になるWEBサイト

この記事が、Pandasを使ったグラフ作成の参考になれば幸いです。

今回も少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。

「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございます。73

コメント

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