{
"cells": [
{
"cell_type": "markdown",
"id": "b62313a3",
"metadata": {},
"source": [
"# Платформа и вероятность заказа\n",
"\n",
"**Вопрос:** даёт ли платформа (Android vs iOS) прирост заказа при одинаковом объёме коммуникаций?\n",
"\n",
"**Гипотеза:** при контроле показов/кликов Android-клиенты конвертируются выше."
]
},
{
"cell_type": "code",
"id": "8c8f09b1",
"metadata": {
"execution": {
"iopub.execute_input": "2025-12-12T19:12:03.874747Z",
"iopub.status.busy": "2025-12-12T19:12:03.874144Z",
"iopub.status.idle": "2025-12-12T19:12:10.515786Z",
"shell.execute_reply": "2025-12-12T19:12:10.513552Z"
},
"ExecuteTime": {
"end_time": "2025-12-12T19:27:18.761737Z",
"start_time": "2025-12-12T19:27:17.400625Z"
}
},
"source": [
"import sqlite3\n",
"from pathlib import Path\n",
"import sys\n",
"import numpy as np\n",
"import pandas as pd\n",
"import seaborn as sns\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import StandardScaler, OneHotEncoder\n",
"from sklearn.compose import ColumnTransformer\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.metrics import roc_auc_score\n",
"\n",
"sns.set_theme(style=\"whitegrid\")\n",
"plt.rcParams[\"figure.figsize\"] = (10, 5)\n",
"\n",
"project_root = Path.cwd().resolve()\n",
"while not (project_root / \"preanalysis\").exists() and project_root.parent != project_root:\n",
" project_root = project_root.parent\n",
" project_root = project_root.parent\n",
"sys.path.append(str(project_root / \"preanalysis\"))\n",
"import eda_utils as eda\n",
"\n",
"db_path = project_root / \"dataset\" / \"ds.sqlite\"\n",
"conn = sqlite3.connect(db_path)\n",
"df = pd.read_sql_query(\"select * from communications\", conn, parse_dates=[\"business_dt\"])\n",
"conn.close()\n"
],
"outputs": [],
"execution_count": 1
},
{
"cell_type": "code",
"id": "67ed5210",
"metadata": {
"execution": {
"iopub.execute_input": "2025-12-12T19:12:10.521535Z",
"iopub.status.busy": "2025-12-12T19:12:10.521072Z",
"iopub.status.idle": "2025-12-12T19:12:13.018480Z",
"shell.execute_reply": "2025-12-12T19:12:13.016893Z"
},
"ExecuteTime": {
"end_time": "2025-12-12T19:27:19.344169Z",
"start_time": "2025-12-12T19:27:18.770497Z"
}
},
"source": [
"for cols, name in [\n",
" (eda.ACTIVE_IMP_COLS, \"active_imp_total\"),\n",
" (eda.PASSIVE_IMP_COLS, \"passive_imp_total\"),\n",
" (eda.ACTIVE_CLICK_COLS, \"active_click_total\"),\n",
" (eda.PASSIVE_CLICK_COLS, \"passive_click_total\"),\n",
" (eda.ORDER_COLS, \"orders_amt_total\"),\n",
"]:\n",
" df[name] = df[cols].sum(axis=1)\n",
"\n",
"df[\"imp_total\"] = df[\"active_imp_total\"] + df[\"passive_imp_total\"]\n",
"df[\"click_total\"] = df[\"active_click_total\"] + df[\"passive_click_total\"]\n",
"\n",
"client = df.groupby(\"id\").agg(\n",
" {\n",
" \"active_imp_total\": \"sum\",\n",
" \"passive_imp_total\": \"sum\",\n",
" \"active_click_total\": \"sum\",\n",
" \"passive_click_total\": \"sum\",\n",
" \"orders_amt_total\": \"sum\",\n",
" \"imp_total\": \"sum\",\n",
" \"click_total\": \"sum\",\n",
" \"age\": \"median\",\n",
" \"gender_cd\": lambda s: s.mode().iat[0],\n",
" \"device_platform_cd\": lambda s: s.mode().iat[0],\n",
" }\n",
")\n",
"\n",
"client[\"has_order\"] = (client[\"orders_amt_total\"] > 0).astype(int)\n",
"client[\"ctr_all\"] = eda.safe_divide(client[\"click_total\"], client[\"imp_total\"])\n",
"client[\"cr_click2order\"] = eda.safe_divide(client[\"orders_amt_total\"], client[\"click_total\"])\n",
"client.head()\n"
],
"outputs": [
{
"data": {
"text/plain": [
" active_imp_total passive_imp_total active_click_total \\\n",
"id \n",
"1 33.0 35.0 14.0 \n",
"2 27.0 89.0 19.0 \n",
"3 57.0 236.0 37.0 \n",
"4 20.0 37.0 14.0 \n",
"5 23.0 20.0 13.0 \n",
"\n",
" passive_click_total orders_amt_total imp_total click_total age \\\n",
"id \n",
"1 3.0 0 68.0 17.0 58.0 \n",
"2 4.0 3 116.0 23.0 54.0 \n",
"3 0.0 2 293.0 37.0 70.0 \n",
"4 1.0 0 57.0 15.0 43.0 \n",
"5 3.0 1 43.0 16.0 46.0 \n",
"\n",
" gender_cd device_platform_cd has_order ctr_all cr_click2order \n",
"id \n",
"1 M Android 0 0.250000 0.000000 \n",
"2 M Android 1 0.198276 0.130435 \n",
"3 F Android 1 0.126280 0.054054 \n",
"4 F Android 0 0.263158 0.000000 \n",
"5 M Android 1 0.372093 0.062500 "
],
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" active_imp_total | \n",
" passive_imp_total | \n",
" active_click_total | \n",
" passive_click_total | \n",
" orders_amt_total | \n",
" imp_total | \n",
" click_total | \n",
" age | \n",
" gender_cd | \n",
" device_platform_cd | \n",
" has_order | \n",
" ctr_all | \n",
" cr_click2order | \n",
"
\n",
" \n",
" | id | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" | 1 | \n",
" 33.0 | \n",
" 35.0 | \n",
" 14.0 | \n",
" 3.0 | \n",
" 0 | \n",
" 68.0 | \n",
" 17.0 | \n",
" 58.0 | \n",
" M | \n",
" Android | \n",
" 0 | \n",
" 0.250000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" | 2 | \n",
" 27.0 | \n",
" 89.0 | \n",
" 19.0 | \n",
" 4.0 | \n",
" 3 | \n",
" 116.0 | \n",
" 23.0 | \n",
" 54.0 | \n",
" M | \n",
" Android | \n",
" 1 | \n",
" 0.198276 | \n",
" 0.130435 | \n",
"
\n",
" \n",
" | 3 | \n",
" 57.0 | \n",
" 236.0 | \n",
" 37.0 | \n",
" 0.0 | \n",
" 2 | \n",
" 293.0 | \n",
" 37.0 | \n",
" 70.0 | \n",
" F | \n",
" Android | \n",
" 1 | \n",
" 0.126280 | \n",
" 0.054054 | \n",
"
\n",
" \n",
" | 4 | \n",
" 20.0 | \n",
" 37.0 | \n",
" 14.0 | \n",
" 1.0 | \n",
" 0 | \n",
" 57.0 | \n",
" 15.0 | \n",
" 43.0 | \n",
" F | \n",
" Android | \n",
" 0 | \n",
" 0.263158 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" | 5 | \n",
" 23.0 | \n",
" 20.0 | \n",
" 13.0 | \n",
" 3.0 | \n",
" 1 | \n",
" 43.0 | \n",
" 16.0 | \n",
" 46.0 | \n",
" M | \n",
" Android | \n",
" 1 | \n",
" 0.372093 | \n",
" 0.062500 | \n",
"
\n",
" \n",
"
\n",
"
"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 2
},
{
"cell_type": "markdown",
"id": "ee977b3f",
"metadata": {},
"source": [
"## Заказы по платформам"
]
},