📋 このステップで学ぶこと
- 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の日本語設定を復習してください。
artnasekai
#artnasekai #学習メモ