STEP 7:Matplotlibの基本的なプロット

📊 STEP 7: Matplotlibの基本的なプロット

4つの基本グラフをマスターしよう!折れ線・散布図・棒グラフ・ヒストグラム

📋 このステップで学ぶこと

  • plt.plot()(折れ線グラフ)の作成方法
  • plt.scatter()(散布図)の作成方法
  • plt.bar()(棒グラフ)の作成方法
  • plt.hist()(ヒストグラム)の作成方法
  • 各グラフの使い分け方
  • コードの各命令の意味と使い方

🎯 はじめに:4つの基本グラフを理解しよう

データ可視化において、4つの基本グラフをマスターすれば、実務で必要なグラフの約80%をカバーできます。それぞれのグラフには得意な用途があり、データの種類と「何を伝えたいか」によって使い分けます。

📊 4つの基本グラフと用途
グラフの種類 主な用途 具体例
折れ線グラフ(plot) 時間の経過による変化を見る 月別売上推移、株価の変動、気温の変化
散布図(scatter) 2つの変数の関係性を見る 広告費と売上、身長と体重、勉強時間と点数
棒グラフ(bar) カテゴリ間の値を比較する 商品別売上、店舗別来客数、地域別人口
ヒストグラム(hist) データの分布を見る テスト点数の分布、年齢分布、所得分布
💡 グラフ選びの考え方

グラフを選ぶときは、こう考えましょう:

「時間とともにどう変わった?」 → 折れ線グラフ
「AとBに関係はある?」 → 散布図
「どれが一番大きい?」 → 棒グラフ
「データはどんな形で分布してる?」 → ヒストグラム

📈 1. 折れ線グラフ(plt.plot)

折れ線グラフとは

折れ線グラフは、時間の経過とともにデータがどう変化したかを示すグラフです。データポイントを線で結ぶことで、上昇・下降・横ばいといったトレンド(傾向)が一目でわかります。

X軸(横軸)には通常「時間」を、Y軸(縦軸)には「数値」を配置します。日常生活でも、天気予報の気温変化や株価チャートなど、至るところで見かけるグラフです。

📊 折れ線グラフが適しているケース
用途 具体例 何がわかるか
売上や数値の推移 月別売上、四半期ごとの利益 成長しているか、減少しているか
気象データ 1日の気温変化、年間降水量 季節変動、ピークの時期
アクセス数の変化 Webサイトの日別PV数 曜日による傾向、急増急減
複数系列の比較 2023年と2024年の売上比較 前年との差、成長率

基本的な折れ線グラフの作り方

まず、最もシンプルな折れ線グラフを作ってみましょう。コードを1行ずつ理解していきます。

📝 ステップ1: ライブラリの読み込み

Matplotlibを使うには、最初にライブラリを読み込む必要があります。

import matplotlib.pyplot as plt
【コードの意味】 import matplotlib.pyplot as plt ├── import: ライブラリを読み込む命令 ├── matplotlib.pyplot: Matplotlibのグラフ描画機能 └── as plt: 長い名前を「plt」という短い名前で使えるようにする 【なぜ必要か】 ・Pythonは最初から全機能を持っているわけではない ・グラフを描くにはMatplotlibという外部ライブラリが必要 ・「plt」という短い名前にすることで、毎回長い名前を書かなくて済む
📝 ステップ2: データを用意する

グラフにするデータをリスト(配列)で用意します。X軸とY軸のデータが必要です。

# X軸のデータ(月) months = [1, 2, 3, 4, 5, 6] # Y軸のデータ(売上) sales = [100, 120, 150, 130, 160, 180]
【コードの意味】 months = [1, 2, 3, 4, 5, 6] ├── months: 変数名(X軸に使うデータ) ├── =: 「右辺の値を左辺の変数に代入する」 └── [1, 2, 3, 4, 5, 6]: リスト(複数の値をまとめて保持) sales = [100, 120, 150, 130, 160, 180] ├── sales: 変数名(Y軸に使うデータ) └── [100, 120, …]: 各月の売上(万円) 【重要なポイント】 ・X軸とY軸のデータは同じ個数でなければならない ・months[0]とsales[0]が1つ目のデータポイント(1月=100万円) ・months[1]とsales[1]が2つ目のデータポイント(2月=120万円)
📝 ステップ3: グラフのサイズを設定する

グラフを描く「キャンバス」のサイズを指定します。

plt.figure(figsize=(10, 6))
【コードの意味】 plt.figure(figsize=(10, 6)) ├── plt.figure(): 新しいグラフの領域(Figure)を作成 ├── figsize: グラフのサイズを指定するパラメータ └── (10, 6): 幅10インチ × 高さ6インチ 【なぜ必要か】 ・指定しないとデフォルトサイズ(小さめ)になる ・プレゼンやレポート用には大きめがおすすめ ・横長(10, 6)は時系列データに適している ・正方形(8, 8)は散布図などに適している
📝 ステップ4: 折れ線グラフを描く

