{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.11","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":31254,"databundleVersionId":3103714,"sourceType":"competition"}],"dockerImageVersionId":31041,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"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","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:15:43.839257Z","iopub.execute_input":"2025-06-20T12:15:43.839677Z","iopub.status.idle":"2025-06-20T12:21:14.784809Z","shell.execute_reply.started":"2025-06-20T12:15:43.839645Z","shell.execute_reply":"2025-06-20T12:21:14.783588Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **NAMA: FARAHNAS IMANIYAH PRANATA**\n# **NIM: 220601110067**","metadata":{}},{"cell_type":"markdown","source":"#  1. Data Understanding & Cleaning","metadata":{}},{"cell_type":"markdown","source":"## (a) Deskripsikan struktur dan dimensi data (jumlah fitur, baris, tipe data)","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Load data\ndf = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')\n\n# Struktur dan dimensi\nprint(\"Dimensi data (baris, kolom):\", df.shape)\n\n# Tipe data tiap kolom\nprint(\"\\nTipe data per kolom:\")\nprint(df.dtypes)\n\n# Cek 5 baris pertama\nprint(\"\\nContoh 5 baris pertama:\")\nprint(df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:35:59.025964Z","iopub.execute_input":"2025-06-20T12:35:59.026548Z","iopub.status.idle":"2025-06-20T12:36:50.007948Z","shell.execute_reply.started":"2025-06-20T12:35:59.026514Z","shell.execute_reply":"2025-06-20T12:36:50.006724Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"##  (b) Identifikasi dan tangani missing values, duplikasi, atau outlier.","metadata":{}},{"cell_type":"markdown","source":"### missing values","metadata":{}},{"cell_type":"code","source":"print(\"Jumlah missing values per kolom:\")\nprint(df.isnull().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:39:29.460405Z","iopub.execute_input":"2025-06-20T12:39:29.460856Z","iopub.status.idle":"2025-06-20T12:39:33.057076Z","shell.execute_reply.started":"2025-06-20T12:39:29.460805Z","shell.execute_reply":"2025-06-20T12:39:33.055620Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### duplikasi","metadata":{}},{"cell_type":"code","source":"print(\"Jumlah baris duplikat:\", df.duplicated().sum())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:40:31.884408Z","iopub.execute_input":"2025-06-20T12:40:31.884795Z","iopub.status.idle":"2025-06-20T12:41:01.798431Z","shell.execute_reply.started":"2025-06-20T12:40:31.884770Z","shell.execute_reply":"2025-06-20T12:41:01.797321Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### outlier","metadata":{}},{"cell_type":"code","source":"print(df['price'].describe())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:42:08.714190Z","iopub.execute_input":"2025-06-20T12:42:08.714553Z","iopub.status.idle":"2025-06-20T12:42:10.157434Z","shell.execute_reply.started":"2025-06-20T12:42:08.714533Z","shell.execute_reply":"2025-06-20T12:42:10.155900Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Q1 = df['price'].quantile(0.25)\nQ3 = df['price'].quantile(0.75)\nIQR = Q3 - Q1\nlower_bound = Q1 - 1.5 * IQR\nupper_bound = Q3 + 1.5 * IQR\n\noutliers = df[(df['price'] < lower_bound) | (df['price'] > upper_bound)]\nprint(\"Jumlah outlier pada kolom price:\", outliers.shape[0])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:42:53.394919Z","iopub.execute_input":"2025-06-20T12:42:53.395293Z","iopub.status.idle":"2025-06-20T12:42:55.045012Z","shell.execute_reply.started":"2025-06-20T12:42:53.395267Z","shell.execute_reply":"2025-06-20T12:42:55.043672Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## (c) Lakukan encoding data kategorikal (jika ada) dan normalisasi fitur numerik jika perlu).","metadata":{}},{"cell_type":"code","source":"# One-hot encoding\ndf_encoded = pd.get_dummies(df, columns=['sales_channel_id'], prefix='channel')\nprint(df_encoded.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:50:30.277375Z","iopub.execute_input":"2025-06-20T12:50:30.278566Z","iopub.status.idle":"2025-06-20T12:50:35.681366Z","shell.execute_reply.started":"2025-06-20T12:50:30.278530Z","shell.execute_reply":"2025-06-20T12:50:35.680244Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import MinMaxScaler\n\nscaler = MinMaxScaler()\ndf['price_normalized'] = scaler.fit_transform(df[['price']])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:50:57.213001Z","iopub.execute_input":"2025-06-20T12:50:57.213449Z","iopub.status.idle":"2025-06-20T12:50:57.747469Z","shell.execute_reply.started":"2025-06-20T12:50:57.213426Z","shell.execute_reply":"2025-06-20T12:50:57.746566Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from sklearn.preprocessing import StandardScaler\n\nscaler = StandardScaler()\ndf['price_standardized'] = scaler.fit_transform(df[['price']])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:51:04.694327Z","iopub.execute_input":"2025-06-20T12:51:04.694631Z","iopub.status.idle":"2025-06-20T12:51:05.732072Z","shell.execute_reply.started":"2025-06-20T12:51:04.694613Z","shell.execute_reply":"2025-06-20T12:51:05.731037Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(df[['price', 'price_normalized', 'price_standardized']].head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:53:33.723129Z","iopub.execute_input":"2025-06-20T12:53:33.723534Z","iopub.status.idle":"2025-06-20T12:53:34.275260Z","shell.execute_reply.started":"2025-06-20T12:53:33.723511Z","shell.execute_reply":"2025-06-20T12:53:34.274222Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#  2. Exploratory Data Analysis (EDA","metadata":{}},{"cell_type":"markdown","source":"##  (a) Visualisasikan 2–3 insight menarik dari dataset (misal: distribusi, korelasi, tren waktu, dsb).","metadata":{}},{"cell_type":"markdown","source":"### Insight 1: Distribusi Harga Produk","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\n\nplt.figure(figsize=(8,5))\nsns.histplot(df['price'], bins=100, kde=True)\nplt.title('Distribusi Harga Produk')\nplt.xlabel('Harga')\nplt.ylabel('Jumlah')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:55:02.473080Z","iopub.execute_input":"2025-06-20T12:55:02.473459Z","iopub.status.idle":"2025-06-20T12:57:30.034125Z","shell.execute_reply.started":"2025-06-20T12:55:02.473436Z","shell.execute_reply":"2025-06-20T12:57:30.032925Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Insight 2: Kanal Penjualan Terpopuler","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(6,4))\nsns.countplot(x='sales_channel_id', data=df)\nplt.title('Distribusi Kanal Penjualan')\nplt.xlabel('Kanal (1 = Online, 2 = Offline)')\nplt.ylabel('Jumlah Transaksi')\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:57:43.725186Z","iopub.execute_input":"2025-06-20T12:57:43.725603Z","iopub.status.idle":"2025-06-20T12:57:48.152416Z","shell.execute_reply.started":"2025-06-20T12:57:43.725578Z","shell.execute_reply":"2025-06-20T12:57:48.151343Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Insight 3: Tren Jumlah Transaksi dari Waktu ke Waktu","metadata":{}},{"cell_type":"code","source":"# Pastikan kolom t_dat bertipe datetime\ndf['t_dat'] = pd.to_datetime(df['t_dat'])\n\n# Agregasi per minggu\ntransaksi_mingguan = df.groupby(pd.Grouper(key='t_dat', freq='W'))['price'].count()\n\n# Plot\nplt.figure(figsize=(12,5))\ntransaksi_mingguan.plot()\nplt.title('Tren Jumlah Transaksi per Minggu')\nplt.xlabel('Tanggal')\nplt.ylabel('Jumlah Transaksi')\nplt.grid(True)\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T12:57:58.607710Z","iopub.execute_input":"2025-06-20T12:57:58.608442Z","iopub.status.idle":"2025-06-20T12:58:05.056115Z","shell.execute_reply.started":"2025-06-20T12:57:58.608413Z","shell.execute_reply":"2025-06-20T12:58:05.054852Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"##  (b) Tulis interpretasi dari insight tersebut","metadata":{}},{"cell_type":"markdown","source":"**Insight 1: Distribusi Harga Produk**\nVisualisasi menunjukkan bahwa distribusi harga sangat condong ke kiri (skewed right), artinya mayoritas produk memiliki harga sangat rendah, dengan puncak di kisaran harga sekitar 0.01 hingga 0.03. Hanya sebagian kecil produk yang memiliki harga tinggi, sehingga menghasilkan ekor panjang di sebelah kanan (outlier).\n**Interpretasi**: Hal ini menunjukkan bahwa sebagian besar transaksi berasal dari produk dengan harga rendah, kemungkinan besar karena promosi, produk fast-fashion murah, atau kebijakan pricing H&M yang menargetkan pasar massal. Ini juga berarti strategi diskon sangat berpengaruh terhadap volume pembelian.\n\n**Insight 2: Kanal Penjualan Terpopuler**\nDistribusi kanal penjualan menunjukkan bahwa kanal offline (kode 2) memiliki jumlah transaksi yang sedikit lebih tinggi dibandingkan kanal online (kode 1).\n**Interpretasi:**: Ini menunjukkan bahwa meskipun tren digital makin meningkat, pelanggan H&M saat data ini dikumpulkan masih lebih banyak melakukan pembelian di toko fisik. Bisa jadi karena pengalaman mencoba langsung, promosi toko, atau segmen pelanggan yang kurang digital-savvy. Ini penting bagi manajemen untuk menjaga keseimbangan antara dua kanal ini.\n\n**Insight 3: Tren Jumlah Transaksi dari Waktu ke Waktu**\nGrafik time series menunjukkan bahwa jumlah transaksi per minggu fluktuatif, dengan pola meningkat tajam pada minggu-minggu tertentu, lalu turun kembali.\n**Interpretasi**: Lonjakan transaksi mingguan ini kemungkinan besar berkaitan dengan momen promosi atau diskon musiman (misalnya Black Friday, akhir bulan, atau libur nasional). Ini menunjukkan bahwa pelanggan sangat responsif terhadap promosi jangka pendek. Strategi pemasaran berbasis waktu sangat efektif bagi H&M.","metadata":{}},{"cell_type":"markdown","source":"#  3. Modeling","metadata":{}},{"cell_type":"markdown","source":"## Klasifikasi: prediksi target/label tertentu","metadata":{}},{"cell_type":"code","source":"import pandas as pd\n\n# Load data transaksi\ndf = pd.read_csv('/kaggle/input/h-and-m-personalized-fashion-recommendations/transactions_train.csv')\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import classification_report, confusion_matrix\n\n# Pastikan datetime sudah diparse\ndf['t_dat'] = pd.to_datetime(df['t_dat'])\n\n# Buat fitur dari tanggal\ndf['day_of_week'] = df['t_dat'].dt.dayofweek\ndf['month'] = df['t_dat'].dt.month\n\n# Ambil fitur dan target\nX = df[['price', 'day_of_week', 'month']]\ny = df['sales_channel_id']\n\n# Split data\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n# Model klasifikasi\nmodel = RandomForestClassifier(n_estimators=100, random_state=42)\nmodel.fit(X_train, y_train)\n\n# Prediksi dan evaluasi\ny_pred = model.predict(X_test)\n\nprint(\"Confusion Matrix:\")\nprint(confusion_matrix(y_test, y_pred))\nprint(\"\\nClassification Report:\")\nprint(classification_report(y_test, y_pred))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-06-20T14:51:07.080769Z","iopub.execute_input":"2025-06-20T14:51:07.081436Z","iopub.status.idle":"2025-06-20T15:43:20.248793Z","shell.execute_reply.started":"2025-06-20T14:51:07.081408Z","shell.execute_reply":"2025-06-20T15:43:20.247954Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"#  5. Insight & Rekomendasi","metadata":{}},{"cell_type":"markdown","source":"## (a) Jelaskan 2 insight utama yang didapat dari analisis Anda.","metadata":{}},{"cell_type":"markdown","source":"**Insight 1:Waktu Transaksi Memengaruhi Kanal Penjualan**\nDari model klasifikasi yang menggunakan fitur waktu seperti day_of_week dan month, ditemukan bahwa informasi waktu memiliki pengaruh terhadap kanal penjualan. Misalnya, pelanggan cenderung membeli secara offline di akhir pekan, sedangkan transaksi online lebih merata sepanjang minggu. Hal ini menunjukkan bahwa perilaku pelanggan berubah tergantung pada waktu.\n\n**Insight 2: Harga Produk Berkaitan dengan Kanal Penjualan**\nFitur price juga memberikan kontribusi signifikan terhadap prediksi kanal. Model menunjukkan bahwa produk dengan harga lebih tinggi sedikit lebih sering dibeli secara offline, kemungkinan karena pelanggan ingin melihat langsung barang tersebut sebelum membeli. Sementara itu, produk murah lebih sering dibeli secara online karena proses pembelian lebih instan dan tanpa pertimbangan panjang.","metadata":{}},{"cell_type":"markdown","source":"## (b) Berikan minimal 1 rekomendasi praktis berbasis hasil analisis.","metadata":{}},{"cell_type":"markdown","source":"**Rekomendasi: Personalisasi promosi berdasarkan waktu dan harga**\nH&M dapat meningkatkan efisiensi promosi dengan cara:\n* Menargetkan promo online untuk produk harga rendah pada hari kerja, karena pelanggan cenderung bertransaksi online saat itu.\n* Mendorong promo offline untuk produk harga tinggi saat akhir pekan, karena pelanggan lebih suka berbelanja langsung di toko pada waktu tersebut.\n","metadata":{}},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}