
{
"cell_type": "code",
"id": "3cb9ed5d",
"metadata": {
"execution": {
"iopub.execute_input": "2025-12-12T19:12:13.024492Z",
"iopub.status.busy": "2025-12-12T19:12:13.024166Z",
"iopub.status.idle": "2025-12-12T19:12:13.288887Z",
"shell.execute_reply": "2025-12-12T19:12:13.287256Z"
},
"ExecuteTime": {
"end_time": "2025-12-12T19:27:19.479169Z",
"start_time": "2025-12-12T19:27:19.376099Z"
}
},
"source": [
"platform_rate = client.groupby(\"device_platform_cd\")[\"has_order\"].mean().reset_index()\n",
"plt.figure(figsize=(8, 4))\n",
"sns.barplot(data=platform_rate, x=\"device_platform_cd\", y=\"has_order\")\n",
"plt.title(\"Доля клиентов с заказом по платформам\")\n",
"plt.tight_layout()\n",
"plt.show()\n",
"platform_rate\n"
],
"outputs": [
{
"data": {
"text/plain": [
""
],
"image/png": "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7b333rPu3bvb2WefbWeddZa7wv1zzz1nhw4dSvf4d999166++mpr2LCh27dTp042e/bsXDwCwNx3o75ng61atcruuusua968udWrV8/atWtnjz/+uO3cuTPdKdO+t956qzVt2tTte9FFF9mYMWPc/wIgq3VR/4/1d/DNq1/PPvuspaam5ni9//nnn+2BBx6wli1b2plnnunaBQ8//LD9+uuv6R6vffv27es+I96+ukDxH3/8wZvuEwEE0jWgTjjhBNuzZ4998MEHeeLsqHH2+eefW6VKlaJdFORj+kfz0EMPWYsWLezVV1+1t956y6699lqbMWOGCzT27t0b2PeNN96wRx991AUQ2u/NN990wcbQoUPt6aefjupxIL7ou/E///lP4G/Vx65du1rp0qVdQ+3999+3/v3724oVK+zKK6+09evXB/b96aefXN2uWbOmvfjiizZ//ny79957bd68eXbHHXdE6YiQX+pixYoV3Tbvprp4/fXX21NPPeU6ZnLSF198YR07dnSB79ixY+1///ufDRs2zH7//Xe3/auvvgrsqyChW7duVqxYMZs2bZotWLDABQ/Lly93n4dIHUZIr1CEbYhjaggpeteHTr2pwV8G0VKkSBErX758tIuBfMwLAl544QVr3LhxYPupp57qAgoFB0888YQNHjzYbZ81a5YbcejcuXNg39NOO8127NjhnqN3795ROQ7En+Dvxk2bNrlAuE+fPm5UwVOlShU777zz7IYbbnABwjvvvGMFCxZ0PbjVqlWzfv36BfY95ZRTXMOqV69etm7dOqtdu3auHxNiU/j/adWx8G3qlPnoo49s7ty5dvPNN+fI6yYlJbnRhMsvvzzwHS2VK1e2c845x92nOq4AWYG1AoZ//vnHhg8fbgkJCYHPyMknn+zaPIsXL7bzzz8/R8qWnzECgYCNGzfad9995/7RaMhbqUP6h+TREN/06dPd0LhGBZo1a+Z6XPVB9GjU4rLLLnNDlYrwFYgE03OoIaYPqR6/dOlSS0lJsZkzZ7qhTW+I85VXXskwhUmjIxqmVENPXw453ZOB+KNGf6tWrUKCB49GvtTwUpChuicFChSwlStXun9cwW655RY3egHkluBUDnX6HHfccXbTTTdF7IhR8KBRB/XWihpPv/32m23YsCFkX6WwajS6evXquXQUyA8ipRVFosBC9VGUyjR5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AAAAQBjmQAAAAADwjQACAAAAgG8EEAAAAAB8I4AAAAAA4BsBBAAAAADfCCAAAAAA+EYAAQAAAMA3AggAQMzg0kUAEH0EEAAQZbqCaq1atWzr1q059py68rCurp0XLVmyxB2vfvqlK4MPHz7c5s6dG9j2zz//uGM866yzrFGjRvb1119bfqL6oPOk+gEAeUmhaBcAAJDznn76aStZsmS+ObWJiYn2/PPP24gRIwLbFi9ebG+99Zbdcccddu6551qdOnWiWkYAiBcEEACQD8VDY/qvv/5yPzt27GinnHJKtIsDAHGDFCYAyEWpqak2ceJEa9OmjTVo0MD1niclJYXs8+OPP9qtt97q0nJ0u/POO23Lli3uvoMHD9rZZ59tTzzxRMhjlM5zzjnn2NChQyOmMP399982ZMgQa9mypTVs2NA6depkn3zySchzvP7663bppZfamWee6co3YcIES0lJyVI61nfffWdXXnml1a9f3y677DJbsGDBER/34YcfWrdu3Vw6kl7/4osvtpdffjmQynP++ee73/v37x84Nu/4LrjgArvuuusC5+eZZ55xj69Xr561a9fOpkyZ4s67R/ved9991qdPH3cubrrppkC6kMqp90TbNaqh90rnbsCAAe68a9uoUaMyPRdD+8+cOdMuueQSd04uvPBCmz59esjzLFy40C6//HJ3v87dunXrMvUaAJBbCCAAIBep8akGbufOnV2aUdmyZW3MmDGB+zdt2mRdunSxP//80wUJw4YNc8FD165d3baiRYvaRRddZO+//35I4/OLL76w3bt3W4cOHdK9poKAHj16uPkDCkzUKD7ttNNcYLJ8+XK3z+TJk+3hhx+25s2b27PPPmvXXnutTZ061W3LCr2OGv06xurVq9vdd99tn376acR9FcioLHXr1nVlU+CiEYXBgwe7QKRChQrueeT22293v6uRr99Ffz/66KPufNx22202bdo0u+qqq9xxKJB48skn3f3BdP6OO+44mzRpkvXs2TOwfeDAgXb66ae77ToXTz31lHuvihUr5l5HAYme/2gBUbiRI0e6m4IflUvPOXr0aBfcyKJFi1xAoyBG9UOBRr9+/TJ93gEgV6QBAHJFUlJSWt26ddNGjRoVsv3mm29OO/3009O2bNmSds8996Sde+65aXv27Ancv3v37rSzzz477fHHH3d/f/31127/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"
},
"metadata": {},
"output_type": "display_data",
"jetTransient": {
"display_id": null
}
},
{
"data": {
"text/plain": [
" device_platform_cd has_order\n",
"0 Android 0.587575\n",
"1 IOS 0.545270\n",
"2 iOS 0.542612\n",
"3 iPadOS 0.569767"
],
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" device_platform_cd | \n",
" has_order | \n",
"
\n",
" \n",
" \n",
" \n",
" | 0 | \n",
" Android | \n",
" 0.587575 | \n",
"
\n",
" \n",
" | 1 | \n",
" IOS | \n",
" 0.545270 | \n",
"
\n",
" \n",
" | 2 | \n",
" iOS | \n",
" 0.542612 | \n",
"
\n",
" \n",
" | 3 | \n",
" iPadOS | \n",
" 0.569767 | \n",
"
\n",
" \n",
"
\n",
"
"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 3
},