1. test 1
  2. test 2
コース一覧
データ分析入門 Python(pandas)
外れ値を見つける

データ分析入門 Python(pandas)

pandasによるデータの読み込み・抽出・前処理、groupbyによる集計、表の結合、matplotlibによる可視化、そして前月比や移動平均を使った分析の実践まで、データ分析の基礎を、毎レッスン実際にコードを書き、多店舗ショップの売上データを分析レポートに仕上げながら学べるコースです。Python入門を修了した方を対象としています。約 14.5 時間 (1 日 30 分 × 29 日) で 57 レッスンを修了でき、修了後は手元のCSVを自力で分析し、グラフと示唆のあるレポートを作れるようになります。

1
データ分析のはじめかた
01. データ分析とは15分
02. pandasとは15分
03. ノートブックの使い方15分
04. CSVを読み込む15分
05. つくる:データと対面する20分
06. 第1章クイズ10分
2
DataFrameのきほん
01. SeriesとDataFrame15分
02. 概観コマンド15分
03. 列を選ぶ15分
04. 行を選ぶ15分
05. 条件で抽出する15分
06. 複数条件15分
07. 並べ替える15分
08. つくる:抽出レポート20分
09. 第2章クイズ10分
3
データの前処理
01. 欠損を見つける15分
02. 欠損を埋める・落とす15分
03. 型を直す15分
04. 重複を消す15分
05. 表記ゆれを整える15分
06. 日付型にする15分
07. つくる:データクレンジング20分
08. 第3章クイズ10分
4
集計とグループ化
01. 集計のきほん15分
02. groupby15分
03. 複数キーで束ねる15分
04. aggで一気に15分
05. ピボットテーブル15分
06. 出現回数15分
07. つくる:月次集計表20分
08. 第4章クイズ10分
5
結合と整形
01. なぜ結合が要るか15分
02. mergeで結合する15分
03. 結合の種類15分
04. 縦に積む15分
05. つくる:統合データセット20分
06. 第5章クイズ10分
6
可視化
01. グラフのきほん15分
02. 棒グラフ15分
03. 折れ線グラフ15分
04. ヒストグラム15分
05. 複数系列15分
06. ラベルと整え15分
07. つくる:ダッシュボード4枚20分
08. 第6章クイズ10分
7
分析の実践
01. 問いの立て方15分
02. 前月比15分
03. 移動平均15分
04. 構成比15分
05. 外れ値を見つける15分
06. つくる:示唆を1枚に20分
07. 第7章クイズ10分
8
総合制作
01. 分析レポート完成20分
02. 提案を書く20分
03. 自由分析20分
04. 見せる形に整える20分
05. 完成と次のステップ20分

外れ値を見つける

このレッスンでできるようになること。記述統計と条件式で突出した売上日を見つけ、その理由を推測できるようになります。

平均から大きく離れた値を外れ値と呼びます。外れ値には2つの顔があります。1つは間違いです。単位を取り違えた入力、桁の打ち間違い、テストデータの混入。もう1つは事実です。セールの日、テレビで紹介された日、法人からのまとめ買い。どちらなのかを判断するのが分析者の仕事で、機械が決めることではありません。

見つけ方はいくつかありますが、まずは平均と標準偏差を使う方法を覚えます。標準偏差は、値が平均からどれくらいばらついているかを表す数字です。describe を呼べばまとめて出ます。

Python

daily = df.groupby("売上日")["金額"].sum().sort_index() mean = daily.mean() std = daily.std() high = daily[daily > mean + 2 * std]

平均から標準偏差2つ分より外側を外れ値とみなす、というのがよく使われる線引きです。この2という数字に絶対的な根拠はありません。分布の形によっては厳しすぎたり緩すぎたりします。だからこそ、なぜその線を引いたのかを説明できるようにしておきます。

注意すべき点があります。平均も標準偏差も、外れ値そのものに引っ張られます。極端な1日があると平均が上がり標準偏差も大きくなるので、その日自身が外れ値と判定されにくくなります。これを避けたいときは、中央値と四分位範囲を使う方法に切り替えます。中央値は極端な値に動かされないので、より頑丈な線引きになります。

見つけたあとが本番です。外れ値を機械的に消してはいけません。まず日付を見ます。年末やセールの日なら事実である可能性が高いです。金額の桁を見ます。他の日の10倍を超えているなら入力ミスを疑います。同じ日に同じ商品の行が大量にあるなら、まとめ買いか二重計上かを確かめます。二重計上は3章の drop_duplicates で落としたはずですが、日付だけが1日ずれている重複は残ります。

判断したら、レポートには対処と理由を書きます。「12月24日の売上は平均の3倍だったが、年末商戦によるもので実在の売上と判断し、集計に含めた」。この一文があるかどうかで、レポートの信頼度は大きく変わります。数字を出すことより、数字をどう扱ったかを説明することのほうが、実務では重く見られます。

要件

  1. 売上日ごとに 金額 を集計してから統計量を求める
  2. 平均は mean、標準偏差は std を使う
  3. 閾値は 平均 + k × 標準偏差 とする
  4. 閾値より大きい日だけを外れ値とする(閾値と等しい日は含めない)
  5. float はすべて round(..., 1) で丸めて返す

入出力例

detect_outliers("売上日,店舗,商品名,カテゴリ,数量,金額 2026-12-22,渋谷店,白磁のマグカップ,食器,5,10000 2026-12-23,横浜店,鉄のフライパン,調理器具,2,12000 2026-12-24,渋谷店,鋳物ホーロー鍋,調理器具,4,60000 2026-12-25,大宮店,積み重ね収納ボックス,収納,7,11000 2026-12-26,横浜店,布製収納バスケット,収納,6,9000 ", 1.5) → {"mean":20400,"outlier_dates":["2026-12-24"],"ratio":2.9,"threshold":53647.9} detect_outliers("売上日,店舗,商品名,カテゴリ,数量,金額 2026-05-01,渋谷店,白磁のマグカップ,食器,3,5000 2026-05-02,横浜店,白磁のマグカップ,食器,3,5200 2026-05-03,大宮店,布製収納バスケット,収納,3,4800 2026-05-04,渋谷店,木製カッティングボード,調理器具,1,5100 ", 2) → {"mean":5025,"outlier_dates":[],"ratio":0,"threshold":5366.6}

ヒント

daily = df.groupby("売上日")["金額"].sum().sort_index() が土台です

daily[daily > threshold] で条件に合う日だけを取り出せます

ratio は 最大の外れ値 ÷ 平均 です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/08/10

関連レッスン

  • つくる:示唆を1枚に

    数字を言葉に変換できる

  • 第7章クイズ

    章の理解を確認できる

  • 分析レポート完成

    問い→分析→示唆を通せる

main.py
学習モード
エディタを読み込んでいます

メモ

外れ値を見つける

⌘S で保存