Pythonの入門書や入門講座を、ひととおり終えた方も多いでしょう。
変数、if文、for文、関数までは書けるようになったけれど…
「Pythonの基礎は終わったけど、次に何をすればいいの?」
「データ分析の練習をしたいけど、ちょうどいい課題が見つからない」
と、手が止まってしまっていませんか。
その気持ち、よくわかります。
結論から言うと、基礎の次は、小さな表データで「集計→図→仮説」を1周やり切るのがおすすめです。
この記事では、店舗の売上CSVを使って、pandasとmatplotlibで3段階を練習する手順をご紹介します。
コードと、実行したときに出てくる結果、正しくできたかの確かめ方をセットで載せています。
読み終えるころには、自分の仕事のデータでも同じ流れを試せるようになっているはずです。
一緒に手を動かしていきましょう!
先に結論|基礎の次は「集計→図→仮説」を1周する
データ分析の仕事は、大きく分けると次の3段階で進みます。
| 段階 | やること | 使うもの | ゴール |
| STEP1 集計 | 表を読み込み、知りたい切り口でまとめる | pandas | 店舗×月の売上表ができる |
| STEP2 図 | まとめた表をグラフにする | matplotlib | 変化が一目でわかる |
| STEP3 仮説 | 「なぜ?」を1つ立てて、データで確かめる | pandas | 次に打つ手が言える |
文法の練習問題をいくら解いても、この3段階を通しで経験しないと「分析ができる」という感覚はつかみにくいものです。
逆に、20行ほどの小さなデータでも、1周やり切れば仕事のデータにそのまま応用できます。
練習に使うデータ|Excelの記事と同じ売上CSV
練習には、Excelの月次集計を自動化する記事と同じCSVを使います。
あちらの記事では、同じCSVをPower QueryとPythonで集計するところまでを試しました。
この記事はその続きとして、集計の先の「図」と「仮説」まで進みます。
文房具を売る3つの店舗(本店、駅前店、オンライン)の、10月と11月の注文の記録です。
架空のデータなので、安心して練習に使ってください。
フォルダーの作り方
まず、作業用のフォルダーを1つ作り、次のように置きます。
作業用のフォルダー/
├─ analysis.py ← これから書くプログラム
└─ monthly_sales/ ← CSVを入れるフォルダー
├─ sales_2026-10.csv
└─ sales_2026-11.csv
CSVの中身
Excelの記事でCSVを作った方は、そのファイルをコピーして使ってください。
まだの方は、次の内容をテキストエディタに貼りつけ、文字コードをUTF-8にして保存しましょう。
sales_2026-10.csv:
注文日,店舗,商品,数量,単価,金額,状態
2026-10-01,本店,ノート,3,250,750,完了
2026-10-02,駅前店,ボールペン,10,120,1200,完了
2026-10-05,オンライン,ファイル,4,300,1200,完了
2026-10-08,本店,ボールペン,5,120,600,キャンセル
2026-10-12,駅前店,ノート,6,250,1500,完了
2026-10-15,オンライン,ノート,2,250,500,完了
2026-10-19,本店,ファイル,5,300,1500,完了
2026-10-22,駅前店,ファイル,2,300,600,キャンセル
2026-10-26,オンライン,ボールペン,8,120,960,完了
2026-10-30,本店,ノート,4,250,1000,完了
sales_2026-11.csv:
注文日,店舗,商品,数量,単価,金額,状態
2026-11-02,本店,ボールペン,6,120,720,完了
2026-11-04,オンライン,ノート,5,250,1250,完了
2026-11-06,駅前店,ファイル,3,300,900,完了
2026-11-09,本店,ファイル,2,300,600,完了
2026-11-11,駅前店,ボールペン,12,120,1440,完了
2026-11-14,オンライン,ファイル,1,300,300,キャンセル
2026-11-18,本店,ノート,7,250,1750,完了
2026-11-21,オンライン,ボールペン,9,120,1080,完了
2026-11-25,駅前店,ノート,4,250,1000,完了
2026-11-28,本店,ボールペン,3,120,360,完了
列の意味は、注文日、店舗、商品、数量、単価、金額(数量×単価)、状態(完了かキャンセル)です。
準備|pandasとmatplotlibを入れる
pandasは表の集計、matplotlibはグラフづくりに使うライブラリです。
ターミナル(WindowsはコマンドプロンプトかPowerShell)で、次のコマンドを実行します。
python -m pip install pandas matplotlib
Macで「python」が見つからないと言われたら、「python3」に置きかえて実行してください。
※この記事のコードは、Python 3.9.6、pandas 2.3.3、matplotlib 3.9.4で動くことを確かめています。
STEP1|集計:店舗×月の売上表を作る
最初の段階は、集計です。
2つのCSVをまとめて読み込み、キャンセルを除いて、店舗ごと・月ごとの売上表を作ります。
analysis.pyに、次のコードを書きましょう。
from pathlib import Path
import platform
import pandas as pd
import matplotlib.pyplot as plt
# ===== STEP1:集計 =====
folder = Path("monthly_sales") # CSVを置いたフォルダー
frames = [pd.read_csv(p, encoding="utf-8-sig") for p in sorted(folder.glob("sales_*.csv"))]
data = pd.concat(frames, ignore_index=True)
# 注文日から「月」の列を作る
data["月"] = pd.to_datetime(data["注文日"]).dt.strftime("%Y-%m")
# キャンセルを除く
done = data[data["状態"] != "キャンセル"]
print(f"読み込み: {len(data)}行 / キャンセルを除いて: {len(done)}行")
# 店舗 × 月 の売上表を作る
pivot = done.pivot_table(index="店舗", columns="月", values="金額",
aggfunc="sum", margins=True, margins_name="合計")
print(pivot)
作業用のフォルダーで「python analysis.py」と実行すると、次のように表示されます。
読み込み: 20行 / キャンセルを除いて: 17行
月 2026-10 2026-11 合計
店舗
オンライン 2660 2330 4990
本店 3250 3430 6680
駅前店 2700 3340 6040
合計 8610 9100 17710
pivot_table(ピボットテーブル)は、Excelのピボットテーブルと同じように、行と列の切り口を決めて集計する機能です。
margins=Trueを付けると、いちばん下の行と右の列に「合計」が付きます。
STEP1の確かめ方
集計は、数字が合っているかを自分で確かめるところまでが1セットです。
STEP1で確かめる3つのこと
- 読み込みが20行(10行×2ファイル)、キャンセルを除いて17行になっているか
- 右下の合計が17,710円になっているか(Excelの記事の合計と同じ)
- 1か所だけ手で計算して合うか(例:駅前店の10月は1,200円+1,500円=2,700円)
3つとも合えば、STEP1は完了です。
合わないときは、CSVのファイル名が「sales_」で始まっているか、文字コードがUTF-8かを確かめてください。
STEP2|図:棒グラフにして、変化を目で見る
次の段階は、図です。
表のままだと、どの店舗がどれだけ変わったのかを読み取るのに少し時間がかかります。
STEP1のコードの下に、次のコードを書き足しましょう。
# ===== STEP2:図 =====
# 日本語の文字化けを防ぐ(WindowsはMeiryo、MacはHiragino Sans)
plt.rcParams["font.family"] = "Meiryo" if platform.system() == "Windows" else "Hiragino Sans"
table = pivot.drop(index="合計", columns="合計") # 合計の行と列を外す
ax = table.plot(kind="bar", rot=0, figsize=(6, 4))
ax.set_title("店舗別の売上(キャンセルを除く)")
ax.set_xlabel("")
ax.set_ylabel("売上(円)")
plt.tight_layout()
plt.savefig("sales_by_store.png", dpi=150)
print("sales_by_store.png を保存しました")
もう一度「python analysis.py」と実行すると、STEP1の表のあとに次の1行が表示されます。
sales_by_store.png を保存しました
作業用のフォルダーに、sales_by_store.pngという画像ファイルができています。
グラフの読み方
開いてみると、横に「オンライン」「本店」「駅前店」が並んだ棒グラフになっています。
それぞれの店舗に、10月(青)と11月(オレンジ)の2本の棒が並びます。
棒を見比べると、次の3つがすぐにわかります。
- オンラインだけ、11月の棒が10月より低い
- 本店は、11月の棒が少しだけ高い
- 駅前店は、11月の棒が10月よりはっきり高い
表で数字を見比べるより、駅前店の伸びが一番大きいことが一目でわかります。
これが、図にする一番の意味です。
STEP2の確かめ方
STEP2で確かめる2つのこと
- 棒の高さが、STEP1の表の数字と合っているか(駅前店の11月は3,340円なので、3,000と3,500の目盛りの間)
- タイトルや店舗名の日本語が「□□□」に化けていないか
日本語が化けるときは、フォントの指定の行を確かめてください。
WindowsならMeiryo、MacならHiragino Sansが、はじめから入っているフォントです。
STEP3|仮説:「なぜ?」を1つだけ立てて、確かめる
最後の段階は、仮説です。
図を見て一番気になったことに「なぜ?」と問い、答えの候補を1つだけ立てます。
仮説を1つ立てる
STEP2の図で一番目立ったのは、駅前店の伸び(2,700円→3,340円、640円増)でした。
ここで、元のCSVを見返してみます。
すると、10月の駅前店には、ファイル600円分のキャンセルが1件あることに気づきます。
そこで、次の仮説を立ててみましょう。
駅前店の伸びは、注文が増えたからではなく、10月にあったキャンセルが11月にはなかったからでは?
STEP1の表はキャンセルを除いているので、キャンセルが減るだけでも売上が伸びたように見えるのです。
仮説を確かめるコード
この仮説が正しければ、キャンセルも含めた「注文ベース」の売上で比べると、駅前店はほとんど伸びていないはずです。
STEP2のコードの下に、次のコードを書き足しましょう。
# ===== STEP3:仮説を確かめる =====
# キャンセルを含めた「注文ベース」の売上表
ordered = data.pivot_table(index="店舗", columns="月", values="金額",
aggfunc="sum", margins=True, margins_name="合計")
print("■ 注文ベース(キャンセルを含む)")
print(ordered)
# キャンセルの件数と金額を月ごとに数える
cancel = data[data["状態"] == "キャンセル"]
print("■ キャンセル")
print(cancel.groupby("月")["金額"].agg(件数="size", 金額="sum"))
実行すると、図を保存した行のあとに、次の表が表示されます。
■ 注文ベース(キャンセルを含む)
月 2026-10 2026-11 合計
店舗
オンライン 2660 2630 5290
本店 3850 3430 7280
駅前店 3300 3340 6640
合計 9810 9400 19210
■ キャンセル
件数 金額
月
2026-10 2 1200
2026-11 1 300
結果の読み方
注文ベースで見ると、駅前店は3,300円→3,340円で、40円しか増えていません。
キャンセルを除いた売上で見えていた640円の伸びは、ほとんどがキャンセルが減った分だったことになります。
全体で見ても、注文ベースでは9,810円→9,400円と、410円減っています。
一方でキャンセルは、2件・1,200円から、1件・300円に減りました。
つまり、11月の売上が伸びたのは、注文が増えたからではなく、キャンセルが減ったからというのが、このデータから言えることです。
STEP3の確かめ方
STEP3で確かめる2つのこと
- キャンセルの件数の合計(2件+1件=3件)が、STEP1で除いた行数(20行-17行)と同じか
- 注文ベースとSTEP1の合計の差(19,210円-17,710円=1,500円)が、キャンセルの金額(1,200円+300円)と同じか
どちらも合えば、STEP3の数字は正しく出ています。
仮説を立てるときの3つのルール
最後に、仮説の段階で気をつけたいことを3つお伝えします。
- 仮説は1つに絞る:「なぜ?」の答えを並べると、どれも確かめきれずに終わりがちです
- 確かめ方を先に決める:「正しければ、こうなるはず」を決めてからコードを書きます
- データの量で言い切らない:2か月・20行のデータでわかるのは「傾向の候補」までです
今回の結論も、12月のデータで同じことが起きるかを見るまでは、仮説のままにしておきましょう。
実際の仕事なら、次は「なぜ10月はキャンセルが多かったのか」を、お店の人に聞いてみる番です。
この練習のあとに挑戦したいpandasの課題
1周できたら、同じデータで次の課題にも挑戦してみてください。
課題1|店舗ではなく、商品で同じことをする
STEP1のpivot_tableのindexを「店舗」から「商品」に変えて、商品×月の売上表を作ってみましょう。
正しくできていれば、キャンセルを除いた売上は次のようになります。
- ノート:10月3,750円→11月4,000円
- ファイル:10月2,700円→11月1,500円
- ボールペン:10月2,160円→11月3,600円
ファイルの落ち込みとボールペンの伸びについて、自分で仮説を1つ立ててみてください。
課題2|12月のCSVを足して、3か月で見る
sales_2026-12.csvを自分で10行ほど作り、monthly_salesフォルダーに足してみましょう。
コードを1行も変えずに、表とグラフが3か月分になれば成功です。
STEP3の仮説が、3か月目でも成り立つかを確かめてみてください。
課題3|自分の仕事のCSVで、3段階をやってみる
最後は、自分の仕事で使っている表データで、同じ3段階をやってみることです。
会社のデータを使うときは、社外秘や個人情報の扱いのルールを必ず確認してください。
列の名前を書きかえるだけで、ほとんどのコードはそのまま使えるはずです。
次に学ぶなら|Courseraのデータ分析講座
3段階を1周できたら、体系的に学び直すのもおすすめです。
Coursera(コーセラ)には、pandasやmatplotlibを使ったデータ分析の講座がそろっています。
| 講座 | 提供元 | 公式の難易度 | 講座ページの目安 | 向いている人 |
| Python for Data Science & AI | IBM | 初級 | 週10時間で2週間 | 基礎がまだ不安な人 |
| Data Analysis with Python | IBM | 中級 | 週10時間で2週間 | この記事の3段階の続きを学びたい人 |
| Introduction to Data Science in Python | ミシガン大学 | 中級 | 週10時間で3週間 | pandasと統計をしっかり学びたい人 |
出典|Data Analysis with Python(Coursera)、Introduction to Data Science in Python(Coursera)、Python for Data Science & AI(Coursera)
この記事の続きとして一番近いのは、IBMのData Analysis with Pythonです。
データの読み込みと整形、探索的なデータ分析(EDA)から、回帰モデルづくりまでを学びます。
講座の説明によると、pandasやmatplotlib、scikit-learnなどを使います。
Introduction to Data Science in Pythonは、ミシガン大学の講座です。
pandasでのデータ処理から、t検定などの統計に進みます。
この記事のSTEP1がまだ難しく感じた方は、IBMのPython for Data Science & AIで基礎から固めましょう。
3講座とも英語の講座です。最初のモジュールは無料でプレビューできるので、申し込む前に中身を確かめてください。
筆者は、CourseraでGoogleのデータアナリティクス認定を受講しました。
数字と、お客さんの声などの定性的な情報の両面から、改善を提案できるようになりたかったからです。
高度な分析に進むための下地づくりとして、目的にしっかり合った講座でした。
データ分析をどの順番で学ぶかは、次の記事にまとめています。
Pythonでのデータ分析を、Googleの認定で学びたい方はこちらもご覧ください。
まとめ|小さなデータで、3段階を最後までやり切ろう
Pythonの基礎の次にやることは、小さな表データで「集計→図→仮説」を1周やり切ることでした。
この記事のポイントをおさらいしておきましょう。
- STEP1 集計:pivot_tableで店舗×月の売上表を作り、合計が17,710円になるか確かめる
- STEP2 図:棒グラフにすると、駅前店の伸びが一番大きいことが一目でわかる
- STEP3 仮説:「なぜ?」を1つに絞り、「正しければこうなるはず」を決めてから確かめる
- 今回のデータでは、売上の伸びは注文の増加ではなく、キャンセルの減少によるものだった
- 1周できたら、商品別、3か月分、自分の仕事のデータへと広げていく
「自分の仕事のデータでもできるかな…」
という方も、まずはこの記事のCSVで1周してみてください。
もっと体系的に学びたくなったら、Courseraの講座で続きを学ぶのもおすすめです。