{"id":7123,"date":"2025-09-03T11:12:23","date_gmt":"2025-09-03T02:12:23","guid":{"rendered":"https:\/\/blog.since2020.jp\/?p=7123"},"modified":"2025-09-03T11:14:24","modified_gmt":"2025-09-03T02:14:24","slug":"churn-prediction-model","status":"publish","type":"post","link":"https:\/\/since2020.jp\/media\/churn-prediction-model\/","title":{"rendered":"\u30c1\u30e3\u30fc\u30f3\uff08\u9867\u5ba2\u96e2\u53cd\uff09\u4e88\u6e2c\u30e2\u30c7\u30eb\u3092\u5b9f\u88c5\u3057\u3066\u307f\u305f"},"content":{"rendered":"\n<p>\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u30d3\u30b8\u30cd\u30b9\u306b\u304a\u3044\u3066\u3001\u9867\u5ba2\u306e\u96e2\u8131\u3092\u4e8b\u524d\u306b\u4e88\u6e2c\u3067\u304d\u308c\u3070\u3069\u308c\u307b\u3069\u5fc3\u5f37\u3044\u3067\u3057\u3087\u3046\u304b\u3002\u4eca\u56de\u306f1000\u540d\u306e\u9867\u5ba2\u30c7\u30fc\u30bf\u3092\u7528\u3044\u3066\u3001\u7d71\u8a08\u7684\u691c\u5b9a\u3068\u6a5f\u68b0\u5b66\u7fd2\u306e\u4e21\u65b9\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u3067\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u30e2\u30c7\u30eb\u3092\u69cb\u7bc9\u3057\u307e\u3057\u305f\u3002\u5358\u306a\u308b\u6280\u8853\u89e3\u8aac\u3067\u306f\u306a\u304f\u3001\u5b9f\u969b\u306e\u30d3\u30b8\u30cd\u30b9\u73fe\u5834\u3067\u4f7f\u3048\u308b\u4e88\u6e2c\u7d50\u679c\u3092\u3044\u304b\u306b\u884c\u52d5\u306b\u79fb\u3059\u304b\u307e\u3067\u3001\u5b9f\u8df5\u7684\u306a\u8996\u70b9\u3067\u304a\u4f1d\u3048\u3057\u307e\u3059\u3002<\/p>\n\n\n<h2>\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u3068\u306f\u4f55\u304b<\/h2>\n<p>\u30c1\u30e3\u30fc\u30f3\uff08\u9867\u5ba2\u96e2\u53cd\uff09\u4e88\u6e2c\u3068\u306f\u3001\u73fe\u5728\u306e\u9867\u5ba2\u306e\u4e2d\u3067\u300c\u5c06\u6765\u7684\u306b\u30b5\u30fc\u30d3\u30b9\u3092\u89e3\u7d04\u3057\u305d\u3046\u306a\u9867\u5ba2\u300d\u3092\u4e8b\u524d\u306b\u7279\u5b9a\u3059\u308b\u5206\u6790\u624b\u6cd5\u3067\u3059\u3002\u643a\u5e2f\u96fb\u8a71\u4f1a\u793e\u3084\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u30b5\u30fc\u30d3\u30b9\u306a\u3069\u3067\u5e83\u304f\u6d3b\u7528\u3055\u308c\u3066\u304a\u308a\u3001\u9867\u5ba2\u7dad\u6301\u30b3\u30b9\u30c8\u3092\u6700\u9069\u5316\u3057\u3001\u58f2\u4e0a\u640d\u5931\u3092\u9632\u3050\u305f\u3081\u306e\u91cd\u8981\u306a\u6b66\u5668\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<p>\u65b0\u898f\u9867\u5ba2\u7372\u5f97\u30b3\u30b9\u30c8\u304c\u65e2\u5b58\u9867\u5ba2\u7dad\u6301\u30b3\u30b9\u30c8\u3088\u308a\u3082\u5927\u5e45\u306b\u304b\u304b\u308b\u3068\u8a00\u308f\u308c\u308b\u73fe\u5728\u3001\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u306f\u5358\u306a\u308b\u5206\u6790\u30c4\u30fc\u30eb\u3067\u306f\u306a\u304f\u3001\u53ce\u76ca\u6027\u5411\u4e0a\u306e\u5fc5\u9808\u6226\u7565\u3068\u8a00\u3048\u308b\u3067\u3057\u3087\u3046\u3002<\/p>\r\n<p><!-- notionvc: c1fd5549-6bc1-455e-b424-62d5f589e429 --><\/p>\n\n<h2>\u30c7\u30fc\u30bf\u306e\u6982\u8981\u78ba\u8a8d<\/h2>\n<p>\u307e\u305a\u3001\u5206\u6790\u5bfe\u8c61\u3068\u306a\u308b1000\u540d\u306e\u9867\u5ba2\u30c7\u30fc\u30bf\u306e\u69cb\u9020\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<!-- notionvc: 70d7f9fc-0e98-450a-9c98-459ac53969aa --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import pandas as pd\r\nimport numpy as np\r\nimport matplotlib.pyplot as plt\r\nimport seaborn as sns\r\nfrom scipy import stats\r\nfrom scipy.stats import chi2_contingency, ttest_ind\r\nfrom sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold\r\nfrom sklearn.preprocessing import StandardScaler, LabelEncoder\r\nfrom sklearn.linear_model import LogisticRegression\r\nfrom sklearn.ensemble import RandomForestClassifier\r\nfrom sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve\r\nfrom sklearn.feature_selection import SelectKBest, chi2, f_classif\r\nfrom sklearn.metrics import precision_score, recall_score, f1_score\r\nimport warnings\r\nwarnings.filterwarnings('ignore')\r\n\r\n# \u30b5\u30f3\u30d7\u30eb\u30c7\u30fc\u30bf\u306e\u751f\u6210\r\nnp.random.seed(42)\r\nn_customers = 1000\r\n\r\n# \u9867\u5ba2\u5c5e\u6027\u30c7\u30fc\u30bf\u751f\u6210\r\ndata = {\r\n'customer_id': range(1, n_customers + 1),\r\n'tenure': np.random.exponential(scale=24, size=n_customers), # \u5728\u7c4d\u671f\u9593\uff08\u6307\u6570\u5206\u5e03\uff09\r\n'monthly_charges': np.random.normal(loc=65, scale=20, size=n_customers), # \u6708\u984d\u6599\u91d1\uff08\u6b63\u898f\u5206\u5e03\uff09\r\n'total_charges': np.random.gamma(shape=2, scale=500, size=n_customers), # \u7d2f\u7a4d\u6599\u91d1\uff08\u30ac\u30f3\u30de\u5206\u5e03\uff09\r\n'contract_type': np.random.choice(['Month-to-month', 'One year', 'Two year'],\r\nsize=n_customers, p=[0.5, 0.3, 0.2]),\r\n'payment_method': np.random.choice(['Credit card', 'Bank transfer', 'Electronic check', 'Mailed check'],\r\nsize=n_customers, p=[0.3, 0.2, 0.3, 0.2]),\r\n'senior_citizen': np.random.binomial(1, 0.16, n_customers),\r\n'partner': np.random.binomial(1, 0.48, n_customers),\r\n'dependents': np.random.binomial(1, 0.3, n_customers),\r\n'internet_service': np.random.choice(['DSL', 'Fiber optic', 'No'],\r\nsize=n_customers, p=[0.4, 0.4, 0.2]),\r\n'online_security': np.random.binomial(1, 0.35, n_customers),\r\n'tech_support': np.random.binomial(1, 0.29, n_customers),\r\n'multiple_lines': np.random.binomial(1, 0.52, n_customers)\r\n}\r\n\r\n# \u30c7\u30fc\u30bf\u306e\u4e2d\u8eab\u306e\u78ba\u8a8d\r\ndf = pd.DataFrame(data)\r\nprint(df)<\/code><\/pre>\r\n<\/div>\r\n<pre><strong>\u30c7\u30fc\u30bf\u306e\u4e2d\u8eab<\/strong><\/pre>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>| customer\\_id | tenure | monthly\\_charges | total\\_charges | contract\\_type | payment\\_method | senior\\_citizen | partner | dependents | internet\\_service | online\\_security | tech\\_support | multiple\\_lines | user\\_segment | churn |\r\n| ------------ | --------- | ---------------- | -------------- | -------------- | ---------------- | --------------- | ------- | ---------- | ----------------- | ---------------- | ------------- | --------------- | ------------- | ----- |\r\n| 1 | 11.262434 | 68.554020 | 215.284541 | One year | Mailed check | 0 | 0 | 1 | DSL | 0 | 1 | 0 | Standard | 0 |\r\n| 2 | 72.242914 | 38.293113 | 780.831773 | One year | Electronic check | 0 | 0 | 0 | DSL | 1 | 0 | 1 | Standard | 1 |\r\n| 3 | 31.601897 | 72.603957 | 887.688721 | One year | Bank transfer | 0 | 1 | 0 | No | 2 | 0 | 0 | Standard | 0 |\r\n| 4 | 21.910621 | 77.211715 | 202.146501 | Two year | Credit card | 0 | 1 | 0 | No | 3 | 0 | 0 | Standard | 0 |\r\n| 5 | 4.070997 | 76.195809 | 649.250704 | Month-to-month | Bank transfer | 0 | 0 | 1 | DSL | 4 | 0 | 0 | New Customer | 0 |<\/code><\/pre>\r\n<\/div>\r\n<pre><strong>\u5404\u30ab\u30e9\u30e0\u306e\u610f\u5473<\/strong><\/pre>\r\n<ul>\r\n\t<li><strong>customer_id<\/strong>: \u9867\u5ba2ID<\/li>\r\n\t<li><strong>tenure<\/strong>: \u5728\u7c4d\u671f\u9593\uff08\u6708\uff09<\/li>\r\n\t<li><strong>monthly_charges<\/strong>: \u6708\u984d\u6599\u91d1\uff08\u30c9\u30eb\uff09<\/li>\r\n\t<li><strong>total_charges<\/strong>: \u7d2f\u7a4d\u6599\u91d1\uff08\u30c9\u30eb\uff09<\/li>\r\n\t<li><strong>contract_type<\/strong>: \u5951\u7d04\u30bf\u30a4\u30d7\uff08Month-to-month\/One year\/Two year\uff09<\/li>\r\n\t<li><strong>payment_method<\/strong>: \u6c7a\u6e08\u65b9\u6cd5\uff08Credit card\/Bank transfer\/Electronic check\/Mailed check\uff09<\/li>\r\n\t<li><strong>senior_citizen<\/strong>: \u30b7\u30cb\u30a2\u9867\u5ba2\u30d5\u30e9\u30b0\uff080\/1\uff09<\/li>\r\n\t<li><strong>partner<\/strong>: \u30d1\u30fc\u30c8\u30ca\u30fc\u6709\u7121\uff080\/1\uff09<\/li>\r\n\t<li><strong>dependents<\/strong>: \u6276\u990a\u5bb6\u65cf\u6709\u7121\uff080\/1\uff09<\/li>\r\n\t<li><strong>internet_service<\/strong>: \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u30b5\u30fc\u30d3\u30b9\u7a2e\u5225\uff08DSL\/No\/Fiber optic\uff09<\/li>\r\n\t<li><strong>online_security<\/strong>: \u30aa\u30f3\u30e9\u30a4\u30f3\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5229\u7528\uff080\/1\uff09<\/li>\r\n\t<li><strong>tech_support<\/strong>: \u30c6\u30af\u30cb\u30ab\u30eb\u30b5\u30dd\u30fc\u30c8\u5229\u7528\uff080\/1\uff09<\/li>\r\n\t<li><strong>multiple_lines<\/strong>: \u8907\u6570\u56de\u7dda\u5951\u7d04\uff080\/1\uff09<\/li>\r\n\t<li><strong>user_segment<\/strong>: \u9867\u5ba2\u30bb\u30b0\u30e1\u30f3\u30c8\uff08Premium\/New Customer\/Senior\/Family\/Price-Sensitive\/Standard\uff09<\/li>\r\n\t<li><strong>churn<\/strong>: \u30c1\u30e3\u30fc\u30f3\uff08\u96e2\u8131\uff09\u30d5\u30e9\u30b0\uff080\/1\uff09<\/li>\r\n<\/ul>\r\n<p><!-- notionvc: ca22fbe7-6d09-4d7f-85d4-99a01a8bac46 --><\/p>\r\n<p><!-- notionvc: ca515f74-66cd-448d-9d78-f3dabb550746 --><\/p>\r\n<p><code>\r\n<\/code><\/p>\r\n<p><!-- notionvc: 88d2fac9-f053-44a7-976c-accbf21db953 --><\/p>\n\n<h2>\u30bb\u30b0\u30e1\u30f3\u30c8\u5206\u985e\u3068\u57fa\u672c\u7d71\u8a08<\/h2>\n<p>\u4e0a\u8a18\u306e\u30ab\u30e9\u30e0\u306e1\u3064\u306b\u3001user_segment: \u9867\u5ba2\u30bb\u30b0\u30e1\u30f3\u30c8\u304c\u3042\u308a\u307e\u3057\u305f\u304c\u3001\u9867\u5ba2\u30bb\u30b0\u30e1\u30f3\u30c8\u306f\u4ee5\u4e0b\u306e\u3088\u3046\u306b\u3057\u3066\u5206\u985e\u3055\u308c\u3066\u3044\u307e\u3059\uff1a<\/p>\r\n<ul>\r\n\t<li><strong>Premium<\/strong>\uff084.0%\uff09: \u6708\u984d80\u30c9\u30eb\u8d85\u3001\u5728\u7c4d24\u30f6\u6708\u8d85\u3001\u9577\u671f\u5951\u7d04\u306e\u9ad8\u4fa1\u5024\u9867\u5ba2<\/li>\r\n\t<li><strong>New Customer<\/strong>\uff0823.8%\uff09: \u5728\u7c4d6\u30f6\u6708\u672a\u6e80\u306e\u65b0\u898f\u9867\u5ba2<\/li>\r\n\t<li><strong>Senior<\/strong>\uff0811.9%\uff09: \u30b7\u30cb\u30a2\u4e16\u4ee3\u306e\u9867\u5ba2<\/li>\r\n\t<li><strong>Family<\/strong>\uff088.2%\uff09: \u30d1\u30fc\u30c8\u30ca\u30fc\u30fb\u6276\u990a\u5bb6\u65cf\u3092\u6301\u3064\u30d5\u30a1\u30df\u30ea\u30fc\u5c64<\/li>\r\n\t<li><strong>Price-Sensitive<\/strong>\uff085.5%\uff09: \u6708\u984d50\u30c9\u30eb\u672a\u6e80\u3001\u6708\u5951\u7d04\u306e\u4fa1\u683c\u91cd\u8996\u9867\u5ba2<\/li>\r\n\t<li><strong>Standard<\/strong>\uff0846.6%\uff09: \u4e0a\u8a18\u4ee5\u5916\u306e\u4e00\u822c\u9867\u5ba2<\/li>\r\n<\/ul>\r\n<p>&nbsp;<\/p>\r\n<p>\u4ee5\u4e0b\u306b\u793a\u3059\u3088\u3046\u306b\u3001\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u8a73\u7d30\u3092\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code><\/code><strong><code class=\"language-python\">print(\"=== \u30c7\u30fc\u30bf\u57fa\u672c\u7d71\u8a08 ===\")\r\nprint(f\"\u7dcf\u9867\u5ba2\u6570: {len(df)}\")\r\nprint(f\"\u30c1\u30e3\u30fc\u30f3\u7387: {df['churn'].mean():.3f}\")\r\nprint(f\"\u5e73\u5747\u5728\u7c4d\u671f\u9593: {df['tenure'].mean():.1f}\u30f6\u6708\")\r\nprint(f\"\u5e73\u5747\u6708\u984d\u6599\u91d1: ${df['monthly_charges'].mean():.2f}\")\r\n\r\n# \u30bb\u30b0\u30e1\u30f3\u30c8\u5206\u5e03\u306e\u78ba\u8a8d\r\nprint(f\"\\\\n=== \u30e6\u30fc\u30b6\u30fc\u30bb\u30b0\u30e1\u30f3\u30c8\u5206\u5e03 ===\")\r\nsegment_dist = df['user_segment'].value_counts()\r\nfor segment, count in segment_dist.items():\r\n    percentage = count \/ len(df) * 100\r\n    print(f\"{segment}: {count}\u4eba ({percentage:.1f}%)\")\r\n\r\n# \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u306e\u57fa\u672c\u7d71\u8a08\r\nprint(f\"\\\\n=== \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u57fa\u672c\u7d71\u8a08 ===\")\r\nsegment_stats = df.groupby('user_segment').agg({\r\n    'churn': ['count', 'mean'],\r\n    'tenure': 'mean',\r\n    'monthly_charges': 'mean',\r\n    'total_charges': 'mean'\r\n}).round(3)\r\n\r\nsegment_stats.columns = ['\u9867\u5ba2\u6570', '\u30c1\u30e3\u30fc\u30f3\u7387', '\u5e73\u5747\u5728\u7c4d\u671f\u9593', '\u5e73\u5747\u6708\u984d\u6599\u91d1', '\u5e73\u5747\u7d2f\u7a4d\u6599\u91d1']\r\nprint(segment_stats)<\/code><\/strong><\/pre>\r\n<\/div>\r\n<pre><strong>\u51fa\u529b\u7d50\u679c<\/strong><\/pre>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>=== \u30c7\u30fc\u30bf\u57fa\u672c\u7d71\u8a08 ===\r\n\u7dcf\u9867\u5ba2\u6570: 1000\r\n\u30c1\u30e3\u30fc\u30f3\u7387: 0.385\r\n\u5e73\u5747\u5728\u7c4d\u671f\u9593: 23.3\u30f6\u6708\r\n\u5e73\u5747\u6708\u984d\u6599\u91d1: $66.98\r\n\r\n=== \u30e6\u30fc\u30b6\u30fc\u30bb\u30b0\u30e1\u30f3\u30c8\u5206\u5e03 ===\r\nStandard: 466\u4eba (46.6%)\r\nNew Customer: 238\u4eba (23.8%)\r\nSenior: 119\u4eba (11.9%)\r\nFamily: 82\u4eba (8.2%)\r\nPrice-Sensitive: 55\u4eba (5.5%)\r\nPremium: 40\u4eba (4.0%)\r\n\r\n=== \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u57fa\u672c\u7d71\u8a08 ===\r\n                 \u9867\u5ba2\u6570  \u30c1\u30e3\u30fc\u30f3\u7387  \u5e73\u5747\u5728\u7c4d\u671f\u9593  \u5e73\u5747\u6708\u984d\u6599\u91d1    \u5e73\u5747\u7d2f\u7a4d\u6599\u91d1\r\nuser_segment\r\nFamily            82  0.293  24.107  63.234  1018.265\r\nNew Customer     238  0.420   2.798  67.428  1000.705\r\nPremium           40  0.250  49.610  91.906   956.969\r\nPrice-Sensitive   55  0.582  32.667  38.459  1150.416\r\nSenior           119  0.336  30.097  65.864  1113.340\r\nStandard         466  0.384  28.616  68.918   987.920<\/code><\/pre>\r\n<\/div>\r\n<pre><code><\/code><\/pre>\r\n<p><!-- notionvc: 932fcf1f-33f9-4849-989f-cb9ad993a168 --><\/p>\r\n<p><!-- notionvc: 6a4e1073-8b7c-4382-9999-22f95fc901c6 --><\/p>\n\n<h2>\u7d71\u8a08\u7684\u691c\u5b9a\u306b\u3088\u308b\u30c1\u30e3\u30fc\u30f3\u5206\u6790<\/h2>\n<p>\u305d\u308c\u3067\u306f\u3001\u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u306b\u30c1\u30e3\u30fc\u30f3\u5206\u6790\u3092\u884c\u3063\u3066\u3044\u304d\u3001\u96e2\u53cd\u30bb\u30b0\u30e1\u30f3\u30c8\u3092\u7279\u5b9a\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\r\n<p><!-- notionvc: 64f4ae0e-0f26-49c0-821b-e5b9058e67dd --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code><code class=\"language-python\"># \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u30c1\u30e3\u30fc\u30f3\u5206\u6790\r\nprint(f\"\\\\n=== \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u30c1\u30e3\u30fc\u30f3\u5206\u6790\uff08\u7d71\u8a08\u7684\u6709\u610f\u6027\uff09===\")\r\nsegment_churn_analysis = []\r\n\r\nfor segment in df['user_segment'].unique():\r\n    segment_data = df[df['user_segment'] == segment]\r\n    other_data = df[df['user_segment'] != segment]\r\n    \r\n    # \u30bb\u30b0\u30e1\u30f3\u30c8\u5185\u3068\u30bb\u30b0\u30e1\u30f3\u30c8\u5916\u306e\u30c1\u30e3\u30fc\u30f3\u7387\u6bd4\u8f03\uff08\u30ab\u30a4\u4e8c\u4e57\u691c\u5b9a\uff09\r\n    contingency = pd.crosstab(\r\n        df['user_segment'] == segment,\r\n        df['churn'],\r\n        margins=False\r\n    )\r\n    \r\n    chi2, p_value, _, _ = chi2_contingency(contingency)\r\n    \r\n    analysis_row = {\r\n        '\u30bb\u30b0\u30e1\u30f3\u30c8': segment,\r\n        '\u9867\u5ba2\u6570': len(segment_data),\r\n        '\u30c1\u30e3\u30fc\u30f3\u7387': segment_data['churn'].mean(),\r\n        '\u5e73\u5747\u5728\u7c4d\u671f\u9593': segment_data['tenure'].mean(),\r\n        '\u5e73\u5747\u6708\u984d\u6599\u91d1': segment_data['monthly_charges'].mean(),\r\n        '\u30ab\u30a4\u4e8c\u4e57\u7d71\u8a08\u91cf': chi2,\r\n        'p\u5024': p_value,\r\n        '\u7d71\u8a08\u7684\u6709\u610f\u6027': 'Yes' if p_value &lt; 0.05 else 'No'\r\n    }\r\n    segment_churn_analysis.append(analysis_row)\r\n\r\nsegment_analysis_df = pd.DataFrame(segment_churn_analysis)\r\nsegment_analysis_df = segment_analysis_df.round(3)\r\nprint(segment_analysis_df)<\/code><\/code><\/pre>\r\n<\/div>\r\n<pre><strong><span data-token-index=\"0\" class=\"notion-enable-hover\">\u51fa\u529b\u7d50\u679c<\/span><\/strong><!-- notionvc: ce2cdb2b-da10-4c06-8880-5c4f5bd4ec4e --><\/pre>\r\n<div class=\"hcb_wrap\">\r\n<pre><code>=== \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u30c1\u30e3\u30fc\u30f3\u5206\u6790\uff08\u7d71\u8a08\u7684\u6709\u610f\u6027\uff09===\r\n             \u30bb\u30b0\u30e1\u30f3\u30c8  \u9867\u5ba2\u6570  \u30c1\u30e3\u30fc\u30f3\u7387  \u5e73\u5747\u5728\u7c4d\u671f\u9593  \u5e73\u5747\u6708\u984d\u6599\u91d1  \u30ab\u30a4\u4e8c\u4e57\u7d71\u8a08\u91cf     p\u5024 \u7d71\u8a08\u7684\u6709\u610f\u6027\r\n0         Standard  466  0.384  28.616  68.918    0.000  1.000     No\r\n1     New Customer  238  0.420   2.798  67.428    1.442  0.230     No\r\n2  Price-Sensitive   55  0.582  32.667  38.459    8.663  0.003    Yes\r\n3           Senior  119  0.336  30.097  65.864    1.138  0.286     No\r\n4           Family   82  0.293  24.107  63.234    2.804  0.094     No\r\n5          Premium   40  0.250  49.610  91.906    2.641  0.104     No\r\n<\/code><\/pre>\r\n<\/div>\r\n<p>\u3053\u306e\u51fa\u529b\u7d50\u679c\u3092\u78ba\u8a8d\u3059\u308b\u3068\u3001\u30bb\u30b0\u30e1\u30f3\u30c8: Price-Sensitive\uff08\u6708\u984d50\u30c9\u30eb\u672a\u6e80\u3001\u6708\u5951\u7d04\u306e\u4fa1\u683c\u91cd\u8996\u9867\u5ba2\uff09\u306e\u96e2\u53cd\u304c\u7d71\u8a08\u7684\u306b\u6709\u610f\u3067\u3042\u308b\u3053\u3068\u304c\u5206\u304b\u308a\u307e\u3057\u305f\u3002<\/p>\r\n<p>\u307e\u305f\u3001\u3069\u306e\u7279\u5fb4\u91cf\u304c\u30c1\u30e3\u30fc\u30f3\u306b\u7d71\u8a08\u7684\u306b\u6709\u610f\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u3066\u3044\u308b\u304b\u3082\u691c\u8a3c\u3057\u307e\u3057\u305f\u3002<\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre><code class=\"language-python\"># \u7279\u5fb4\u91cf\u3054\u3068\u306e\u30c1\u30e3\u30fc\u30f3\u5206\u6790\r\nprint(f\"\\\\n=== \u7279\u5fb4\u91cf\u3054\u3068\u306e\u30c1\u30e3\u30fc\u30f3\u5206\u6790 ===\")\r\n\r\ndef analyze_feature_churn(df, feature_name):\r\n    \"\"\"\u7279\u5fb4\u91cf\u5225\u306e\u30c1\u30e3\u30fc\u30f3\u5206\u6790\u3092\u5b9f\u884c\"\"\"\r\n    feature_analysis = []\r\n    \r\n    # \u30d0\u30a4\u30ca\u30ea\u5909\u6570\u304b\u3069\u3046\u304b\u3092\u5224\u5b9a\r\n    unique_values = df[feature_name].unique()\r\n    is_binary = len(unique_values) == 2 and set(unique_values) == {0, 1}\r\n    \r\n    if df[feature_name].dtype in ['object', 'category'] or is_binary:\r\n        # \u30ab\u30c6\u30b4\u30ea\u30ab\u30eb\u5909\u6570\u307e\u305f\u306f\u30d0\u30a4\u30ca\u30ea\u5909\u6570\u306e\u5834\u5408\r\n        for category in df[feature_name].unique():\r\n            category_data = df[df[feature_name] == category]\r\n            other_data = df[df[feature_name] != category]\r\n            \r\n            # \u30ab\u30a4\u4e8c\u4e57\u691c\u5b9a\r\n            contingency = pd.crosstab(\r\n                df[feature_name] == category,\r\n                df['churn'],\r\n                margins=False\r\n            )\r\n            \r\n            if contingency.shape == (2, 2):  # 2x2\u5206\u5272\u8868\u306e\u5834\u5408\u306e\u307f\r\n                chi2, p_value, _, _ = chi2_contingency(contingency)\r\n            else:\r\n                chi2, p_value = np.nan, np.nan\r\n            \r\n            analysis_row = {\r\n                '\u7279\u5fb4\u91cf': feature_name,\r\n                '\u30ab\u30c6\u30b4\u30ea': str(category),\r\n                '\u9867\u5ba2\u6570': len(category_data),\r\n                '\u30c1\u30e3\u30fc\u30f3\u7387': category_data['churn'].mean(),\r\n                '\u5168\u4f53\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                '\u30c1\u30e3\u30fc\u30f3\u7387\u5dee': category_data['churn'].mean() - df['churn'].mean(),\r\n                '\u30ab\u30a4\u4e8c\u4e57\u7d71\u8a08\u91cf': chi2,\r\n                'p\u5024': p_value,\r\n                '\u7d71\u8a08\u7684\u6709\u610f\u6027': 'Yes' if p_value &lt; 0.05 else 'No'\r\n            }\r\n            feature_analysis.append(analysis_row)\r\n    \r\n    else:\r\n        # \u9023\u7d9a\u5909\u6570\u306e\u5834\u5408\r\n        # \u56db\u5206\u4f4d\u6570\u304c\u91cd\u8907\u3057\u3066\u3044\u306a\u3044\u304b\u30c1\u30a7\u30c3\u30af\r\n        quartiles = df[feature_name].quantile([0.25, 0.5, 0.75]).values\r\n        unique_quartiles = len(np.unique(quartiles))\r\n        \r\n        if unique_quartiles &lt; 3:\r\n            # \u56db\u5206\u4f4d\u6570\u304c\u91cd\u8907\u3057\u3066\u3044\u308b\u5834\u5408\u306f\u3001\u30ab\u30c6\u30b4\u30ea\u5316\u3092\u30b9\u30ad\u30c3\u30d7\r\n            analysis_row = {\r\n                '\u7279\u5fb4\u91cf': feature_name,\r\n                '\u30ab\u30c6\u30b4\u30ea': '\u5206\u6790\u4e0d\u53ef\uff08\u5024\u306e\u5206\u6563\u304c\u5c0f\u3055\u3044\uff09',\r\n                '\u9867\u5ba2\u6570': len(df),\r\n                '\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                '\u5168\u4f53\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                '\u30c1\u30e3\u30fc\u30f3\u7387\u5dee': 0,\r\n                't\u7d71\u8a08\u91cf': np.nan,\r\n                'p\u5024': np.nan,\r\n                '\u7d71\u8a08\u7684\u6709\u610f\u6027': 'No'\r\n            }\r\n            feature_analysis.append(analysis_row)\r\n        else:\r\n            # \u56db\u5206\u4f4d\u6570\u3067\u533a\u5207\u308a\r\n            bins = [-np.inf, quartiles[0], quartiles[1], quartiles[2], np.inf]\r\n            labels = ['Q1(\u4f4e)', 'Q2(\u4e2d\u4f4e)', 'Q3(\u4e2d\u9ad8)', 'Q4(\u9ad8)']\r\n            \r\n            df_temp = df.copy()\r\n            try:\r\n                df_temp[f'{feature_name}_quartile'] = pd.cut(df_temp[feature_name], \r\n                                                           bins=bins, labels=labels, \r\n                                                           duplicates='drop')\r\n                \r\n                for quartile in labels:\r\n                    quartile_data = df_temp[df_temp[f'{feature_name}_quartile'] == quartile]\r\n                    \r\n                    if len(quartile_data) &gt; 0:\r\n                        # t\u691c\u5b9a\uff08\u305d\u306equartile vs \u305d\u306e\u4ed6\uff09\r\n                        quartile_churn = quartile_data['churn']\r\n                        other_churn = df_temp[df_temp[f'{feature_name}_quartile'] != quartile]['churn']\r\n                        \r\n                        if len(np.unique(quartile_churn)) &gt; 1 and len(np.unique(other_churn)) &gt; 1:\r\n                            t_stat, p_value = ttest_ind(quartile_churn, other_churn)\r\n                        else:\r\n                            t_stat, p_value = np.nan, np.nan\r\n                        \r\n                        analysis_row = {\r\n                            '\u7279\u5fb4\u91cf': feature_name,\r\n                            '\u30ab\u30c6\u30b4\u30ea': quartile,\r\n                            '\u9867\u5ba2\u6570': len(quartile_data),\r\n                            '\u30c1\u30e3\u30fc\u30f3\u7387': quartile_data['churn'].mean(),\r\n                            '\u5168\u4f53\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                            '\u30c1\u30e3\u30fc\u30f3\u7387\u5dee': quartile_data['churn'].mean() - df['churn'].mean(),\r\n                            't\u7d71\u8a08\u91cf': t_stat,\r\n                            'p\u5024': p_value,\r\n                            '\u7d71\u8a08\u7684\u6709\u610f\u6027': 'Yes' if p_value &lt; 0.05 else 'No'\r\n                        }\r\n                        feature_analysis.append(analysis_row)\r\n\r\n            except ValueError as e:\r\n                # pd.cut()\u3067\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u305f\u5834\u5408\r\n                analysis_row = {\r\n                    '\u7279\u5fb4\u91cf': feature_name,\r\n                    '\u30ab\u30c6\u30b4\u30ea': f'\u5206\u6790\u30a8\u30e9\u30fc: {str(e)[:50]}...',\r\n                    '\u9867\u5ba2\u6570': len(df),\r\n                    '\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                    '\u5168\u4f53\u30c1\u30e3\u30fc\u30f3\u7387': df['churn'].mean(),\r\n                    '\u30c1\u30e3\u30fc\u30f3\u7387\u5dee': 0,\r\n                    't\u7d71\u8a08\u91cf': np.nan,\r\n                    'p\u5024': np.nan,\r\n                    '\u7d71\u8a08\u7684\u6709\u610f\u6027': 'No'\r\n                }\r\n                feature_analysis.append(analysis_row)\r\n    \r\n    return pd.DataFrame(feature_analysis)\r\n\r\n# \u5206\u6790\u5bfe\u8c61\u306e\u7279\u5fb4\u91cf\u30ea\u30b9\u30c8\r\nanalysis_features = ['contract_type', 'payment_method', 'internet_service', 'user_segment',\r\n                    'senior_citizen', 'partner', 'dependents', 'online_security', \r\n                    'tech_support', 'multiple_lines', 'tenure', 'monthly_charges', 'total_charges']\r\n\r\n# \u5404\u7279\u5fb4\u91cf\u306e\u5206\u6790\u5b9f\u884c\r\nall_feature_analysis = []\r\nfor feature in analysis_features:\r\n    if feature in df.columns:\r\n        feature_df = analyze_feature_churn(df, feature)\r\n        all_feature_analysis.append(feature_df)\r\n\r\n# \u5168\u3066\u306e\u7279\u5fb4\u91cf\u5206\u6790\u7d50\u679c\u3092\u7d50\u5408\r\ncombined_feature_analysis = pd.concat(all_feature_analysis, ignore_index=True)\r\ncombined_feature_analysis = combined_feature_analysis.round(3)\r\n    \r\nprint(\"=== \u7279\u5fb4\u91cf\u5225\u30c1\u30e3\u30fc\u30f3\u5206\u6790\u7d50\u679c ===\")\r\ncombined_feature_analysis.tail(20)\r\n<\/code><\/pre>\r\n<\/div>\r\n<pre><strong>\u51fa\u529b\u7d50\u679c\r\n<\/strong><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/20.png\" alt=\"\" width=\"845\" height=\"666\" class=\"aligncenter wp-image-7125 size-full\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/20.png 845w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/20-300x236.png 300w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/20-768x605.png 768w\" sizes=\"(max-width: 845px) 100vw, 845px\" \/><\/pre>\r\n<p>\u30ab\u30e9\u30e0\u6570\u30fb\u30ec\u30b3\u30fc\u30c9\u6570\u304c\u5927\u304d\u3044\u306e\u3067\u3001\u30ab\u30e9\u30e0\u6570\u3092\u7d5e\u308a\u3001\u7d71\u8a08\u7684\u6709\u610f\u6027\u306e\u30ab\u30e9\u30e0\u304c \u201dYes\u201d \u306e\u30ec\u30b3\u30fc\u30c9\u306e\u307f\u3092\u62bd\u51fa\u3057\u3066\u307f\u307e\u3057\u3087\u3046\uff1a<!-- notionvc: 7dcc9f40-c667-4673-ad4f-9f4ce8701ff8 --><\/p>\r\n<p><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-09-02-11.55.22.png\" alt=\"\" width=\"484\" height=\"271\" class=\"aligncenter wp-image-7126 size-full\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-09-02-11.55.22.png 484w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8-2025-09-02-11.55.22-300x168.png 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" \/><\/p>\r\n<p>\u5206\u6790\u306e\u7d50\u679c\u3001\u4ee5\u4e0b\u306e\u7279\u5fb4\u91cf\u304c\u30c1\u30e3\u30fc\u30f3\u306b\u7d71\u8a08\u7684\u306b\u6709\u610f\u306a\u5f71\u97ff\u3092\u4e0e\u3048\u3066\u3044\u308b\u3053\u3068\u304c\u5224\u660e\u3057\u307e\u3057\u305f\uff08p &lt; 0.05\uff09\uff1a<\/p>\r\n<pre><strong>\u4e3b\u8981\u306a\u7279\u5fb4\u91cf\u5225\u306e\u30c1\u30e3\u30fc\u30f3\u7387<\/strong><\/pre>\r\n<ul>\r\n\t<li><strong>\u5951\u7d04\u30bf\u30a4\u30d7<\/strong>: Month-to-month\u5951\u7d04\uff0853.8%\uff09 vs One year\u5951\u7d04\uff0821.6%\uff09 vs Two year\u5951\u7d04\uff0823.5%\uff09<\/li>\r\n\t<li><strong>\u6c7a\u6e08\u65b9\u6cd5<\/strong>: Electronic check\uff0845.8%\u3001+7.3%\uff09<\/li>\r\n\t<li><strong>\u9867\u5ba2\u30bb\u30b0\u30e1\u30f3\u30c8<\/strong>: Price-Sensitive\uff0858.2%\u3001+19.7%\uff09<\/li>\r\n\t<li><strong>\u6708\u984d\u6599\u91d1<\/strong>: Q4\u9ad8\u984d\u5c64\uff0844.4%\u3001+5.9%\uff09<\/li>\r\n\t<li><strong>\u30aa\u30f3\u30e9\u30a4\u30f3\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/strong>: \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u306a\u3057\uff0841.0%\u3001+2.5%\uff09 vs \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3042\u308a\uff0834.1%\u3001-4.4%\uff09<\/li>\r\n<\/ul>\r\n<p>\u5951\u7d04\u30bf\u30a4\u30d7\u304c\u6700\u3082\u5f37\u3044\u4e88\u6e2c\u56e0\u5b50\u3068\u3057\u3066\u78ba\u8a8d\u3055\u308c\u3001\u6708\u5951\u7d04\u9867\u5ba2\u306e\u96e2\u8131\u7387\u304c\u5e74\u5951\u7d04\u9867\u5ba2\u306e2\u500d\u4ee5\u4e0a\u3068\u306a\u3063\u3066\u3044\u307e\u3059\u3002Price-Sensitive\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u9ad8\u3044\u96e2\u8131\u7387\u3084\u4ed8\u52a0\u30b5\u30fc\u30d3\u30b9\u5229\u7528\u306b\u3088\u308b\u96e2\u8131\u6291\u5236\u52b9\u679c\u3082\u7d71\u8a08\u7684\u306b\u6709\u610f\u306a\u7d50\u679c\u3068\u3057\u3066\u5f97\u3089\u308c\u307e\u3057\u305f\u3002<!-- notionvc: 3ba2f6bd-9d93-4efb-9069-935b53a084c6 --><\/p>\r\n<p>&nbsp;<\/p>\r\n<p><!-- notionvc: ef2455c6-d06e-4e9b-b569-d5476bd6238a --><\/p>\r\n<p><!-- notionvc: 8d79a818-dc1f-4b4d-ac1a-c35eb780bf8c --><\/p>\n\n<h2>\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u30e2\u30c7\u30eb\u306e\u5b9f\u88c5<\/h2>\n<p>\u305d\u308c\u3067\u306f\u3001\u6a5f\u68b0\u5b66\u7fd2\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306b\u3088\u308b\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u30e2\u30c7\u30eb\u306e\u5b9f\u88c5\u3092\u884c\u3044\u307e\u3057\u3087\u3046\u3002\u4eca\u56de\u306f\u3001\u30ed\u30b8\u30b9\u30c6\u30a3\u30c3\u30af\u56de\u5e30\u30e2\u30c7\u30eb\u3092\u7528\u3044\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002\u30ed\u30b8\u30b9\u30c6\u30a3\u30c3\u30af\u56de\u5e30\u30e2\u30c7\u30eb\u306f\u3001\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u3067\u306e\u7d50\u679c\u306e\u89e3\u91c8\u304c\u3057\u3084\u3059\u304f\u3001\u30d3\u30b8\u30cd\u30b9\u4e0a\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306b\u7e4b\u3052\u3084\u3059\u3044\u305f\u3081\u3001\u30d9\u30fc\u30b9\u30e9\u30a4\u30f3\u30e2\u30c7\u30eb\u3068\u3057\u3066\u983b\u7e41\u306b\u63a1\u7528\u3055\u308c\u307e\u3059\u3002<!-- notionvc: 63902f07-e3ae-4a9d-8334-40e9ec05e037 --><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre><code class=\"language-python\"># \u6a5f\u68b0\u5b66\u7fd2\u30e2\u30c7\u30eb\u306e\u6e96\u5099\r\nprint(f\"\\\\n=== \u6a5f\u68b0\u5b66\u7fd2\u306b\u3088\u308b\u4e88\u6e2c\u5206\u6790 ===\")\r\n\r\n# \u30c7\u30fc\u30bf\u524d\u51e6\u7406\r\nle = LabelEncoder()\r\ncategorical_columns = ['contract_type', 'payment_method', 'internet_service', 'user_segment']\r\n\r\ndf_encoded = df.copy()\r\nfor col in categorical_columns:\r\n    df_encoded[col] = le.fit_transform(df_encoded[col])\r\n\r\n# \u7279\u5fb4\u91cf\u3068\u30bf\u30fc\u30b2\u30c3\u30c8\u306e\u5206\u96e2\uff08user_segment\u3082\u7279\u5fb4\u91cf\u306b\u542b\u3081\u308b\uff09\r\nfeature_columns = ['tenure', 'monthly_charges', 'total_charges', 'contract_type', \r\n                  'payment_method', 'senior_citizen', 'partner', 'dependents',\r\n                  'internet_service', 'online_security', 'tech_support', 'multiple_lines',\r\n                  'user_segment']  # \u30bb\u30b0\u30e1\u30f3\u30c8\u60c5\u5831\u3092\u7279\u5fb4\u91cf\u306b\u8ffd\u52a0\r\nX = df_encoded[feature_columns]\r\ny = df_encoded['churn']\r\n\r\n# \u30c7\u30fc\u30bf\u5206\u5272\r\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, \r\n                                                   random_state=42, stratify=y)\r\n\r\n# \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u306b\u30bb\u30b0\u30e1\u30f3\u30c8\u60c5\u5831\u3092\u4fdd\u6301\r\ntest_segments = df.iloc[X_test.index]['user_segment'].values\r\n\r\n# \u6a19\u6e96\u5316\r\nscaler = StandardScaler()\r\nX_train_scaled = scaler.fit_transform(X_train)\r\nX_test_scaled = scaler.transform(X_test)\r\n\r\n# \u30ed\u30b8\u30b9\u30c6\u30a3\u30c3\u30af\u56de\u5e30\u30e2\u30c7\u30eb\r\nlr_model = LogisticRegression(random_state=42, max_iter=1000)\r\nlr_model.fit(X_train_scaled, y_train)\r\n\r\n# \u4e88\u6e2c\r\ny_pred_proba_lr = lr_model.predict_proba(X_test_scaled)[:, 1]\r\ny_pred_lr = lr_model.predict(X_test_scaled)\r\n\r\n# \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u30e2\u30c7\u30eb\u6027\u80fd\u8a55\u4fa1\r\nprint(f\"\\\\n=== \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u30e2\u30c7\u30eb\u6027\u80fd ===\")\r\nsegment_performance = []\r\n\r\nfor segment in df['user_segment'].unique():\r\n    # \u30c6\u30b9\u30c8\u30c7\u30fc\u30bf\u3067\u305d\u306e\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u9867\u5ba2\u3092\u62bd\u51fa\r\n    segment_mask = test_segments == segment\r\n    \r\n    if segment_mask.sum() &gt; 0:  # \u30bb\u30b0\u30e1\u30f3\u30c8\u5185\u306b\u9867\u5ba2\u304c\u3044\u308b\u5834\u5408\u306e\u307f\r\n        y_true_segment = y_test[segment_mask]\r\n        y_pred_segment = y_pred_lr[segment_mask]\r\n        y_pred_proba_segment = y_pred_proba_lr[segment_mask]\r\n        \r\n        # \u6027\u80fd\u6307\u6a19\u8a08\u7b97\r\n        if len(np.unique(y_true_segment)) &gt; 1:  # \u30c1\u30e3\u30fc\u30f3\/\u975e\u30c1\u30e3\u30fc\u30f3\u306e\u4e21\u65b9\u304c\u3042\u308b\u5834\u5408\u306e\u307fAUC\u8a08\u7b97\r\n            auc = roc_auc_score(y_true_segment, y_pred_proba_segment)\r\n        else:\r\n            auc = np.nan\r\n            \r\n        precision = precision_score(y_true_segment, y_pred_segment, zero_division=0)\r\n        recall = recall_score(y_true_segment, y_pred_segment, zero_division=0)\r\n        f1 = f1_score(y_true_segment, y_pred_segment, zero_division=0)\r\n        \r\n        performance_row = {\r\n            '\u30bb\u30b0\u30e1\u30f3\u30c8': segment,\r\n            '\u30c6\u30b9\u30c8\u9867\u5ba2\u6570': segment_mask.sum(),\r\n            '\u5b9f\u969b\u306e\u30c1\u30e3\u30fc\u30f3\u7387': y_true_segment.mean(),\r\n            'Precision': precision,\r\n            'Recall': recall,\r\n            'F1-Score': f1,\r\n            'ROC-AUC': auc\r\n        }\r\n        segment_performance.append(performance_row)\r\n\r\nsegment_performance_df = pd.DataFrame(segment_performance)\r\nsegment_performance_df = segment_performance_df.round(3)\r\nsegment_performance_df\r\n<\/code><\/pre>\r\n<\/div>\r\n<pre><strong><span data-token-index=\"0\" class=\"notion-enable-hover\">\u7cbe\u5ea6\u7d50\u679c\r\n<img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/performance.png\" alt=\"\" width=\"614\" height=\"214\" class=\"alignnone size-full wp-image-7127\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/performance.png 614w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/performance-300x105.png 300w\" sizes=\"(max-width: 614px) 100vw, 614px\" \/>\r\n<\/span><\/strong><span data-token-index=\"0\" class=\"notion-enable-hover\"><\/span><\/pre>\r\n<p><span data-token-index=\"0\" class=\"notion-enable-hover\">\u6b21\u306b\u3001\u3069\u306e\u7279\u5fb4\u91cf\u304c\u5927\u304d\u304f\u5bc4\u4e0e\u3057\u3066\u3044\u308b\u304b\u3082\u8abf\u3079\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/span><strong><span data-token-index=\"0\" class=\"notion-enable-hover\"><br \/>\r\n<\/span><\/strong><\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre><code class=\"language-python\"># \u7279\u5fb4\u91cf\u91cd\u8981\u5ea6\u5206\u6790\uff08\u6a5f\u68b0\u5b66\u7fd2\u30d9\u30fc\u30b9\uff09\r\nprint(f\"\\\\n=== \u6a5f\u68b0\u5b66\u7fd2\u306b\u3088\u308b\u7279\u5fb4\u91cf\u91cd\u8981\u5ea6\u5206\u6790 ===\")\r\n\r\n# \u30ed\u30b8\u30b9\u30c6\u30a3\u30c3\u30af\u56de\u5e30\u306e\u4fc2\u6570\uff08\u7d76\u5bfe\u5024\uff09\r\nlr_coeffs = np.abs(lr_model.coef_[0])\r\nlr_importance_df = pd.DataFrame({\r\n    '\u7279\u5fb4\u91cf': feature_columns,\r\n    'LogisticRegression\u4fc2\u6570\u7d76\u5bfe\u5024': lr_coeffs\r\n}).sort_values('LogisticRegression\u4fc2\u6570\u7d76\u5bfe\u5024', ascending=False).reset_index(drop=True)\r\n\r\nlr_importance_df\r\n<\/code><\/pre>\r\n<\/div>\r\n<pre><strong>\u51fa\u529b\u7d50\u679c<\/strong><\/pre>\r\n<p><span data-token-index=\"0\" class=\"notion-enable-hover\"><img decoding=\"async\" src=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/logi.png\" alt=\"\" width=\"358\" height=\"408\" class=\"alignnone size-full wp-image-7128\" srcset=\"https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/logi.png 358w, https:\/\/since2020.jp\/media\/wp-content\/uploads\/2025\/09\/logi-263x300.png 263w\" sizes=\"(max-width: 358px) 100vw, 358px\" \/><\/span><!-- notionvc: 974370e5-a05c-4542-b148-d72f379f3bb5 --><\/p>\r\n<p>Logistic Regression\u306f\u5951\u7d04\u5f62\u614b\u30fb\u30bb\u30b0\u30e1\u30f3\u30c8\u3068\u3044\u3063\u305f\u69cb\u9020\u7684\u8981\u7d20\u3092\u91cd\u8996\u3059\u308b\u50be\u5411\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001Price-Sensitive\u30bb\u30b0\u30e1\u30f3\u30c8\u306e\u4e88\u6e2c\u7cbe\u5ea6\uff08ROC-AUC 0.481\uff09\u304c\u4f4e\u3044\u3053\u3068\u304b\u3089\u3001\u4fa1\u683c\u91cd\u8996\u9867\u5ba2\u306e\u884c\u52d5\u4e88\u6e2c\u306e\u56f0\u96e3\u3055\u3082\u78ba\u8a8d\u3055\u308c\u307e\u3057\u305f\u3002<!-- notionvc: 4fbeb9bb-469d-4f37-9927-ba36f28c0ad8 --><\/p>\n\n<h2>\u3067\u3001\u4f55\u304c\u8a00\u3048\u308b\u306e\uff1f<\/h2>\n<p>\u4eca\u307e\u3067\u3001\u3044\u308d\u3044\u308d\u306a\u5206\u6790\u3084\u30e2\u30c7\u30eb\u306e\u5b9f\u88c5\u3092\u884c\u3063\u3066\u304d\u307e\u3057\u305f\u304c\u3001\u3053\u308c\u3089\u306e\u7d50\u679c\u304b\u3089\u4ee5\u4e0b\u306e\u3053\u3068\u304c\u767a\u898b\u3055\u308c\u307e\u3057\u305f\u3002<\/p>\r\n<b>\u767a\u898b1: \u5951\u7d04\u5f62\u614b\u304c\u6700\u5f37\u306e\u4e88\u6e2c\u56e0\u5b50<\/b>\r\n<p>\u7d71\u8a08\u7684\u691c\u5b9a\u3067\u3082Logistic Regression\u3067\u3082\u3001\u5951\u7d04\u30bf\u30a4\u30d7\u304c\u6700\u3082\u91cd\u8981\u306a\u8981\u56e0\u3068\u3057\u3066\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002\u6708\u5951\u7d04\u9867\u5ba2\u306f\u5e74\u5951\u7d04\u9867\u5ba2\u306e2.3\u500d\u96e2\u8131\u3057\u3084\u3059\u304f\u3001\u3053\u308c\u306f\u5951\u7d04\u306b\u3088\u308b\u5fc3\u7406\u7684\u30b3\u30df\u30c3\u30c8\u30e1\u30f3\u30c8\u306e\u5dee\u3092\u793a\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<b>\u767a\u898b2: \u4fa1\u683c\u91cd\u8996\u9867\u5ba2\u306e\u5371\u967a\u6027<\/b>\r\n<p>Price-Sensitive\u30bb\u30b0\u30e1\u30f3\u30c8\u306f\u7d71\u8a08\u7684\u306b\u6709\u610f\u306b\u9ad8\u3044\u96e2\u8131\u7387\uff0858.2%\uff09\u3092\u793a\u3057\u307e\u3057\u305f\u3002\u3053\u308c\u306f\u300c\u4fa1\u683c\u3067\u7372\u5f97\u3057\u305f\u9867\u5ba2\u306f\u4fa1\u683c\u3067\u5931\u3046\u300d\u3068\u3044\u3046\u53e4\u5178\u7684\u306a\u30de\u30fc\u30b1\u30c6\u30a3\u30f3\u30b0\u539f\u5247\u306e\u5b9f\u8a3c\u3067\u3059\u3002<\/p>\r\n<b>\u767a\u898b3: \u4ed8\u52a0\u30b5\u30fc\u30d3\u30b9\u306e\u96e2\u8131\u6291\u5236\u52b9\u679c<\/b>\r\n<p>\u30aa\u30f3\u30e9\u30a4\u30f3\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5229\u7528\u9867\u5ba2\u306e\u96e2\u8131\u7387\u304c\u6709\u610f\u306b\u4f4e\u3044\u7d50\u679c\u306f\u3001\u4ed8\u52a0\u30b5\u30fc\u30d3\u30b9\u306b\u3088\u308b\u30ed\u30c3\u30af\u30a4\u30f3\u52b9\u679c\u3092\u793a\u5506\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<p><!-- notionvc: 76a424fa-8765-48ae-a72d-6ed63e620174 --><\/p>\n\n<h2>\u7d50\u5c40\u3001\u4f55\u3092\u63d0\u6848\u3059\u308c\u3070\u3044\u3044\u306e\uff1f<\/h2>\n<p>\u5206\u6790\u7d50\u679c\u3092\u8e0f\u307e\u3048\u3001\u5177\u4f53\u7684\u306a\u30a2\u30af\u30b7\u30e7\u30f3\u30d7\u30e9\u30f3\u3092\u4ee5\u4e0b\u306b\u793a\u3059\u3088\u3046\u306b\u63d0\u6848\u3057\u307e\u3059\uff1a<\/p>\r\n<b><strong>Price-Sensitive\u30bb\u30b0\u30e1\u30f3\u30c8\u3078\u306e\u7dca\u6025\u5bfe\u5fdc<\/strong><\/b>\r\n<ul>\r\n\t<li>\u9577\u671f\u5951\u7d04\u3078\u306e\u79fb\u884c\u30a4\u30f3\u30bb\u30f3\u30c6\u30a3\u30d6\u63d0\u4f9b\uff08\u4f8b\uff1a1\u5e74\u5951\u7d04\u3067\u6708\u984d10%\u5272\u5f15\uff09<\/li>\r\n\t<li>\u4fa1\u5024\u63d0\u6848\u306e\u518d\u69cb\u7bc9\uff08\u5b89\u3055\u4ee5\u5916\u306e\u30e1\u30ea\u30c3\u30c8\u8a34\u6c42\uff09<\/li>\r\n\t<li>\u7af6\u5408\u5bfe\u6297\u7b56\u306e\u6e96\u5099<\/li>\r\n<\/ul>\r\n<b><strong>\u65b0\u898f\u9867\u5ba2\u306e\u30aa\u30f3\u30dc\u30fc\u30c7\u30a3\u30f3\u30b0\u5f37\u5316<\/strong><\/b>\r\n<ul>\r\n\t<li>\u5165\u4f1a\u5f8c30\u65e5\u300160\u65e5\u300190\u65e5\u306e\u6bb5\u968e\u7684\u30d5\u30a9\u30ed\u30fc\u30a2\u30c3\u30d7<\/li>\r\n\t<li>\u65e9\u671f\u30a8\u30f3\u30b2\u30fc\u30b8\u30e1\u30f3\u30c8\u65bd\u7b56\uff08\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u3001\u30b5\u30dd\u30fc\u30c8\u96fb\u8a71\u306a\u3069\uff09<\/li>\r\n\t<li>\u521d\u56de\u5229\u7528\u4f53\u9a13\u306e\u6539\u5584<\/li>\r\n<\/ul>\r\n<b><strong>\u5951\u7d04\u5f62\u614b\u306e\u6539\u5584<\/strong><\/b>\r\n<ul>\r\n\t<li>\u6708\u5951\u7d04\u304b\u3089\u5e74\u5951\u7d04\u3078\u306e\u79fb\u884c\u4fc3\u9032\u30ad\u30e3\u30f3\u30da\u30fc\u30f3<\/li>\r\n\t<li>\u5e74\u5951\u7d04\u306e\u7279\u5178\u62e1\u5145<\/li>\r\n\t<li>\u5951\u7d04\u66f4\u65b0\u6642\u306e\u81ea\u52d5\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u65bd\u7b56<\/li>\r\n<\/ul>\r\n<b>MA\u30c4\u30fc\u30eb\u3092\u6d3b\u7528\u3057\u305f\u81ea\u52d5\u5316\u65bd\u7b56<\/b>\r\n<p>\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u306e\u7d50\u679c\u3092MA\u30c4\u30fc\u30eb\uff08Marketing Automation\uff09\u306b\u9023\u643a\u3059\u308b\u3053\u3068\u3067\u3001\u52b9\u7387\u7684\u306a\u9867\u5ba2\u7dad\u6301\u65bd\u7b56\u3092\u5b9f\u73fe\u3067\u304d\u307e\u3059\uff1a<\/p>\r\n<div class=\"hcb_wrap\">\r\n<pre><code class=\"language-python\"># MA\u30c4\u30fc\u30eb\u9023\u643a\u306e\u305f\u3081\u306e\u30ea\u30b9\u30af\u9867\u5ba2\u30c7\u30fc\u30bf\u51fa\u529b\r\ndef export_for_ma_tool(model, customer_data, customer_info):\r\n    \"\"\"\r\n    MA\u30c4\u30fc\u30eb\u5411\u3051\u306e\u9ad8\u30ea\u30b9\u30af\u9867\u5ba2\u30ea\u30b9\u30c8\u751f\u6210\r\n    \"\"\"\r\n    risk_scores = model.predict_proba(customer_data)[:, 1]\r\n\r\n    ma_export = pd.DataFrame({\r\n        'customer_id': customer_info['customer_id'],\r\n        'email': customer_info['email'],  # \u5b9f\u969b\u306e\u30c7\u30fc\u30bf\u3067\u306f\u9867\u5ba2\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\r\n        'segment': customer_info['user_segment'],\r\n        'churn_probability': risk_scores,\r\n        'risk_level': ['High' if score &gt; 0.7 else 'Medium' if score &gt; 0.3 else 'Low'\r\n                      for score in risk_scores],\r\n        'recommended_action': [\r\n            'immediate_retention_call' if score &gt; 0.7 else\r\n            'targeted_email_campaign' if score &gt; 0.3 else\r\n            'standard_nurture'\r\n            for score in risk_scores\r\n        ]\r\n    })\r\n\r\n    return ma_export\r\n\r\n# \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u81ea\u52d5\u30ad\u30e3\u30f3\u30da\u30fc\u30f3\u306e\u30c8\u30ea\u30ac\u30fc\u8a2d\u5b9a\u4f8b\r\ncampaign_triggers = {\r\n    'Price-Sensitive': {\r\n        'trigger': 'churn_probability &gt; 0.5',\r\n        'action': '\u9577\u671f\u5951\u7d04\u30aa\u30d5\u30a1\u30fc\u30e1\u30fc\u30eb\u914d\u4fe1',\r\n        'timing': '\u5373\u5ea7'\r\n    },\r\n    'New Customer': {\r\n        'trigger': 'tenure &lt; 90 AND churn_probability &gt; 0.4',\r\n        'action': '\u30aa\u30f3\u30dc\u30fc\u30c7\u30a3\u30f3\u30b0\u5f37\u5316\u30b7\u30fc\u30b1\u30f3\u30b9',\r\n        'timing': '7\u65e5\u4ee5\u5185'\r\n    },\r\n    'Standard': {\r\n        'trigger': 'churn_probability &gt; 0.6',\r\n        'action': '\u30ab\u30b9\u30bf\u30de\u30fc\u30b5\u30af\u30bb\u30b9\u62c5\u5f53\u306b\u3088\u308b\u96fb\u8a71\u30d5\u30a9\u30ed\u30fc',\r\n        'timing': '3\u65e5\u4ee5\u5185'\r\n    }\r\n}<\/code><\/pre>\r\n<\/div>\r\n<pre><strong>\u5177\u4f53\u7684\u306aMA\u9023\u643a\u65bd\u7b56<\/strong><\/pre>\r\n<ol>\r\n\t<li><strong>\u81ea\u52d5\u30bb\u30b0\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3<\/strong>: \u4e88\u6e2c\u7d50\u679c\u306b\u57fa\u3065\u3044\u3066\u9867\u5ba2\u3092\u81ea\u52d5\u7684\u306b\u30ea\u30b9\u30af\u30ec\u30d9\u30eb\u5225\u306b\u30bf\u30b0\u4ed8\u3051<\/li>\r\n\t<li><strong>\u30c8\u30ea\u30ac\u30fc\u30d9\u30fc\u30b9\u65bd\u7b56<\/strong>: \u30c1\u30e3\u30fc\u30f3\u78ba\u7387\u304c\u95be\u5024\u3092\u8d85\u3048\u305f\u9867\u5ba2\u306b\u81ea\u52d5\u7684\u306b\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u65bd\u7b56\u3092\u5b9f\u884c<\/li>\r\n\t<li><strong>\u30d1\u30fc\u30bd\u30ca\u30e9\u30a4\u30ba\u30c9\u914d\u4fe1<\/strong>: \u30bb\u30b0\u30e1\u30f3\u30c8\u5225\u306b\u6700\u9069\u5316\u3055\u308c\u305f\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u81ea\u52d5\u914d\u4fe1<\/li>\r\n\t<li><strong>\u52b9\u679c\u6e2c\u5b9a<\/strong>: A\/B\u30c6\u30b9\u30c8\u306b\u3088\u308b\u65bd\u7b56\u52b9\u679c\u306e\u7d99\u7d9a\u7684\u6539\u5584<\/li>\r\n<\/ol>\r\n<p>\u4f8b\u3048\u3070\u3001Braze\u3084HubSpot\u3001Salesforce Marketing Cloud\u306a\u3069\u306e\u30c4\u30fc\u30eb\u306b\u4e88\u6e2c\u7d50\u679c\u3092\u9023\u643a\u3057\u3001\u4ee5\u4e0b\u306e\u3088\u3046\u306a\u81ea\u52d5\u5316\u3092\u5b9f\u73fe\uff1a<\/p>\r\n<ul>\r\n\t<li><strong>Price-Sensitive\u30bb\u30b0\u30e1\u30f3\u30c8<\/strong>: \u30c1\u30e3\u30fc\u30f3\u78ba\u738750%\u8d85\u3067\u9577\u671f\u5951\u7d04\u5272\u5f15\u30aa\u30d5\u30a1\u30fc\u3092\u81ea\u52d5\u914d\u4fe1<\/li>\r\n\t<li><strong>New Customer\u30bb\u30b0\u30e1\u30f3\u30c8<\/strong>: \u5728\u7c4d90\u65e5\u672a\u6e80\u304b\u3064\u30c1\u30e3\u30fc\u30f3\u78ba\u738740%\u8d85\u3067\u30aa\u30f3\u30dc\u30fc\u30c7\u30a3\u30f3\u30b0\u5f37\u5316\u30e1\u30fc\u30eb\u30b7\u30fc\u30b1\u30f3\u30b9\u3092\u81ea\u52d5\u958b\u59cb<\/li>\r\n\t<li><strong>\u9ad8\u30ea\u30b9\u30af\u9867\u5ba2\u5168\u822c<\/strong>: \u30c1\u30e3\u30fc\u30f3\u78ba\u738770%\u8d85\u3067\u30ab\u30b9\u30bf\u30de\u30fc\u30b5\u30af\u30bb\u30b9\u62c5\u5f53\u306b\u81ea\u52d5\u30a2\u30e9\u30fc\u30c8\u3092\u9001\u4fe1<\/li>\r\n<\/ul>\r\n<p><!-- notionvc: 278bd67d-680e-4524-945e-934d933edf14 --><\/p>\r\n<p><!-- notionvc: 85699e48-f758-4c8f-8f8c-d2277620face --><\/p>\n\n<h2>\u307e\u3068\u3081<\/h2>\n<p>\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u306f\u5358\u306a\u308b\u300c\u96e2\u8131\u3057\u305d\u3046\u306a\u9867\u5ba2\u3092\u898b\u3064\u3051\u308b\u30c4\u30fc\u30eb\u300d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u305d\u308c\u306f\u4f01\u696d\u304c\u6301\u3064\u9867\u5ba2\u3068\u306e\u95a2\u4fc2\u6027\u3092\u6570\u5024\u5316\u3057\u3001\u30d3\u30b8\u30cd\u30b9\u6226\u7565\u306e\u610f\u601d\u6c7a\u5b9a\u3092\u652f\u3048\u308b\u91cd\u8981\u306a\u7f85\u91dd\u76e4\u3067\u3059\u3002<\/p>\r\n<p>\u91cd\u8981\u306a\u306e\u306f\u3001\u7d44\u7e54\u5168\u4f53\u3067\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u306e\u7d50\u679c\u3092\u300c\u660e\u65e5\u306e\u884c\u52d5\u300d\u306b\u5909\u3048\u308b\u4ed5\u7d44\u307f\u3092\u4f5c\u308b\u3053\u3068\u3067\u3059\u3002\u30de\u30fc\u30b1\u30c6\u30a3\u30f3\u30b0\u90e8\u9580\u3001\u30ab\u30b9\u30bf\u30de\u30fc\u30b5\u30af\u30bb\u30b9\u90e8\u9580\u3001\u305d\u3057\u3066\u7d4c\u55b6\u9663\u304c\u4e00\u4f53\u3068\u306a\u3063\u3066\u3001\u9867\u5ba2\u4e00\u4eba\u3072\u3068\u308a\u306b\u6700\u9069\u306a\u30bf\u30a4\u30df\u30f3\u30b0\u3067\u6700\u9069\u306a\u30a2\u30d7\u30ed\u30fc\u30c1\u3092\u5c4a\u3051\u308b\u3002\u3053\u308c\u3053\u305d\u304c\u3001\u30c7\u30fc\u30bf\u30c9\u30ea\u30d6\u30f3\u306a\u30ab\u30b9\u30bf\u30de\u30fc\u30a8\u30af\u30b9\u30da\u30ea\u30a8\u30f3\u30b9\u306e\u771f\u9ac4\u3060\u3068\u8003\u3048\u3066\u3044\u307e\u3059\u3002<\/p>\r\n<p>\u3042\u306a\u305f\u306e\u4f1a\u793e\u3067\u3082\u3001\u660e\u65e5\u304b\u3089\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u3092\u300c\u4f5c\u3063\u3066\u7d42\u308f\u308a\u300d\u3067\u306f\u306a\u304f\u3001\u300c\u4f7f\u3044\u5012\u3059\u305f\u3081\u306e\u30c4\u30fc\u30eb\u300d\u3068\u3057\u3066\u4f4d\u7f6e\u3065\u3051\u3066\u307f\u3066\u304f\u3060\u3055\u3044\u3002\u304d\u3063\u3068\u3001\u9867\u5ba2\u3068\u306e\u95a2\u4fc2\u6027\u306b\u5bfe\u3059\u308b\u65b0\u3057\u3044\u8996\u70b9\u304c\u751f\u307e\u308c\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\r\n<p><!-- notionvc: addef67c-175d-4fc7-91ef-9b83a2089e76 --><\/p>","protected":false},"excerpt":{"rendered":"<p>\u30b5\u30d6\u30b9\u30af\u30ea\u30d7\u30b7\u30e7\u30f3\u30d3\u30b8\u30cd\u30b9\u306b\u304a\u3044\u3066\u3001\u9867\u5ba2\u306e\u96e2\u8131\u3092\u4e8b\u524d\u306b\u4e88\u6e2c\u3067\u304d\u308c\u3070\u3069\u308c\u307b\u3069\u5fc3\u5f37\u3044\u3067\u3057\u3087\u3046\u304b\u3002\u4eca\u56de\u306f1000\u540d\u306e\u9867\u5ba2\u30c7\u30fc\u30bf\u3092\u7528\u3044\u3066\u3001\u7d71\u8a08\u7684\u691c\u5b9a\u3068\u6a5f\u68b0\u5b66\u7fd2\u306e\u4e21\u65b9\u306e\u30a2\u30d7\u30ed\u30fc\u30c1\u3067\u30c1\u30e3\u30fc\u30f3\u4e88\u6e2c\u30e2\u30c7\u30eb\u3092\u69cb\u7bc9\u3057\u307e\u3057\u305f\u3002\u5358\u306a\u308b\u6280\u8853\u89e3\u8aac\u3067 [&hellip;]<\/p>\n","protected":false},"author":89,"featured_media":5528,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"content-type":"","swell_btn_cv_data":"","footnotes":"","_wp_rev_ctl_limit":""},"categories":[1246],"tags":[331,484,419],"class_list":["post-7123","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-data-infrastructure","tag-python","tag-484","tag-419"],"_links":{"self":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts\/7123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/users\/89"}],"replies":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/comments?post=7123"}],"version-history":[{"count":0,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/posts\/7123\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/media\/5528"}],"wp:attachment":[{"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/media?parent=7123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/categories?post=7123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/since2020.jp\/media\/wp-json\/wp\/v2\/tags?post=7123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}