
{
"cell_type": "markdown",
"id": "f65ad022",
"metadata": {},
"source": [
"## ML-модель с контролем объёма"
]
},
{
"cell_type": "code",
"id": "eaa4b459",
"metadata": {
"execution": {
"iopub.execute_input": "2025-12-12T19:12:13.294736Z",
"iopub.status.busy": "2025-12-12T19:12:13.294463Z",
"iopub.status.idle": "2025-12-12T19:12:13.423902Z",
"shell.execute_reply": "2025-12-12T19:12:13.421985Z"
},
"ExecuteTime": {
"end_time": "2025-12-12T19:27:19.655814Z",
"start_time": "2025-12-12T19:27:19.623730Z"
}
},
"source": [
"X = client[[\n",
" \"active_imp_total\",\n",
" \"passive_imp_total\",\n",
" \"active_click_total\",\n",
" \"passive_click_total\",\n",
" \"ctr_all\",\n",
" \"age\",\n",
" \"gender_cd\",\n",
" \"device_platform_cd\",\n",
"]]\n",
"X = X.copy()\n",
"X[\"gender_cd\"] = eda.normalize_gender(X[\"gender_cd\"])\n",
"X[\"device_platform_cd\"] = eda.normalize_device(X[\"device_platform_cd\"])\n",
"y = client[\"has_order\"]\n",
"\n",
"numeric_cols = [\"active_imp_total\", \"passive_imp_total\", \"active_click_total\", \"passive_click_total\", \"ctr_all\", \"age\"]\n",
"cat_cols = [\"gender_cd\", \"device_platform_cd\"]\n",
"\n",
"preprocess = ColumnTransformer(\n",
" [\n",
" (\"num\", Pipeline([(\"scaler\", StandardScaler())]), numeric_cols),\n",
" (\"cat\", OneHotEncoder(handle_unknown=\"ignore\"), cat_cols),\n",
" ]\n",
")\n",
"\n",
"model = Pipeline([(\"pre\", preprocess), (\"clf\", LogisticRegression(max_iter=1000))])\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
"model.fit(X_train, y_train)\n",
"proba = model.predict_proba(X_test)[:, 1]\n",
"auc = roc_auc_score(y_test, proba)\n",
"coef = model.named_steps[\"clf\"].coef_[0]\n",
"features = model.named_steps[\"pre\"].get_feature_names_out()\n",
"coef_series = pd.Series(coef, index=features).sort_values(key=abs, ascending=False)\n",
"auc, coef_series.head(10)\n"
],
"outputs": [
{
"data": {
"text/plain": [
"(0.681635404420581,\n",
" num__passive_click_total 0.757779\n",
" num__ctr_all -0.257144\n",
" cat__device_platform_cd_Android 0.182476\n",
" cat__gender_cd_M 0.133747\n",
" num__active_click_total 0.119761\n",
" cat__device_platform_cd_iPadOS -0.100109\n",
" num__age -0.071048\n",
" num__passive_imp_total -0.050535\n",
" cat__device_platform_cd_iOS 0.040232\n",
" num__active_imp_total -0.019038\n",
" dtype: float64)"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 4
},
{
"cell_type": "markdown",
"id": "ce032735",
"metadata": {},
"source": [
"## Вывод по гипотезе\n",
"- В сырой агрегированной доле заказов Android выше iOS.\n",
"- В модели при контроле объёма коммуникаций и CTR коэффициент при `device_platform_cd_Android` положительный и в топ‑фичах, AUC ~0.69. Гипотеза подтверждается: платформа влияет на вероятность заказа."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}