自由分析
このレッスンでできるようになること。マイショップ以外のデータにも、これまでの手順をそのまま当てはめられるようになります。
ここまでずっと同じ売上CSVを扱ってきました。同じデータだからこそ手順に集中できたわけですが、実務で出会うのは初めて見るデータです。列名も違えば、粒度も違います。それでも、やることは変わりません。
手順を思い出してください。読み込む、形を見る、掃除する、集計する、図にする、示唆を出す。この6段は、家計簿でも、アクセスログでも、部活の記録でも同じです。変わるのは列の名前だけです。
たとえば Python 入門で作った家計簿のCSVを持ってきたとします。列は 日付 と 費目 と 金額 かもしれません。マイショップの 売上日 が 日付 に、カテゴリ が 費目 に対応します。店舗にあたる軸が無ければ、その分の集計は省きます。逆に 支払い方法 のような列があれば、それが新しい軸になります。
Python
df = pd.read_csv(StringIO(csv_text))
print(df.columns.tolist())
print(df.dtypes)初めてのデータで最初にやるのは、この2行です。どんな列があり、それぞれが何型で読まれたか。金額のはずの列が object 型なら、3章でやったように「1,200円」のような文字が混ざっています。日付のはずの列が object なら to_datetime が要ります。この確認を飛ばして集計に進むと、必ずどこかで詰まります。
自由分析でやりがちな失敗が1つあります。データを見る前に「こういう結果が出るはずだ」と決めてしまうことです。自分のデータほど思い込みが強いので、期待した結論に合う切り口だけを探してしまいます。防ぐには、集計する前に問いを1つ書き、その問いに対して「はい」でも「いいえ」でも受け入れると決めておくことです。
この演習では、列名が違うデータを受け取って、指定された軸で集計する関数を書きます。列名を引数で受け取る形にしておくと、同じ関数がどのデータにも使えます。この汎用化の感覚が、次のレッスンの清書につながります。
要件
- 列名は sorted() で昇順に並べる
- group_column と value_column が両方あるときだけ集計する
- 集計は groupby(group_column)[value_column].sum() で行う
- 合計は int に直す
- 指定された列が無いときは totals を空、top を空文字にする
入出力例
analyze_any("売上日,店舗,商品名,カテゴリ,数量,金額
2026-01-05,渋谷店,白磁のマグカップ,食器,2,3600
2026-02-03,渋谷店,鋳物ホーロー鍋,調理器具,1,16800
2026-01-06,横浜店,鉄のフライパン,調理器具,1,7800
", "店舗", "金額") → {"columns":["カテゴリ","商品名","売上日","店舗","数量","金額"],"rows":3,"top":"渋谷店","totals":{"横浜店":7800,"渋谷店":20400}}
analyze_any("日付,費目,金額
2026-01-05,食費,1200
2026-01-06,交通費,640
2026-01-07,食費,880
", "費目", "金額") → {"columns":["日付","費目","金額"],"rows":3,"top":"食費","totals":{"交通費":640,"食費":2080}}
analyze_any("日付,費目,金額
2026-01-05,食費,1200
2026-01-06,交通費,640
", "店舗", "金額") → {"columns":["日付","費目","金額"],"rows":2,"top":"","totals":{}}