問題
次のようなタスクをPythonで解決してください。
- データの読み込み:
- 提供された以下のCSVファイルを読み込みます。
customer_master.csv
: 顧客データitem_master.csv
: 商品データtransaction_1.csv
とtransaction_2.csv
: 購入データtransaction_detail_1.csv
とtransaction_detail_2.csv
: 購入明細データ
- 提供された以下のCSVファイルを読み込みます。
- データの統合:
- 購入データ(
transaction_1
,transaction_2
)を縦方向に結合してください。 - 購入明細データ(
transaction_detail_1
,transaction_detail_2
)を縦方向に結合してください。 - 購入明細データと購入データを横方向に結合し、さらに顧客データ、商品データを横方向に結合してください。
- 購入データ(
- 売上の計算:
- 新たな列
price
を作成し、quantity
とitem_price
を掛け算して売上を計算してください。
- 新たな列
- データの集計:
- 月別、商品別の売上データを集計し、売上推移を表すデータフレームを作成してください。
- 売上推移の可視化:
- 月別、商品別の売上データを棒グラフで可視化してください。
サンプルデータ(各ファイルの構造例)
customer_master.csv
:コードをコピーするcustomer_id,customer_name,customer_name_kana,gender,age,birth,pref C001,田中 太郎,タナカ タロウ,男性,35,1988-01-01,東京
item_master.csv
:cssコードをコピーするitem_id,item_name,item_price I001,商品A,5000
transaction_1.csv
:コードをコピーするtransaction_id,payment_date,customer_id T001,2024-12-01,C001
transaction_detail_1.csv
:コードをコピーするdetail_id,transaction_id,item_id,quantity D001,T001,I001,2
解答例
pythonコードをコピーするimport pandas as pd
import matplotlib.pyplot as plt
# 1. データの読み込み
customer_master = pd.read_csv('customer_master.csv')
item_master = pd.read_csv('item_master.csv')
transaction_1 = pd.read_csv('transaction_1.csv')
transaction_2 = pd.read_csv('transaction_2.csv')
transaction_detail_1 = pd.read_csv('transaction_detail_1.csv')
transaction_detail_2 = pd.read_csv('transaction_detail_2.csv')
# 2. データの統合
transaction = pd.concat([transaction_1, transaction_2], ignore_index=True)
transaction_detail = pd.concat([transaction_detail_1, transaction_detail_2], ignore_index=True)
# 購入データと購入明細データの結合
join_data = pd.merge(transaction_detail, transaction, on="transaction_id", how="left")
join_data = pd.merge(join_data, customer_master, on="customer_id", how="left")
join_data = pd.merge(join_data, item_master, on="item_id", how="left")
# 3. 売上の計算
join_data["price"] = join_data["quantity"] * join_data["item_price"]
# 4. 月別、商品別の売上データ集計
join_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
join_data["month"] = join_data["payment_date"].dt.strftime("%Y-%m")
monthly_sales = join_data.groupby(["month", "item_name"])["price"].sum().reset_index()
# 5. 売上推移の可視化
for item in monthly_sales["item_name"].unique():
subset = monthly_sales[monthly_sales["item_name"] == item]
plt.bar(subset["month"], subset["price"], label=item)
plt.xlabel("Month")
plt.ylabel("Sales")
plt.title("Monthly Sales by Item")
plt.legend()
plt.show()
解説
- データの読み込み:
- pandasを使用してCSVファイルをDataFrameに変換しました。
- データの統合:
- 縦方向の結合には
pd.concat
、横方向の結合にはpd.merge
を使用しました。
- 縦方向の結合には
- 売上の計算:
- 各商品の売上を数量と単価の積として計算し、新たな列
price
を作成しました。
- 各商品の売上を数量と単価の積として計算し、新たな列
- データの集計:
groupby
を用いて月別・商品別の売上を集計しました。
- 可視化:
- matplotlibを使い、商品ごとの売上推移を棒グラフで可視化しました。
詳しい説明!!
以下に、コードを1行ずつ詳しく解説します。
データの読み込み
pythonコードをコピーするimport pandas as pd
import matplotlib.pyplot as plt
- pandas: データフレーム操作を行うライブラリを読み込みます。
- matplotlib.pyplot: データの可視化(グラフ作成)用のライブラリを読み込みます。
pythonコードをコピーするcustomer_master = pd.read_csv('customer_master.csv')
item_master = pd.read_csv('item_master.csv')
transaction_1 = pd.read_csv('transaction_1.csv')
transaction_2 = pd.read_csv('transaction_2.csv')
transaction_detail_1 = pd.read_csv('transaction_detail_1.csv')
transaction_detail_2 = pd.read_csv('transaction_detail_2.csv')
- 各データを
pd.read_csv
関数を用いてCSVファイルから読み込み、それぞれのデータフレームに格納します。 customer_master
などの変数名は、データの内容を示すように命名しています。
データの統合
pythonコードをコピーするtransaction = pd.concat([transaction_1, transaction_2], ignore_index=True)
pd.concat
: 複数のデータフレームを縦方向に結合します。ignore_index=True
: インデックスを再構築して0から振り直します(元のインデックスは無視)。
pythonコードをコピーするtransaction_detail = pd.concat([transaction_detail_1, transaction_detail_2], ignore_index=True)
- 同様に、
transaction_detail_1
とtransaction_detail_2
を縦方向に結合します。
pythonコードをコピーするjoin_data = pd.merge(transaction_detail, transaction, on="transaction_id", how="left")
pd.merge
: データフレームを横方向に結合します。on="transaction_id"
: 結合キーとしてtransaction_id
列を指定。how="left"
: 左側のデータ(transaction_detail
)を基準に結合します(transaction
に存在しないデータはNaNになる)。
pythonコードをコピーするjoin_data = pd.merge(join_data, customer_master, on="customer_id", how="left")
join_data = pd.merge(join_data, item_master, on="item_id", how="left")
- 同様の方法で、
customer_master
とitem_master
を結合します。 - 結果として、すべての情報が統合されたデータフレーム
join_data
が作成されます。
売上の計算
pythonコードをコピーするjoin_data["price"] = join_data["quantity"] * join_data["item_price"]
join_data["quantity"] * join_data["item_price"]
: 各行について、数量(quantity
)と単価(item_price
)を掛け算して売上を計算します。- 新しい列
price
に計算結果を格納します。
月別・商品別の売上データ集計
pythonコードをコピーするjoin_data["payment_date"] = pd.to_datetime(join_data["payment_date"])
pd.to_datetime
:payment_date
列を文字列から日時型(datetime型)に変換します。この操作により、日付操作が容易になります。
pythonコードをコピーするjoin_data["payment_month"] = join_data["payment_date"].dt.strftime("%Y-%m")
dt.strftime("%Y-%m")
: 日付型データを"YYYY-MM"
形式(年-月)にフォーマットします。- 結果を新しい列
payment_month
として追加します。
pythonコードをコピーするmonthly_sales = join_data.groupby(["month", "item_name"])["price"].sum().reset_index()
groupby(["month", "item_name"])
:payment_month
とitem_name
ごとにデータをグループ化します。["price"].sum()
: 各グループ内の売上(price
)を合計します。reset_index()
: グループ化された結果をデータフレーム形式に戻します。
売上推移の可視化
pythonコードをコピーするfor item in monthly_sales["item_name"].unique():
subset = monthly_sales[monthly_sales["item_name"] == item]
plt.bar(subset["month"], subset["price"], label=item)
monthly_sales["item_name"].unique()
: 商品名のユニーク値(重複しない値)を取得します。- ループ: 各商品名ごとに、対応するデータを抽出。
plt.bar
: 月ごとの売上を棒グラフで可視化。
pythonコードをコピーするplt.xlabel("Month")
plt.ylabel("Sales")
plt.title("Monthly Sales by Item")
plt.legend()
plt.show()
plt.xlabel
: X軸のラベルを設定。plt.ylabel
: Y軸のラベルを設定。plt.title
: グラフのタイトルを設定。plt.legend
: 商品名ごとの凡例を表示。plt.show
: グラフを表示。
コメント