
結論:可視化は「きれいに描く」ことではなく、意思決定を動かすための設計です。
本稿では、未経験〜初学者が 週10時間×1〜2週 で、Matplotlib/Plotlyを軸に “伝わるグラフ”の設計と実装の型 を身につけることをゴールにします。
棒・折れ線・箱ひげ・ヒートマップ・ファセットなど、“いつ使うか/何を伝えるか”の判断基準つき。最後に レポート1枚の型 と レビュー観点チェックリスト も付属します。
はじめに:なぜ“伝わらない”のか
現場でよく起こるつまずきは次の3つです。
- 目的が曖昧(誰に何を決めてもらうか不明)
- 図の選択ミス(カテゴリ比較に折れ線、時系列に円など)
- 読み手への配慮不足(凡例が遠い/色が多い/軸や注釈が不親切)
これを防ぐ最短ルートは、目的→メッセージ→図の選択→注釈/配色→検証の順で作る“型”を持つこと。
以降はこの順番に沿って進めます。
筆者のスタンス:現場で効いた作法だけ残す
筆者(ふみと)は大手企業のデータサイエンティスト/マーケティングサイエンティスト歴10年。役員会・営業会議・現場共有まで1,000枚以上のグラフを作ってきました。
結局効いたのは、難解なテクニックではなく正しい設計順序と余白、そして注釈でした。以下、実務で骨太に使えるやり方に絞って解説します。
前提:環境とサンプルデータ
想定環境:Python 3.10+ / pandas 2.x / Matplotlib / Plotly(Jupyter推奨)
サンプル:sales.csv(列:date, store, product, qty, price)
前処理(読み込み→整形→集計)の基本は別稿(pandas基礎)に準拠
サンプルデータ
サンプルデータは sales.csv(date, store, product, qty, price)。
>>【保存版】pandas基礎:データフレームの作成・整形・結合・集計を“実務の型”で身につけるに沿って読み込み→整形→集計まで済ませておきましょう。
初学者向けの狙い:各コードには「何をしたいのか」を日本語コメントで添えます。まずはコピーして動かしつつ、コメントを読みながら理解してください。
“伝わる可視化” 10ステップ
ステップ1:1文で「誰に何を伝え、何を決めてもらうか」
- 例1:「店舗Aは4月以降の売上が前年比−12%。要因は来店数の減少。」
- 例2:「新商品X導入後、カテゴリYの粗利率が+2.1pt改善。」
ポイント:この1文が図の選択・注釈・配色の全てを決めます。必ず最初に書き出しましょう。
ステップ2:図の選び方(判断基準表)
| 目的 | 推奨図 | 避けたい図 |
|---|---|---|
| 時系列トレンド | 折れ線/移動平均/面(少色) | 円/3D棒 |
| カテゴリ比較 | 棒(縦/横)/箱ひげ | 折れ線(非時系列) |
| 構成比 | 積み上げ棒/100%積み上げ | 円・ドーナツ(カテゴリ多) |
| 相関 | 散布図/回帰線/ヒートマップ | 過度なバブル/3D散布 |
| 分布 | ヒストグラム/KDE/箱ひげ | 円・ドーナツ |
迷ったら:「読み手が値の推移を見たい → 折れ線」「大小比較をしたい → 棒」「割合の変化を見たい → 100%積み上げ」。
ステップ3:Matplotlibで“最低限・読みやすい”図を描く
目的:月次売上の推移を1本の折れ線で見せ、全体感を掴む
import pandas as pd
import matplotlib.pyplot as plt
# 前処理(例)
df = pd.read\_csv("sales.csv", parse\_dates=\["date"])
.assign(amount=lambda d: d\["qty"] \* d\["price"],
ym=lambda d: d\["date"].dt.to\_period("M").astype(str))
monthly = df.groupby("ym", as\_index=False).agg(sales=("amount", "sum"))
# 折れ線(トレンド)
plt.figure()
plt.plot(monthly\["ym"], monthly\["sales"], marker="o")
plt.title("月次売上の推移")
plt.xlabel("年月"); plt.ylabel("売上")
plt.xticks(rotation=45)
plt.tight\_layout()
plt.show()読みやすさのコツ:タイトル/軸/単位は必須、tight_layout()で崩れ防止、月ラベルは45°傾けて重なり回避。
ステップ4:カテゴリ比較は“横棒”が強い
目的:上位店舗の大小比較を一目で伝える
top_store = (df.groupby("store", as_index=False)
.agg(sales=("amount", "sum"))
.sort_values("sales", ascending=False)
.head(10))
plt.figure()
plt.barh(top\_store\["store"], top\_store\["sales"]) # 横棒
plt.title("上位店舗の売上(TOP10)")
plt.xlabel("売上")
plt.gca().invert\_yaxis() # 1位を上に
plt.tight\_layout(); plt.show()なぜ横棒? 日本語ラベルは長くなりがち。横棒だと文字が収まり、ランキングの情報も同時に伝えやすくなります。
ステップ5:分布を読む(箱ひげ&ヒストグラム)
目的:ばらつきや外れ値の有無を把握し、対策(例:価格帯の見直し)を考える土台を作る
import numpy as np
# 単価の分布
plt.figure(); plt.hist(df\["price"].dropna(), bins=30)
plt.title("単価の分布"); plt.xlabel("単価"); plt.ylabel("頻度")
# 店舗ごとの金額分布(箱ひげ)
amount = df\["qty"] \* df\["price"]
by\_store = \[amount\[df\["store"] == s] for s in top\_store\["store"]]
plt.figure(); plt.boxplot(by\_store, labels=top\_store\["store"], showfliers=False)
plt.title("店舗別の金額分布(外れ値非表示)"); plt.xticks(rotation=45)
plt.tight\_layout(); plt.show()読み方:箱ひげは中央値・四分位を見る道具。外れ値の有無は注釈や別図で扱いを明確にしましょう。
ステップ6:Plotlyで“インタラクティブに”検証
目的:値をホバーで確認し、異常点やイベント時期を素早く特定
import plotly.express as px
fig = px.line(monthly, x="ym", y="sales", markers=True,
title="月次売上の推移(ホバーで値を確認)")
fig.update\_layout(xaxis\_title="年月", yaxis\_title="売上")
fig.show()使い分け:レポート書き出しはMatplotlib、探索やダッシュボードはPlotlyが快適。
ステップ7:ヒートマップ/ファセットで“全体像”を掴む
目的:年月×店舗の俯瞰と、商品別の比較を一画面で行う
# 年月×店舗の売上ヒートマップ(Plotly)
pv = pd.pivot_table(df.assign(ym=lambda d: d["date"].dt.to_period("M").astype(str)),
index="ym", columns="store", values=df["qty"]*df["price"],
aggfunc="sum", fill_value=0)
fig = px.imshow(pv, aspect="auto", title="売上ヒートマップ(ym×store)")
fig.update\_xaxes(title="店舗"); fig.update\_yaxes(title="年月")
fig.show()
# ファセット(カテゴリ別に小さな同型グラフを並べる)
by\_product = (df.assign(ym=lambda d: d\["date"].dt.to\_period("M").astype(str))
.groupby(\["ym", "product"], as\_index=False)
.agg(sales=("qty", "sum")))
fig = px.line(by\_product, x="ym", y="sales", facet\_col="product", facet\_col\_wrap=3)
fig.update\_layout(showlegend=False, title="商品別の月次数量推移")
fig.show()注意:ファセットは同一スケールで比較。凡例は省き、視線の往復を減らします。
ステップ8:注釈・基準線・ハイライトで視線誘導
目的:ここを見て!を視覚的に示し、読み手の思考コストを下げる
plt.figure(); plt.plot(monthly["ym"], monthly["sales"], marker="o")
plt.axhline(monthly["sales"].mean(), linestyle="--") # 平均線
plt.annotate("キャンペーン開始", xy=(5, monthly["sales"].iloc[5]), xytext=(6, monthly["sales"].max()),
arrowprops=dict(arrowstyle="->"))
plt.title("月次売上(平均線と注釈付き)"); plt.xticks(rotation=45)
plt.tight_layout(); plt.show()コツ:矢印・囲み・色は注意を引きます。言いたい点にピンを打つつもりで。
ステップ9:ダッシュボード素材の“型”をつくる
- 長期トレンド:月次折れ線+移動平均
- カテゴリ比較:上位10の横棒
- 分布:単価ヒストグラム
- 構成比:100%積み上げ棒(主要カテゴリのみ)
- 要因:年月×店舗のヒートマップ
同じフォーマットで毎月出すと、読む側の負担が劇的に下がります。
ステップ10:レポート1枚の型(10分LTにも効く)
- 結論(太字1行)
- 根拠図(大きく1枚:注釈/基準線付き)
- 補助図(小さく2枚:比較/分布)
- 打ち手(次アクションを具体化:AB案)
>>【保存版】面接で刺さる発表の作り方:10分LTテンプレ/スライド構成/図解/Q&A台本/練習法まで完全ガイド
実務Tips:配色・書式・出力の最短メモ
- 色は2〜3色+強調1色に絞る
- 桁区切りと単位の統一で読みやすさUP
- 画像は横長(16:9)で保存。日本語フォント崩れはPDF出力で回避
学習サポート:最短で“意思決定に効く可視化”へ
独学でも到達できますが、レビューや質問対応があるとメッセージ設計→注釈→配色まで磨き込めます。
6ヶ月ロードマップに沿ってポートフォリオまで仕上げたい方は、下記2校の無料カウンセリングから。
- 株式会社キカガク:業務再現型課題と出口支援で、可視化→意思決定まで連動。
- Tech Academy:質問の速さ×短時間運用で継続しやすい。レポート納品の型づくりに◎。
TechAcademy データサイエンスコース(受講料:174,600円~ ※更に割引あり)

