{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session\n\n# Use the kagglehub client library to attach Kaggle resources like competitions, datasets, and models to your session\n# Learn more about kagglehub: https://github.com/Kaggle/kagglehub/blob/main/README.md\n\nimport kagglehub\n# kagglehub.dataset_download('<owner>/<dataset-slug>')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:24.700929Z","iopub.execute_input":"2026-07-27T01:56:24.701280Z","iopub.status.idle":"2026-07-27T01:56:24.710792Z","shell.execute_reply.started":"2026-07-27T01:56:24.701249Z","shell.execute_reply":"2026-07-27T01:56:24.709844Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"データ読み込み・前処理","metadata":{}},{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\n\npath = \"/kaggle/input/competitions/Store-Sales-Forecasting/\"\n\ntrain = pd.read_csv(path + \"train.csv\")\ntransactions = pd.read_csv(path + \"transactions.csv\")\n\ntrain[\"date\"] = pd.to_datetime(train[\"date\"])\ntransactions[\"date\"] = pd.to_datetime(transactions[\"date\"])\n\ntrain[\"weekday\"] = train[\"date\"].dt.day_name()\n\nweekday_order = [\n    \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\",\n    \"Friday\", \"Saturday\", \"Sunday\"\n]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:24.712427Z","iopub.execute_input":"2026-07-27T01:56:24.712801Z","iopub.status.idle":"2026-07-27T01:56:27.992711Z","shell.execute_reply.started":"2026-07-27T01:56:24.712768Z","shell.execute_reply":"2026-07-27T01:56:27.992017Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"曜日ごとの平均売上","metadata":{}},{"cell_type":"code","source":"weekday_sales = train.groupby(\"weekday\")[\"sales\"].mean()\nweekday_sales = weekday_sales.reindex(weekday_order)\n\nweekday_sales","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:27.993768Z","iopub.execute_input":"2026-07-27T01:56:27.994027Z","iopub.status.idle":"2026-07-27T01:56:28.220429Z","shell.execute_reply.started":"2026-07-27T01:56:27.994001Z","shell.execute_reply":"2026-07-27T01:56:28.219448Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"weekday_sales.plot(kind=\"bar\", figsize=(8,5))\n\nplt.title(\"Average Sales by Weekday\")\nplt.xlabel(\"Weekday\")\nplt.ylabel(\"Average Sales\")\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:28.222282Z","iopub.execute_input":"2026-07-27T01:56:28.222560Z","iopub.status.idle":"2026-07-27T01:56:28.401052Z","shell.execute_reply.started":"2026-07-27T01:56:28.222534Z","shell.execute_reply":"2026-07-27T01:56:28.400097Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"曜日ごとの平均取引件数","metadata":{}},{"cell_type":"code","source":"train_trans = train.merge(\n    transactions,\n    on=[\"date\", \"store_nbr\"],\n    how=\"left\"\n)\n\nweekday_transactions = train_trans.groupby(\"weekday\")[\"transactions\"].mean()\nweekday_transactions = weekday_transactions.reindex(weekday_order)\n\nweekday_transactions","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:28.402188Z","iopub.execute_input":"2026-07-27T01:56:28.402528Z","iopub.status.idle":"2026-07-27T01:56:29.117754Z","shell.execute_reply.started":"2026-07-27T01:56:28.402490Z","shell.execute_reply":"2026-07-27T01:56:29.116972Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"weekday_transactions.plot(kind=\"bar\", figsize=(8,5))\n\nplt.title(\"Average Transactions by Weekday\")\nplt.xlabel(\"Weekday\")\nplt.ylabel(\"Average Transactions\")\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.118856Z","iopub.execute_input":"2026-07-27T01:56:29.119195Z","iopub.status.idle":"2026-07-27T01:56:29.276560Z","shell.execute_reply.started":"2026-07-27T01:56:29.119160Z","shell.execute_reply":"2026-07-27T01:56:29.275638Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"売上と取引件数を比較","metadata":{}},{"cell_type":"code","source":"weekday_summary = train_trans.groupby(\"weekday\")[[\"sales\", \"transactions\"]].mean()\nweekday_summary = weekday_summary.reindex(weekday_order)\n\nweekday_summary","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.277655Z","iopub.execute_input":"2026-07-27T01:56:29.278018Z","iopub.status.idle":"2026-07-27T01:56:29.506897Z","shell.execute_reply.started":"2026-07-27T01:56:29.277981Z","shell.execute_reply":"2026-07-27T01:56:29.506089Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"correlation = weekday_summary[\"sales\"].corr(weekday_summary[\"transactions\"])\n\ncorrelation","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.507866Z","iopub.execute_input":"2026-07-27T01:56:29.508096Z","iopub.status.idle":"2026-07-27T01:56:29.516682Z","shell.execute_reply.started":"2026-07-27T01:56:29.508074Z","shell.execute_reply":"2026-07-27T01:56:29.515747Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"plt.figure(figsize=(6,6))\n\nplt.scatter(\n    weekday_summary[\"transactions\"],\n    weekday_summary[\"sales\"]\n)\n\nfor day in weekday_summary.index:\n    plt.text(\n        weekday_summary.loc[day, \"transactions\"],\n        weekday_summary.loc[day, \"sales\"],\n        day\n    )\n\nplt.title(\"Relationship between Sales and Transactions\")\nplt.xlabel(\"Average Transactions\")\nplt.ylabel(\"Average Sales\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.517897Z","iopub.execute_input":"2026-07-27T01:56:29.518319Z","iopub.status.idle":"2026-07-27T01:56:29.720283Z","shell.execute_reply.started":"2026-07-27T01:56:29.518264Z","shell.execute_reply":"2026-07-27T01:56:29.719385Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 売上と取引件数の相関係数\ncorrelation = weekday_summary[\"sales\"].corr(weekday_summary[\"transactions\"])\n\nprint(\"相関係数:\", correlation)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.722820Z","iopub.execute_input":"2026-07-27T01:56:29.723107Z","iopub.status.idle":"2026-07-27T01:56:29.730130Z","shell.execute_reply.started":"2026-07-27T01:56:29.723080Z","shell.execute_reply":"2026-07-27T01:56:29.729042Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"曜日ごとの1取引当たり売上","metadata":{}},{"cell_type":"code","source":"train_trans[\"sales_per_transaction\"] = (\n    train_trans[\"sales\"] / train_trans[\"transactions\"]\n)\n\nweekday_spt = train_trans.groupby(\"weekday\")[\"sales_per_transaction\"].mean()\nweekday_spt = weekday_spt.reindex(weekday_order)\n\nweekday_spt","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.731248Z","iopub.execute_input":"2026-07-27T01:56:29.731623Z","iopub.status.idle":"2026-07-27T01:56:29.944212Z","shell.execute_reply.started":"2026-07-27T01:56:29.731592Z","shell.execute_reply":"2026-07-27T01:56:29.943566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"weekday_spt.plot(kind=\"bar\", figsize=(8,5))\n\nplt.title(\"Average Sales per Transaction by Weekday\")\nplt.xlabel(\"Weekday\")\nplt.ylabel(\"Sales per Transaction\")\nplt.xticks(rotation=45)\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:29.945121Z","iopub.execute_input":"2026-07-27T01:56:29.945466Z","iopub.status.idle":"2026-07-27T01:56:30.094235Z","shell.execute_reply.started":"2026-07-27T01:56:29.945430Z","shell.execute_reply":"2026-07-27T01:56:30.093356Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"まとめ表","metadata":{}},{"cell_type":"code","source":"summary_table = pd.DataFrame({\n    \"average_sales\": weekday_sales,\n    \"average_transactions\": weekday_transactions,\n    \"sales_per_transaction\": weekday_spt\n})\n\nsummary_table","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.095274Z","iopub.execute_input":"2026-07-27T01:56:30.095676Z","iopub.status.idle":"2026-07-27T01:56:30.106403Z","shell.execute_reply.started":"2026-07-27T01:56:30.095648Z","shell.execute_reply":"2026-07-27T01:56:30.105710Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"必要なライブラリ","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import mean_absolute_error\nfrom sklearn.metrics import mean_squared_error\nimport numpy as np","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.107476Z","iopub.execute_input":"2026-07-27T01:56:30.107815Z","iopub.status.idle":"2026-07-27T01:56:30.122909Z","shell.execute_reply.started":"2026-07-27T01:56:30.107787Z","shell.execute_reply":"2026-07-27T01:56:30.121605Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"曜日だけで予測する","metadata":{}},{"cell_type":"code","source":"# 曜日ごとの平均売上を辞書にする\nweekday_mean_sales = train.groupby(\"weekday\")[\"sales\"].mean()\n\n# trainデータの各行に予測値を付ける\ntrain[\"pred_sales\"] = train[\"weekday\"].map(weekday_mean_sales)\n\ntrain[[\"weekday\", \"sales\", \"pred_sales\"]].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.123997Z","iopub.execute_input":"2026-07-27T01:56:30.124753Z","iopub.status.idle":"2026-07-27T01:56:30.659843Z","shell.execute_reply.started":"2026-07-27T01:56:30.124659Z","shell.execute_reply":"2026-07-27T01:56:30.659029Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"MAE（平均絶対誤差）","metadata":{}},{"cell_type":"code","source":"mae = mean_absolute_error(\n    train[\"sales\"],\n    train[\"pred_sales\"]\n)\n\nprint(\"MAE =\", mae)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.660889Z","iopub.execute_input":"2026-07-27T01:56:30.661203Z","iopub.status.idle":"2026-07-27T01:56:30.687720Z","shell.execute_reply.started":"2026-07-27T01:56:30.661171Z","shell.execute_reply":"2026-07-27T01:56:30.686763Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"RMSE（二乗平均平方根誤差）","metadata":{}},{"cell_type":"code","source":"rmse = np.sqrt(\n    mean_squared_error(\n        train[\"sales\"],\n        train[\"pred_sales\"]\n    )\n)\n\nprint(\"RMSE =\", rmse)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.688730Z","iopub.execute_input":"2026-07-27T01:56:30.688999Z","iopub.status.idle":"2026-07-27T01:56:30.711228Z","shell.execute_reply.started":"2026-07-27T01:56:30.688974Z","shell.execute_reply":"2026-07-27T01:56:30.710318Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Kaggleと同じ評価指標（RMSLE）","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.712412Z","iopub.execute_input":"2026-07-27T01:56:30.712877Z","iopub.status.idle":"2026-07-27T01:56:30.716918Z","shell.execute_reply.started":"2026-07-27T01:56:30.712840Z","shell.execute_reply":"2026-07-27T01:56:30.716088Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# date列を日付型に変換\ntrain[\"date\"] = pd.to_datetime(train[\"date\"])\ntransactions[\"date\"] = pd.to_datetime(transactions[\"date\"])\n\n# 売上データと取引件数データを結合して「data」を作る\ndata = pd.merge(\n    train,\n    transactions,\n    on=[\"date\", \"store_nbr\"],\n    how=\"inner\"\n)\n\n# 2017年1月1日より前を訓練データにする\ntrain_data = data[\n    data[\"date\"] < \"2017-01-01\"\n].copy()\n\n# 2017年1月1日以降をテストデータにする\ntest_data = data[\n    data[\"date\"] >= \"2017-01-01\"\n].copy()\n\nprint(\"訓練データの期間\")\nprint(train_data[\"date\"].min(), \"～\", train_data[\"date\"].max())\n\nprint(\"\\nテストデータの期間\")\nprint(test_data[\"date\"].min(), \"～\", test_data[\"date\"].max())\n\nprint(\"\\n訓練データ数：\", len(train_data))\nprint(\"テストデータ数：\", len(test_data))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:30.717975Z","iopub.execute_input":"2026-07-27T01:56:30.718488Z","iopub.status.idle":"2026-07-27T01:56:32.091015Z","shell.execute_reply.started":"2026-07-27T01:56:30.718452Z","shell.execute_reply":"2026-07-27T01:56:32.090114Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_data[\"weekday\"] = train_data[\"date\"].dt.day_name()\ntest_data[\"weekday\"] = test_data[\"date\"].dt.day_name()\n\ntrain_data[[\"date\", \"weekday\", \"sales\", \"transactions\"]].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:32.092199Z","iopub.execute_input":"2026-07-27T01:56:32.092505Z","iopub.status.idle":"2026-07-27T01:56:32.803447Z","shell.execute_reply.started":"2026-07-27T01:56:32.092478Z","shell.execute_reply":"2026-07-27T01:56:32.802629Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 訓練データにおける曜日別の平均売上\nweekday_sales_train = train_data.groupby(\"weekday\")[\"sales\"].mean()\n\n# 訓練データにおける曜日別の平均取引件数\nweekday_transactions_train = train_data.groupby(\"weekday\")[\"transactions\"].mean()\n\n# 曜日別の1取引当たり売上\nweekday_spt_train = weekday_sales_train / weekday_transactions_train\n\n# まとめ表を作成\ntrain_summary_table = pd.DataFrame({\n    \"average_sales\": weekday_sales_train,\n    \"average_transactions\": weekday_transactions_train,\n    \"sales_per_transaction\": weekday_spt_train\n})\n\ntrain_summary_table","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:32.804478Z","iopub.execute_input":"2026-07-27T01:56:32.804787Z","iopub.status.idle":"2026-07-27T01:56:33.112077Z","shell.execute_reply.started":"2026-07-27T01:56:32.804752Z","shell.execute_reply":"2026-07-27T01:56:33.111214Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 曜日別の平均取引件数 × 1取引当たり売上で予測\ntest_data[\"pred_sales\"] = (\n    test_data[\"weekday\"].map(weekday_transactions_train)\n    * test_data[\"weekday\"].map(weekday_spt_train)\n)\n\n# RMSLEでは負の値を扱えないため、0未満を0にする\ntest_data[\"pred_sales\"] = test_data[\"pred_sales\"].clip(lower=0)\n\n# 予測結果を確認\ntest_data[\n    [\"date\", \"weekday\", \"sales\", \"transactions\", \"pred_sales\"]\n].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:33.113088Z","iopub.execute_input":"2026-07-27T01:56:33.113407Z","iopub.status.idle":"2026-07-27T01:56:33.198752Z","shell.execute_reply.started":"2026-07-27T01:56:33.113381Z","shell.execute_reply":"2026-07-27T01:56:33.198076Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.metrics import mean_squared_log_error\nimport numpy as np\n\nrmsle = np.sqrt(\n    mean_squared_log_error(\n        test_data[\"sales\"],\n        test_data[\"pred_sales\"]\n    )\n)\n\nprint(\"2017年以降のデータに対するRMSLE：\", rmsle)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:33.199775Z","iopub.execute_input":"2026-07-27T01:56:33.200082Z","iopub.status.idle":"2026-07-27T01:56:33.223532Z","shell.execute_reply.started":"2026-07-27T01:56:33.200056Z","shell.execute_reply":"2026-07-27T01:56:33.222739Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 今までに計算したRMSLEを「曜日のみ」の結果として保存\nrmsle_weekday = rmsle\n\nprint(\"曜日のみのRMSLE：\", rmsle_weekday)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:56:54.623829Z","iopub.execute_input":"2026-07-27T01:56:54.624161Z","iopub.status.idle":"2026-07-27T01:56:54.629432Z","shell.execute_reply.started":"2026-07-27T01:56:54.624134Z","shell.execute_reply":"2026-07-27T01:56:54.628467Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2017年より前の学習データだけを使って、\n# 曜日別の平均売上と平均取引件数を計算\nweekday_stats_train = (\n    train_data\n    .groupby(\"weekday\")\n    .agg(\n        average_sales=(\"sales\", \"mean\"),\n        average_transactions=(\"transactions\", \"mean\")\n    )\n    .reset_index()\n)\n\n# 1取引当たりの平均売上を計算\nweekday_stats_train[\"sales_per_transaction\"] = (\n    weekday_stats_train[\"average_sales\"]\n    / weekday_stats_train[\"average_transactions\"]\n)\n\nweekday_stats_train","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:57:09.382498Z","iopub.execute_input":"2026-07-27T01:57:09.382946Z","iopub.status.idle":"2026-07-27T01:57:09.595050Z","shell.execute_reply.started":"2026-07-27T01:57:09.382902Z","shell.execute_reply":"2026-07-27T01:57:09.594043Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 元のtest_dataを残すため、コピーを作る\ntest_data_transactions = test_data.copy()\n\n# 同じコードを再実行しても列が重複しないように削除\ntest_data_transactions = test_data_transactions.drop(\n    columns=[\n        \"average_sales\",\n        \"average_transactions\",\n        \"sales_per_transaction\",\n        \"pred_sales_with_transactions\"\n    ],\n    errors=\"ignore\"\n)\n\n# 曜日を基準に、学習データから計算した値を結合\ntest_data_transactions = test_data_transactions.merge(\n    weekday_stats_train,\n    on=\"weekday\",\n    how=\"left\"\n)\n\ntest_data_transactions[\n    [\n        \"date\",\n        \"weekday\",\n        \"sales\",\n        \"transactions\",\n        \"sales_per_transaction\"\n    ]\n].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:57:18.412735Z","iopub.execute_input":"2026-07-27T01:57:18.413097Z","iopub.status.idle":"2026-07-27T01:57:18.552780Z","shell.execute_reply.started":"2026-07-27T01:57:18.413067Z","shell.execute_reply":"2026-07-27T01:57:18.551982Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 欠損している取引件数は0にする\ntest_data_transactions[\"transactions\"] = (\n    test_data_transactions[\"transactions\"].fillna(0)\n)\n\n# 曜日＋取引件数を使った売上予測\ntest_data_transactions[\"pred_sales_with_transactions\"] = (\n    test_data_transactions[\"transactions\"]\n    * test_data_transactions[\"sales_per_transaction\"]\n)\n\n# 欠損値や負の予測値を処理\ntest_data_transactions[\"pred_sales_with_transactions\"] = (\n    test_data_transactions[\"pred_sales_with_transactions\"]\n    .fillna(0)\n    .clip(lower=0)\n)\n\ntest_data_transactions[\n    [\n        \"date\",\n        \"weekday\",\n        \"sales\",\n        \"transactions\",\n        \"pred_sales\",\n        \"pred_sales_with_transactions\"\n    ]\n].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:57:29.426384Z","iopub.execute_input":"2026-07-27T01:57:29.426754Z","iopub.status.idle":"2026-07-27T01:57:29.457211Z","shell.execute_reply.started":"2026-07-27T01:57:29.426712Z","shell.execute_reply":"2026-07-27T01:57:29.456288Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rmsle_weekday_transactions = np.sqrt(\n    mean_squared_log_error(\n        test_data_transactions[\"sales\"],\n        test_data_transactions[\"pred_sales_with_transactions\"]\n    )\n)\n\nprint(\n    \"曜日＋取引件数のRMSLE：\",\n    rmsle_weekday_transactions\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:57:39.232340Z","iopub.execute_input":"2026-07-27T01:57:39.232684Z","iopub.status.idle":"2026-07-27T01:57:39.256626Z","shell.execute_reply.started":"2026-07-27T01:57:39.232654Z","shell.execute_reply":"2026-07-27T01:57:39.255755Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"comparison = pd.DataFrame({\n    \"予測方法\": [\n        \"曜日のみ\",\n        \"曜日＋取引件数\"\n    ],\n    \"RMSLE\": [\n        rmsle_weekday,\n        rmsle_weekday_transactions\n    ]\n})\n\ncomparison","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T01:57:54.139514Z","iopub.execute_input":"2026-07-27T01:57:54.139851Z","iopub.status.idle":"2026-07-27T01:57:54.150795Z","shell.execute_reply.started":"2026-07-27T01:57:54.139824Z","shell.execute_reply":"2026-07-27T01:57:54.149804Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 2017年より前の学習データだけを使って、\n# データ全体の1取引当たり平均売上を計算\noverall_sales_per_transaction = (\n    train_data[\"sales\"].sum()\n    / train_data[\"transactions\"].sum()\n)\n\nprint(\n    \"学習データ全体の1取引当たり平均売上：\",\n    overall_sales_per_transaction\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T02:04:03.223852Z","iopub.execute_input":"2026-07-27T02:04:03.224642Z","iopub.status.idle":"2026-07-27T02:04:03.236921Z","shell.execute_reply.started":"2026-07-27T02:04:03.224603Z","shell.execute_reply":"2026-07-27T02:04:03.235998Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# 取引件数のみを使った予測\ntest_data_transactions[\"pred_sales_transactions_only\"] = (\n    test_data_transactions[\"transactions\"]\n    * overall_sales_per_transaction\n)\n\n# 欠損値と負の値を処理\ntest_data_transactions[\"pred_sales_transactions_only\"] = (\n    test_data_transactions[\"pred_sales_transactions_only\"]\n    .fillna(0)\n    .clip(lower=0)\n)\n\ntest_data_transactions[\n    [\n        \"date\",\n        \"weekday\",\n        \"sales\",\n        \"transactions\",\n        \"pred_sales_transactions_only\"\n    ]\n].head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T02:04:15.774620Z","iopub.execute_input":"2026-07-27T02:04:15.774999Z","iopub.status.idle":"2026-07-27T02:04:15.801942Z","shell.execute_reply.started":"2026-07-27T02:04:15.774969Z","shell.execute_reply":"2026-07-27T02:04:15.801126Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"rmsle_transactions_only = np.sqrt(\n    mean_squared_log_error(\n        test_data_transactions[\"sales\"],\n        test_data_transactions[\n            \"pred_sales_transactions_only\"\n        ]\n    )\n)\n\nprint(\n    \"取引件数のみのRMSLE：\",\n    rmsle_transactions_only\n)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T02:04:25.515359Z","iopub.execute_input":"2026-07-27T02:04:25.515689Z","iopub.status.idle":"2026-07-27T02:04:25.542296Z","shell.execute_reply.started":"2026-07-27T02:04:25.515657Z","shell.execute_reply":"2026-07-27T02:04:25.541353Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"comparison = pd.DataFrame({\n    \"予測方法\": [\n        \"曜日のみ\",\n        \"取引件数のみ\",\n        \"曜日＋取引件数\"\n    ],\n    \"RMSLE\": [\n        rmsle_weekday,\n        rmsle_transactions_only,\n        rmsle_weekday_transactions\n    ]\n})\n\ncomparison","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-07-27T02:04:33.529760Z","iopub.execute_input":"2026-07-27T02:04:33.530551Z","iopub.status.idle":"2026-07-27T02:04:33.540320Z","shell.execute_reply.started":"2026-07-27T02:04:33.530518Z","shell.execute_reply":"2026-07-27T02:04:33.539407Z"}},"outputs":[],"execution_count":null}]}