形式は整ったのに…中身が地獄!?😱― “可視化の魔法”で暴くデータの裏側 ― #74

あの地獄のカラム整形・型変換・診断魔法を乗り越え、
ようやく「俺はデータを支配した!」と高笑いしていた、あの日の僕。
データの形式は終わった。
ついに“見える化”の時代だ――。
そこで出会った「マットプロットリブ」という名の精霊

覚えたのは──
Matplotlib(マットプロットリブ)という呪文。
Excelでは骨が折れるグラフが、数行で呼び出せる。
棒・折れ線・散布・箱ひげ・ヒスト・相関ヒートマップ……。
「Pythonってここまで絵描けるの!?」と、当時のワイは完全に魔法界に没入。
Matplotlibとは
Pythonでグラフ描画を行うためのライブラリの定番中の定番。科学技術計算の現場でも使われるほどの高い表現力とカスタマイズ性を持つ。「Excelの限界」を知った者が手にする「プロの魔道具」だ。
🪄 そして唱えた、“可視化の呪文”
初めて import matplotlib.pyplot as plt を唱えたとき、
心の中でマットラボ先生が微笑んだ気がした。
plt.bar(df["product_id"], df["sales_yen"])
plt.show()
──で、出た!棒グラフ!
「やばい、俺、データ可視化できてる!」と感動した次の瞬間。

「……おい待て、なんだこの一本だけバカ高い棒グラフは。誰だお前。」
出た、『整って見えるバグ』
冷静に確認したら、「売上=1,000,000円」。
……他は3桁なのに!?
桁、違くない?
単位?人間ミス?いや、カラム名も型も完璧。
つまりこれは――
『整って見えるバグ』
Pythonは文句ひとつ言わず処理を通す。
でも、グラフは正直だ。
ちゃんと“異常”を暴いてくる。
Excelの壁を打ち破る!可視化ツールの真の力
Matplotlibを使うことで、単なるデータの表示ではなく、データの真実を診断する力が手に入ります。
1. Excelでも使う「基本の3セット」:比較と推移の支配者

1-1.棒グラフ: 差の大きさを一撃で見抜く
棒グラフは、どれがどれだけ違うかを「高さのコントラスト」で語る。
A〜Dの4社を並べれば、どの会社が抜けているか一目瞭然。
しかもMatplotlibなら、Excelでは地味に面倒な「誤差バー」や「目標線」も簡単に追加できる。
数字の信頼度まで、コードで“見せる”時代だ。
plt.bar(x, y)
(+α:plt.axhline(target) で目標ラインを召喚)
1-2.折れ線グラフ: 動きと流れを読むトレンドハンター
折れ線グラフは、「いま、どっちに向かっているのか」を読むためのグラフ。
株価やアクセス数のように時間とともに変わるデータの「勢い」や「転換点」を浮かび上がらせる。
複数の線を重ねて描けば、各データのリズムの違いも見えてくる。
その滑らかなラインの裏に、データの“呼吸”がある。
plt.plot(x, y)
(複数の線を重ねると、変化の相関がより鮮明に)
1-3.散布図: 関係性を暴く探偵
散布図は、二つの変数の「関係」や「傾向」を可視化する。
「株価が上がると、取引量も増える?」
そんな“なんとなくの関係”を、無数の点が証拠として並ぶ。
さらにMatplotlibでは、点の色やサイズに別の変数を仕込むことで、三次元的な関係まで一枚に描ける。
まさに、データの関係性を暴く探偵のような存在だ。
plt.scatter(x, y)
(+色やサイズのパラメータで「三次元の推理」も可能)
参考コードは別章にまとめています。
2.異常検知の双剣:分布と外れ値を暴く