株式会社キカガク AI人材長期育成コース(受講料:237,600円~)

ミニプロジェクト(提出推奨)
課題:「上位店舗の月次売上トレンドと構成比を1枚にまとめ、3行で示唆を記載」。
sales.csvからamount=qty*price、ymを作る- 図1(大):
ym×売上の折れ線+移動平均(重要イベントに注釈) - 図2(小):上位10店舗の横棒(凡例なし、ラベル明確)
- 図3(小):主要カテゴリの100%積み上げ棒(構成比の変化)
- スライド:結論1行+根拠図+打ち手(仮説A/B)
レビュー観点チェックリスト(コピペ可)
- [ ] 目的/メッセージの1文が先にある
- [ ] 図の選択が目的と一致(時系列→折れ線、比較→棒)
- [ ] タイトル/軸/単位/注釈が整っている
- [ ] 色は2〜3色、強調1色のみ
- [ ] 画像は横長、文字は読みやすい大きさ
付録A:Matplotlibの便利スニペット
# 1) 2軸(避けたいが使うなら明確に)
fig, ax1 = plt.subplots(); ax2 = ax1.twinx()
ax1.plot(monthly["ym"], monthly["sales"], marker="o")
ax2.bar(monthly["ym"], monthly["sales"]//1000, alpha=0.3)
ax1.set_ylabel("売上"); ax2.set_ylabel("売上(千)")
plt.xticks(rotation=45); plt.tight_layout(); plt.show()
# 2) 注釈の囲み
y = monthly\["sales"].max(); x = monthly\["sales"].idxmax()
plt.annotate("ピーク", xy=(x, y), xytext=(x, y\*1.1),
bbox=dict(boxstyle="round", alpha=0.2),
arrowprops=dict(arrowstyle="->"))
# 3) 保存(解像度指定)
plt.savefig("figure.png", dpi=200, bbox\_inches="tight")付録B:Plotlyの便利スニペット
# 1) 散布図+回帰線
fig = px.scatter(df, x="price", y=df["qty"]*df["price"], trendline="ols",
labels={"x":"単価", "y":"金額"}, title="単価と金額の関係")
fig.show()
# 2) 100%積み上げ棒(正規化)
import numpy as np
share = (by\_product.pivot(index="ym", columns="product", values="sales")
.apply(lambda s: s / s.sum(), axis=1))
fig = px.area(share, title="カテゴリ構成比(100%積み上げ)")
fig.show()この記事から次に読むべきもの(内部リンク)
-
-
【実務で差がつく】pandas実践:欠損処理・結合・ウィンドウ関数・時系列・品質保証まで“読みやすく速い”型を習得
基礎文法の次は、実務で毎回出る処理を“型”として覚える段階です。 本記事は、pandas 2.x を前提に、欠損・外れ値・結合・ウィンドウ関数・時系列・カテゴリ処理・集計の自動化・大規模データの分割処 ...
-
-
【保存版】scikit-learn基礎:回帰・分類・前処理・パイプライン・交差検証を“実務の型”で習得
機械学習で迷子になる最大の理由は、前処理→学習→評価→改善の順番が曖昧なまま個々のアルゴリズムに飛びつくこと。 本記事は、未経験〜初学者が週10時間×2〜3週で到達できるscikit-learnの最短 ...
-
-
【保存版】モデル評価:指標の選び方・交差検証・閾値最適化・ビジネス接続を“実務の型”で解説
精度が上がらない原因の多くは「評価設計の誤り」にあります。 評価は「何点取れたか」を競うものではなく、意思決定に耐えうるか を検証する営みです。本記事は、回帰/分類/ランキングの 指標選定 → 交差検 ...
-
-
【保存版】データレポート納品の型:要件定義→ETL→検証→可視化→Excel/PDF→引き継ぎまで、失注しないワークフロー完全版
“いい分析”より“伝わる納品”。副業や実務で評価されるのは、意思決定に効く1枚と再現できるパッケージを期限通り出せること。 本記事は、未経験〜初学者が 週10時間×2〜3週 で、要件定義 → データ受 ...
-
-
未経験からデータサイエンティストへ:6ヶ月ロードマップ【現役が解説】
「数学もPythonもゼロだけど、半年で実務に通じる力はつく?」 結論、週10時間×24週の積み上げで「面接で語れる実務再現ポートフォリオ」まで到達できます。 カギは「学ぶ順番」と「毎週の小さな到達点 ...
最近のコメント