ヒストグラム
このレッスンでできるようになること。購入金額の分布をヒストグラムで描き、どの価格帯に売上が集中しているかを読めるようになります。
平均単価が8000円だと聞いて、8000円前後の商品がよく売れていると考えるのは早計です。1800円の白磁のマグカップが大量に売れ、16800円の鋳物ホーロー鍋がときどき売れているだけかもしれません。平均は分布を1つの数字に潰してしまうので、潰す前の形を見る必要があります。それがヒストグラムです。
ヒストグラムは、値の範囲をいくつかの区間に区切り、それぞれの区間に何件入るかを数えた図です。棒グラフと形は似ていますが、意味がまったく違います。棒グラフの横軸は分類、ヒストグラムの横軸は数値の目盛りです。だからヒストグラムの棒には隙間がありません。
Python
counts, edges, patches = ax.hist(df["金額"], bins=4)hist は3つの値を返します。counts が各区間の件数、edges が区間の境目、patches が描かれた棒です。区間の数は bins で指定します。bins を変えると図の印象はかなり変わります。細かく切れば凸凹が目立ち、粗く切ればなだらかになります。どちらが正しいということはありませんが、都合の良い形になるまで bins をいじるのは分析ではありません。まず既定に近い数で見て、必要があれば理由とともに変えます。
読み返すときは counts をそのまま使えます。numpy の配列なので、tolist() を掛けてから中身を int に直します。区間の境目も同様に読めます。
Python
values = [int(c) for c in counts.tolist()]分布を見ると、売上の性格が言葉になります。低い価格帯に山が1つあれば「日用品中心の店」、山が2つに分かれていれば「安い雑貨と高額な調理器具の二極」と読めます。山が2つあるデータの平均は、どちらの山にも属さない谷の位置を指すことがあります。平均が実態を表さない典型です。ヒストグラムを描く習慣は、平均に騙されないための保険になります。
要件
- ax.hist で bins を指定してヒストグラムを描く
- counts は hist の戻り値から読み返す
- 件数は int に直す
- busiest は counts から求める
- matplotlib.use("Agg") を pyplot の import より前に書く
入出力例
draw_amount_hist("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-01-07,大宮店,積み重ね収納ボックス,収納,3,4500
2026-01-08,渋谷店,木製カッティングボード,調理器具,1,4200
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
", 4) → {"bin_count":4,"busiest":0,"counts":[3,0,0,1]}
draw_amount_hist("売上日,店舗,商品名,カテゴリ,数量,金額
2026-03-01,大宮店,布製収納バスケット,収納,2,3000
2026-03-02,横浜店,白磁のマグカップ,食器,2,3600
2026-03-03,横浜店,鉄のフライパン,調理器具,1,7800
2026-03-04,渋谷店,白磁のマグカップ,食器,4,7200
", 2) → {"bin_count":2,"busiest":0,"counts":[2,2]}