ここからはExcelでは“ちょっと腰が重い”が、Pythonならワンライナー。
「整って見える」データの裏に潜む違和感を炙り出す、二つの武器を紹介しよう。
2-1.ヒストグラム: 分布の性格を診断するカルテ
ヒストグラムは、データの「性格診断書」。
平均は同じでも、山の形が違えばまったく別の世界。
外れ値が一つ混じるだけで、グラフが悲鳴を上げる。
binsを細かく調整することで、その“性格の揺らぎ”を正確に見抜ける。
df['列名'].hist(bins=30)
2-2.Boxプロット:客観的な“異常値の宣告”
最後は、感覚論を終わらせるグラフ、Boxプロット。
中央値・四分位・外れ値を一度に並べ、
「このデータは本当に普通か?」を、静かに、しかし容赦なく突きつけてくる。
複数カテゴリを並べれば、分布の姿勢まで比較できる。
df.boxplot(column='列名')
参考コードは別章にまとめています。
3.可視化とは、“異常検知の第一歩”
整ったように見えるデータの裏には、
数値のズレ、単位の不一致、桁の暴走、そして欠損の罠が潜んでいる。
けれどMatplotlibを使えば、
その「違和感」が“見える化”される。
可視化は、真実を暴く最初の武器なんです。
4.呪文リスト:マットラボ先生の得意技
# 分布を暴く
df["売上"].hist(bins=30)
# 外れ値を炙り出す
df.boxplot(column="売上")
# 関係性を可視化する
sns.heatmap(df.corr(), annot=True)
「平均が正義だと思ってた」
「相関があると思ってた」
──そんな信仰をグラフが容赦なく叩き割ってくる。
5.結論:グラフは“嘘をつかない鑑識官”
見た目が整っていても、中身がズレてたら──グラフは即座に告発する。
可視化の魔法とは、データが語る“真実”を暴くための最初の試練だ。
後輩:「先輩、データ分析において、整形は準備運動ですよ。可視化こそ、Pythonが本気を出すステージです」
ワイ:「……マットラボ先生からは、もう逃げられませんね。」
そして気づく。
グラフたちはただの「描画手段」じゃない。
それぞれが、データ世界の鑑識官だったのだ。
鑑識官たちの役割一覧
棒グラフ:勝敗の大きさを明らかにする“比較の鑑識官”
折れ線グラフ:流れの向きを見抜く“トレンドの鑑識官”
散布図:つながりの証拠を暴く“関係性の鑑識官”
ヒストグラム:データの性格を診断する“分布の鑑識官”
Boxプロット:異常を宣告する“客観の鑑識官”
どのグラフも、黙って嘘を暴く。
Matplotlibは、真実を可視化する“データの法医学ラボ”だ。
記事が「面白い」「ためになった」と感じていただけたら、
いいねやフォローをいただけると、次の戦いのエネルギーになります!
6.参考コード
棒グラフ
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ 汎用棒グラフプロッター
# DataFrame(df)の指定列を使って棒グラフを描く関数
# ============================================
def plot_bar(df, x_col, y_col,
title="グラフタイトル",
xlabel="X軸ラベル", ylabel="Y軸ラベル",
color='skyblue', edgecolor='black',
label_name='データ系列名'):
"""
引数:
df : pandas.DataFrame
x_col : X軸に使用する列名
y_col : Y軸に使用する列名
title : グラフタイトル
xlabel : X軸ラベル(末尾にコロンを付与)
ylabel : Y軸ラベル(末尾にコロンを付与)
color : 棒の塗りつぶし色
edgecolor : 棒の枠線色
label_name: 凡例用ラベル
"""
# ▼ データの抽出(X, Y列をDataFrameから取得)
x = df[x_col]
y = df[y_col]
# ▼ 棒グラフを描画
plt.bar(x, y, label=label_name, color=color, edgecolor=edgecolor)
# ▼ タイトルと軸ラベル(読みやすく整形)
plt.title(title, fontsize=16)
plt.xlabel(f"{xlabel}:", fontsize=14)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸のフォントサイズ(統一感を出す)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# ▼ 凡例(系列名を明示)
plt.legend(fontsize=12)
# ▼ 軸のフォーマット例(必要ならコメントアウトを解除)
# 例1:小数点1桁表示
# plt.gca().yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
# 例2:単位を付与(例:「円」など)
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{int(v)} 円'))
# ▼ レイアウト調整(ラベルの重なりを防ぐ)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例
# ============================================
# ▼ 例: DataFrameを定義
df = pd.DataFrame({
'会社': ['A', 'B', 'C', 'D'],
'株価': [10, 25, 15, 30]
})
# ▼ 関数を呼び出して描画
plot_bar(df,
x_col='会社',
y_col='株価',
title="会社別株価",
xlabel="会社名",
ylabel="株価(円)")折れ線グラフ
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ 汎用:折れ線グラフプロッター(メタ化テンプレート)
# 株価などの時間変化を「トレンド」として可視化する関数
# ============================================
def plot_line(df, x_col, y_col,
title="グラフタイトル",
xlabel="X軸ラベル", ylabel="Y軸ラベル",
color='royalblue', linewidth=2.0,
linestyle='-', marker='o', label_name='データ系列名'):
"""
引数:
df : pandas.DataFrame
x_col : X軸に使用する列名(例:日付・時間など)
y_col : Y軸に使用する列名(例:株価など)
title : グラフタイトル
xlabel : X軸ラベル(末尾にコロンを付与)
ylabel : Y軸ラベル(末尾にコロンを付与)
color : 線の色
linewidth : 線の太さ
linestyle : 線のスタイル(例: '-', '--', '-.', ':')
marker : 点の形状(例: 'o', 's', '^', None)
label_name: 凡例用ラベル
"""
# ▼ データの抽出(X=横軸、Y=縦軸)
x = df[x_col]
y = df[y_col]
# ▼ 折れ線グラフを描画
plt.plot(x, y,
label=label_name,
color=color,
linewidth=linewidth,
linestyle=linestyle,
marker=marker)
# ▼ タイトルと軸ラベル(コロン付きで統一)
plt.title(title, fontsize=16)
plt.xlabel(f"{xlabel}:", fontsize=14)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸のフォントサイズ(視認性の確保)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# ▼ 軸ラベルの間隔が詰まる場合は、角度を調整
plt.xticks(rotation=30)
# ▼ 凡例(複数系列の識別をサポート)
plt.legend(fontsize=12)
# ▼ 軸のフォーマット例(必要ならコメントアウト解除)
# 例1:小数1桁
# plt.gca().yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
# 例2:単位を付与(例:「円」など)
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{int(v)} 円'))
# ▼ レイアウト調整(タイトルやラベルが重ならないように)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例:株価のトレンドを追跡する折れ線グラフ
# ============================================
# ▼ 例: DataFrameを作成(仮の株価データ)
df = pd.DataFrame({
'日付': ['2025-10-01', '2025-10-02', '2025-10-03', '2025-10-04', '2025-10-05'],
'株価': [100, 108, 105, 112, 120]
})
# ▼ 関数を呼び出して描画
plot_line(df,
x_col='日付',
y_col='株価',
title="株価のトレンド追跡",
xlabel="日付", ylabel="株価(円)",
color='royalblue', linewidth=2.5, marker='o')
散布図(2次元)
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ 散布図:株価と取引高の関係を“診断”する🔮
# 二つの変数の相関を点で可視化する基本形
# ============================================
def plot_scatter_2d(df, x_col, y_col,
title="グラフタイトル",
xlabel="X軸ラベル", ylabel="Y軸ラベル",
color='royalblue', size=60, alpha=0.7,
edgecolor='black', label_name='データ系列名'):
"""
引数:
df : pandas.DataFrame
x_col, y_col : 散布図に使う2つの列名(例:株価・取引高)
title : グラフタイトル
xlabel : X軸ラベル(末尾にコロンを付与)
ylabel : Y軸ラベル(末尾にコロンを付与)
color : 点の色
size : 点の大きさ
alpha : 透明度(0〜1)
edgecolor : 点の外枠色
label_name: 凡例ラベル
"""
# ▼ データの抽出(X=横軸, Y=縦軸)
x = df[x_col]
y = df[y_col]
# ▼ 散布図を描画(呪文:plt.scatter(x, y))
plt.scatter(x, y,
c=color,
s=size,
alpha=alpha,
edgecolors=edgecolor,
label=label_name)
# ▼ タイトルと軸ラベル(コロン付き)
plt.title(title, fontsize=16)
plt.xlabel(f"{xlabel}:", fontsize=14)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸フォントと目盛の整形
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# ▼ グリッド線(傾向を読み取りやすく)
plt.grid(True, linestyle='--', alpha=0.5)
# ▼ 凡例(系列名を表示)
plt.legend(fontsize=12)
# ▼ 軸フォーマット例(必要ならコメント解除)
# plt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{v:.0f} 円'))
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{v:.0f} 千株'))
# ▼ レイアウト調整(タイトル・ラベルが重ならないように)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例:株価と取引高の関係を診断する散布図
# ============================================
# ▼ サンプルデータ(株価と取引高の相関)
df = pd.DataFrame({
'株価': [100, 120, 140, 160, 180, 200],
'取引高': [300, 350, 400, 500, 600, 720]
})
# ▼ 関数を呼び出して描画
plot_scatter_2d(df,
x_col='株価',
y_col='取引高',
title="株価と取引高の関係",
xlabel="株価(円)",
ylabel="取引高(千株)",
color='royalblue')散布図(3次元)
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ 散布図:二つの変数間の関係性を“診断”する🔮
# 株価と取引高のような相関を点で可視化する関数
# ============================================
def plot_scatter(df, x_col, y_col,
title="グラフタイトル",
xlabel="X軸ラベル", ylabel="Y軸ラベル",
color='royalblue', size=60, alpha=0.7,
label_name='データ系列名',
color_by=None, size_by=None):
"""
引数:
df : pandas.DataFrame
x_col, y_col : 散布図に使う2つの列名
title : グラフタイトル
xlabel : X軸ラベル(末尾にコロンを付与)
ylabel : Y軸ラベル(末尾にコロンを付与)
color : 点の色(固定値 or color_by で上書き)
size : 点の大きさ(固定値 or size_by で上書き)
alpha : 点の透明度(0〜1)
label_name: 凡例ラベル
color_by : 色分けに使う列名(例:業種・セクターなど)
size_by : サイズに使う列名(例:時価総額・出来高など)
"""
# ▼ データの抽出(X=横軸, Y=縦軸)
x = df[x_col]
y = df[y_col]
# ▼ 点の色・サイズに他変数を割り当てる(指定がある場合)
c = df[color_by] if color_by else color
s = df[size_by] * 10 if size_by else size # サイズ列はスケール調整
# ▼ 散布図を描画(呪文:plt.scatter(x, y))
plt.scatter(x, y,
c=c,
s=s,
alpha=alpha,
edgecolors='black',
label=label_name,
cmap='viridis' if color_by else None)
# ▼ タイトルと軸ラベル(コロン付きで整形)
plt.title(title, fontsize=16)
plt.xlabel(f"{xlabel}:", fontsize=14)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸フォントサイズと回転(視認性の向上)
plt.xticks(fontsize=12, rotation=0)
plt.yticks(fontsize=12)
# ▼ グリッド線(相関の傾向を読みやすくする)
plt.grid(True, linestyle='--', alpha=0.5)
# ▼ 凡例(系列・カテゴリ名を明示)
plt.legend(fontsize=12)
# ▼ 軸フォーマット例(必要に応じてコメントアウト解除)
# plt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{v:.0f} 円'))
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{v:.0f} 件'))
# ▼ レイアウト調整(タイトルやラベルが重ならないように)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例:株価と取引高の関係を診断する散布図
# ============================================
# ▼ 例: 株式データのサンプル(相関あり)
df = pd.DataFrame({
'株価': [100, 120, 140, 160, 180, 200],
'取引高': [300, 350, 400, 500, 600, 720],
'時価総額': [50, 70, 85, 95, 110, 130], # サイズ変数
'業種': ['A', 'A', 'B', 'B', 'C', 'C'] # カラー変数
})
# ▼ 基本形:株価と取引高の関係をプロット
plot_scatter(df,
x_col='株価',
y_col='取引高',
title="株価と取引高の関係",
xlabel="株価(円)", ylabel="取引高(千株)")
# ▼ 応用:色とサイズを追加(3変数の関係を2次元で表現)
# plot_scatter(df,
# x_col='株価',
# y_col='取引高',
# color_by='業種', # 色で業種を表現
# size_by='時価総額', # サイズで時価総額を表現
# title="株価×取引高×時価総額(業種別)",
# xlabel="株価(円)", ylabel="取引高(千株)")
ヒストグラム
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ ヒストグラム:データの偏りと外れ値を“診断”する📉
# 分布の形や外れ値の存在を可視化する関数
# ============================================
def plot_hist(df, col,
bins=30,
title="グラフタイトル",
xlabel="X軸ラベル", ylabel="頻度",
color='skyblue', edgecolor='black',
alpha=0.8, density=False):
"""
引数:
df : pandas.DataFrame
col : ヒストグラムを描画する列名
bins : 階級数(デフォルト=30)
title : グラフタイトル
xlabel : X軸ラベル(末尾にコロンを付与)
ylabel : Y軸ラベル(通常は「頻度」)
color : 棒の塗りつぶし色
edgecolor : 棒の枠線色
alpha : 棒の透明度(0〜1)
density : Trueで確率密度(割合)として描画
"""
# ▼ データ抽出(指定列のみ使用)
data = df[col]
# ▼ ヒストグラムを描画(呪文:df['列名'].hist(bins=30))
plt.hist(data,
bins=bins,
color=color,
edgecolor=edgecolor,
alpha=alpha,
density=density)
# ▼ タイトルと軸ラベル(コロン付きで整形)
plt.title(title, fontsize=16)
plt.xlabel(f"{xlabel}:", fontsize=14)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸フォントサイズ
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
# ▼ グリッド線(分布の谷や山を読みやすく)
plt.grid(True, linestyle='--', alpha=0.5)
# ▼ 軸フォーマット例(必要ならコメント解除)
# plt.gca().xaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{int(v)}'))
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{int(v)} 回'))
# ▼ レイアウト調整(ラベルやタイトルの重なり防止)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例:データの偏りと外れ値を診断するヒストグラム
# ============================================
# ▼ サンプルデータ(株価の分布)
df = pd.DataFrame({
'株価': [100, 102, 105, 107, 108, 110, 112, 113, 115, 118,
120, 122, 125, 127, 130, 132, 135, 140, 145, 200] # 外れ値あり
})
# ▼ 関数を呼び出して描画
plot_hist(df,
col='株価',
bins=15, # 階級数を調整して分布を細かく表示
title="株価分布のヒストグラム",
xlabel="株価(円)", ylabel="件数",
color='skyblue', edgecolor='black', alpha=0.8)
# ▼ 応用例:確率密度で描画(分布形を確認したい場合)
# plot_hist(df,
# col='株価',
# bins=30,
# density=True,
# title="株価分布(確率密度)",
# xlabel="株価(円)", ylabel="確率密度")
BOXプロット
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
# ============================================
# ▼ Boxプロット:客観的な“外れ値”を炙り出す📦
# データのばらつき・中央値・四分位数を一目で可視化
# ============================================
def plot_box(df, col,
title="グラフタイトル",
ylabel="Y軸ラベル",
color='skyblue', box_width=0.6,
showfliers=True, # 外れ値の点を表示
patch_artist=True): # Boxを塗りつぶし
"""
引数:
df : pandas.DataFrame
col : Boxプロットに使用する列名
title : グラフタイトル
ylabel : Y軸ラベル(末尾にコロンを付与)
color : Boxの塗りつぶし色
box_width : Boxの幅
showfliers : 外れ値の点を表示するか
patch_artist: Boxを塗りつぶし描画するか(Trueで色つき)
"""
# ▼ データ抽出(指定列)
data = df[col]
# ▼ Boxプロットを描画(呪文:df.boxplot(column='列名'))
box = plt.boxplot(data,
patch_artist=patch_artist,
widths=box_width,
showfliers=showfliers,
boxprops=dict(facecolor=color, color='black'),
medianprops=dict(color='red', linewidth=2),
whiskerprops=dict(color='black'),
capprops=dict(color='black'))
# ▼ タイトルと軸ラベル(コロン付きで整形)
plt.title(title, fontsize=16)
plt.ylabel(f"{ylabel}:", fontsize=14)
# ▼ 軸フォントサイズ
plt.xticks([1], [col], fontsize=12) # Box1本だけのとき
plt.yticks(fontsize=12)
# ▼ グリッド線(四分位範囲を読み取りやすく)
plt.grid(True, linestyle='--', alpha=0.5)
# ▼ 軸フォーマット例(必要ならコメント解除)
# plt.gca().yaxis.set_major_formatter(ticker.FuncFormatter(lambda v, _: f'{int(v)} 円'))
# ▼ レイアウト調整(ラベルやタイトルの重なり防止)
plt.tight_layout()
# ▼ グラフを表示
plt.show()
# ============================================
# ▼ 使用例:データのばらつきと外れ値を診断するBoxプロット
# ============================================
# ▼ サンプルデータ(株価リターンの分布)
df = pd.DataFrame({
'リターン率(%)': [1.2, 0.8, 1.5, 1.1, 0.9, 1.3, 1.7, 1.0, 5.5, 1.2, 0.7, 1.8]
})
# ▼ 関数を呼び出して描画
plot_box(df,
col='リターン率(%)',
title="株価リターンのばらつきと外れ値",
ylabel="リターン率(%)",
color='lightblue')
# ▼ 応用例:複数列を比較(カテゴリごと)
# df_multi = pd.DataFrame({
# '銘柄A': [1.2, 1.0, 0.9, 1.1, 5.2],
# '銘柄B': [0.8, 0.7, 0.9, 1.2, 1.1],
# '銘柄C': [1.5, 1.4, 1.6, 1.3, 1.2]
# })
# df_multi.boxplot(column=['銘柄A', '銘柄B', '銘柄C'], patch_artist=True,
# boxprops=dict(facecolor='skyblue'), medianprops=dict(color='red'))
# plt.title("銘柄別リターン率の比較", fontsize=16)
# plt.ylabel("リターン率(%):", fontsize=14)
# plt.grid(True, linestyle='--', alpha=0.5)
# plt.tight_layout()
# plt.show()いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!