医療DXAI学習サイト

問題名: 売上データの統合と分析

問題

次のようなタスクをPythonで解決してください。

  1. データの読み込み:
    • 提供された以下のCSVファイルを読み込みます。
      • customer_master.csv: 顧客データ
      • item_master.csv: 商品データ
      • transaction_1.csvtransaction_2.csv: 購入データ
      • transaction_detail_1.csvtransaction_detail_2.csv: 購入明細データ
  2. データの統合:
    • 購入データ(transaction_1, transaction_2)を縦方向に結合してください。
    • 購入明細データ(transaction_detail_1, transaction_detail_2)を縦方向に結合してください。
    • 購入明細データと購入データを横方向に結合し、さらに顧客データ、商品データを横方向に結合してください。
  3. 売上の計算:
    • 新たな列 price を作成し、quantityitem_price を掛け算して売上を計算してください。
  4. データの集計:
    • 月別、商品別の売上データを集計し、売上推移を表すデータフレームを作成してください。
  5. 売上推移の可視化:
    • 月別、商品別の売上データを棒グラフで可視化してください。

サンプルデータ(各ファイルの構造例)

  • 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()

解説

  1. データの読み込み:
    • pandasを使用してCSVファイルをDataFrameに変換しました。
  2. データの統合:
    • 縦方向の結合にはpd.concat、横方向の結合にはpd.mergeを使用しました。
  3. 売上の計算:
    • 各商品の売上を数量と単価の積として計算し、新たな列priceを作成しました。
  4. データの集計:
    • groupbyを用いて月別・商品別の売上を集計しました。
  5. 可視化:
    • 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_1transaction_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_masteritem_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_monthitem_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)
  1. monthly_sales["item_name"].unique(): 商品名のユニーク値(重複しない値)を取得します。
  2. ループ: 各商品名ごとに、対応するデータを抽出。
  3. plt.bar: 月ごとの売上を棒グラフで可視化。
pythonコードをコピーするplt.xlabel("Month")
plt.ylabel("Sales")
plt.title("Monthly Sales by Item")
plt.legend()
plt.show()

コメント

この記事へのコメントはありません。

TOP