plt.plot()で折れ線グラフを作成します。

plt.plot(months, sales)
【コードの意味】 plt.plot(months, sales) ├── plt.plot(): 折れ線グラフを描く関数 ├── months: X軸のデータ(第1引数) └── sales: Y軸のデータ(第2引数) 【動作の仕組み】 1. (1, 100)の位置に点を打つ 2. (2, 120)の位置に点を打つ 3. 1と2の点を線で結ぶ 4. 同様に全ての点を順番に結ぶ 【よくある間違い】 ❌ plt.plot(sales, months) → X軸とY軸が逆になる ❌ plt.plot(sales) → X軸が自動で0,1,2…になる
📝 ステップ5: タイトルとラベルを追加する

グラフには必ずタイトルと軸ラベルをつけましょう。これがないと、何のグラフかわかりません。

plt.title(“Monthly Sales Trend”, fontsize=16, fontweight=’bold’) plt.xlabel(“Month”, fontsize=12) plt.ylabel(“Sales (Million Yen)”, fontsize=12)
【コードの意味】 plt.title(“Monthly Sales Trend”, fontsize=16, fontweight=’bold’) ├── plt.title(): グラフのタイトルを設定 ├── “Monthly Sales Trend”: タイトルの文字列 ├── fontsize=16: 文字の大きさ(ポイント) └── fontweight=’bold’: 太字にする plt.xlabel(“Month”, fontsize=12) ├── plt.xlabel(): X軸のラベルを設定 └── “Month”: ラベルの文字列 plt.ylabel(“Sales (Million Yen)”, fontsize=12) ├── plt.ylabel(): Y軸のラベルを設定 └── “Sales (Million Yen)”: ラベルの文字列(単位も書く) 【なぜ重要か】 ・STEP 2で学んだ「正確性」のルール ・タイトルで「何を伝えたいか」を示す ・ラベルで「何を測っているか」「単位は何か」を示す ・これがないと、グラフの意味がわからない
📝 ステップ6: グリッド線を追加する

グリッド線(補助線)を追加すると、値が読みやすくなります。

plt.grid(True, linestyle=’–‘, alpha=0.3)
【コードの意味】 plt.grid(True, linestyle=’–‘, alpha=0.3) ├── plt.grid(): グリッド線を表示する関数 ├── True: グリッド線を表示する(Falseなら非表示) ├── linestyle=’–‘: 破線スタイル(’–‘は破線、’-‘は実線) └── alpha=0.3: 透明度(0=完全透明、1=不透明) 【なぜ薄くするのか】 ・STEP 2で学んだ「データインク比」を思い出そう ・グリッド線は「補助的な存在」 ・濃すぎるとデータより目立ってしまう ・薄いグレー(alpha=0.3)なら邪魔にならない
📝 ステップ7: グラフを表示する

最後にplt.show()でグラフを画面に表示します。

plt.show()
【コードの意味】 plt.show() ├── plt.show(): 作成したグラフを画面に表示する └── 引数なし: 表示するだけなので特に設定不要 【なぜ必要か】 ・plt.plot()などは「グラフを描く準備」をしているだけ ・plt.show()を実行して初めて画面に表示される ・Jupyter Notebookでは省略可能な場合もある ・Google Colabでは通常必要

完成コード:基本的な折れ線グラフ

ここまでの内容をまとめた完成コードです。Google Colabに貼り付けて実行してみましょう。

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データを用意 months = [1, 2, 3, 4, 5, 6] sales = [100, 120, 150, 130, 160, 180] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 折れ線グラフを描く plt.plot(months, sales) # タイトルとラベルを追加 plt.title(“Monthly Sales Trend”, fontsize=16, fontweight=’bold’) plt.xlabel(“Month”, fontsize=12) plt.ylabel(“Sales (Million Yen)”, fontsize=12) # グリッド線を追加(薄い破線) plt.grid(True, linestyle=’–‘, alpha=0.3) # グラフを表示 plt.show()

折れ線グラフをカスタマイズする

基本のグラフができたら、見た目をカスタマイズしてみましょう。plt.plot()には多くのオプションがあります。

🎨 plt.plot()の主なオプション
オプション 意味 設定例
color 線の色 ‘steelblue’, ‘coral’, ‘#3498db’
linewidth 線の太さ 2, 2.5, 3(ポイント)
linestyle 線のスタイル ‘-‘(実線), ‘–‘(破線), ‘:’(点線)
marker データポイントのマーカー ‘o’(丸), ‘s’(四角), ‘^’(三角)
label 凡例に表示する名前 ‘2024年売上’, ‘Sales’
plt.plot(months, sales, marker=’o’, # データポイントに丸印をつける linewidth=2.5, # 線の太さを2.5ポイントに color=’steelblue’, # 線の色を青系に label=’2024年’) # 凡例用の名前
【各オプションの詳細】 marker=’o’ ├── データポイント(各点)にマーカーを表示 ├── ‘o’ = 丸、’s’ = 四角、’^’ = 三角、’*’ = 星 └── データ数が少ない(15個以下)場合に推奨 linewidth=2.5 ├── 線の太さをポイント数で指定 ├── デフォルトは約1.5ポイント └── 2〜3ポイントが見やすい color=’steelblue’ ├── 線の色を指定 ├── 色名: ‘red’, ‘blue’, ‘green’, ‘coral’, ‘steelblue’など └── 16進数: ‘#3498db’, ‘#e74c3c’なども使える label=’2024年’ ├── 凡例(legend)に表示する名前 ├── 複数の線がある場合に必須 └── plt.legend()と組み合わせて使う

複数の折れ線を重ねて比較する

折れ線グラフの強みは、複数の系列を重ねて比較できることです。例えば、2023年と2024年の売上を同じグラフで比較してみましょう。

import matplotlib.pyplot as plt # データを用意(2年分) months = [1, 2, 3, 4, 5, 6] sales_2023 = [100, 120, 150, 130, 160, 180] sales_2024 = [110, 140, 170, 150, 190, 210] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 2023年のデータを折れ線グラフで描く plt.plot(months, sales_2023, marker=’o’, # 丸いマーカー linewidth=2, # 線の太さ color=’steelblue’, # 青系の色 label=’2023年’) # 凡例用の名前 # 2024年のデータを折れ線グラフで描く plt.plot(months, sales_2024, marker=’s’, # 四角いマーカー(2023年と区別) linewidth=2, # 線の太さ color=’coral’, # オレンジ系の色 label=’2024年’) # 凡例用の名前 # タイトルとラベル plt.title(“年度別売上比較”, fontsize=16, fontweight=’bold’) plt.xlabel(“月”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # 凡例を表示(どの線が何かを示す) plt.legend(fontsize=11, loc=’upper left’) # グリッド線 plt.grid(True, linestyle=’–‘, alpha=0.3) plt.show()
【複数系列のポイント】 1. plt.plot()を複数回呼び出す → 同じグラフに複数の線が描かれる 2. 各線に異なる色とマーカーを設定 → 視覚的に区別しやすくなる 3. labelで名前をつけてplt.legend()で凡例表示 → どの線が何を表すかがわかる 4. loc=’upper left’で凡例の位置を指定 → ‘upper left’, ‘upper right’, ‘lower left’, ‘lower right’など
⚠️ 折れ線グラフの注意点

STEP 2で学んだ原則を思い出しましょう:

注意点 理由 対処法
線は5本まで 多すぎると見分けがつかない 重要な2〜3本に絞る
色の選択に注意 似た色は区別しにくい 明確に異なる色を使う
時系列以外には使わない 線で結ぶ意味がない カテゴリ比較は棒グラフで

📉 2. 散布図(plt.scatter)

散布図とは

散布図(さんぷず)は、2つの変数の関係性を点で表示するグラフです。折れ線グラフと違い、点を線で結びません。点の散らばり方を見ることで、2つの変数に関係があるかどうかがわかります。

例えば、「広告費を増やすと売上も増えるのか?」「勉強時間とテストの点数には関係があるのか?」といった疑問に答えるのに最適なグラフです。

💡 相関関係の見方

散布図を見ると、データの「相関」がわかります:

正の相関(右上がり):Xが増えるとYも増える傾向
例:広告費↑ → 売上↑

負の相関(右下がり):Xが増えるとYは減る傾向
例:価格↑ → 販売数↓

相関なし(ばらばら):XとYに関係がない
例:身長と血液型には関係がない

📊 散布図が適しているケース
用途 X軸の例 Y軸の例
ビジネス分析 広告費、従業員数 売上、利益
教育分析 勉強時間、授業出席率 テスト点数、成績
健康データ 運動時間、睡眠時間 体重、血圧
外れ値の発見 任意の変数 任意の変数

基本的な散布図の作り方

散布図はplt.scatter()関数で作成します。基本的な構造は折れ線グラフと似ていますが、点を線で結びません。

import matplotlib.pyplot as plt # データを用意(広告費と売上の関係) ad_cost = [50, 80, 35, 65, 90, 40, 55, 45, 70, 60] sales = [320, 450, 280, 390, 520, 300, 350, 310, 420, 370]
【データの構造】 ad_cost(広告費)とsales(売上)のペア: ・(50, 320): 広告費50万円のとき売上320万円 ・(80, 450): 広告費80万円のとき売上450万円 ・(35, 280): 広告費35万円のとき売上280万円 … 【観察ポイント】 ・広告費が多いと売上も多い傾向がある? ・例外的なデータ(外れ値)はある? → これを視覚的に確認するのが散布図の役割
plt.scatter(ad_cost, sales, s=100, # 点のサイズ alpha=0.6, # 透明度 color=’steelblue’, # 色 edgecolors=’black’, # 点の枠線の色 linewidth=1) # 枠線の太さ
【plt.scatter()のオプション詳細】 s=100 ├── 点のサイズをポイントの2乗で指定 ├── 小さい: s=50, 標準: s=100, 大きい: s=200 └── データが多い場合は小さめにする alpha=0.6 ├── 透明度(0=完全透明、1=不透明) ├── 点が重なっても見えるようにする └── 0.5〜0.7がおすすめ color=’steelblue’ ├── 点の色を指定 └── 落ち着いた色がおすすめ edgecolors=’black’ ├── 点の枠線の色 └── 枠線があると点が識別しやすい linewidth=1 ├── 枠線の太さ └── 1〜2が見やすい

完成コード:基本的な散布図

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データを用意(広告費と売上の関係) ad_cost = [50, 80, 35, 65, 90, 40, 55, 45, 70, 60] sales = [320, 450, 280, 390, 520, 300, 350, 310, 420, 370] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 散布図を作成 plt.scatter(ad_cost, sales, s=100, # 点のサイズ alpha=0.6, # 透明度(点が重なっても見える) color=’steelblue’, # 点の色 edgecolors=’black’, # 点の枠線 linewidth=1) # 枠線の太さ # タイトルとラベル plt.title(“広告費と売上の関係”, fontsize=16, fontweight=’bold’) plt.xlabel(“広告費(万円)”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # グリッド線 plt.grid(True, linestyle=’–‘, alpha=0.3) plt.show()

カテゴリ別に色分けした散布図

散布図では、第3の変数を「色」で表現することができます。例えば、地域別や商品別にデータを色分けして表示できます。

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データ(地域ごとの広告費と売上) ad_cost_tokyo = [50, 80, 65, 55, 60] # 東京の店舗 sales_tokyo = [320, 450, 390, 350, 370] ad_cost_osaka = [45, 70, 40] # 大阪の店舗 sales_osaka = [300, 420, 310] ad_cost_nagoya = [35, 90] # 名古屋の店舗 sales_nagoya = [280, 520] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 地域ごとに異なる色でプロット plt.scatter(ad_cost_tokyo, sales_tokyo, s=100, alpha=0.6, color=’steelblue’, edgecolors=’black’, linewidth=1, label=’東京’) plt.scatter(ad_cost_osaka, sales_osaka, s=100, alpha=0.6, color=’coral’, edgecolors=’black’, linewidth=1, label=’大阪’) plt.scatter(ad_cost_nagoya, sales_nagoya, s=100, alpha=0.6, color=’lightgreen’, edgecolors=’black’, linewidth=1, label=’名古屋’) # タイトルとラベル plt.title(“地域別:広告費と売上の関係”, fontsize=16, fontweight=’bold’) plt.xlabel(“広告費(万円)”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # 凡例を表示 plt.legend(fontsize=11) # グリッド線 plt.grid(True, linestyle=’–‘, alpha=0.3) plt.show()
💡 散布図のベストプラクティス
ポイント 推奨値 理由
点のサイズ(s) 50〜200 小さすぎると見えない、大きすぎると重なる
透明度(alpha) 0.5〜0.7 点が重なっても密度がわかる
枠線(edgecolors) ‘black’または’white’ 点を識別しやすくする
色の数 3〜5色まで 多すぎると区別できない

📊 3. 棒グラフ(plt.bar)

棒グラフとは

棒グラフは、カテゴリ間の値を比較するための最も基本的なグラフです。棒の高さ(または長さ)で値の大小を表します。「どれが一番大きいか」「どれが一番小さいか」が一目でわかります。

棒グラフは縦棒(plt.bar)と横棒(plt.barh)の2種類があります。カテゴリ名が長い場合は横棒グラフが読みやすくなります。

📊 棒グラフが適しているケース
用途 具体例 推奨形式
商品・サービスの比較 商品別売上、サービス別利用者数 縦棒グラフ
店舗・拠点の比較 店舗別売上、支社別従業員数 横棒グラフ(店舗名が長い場合)
ランキング表示 売上トップ10、人気商品ランキング 横棒グラフ(降順に並べる)
年度比較 2023年vs2024年の商品別売上 グループ化棒グラフ

基本的な棒グラフの作り方

棒グラフはplt.bar()関数で作成します。X軸にカテゴリ名、Y軸に値を指定します。

import matplotlib.pyplot as plt # データを用意 products = [‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’, ‘商品E’] sales = [150, 200, 120, 180, 90]
【データの構造】 products: カテゴリ名のリスト(X軸に表示) sales: 各カテゴリの値のリスト(Y軸の高さ) 【ポイント】 ・productsとsalesの要素数は同じでなければならない ・products[0]=’商品A’の売上がsales[0]=150万円
plt.bar(products, sales, color=’steelblue’, # 棒の色 width=0.6, # 棒の幅 edgecolor=’black’, # 棒の枠線の色 linewidth=1) # 枠線の太さ
【plt.bar()のオプション詳細】 plt.bar(products, sales, …) ├── 第1引数: X軸のカテゴリ(リスト) └── 第2引数: Y軸の値(リスト) color=’steelblue’ ├── 棒の色を指定 └── 全ての棒が同じ色になる width=0.6 ├── 棒の幅(0〜1の範囲) ├── 0.6〜0.8が見やすい └── 小さいと細すぎ、大きいと隙間がなくなる edgecolor=’black’ ├── 棒の枠線の色 └── 枠線があると棒が識別しやすい linewidth=1 ├── 枠線の太さ └── 1が標準的

完成コード:基本的な棒グラフ

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データを用意 products = [‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’, ‘商品E’] sales = [150, 200, 120, 180, 90] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 棒グラフを作成 plt.bar(products, sales, color=’steelblue’, # 棒の色 width=0.6, # 棒の幅 edgecolor=’black’, # 棒の枠線 linewidth=1) # 枠線の太さ # タイトルとラベル plt.title(“商品別売上”, fontsize=16, fontweight=’bold’) plt.xlabel(“商品”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # Y軸方向のグリッド線のみ表示 plt.grid(True, axis=’y’, linestyle=’–‘, alpha=0.3) plt.show()
⚠️ 棒グラフの重要ルール:Y軸は必ず0から始める

STEP 2で学んだ「正確性」のルールを思い出しましょう。棒グラフのY軸は必ず0から始める必要があります。

【なぜY軸を0から始めるのか】 ❌ Y軸が90から始まる場合: 200┤ ████ 150┤ ██ ████ ██ 100┤ ██ ████ ██ 90┤ ██ ████ ██ └───────────── 商品A 商品B 商品C → 商品Bが商品Aの3倍以上に見える!(実際は1.3倍) ✅ Y軸が0から始まる場合: 200┤ ████ 150┤ ██ ████ ██ 100┤ ██ ████ ██ 50┤ ██ ████ ██ 0┤ ██ ████ ██ └───────────── 商品A 商品B 商品C → 正確な比率で見える(商品Bは商品Aの約1.3倍) 【結論】 棒グラフは「棒の長さ」で値を比較するため、 0から始めないと比率が歪んで見えてしまいます。

横棒グラフ(plt.barh)

カテゴリ名が長い場合や、ランキングを表示する場合は横棒グラフが適しています。plt.barh()関数を使います(hはhorizontal=水平の略)。

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データ(店舗名が長い例) stores = [‘渋谷駅前店’, ‘新宿西口店’, ‘池袋東口店’, ‘品川駅店’, ‘横浜駅店’] sales = [150, 200, 120, 180, 160] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 横棒グラフを作成 plt.barh(stores, sales, # barh = 横棒グラフ color=’coral’, # 棒の色 height=0.6, # 棒の高さ(縦棒のwidthに相当) edgecolor=’black’, # 棒の枠線 linewidth=1) # 枠線の太さ # タイトルとラベル plt.title(“店舗別売上ランキング”, fontsize=16, fontweight=’bold’) plt.xlabel(“売上(万円)”, fontsize=12) # X軸が値になる plt.ylabel(“店舗”, fontsize=12) # Y軸がカテゴリになる # X軸方向のグリッド線のみ表示 plt.grid(True, axis=’x’, linestyle=’–‘, alpha=0.3) plt.show()
【縦棒と横棒の違い】 plt.bar() – 縦棒グラフ ├── X軸: カテゴリ(横に並ぶ) ├── Y軸: 値(棒の高さ) └── width: 棒の幅 plt.barh() – 横棒グラフ ├── Y軸: カテゴリ(縦に並ぶ) ├── X軸: 値(棒の長さ) └── height: 棒の高さ(widthではない) 【横棒グラフを使う場面】 ・カテゴリ名が長い(店舗名、商品名など) ・ランキングを表示したい ・カテゴリ数が多い(10個以上)

数値ラベル付き棒グラフ

棒の上(または横)に具体的な数値を表示すると、より正確な情報を伝えられます。

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt # データを用意 products = [‘商品A’, ‘商品B’, ‘商品C’, ‘商品D’, ‘商品E’] sales = [150, 200, 120, 180, 90] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 棒グラフを作成(後で使うためにbarsに保存) bars = plt.bar(products, sales, color=’steelblue’, edgecolor=’black’, linewidth=1) # 各棒の上に数値ラベルを追加 for bar in bars: height = bar.get_height() # 棒の高さ(=値)を取得 plt.text(bar.get_x() + bar.get_width()/2., # X座標(棒の中央) height, # Y座標(棒の上端) f'{int(height)}万円’, # 表示するテキスト ha=’center’, # 水平方向の位置揃え va=’bottom’, # 垂直方向の位置揃え fontsize=11) # フォントサイズ # タイトルとラベル plt.title(“商品別売上(数値表示付き)”, fontsize=16, fontweight=’bold’) plt.xlabel(“商品”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # グリッド線 plt.grid(True, axis=’y’, linestyle=’–‘, alpha=0.3) plt.show()
【数値ラベル追加のコード解説】 bars = plt.bar(…) ├── 棒グラフオブジェクトをbarsに保存 └── 後でループ処理するため for bar in bars: ├── 各棒に対して繰り返し処理 └── barは1つの棒を表すオブジェクト height = bar.get_height() ├── 棒の高さ(=売上の値)を取得 └── この値をラベルとして表示する plt.text(x, y, text, …) ├── 指定した位置にテキストを表示 ├── x: bar.get_x() + bar.get_width()/2. → 棒の中央 ├── y: height → 棒の上端 ├── text: f'{int(height)}万円’ → 表示する文字列 ├── ha=’center’ → 水平方向は中央揃え └── va=’bottom’ → 垂直方向は下揃え(棒の上に表示)

📊 4. ヒストグラム(plt.hist)

ヒストグラムとは

ヒストグラムは、データの分布を見るためのグラフです。「どの範囲にデータが集中しているか」「データは対称か偏っているか」「外れ値はあるか」といったことがわかります。

ヒストグラムは棒グラフに似ていますが、連続的な数値データを扱う点が異なります。データを「区間(ビン)」に分けて、各区間に含まれるデータの個数を棒で表します。

💡 ヒストグラムと棒グラフの違い

見た目は似ていますが、目的が異なります:

棒グラフ:カテゴリ(商品A、商品B…)の比較
→ 棒と棒の間に隙間がある(独立したカテゴリ)

ヒストグラム:連続データ(点数、年齢…)の分布
→ 棒と棒の間に隙間がない(連続的なデータ)

📊 ヒストグラムが適しているケース
用途 具体例 何がわかるか
テストの点数分析 100人のテスト結果 平均付近に集中?ばらつきは大きい?
年齢分布 顧客の年齢データ どの年代が多い?偏りはある?
待ち時間の分析 コールセンターの待ち時間 多くの人は何分待つ?長く待つ人は?
品質管理 製品の重量、サイズ 規格内に収まっている?外れ値は?

基本的なヒストグラムの作り方

ヒストグラムはplt.hist()関数で作成します。まずデータを用意し、ビン(区間)の数を指定します。

import matplotlib.pyplot as plt import numpy as np # テスト点数のデータを生成(平均70点、標準偏差15の正規分布) np.random.seed(42) # 結果を再現可能にする scores = np.random.normal(70, 15, 100) # 100人分のデータ
【データ生成のコード解説】 import numpy as np ├── NumPyライブラリを読み込む └── 数値計算やデータ生成に使う np.random.seed(42) ├── 乱数のシード(種)を設定 ├── 同じシードなら毎回同じ乱数が生成される └── 結果を再現可能にするため(なくてもOK) np.random.normal(70, 15, 100) ├── 正規分布に従う乱数を生成 ├── 70: 平均値(データの中心) ├── 15: 標準偏差(データのばらつき具合) └── 100: 生成するデータの個数 【実際の業務では】 ・実データはCSVファイルなどから読み込む ・ここでは練習用にダミーデータを生成している
plt.hist(scores, bins=10, # ビン(区間)の数 color=’steelblue’, # 棒の色 edgecolor=’black’, # 棒の枠線 linewidth=1, # 枠線の太さ alpha=0.7) # 透明度
【plt.hist()のオプション詳細】 plt.hist(scores, …) ├── 第1引数: データのリストまたは配列 └── 棒グラフと違い、カテゴリは指定しない bins=10 ├── ビン(区間)の数を指定 ├── データを10個の区間に分割する ├── 例: 0-10点, 10-20点, 20-30点, … など └── 目安: データ数の平方根(√n) 【ビン数の選び方】 ・データが100個 → √100 = 10ビン ・データが400個 → √400 = 20ビン ・ただし、見やすさを優先して調整してOK color=’steelblue’, edgecolor=’black’ ├── 棒グラフと同じ └── 色と枠線を指定 alpha=0.7 ├── 透明度(0〜1) ├── 複数のヒストグラムを重ねる場合に便利 └── 1つだけなら0.7〜1.0でOK

完成コード:基本的なヒストグラム

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt import numpy as np # テスト点数のデータを生成(100人分) np.random.seed(42) scores = np.random.normal(70, 15, 100) # 平均70点、標準偏差15 # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # ヒストグラムを作成 plt.hist(scores, bins=10, # ビン(区間)の数 color=’steelblue’, # 棒の色 edgecolor=’black’, # 棒の枠線 linewidth=1, # 枠線の太さ alpha=0.7) # 透明度 # タイトルとラベル plt.title(“テスト点数の分布”, fontsize=16, fontweight=’bold’) plt.xlabel(“点数”, fontsize=12) plt.ylabel(“人数”, fontsize=12) # Y軸方向のグリッド線 plt.grid(True, axis=’y’, linestyle=’–‘, alpha=0.3) plt.show()

ビン数による見え方の違い

ビン数を変えると、ヒストグラムの見え方が大きく変わります。適切なビン数を選ぶことが重要です。

【ビン数による違い】 ビン数が少なすぎる場合(例: bins=5) ├── 棒が少ない、おおまかな傾向のみ ├── 細かい特徴が見えない └── データの詳細が失われる ビン数が適切な場合(例: bins=10〜15) ├── データの分布がよくわかる ├── ピーク(最頻値)が見える └── 外れ値も確認できる ビン数が多すぎる場合(例: bins=50) ├── 棒がたくさん、ギザギザ ├── ノイズ(偶然の変動)が目立つ └── 全体の傾向がつかみにくい 【目安】 ・データ数100個 → 10ビン程度 ・データ数1000個 → 20〜30ビン程度 ・実際に試して見やすい数を選ぶ

複数のヒストグラムを重ねて比較する

2つのグループのデータ分布を比較したい場合、ヒストグラムを重ねて表示できます。透明度(alpha)を設定することで、重なった部分も見えるようになります。

※ コードが長い場合は横スクロールできます

import matplotlib.pyplot as plt import numpy as np # 2つのクラスのテスト点数データを生成 np.random.seed(42) class_a = np.random.normal(65, 12, 100) # Aクラス:平均65点 class_b = np.random.normal(75, 15, 100) # Bクラス:平均75点 # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # Aクラスのヒストグラム plt.hist(class_a, bins=15, alpha=0.6, # 透明度を設定(重なっても見える) color=’steelblue’, edgecolor=’black’, linewidth=1, label=’Aクラス’) # 凡例用のラベル # Bクラスのヒストグラム(重ねて表示) plt.hist(class_b, bins=15, alpha=0.6, color=’coral’, edgecolor=’black’, linewidth=1, label=’Bクラス’) # タイトルとラベル plt.title(“クラス別テスト点数の分布”, fontsize=16, fontweight=’bold’) plt.xlabel(“点数”, fontsize=12) plt.ylabel(“人数”, fontsize=12) # 凡例を表示 plt.legend(fontsize=11) # グリッド線 plt.grid(True, axis=’y’, linestyle=’–‘, alpha=0.3) plt.show()
💡 ヒストグラムのベストプラクティス
ポイント 推奨 理由
ビン数 √n(データ数の平方根) 多すぎるとギザギザ、少なすぎると情報不足
棒の間隔 隙間なし 連続データであることを示す
透明度(重ねる場合) 0.5〜0.7 重なっても両方見える
枠線 edgecolor=’black’ 各ビンの境界がわかりやすい

📝 STEP 7 のまとめ

✅ このステップで学んだこと
グラフの種類 関数 用途 重要なオプション
折れ線グラフ plt.plot() 時系列データの推移 marker, linewidth, label
散布図 plt.scatter() 2変数の関係性 s, alpha, edgecolors
棒グラフ plt.bar() / plt.barh() カテゴリ間の比較 width, edgecolor
ヒストグラム plt.hist() データの分布 bins, alpha
💡 最重要ポイント

この4つの基本グラフをマスターすれば、データ可視化の80%はカバーできます!

グラフ選びのポイントをもう一度確認しましょう:

「時間とともにどう変わった?」 → 折れ線グラフ
「AとBに関係はある?」 → 散布図
「どれが一番大きい?」 → 棒グラフ
「データはどんな形で分布してる?」 → ヒストグラム

次のステップでは、色、線のスタイル、マーカーなどの詳細なカスタマイズ方法を学びます!

📝 実践演習

演習 1 基礎

以下のデータで折れ線グラフを作成してください。マーカーを丸印にし、線の色をオレンジ系にしてください。

月: [1, 2, 3, 4, 5, 6]
気温: [5, 8, 12, 18, 23, 27]
タイトル: “月別平均気温”

import matplotlib.pyplot as plt # データを用意 months = [1, 2, 3, 4, 5, 6] temperature = [5, 8, 12, 18, 23, 27] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 折れ線グラフを作成 plt.plot(months, temperature, marker=’o’, # 丸いマーカー linewidth=2, # 線の太さ color=’coral’) # オレンジ系の色 # タイトルとラベル plt.title(“月別平均気温”, fontsize=16, fontweight=’bold’) plt.xlabel(“月”, fontsize=12) plt.ylabel(“気温(℃)”, fontsize=12) # グリッド線 plt.grid(True, linestyle=’–‘, alpha=0.3) plt.show()

ポイント:marker=’o’で丸いマーカー、color=’coral’でオレンジ系の色を指定しています。

演習 2 応用

以下のデータで棒グラフを作成し、各棒の上に数値ラベルを表示してください。さらに、棒を売上の大きい順(降順)に並べ替えてください。

店舗: [‘A店’, ‘B店’, ‘C店’, ‘D店’]
売上: [80, 120, 95, 150]

import matplotlib.pyplot as plt # 元のデータ stores = [‘A店’, ‘B店’, ‘C店’, ‘D店’] sales = [80, 120, 95, 150] # 売上の降順に並べ替え # zip()で店舗と売上をペアにし、売上でソートして解凍 sorted_pairs = sorted(zip(sales, stores), reverse=True) sorted_sales, sorted_stores = zip(*sorted_pairs) # リストに変換 sorted_stores = list(sorted_stores) sorted_sales = list(sorted_sales) # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 棒グラフを作成 bars = plt.bar(sorted_stores, sorted_sales, color=’steelblue’, edgecolor=’black’, linewidth=1) # 各棒の上に数値ラベルを追加 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, f'{int(height)}万円’, ha=’center’, va=’bottom’, fontsize=11) # タイトルとラベル plt.title(“店舗別売上ランキング”, fontsize=16, fontweight=’bold’) plt.xlabel(“店舗”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # グリッド線 plt.grid(True, axis=’y’, linestyle=’–‘, alpha=0.3) plt.show()

ポイント:sorted()とzip()を使ってデータを降順に並べ替えています。これにより、売上の大きい店舗が左から順に表示されます。

演習 3 発展

2つの商品の月別売上を比較する折れ線グラフを作成してください。商品Aは青系、商品Bはオレンジ系の色にし、マーカーは異なる形にしてください。凡例も表示してください。

月: [1, 2, 3, 4, 5, 6]
商品A: [50, 60, 55, 70, 65, 80]
商品B: [40, 55, 60, 55, 70, 75]

import matplotlib.pyplot as plt # データを用意 months = [1, 2, 3, 4, 5, 6] product_a = [50, 60, 55, 70, 65, 80] product_b = [40, 55, 60, 55, 70, 75] # グラフのサイズを設定 plt.figure(figsize=(10, 6)) # 商品Aの折れ線グラフ plt.plot(months, product_a, marker=’o’, # 丸いマーカー linewidth=2, color=’steelblue’, # 青系 label=’商品A’) # 商品Bの折れ線グラフ plt.plot(months, product_b, marker=’s’, # 四角いマーカー(区別のため) linewidth=2, color=’coral’, # オレンジ系 label=’商品B’) # タイトルとラベル plt.title(“商品別月間売上比較”, fontsize=16, fontweight=’bold’) plt.xlabel(“月”, fontsize=12) plt.ylabel(“売上(万円)”, fontsize=12) # 凡例を表示 plt.legend(fontsize=11, loc=’upper left’) # グリッド線 plt.grid(True, linestyle=’–‘, alpha=0.3) plt.show()

ポイント:plt.plot()を2回呼び出して2本の線を描いています。marker=’o’と’marker=’s’で異なるマーカー、color=’steelblue’と’coral’で異なる色を指定し、labelとplt.legend()で凡例を表示しています。

❓ よくある質問

Q1: 折れ線グラフと散布図はどう使い分けますか?
時系列データなら折れ線、相関を見たいなら散布図です。折れ線グラフは点を線で結ぶことで「時間の流れ」や「順序」を表現します。一方、散布図は2つの変数の「関係性」を見るもので、線で結びません。例えば、「月別売上の推移」は折れ線グラフ、「広告費と売上の関係」は散布図が適しています。迷ったら、「X軸に時間や順序があるか?」を考えましょう。あれば折れ線、なければ散布図です。
Q2: ヒストグラムのビン数はどう決めればいいですか?
データ数の平方根(√n)が目安です。例えば、データが100個なら√100=10ビンが目安です。ただし、これは絶対的なルールではありません。実際にbins=5、10、15、20など試してみて、データの特徴(ピークや分布の形)が見やすい数に調整しましょう。ビンが少なすぎると細かい特徴が見えず、多すぎるとギザギザして全体の傾向がわかりにくくなります。
Q3: 棒グラフの棒の色を個別に変えることはできますか?
はい、できます!colorパラメータにリストを渡すことで、各棒の色を個別に指定できます。例:colors = ['steelblue', 'coral', 'lightgreen', 'gold', 'steelblue']として、plt.bar(x, y, color=colors)とします。これは特定の棒だけ強調したい場合(例:最大値を目立たせる)に便利です。
Q4: 散布図で点が重なって見にくいです。どうすればいいですか?
透明度(alpha)を調整しましょう。alpha=0.3〜0.5にすることで、重なった点も透けて見え、データが多い場所ほど濃く表示されます。また、点のサイズ(s)を小さくする、枠線(edgecolors)をつけるなども効果的です。それでもダメな場合は、ヒートマップや六角ビニング(hexbin)など、別の可視化方法を検討しましょう。これらは後のステップで学びます。
Q5: グラフに日本語が表示されません。どうすればいいですか?
日本語フォントの設定が必要です。Google Colabでは、以下のコードを最初に実行してください:

!pip install japanize-matplotlib
import japanize_matplotlib

これでタイトルやラベルに日本語が使えるようになります。詳しくはSTEP 6の日本語設定を復習してください。
📝

学習メモ

データ可視化マスター - Step 7

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE