<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>高校生向けのやさしい解説 | 数式なしで学ぶ機械学習 on K_DM Book</title><link>https://k-dm.work/audiences/highschool/</link><description>Recent content in 高校生向けのやさしい解説 | 数式なしで学ぶ機械学習 on K_DM Book</description><generator>Hugo</generator><language>ja</language><atom:link href="https://k-dm.work/audiences/highschool/index.xml" rel="self" type="application/rss+xml"/><item><title>ヒストグラムの読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/distribution/histogram_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:50 +0900</pubDate><guid>https://k-dm.work/visualize/distribution/histogram_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ヒストグラムは、数値データを&lt;strong&gt;同じ幅の区間（階級）に分けて数え&lt;/strong&gt;、度数を棒の高さで表した図です。棒の間に隙間がないのは、横軸が切れ目なくつながった数値だからです。答える問いは「値はどこに集まり、どのくらい散らばり、形はどうか」で、山が 1 つか 2 つか、左右対称かゆがんでいるか、離れた値はないかを読みます。階級の幅を変えると同じデータでも印象が変わるので幅を 2〜3 通り試すのが基本で、平均は山の重心のあたり、標準偏差は山の横幅として図に現れます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;学年 150 人の 50 m 走の記録が手元にあるとします。「平均 8.2 秒」と言われても、全員が 8 秒前後なのか、6 秒台の速い人と 10 秒台の人に分かれているのかは分かりません。知りたいのは、150 人分の&lt;strong&gt;値の散らばり方の形&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、アヤメの花 150 個の「がく片の長さ」を 0.5 cm 刻みで数えたヒストグラムです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/distribution/ja/histogram-block01-fig01.png"
 alt="アヤメ 150 個のがく片の長さを 0.5 cm 幅の階級に分けて度数を棒にしたヒストグラム。5〜6 cm 付近の棒が高く山になり、左右に向かって低くなっていく"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;4.3 cm から 7.9 cm の間に値が広がり、5〜6 cm 付近に山があります。この図を見れば「だいたい 5〜6 cm、まれに 7.5 cm 以上もある」と、平均だけでは分からない全体像が一瞬でつかめます。&lt;/p&gt;
&lt;h2 id="棒はこう作る"&gt;
 棒はこう作る
 
 &lt;a class="anchor" href="#%e6%a3%92%e3%81%af%e3%81%93%e3%81%86%e4%bd%9c%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、最小値 4.3 cm と最大値 7.9 cm を確かめて階級の幅を決めます。4.3〜7.9 cm なら幅 0.5 cm で 8 個ほどの階級になり、幅はすべて同じにします。次に、各階級に入る値を数えます。4.0 以上 4.5 未満は何個、4.5 以上 5.0 未満は何個……と数えたものが度数分布表で、数学I で作ったものと同じです。それから、8 個の階級を横軸に並べて度数の高さの棒を隙間なく立てます。横軸は連続した数値なので棒と棒はぴったりくっつき、この点が、カテゴリごとに離して描く棒グラフとの見分け方です。最後に形を読みます。山の頂上（最頻の階級、この図では 5.5〜6.0 cm）、山の幅、左右の裾の長さ、本体から離れた小さな棒（外れ値の候補）を順に見ます。&lt;/p&gt;
&lt;p&gt;階級の幅を 0.5 cm から変えると図はどう変わるでしょう。幅を 0.1 cm にすると棒が 36 本に増え、度数が 2〜3 の階級がギザギザに並び、山の形が見えにくくなります。逆に幅を 2 cm にすると棒は 2 本だけになり、「5〜6 cm に山がある」という情報が消えます。データ自体が変わった場合も考えてみましょう。150 個を別の品種だけに差し替えれば山の位置が右や左にずれ、2 つの品種が混ざっていれば山が 2 つに割れることがあります。「山が 2 つ」は、データの中に異なるグループが混ざっているサインです。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-hist-0" data-viz-type="steps" data-steps-kind="hist" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"bars":[[0,2.5,8,0],[2.5,5,82,0],[5,7.5,56,0],[7.5,10,34,0]],"caption":"階級数 4：同じデータでも階級の幅で見え方が変わる。少なすぎると山が消え、多すぎるとぎざぎざになる。","metrics":{"bins":4},"y_range":[0,94.3]},{"bars":[[0,1.25,1,0],[1.25,2.5,7,0],[2.5,3.75,34,0],[3.75,5,48,0],[5,6.25,29,0],[6.25,7.5,27,0],[7.5,8.75,32,0],[8.75,10,2,0]],"caption":"階級数 8：同じデータでも階級の幅で見え方が変わる。少なすぎると山が消え、多すぎるとぎざぎざになる。","metrics":{"bins":8},"y_range":[0,55.199999999999996]},{"bars":[[0,0.62,0,0],[0.62,1.25,1,0],[1.25,1.88,3,0],[1.88,2.5,4,0],[2.5,3.12,15,0],[3.12,3.75,19,0],[3.75,4.38,27,0],[4.38,5,21,0],[5,5.62,17,0],[5.62,6.25,12,0],[6.25,6.88,9,0],[6.88,7.5,18,0],[7.5,8.12,24,0],[8.12,8.75,8,0],[8.75,9.38,2,0],[9.38,10,0,0]],"caption":"階級数 16：同じデータでも階級の幅で見え方が変わる。少なすぎると山が消え、多すぎるとぎざぎざになる。","metrics":{"bins":16},"y_range":[0,31.049999999999997]},{"bars":[[0,0.25,0,0],[0.25,0.5,0,0],[0.5,0.75,0,0],[0.75,1,0,0],[1,1.25,1,0],[1.25,1.5,1,0],[1.5,1.75,2,0],[1.75,2,0,0],[2,2.25,2,0],[2.25,2.5,2,0],[2.5,2.75,2,0],[2.75,3,10,0],[3,3.25,7,0],[3.25,3.5,7,0],[3.5,3.75,8,0],[3.75,4,6,0],[4,4.25,10,0],[4.25,4.5,16,0],[4.5,4.75,9,0],[4.75,5,7,0],[5,5.25,9,0],[5.25,5.5,6,0],[5.5,5.75,5,0],[5.75,6,6,0],[6,6.25,3,0],[6.25,6.5,4,0],[6.5,6.75,4,0],[6.75,7,3,0],[7,7.25,9,0],[7.25,7.5,7,0],[7.5,7.75,9,0],[7.75,8,11,0],[8,8.25,6,0],[8.25,8.5,3,0],[8.5,8.75,3,0],[8.75,9,1,0],[9,9.25,1,0],[9.25,9.5,0,0],[9.5,9.75,0,0],[9.75,10,0,0]],"caption":"階級数 40：同じデータでも階級の幅で見え方が変わる。少なすぎると山が消え、多すぎるとぎざぎざになる。","metrics":{"bins":40},"y_range":[0,18.4]}],"x_range":[0,10],"y_range":[0,60]};
 var id = 'viz-steps-hist-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で学ぶ度数分布表・ヒストグラム・階級値がそのまま登場します。平均値は山の「重心」の位置に、標準偏差は山の「横幅」として図に見えるので、数値と図を往復しながら読むと、分散・標準偏差が「散らばりの大きさ」だと実感できます。情報I「データの活用」の「データの可視化」では、分布を最初に確認する図として扱います。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;いちばん多い失敗は、階級の幅が 0.1 cm や 2 cm のように極端なことです。狭すぎると偶然の凸凹が目立ち、広すぎると形が潰れるので、幅を 2〜3 通り描いて、変わらずに見える特徴だけを信じます。二つ目は、データ数の違う 2 つを度数のまま重ねること。150 個と 30 個のヒストグラムを重ねると多いほうが必ず高く見えるので、比べるときは相対度数（度数 ÷ 全体）にそろえます。三つ目は幅のそろわない階級です。「0〜10、10〜20、20〜50」のように幅を変えると広い階級の棒だけ高くなって形がゆがむので、幅は必ず一定にします。&lt;/p&gt;</description></item><item><title>散布図の読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/scatter/scatter-basic_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:50 +0900</pubDate><guid>https://k-dm.work/visualize/scatter/scatter-basic_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;散布図は、1 人（1 件）のデータの 2 つの量を&lt;strong&gt;横と縦の座標にして 1 つの点&lt;/strong&gt;で表した図で、点の集まりの形から「2 つの量は一緒に動くか」を読みます。右上がりの細い帯なら強い正の相関、右下がりなら負の相関、丸い雲なら相関なしで、帯の細さが相関係数 \(r\) の大きさに対応します。直線に乗らない曲がった形や、ひとつだけ離れた点（外れ値）も、散布図だからこそ見つけられます。ただし相関があっても「一方が原因」とは限りません。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラス 40 人の「1 日の勉強時間」と「テストの点」を集めたとします。表を眺めても関係はつかめません。でも、横軸に勉強時間、縦軸に点数をとって 40 個の点を打てば、「右上がりに並んでいる」「でも 1 人だけ勉強時間が長いのに低い」といったことが浮かび上がります。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、120 人分の身長と体重を点にしたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/scatter/ja/scatter-basic-block01-fig01.png"
 alt="120 人分の身長（横軸）と体重（縦軸）を 1 人 1 点で打った散布図。点は右上がりの帯になって並び、身長が高いほど体重も重い傾向が見える"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;点は右上がりの帯を作っています。「身長が高い人ほど体重も重い傾向がある」。ただし帯には幅があり、同じ身長でも体重には 10 kg 以上の差があります。散布図が答える問いは &lt;strong&gt;「2 つの量は一緒に動くか、どのくらい強く、どんな形で」&lt;/strong&gt; です。&lt;/p&gt;
&lt;h2 id="点はこう打ちこう読む"&gt;
 点はこう打ち、こう読む
 
 &lt;a class="anchor" href="#%e7%82%b9%e3%81%af%e3%81%93%e3%81%86%e6%89%93%e3%81%a1%e3%81%93%e3%81%86%e8%aa%ad%e3%82%80"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず横軸と縦軸に量を割り当てます。「原因になりそうなほう」を横軸に置く習慣があり、身長→体重、勉強時間→点数の順です。次に 1 件のデータを 1 つの点にします。身長 170 cm・体重 65 kg の人は横 170・縦 65 の位置に 1 点で、120 人なら 120 点です。続いて帯の向きと細さを見ます。右上がりなら「正の相関」、右下がりなら「負の相関」で、帯が細いほど相関は強く、丸く広がるほど弱くなります。最後に形と外れ値を見ます。帯が曲がっていれば直線ではない関係で、本体から離れた点があれば入力ミスか特別な事例かを確かめます。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。相関係数が 0.9 のデータでは、点は 1 本の直線のすぐそばに細い帯として並び、横の値を知れば縦の値をかなり正確に言い当てられます。相関係数が 0.2 なら、帯はほとんど丸い雲になり、右上がりの傾向は「かすかに」しか見えません。相関係数が −0.9 なら、同じ細い帯が右下がりに向きを変えるだけで、細さは 0.9 のときと同じです。つまり \(r\) の&lt;strong&gt;符号は帯の向き、絶対値は帯の細さ&lt;/strong&gt;として図に現れます。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-corr-0" data-viz-type="steps" data-steps-kind="corr" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"r = -0.9：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":-0.9},"points":[[7.4,3.1,-1],[6.1,4.62,-1],[3.66,5.12,-1],[3.2,6.86,-1],[6.69,3.57,-1],[2.82,7.94,-1],[2.43,6.97,-1],[4.09,6,-1],[6.76,2.38,-1],[4.49,5.68,-1],[3.13,6.62,-1],[5.3,3.8,-1],[2.91,6.84,-1],[4.64,5.48,-1],[8.54,2.44,-1],[5.71,3.86,-1],[6.49,3.11,-1],[7.51,3.57,-1],[1.79,7.07,-1],[4.69,5,-1],[2.98,5.96,-1],[6.16,3.59,-1],[2.55,7.01,-1],[6.55,4.78,-1],[5.1,4.69,-1],[3.71,5.8,-1],[5.85,5.11,-1],[6.99,3.04,-1],[6.42,4.26,-1],[5.73,2.64,-1],[4.9,4.89,-1],[7.12,2.89,-1],[5.72,4.53,-1],[7.03,3.71,-1],[6.65,4.56,-1],[6.53,4.16,-1],[4.58,5.44,-1],[8.46,1.91,-1],[5.82,4.21,-1],[4.53,3.33,-1],[7.74,1.71,-1],[3.67,7.14,-1],[1.23,8.41,-1],[4.1,4.52,-1],[5.99,3.58,-1],[4.83,4.85,-1],[6.02,5.65,-1],[2.99,7.41,-1],[3.9,5.75,-1],[1.98,6.93,-1],[4.31,6.19,-1],[5.39,5.05,-1],[6.17,2.98,-1],[7.32,2.68,-1],[6.1,3.89,-1],[5.43,5.07,-1],[1.4,9.65,-1],[5.28,5.51,-1],[5.35,4.75,-1],[2.89,6.63,-1]]},{"caption":"r = -0.46：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":-0.46},"points":[[7.4,4.31,-1],[6.1,5.66,-1],[3.66,3.5,-1],[3.2,6.37,-1],[6.69,4.33,-1],[2.82,8.04,-1],[2.43,5.61,-1],[4.09,5.8,-1],[6.76,2.05,-1],[4.49,5.69,-1],[3.13,5.81,-1],[5.3,3,-1],[2.91,5.97,-1],[4.64,5.49,-1],[8.54,4.47,-1],[5.71,3.66,-1],[6.49,3.17,-1],[7.51,5.39,-1],[1.79,4.98,-1],[4.69,4.6,-1],[2.98,4.31,-1],[6.16,3.68,-1],[2.55,5.83,-1],[6.55,6.56,-1],[5.1,4.51,-1],[3.71,4.92,-1],[5.85,6.31,-1],[6.99,3.67,-1],[6.42,5.35,-1],[5.73,1.24,-1],[4.9,4.66,-1],[7.12,3.55,-1],[5.72,5,-1],[7.03,5.04,-1],[6.65,6.25,-1],[6.53,5.32,-1],[4.58,5.34,-1],[8.46,3.32,-1],[5.82,4.49,-1],[4.53,1.08,-1],[7.74,1.99,-1],[3.67,7.54,-1],[1.23,6.92,-1],[4.1,2.89,-1],[5.99,3.44,-1],[4.83,4.49,-1],[6.02,7.62,-1],[2.99,7.19,-1],[3.9,5.06,-1],[1.98,4.93,-1],[4.31,6.48,-1],[5.39,5.6,-1],[6.17,2.5,-1],[7.32,3.39,-1],[6.1,4.2,-1],[5.43,5.68,-1],[1.4,9.59,-1],[5.28,6.38,-1],[5.35,4.95,-1],[2.89,5.52,-1]]},{"caption":"r = 0.1：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.1},"points":[[7.4,5.59,-1],[6.1,6.4,-1],[3.66,2.5,-1],[3.2,5.54,-1],[6.69,5.2,-1],[2.82,7.25,-1],[2.43,4.22,-1],[4.09,5.4,-1],[6.76,2.61,-1],[4.49,5.5,-1],[3.13,4.85,-1],[5.3,2.86,-1],[2.91,4.91,-1],[4.64,5.35,-1],[8.54,6.43,-1],[5.71,3.86,-1],[6.49,3.75,-1],[7.51,6.9,-1],[1.79,3.12,-1],[4.69,4.36,-1],[2.98,3.04,-1],[6.16,4.15,-1],[2.55,4.55,-1],[6.55,7.69,-1],[5.1,4.5,-1],[3.71,4.17,-1],[5.85,7.01,-1],[6.99,4.61,-1],[6.42,6.22,-1],[5.73,1.08,-1],[4.9,4.55,-1],[7.12,4.55,-1],[5.72,5.42,-1],[7.03,6.22,-1],[6.65,7.39,-1],[6.53,6.25,-1],[4.58,5.16,-1],[8.46,5.05,-1],[5.82,4.88,-1],[4.53,0.21,-1],[7.74,3.11,-1],[3.67,7.17,-1],[1.23,5.04,-1],[4.1,2.05,-1],[5.99,3.77,-1],[4.83,4.31,-1],[6.02,8.62,-1],[2.99,6.37,-1],[3.9,4.43,-1],[1.98,3.18,-1],[4.31,6.31,-1],[5.39,5.92,-1],[6.17,2.79,-1],[7.32,4.48,-1],[6.1,4.71,-1],[5.43,6.03,-1],[1.4,8.22,-1],[5.28,6.75,-1],[5.35,5.14,-1],[2.89,4.37,-1]]},{"caption":"r = 0.58：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.58},"points":[[7.4,6.71,-1],[6.1,6.76,-1],[3.66,2.16,-1],[3.2,4.57,-1],[6.69,6.02,-1],[2.82,5.86,-1],[2.43,3.04,-1],[4.09,4.89,-1],[6.76,3.81,-1],[4.49,5.18,-1],[3.13,3.94,-1],[5.3,3.3,-1],[2.91,3.88,-1],[4.64,5.13,-1],[8.54,8.01,-1],[5.71,4.37,-1],[6.49,4.66,-1],[7.51,7.9,-1],[1.79,1.77,-1],[4.69,4.29,-1],[2.98,2.29,-1],[6.16,4.84,-1],[2.55,3.39,-1],[6.55,8.11,-1],[5.1,4.61,-1],[3.71,3.64,-1],[5.85,7.16,-1],[6.99,5.66,-1],[6.42,6.77,-1],[5.73,1.97,-1],[4.9,4.56,-1],[7.12,5.67,-1],[5.72,5.72,-1],[7.03,7.07,-1],[6.65,7.9,-1],[6.53,6.85,-1],[4.58,4.93,-1],[8.46,6.78,-1],[5.82,5.3,-1],[4.53,0.62,-1],[7.74,4.73,-1],[3.67,6.21,-1],[1.23,3.16,-1],[4.1,2,-1],[5.99,4.42,-1],[4.83,4.32,-1],[6.02,8.64,-1],[2.99,5.18,-1],[3.9,3.96,-1],[1.98,1.91,-1],[4.31,5.79,-1],[5.39,5.99,-1],[6.17,3.67,-1],[7.32,5.71,-1],[6.1,5.3,-1],[5.43,6.11,-1],[1.4,5.99,-1],[5.28,6.65,-1],[5.35,5.3,-1],[2.89,3.4,-1]]},{"caption":"r = 0.92：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.92},"points":[[7.4,7.42,-1],[6.1,6.6,-1],[3.66,2.7,-1],[3.2,3.62,-1],[6.69,6.61,-1],[2.82,4.02,-1],[2.43,2.35,-1],[4.09,4.35,-1],[6.76,5.54,-1],[4.49,4.76,-1],[3.13,3.26,-1],[5.3,4.34,-1],[2.91,3.08,-1],[4.64,4.83,-1],[8.54,8.81,-1],[5.71,5.15,-1],[6.49,5.79,-1],[7.51,8.09,-1],[1.79,1.29,-1],[4.69,4.44,-1],[2.98,2.33,-1],[6.16,5.67,-1],[2.55,2.6,-1],[6.55,7.57,-1],[5.1,4.87,-1],[3.71,3.48,-1],[5.85,6.64,-1],[6.99,6.62,-1],[6.42,6.81,-1],[5.73,3.94,-1],[4.9,4.71,-1],[7.12,6.71,-1],[5.72,5.83,-1],[7.03,7.36,-1],[6.65,7.52,-1],[6.53,6.93,-1],[4.58,4.69,-1],[8.46,8.14,-1],[5.82,5.68,-1],[4.53,2.49,-1],[7.74,6.64,-1],[3.67,4.75,-1],[1.23,1.63,-1],[4.1,2.91,-1],[5.99,5.35,-1],[4.83,4.55,-1],[6.02,7.5,-1],[2.99,3.79,-1],[3.9,3.76,-1],[1.98,1.48,-1],[4.31,4.95,-1],[5.39,5.76,-1],[6.17,5.09,-1],[7.32,6.87,-1],[6.1,5.86,-1],[5.43,5.83,-1],[1.4,3.16,-1],[5.28,6.01,-1],[5.35,5.37,-1],[2.89,2.82,-1]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-corr-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」の散布図と相関係数そのものです。相関係数 \(r\) は共分散を \(x\) と \(y\) の標準偏差の積で割った値で、「点が直線にどれだけ近く並ぶか」を −1〜1 で表します。この図を見ながら「\(r\) がいくつに見えるか」を当てる練習をすると、数式の意味が体で分かります。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の課題は、相関と因果の混同です。「アイスの売上」と「水の事故」は正の相関がありますが、どちらかが原因ではなく「気温」という第三の量が両方を動かしています。散布図は関係の有無を示すだけです。二つ目は軸の範囲で、縦軸を 0〜200 kg のように極端に広くとると帯は平たく見え、相関が弱く見えるので、見た目ではなく相関係数 \(r\) で確かめます。三つ目は点の重なりで、数千点を打つと一面が塗りつぶされて密度の違いが分からなくなるため、点を半透明にするかヒートマップのような別の図を使います。四つ目は、外れ値 1 つで相関係数が変わることです。1 点だけ遠くにあると \(r\) が大きく動くので、外れ値を見つけたら入れた場合と除いた場合の両方を確かめます。&lt;/p&gt;</description></item><item><title>相関ヒートマップの読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/correlation/corr-heatmap_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:50 +0900</pubDate><guid>https://k-dm.work/visualize/correlation/corr-heatmap_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;相関ヒートマップは、多くの量の&lt;strong&gt;すべてのペアの相関係数&lt;/strong&gt;を表にして、値の大きさを色の濃さで塗った図です。答える問いは「たくさんの量の中で、どのペアが一緒に動いているか」で、散布図を何十枚も描く代わりに 1 枚で見渡せます。対角線（自分自身との相関）は必ず 1、表は左右対称なので、見るべきは対角線の片側だけです。色が表すのは「相関の強さ」であって「原因と結果」ではないので、気になるペアは散布図で形を確かめます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;部活のマネージャーが「練習時間・睡眠時間・食事の回数・体重・タイム」の 5 つを記録していたとします。2 つの量の関係なら散布図 1 枚で見えますが、5 つなら組み合わせは 10 通り。散布図を 10 枚並べるのはたいへんです。「まずどのペアが強く結びついているかだけ知りたい」。そのための図が相関ヒートマップです。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、お店の 4 つの指標（売上・集客・滞在時間・リピート率）の相関係数を色で塗ったものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/correlation/ja/corr-heatmap-block01-fig01.png"
 alt="売上・集客・滞在時間・リピート率の 4 指標の相関係数を 4×4 の表にし、値が 1 に近いほど濃い青で塗った相関ヒートマップ。対角線はすべて 1 で最も濃く、他のセルも 0.99 前後の濃い青が並び、どの指標も強く一緒に動いていることを示す"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;セルの中の数字が相関係数、色の濃さがその大きさです。この例ではどのペアも 0.99 以上で、「集客が多い月は売上も滞在時間もリピート率も高い」という強い結びつきが、ひと目で分かります。&lt;/p&gt;
&lt;h2 id="表はこう作る"&gt;
 表はこう作る
 
 &lt;a class="anchor" href="#%e8%a1%a8%e3%81%af%e3%81%93%e3%81%86%e4%bd%9c%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、ペアを 1 組選んで相関係数 \(r\) を計算します。売上と集客なら、8 か月分の 8 個の点から \(r\) を求めます。計算は数学I と同じです。次に、同じ計算をすべてのペアで繰り返します。4 つの量なら 4 × 4 = 16 マスですが、「売上と集客」と「集客と売上」は同じ値なので、実際に計算するのは 6 通りだけです。それから対角線を 1 で埋めます。自分自身との相関は定義から必ず 1 になり、情報はないので読むときは飛ばします。最後に、−1 から 1 の値を色の濃さに対応させます。この図は 1 に近いほど濃い青です。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。相関 0.9 のセルは濃い青、0.2 のセルはずっと薄い青になり、色の濃さだけで「強いペア」を探し出せます。これが色で塗る利点です。一方、もし「値引き率」のように売上が増えると下がる指標を加えると、その \(r\) は負（たとえば −0.8）になります。この図のような青一色の塗り方では −0.8 は「ほぼ白」になり、強い関係があるのに「関係が薄い」ように見えてしまいます。負の相関が出るデータでは、0 を白にして正を青・負を赤に塗る&lt;strong&gt;2 色の塗り方&lt;/strong&gt;に変えるのが約束です。&lt;/p&gt;
&lt;p&gt;次のコードは、売上と集客の \(r\) を、数学I の定義どおりに計算したものです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;170&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;190&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;210&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;205&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 売上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;230&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;260&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;350&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;370&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;330&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;360&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 集客&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sxx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;syy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;r = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sxy&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sxx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;syy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;図の 1 マス分のデータだけ取り出す&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;ヒートマップの「売上 × 集客」のセル 1 つは、この 8 か月分の 2 列だけから計算されます。16 マスの図も、中身はこの計算を 6 回繰り返したものです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;平均を引く準備&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;mx&lt;/code&gt; と &lt;code&gt;my&lt;/code&gt; はそれぞれの平均です。相関係数は「平均からのずれ」が同じ向きにそろうかを見る量なので、まず平均を求めて、各月が平均より上か下かを測る基準にします。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;共分散の分子：ずれの積の合計&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;売上が平均より大きい月に集客も平均より大きければ、積 \((a - m_x)(b - m_y)\) はプラスになります。逆向きならマイナス。8 か月分を足した &lt;code&gt;sxy&lt;/code&gt; がプラスで大きいほど「一緒に動いている」ことになり、これが数学I の共分散の分子です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="5-7"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;5-7 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;標準偏差の積で割って −1〜1 に収める&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sxx&lt;/code&gt; と &lt;code&gt;syy&lt;/code&gt; は各列のずれの 2 乗和で、その積の平方根で &lt;code&gt;sxy&lt;/code&gt; を割ると単位が消え、必ず −1 から 1 の間の値になります。この割り算を省くと、売上を円で測るか万円で測るかで値が変わってしまい、色の濃さを変数どうしで比べられません。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;結果は 0.998。図では小数第 2 位までの表示なので「売上 × 集客」のセルに 1.00 と出ています。&lt;/p&gt;</description></item><item><title>One-Hot Encoding ってなに？ | 高校生向けにやさしく解説（言葉を数に直す）</title><link>https://k-dm.work/prep/categorical/onehot_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/prep/categorical/onehot_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;One-Hot Encoding は、「サッカー部」「吹奏楽部」のような言葉で表されるデータ（質的データ）を、カテゴリの数だけ列を作って 0 と 1 で表す変換です。各列は「そのカテゴリに当てはまるか」という Yes/No の質問で、1 行につき 1 だけが 1 つ、残りは 0 になります。「1・2・3」と番号を振る方法とちがい、カテゴリどうしに大小や順序の意味を持ち込まないのが最大の利点です。欠点はカテゴリの種類が多いと列が増えすぎることで、都道府県の 47 列くらいまでの、数種類〜数十種類のときに向いています。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラスの 5 人について、「部活」と「1 日の勉強時間」から「定期テストの点数」を予想するモデルを作りたいとします。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;名前&lt;/th&gt;
 &lt;th style="text-align: center"&gt;部活&lt;/th&gt;
 &lt;th style="text-align: center"&gt;勉強時間（時間）&lt;/th&gt;
 &lt;th style="text-align: center"&gt;点数&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;A&lt;/td&gt;
 &lt;td style="text-align: center"&gt;サッカー&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1.0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;62&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;B&lt;/td&gt;
 &lt;td style="text-align: center"&gt;吹奏楽&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2.0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;75&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;美術&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1.5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;70&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D&lt;/td&gt;
 &lt;td style="text-align: center"&gt;サッカー&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2.5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;E&lt;/td&gt;
 &lt;td style="text-align: center"&gt;吹奏楽&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;58&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;勉強時間は数なので、そのまま直線の式 \(y = ax + b\) に入れられます。ところが「部活」は言葉なので、何とかして数に直さなければなりません。&lt;/p&gt;
&lt;p&gt;一番手軽なのは「サッカー＝1、吹奏楽＝2、美術＝3」と番号を振る方法です。でも、こう直してから直線の式に入れると、コンピュータは **「美術はサッカーの 3 倍」「吹奏楽はサッカーと美術のちょうど中間」**という関係があるものとして計算します。サッカー・吹奏楽・美術という部活の名前に、そんな大小も順序もありません。&lt;/p&gt;
&lt;p&gt;そこで One-Hot Encoding です。「部活」の 1 列を、&lt;strong&gt;カテゴリの数だけの Yes/No の列&lt;/strong&gt;に分けます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;名前&lt;/th&gt;
 &lt;th style="text-align: center"&gt;部活＝サッカー&lt;/th&gt;
 &lt;th style="text-align: center"&gt;部活＝吹奏楽&lt;/th&gt;
 &lt;th style="text-align: center"&gt;部活＝美術&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;A&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;B&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;C&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;D&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;E&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;変換前は「言葉が 1 列」。変換後は「0 と 1 だけの 3 列」で、どの行も 1 がちょうど 1 つだけ点灯しています。&lt;/p&gt;
&lt;h2 id="仕組みカテゴリごとに-yesno-の列を立てる"&gt;
 仕組み：カテゴリごとに Yes/No の列を立てる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%82%ab%e3%83%86%e3%82%b4%e3%83%aa%e3%81%94%e3%81%a8%e3%81%ab-yesno-%e3%81%ae%e5%88%97%e3%82%92%e7%ab%8b%e3%81%a6%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、カテゴリの種類を数えます。部活の列に出てくる言葉は「サッカー・吹奏楽・美術」の 3 種類で、これが新しい列の本数になります。次に、種類ごとに列を 1 本ずつ作ります。「部活＝サッカー？」「部活＝吹奏楽？」「部活＝美術？」という 3 つの質問です。そのうえで各行を見て、当てはまる列だけを 1、ほかを 0 にします。A さんはサッカーなので (1, 0, 0)、B さんは (0, 1, 0) となり、表は横に広がって言葉の列は消えます。最後に数の列と並べてモデルに渡します。直線の式でいえば \(y = a_1 \times(\text{サッカー}) + a_2 \times(\text{吹奏楽}) + a_3 \times(\text{美術}) + a_4 \times(\text{勉強時間}) + b\) の形になり、\(a_1\) は「サッカー部であることが点数を何点動かすか」と読めます。&lt;/p&gt;



&lt;div class="mermaid"
 align="center"&gt;
flowchart LR
 A[&amp;#34;部活 = 吹奏楽&amp;#34;] --&amp;gt; B[&amp;#34;サッカー? → 0&amp;#34;]
 A --&amp;gt; C[&amp;#34;吹奏楽? → 1&amp;#34;]
 A --&amp;gt; D[&amp;#34;美術? → 0&amp;#34;]
 B --&amp;gt; E[&amp;#34;(0, 1, 0)&amp;#34;]
 C --&amp;gt; E
 D --&amp;gt; E
&lt;/div&gt;

&lt;p&gt;次の短い Python は、5 人の部活のリストを One-Hot に直して 1 行ずつ表示します。ライブラリを使わず、「種類を数える」「当てはまれば 1」の 2 手順だけで書けることを確かめるコードです。&lt;/p&gt;</description></item><item><title>棒グラフの読み方と作り方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/bar/simple-bar_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/bar/simple-bar_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;棒グラフは「どのカテゴリがいちばん大きいか、何倍ちがうか」という問いに答える図で、棒の高さ（長さ）が値そのものを表します。読むときは、縦軸が 0 から始まっているか、棒の並び順に意味があるかを最初に確認します。値が変わると、その棒の高さだけが変わり、比率がそのまま見た目の比率になることが棒グラフの信頼性の土台です。縦軸の途中から始めた棒グラフは、小さな差を大きく見せる「だまし絵」になりやすいので注意しましょう。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭の模擬店で、5 つのクラスのたこ焼きの売上を比べたいとします。表にすると「A 組 320 個、B 組 210 個、C 組 280 個、D 組 190 個、E 組 160 個」。数字を読めば順位は分かりますが、「A 組は E 組の約 2 倍」「B 組と C 組の差は意外と大きい」といった&lt;strong&gt;大きさの感覚&lt;/strong&gt;は、表ではすぐにつかめません。&lt;/p&gt;
&lt;p&gt;そこで棒グラフです。下の図は標準版の例で、5 つの拠点の売上を棒の高さで表したものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/bar/ja/simple-bar-block01-fig01.png"
 alt="5 つの拠点の売上を棒の高さで比べた棒グラフ。いちばん高い棒と低い棒が一目で分かり、各棒の上に値のラベルが付いている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;図を見た瞬間に「東京がいちばん高い」「札幌が低い」「大阪は東京に近い」と分かるはずです。棒グラフが答える問いは &lt;strong&gt;「カテゴリ間の大小と、その差の大きさ」&lt;/strong&gt; です。&lt;/p&gt;
&lt;h2 id="棒グラフはこう組み立てる"&gt;
 棒グラフはこう組み立てる
 
 &lt;a class="anchor" href="#%e6%a3%92%e3%82%b0%e3%83%a9%e3%83%95%e3%81%af%e3%81%93%e3%81%86%e7%b5%84%e3%81%bf%e7%ab%8b%e3%81%a6%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、横軸にカテゴリを並べます。拠点やクラスなど、順序に意味のない「名前」を横に置き、図では 5 つの拠点名が横に並んでいます。次に、縦軸を 0 から取って目盛りを決めます。最大値（320）が収まるよう上限を 360 程度の切りの良い値にすると、縦軸の 0 が棒の根元になり、棒の長さ＝値になります。それから各カテゴリに、値の高さの棒を立てます。320 の棒は 160 の棒のちょうど 2 倍の高さになり、見た目の比と数値の比が一致するのはこのステップのおかげです。最後に棒の上に 320 などの値を書き、並び順を整えます。値が 5 個程度なら数字を直接書け、大きい順に並べ替えるとランキングとしても読めます。&lt;/p&gt;
&lt;p&gt;データが変わると何が起きるか考えてみましょう。もし札幌の売上が 160 から 300 に増えたら、札幌の棒だけがぐっと伸び、大阪の棒とほぼ同じ高さになります。他の棒は動きません。1 つのカテゴリの変化が、その棒の高さだけに現れるのが棒グラフの分かりやすさです。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-axis-0" data-viz-type="steps" data-steps-kind="axis" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"bars":[[0.15,0.85,92,0],[1.15,1.85,95,0],[2.15,2.85,97,0],[3.15,3.85,99,0]],"caption":"縦軸を 0 から：4 つの値の差は小さく見える（実際の差は数 %）。","labels":[[0.5,104,"A"],[1.5,104,"B"],[2.5,104,"C"],[3.5,104,"D"]],"y_range":[0,110]},{"bars":[[0.15,0.85,92,0],[1.15,1.85,95,0],[2.15,2.85,97,0],[3.15,3.85,99,0]],"caption":"縦軸を 90 から：同じデータでも差が何倍にも見える。軸の省略は読む側が最初に確認すべき点。","labels":[[0.5,99.6,"A"],[1.5,99.6,"B"],[2.5,99.6,"C"],[3.5,99.6,"D"]],"y_range":[90,100]},{"bars":[[0.15,0.85,99,0],[1.15,1.85,97,0],[2.15,2.85,95,0],[3.15,3.85,92,0]],"caption":"大きい順に並べ替え：比較が目的なら、順位が一目で分かる並びにする。","labels":[[0.5,104,"D"],[1.5,104,"C"],[2.5,104,"B"],[3.5,104,"A"]],"y_range":[0,110]}],"x_range":[0,4],"y_range":[0,110]};
 var id = 'viz-steps-axis-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」では、度数分布表をヒストグラムにするときに棒の高さで度数を表しました。棒グラフはその「量を長さに置き換える」考え方をカテゴリデータに使ったもので、可視化の基本中の基本です。情報I「データの活用」で学ぶ「データの可視化」では目的に合わせてグラフを選ぶ力が求められますが、棒グラフは「カテゴリ別の大小比較」専用の道具だと位置づけると選びやすくなります。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;いちばん多いミスリードは、縦軸を 0 から始めない棒グラフです。縦軸を 150 から始めると、東京（320）と札幌（160）の棒の長さは 170 対 10 になり、実際には 2 倍の差が「17 倍」に見えてしまいます。差を強調したいときは、縦軸を切るのではなく、差そのものを別の棒グラフにします。二つ目はカテゴリが多すぎること。15 本以上の棒が並ぶと細くなって読めないので、上位だけに絞る、横向きにする、「その他」にまとめるなどの工夫をします。三つ目は並び順に意味がないことです。五十音順に並べると 1 位を探すのに目が往復するので、大きい順か、時系列などの自然な順序にそろえましょう。&lt;/p&gt;</description></item><item><title>ビニングってなに？ | 高校生向けにやさしく解説（数値を階級に区切る）</title><link>https://k-dm.work/prep/numerical/binning_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/prep/numerical/binning_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ビニングは、連続した数値を&lt;strong&gt;いくつかの区間（ビン）に区切って、「どの区間に入るか」というラベルに置き換える&lt;/strong&gt;操作で、度数分布表の階級を作るのと同じ発想です。区切り方は 2 通りあり、&lt;strong&gt;等幅ビン&lt;/strong&gt;は区間の長さをそろえ、&lt;strong&gt;等頻度ビン&lt;/strong&gt;は各区間に入る件数をそろえます。ヒストグラムに境界線を引くと、等幅は境界が等間隔に並び、等頻度は&lt;strong&gt;データが密なところで境界が詰まり、まばらなところで広がる&lt;/strong&gt;ので、同じデータでも見える絵がまったく変わります。片側に長い裾があるデータでは等幅ビンの端がほぼ空になるので、等頻度ビンのほうが安定します。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラス 10 人の「1 日のスマホ使用時間」を調べたら、次のとおりでした（分、小さい順）。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;30&lt;/th&gt;
 &lt;th style="text-align: center"&gt;45&lt;/th&gt;
 &lt;th style="text-align: center"&gt;50&lt;/th&gt;
 &lt;th style="text-align: center"&gt;60&lt;/th&gt;
 &lt;th style="text-align: center"&gt;70&lt;/th&gt;
 &lt;th style="text-align: center"&gt;80&lt;/th&gt;
 &lt;th style="text-align: center"&gt;95&lt;/th&gt;
 &lt;th style="text-align: center"&gt;120&lt;/th&gt;
 &lt;th style="text-align: center"&gt;180&lt;/th&gt;
 &lt;th style="text-align: center"&gt;600&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;これを「レベル 1〜5」の 5 段階に分けてポスターにしたい。どこで区切りますか。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案 A：幅をそろえる。&lt;/strong&gt; 最小 30 から最大 600 までを 5 等分すると、1 区間の幅は 114 分。区切りは 30, 144, 258, 372, 486, 600 です。すると……レベル 1 に 8 人、レベル 2 に 1 人、レベル 3 と 4 は 0 人、レベル 5 に 1 人。ほぼ全員が同じレベルで、ポスターとしては意味がありません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案 B：人数をそろえる。&lt;/strong&gt; 10 人を 2 人ずつ 5 組に分けると、区切りは 30, 50, 70, 95, 180, 600。区切りの幅は 20, 20, 25, 85, 420 と&lt;strong&gt;ばらばら&lt;/strong&gt;ですが、どのレベルにも 2 人ずついます。&lt;/p&gt;
&lt;p&gt;案 A が等幅ビン、案 B が等頻度ビンです。同じデータなのに、区切りの絵がまったくちがうことを図で確かめましょう。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/prep/numerical/binning-ja_block01_ja.png"
 alt="右に長い裾を持つ所得のヒストグラムに、等頻度で 5 分割したときの境界線が 4 本引かれている。山の高い左側では境界線が詰まって並び、裾の右側では間隔が大きく広がっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は所得のヒストグラムです。山は左に寄り、右へ長い裾が伸びています。オレンジの点線が等頻度（5 分割）の境界で、&lt;strong&gt;山の高いところでは線が密に、裾では線がまばらに&lt;/strong&gt;なっています。各区間の「面積（人数）」がそろうように線を置いた結果です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/prep/numerical/binning-ja_block02_ja.png"
 alt="ビンごとの件数を比べた棒グラフ。等頻度ビンは 5 本の棒がほぼ同じ高さに並び、等幅ビンは最初の 1〜2 本に件数が集中して残りの棒はほとんど見えない"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;こちらは区間ごとの件数です。等頻度（緑）は 5 本の棒がほぼ同じ高さ。等幅（赤）は最初の 1〜2 区間に件数が集中し、裾側の区間はほとんど空です。&lt;/p&gt;
&lt;h2 id="仕組み境界線をどこに置くか"&gt;
 仕組み：境界線をどこに置くか
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%a2%83%e7%95%8c%e7%b7%9a%e3%82%92%e3%81%a9%e3%81%93%e3%81%ab%e7%bd%ae%e3%81%8f%e3%81%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、データを小さい順に並べ、最小値と最大値を確認します。ヒストグラムの横軸の両端です。次に区切り方を選びます。等幅ビンなら範囲を \(k\) 等分し、境界は \(x_{\min} + \dfrac{x_{\max} - x_{\min}}{k} \times j\)（\(j = 1, \dots, k-1\)）で、ヒストグラム上に等間隔の縦線が入ります。等頻度ビンなら並べた順位で \(k\) 等分し、境界は「下から \(100j/k\) % の位置の値」、つまり四分位数・五分位数の仲間で、縦線はデータの密なところに寄ります。最後に、各値を「何番目の区間か」に置き換えます。600 分も 180 分も、等頻度なら同じ「レベル 5」になり、もとの差は消えますが極端な値の影響も消えます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="小さい順に並べて最小値・最大値を確認 -&amp;gt; 等幅なら範囲を k 等分、等頻度なら順位を k 等分 -&amp;gt; 境界線をヒストグラムに引く -&amp;gt; 各値を「何番目の区間か」に置き換える"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;小さい順に並べて最小値・最大値を確認&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;等幅なら範囲を k 等分、等頻度なら順位を k 等分&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;境界線をヒストグラムに引く&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;各値を「何番目の区間か」に置き換える&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;10 人の使用時間で、2 通りの境界を計算してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 使用時間（分）、昇順&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="c1"&gt;# 等幅: 1 区間の幅 = 114&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;edges_w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;edges_f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mins&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="c1"&gt;# 等頻度: 2 人ずつ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;width:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edges_w&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# [30, 144, 258, 372, 486, 600]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;freq :&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;edges_f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# [30, 50, 70, 95, 180, 600]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="2-3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2-3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;等幅の境界は最大値 1 つで決まる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(max(mins) - min(mins)) / 5&lt;/code&gt; が 1 区間の幅 114 分で、&lt;code&gt;edges_w&lt;/code&gt; はそれを 5 回足した 6 個の境界です。幅を決めているのは最大の 600 分だけなので、この 1 人が 300 分だったら幅は 54 分に半減し、全員の区間が変わります。これが「等幅ビンは外れ値に弱い」の正体です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;等頻度の境界は並べた順位で決まる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;mins[2 * k]&lt;/code&gt; は 1 番目、3 番目、5 番目、7 番目、9 番目の値で、2 人ずつ区切った各組の先頭です。最後に &lt;code&gt;mins[-1]&lt;/code&gt; で最大値を足して 6 個の境界にしています。600 分の人が 6,000 分でも、9 番目までの境界 30, 50, 70, 95, 180 は変わりません。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="5-6"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;5-6 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;2 つの境界の並び方を比べる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;出力を見ると、等幅は 114 ずつ等間隔、等頻度は 20, 20, 25, 85, 420 と間隔がばらばらです。等幅の 144〜486 の 3 区間に 1 人しか入らない一方、等頻度はどの区間にも 2 人ずつ入ります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>複数の折れ線で推移を比べる | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/line/lineplot-multi_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/line/lineplot-multi_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;複数ラインの折れ線グラフは、同じ単位の系列を&lt;strong&gt;同じ軸に重ねて&lt;/strong&gt;「どちらが高いか」「上下動のタイミングは同じか」「差は広がっているか」を読む図です。点をつなぐ線の傾きが「1 区間あたりの変化量」で、右上がりなら増加、急なほど変化が大きいと読めます。線が 5 本以上になると色の区別がつかないので、見せたい 1 本を目立たせて他を灰色にするなどの工夫が要ります。単位の違う系列や、間隔の不ぞろいな時間を同じ軸に描くと、見た目がデータとずれてしまいます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;2 つのクラスの小テストの平均点を 5 回分くらべるとき、表で「1 回目は A 組 72、B 組 65……」と読むより、点を線でつないだほうが「A 組は 3 回目に落ちた」「B 組はじわじわ上がって差が縮まった」と&lt;strong&gt;物語として&lt;/strong&gt;読めます。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、東エリアと西エリアの週別売上を同じ軸に重ねたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/line/ja/lineplot-multi-block01-fig01.png"
 alt="5 週分の売上を東エリア（青）と西エリア（緑）の 2 本の折れ線で重ねた図。青は上下に大きく揺れながら高い位置にあり、緑は低い位置でゆるやかに上がっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;図から読めることを並べてみましょう。「常に東（青）が上」「東は W2 と W4 で落ち込み、西はほぼ横ばいで少し上向き」「差は W1 の 60 から W4 の 15 まで縮まり、W5 でまた 25 に開いた」。縦軸は 1 本なので、どの週のどの線も同じ物差しで読めます。&lt;/p&gt;
&lt;h2 id="線はこう引く"&gt;
 線はこう引く
 
 &lt;a class="anchor" href="#%e7%b7%9a%e3%81%af%e3%81%93%e3%81%86%e5%bc%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず横軸に時間を等間隔で並べます。W1〜W5 が同じ幅で置かれ、間隔がそろっているから、線の傾きが「1 週あたりの変化」を正しく表します。次に各系列の 5 つの点を打ち、順番に線でつなぎます。東は 180, 150, 170, 140, 160 の 5 点で、つなぐと W1→W2 で下がる線、W2→W3 で上がる線ができます。傾きの正負が増減、傾きの大きさが 1 週あたりの変化の大きさです。続いて系列ごとに色を変え、「凡例」を線と同じ色にします。青＝東、緑＝西とし、線の端に「東」「西」と名前を直接書けば凡例を見なくても読めます。最後に縦軸に「万円」のような単位を書き、必要なら補助線を入れます。単位（万円）を書かないと、同じ図が「人数」と誤読されることがあります。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。もし西が毎週 15 ずつ伸びて W5 に 180 になれば、緑の線は一定の傾きで右上がりになり、W3 と W4 の間で青と&lt;strong&gt;交差&lt;/strong&gt;します。交差点は「順位が入れ替わった瞬間」で、折れ線グラフならひと目で分かります。棒グラフなら 10 本の棒を見比べなければ分かりません。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-linechart-0" data-viz-type="steps" data-steps-kind="linechart" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"2 本の系列をそのまま描く。差は小さく、どちらも緩やかに増えている。","curve":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"curve2":[[0,89.27],[1,86.43],[2,88.11],[3,88.67],[4,88.6],[5,89.08],[6,89.25],[7,90.08],[8,89.33],[9,89.52],[10,89.17],[11,90.03],[12,89.9],[13,90.53],[14,90.3],[15,90.87],[16,90.54],[17,90.26],[18,90.82],[19,90.98],[20,92.15],[21,91.63],[22,92.13],[23,92.7],[24,92.62],[25,92.32],[26,92.8],[27,91.45],[28,93.44],[29,92.68],[30,92.24],[31,93.95],[32,93.49],[33,92.89],[34,94.48],[35,95.04]]},{"caption":"縦軸を 85 から始めると、同じデータでも差と変動が大きく見える。折れ線でも軸の省略は要注意。","curve":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"curve2":[[0,89.27],[1,86.43],[2,88.11],[3,88.67],[4,88.6],[5,89.08],[6,89.25],[7,90.08],[8,89.33],[9,89.52],[10,89.17],[11,90.03],[12,89.9],[13,90.53],[14,90.3],[15,90.87],[16,90.54],[17,90.26],[18,90.82],[19,90.98],[20,92.15],[21,91.63],[22,92.13],[23,92.7],[24,92.62],[25,92.32],[26,92.8],[27,91.45],[28,93.44],[29,92.68],[30,92.24],[31,93.95],[32,93.49],[33,92.89],[34,94.48],[35,95.04]],"y_range":[85,100]},{"caption":"7 点移動平均を重ねると、ノイズの奥にある傾向だけが見える。元データは薄く残す。","curve":[[3,90.28],[4,90.55],[5,90.63],[6,90.8],[7,91.08],[8,91.39],[9,91.53],[10,91.67],[11,91.77],[12,91.92],[13,91.98],[14,92.09],[15,92.13],[16,92.1],[17,92.27],[18,92.71],[19,92.79],[20,93.18],[21,93.2],[22,93.26],[23,93.45],[24,93.62],[25,93.52],[26,93.74],[27,93.65],[28,93.93],[29,94.26],[30,94.47],[31,94.75],[32,94.92]],"curve2":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"y_range":[85,100]}],"x_range":[0,35],"y_range":[0,110]};
 var id = 'viz-steps-linechart-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で扱う「変化を読む」場面と、一次関数の傾き＝変化の割合の考え方がそのまま使えます。隣り合う 2 点を結ぶ線分の傾きは「（後の値 − 前の値）÷ 1 区間」で、これが時系列の「増え方」です。情報I「データの活用」の「データの可視化」では、順序のあるデータ（時間など）には折れ線、順序のないカテゴリには棒、という選び方の基本を学びます。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の課題は、線が多すぎることです。5 本以上を同じ軸に描くと、どの線がどれか追えなくなるので、注目する 1〜2 本だけ色を付けて残りを薄い灰色にするか、系列ごとに小さな図に分けます。二つ目は時間の間隔で、W3 のデータが欠けているのに W2 と W4 を隣に置くと、2 週間の変化が 1 週間の変化に見えるため、横軸は実際の時間の間隔を保ちます。三つ目は、縦軸の拡大しすぎです。縦軸を 130〜185 に絞ると東の上下が崖のように見えます。折れ線は 0 始まりでなくてもよい図ですが、「拡大している」ことを目盛りで示す必要があります。四つ目は単位の違う系列を重ねることで、売上（万円）と来客数（人）を同じ軸に描いても意味がなく、二軸グラフなど別の方法を検討します。&lt;/p&gt;</description></item><item><title>正解率（Accuracy）| 高校生向けにやさしく解説（割合で測る分類の成績）</title><link>https://k-dm.work/eval/classification/accuracy/accuracy_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/classification/accuracy/accuracy_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;正解率（Accuracy）は、分類モデルの答えのうち&lt;strong&gt;当たった割合&lt;/strong&gt;で、「当たった件数 ÷ 全件数」として 0〜1 の値になります。当たりは「迷惑メールを迷惑と言えた」（真陽性）と「普通のメールを普通と言えた」（真陰性）の 2 種類あり、正解率はこの 2 つを&lt;strong&gt;区別せずに&lt;/strong&gt;まとめて数えます。モデルは各メールに「迷惑らしさ」の点数をつけ、&lt;strong&gt;しきい値&lt;/strong&gt;（判定の線、たとえば 0.5）を超えたら迷惑と判定するので、線を動かすと当たり外れが入れかわり、正解率も変わります。データが偏っていると多数派と答えるだけで 99 % のような高い正解率が出るため、正解率だけで判断しないことが大切です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;スマホの迷惑メールフィルタを自作したとします。テスト用に 100 通のメールを用意し、そのうち 20 通が本物の迷惑メールです。判定結果を 4 つのマスに数えると次の表になりました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;判定：迷惑&lt;/th&gt;
 &lt;th style="text-align: center"&gt;判定：普通&lt;/th&gt;
 &lt;th style="text-align: center"&gt;合計&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：迷惑&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;16&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td style="text-align: center"&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：普通&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;75&lt;/td&gt;
 &lt;td style="text-align: center"&gt;80&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;このフィルタは何点でしょうか。いちばん素直な答え方が正解率です。当たりは「迷惑を迷惑と言えた 16 通」と「普通を普通と言えた 75 通」なので、&lt;/p&gt;
$$
\text{正解率} = \frac{16 + 75}{100} = 0.91
$$&lt;p&gt;です。表の&lt;strong&gt;左上から右下への対角線&lt;/strong&gt;が当たり、それ以外のマス（4 と 5）が外れ、と覚えると見やすくなります。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/classification/accuracy/accuracy_vs_balanced.png"
 alt="正解率（左の棒）と、陽性・陰性それぞれの正解率を平均したバランス正解率（右の棒）。偏りの少ないデータなので 2 本の高さはほぼ同じ"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、乳がん診断のデータで学習したモデルの正解率（左）と、「陽性だけの正解率」と「陰性だけの正解率」を平均した&lt;strong&gt;バランス正解率&lt;/strong&gt;（右）です。このデータは陽性と陰性の数が 4 : 6 くらいであまり偏っていないので、2 本はほぼ同じ高さです。陽性が全体の 1 % しかないデータなら、左の棒は高いままでも右の棒はがくんと下がります。&lt;/p&gt;
&lt;h2 id="仕組み線を引いて当たりを数える"&gt;
 仕組み：線を引いて、当たりを数える
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e7%b7%9a%e3%82%92%e5%bc%95%e3%81%84%e3%81%a6%e5%bd%93%e3%81%9f%e3%82%8a%e3%82%92%e6%95%b0%e3%81%88%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、モデルは各メールに「迷惑らしさ」0〜1 の点数をつけます。数直線の上に 100 個の点が並ぶと想像してください。本物の迷惑メールは右寄り、普通のメールは左寄りですが、混ざる部分もあります。次に、しきい値（たとえば 0.5）の位置に縦線を引き、線より右を「迷惑」判定、左を「普通」判定とします。答え合わせでは、線の右側にいる本物の迷惑メールと、左側にいる普通のメールが「当たり」で、右側に紛れ込んだ普通のメール（誤報）と左側に残った迷惑メール（見逃し）が「外れ」です。当たりの個数 ÷ 100 が正解率になります。&lt;/p&gt;
&lt;p&gt;最後に線を動かしてみます。線を右へずらす（厳しくする）と、普通のメールが左へ移って誤報が減る一方、迷惑メールも左へ移って見逃しが増えます。正解率は「当たりに変わった点と外れに変わった点の差」だけ動きます。線を右端まで動かせば全員「普通」判定になり、正解率は普通メールの割合 80 % に一致します。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-threshold-1" data-viz-type="steps" data-steps-kind="threshold" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"閾値 0.2：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.5,"f1":0.62,"fn":0,"fp":25,"precision":0.44,"recall":1,"threshold":0.2,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.2,0,1,4,1]],"vlines":[[0.2,"0.2"]]},{"caption":"閾値 0.35：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.74,"f1":0.75,"fn":0,"fp":13,"precision":0.61,"recall":1,"threshold":0.35,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.35,0,1,4,1]],"vlines":[[0.35,"0.35"]]},{"caption":"閾値 0.5：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.84,"f1":0.81,"fn":3,"fp":5,"precision":0.77,"recall":0.85,"threshold":0.5,"tp":17},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.5,0,1,4,1]],"vlines":[[0.5,"0.5"]]},{"caption":"閾値 0.65：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.76,"f1":0.6,"fn":11,"fp":1,"precision":0.9,"recall":0.45,"threshold":0.65,"tp":9},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.65,0,1,4,1]],"vlines":[[0.65,"0.65"]]},{"caption":"閾値 0.8：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.66,"f1":0.26,"fn":17,"fp":0,"precision":1,"recall":0.15,"threshold":0.8,"tp":3},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.8,0,1,4,1]],"vlines":[[0.8,"0.8"]]}],"x_range":[0,1],"y_range":[0,4]};
 var id = 'viz-steps-threshold-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報II「情報とデータサイエンス」で学ぶ&lt;strong&gt;分類の評価指標（正解率・適合率・再現率）&lt;strong&gt;の最初の 1 つがこの正解率です。計算は中学で習った&lt;/strong&gt;相対度数&lt;/strong&gt;（度数 ÷ 全体）そのもので、「当たり」という階級の相対度数を求めています。情報IIでは、この 1 つの数では見えない「どんな間違いをしたか」を適合率・再現率で補います。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意点は、&lt;strong&gt;偏ったデータで数字がうそをつく&lt;/strong&gt;ことです。ある病気の人が 1,000 人に 10 人なら、全員を「健康」と答えても正解率 99 % ですが、病気の人は 1 人も見つけていません。二つ目は、&lt;strong&gt;2 種類の間違いの重さがちがう&lt;/strong&gt;ことです。迷惑メールの見逃しは少し不便なだけですが、大事なメールを迷惑扱いする誤報は困ります。それでも正解率はどちらも「外れ 1 件」として同じ重さで数えます。三つ目は、&lt;strong&gt;100 % に近すぎたら疑う&lt;/strong&gt;ことで、テスト用のメールを学習にも使っていた、答えがメールの中に書いてあった、といった事故でも正解率は跳ね上がります。&lt;/p&gt;
&lt;h2 id="やってみよう"&gt;
 やってみよう
 
 &lt;a class="anchor" href="#%e3%82%84%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の課題は、上のフィルタでしきい値を上げたとき、「迷惑」判定が 21 通から 15 通に減り、内訳が本物 13 通・普通 2 通になった場合の正解率を計算し、元の 0.91 と比べて何が変わり何が変わらなかったかを言葉にすることです。二つ目は、身の回りで「ほとんどが片方」の 2 択データを 1 つ見つけ（例：1 か月のうち雨の日と晴れの日）、「全部多数派」と答えるモデルの正解率を出すことです。三つ目は、正解率が 95 % なのに「使いものにならない」モデルの例を 1 つ考え、なぜ困るのかを説明することです。&lt;/p&gt;</description></item><item><title>主成分分析（PCA）ってなに？ | 高校生向けにやさしく解説（いちばん散らばる向きに軸を回す）</title><link>https://k-dm.work/basic/dimensionality_reduction/pca_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/dimensionality_reduction/pca_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;主成分分析（PCA）は、列の多いデータを「&lt;strong&gt;いちばん散らばりが大きい向き&lt;/strong&gt;」から順に見直し、少ない数の新しい軸に描き直す方法です。列の数（次元）を減らすので&lt;strong&gt;次元削減&lt;/strong&gt;と呼び、新しい軸はもとの座標軸を&lt;strong&gt;回転&lt;/strong&gt;させて作ります。第 1 主成分が最も散らばる向き、第 2 主成分はそれと直角で次に散らばる向きで、散らばりの大きさは&lt;strong&gt;分散&lt;/strong&gt;で測ります。各軸が全体の分散の何 % を受け持つかが&lt;strong&gt;寄与率&lt;/strong&gt;で、残す軸の数を決める目安になり、列ごとに単位がちがうときは先に&lt;strong&gt;標準化&lt;/strong&gt;（平均 0・標準偏差 1）しないと、単位の大きい列に軸が引っぱられます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;机の上に 3 色の団子が 3 つのかたまりで置いてあります。これを 1 枚の写真に撮って、3 つのかたまりがはっきり分かれて写るようにしたい。カメラをどの向きに構えますか。&lt;/p&gt;
&lt;p&gt;真上から撮ると 2 つが重なって見えるかもしれません。少し斜めから撮ると 3 つがきれいに分かれて写る角度があるはずです。&lt;strong&gt;立体（3 次元）のものを平面（2 次元）の写真にするとき、いちばん「散らばって見える」向きを選ぶ&lt;/strong&gt;。これが PCA がやっていることです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/dimensionality-reduction/pca_block01.svg"
 alt="3 つの軸 x1・x2・x3 をもつ 3 次元の散布図。紫・緑・黄の 3 つのかたまりが空間の中に浮かんでいて、見る角度によっては重なって見える"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は 3 列（\(x_1, x_2, x_3\)）のデータです。3 つのかたまりがありますが、この角度では紫と緑が奥行き方向で近く見えます。これに PCA をかけて 2 列にしたのが次の図です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/dimensionality-reduction/pca_block02.svg"
 alt="PCA で 2 次元にしたあとの散布図。横軸 PC1・縦軸 PC2 の平面に、3 つのかたまりが互いに重ならずに並んでいる"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;横軸が第 1 主成分（PC1）、縦軸が第 2 主成分（PC2）です。もとの 3 本の軸のどれでもない、&lt;strong&gt;新しく回転させた 2 本の軸&lt;/strong&gt;に描き直しただけで、3 つのかたまりがきれいに分かれました。&lt;/p&gt;
&lt;h2 id="軸はどうやって回す"&gt;
 軸はどうやって回す？
 
 &lt;a class="anchor" href="#%e8%bb%b8%e3%81%af%e3%81%a9%e3%81%86%e3%82%84%e3%81%a3%e3%81%a6%e5%9b%9e%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、&lt;strong&gt;中心を原点に移します&lt;/strong&gt;。各列から平均を引くと、点の雲全体が原点 (0, 0, 0) を中心に置かれ、形は変わりません。次に、3 列の&lt;strong&gt;単位をそろえます（標準化）&lt;/strong&gt;。各列を標準偏差で割って、どの列も平均 0・標準偏差 1 にすると、「円」と「cm」のような単位のちがいが消えます。&lt;/p&gt;
&lt;p&gt;そのうえで、3 列のデータが&lt;strong&gt;いちばん散らばる向きを探します&lt;/strong&gt;。原点を通る直線をいろいろな角度で引き、点をその直線に垂直に落とした（投影した）ときの&lt;strong&gt;分散&lt;/strong&gt;を比べ、分散が最大になる向きを&lt;strong&gt;第 1 主成分&lt;/strong&gt;とします。点の雲が最も長く伸びている方向に 1 本目の軸が置かれます。続いて、第 1 主成分と直角な向きの中で、同じように分散が最大の向きを&lt;strong&gt;第 2 主成分&lt;/strong&gt;とします。3 列なら第 3 主成分まで作れて、3 本は互いに直角なので、もとの座標軸をまるごと&lt;strong&gt;回転&lt;/strong&gt;させたことになります。&lt;/p&gt;
&lt;p&gt;最後に、&lt;strong&gt;散らばりの小さい軸を捨てます&lt;/strong&gt;（上の例では第 3 主成分）。各軸の分散が全体に占める割合（寄与率）を見て、合計が 80〜90% になるところまで残します。上の例では第 3 主成分を捨てて、PC1・PC2 の平面に点を描き直しました。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="各列から平均を引く -&amp;gt; 各列を標準偏差で割る（標準化） -&amp;gt; 投影した分散が最大の向きを第 1 主成分に -&amp;gt; 直角な向きで次に分散が大きい向きを第 2 主成分に -&amp;gt; 寄与率の合計が 80〜90% になるまで軸を残す"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;各列から平均を引く&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;各列を標準偏差で割る（標準化）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;投影した分散が最大の向きを第 1 主成分に&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;直角な向きで次に分散が大きい向きを第 2 主成分に&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;寄与率の合計が 80〜90% になるまで軸を残す&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-pca-0" data-viz-type="steps" data-steps-kind="pca" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"方向 0°：この向きに点を射影（細い線）したときの散らばり（分散）は 3.18。","curve":[[0.14,5.12],[10.14,5.12]],"lines":[[[5.97,6.69],[5.97,5.12]],[[3.91,3.61],[3.91,5.12]],[[5.06,6.47],[5.06,5.12]],[[6.21,4.83],[6.21,5.12]],[[3.64,4.13],[3.64,5.12]],[[6.79,6.13],[6.79,5.12]],[[4.46,4.51],[4.46,5.12]],[[5.63,4.81],[5.63,5.12]],[[4.95,5.21],[4.95,5.12]],[[8.07,6.89],[8.07,5.12]],[[7.19,5.56],[7.19,5.12]],[[6.56,6.13],[6.56,5.12]],[[4.07,4.43],[4.07,5.12]],[[6.81,5.9],[6.81,5.12]],[[6.37,7.12],[6.37,5.12]],[[7.43,7.85],[7.43,5.12]],[[2.6,3.8],[2.6,5.12]],[[3.46,4.83],[3.46,5.12]],[[5.1,5.27],[5.1,5.12]],[[6.11,5.24],[6.11,5.12]],[[5.49,4.75],[5.49,5.12]],[[9.03,7.18],[9.03,5.12]],[[5.72,4.05],[5.72,5.12]],[[2.65,2.89],[2.65,5.12]]],"metrics":{"angle":"0°","variance":3.18}},{"caption":"方向 60°：この向きに点を射影（細い線）したときの散らばり（分散）は 3.55。","curve":[[2.64,0.79],[7.64,9.45]],"lines":[[[5.97,6.69],[6.03,6.65]],[[3.91,3.61],[4.18,3.45]],[[5.06,6.47],[5.71,6.1]],[[6.21,4.83],[5.29,5.36]],[[3.64,4.13],[4.34,3.73]],[[6.79,6.13],[5.99,6.59]],[[4.46,4.51],[4.71,4.37]],[[5.63,4.81],[5.13,5.1]],[[4.95,5.21],[5.14,5.1]],[[8.07,6.89],[6.64,7.71]],[[7.19,5.56],[5.85,6.34]],[[6.56,6.13],[5.94,6.49]],[[4.07,4.43],[4.58,4.14]],[[6.81,5.9],[5.9,6.43]],[[6.37,7.12],[6.32,7.15]],[[7.43,7.85],[6.9,8.16]],[[2.6,3.8],[3.94,3.03]],[[3.46,4.83],[4.6,4.17]],[[5.1,5.27],[5.2,5.21]],[[6.11,5.24],[5.44,5.63]],[[5.49,4.75],[5.07,4.99]],[[9.03,7.18],[7.01,8.35]],[[5.72,4.05],[4.83,4.57]],[[2.65,2.89],[3.56,2.37]]],"metrics":{"angle":"60°","variance":3.55}},{"caption":"方向 120°：この向きに点を射影（細い線）したときの散らばり（分散）は 0.48。","curve":[[7.64,0.79],[2.64,9.45]],"lines":[[[5.97,6.69],[4.67,5.94]],[[3.91,3.61],[5.49,4.52]],[[5.06,6.47],[4.54,6.17]],[[6.21,4.83],[5.53,4.44]],[[3.64,4.13],[5.19,5.03]],[[6.79,6.13],[5.12,5.16]],[[4.46,4.51],[5.24,4.96]],[[5.63,4.81],[5.4,4.68]],[[4.95,5.21],[5.05,5.27]],[[8.07,6.89],[5.11,5.18]],[[7.19,5.56],[5.46,4.56]],[[6.56,6.13],[5.06,5.26]],[[4.07,4.43],[5.17,5.07]],[[6.81,5.9],[5.22,4.98]],[[6.37,7.12],[4.58,6.09]],[[7.43,7.85],[4.53,6.18]],[[2.6,3.8],[5.08,5.23]],[[3.46,4.83],[4.85,5.63]],[[5.1,5.27],[5.07,5.25]],[[6.11,5.24],[5.33,4.79]],[[5.49,4.75],[5.39,4.69]],[[9.03,7.18],[5.22,4.98]],[[5.72,4.05],[5.75,4.07]],[[2.65,2.89],[5.48,4.53]]],"metrics":{"angle":"120°","variance":0.48}},{"caption":"方向 150°：この向きに点を射影（細い線）したときの散らばり（分散）は 1.26。","curve":[[9.47,2.62],[0.81,7.62]],"lines":[[[5.97,6.69],[5.08,5.15]],[[3.91,3.61],[4.87,5.27]],[[5.06,6.47],[4.49,5.49]],[[6.21,4.83],[6.07,4.58]],[[3.64,4.13],[4.44,5.52]],[[6.79,6.13],[5.94,4.66]],[[4.46,4.51],[4.89,5.26]],[[5.63,4.81],[5.64,4.83]],[[4.95,5.21],[4.96,5.22]],[[8.07,6.89],[6.57,4.29]],[[7.19,5.56],[6.49,4.34]],[[6.56,6.13],[5.77,4.76]],[[4.07,4.43],[4.64,5.41]],[[6.81,5.9],[6.05,4.59]],[[6.37,7.12],[5.2,5.09]],[[7.43,7.85],[5.67,4.81]],[[2.6,3.8],[3.81,5.89]],[[3.46,4.83],[4,5.77]],[[5.1,5.27],[5.04,5.17]],[[6.11,5.24],[5.81,4.73]],[[5.49,4.75],[5.56,4.87]],[[9.03,7.18],[7.16,3.95]],[[5.72,4.05],[6.04,4.6]],[[2.65,2.89],[4.24,5.64]]],"metrics":{"angle":"150°","variance":1.26}},{"caption":"分散が最大になる向きが第 1 主成分（33°）。直交する向きが第 2 主成分。","curve":[[0.95,2.39],[9.34,7.84]],"curve2":[[6.78,2.6],[3.51,7.63]],"lines":[[[5.97,6.69],[6.44,5.96]],[[3.91,3.61],[3.59,4.11]],[[5.06,6.47],[5.7,5.48]],[[6.21,4.83],[5.76,5.52]],[[3.64,4.13],[3.64,4.14]],[[6.79,6.13],[6.76,6.17]],[[4.46,4.51],[4.39,4.62]],[[5.63,4.81],[5.35,5.25]],[[4.95,5.21],[5.05,5.06]],[[8.07,6.89],[8.01,6.98]],[[7.19,5.56],[6.79,6.18]],[[6.56,6.13],[6.6,6.06]],[[4.07,4.43],[4.07,4.42]],[[6.81,5.9],[6.67,6.11]],[[6.37,7.12],[6.92,6.27]],[[7.43,7.85],[8,6.97]],[[2.6,3.8],[2.75,3.56]],[[3.46,4.83],[3.83,4.26]],[[5.1,5.27],[5.18,5.14]],[[6.11,5.24],[5.88,5.59]],[[5.49,4.75],[5.22,5.17]],[[9.03,7.18],[8.82,7.5]],[[5.72,4.05],[5.06,5.06]],[[2.65,2.89],[2.37,3.32]]],"metrics":{"angle":"33°","variance":4.34}}],"points":[[5.97,6.69,-1],[3.91,3.61,-1],[5.06,6.47,-1],[6.21,4.83,-1],[3.64,4.13,-1],[6.79,6.13,-1],[4.46,4.51,-1],[5.63,4.81,-1],[4.95,5.21,-1],[8.07,6.89,-1],[7.19,5.56,-1],[6.56,6.13,-1],[4.07,4.43,-1],[6.81,5.9,-1],[6.37,7.12,-1],[7.43,7.85,-1],[2.6,3.8,-1],[3.46,4.83,-1],[5.1,5.27,-1],[6.11,5.24,-1],[5.49,4.75,-1],[9.03,7.18,-1],[5.72,4.05,-1],[2.65,2.89,-1],[6.23,6.42,-1],[5.8,5.01,-1],[8.81,6.58,-1],[3.31,4.37,-1],[3.13,4.08,-1],[6.86,6.13,-1],[5.79,5.55,-1],[4.97,2.44,-1],[2.82,3.66,-1],[2.25,2.85,-1],[4.95,6.08,-1],[2.74,3.19,-1],[5.28,5.63,-1],[1.84,4.56,-1],[3.15,4.76,-1],[4.53,5.07,-1]],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-pca-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報IIの「情報とデータサイエンス」で学ぶ&lt;strong&gt;主成分分析による次元削減&lt;/strong&gt;がこのページの主題です。「いちばん散らばる向きを探す」で使う「散らばり」は数学Iの&lt;strong&gt;分散&lt;/strong&gt;そのもので、標準化は「（値 − 平均）÷ 標準偏差」という、偏差値を求めるときと同じ変換です。「分散が最大の向きを選ぶ」という一言に、データの分析で習った量がそのまま使われています。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意点は、&lt;strong&gt;標準化を忘れると、単位の大きい 1 列に乗っ取られる&lt;/strong&gt;ことです。下の図の左は、2 列目を 1000 倍、3 列目を 0.01 倍にしたまま PCA をかけた結果で、横軸が ±10000 になり、第 1 主成分はほぼ「2 列目そのもの」で、3 つのかたまりが重なっています。右は標準化してからかけた結果で、3 つのかたまりが分かれています。&lt;/p&gt;</description></item><item><title>ランダムフォレスト | 高校生向けにやさしく解説（たくさんの木の多数決）</title><link>https://k-dm.work/basic/ensemble/randomforest_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/ensemble/randomforest_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ランダムフォレストは、&lt;strong&gt;少しずつちがう決定木を 100 本くらい育てて、多数決（回帰なら平均）で答えを決める&lt;/strong&gt;方法です。木をちがうものにするために、木ごとに&lt;strong&gt;データをくじ引きで選び直し&lt;/strong&gt;（1000 件なら 1000 回くじを引く）、質問を選ぶたびに&lt;strong&gt;使える特徴量もくじ引きで 20 個中 4 個くらいに制限&lt;/strong&gt;します。1 本の木はデータが少し変わると形が変わる不安定なモデルですが、多数決にすると不安定さが打ち消され、境界もなめらかになります。効果のカギは木どうしが&lt;strong&gt;似ていない&lt;/strong&gt;ことで、全員が同じ資料を見れば同じ間違いをしてしまいます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭の模擬店が「黒字になるか、赤字になるか」を予想します。過去の模擬店のデータ（場所・値段・メニューの数・天気・…）はたくさんあります。&lt;/p&gt;
&lt;p&gt;1 人の先生に全データを見せて、「はい／いいえ」の質問で判断の木を作ってもらうこともできます。でも、その先生が去年の 1 件に引きずられていたら？ そこで作戦を変えます。&lt;strong&gt;100 人の先生&lt;/strong&gt;を呼び、それぞれに&lt;strong&gt;くじ引きで選んだ一部の記録&lt;/strong&gt;だけを渡し、しかも&lt;strong&gt;見てよい項目もくじで制限&lt;/strong&gt;して、めいめいに判断の木を作ってもらう。そして最後は &lt;strong&gt;100 人の多数決&lt;/strong&gt;。これがランダムフォレスト（たくさんの木＝森）です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/ensemble/RandomForest_files/RandomForest_6_0.png"
 alt="10 本の決定木それぞれの性能とランダムフォレスト全体の性能を比べた棒グラフ。1 本ずつの木は 0.65〜0.74 程度だが、多数決した森（右端）は 0.81 に上がっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、森に入っている木を 1 本ずつ取り出して「当たりやすさ」（ROC-AUC という指標。1 に近いほど良い）を測ったものです。1 本ずつはどれも 0.7 前後なのに、多数決した森（右端のオレンジ）は 0.81。&lt;strong&gt;平凡な木を集めると、どの 1 本よりも強くなる&lt;/strong&gt;ことが分かります。&lt;/p&gt;
&lt;h2 id="仕組みくじ引きで木を変え多数決でまとめる"&gt;
 仕組み：くじ引きで木を変え、多数決でまとめる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%8f%e3%81%98%e5%bc%95%e3%81%8d%e3%81%a7%e6%9c%a8%e3%82%92%e5%a4%89%e3%81%88%e5%a4%9a%e6%95%b0%e6%b1%ba%e3%81%a7%e3%81%be%e3%81%a8%e3%82%81%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、&lt;strong&gt;データをくじ引きで選び直します&lt;/strong&gt;。元のデータが 1000 件なら、くじを 1000 回引いて（同じ件が何度出てもよい）木 1 本分の学習データを作ります。だいたい 3 分の 1 の件は選ばれず、代わりに何度も選ばれる件が出るので、木ごとに見ているデータが少しずつちがいます。&lt;/p&gt;
&lt;p&gt;次に、&lt;strong&gt;質問を選ぶたびに使える特徴量を 20 個中 4 個くらいにくじで制限します&lt;/strong&gt;。分類なら \(\sqrt{20} \approx 4\) 個だけを候補にして、その中から &lt;a href="https://k-dm.work/basic/tree/decision_tree_classifier_highschool/"&gt;決定木分類&lt;/a&gt; と同じ基準でいちばん良い質問を選びます。この制限がないと、どの木も「いちばん強い特徴量」から始めてしまい、似た木ばかりになります。&lt;/p&gt;
&lt;p&gt;これを&lt;strong&gt;木の本数だけ繰り返します&lt;/strong&gt;。100 本なら 100 回です。木どうしは互いに関係なく作れるので、100 本を同時に（並列に）育てられ、コンピュータが 4 台あれば 25 本ずつ分担できます。&lt;/p&gt;
&lt;p&gt;最後に、&lt;strong&gt;100 本の予測を多数決か平均&lt;/strong&gt;でまとめます。分類なら新しい点を 100 本すべての木に通し、いちばん票の多いクラスを答えにします。回帰なら 100 本の予測値の平均です。&lt;/p&gt;
&lt;p&gt;散布図の上では、1 本の木の境界は縦横の線でガタガタに区切られ、データが少し変わるだけで線の位置が大きく動きます。100 本重ねて多数決すると、たまたま 1 本だけが作った変な部屋は票が足りずに消え、多くの木が一致した境界だけが残ります。結果として境界はなめらかになり、学習データが 10 件入れ替わっても大きくは動かなくなります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="学習データ -&amp;gt; くじ引きでデータを選び直す -&amp;gt; 使える特徴量もくじで 4 個に制限 -&amp;gt; 決定木を 1 本学習 -&amp;gt; 100 本そろった? -&amp;gt; 多数決または平均 -&amp;gt; 最終予測 まだ足りないとき: 決定木を 1 本学習 -&amp;gt; くじ引きでデータを選び直す"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;学習データ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;くじ引きでデータを選び直す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;使える特徴量もくじで 4 個に制限&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;決定木を 1 本学習&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--decision"&gt;100 本そろった?&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;多数決または平均&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;最終予測&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="flow__row"&gt;&lt;span class="flow__label"&gt;まだ足りないとき&lt;/span&gt;
 &lt;span class="flow__node"&gt;決定木を 1 本学習&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;くじ引きでデータを選び直す&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="多数決で強くなる理由を確率で確かめる"&gt;
 多数決で強くなる理由を確率で確かめる
 
 &lt;a class="anchor" href="#%e5%a4%9a%e6%95%b0%e6%b1%ba%e3%81%a7%e5%bc%b7%e3%81%8f%e3%81%aa%e3%82%8b%e7%90%86%e7%94%b1%e3%82%92%e7%a2%ba%e7%8e%87%e3%81%a7%e7%a2%ba%e3%81%8b%e3%82%81%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;木が 1 本ずつ独立に正解率 0.7 だとして、\(n\) 本の多数決が正解する確率を計算してみます。3 本なら「3 本とも正解」か「2 本正解・1 本不正解」のときに多数決が正解なので、\(0.7^3 + {}_3\mathrm{C}_2 \times 0.7^2 \times 0.3 = 0.784\) です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;comb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt; &lt;span class="c1"&gt;# accuracy of one tree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;need&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# votes needed for a majority&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;comb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;3d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; independent trees -&amp;gt; majority accuracy &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;acc&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;組合せの数と 1 本の正解率&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;comb(n, k)&lt;/code&gt; は数学Aの \({}_n\mathrm{C}_k\)、つまり \(n\) 本のうちどの \(k\) 本が正解するかの選び方の数です。&lt;code&gt;p = 0.7&lt;/code&gt; は木 1 本の正解率で、ここを 0.5 や 0.4 に変えると、多数決が効かなくなる様子を後の「やってみよう」で確かめられます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;過半数に必要な票&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;n // 2 + 1&lt;/code&gt; は多数決で勝つのに必要な最低の票数です。3 本なら 2 票、11 本なら 6 票、51 本なら 26 票になります。木の本数を奇数にしているのは、同数で引き分けになる場合をなくすためです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="5"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;5 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;「過半数が正解する確率」を全部足す&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;正解する木がちょうど \(k\) 本になる確率 \({}_n\mathrm{C}_k , p^k (1-p)^{n-k}\) を、\(k\) が過半数から \(n\) までの範囲で足し合わせています。本文の 3 本の計算 \(0.7^3 + {}_3\mathrm{C}_2 \times 0.7^2 \times 0.3\) をそのまま一般化した式です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;1 本で 0.70、3 本で 0.78、11 本で 0.92、51 本で 0.999。ただしこれは「木どうしの間違いが独立」という前提の話です。全部の木が同じデータの同じ特徴量を見ていたら、同じところで同じ間違いをするので、本数を増やしても良くなりません。ステップ 1 と 2 のくじ引きは、この前提に少しでも近づけるための工夫です。&lt;/p&gt;</description></item><item><title>ロジスティック回帰 | 高校生向けにやさしく解説（一次式を確率に変える）</title><link>https://k-dm.work/basic/classification/logistic_regression_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/classification/logistic_regression_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ロジスティック回帰は、特徴量の&lt;strong&gt;一次式&lt;/strong&gt; \(z = a x_1 + b x_2 + c\) で「点数」を計算し、それを &lt;strong&gt;S 字カーブ&lt;/strong&gt;で 0〜1 の&lt;strong&gt;確率&lt;/strong&gt;に変えて分類する方法です。確率が 0.5 になる場所、つまり \(z = 0\) が&lt;strong&gt;境界線&lt;/strong&gt;で、特徴量が 2 つなら境界は 1 本の直線になります。学習とは、合格した人には高い確率、不合格だった人には低い確率がつくように係数 \(a, b, c\) を調整することで、図では境界線が回転・平行移動します。境界が直線なので、三日月形のように曲がった分かれ方のデータは苦手です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラスの友だち 30 人について、1 日の &lt;strong&gt;勉強時間&lt;/strong&gt; と &lt;strong&gt;睡眠時間&lt;/strong&gt;、そして先週の小テストに &lt;strong&gt;合格したか（1）しなかったか（0）&lt;/strong&gt; を表にしました。横軸に勉強時間、縦軸に睡眠時間をとって 30 個の点を打つと、合格した人は右上、しなかった人は左下に多く集まるでしょう。&lt;/p&gt;
&lt;p&gt;ここで「勉強 3 時間、睡眠 7 時間の人は合格しそう？」と聞かれたら、「はい／いいえ」だけでなく「&lt;strong&gt;合格する確率は 60 % くらい&lt;/strong&gt;」と答えたくなりませんか。この「確率で答える分類」がロジスティック回帰です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/classification/logistic-regression_block01_ja.png"
 alt="ロジスティック回帰による決定境界。2 種類の点を 1 本の黒い直線が分け、直線から離れるほど背景の色が濃くなる（確率が 0 や 1 に近づく）"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図では、黒い直線が「確率ちょうど 0.5」の線です。線の上側ほどクラス 1 の確率が高く（オレンジ）、下側ほど低く（青）なります。色の濃さが確率、黒い線が境界です。&lt;/p&gt;
&lt;h2 id="仕組み点数をつけて確率に変えて05-で切る"&gt;
 仕組み：点数をつけて、確率に変えて、0.5 で切る
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e7%82%b9%e6%95%b0%e3%82%92%e3%81%a4%e3%81%91%e3%81%a6%e7%a2%ba%e7%8e%87%e3%81%ab%e5%a4%89%e3%81%88%e3%81%a605-%e3%81%a7%e5%88%87%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず&lt;strong&gt;一次式で点数をつけます&lt;/strong&gt;。勉強時間を \(x_1\)、睡眠時間を \(x_2\) として、\(z = a x_1 + b x_2 + c\) を計算します。線形回帰と同じ形です。次に&lt;strong&gt;点数を確率に変えます&lt;/strong&gt;。\(z\) は −10 にも +10 にもなりえますが、確率は 0〜1 でなければいけません。そこで S 字カーブ \(p = \dfrac{1}{1 + e^{-z}}\) に通します（\(e\) は 2.718… という定数）。覚えておくのは「\(z = 0\) なら \(p = 0.5\)、\(z\) が大きいほど 1 に近づき、小さいほど 0 に近づく」ということだけです。&lt;/p&gt;
&lt;p&gt;そのうえで &lt;strong&gt;0.5 を境に分類します&lt;/strong&gt;。\(p \ge 0.5\) なら合格と予測。\(p = 0.5\) は \(z = 0\)、つまり \(a x_1 + b x_2 + c = 0\) のときなので、境界は図の上で&lt;strong&gt;直線&lt;/strong&gt;になります。最後に&lt;strong&gt;係数を学習します&lt;/strong&gt;。合格した人の \(p\) はなるべく 1 に、不合格の人の \(p\) はなるべく 0 に近づくように、\(a, b, c\) を少しずつ動かします。\(a, b\) を変えると図の直線が&lt;strong&gt;回転&lt;/strong&gt;し、\(c\) を変えると&lt;strong&gt;平行移動&lt;/strong&gt;します。外れている点を減らす向きに直線を動かし、\(a, b, c\) が動かなくなったら完成です。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="勉強時間・睡眠時間 -&amp;gt; 一次式 z = a x1 &amp;#43; b x2 &amp;#43; c -&amp;gt; S 字カーブで確率 p に変換 -&amp;gt; p は 0.5 以上? -&amp;gt; 合格と予測 / 未満なら不合格と予測"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;勉強時間・睡眠時間&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;一次式 z = a x1 + b x2 + c&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;S 字カーブで確率 p に変換&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--decision"&gt;p は 0.5 以上?&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;合格と予測 / 未満なら不合格と予測&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>交差検証 | 高校生向けにやさしく解説（データを分けて実力を公平に測る）</title><link>https://k-dm.work/eval/model-selection/crossvalidation_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/model-selection/crossvalidation_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;モデルの実力は、&lt;strong&gt;学習に使っていないデータ&lt;/strong&gt;で測らないと分かりません。学習に使ったデータでの成績は、答えを見ながら解いたテストの点数のようなものです。交差検証（クロスバリデーション）は、データを \(k\) 個のブロックに分け、&lt;strong&gt;1 つを検証用・残りを学習用&lt;/strong&gt;にして成績を測る、を検証用ブロックを入れかえながら \(k\) 回くり返す方法です。\(k\) 回の成績の&lt;strong&gt;平均&lt;/strong&gt;がモデルの実力の見積もり、&lt;strong&gt;ばらつき&lt;/strong&gt;がその見積もりの信頼度で、1 回だけ分けるホールドアウトより「たまたま簡単な問題が検証に回った」といった偶然に左右されにくくなります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;定期テストの対策に過去問 100 問を解いて覚え、そのあと&lt;strong&gt;同じ 100 問&lt;/strong&gt;でテストをしたら 100 点でした。これは実力でしょうか。答えを覚えただけかもしれません。実力は、&lt;strong&gt;まだ見たことのない問題&lt;/strong&gt;（残りの 20 問など）で測る必要があります。&lt;/p&gt;
&lt;p&gt;そこで 100 問のうち 80 問だけで勉強し、残り 20 問を初見のテストにします。これが機械学習の「訓練データと検証データに分ける」（ホールドアウト）です。ただし&lt;strong&gt;どの 20 問を残すか&lt;/strong&gt;で点数は変わります。得意な分野の 20 問が残れば高く、苦手な分野が残れば低く出ます。1 回の分け方に頼らず、分け直して平均をとろう、というのが交差検証です。&lt;/p&gt;
&lt;h2 id="仕組み検証用のブロックを順番にずらす"&gt;
 仕組み：検証用のブロックを順番にずらす
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e6%a4%9c%e8%a8%bc%e7%94%a8%e3%81%ae%e3%83%96%e3%83%ad%e3%83%83%e3%82%af%e3%82%92%e9%a0%86%e7%95%aa%e3%81%ab%e3%81%9a%e3%82%89%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;5 分割交差検証の流れを表にします。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;回&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ブロック 1&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ブロック 2&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ブロック 3&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ブロック 4&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ブロック 5&lt;/th&gt;
 &lt;th style="text-align: center"&gt;成績&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;検証&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.82&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;検証&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.86&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;検証&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.79&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;検証&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.88&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;学習&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;検証&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.85&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;まず、データの順番をよく混ぜてから、同じ大きさの \(k\) 個のブロックに切ります。次に、ブロック 1 を検証用にしまい、ブロック 2〜5 でモデルを作ります。表の 1 行目です。そのモデルにブロック 1 のデータを初見の問題として解かせ、正解率や誤差を記録します。続いて表の「検証」のマスを 1 つ右へ移動し、そのたびにモデルを&lt;strong&gt;ゼロから作り直して&lt;/strong&gt;測ります。これを \(k\) 回くり返すと、どのデータもちょうど 1 回だけ検証用になります。最後に \(k\) 個の成績の平均とばらつきを見ます。上の例なら平均は 0.84、最低と最高の差は 0.09 で、1 回だけのホールドアウトなら 0.79 と出ることも 0.88 と出ることもあった、と分かります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="データを k 個に分ける -&amp;gt; ブロック i を検証用に、残りで学習 -&amp;gt; ブロック i で成績を測る -&amp;gt; i = k ? -&amp;gt; k 個の成績の平均とばらつき まだなら: i を 1 増やす -&amp;gt; ブロック i を検証用に、残りで学習"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;データを k 個に分ける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ブロック i を検証用に、残りで学習&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ブロック i で成績を測る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--decision"&gt;i = k ?&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;k 個の成績の平均とばらつき&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="flow__row"&gt;&lt;span class="flow__label"&gt;まだなら&lt;/span&gt;
 &lt;span class="flow__node"&gt;i を 1 増やす&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;ブロック i を検証用に、残りで学習&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;\(k\) を変えると何が変わるか&lt;/strong&gt;：\(k = 5\) なら毎回 80% で学習し 20% で検証、\(k = 10\) なら 90% で学習し 10% で検証です。\(k\) を大きくするほど学習に使えるデータは増えますが、1 回あたりの検証データが減って成績がばらつき、モデルを作る回数も \(k\) 倍になります。&lt;/p&gt;</description></item><item><title>相関係数 | 高校生向けにやさしく解説（散布図の「直線っぽさ」を −1〜1 で測る）</title><link>https://k-dm.work/eval/regression/correlation_coefficient_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/regression/correlation_coefficient_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;相関係数 \(r\) は、散布図の点がどれだけ&lt;strong&gt;右上がり（または右下がり）の直線に近く並んでいるか&lt;/strong&gt;を −1〜1 で表す数です。計算は「\(x\) と \(y\) の偏差の積の平均（共分散）」を「それぞれの標準偏差の積」で割るだけで、単位が消えるのでアイスの個数と気温のように単位の違うデータでも同じ物差しで比べられます。点が直線に近づくほど \(|r|\) は 1 に近づき、1 つの&lt;strong&gt;外れ値&lt;/strong&gt;で大きく動きます。測れるのは&lt;strong&gt;直線的な関係だけ&lt;/strong&gt;なので、円や三日月形に並んだ点では 0 付近になり、相関が 0.9 あっても因果があるとは限りません。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;コンビニの 1 年分の記録で、「アイスの売上」と「日焼け止めの売上」を 1 日 1 点ずつ散布図にしました。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/regression/correlation-coefficient_block06_ja.png"
 alt="アイスの売上を横軸、日焼け止めの売上を縦軸にとった散布図。点が右上がりの帯になって並び、強い正の相関を示す"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;見事な右上がりです。「アイスが売れると日焼け止めも売れる」と言ってよいでしょうか。この&lt;strong&gt;右上がりの強さ&lt;/strong&gt;を 1 つの数で表したのが相関係数です。上の図では 0.9 を超える強い正の相関になります。ただし「アイスを買った人が日焼け止めも買う」わけではなく、どちらも&lt;strong&gt;暑い日&lt;/strong&gt;に売れているだけ、という点はあとで戻ってきます。&lt;/p&gt;
&lt;h2 id="仕組み平均の点で-4-つに分けて符号を数える"&gt;
 仕組み：平均の点で 4 つに分けて、符号を数える
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%b9%b3%e5%9d%87%e3%81%ae%e7%82%b9%e3%81%a7-4-%e3%81%a4%e3%81%ab%e5%88%86%e3%81%91%e3%81%a6%e7%ac%a6%e5%8f%b7%e3%82%92%e6%95%b0%e3%81%88%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;相関係数は「右上がりに並んでいるか」を次の手順で数値にします。まず、散布図に \(x\) の平均 \(\bar{x}\) の位置で縦線、\(y\) の平均 \(\bar{y}\) の位置で横線を引く&lt;strong&gt;十字&lt;/strong&gt;を描きます。平面が 4 つの区画に分かれます。次に、各点で偏差の積 \((x_i - \bar{x})(y_i - \bar{y})\) を計算して&lt;strong&gt;符号&lt;/strong&gt;を決めます。右上と左下の区画にある点は正、左上と右下にある点は負で、十字から遠い点ほど積の絶対値は 2 倍、3 倍と大きくなります。それを全部足して \(n\) で割ったものが&lt;strong&gt;共分散&lt;/strong&gt;です。右上・左下に点が多ければ正、左上・右下に多ければ負、4 区画に散らばっていれば打ち消し合って 0 に近づきます。最後に、共分散を \(x\) の標準偏差と \(y\) の標準偏差の積で割って&lt;strong&gt;単位を消す&lt;/strong&gt;と、値は必ず −1 以上 1 以下に収まります。&lt;/p&gt;
$$
r = \frac{\dfrac{1}{n}\sum (x_i-\bar{x})(y_i-\bar{y})}{s_x\, s_y}
$$&lt;p&gt;点を動かしてみると性質が見えます。点がすべて 1 本の右上がりの直線に乗れば \(r = 1\)、右下がりなら −1 です。点を少しずつ直線から散らすと \(|r|\) は下がります。右上の区画のはるか遠くに点を 1 つ置くと、その 1 点の積が大きいので \(r\) はぐっと上がります。外れ値 1 つで「無相関」が「強い相関」に化けることがあるのはこのためです。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-corr-0" data-viz-type="steps" data-steps-kind="corr" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"r = -0.9：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":-0.9},"points":[[7.4,3.1,-1],[6.1,4.62,-1],[3.66,5.12,-1],[3.2,6.86,-1],[6.69,3.57,-1],[2.82,7.94,-1],[2.43,6.97,-1],[4.09,6,-1],[6.76,2.38,-1],[4.49,5.68,-1],[3.13,6.62,-1],[5.3,3.8,-1],[2.91,6.84,-1],[4.64,5.48,-1],[8.54,2.44,-1],[5.71,3.86,-1],[6.49,3.11,-1],[7.51,3.57,-1],[1.79,7.07,-1],[4.69,5,-1],[2.98,5.96,-1],[6.16,3.59,-1],[2.55,7.01,-1],[6.55,4.78,-1],[5.1,4.69,-1],[3.71,5.8,-1],[5.85,5.11,-1],[6.99,3.04,-1],[6.42,4.26,-1],[5.73,2.64,-1],[4.9,4.89,-1],[7.12,2.89,-1],[5.72,4.53,-1],[7.03,3.71,-1],[6.65,4.56,-1],[6.53,4.16,-1],[4.58,5.44,-1],[8.46,1.91,-1],[5.82,4.21,-1],[4.53,3.33,-1],[7.74,1.71,-1],[3.67,7.14,-1],[1.23,8.41,-1],[4.1,4.52,-1],[5.99,3.58,-1],[4.83,4.85,-1],[6.02,5.65,-1],[2.99,7.41,-1],[3.9,5.75,-1],[1.98,6.93,-1],[4.31,6.19,-1],[5.39,5.05,-1],[6.17,2.98,-1],[7.32,2.68,-1],[6.1,3.89,-1],[5.43,5.07,-1],[1.4,9.65,-1],[5.28,5.51,-1],[5.35,4.75,-1],[2.89,6.63,-1]]},{"caption":"r = -0.46：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":-0.46},"points":[[7.4,4.31,-1],[6.1,5.66,-1],[3.66,3.5,-1],[3.2,6.37,-1],[6.69,4.33,-1],[2.82,8.04,-1],[2.43,5.61,-1],[4.09,5.8,-1],[6.76,2.05,-1],[4.49,5.69,-1],[3.13,5.81,-1],[5.3,3,-1],[2.91,5.97,-1],[4.64,5.49,-1],[8.54,4.47,-1],[5.71,3.66,-1],[6.49,3.17,-1],[7.51,5.39,-1],[1.79,4.98,-1],[4.69,4.6,-1],[2.98,4.31,-1],[6.16,3.68,-1],[2.55,5.83,-1],[6.55,6.56,-1],[5.1,4.51,-1],[3.71,4.92,-1],[5.85,6.31,-1],[6.99,3.67,-1],[6.42,5.35,-1],[5.73,1.24,-1],[4.9,4.66,-1],[7.12,3.55,-1],[5.72,5,-1],[7.03,5.04,-1],[6.65,6.25,-1],[6.53,5.32,-1],[4.58,5.34,-1],[8.46,3.32,-1],[5.82,4.49,-1],[4.53,1.08,-1],[7.74,1.99,-1],[3.67,7.54,-1],[1.23,6.92,-1],[4.1,2.89,-1],[5.99,3.44,-1],[4.83,4.49,-1],[6.02,7.62,-1],[2.99,7.19,-1],[3.9,5.06,-1],[1.98,4.93,-1],[4.31,6.48,-1],[5.39,5.6,-1],[6.17,2.5,-1],[7.32,3.39,-1],[6.1,4.2,-1],[5.43,5.68,-1],[1.4,9.59,-1],[5.28,6.38,-1],[5.35,4.95,-1],[2.89,5.52,-1]]},{"caption":"r = 0.1：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.1},"points":[[7.4,5.59,-1],[6.1,6.4,-1],[3.66,2.5,-1],[3.2,5.54,-1],[6.69,5.2,-1],[2.82,7.25,-1],[2.43,4.22,-1],[4.09,5.4,-1],[6.76,2.61,-1],[4.49,5.5,-1],[3.13,4.85,-1],[5.3,2.86,-1],[2.91,4.91,-1],[4.64,5.35,-1],[8.54,6.43,-1],[5.71,3.86,-1],[6.49,3.75,-1],[7.51,6.9,-1],[1.79,3.12,-1],[4.69,4.36,-1],[2.98,3.04,-1],[6.16,4.15,-1],[2.55,4.55,-1],[6.55,7.69,-1],[5.1,4.5,-1],[3.71,4.17,-1],[5.85,7.01,-1],[6.99,4.61,-1],[6.42,6.22,-1],[5.73,1.08,-1],[4.9,4.55,-1],[7.12,4.55,-1],[5.72,5.42,-1],[7.03,6.22,-1],[6.65,7.39,-1],[6.53,6.25,-1],[4.58,5.16,-1],[8.46,5.05,-1],[5.82,4.88,-1],[4.53,0.21,-1],[7.74,3.11,-1],[3.67,7.17,-1],[1.23,5.04,-1],[4.1,2.05,-1],[5.99,3.77,-1],[4.83,4.31,-1],[6.02,8.62,-1],[2.99,6.37,-1],[3.9,4.43,-1],[1.98,3.18,-1],[4.31,6.31,-1],[5.39,5.92,-1],[6.17,2.79,-1],[7.32,4.48,-1],[6.1,4.71,-1],[5.43,6.03,-1],[1.4,8.22,-1],[5.28,6.75,-1],[5.35,5.14,-1],[2.89,4.37,-1]]},{"caption":"r = 0.58：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.58},"points":[[7.4,6.71,-1],[6.1,6.76,-1],[3.66,2.16,-1],[3.2,4.57,-1],[6.69,6.02,-1],[2.82,5.86,-1],[2.43,3.04,-1],[4.09,4.89,-1],[6.76,3.81,-1],[4.49,5.18,-1],[3.13,3.94,-1],[5.3,3.3,-1],[2.91,3.88,-1],[4.64,5.13,-1],[8.54,8.01,-1],[5.71,4.37,-1],[6.49,4.66,-1],[7.51,7.9,-1],[1.79,1.77,-1],[4.69,4.29,-1],[2.98,2.29,-1],[6.16,4.84,-1],[2.55,3.39,-1],[6.55,8.11,-1],[5.1,4.61,-1],[3.71,3.64,-1],[5.85,7.16,-1],[6.99,5.66,-1],[6.42,6.77,-1],[5.73,1.97,-1],[4.9,4.56,-1],[7.12,5.67,-1],[5.72,5.72,-1],[7.03,7.07,-1],[6.65,7.9,-1],[6.53,6.85,-1],[4.58,4.93,-1],[8.46,6.78,-1],[5.82,5.3,-1],[4.53,0.62,-1],[7.74,4.73,-1],[3.67,6.21,-1],[1.23,3.16,-1],[4.1,2,-1],[5.99,4.42,-1],[4.83,4.32,-1],[6.02,8.64,-1],[2.99,5.18,-1],[3.9,3.96,-1],[1.98,1.91,-1],[4.31,5.79,-1],[5.39,5.99,-1],[6.17,3.67,-1],[7.32,5.71,-1],[6.1,5.3,-1],[5.43,6.11,-1],[1.4,5.99,-1],[5.28,6.65,-1],[5.35,5.3,-1],[2.89,3.4,-1]]},{"caption":"r = 0.92：点が直線に沿うほど |r| が 1 に近づく。符号は右上がり（+）か右下がり（−）か。","metrics":{"r":0.92},"points":[[7.4,7.42,-1],[6.1,6.6,-1],[3.66,2.7,-1],[3.2,3.62,-1],[6.69,6.61,-1],[2.82,4.02,-1],[2.43,2.35,-1],[4.09,4.35,-1],[6.76,5.54,-1],[4.49,4.76,-1],[3.13,3.26,-1],[5.3,4.34,-1],[2.91,3.08,-1],[4.64,4.83,-1],[8.54,8.81,-1],[5.71,5.15,-1],[6.49,5.79,-1],[7.51,8.09,-1],[1.79,1.29,-1],[4.69,4.44,-1],[2.98,2.33,-1],[6.16,5.67,-1],[2.55,2.6,-1],[6.55,7.57,-1],[5.1,4.87,-1],[3.71,3.48,-1],[5.85,6.64,-1],[6.99,6.62,-1],[6.42,6.81,-1],[5.73,3.94,-1],[4.9,4.71,-1],[7.12,6.71,-1],[5.72,5.83,-1],[7.03,7.36,-1],[6.65,7.52,-1],[6.53,6.93,-1],[4.58,4.69,-1],[8.46,8.14,-1],[5.82,5.68,-1],[4.53,2.49,-1],[7.74,6.64,-1],[3.67,4.75,-1],[1.23,1.63,-1],[4.1,2.91,-1],[5.99,5.35,-1],[4.83,4.55,-1],[6.02,7.5,-1],[2.99,3.79,-1],[3.9,3.76,-1],[1.98,1.48,-1],[4.31,4.95,-1],[5.39,5.76,-1],[6.17,5.09,-1],[7.32,6.87,-1],[6.1,5.86,-1],[5.43,5.83,-1],[1.4,3.16,-1],[5.28,6.01,-1],[5.35,5.37,-1],[2.89,2.82,-1]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-corr-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で学ぶ&lt;strong&gt;散布図・相関係数&lt;/strong&gt;そのものです。機械学習ではこの \(r\) が 2 か所に顔を出します。1 つは回帰直線の傾きで、\(a = r \times s_y / s_x\) と書けます。もう 1 つは当てはまりの良さで、直線 1 本の回帰では決定係数 \(R^2 = r^2\) です。つまり「相関係数を求める」は「回帰直線の性能を半分計算している」ことになります。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意は、&lt;strong&gt;0 でも関係があることがある&lt;/strong&gt;点です。下の図の左は同心円、右は三日月形に並んだ点で、目で見れば明らかに関係があるのに、相関係数は 0.00 と −0.45 です。右上・左下と左上・右下の 4 区画に点が均等に散らばり、符号が打ち消し合うからです。&lt;/p&gt;</description></item><item><title>特徴選択ってなに？ | 高校生向けにやさしく解説（予測に効く列だけを残す）</title><link>https://k-dm.work/basic/feature_selection/basic_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/feature_selection/basic_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;特徴選択は、表の列（&lt;strong&gt;特徴量&lt;/strong&gt;）のうち&lt;strong&gt;予測に本当に役立つものだけを残す&lt;/strong&gt;前処理です。20 列あった表を 10 列に減らすと、偶然に合わせすぎる&lt;strong&gt;過学習&lt;/strong&gt;が起きにくくなり、計算が速くなり、「どの列が効いているか」が読みやすくなります。選び方は 3 つあり、列を 1 本ずつ採点する&lt;strong&gt;フィルター法&lt;/strong&gt;、組み合わせを試して精度で選ぶ&lt;strong&gt;ラッパー法&lt;/strong&gt;、モデルが学習しながら選ぶ&lt;strong&gt;埋め込み法&lt;/strong&gt;です。「列が多いほど正確」は誤解で、学習に使っていないデータで測った精度は、ある数を超えると上がらなくなります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭の模擬店の売上を予想するために、去年までの 15 日分の記録を表にしました。列は「気温」「天気」「来場者数」「値段」「宣伝ポスターの枚数」から、「その日の曜日」「担当者の血液型」「隣の店の名前の文字数」まで、思いつくままに 20 列。この 20 列をすべて使って予想の式（重回帰）を作るべきでしょうか。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;列の名前&lt;/th&gt;
 &lt;th style="text-align: left"&gt;売上との関係&lt;/th&gt;
 &lt;th style="text-align: center"&gt;残す？&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;来場者数&lt;/td&gt;
 &lt;td style="text-align: left"&gt;多いほど売れる（強い）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;残す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;気温&lt;/td&gt;
 &lt;td style="text-align: left"&gt;暑いほど冷たい物が売れる（中くらい）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;残す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;値段&lt;/td&gt;
 &lt;td style="text-align: left"&gt;高いと売れにくい（中くらい）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;残す&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;担当者の血液型&lt;/td&gt;
 &lt;td style="text-align: left"&gt;関係なし&lt;/td&gt;
 &lt;td style="text-align: center"&gt;捨てる&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;隣の店の名前の文字数&lt;/td&gt;
 &lt;td style="text-align: left"&gt;関係なし&lt;/td&gt;
 &lt;td style="text-align: center"&gt;捨てる&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;血液型や隣の店の名前は、常識で考えれば 20 列の中でも売上と関係ありません。ところが記録が 15 日分しかないと、たまたま「A 型の日によく売れた」というパターンが見つかり、式はそれを本気にします。これが&lt;strong&gt;過学習&lt;/strong&gt;で、20 列すべてを使った式が来年の文化祭で外れる原因になります。特徴選択は、この「捨てる」判断を数値にもとづいて行う方法です。&lt;/p&gt;
&lt;h2 id="列はどうやって選ぶ"&gt;
 列はどうやって選ぶ？
 
 &lt;a class="anchor" href="#%e5%88%97%e3%81%af%e3%81%a9%e3%81%86%e3%82%84%e3%81%a3%e3%81%a6%e9%81%b8%e3%81%b6"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;標準版では、20 列のうち 10 列が役に立ち、5 列は他の列の焼き直し、5 列は純粋なノイズというデータで実験しています。選び方は 3 通りあります。&lt;/p&gt;
&lt;p&gt;1 つ目は&lt;strong&gt;フィルター法で、列を 1 本ずつ採点する&lt;/strong&gt;方法です。各列と売上の関係の強さを数値にして（たとえば相関係数の大きさ）、点数の高い順に上位 \(k\) 本だけ残します。モデルを作る前に表の段階でふるいにかけるので計算が軽いのが利点です。標準版では、曲がった関係も拾える「相互情報量」という点数を使っています。&lt;/p&gt;
&lt;p&gt;2 つ目は&lt;strong&gt;ラッパー法で、組み合わせを試す&lt;/strong&gt;方法です。「この 5 列で予想の式を作ったら精度はいくつか」を実際に測り、列を 1 本ずつ足したり（前方選択）引いたり（後方除去）しながら、精度がいちばん良い組み合わせを探します。手間はかかりますが「2 本そろって初めて効く列」も見つけられます。&lt;/p&gt;
&lt;p&gt;3 つ目は&lt;strong&gt;埋め込み法で、モデルに選ばせる&lt;/strong&gt;方法です。ラッソ回帰のように不要な係数を 0 にする仕組みや、ランダムフォレストが出す「列の重要度」を使い、学習と同時に選びます。&lt;/p&gt;
&lt;p&gt;どの方法でも最後に&lt;strong&gt;20 本のうち何本残すかを決めます&lt;/strong&gt;。残す本数 \(k\) を 1, 2, 3, … と増やしながら、学習に使っていないデータで精度を測ってグラフにします。精度は最初は急に上がり、役に立つ 10 列を使い切ったあたりで横ばいになります。その手前の \(k\) を選びます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="20 列の表 -&amp;gt; 各列を採点する（フィルター法）か、組み合わせを試す（ラッパー法）か、モデルに選ばせる（埋め込み法） -&amp;gt; 役立つ k 列だけの表 -&amp;gt; 予想の式を作る -&amp;gt; 学習に使っていないデータで精度を測る -&amp;gt; k を変えて比べる"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;20 列の表&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;各列を採点する（フィルター法）か、組み合わせを試す（ラッパー法）か、モデルに選ばせる（埋め込み法）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;役立つ k 列だけの表&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;予想の式を作る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;学習に使っていないデータで精度を測る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;k を変えて比べる&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-poly-1" data-viz-type="steps" data-steps-kind="poly" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"次数 1：訓練 SSE は 31.56、未知データ（白）での SSE は 41.13。次数を上げると訓練には合うが、途中から未知データで悪化する（過学習）。","curve":[[0,6.22],[0.1,6.2],[0.2,6.18],[0.3,6.16],[0.4,6.14],[0.5,6.12],[0.6,6.1],[0.7,6.08],[0.8,6.06],[0.9,6.04],[1,6.02],[1.1,6],[1.2,5.98],[1.3,5.96],[1.4,5.94],[1.5,5.92],[1.6,5.9],[1.7,5.88],[1.8,5.86],[1.9,5.84],[2,5.82],[2.1,5.8],[2.2,5.78],[2.3,5.76],[2.4,5.74],[2.5,5.72],[2.6,5.7],[2.7,5.68],[2.8,5.66],[2.9,5.64],[3,5.62],[3.1,5.6],[3.2,5.58],[3.3,5.56],[3.4,5.54],[3.5,5.52],[3.6,5.5],[3.7,5.48],[3.8,5.46],[3.9,5.44],[4,5.42],[4.1,5.4],[4.2,5.38],[4.3,5.37],[4.4,5.35],[4.5,5.33],[4.6,5.31],[4.7,5.29],[4.8,5.27],[4.9,5.25],[5,5.23],[5.1,5.21],[5.2,5.19],[5.3,5.17],[5.4,5.15],[5.5,5.13],[5.6,5.11],[5.7,5.09],[5.8,5.07],[5.9,5.05],[6,5.03],[6.1,5.01],[6.2,4.99],[6.3,4.97],[6.4,4.95],[6.5,4.93],[6.6,4.91],[6.7,4.89],[6.8,4.87],[6.9,4.85],[7,4.83],[7.1,4.81],[7.2,4.79],[7.3,4.77],[7.4,4.75],[7.5,4.73],[7.6,4.71],[7.7,4.69],[7.8,4.67],[7.9,4.65],[8,4.63],[8.1,4.61],[8.2,4.59],[8.3,4.57],[8.4,4.55],[8.5,4.53],[8.6,4.51],[8.7,4.49],[8.8,4.47],[8.9,4.45],[9,4.43],[9.1,4.41],[9.2,4.39],[9.3,4.38],[9.4,4.36],[9.5,4.34],[9.6,4.32],[9.7,4.3],[9.8,4.28],[9.9,4.26],[10,4.24]],"metrics":{"degree":1,"test_error":41.13,"train_error":31.56}},{"caption":"次数 2：訓練 SSE は 24.9、未知データ（白）での SSE は 30.5。次数を上げると訓練には合うが、途中から未知データで悪化する（過学習）。","curve":[[0,7.74],[0.1,7.62],[0.2,7.51],[0.3,7.4],[0.4,7.29],[0.5,7.18],[0.6,7.08],[0.7,6.98],[0.8,6.87],[0.9,6.78],[1,6.68],[1.1,6.58],[1.2,6.49],[1.3,6.4],[1.4,6.31],[1.5,6.22],[1.6,6.14],[1.7,6.05],[1.8,5.97],[1.9,5.89],[2,5.82],[2.1,5.74],[2.2,5.67],[2.3,5.6],[2.4,5.53],[2.5,5.46],[2.6,5.39],[2.7,5.33],[2.8,5.27],[2.9,5.21],[3,5.15],[3.1,5.09],[3.2,5.04],[3.3,4.99],[3.4,4.94],[3.5,4.89],[3.6,4.85],[3.7,4.8],[3.8,4.76],[3.9,4.72],[4,4.68],[4.1,4.64],[4.2,4.61],[4.3,4.58],[4.4,4.55],[4.5,4.52],[4.6,4.49],[4.7,4.47],[4.8,4.45],[4.9,4.43],[5,4.41],[5.1,4.39],[5.2,4.38],[5.3,4.36],[5.4,4.35],[5.5,4.34],[5.6,4.34],[5.7,4.33],[5.8,4.33],[5.9,4.33],[6,4.33],[6.1,4.33],[6.2,4.34],[6.3,4.35],[6.4,4.35],[6.5,4.37],[6.6,4.38],[6.7,4.39],[6.8,4.41],[6.9,4.43],[7,4.45],[7.1,4.47],[7.2,4.5],[7.3,4.52],[7.4,4.55],[7.5,4.58],[7.6,4.62],[7.7,4.65],[7.8,4.69],[7.9,4.73],[8,4.77],[8.1,4.81],[8.2,4.85],[8.3,4.9],[8.4,4.95],[8.5,5],[8.6,5.05],[8.7,5.1],[8.8,5.16],[8.9,5.22],[9,5.28],[9.1,5.34],[9.2,5.4],[9.3,5.47],[9.4,5.54],[9.5,5.61],[9.6,5.68],[9.7,5.75],[9.8,5.83],[9.9,5.91],[10,5.99]],"metrics":{"degree":2,"test_error":30.5,"train_error":24.9}},{"caption":"次数 3：訓練 SSE は 6.03、未知データ（白）での SSE は 6.02。次数を上げると訓練には合うが、途中から未知データで悪化する（過学習）。","curve":[[0,5.25],[0.1,5.47],[0.2,5.68],[0.3,5.88],[0.4,6.05],[0.5,6.22],[0.6,6.37],[0.7,6.5],[0.8,6.62],[0.9,6.73],[1,6.82],[1.1,6.91],[1.2,6.97],[1.3,7.03],[1.4,7.08],[1.5,7.11],[1.6,7.14],[1.7,7.15],[1.8,7.15],[1.9,7.15],[2,7.13],[2.1,7.11],[2.2,7.08],[2.3,7.04],[2.4,6.99],[2.5,6.93],[2.6,6.87],[2.7,6.8],[2.8,6.72],[2.9,6.64],[3,6.56],[3.1,6.46],[3.2,6.37],[3.3,6.27],[3.4,6.16],[3.5,6.05],[3.6,5.94],[3.7,5.83],[3.8,5.71],[3.9,5.59],[4,5.47],[4.1,5.35],[4.2,5.23],[4.3,5.11],[4.4,4.99],[4.5,4.86],[4.6,4.74],[4.7,4.62],[4.8,4.5],[4.9,4.38],[5,4.27],[5.1,4.16],[5.2,4.05],[5.3,3.94],[5.4,3.84],[5.5,3.74],[5.6,3.65],[5.7,3.56],[5.8,3.47],[5.9,3.39],[6,3.32],[6.1,3.26],[6.2,3.2],[6.3,3.14],[6.4,3.1],[6.5,3.06],[6.6,3.04],[6.7,3.02],[6.8,3.01],[6.9,3],[7,3.01],[7.1,3.03],[7.2,3.06],[7.3,3.1],[7.4,3.15],[7.5,3.22],[7.6,3.29],[7.7,3.38],[7.8,3.48],[7.9,3.6],[8,3.72],[8.1,3.87],[8.2,4.02],[8.3,4.19],[8.4,4.38],[8.5,4.58],[8.6,4.8],[8.7,5.03],[8.8,5.28],[8.9,5.55],[9,5.84],[9.1,6.14],[9.2,6.46],[9.3,6.8],[9.4,7.16],[9.5,7.54],[9.6,7.94],[9.7,8.35],[9.8,8.79],[9.9,9.25],[10,9.73]],"metrics":{"degree":3,"test_error":6.02,"train_error":6.03}},{"caption":"次数 5：訓練 SSE は 2.87、未知データ（白）での SSE は 6.04。次数を上げると訓練には合うが、途中から未知データで悪化する（過学習）。","curve":[[0,5.23],[0.1,5.34],[0.2,5.46],[0.3,5.59],[0.4,5.72],[0.5,5.86],[0.6,6.01],[0.7,6.15],[0.8,6.3],[0.9,6.44],[1,6.57],[1.1,6.7],[1.2,6.82],[1.3,6.94],[1.4,7.04],[1.5,7.13],[1.6,7.21],[1.7,7.28],[1.8,7.34],[1.9,7.38],[2,7.42],[2.1,7.43],[2.2,7.44],[2.3,7.43],[2.4,7.4],[2.5,7.37],[2.6,7.32],[2.7,7.25],[2.8,7.18],[2.9,7.09],[3,6.99],[3.1,6.88],[3.2,6.76],[3.3,6.63],[3.4,6.49],[3.5,6.34],[3.6,6.19],[3.7,6.03],[3.8,5.86],[3.9,5.69],[4,5.51],[4.1,5.33],[4.2,5.15],[4.3,4.97],[4.4,4.79],[4.5,4.61],[4.6,4.43],[4.7,4.26],[4.8,4.09],[4.9,3.92],[5,3.76],[5.1,3.61],[5.2,3.46],[5.3,3.33],[5.4,3.2],[5.5,3.08],[5.6,2.98],[5.7,2.88],[5.8,2.8],[5.9,2.73],[6,2.68],[6.1,2.64],[6.2,2.61],[6.3,2.6],[6.4,2.61],[6.5,2.62],[6.6,2.66],[6.7,2.71],[6.8,2.77],[6.9,2.85],[7,2.95],[7.1,3.06],[7.2,3.18],[7.3,3.32],[7.4,3.47],[7.5,3.63],[7.6,3.8],[7.7,3.98],[7.8,4.17],[7.9,4.37],[8,4.57],[8.1,4.78],[8.2,4.99],[8.3,5.2],[8.4,5.41],[8.5,5.61],[8.6,5.8],[8.7,5.99],[8.8,6.17],[8.9,6.33],[9,6.47],[9.1,6.59],[9.2,6.68],[9.3,6.75],[9.4,6.78],[9.5,6.78],[9.6,6.73],[9.7,6.64],[9.8,6.5],[9.9,6.31],[10,6.05]],"metrics":{"degree":5,"test_error":6.04,"train_error":2.87}},{"caption":"次数 9：訓練 SSE は 0.01、未知データ（白）での SSE は 40.87。次数を上げると訓練には合うが、途中から未知データで悪化する（過学習）。","curve":[[0,12.65],[0.1,6.81],[0.2,3.07],[0.3,0.91],[0.4,-0.07],[0.5,-0.22],[0.6,0.2],[0.7,0.99],[0.8,1.96],[0.9,3.02],[1,4.06],[1.1,5.03],[1.2,5.89],[1.3,6.62],[1.4,7.2],[1.5,7.64],[1.6,7.96],[1.7,8.15],[1.8,8.25],[1.9,8.26],[2,8.21],[2.1,8.11],[2.2,7.98],[2.3,7.83],[2.4,7.68],[2.5,7.53],[2.6,7.38],[2.7,7.25],[2.8,7.13],[2.9,7.02],[3,6.93],[3.1,6.84],[3.2,6.77],[3.3,6.69],[3.4,6.61],[3.5,6.52],[3.6,6.42],[3.7,6.3],[3.8,6.16],[3.9,6],[4,5.81],[4.1,5.61],[4.2,5.38],[4.3,5.12],[4.4,4.85],[4.5,4.57],[4.6,4.28],[4.7,3.98],[4.8,3.68],[4.9,3.39],[5,3.11],[5.1,2.85],[5.2,2.62],[5.3,2.42],[5.4,2.25],[5.5,2.12],[5.6,2.03],[5.7,1.98],[5.8,1.98],[5.9,2.02],[6,2.1],[6.1,2.21],[6.2,2.36],[6.3,2.53],[6.4,2.73],[6.5,2.93],[6.6,3.14],[6.7,3.35],[6.8,3.54],[6.9,3.72],[7,3.87],[7.1,3.99],[7.2,4.08],[7.3,4.14],[7.4,4.15],[7.5,4.14],[7.6,4.1],[7.7,4.04],[7.8,3.97],[7.9,3.91],[8,3.86],[8.1,3.86],[8.2,3.91],[8.3,4.03],[8.4,4.24],[8.5,4.54],[8.6,4.96],[8.7,5.47],[8.8,6.08],[8.9,6.74],[9,7.42],[9.1,8.03],[9.2,8.48],[9.3,8.63],[9.4,8.28],[9.5,7.2],[9.6,5.1],[9.7,1.58],[9.8,-3.8],[9.9,-5],[10,-5]],"metrics":{"degree":9,"test_error":40.87,"train_error":0.01}}],"points":[[0.13,5.5,0],[1.26,6.35,0],[2.2,7.99,0],[2.83,7.09,0],[3.9,6,0],[4.54,4.46,0],[5.48,2.11,0],[6.45,2.88,0],[7.02,3.85,0],[7.81,3.98,0],[8.72,5.56,0],[9.51,6.98,0],[0.57,5.23,-1],[1,6.08,-1],[1.57,6.67,-1],[2.26,6.97,-1],[2.9,6.59,-1],[3.72,6.04,-1],[3.88,6.58,-1],[4.78,4.08,-1],[5.5,2.68,-1],[6,2.44,-1],[6.3,2.73,-1],[6.88,3.32,-1],[7.58,3.15,-1],[7.98,3.12,-1],[9.05,5.64,-1],[9.53,7.18,-1]],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-poly-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報IIの「情報とデータサイエンス」で学ぶ&lt;strong&gt;重回帰分析と変数選択&lt;/strong&gt;が、このページそのものです。説明変数（列）を増やすほど手元のデータへの当てはまりは良くなるが、新しいデータでは外れる、だから変数を選ぶ。フィルター法でいちばん手軽な点数は、数学Iの「データの分析」で習う&lt;strong&gt;相関係数&lt;/strong&gt;の絶対値です。\(|r|\) が 1 に近い列ほど直線的に売上と結びついています。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意点は、&lt;strong&gt;相関係数 0 は無関係ではない&lt;/strong&gt;ことです。気温と「温かい飲み物＋冷たい飲み物の合計売上」は U 字の関係になり、相関係数はほぼ 0 でも気温は明らかに効いています。相関係数 \(r\) だけでふるうと、こうした U 字の列を落としてしまいます。二つ目は、&lt;strong&gt;似た列は 2 本あっても片方で十分&lt;/strong&gt;なことです。「気温（℃）」と「気温（℉）」のように中身が同じ列は、両方残しても情報は増えません。フィルター法は 1 本ずつ採点するので、似た列を両方とも高く評価してしまいます。三つ目は、&lt;strong&gt;列を選ぶ作業そのものにも過学習がある&lt;/strong&gt;ことです。ラッパー法で 10 列から 5 列を選ぶ場面を考えてください。ラッパー法で「精度がいちばん良い組み合わせ」を選ぶとき、その精度を測ったデータに合わせすぎることがあります。最後の確認は、選ぶときにも使っていないデータで行います。&lt;/p&gt;</description></item><item><title>決定木分類 | 高校生向けにやさしく解説（質問を重ねて平面を区切る）</title><link>https://k-dm.work/basic/tree/decision_tree_classifier_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:47 +0900</pubDate><guid>https://k-dm.work/basic/tree/decision_tree_classifier_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;決定木分類は、「\(x\) は 5 以下？」のような&lt;strong&gt;はい／いいえの質問&lt;/strong&gt;を順番にして、最後にたどりついた箱（葉）の多数派クラスを答えにする方法です。質問はコンピュータが選び、基準は「分けたあとのグループの&lt;strong&gt;混ざり具合（ジニ不純度）&lt;strong&gt;がいちばん減る質問」の 1 つだけです。散布図の上では 1 つの質問が&lt;/strong&gt;縦か横の 1 本の線&lt;/strong&gt;になり、質問を重ねるほど平面が長方形の部屋に区切られていきます。深くしすぎると学習データを丸暗記した 1 点だけの部屋ができて新しいデータで外れる（過学習）ので、&lt;code&gt;max_depth&lt;/code&gt; のような上限で止めます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;部活の顧問の先生は、毎朝「今日は外で練習（A）か、体育館で練習（B）か」を決めています。手がかりは天気予報の &lt;strong&gt;降水確率（%）&lt;/strong&gt; と &lt;strong&gt;気温（℃）&lt;/strong&gt; の 2 つで、過去 100 日分の記録を散布図にすると、A の日と B の日がなんとなく分かれて見えます。&lt;/p&gt;
&lt;p&gt;先生の頭の中を言葉にすると、「降水確率が 40 % より高ければ体育館。40 % 以下でも気温が 5 ℃ 以下なら体育館。それ以外は外」のような 2〜3 個の&lt;strong&gt;質問の連続&lt;/strong&gt;のはずです。この質問の連続を 100 日分のデータから自動で作るのが決定木です。「はい／いいえ」だけで答えにたどりつく考え方は &lt;a href="https://k-dm.work/basic/tree/decision_tree_classifier_middleschool/"&gt;中学生向けの決定木&lt;/a&gt; で動物当てゲームとして紹介しています。ここでは、「降水確率は 40 % 以下？」という質問 1 つが&lt;strong&gt;散布図の上で何をしているか&lt;/strong&gt;を見ていきます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/tree/decision-tree-classifier_block03.svg"
 alt="決定木による決定境界。2 クラスの点が散らばる平面が、縦と横の直線だけで長方形の部屋に区切られ、部屋ごとに色が塗られている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、2 つの特徴量 \(x_1, x_2\) で A と B を分けた決定木の結果です。境界が&lt;strong&gt;縦と横の線だけ&lt;/strong&gt;でできていて、斜めの線が 1 本もないことに注目してください。たとえば「\(x_1 \le -0.5\)？」という質問は縦線、「\(x_2 \le 1\)？」という質問は横線になります。&lt;/p&gt;
&lt;h2 id="仕組みいちばんきれいに分かれる線を-1-本ずつ引く"&gt;
 仕組み：いちばん「きれいに分かれる」線を 1 本ずつ引く
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%84%e3%81%a1%e3%81%b0%e3%82%93%e3%81%8d%e3%82%8c%e3%81%84%e3%81%ab%e5%88%86%e3%81%8b%e3%82%8c%e3%82%8b%e7%b7%9a%e3%82%92-1-%e6%9c%ac%e3%81%9a%e3%81%a4%e5%bc%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、A と B が混ざった全部の点を 1 つの箱（根）に入れます。次に、「\(x_1\) を 0.3 で区切る」「\(x_1\) を 0.4 で区切る」「\(x_2\) を −1.0 で区切る」……と、特徴量と値の組み合わせを総当たりで試します。散布図の上では、縦線や横線を 0.1 ずつずらしながら置いてみることに当たります。そのうち、分けたあとの左右の箱がそれぞれなるべく 1 色に近くなる、つまり混ざり具合（ジニ不純度）がいちばん減る線を採用すると、図に最初の 1 本が引かれます。&lt;/p&gt;
&lt;p&gt;できた 2 つの部屋で同じことを繰り返します。2 本目の線は 1 本目で分けた部屋の中だけに引かれるので、部屋は長方形に細分化されていきます。最後に、部屋が 1 色になったか、決めた深さ（&lt;code&gt;max_depth&lt;/code&gt;）に達したら止めて、その部屋を葉と呼びます。新しい点が来たら、落ちた部屋の多数派の色、たとえば A が 7 点・B が 1 点の部屋なら A と予測します。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="全部の点を 1 つの箱に入れる -&amp;gt; 縦線・横線の候補を総当たり -&amp;gt; ジニ不純度がいちばん減る線を採用 -&amp;gt; できた 2 部屋で繰り返す -&amp;gt; 1 色になるか max_depth に達したら葉"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;全部の点を 1 つの箱に入れる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;縦線・横線の候補を総当たり&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ジニ不純度がいちばん減る線を採用&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;できた 2 部屋で繰り返す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;1 色になるか max_depth に達したら葉&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/tree/decision-tree-classifier_block04.svg"
 alt="学習した決定木の構造。各ノードに質問（x1 &amp;lt;= −0.548 など）、ジニ不純度、サンプル数、クラスごとの数が書かれ、根から葉へ枝分かれし、末端には 1 点だけの葉もある"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;2 枚目の図は同じ木を「質問の流れ」として描いたものです。各箱の &lt;code&gt;gini&lt;/code&gt; が混ざり具合、&lt;code&gt;samples&lt;/code&gt; が箱に入った点の数、&lt;code&gt;value&lt;/code&gt; がクラスごとの数を表します。根から葉へたどる 1 本の道が、1 枚目の図の 1 つの部屋に対応しています。この木は深さを制限せずに育てたので、&lt;code&gt;samples = 1&lt;/code&gt; の葉、つまり点 1 つだけの部屋がいくつもあり、これが後で説明する過学習の正体です。&lt;/p&gt;
&lt;h2 id="混ざり具合を数にするジニ不純度"&gt;
 「混ざり具合」を数にする：ジニ不純度
 
 &lt;a class="anchor" href="#%e6%b7%b7%e3%81%96%e3%82%8a%e5%85%b7%e5%90%88%e3%82%92%e6%95%b0%e3%81%ab%e3%81%99%e3%82%8b%e3%82%b8%e3%83%8b%e4%b8%8d%e7%b4%94%e5%ba%a6"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;箱の中のクラスの割合を \(p_A, p_B\) とすると、ジニ不純度は&lt;/p&gt;</description></item><item><title>k-means ってなに？ | 高校生向けにやさしく解説（似たもの同士を自動でグループ分け）</title><link>https://k-dm.work/basic/clustering/k-means1_highschool/</link><pubDate>Sat, 31 Oct 2026 00:00:00 +0900</pubDate><guid>https://k-dm.work/basic/clustering/k-means1_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;k-means は、&lt;strong&gt;正解ラベルのないデータ&lt;/strong&gt;を「近い点同士」でまとめて \(k\) 個のグループに分ける方法です。やることは 2 つの繰り返しだけで、「各点をいちばん近い&lt;strong&gt;重心&lt;/strong&gt;のグループに入れる」、そして「各グループの重心を&lt;strong&gt;平均の位置&lt;/strong&gt;に動かす」を、重心が動かなくなるまで続けます。良い分け方の基準は「各点と自分のグループの重心との距離が、全体として小さいこと」です。グループの数 \(k\) は人が決めるもので、三日月形のような丸くないかたまりには弱いという限界も知っておきましょう。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="正解のないデータを分ける"&gt;
 正解のないデータを分ける
 
 &lt;a class="anchor" href="#%e6%ad%a3%e8%a7%a3%e3%81%ae%e3%81%aa%e3%81%84%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%88%86%e3%81%91%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://k-dm.work/basic/regression/linear_regression_highschool/"&gt;線形回帰&lt;/a&gt; では「気温→売上」のように&lt;strong&gt;正解（答え）つき&lt;/strong&gt;のデータから予測の直線を作りました。今回はちがいます。たとえば学年全員の「1 日の勉強時間」と「睡眠時間」を散布図にしたとき、&lt;strong&gt;誰がどのタイプか&lt;/strong&gt;という答えはどこにも書いてありません。&lt;/p&gt;
&lt;p&gt;それでも点の集まりを見れば、「よく勉強してよく寝る人たち」「夜ふかし組」のように、いくつかのかたまりが見えてきます。この&lt;strong&gt;かたまりを自動で見つける&lt;/strong&gt;のがクラスタリングで、k-means はその代表です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/clustering/k-means1_block01_ja.png"
 alt="k-means でデータを 3 つのクラスターに分けた結果。色がグループ、×印が各グループの重心"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;h2 id="仕組み重心を置いて動かす"&gt;
 仕組み：重心を置いて、動かす
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e9%87%8d%e5%bf%83%e3%82%92%e7%bd%ae%e3%81%84%e3%81%a6%e5%8b%95%e3%81%8b%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;k-means は、グループの数 \(k\) を先に決めてから動きます。まず重心を \(k\) 個、適当な場所に置きます（最初はランダムでかまいません）。次に、各点をいちばん近い重心のグループに入れます。そして各グループの重心を、そのグループに入った点の平均の位置に動かします。この「入れる」と「動かす」を、重心が動かなくなるまで繰り返せば完成です。上の図の赤い × 印 3 つが、動き終わった重心です。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="重心を k 個（例: 3 個）置く -&amp;gt; 各点をいちばん近い重心へ -&amp;gt; 重心を平均の位置に動かす -&amp;gt; 重心は動いた？ -&amp;gt; 完成 動いた: 各点をいちばん近い重心へ戻る"&gt;
 &lt;div class="flow__row"&gt;&lt;span class="flow__label"&gt;重心を k 個（例&lt;/span&gt;
 &lt;span class="flow__node"&gt;3 個）置く&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;各点をいちばん近い重心へ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;重心を平均の位置に動かす&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;重心は動いた？&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;完成&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;動いた: 各点をいちばん近い重心へ戻る&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-kmeans-0" data-viz-type="steps" data-steps-kind="kmeans" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"手順 0：重心（×印）を 3 個、適当な位置に置く。点にはまだ色（所属）がない。","centroids":[[1.5,2],[3,3.5],[8.5,2]],"points":[[2.27,7.46,-1],[2.3,6.72,-1],[1.66,6.81,-1],[3.5,7.38,-1],[3.43,7.22,-1],[2.86,7.17,-1],[1,7.77,-1],[2.96,7.45,-1],[0.98,5.43,-1],[1.7,6.58,-1],[2.77,6.96,-1],[2.97,6.42,-1],[2.78,7.35,-1],[1.9,8.55,-1],[3,8.08,-1],[1.94,6.33,-1],[2.19,6.9,-1],[3.07,7.22,-1],[6.6,6.64,-1],[6.53,8.6,-1],[6.27,7.72,-1],[7.38,6.16,-1],[7.04,8.68,-1],[5.19,7.21,-1],[6.9,6.76,-1],[7.45,7.44,-1],[5.68,8.25,-1],[7.6,8.35,-1],[8.3,7.83,-1],[7.11,6.33,-1],[7.55,6.95,-1],[6.59,6.36,-1],[6.13,7.02,-1],[8.16,5.67,-1],[5.69,7.72,-1],[8.3,8.02,-1],[3.29,0.23,-1],[5.32,1.84,-1],[3.99,3.38,-1],[5.99,2.64,-1],[5.22,2.89,-1],[6.43,3.06,-1],[5.47,2.99,-1],[3.59,3.65,-1],[5.86,2.98,-1],[3.22,1.93,-1],[5.76,0.87,-1],[4.83,3.42,-1],[3.82,3.95,-1],[5.5,2.36,-1],[5.29,3.08,-1],[5.11,3.53,-1],[4.4,2.13,-1],[5.94,2.52,-1]]},{"caption":"反復 1・割り当て：各点を、いちばん近い重心の色に塗る。","centroids":[[1.5,2],[3,3.5],[8.5,2]],"metrics":{"wcss":844},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,1],[6.53,8.6,1],[6.27,7.72,1],[7.38,6.16,2],[7.04,8.68,1],[5.19,7.21,1],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,1],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,1],[6.13,7.02,1],[8.16,5.67,2],[5.69,7.72,1],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,1],[3.99,3.38,1],[5.99,2.64,2],[5.22,2.89,1],[6.43,3.06,2],[5.47,2.99,1],[3.59,3.65,1],[5.86,2.98,2],[3.22,1.93,1],[5.76,0.87,2],[4.83,3.42,1],[3.82,3.95,1],[5.5,2.36,1],[5.29,3.08,1],[5.11,3.53,1],[4.4,2.13,1],[5.94,2.52,2]]},{"arrows":[[[1.5,2],[3.29,0.23]],[[3,3.5],[3.97,5.93]],[[8.5,2],[7.05,5.4]]],"caption":"反復 1・更新：各色の点の平均の位置へ重心を動かす（破線の矢印）。","centroids":[[3.29,0.23],[3.97,5.93],[7.05,5.4]],"metrics":{"wcss":844},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,1],[6.53,8.6,1],[6.27,7.72,1],[7.38,6.16,2],[7.04,8.68,1],[5.19,7.21,1],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,1],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,1],[6.13,7.02,1],[8.16,5.67,2],[5.69,7.72,1],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,1],[3.99,3.38,1],[5.99,2.64,2],[5.22,2.89,1],[6.43,3.06,2],[5.47,2.99,1],[3.59,3.65,1],[5.86,2.98,2],[3.22,1.93,1],[5.76,0.87,2],[4.83,3.42,1],[3.82,3.95,1],[5.5,2.36,1],[5.29,3.08,1],[5.11,3.53,1],[4.4,2.13,1],[5.94,2.52,2]]},{"caption":"反復 2・割り当て：各点を、いちばん近い重心の色に塗る。","centroids":[[3.29,0.23],[3.97,5.93],[7.05,5.4]],"metrics":{"wcss":292.7},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,2],[6.53,8.6,2],[6.27,7.72,2],[7.38,6.16,2],[7.04,8.68,2],[5.19,7.21,1],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,1],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,2],[6.13,7.02,2],[8.16,5.67,2],[5.69,7.72,1],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,0],[3.99,3.38,1],[5.99,2.64,2],[5.22,2.89,2],[6.43,3.06,2],[5.47,2.99,2],[3.59,3.65,1],[5.86,2.98,2],[3.22,1.93,0],[5.76,0.87,0],[4.83,3.42,1],[3.82,3.95,1],[5.5,2.36,0],[5.29,3.08,2],[5.11,3.53,1],[4.4,2.13,0],[5.94,2.52,2]]},{"arrows":[[[3.29,0.23],[4.58,1.56]],[[3.97,5.93],[3.12,6.5]],[[7.05,5.4],[6.73,5.85]]],"caption":"反復 2・更新：各色の点の平均の位置へ重心を動かす（破線の矢印）。","centroids":[[4.58,1.56],[3.12,6.5],[6.73,5.85]],"metrics":{"wcss":292.7},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,2],[6.53,8.6,2],[6.27,7.72,2],[7.38,6.16,2],[7.04,8.68,2],[5.19,7.21,1],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,1],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,2],[6.13,7.02,2],[8.16,5.67,2],[5.69,7.72,1],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,0],[3.99,3.38,1],[5.99,2.64,2],[5.22,2.89,2],[6.43,3.06,2],[5.47,2.99,2],[3.59,3.65,1],[5.86,2.98,2],[3.22,1.93,0],[5.76,0.87,0],[4.83,3.42,1],[3.82,3.95,1],[5.5,2.36,0],[5.29,3.08,2],[5.11,3.53,1],[4.4,2.13,0],[5.94,2.52,2]]},{"caption":"反復 3・割り当て：各点を、いちばん近い重心の色に塗る。","centroids":[[4.58,1.56],[3.12,6.5],[6.73,5.85]],"metrics":{"wcss":156.7},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,2],[6.53,8.6,2],[6.27,7.72,2],[7.38,6.16,2],[7.04,8.68,2],[5.19,7.21,2],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,2],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,2],[6.13,7.02,2],[8.16,5.67,2],[5.69,7.72,2],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,0],[3.99,3.38,0],[5.99,2.64,0],[5.22,2.89,0],[6.43,3.06,0],[5.47,2.99,0],[3.59,3.65,0],[5.86,2.98,0],[3.22,1.93,0],[5.76,0.87,0],[4.83,3.42,0],[3.82,3.95,0],[5.5,2.36,0],[5.29,3.08,0],[5.11,3.53,0],[4.4,2.13,0],[5.94,2.52,0]]},{"arrows":[[[4.58,1.56],[4.95,2.64]],[[3.12,6.5],[2.4,7.1]],[[6.73,5.85],[6.92,7.32]]],"caption":"反復 3・更新：各色の点の平均の位置へ重心を動かす（破線の矢印）。","centroids":[[4.95,2.64],[2.4,7.1],[6.92,7.32]],"metrics":{"wcss":156.7},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,2],[6.53,8.6,2],[6.27,7.72,2],[7.38,6.16,2],[7.04,8.68,2],[5.19,7.21,2],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,2],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,2],[6.13,7.02,2],[8.16,5.67,2],[5.69,7.72,2],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,0],[3.99,3.38,0],[5.99,2.64,0],[5.22,2.89,0],[6.43,3.06,0],[5.47,2.99,0],[3.59,3.65,0],[5.86,2.98,0],[3.22,1.93,0],[5.76,0.87,0],[4.83,3.42,0],[3.82,3.95,0],[5.5,2.36,0],[5.29,3.08,0],[5.11,3.53,0],[4.4,2.13,0],[5.94,2.52,0]]},{"caption":"収束：重心が動かなくなった。まとまりの悪さ（WCSS）が最小になった配置。","centroids":[[4.95,2.64],[2.4,7.1],[6.92,7.32]],"metrics":{"wcss":78.3},"points":[[2.27,7.46,1],[2.3,6.72,1],[1.66,6.81,1],[3.5,7.38,1],[3.43,7.22,1],[2.86,7.17,1],[1,7.77,1],[2.96,7.45,1],[0.98,5.43,1],[1.7,6.58,1],[2.77,6.96,1],[2.97,6.42,1],[2.78,7.35,1],[1.9,8.55,1],[3,8.08,1],[1.94,6.33,1],[2.19,6.9,1],[3.07,7.22,1],[6.6,6.64,2],[6.53,8.6,2],[6.27,7.72,2],[7.38,6.16,2],[7.04,8.68,2],[5.19,7.21,2],[6.9,6.76,2],[7.45,7.44,2],[5.68,8.25,2],[7.6,8.35,2],[8.3,7.83,2],[7.11,6.33,2],[7.55,6.95,2],[6.59,6.36,2],[6.13,7.02,2],[8.16,5.67,2],[5.69,7.72,2],[8.3,8.02,2],[3.29,0.23,0],[5.32,1.84,0],[3.99,3.38,0],[5.99,2.64,0],[5.22,2.89,0],[6.43,3.06,0],[5.47,2.99,0],[3.59,3.65,0],[5.86,2.98,0],[3.22,1.93,0],[5.76,0.87,0],[4.83,3.42,0],[3.82,3.95,0],[5.5,2.36,0],[5.29,3.08,0],[5.11,3.53,0],[4.4,2.13,0],[5.94,2.52,0]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-kmeans-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;数学との接点&lt;/strong&gt;：「近い」は 2 点間の距離 \(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\) で測ります。「平均の位置」は、グループ内の点の \(x\) 座標の平均と \(y\) 座標の平均を並べた点です。つまり使っているのは、数学 I の三平方の定理と平均の 2 つだけです。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="良い分け方をどう決める"&gt;
 「良い分け方」をどう決める？
 
 &lt;a class="anchor" href="#%e8%89%af%e3%81%84%e5%88%86%e3%81%91%e6%96%b9%e3%82%92%e3%81%a9%e3%81%86%e6%b1%ba%e3%82%81%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;正解がないので、k-means は自分で基準を持っています。&lt;/p&gt;</description></item><item><title>線形回帰ってなに？ | 高校生向けにやさしく解説（数式は一次関数まで）</title><link>https://k-dm.work/basic/regression/linear_regression_highschool/</link><pubDate>Sat, 31 Oct 2026 00:00:00 +0900</pubDate><guid>https://k-dm.work/basic/regression/linear_regression_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;線形回帰は、散らばった点のまん中に「いちばん当てはまる直線 \(y = ax + b\)」を引いて、まだ見ていない \(x\) に対する \(y\) を予測する方法です。「いちばん当てはまる」の基準は、各点と直線のズレ（残差）を 2 乗して全部足した値を最小にすることで、これを&lt;strong&gt;最小二乗法&lt;/strong&gt;と呼びます。傾き \(a\) は「\(x\) が 1 増えると \(y\) がどれだけ変わるか」、切片 \(b\) は「\(x = 0\) のときの \(y\)」と読みます。このページでは気温とアイスの売上 5 日分を例に、平均だけを使って傾き 4.7、切片 −74 を手計算し、31 ℃ の日の売上を予測します。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭で、気温とアイスの売上を 10 日分メモしたとします。横軸に気温、縦軸に売上をとって 10 個の点を打つと、右上がりにばらついた点の集まりになります。&lt;/p&gt;
&lt;p&gt;ここで「明日の予想気温は 31 ℃。アイスは何個仕込めばいい？」と聞かれたら、どう答えますか。点の集まりの&lt;strong&gt;まん中を通る直線を 1 本引いて、その直線を 31 ℃ まで延長して読む&lt;/strong&gt;。これが線形回帰の発想です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/regression/linear-regression_block01_ja.png"
 alt="散布図とそれに当てはめた回帰直線（オレンジの×が観測データ、青い線が回帰直線）"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図では、×印がメモした点、青い直線が「いちばん当てはまる直線」です。&lt;/p&gt;
&lt;h2 id="いちばん当てはまるをどう決める"&gt;
 「いちばん当てはまる」をどう決める？
 
 &lt;a class="anchor" href="#%e3%81%84%e3%81%a1%e3%81%b0%e3%82%93%e5%bd%93%e3%81%a6%e3%81%af%e3%81%be%e3%82%8b%e3%82%92%e3%81%a9%e3%81%86%e6%b1%ba%e3%82%81%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;直線は無数に引けます。そこで&lt;strong&gt;基準&lt;/strong&gt;を決めます。まず、各点から直線までの縦方向のズレ（&lt;strong&gt;残差&lt;/strong&gt;）を測ります。次に、そのズレを 2 乗します。プラスのズレとマイナスのズレが打ち消し合わないようにするためで、残差 4 の点は残差 1 の点の 16 倍重く数えられる効果もあります。最後に 2 乗したズレを全部足します。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="各点と直線の縦のズレ（残差）を測る -&amp;gt; ズレを 2 乗する -&amp;gt; 全部足す -&amp;gt; 合計がいちばん小さい直線を選ぶ"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;各点と直線の縦のズレ（残差）を測る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ズレを 2 乗する&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;全部足す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;合計がいちばん小さい直線を選ぶ&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;この合計（残差の 2 乗和）が&lt;strong&gt;いちばん小さくなる直線&lt;/strong&gt;を選びます。「ズレの 2 乗の合計を最小にする」をそのまま読んだ名前が「最小二乗法」です。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-leastsq-0" data-viz-type="steps" data-steps-kind="leastsq" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"候補 1：直線 y = 0.2x + 12.0。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,12],[10,14]],"metrics":{"sse":264},"squares":[[1,3.17,-9.03],[1.89,7.03,-5.35],[2.78,4.88,-7.68],[3.67,10.12,-2.61],[4.56,9.64,-3.27],[5.44,11.42,-1.67],[6.33,17.09,3.82],[7.22,15.73,2.28],[8.11,17.14,3.52],[9,20.31,6.51]]},{"caption":"候補 2：直線 y = 0.36x + 11.92。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.92],[10,15.57]],"metrics":{"sse":251.4},"squares":[[1,3.17,-9.11],[1.89,7.03,-5.58],[2.78,4.88,-8.05],[3.67,10.12,-3.14],[4.56,9.64,-3.94],[5.44,11.42,-2.49],[6.33,17.09,2.86],[7.22,15.73,1.17],[8.11,17.14,2.27],[9,20.31,5.11]]},{"caption":"候補 3：直線 y = 0.4x + 11.72。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.72],[10,15.77]],"metrics":{"sse":242.6},"squares":[[1,3.17,-8.95],[1.89,7.03,-5.46],[2.78,4.88,-7.96],[3.67,10.12,-3.08],[4.56,9.64,-3.92],[5.44,11.42,-2.5],[6.33,17.09,2.8],[7.22,15.73,1.09],[8.11,17.14,2.14],[9,20.31,4.95]]},{"caption":"候補 4：直線 y = 0.48x + 11.28。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.28],[10,16.03]],"metrics":{"sse":224},"squares":[[1,3.17,-8.58],[1.89,7.03,-5.15],[2.78,4.88,-7.72],[3.67,10.12,-2.9],[4.56,9.64,-3.8],[5.44,11.42,-2.45],[6.33,17.09,2.8],[7.22,15.73,1.02],[8.11,17.14,2.01],[9,20.31,4.76]]},{"caption":"候補 5：直線 y = 0.66x + 10.14。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,10.14],[10,16.71]],"metrics":{"sse":180.2},"squares":[[1,3.17,-7.63],[1.89,7.03,-4.36],[2.78,4.88,-7.09],[3.67,10.12,-2.43],[4.56,9.64,-3.49],[5.44,11.42,-2.3],[6.33,17.09,2.79],[7.22,15.73,0.84],[8.11,17.14,1.68],[9,20.31,4.26]]},{"caption":"候補 6：直線 y = 1.11x + 7.32。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,7.32],[10,18.39]],"metrics":{"sse":94},"squares":[[1,3.17,-5.25],[1.89,7.03,-2.38],[2.78,4.88,-5.51],[3.67,10.12,-1.26],[4.56,9.64,-2.72],[5.44,11.42,-1.93],[6.33,17.09,2.75],[7.22,15.73,0.41],[8.11,17.14,0.84],[9,20.31,3.03]]},{"caption":"最小二乗解 y = 2.06x + 1.36：正方形の面積の合計がいちばん小さい直線。","curve":[[0,1.36],[10,21.95]],"metrics":{"sse":20.5},"squares":[[1,3.17,-0.25],[1.89,7.03,1.78],[2.78,4.88,-2.2],[3.67,10.12,1.21],[4.56,9.64,-1.09],[5.44,11.42,-1.15],[6.33,17.09,2.69],[7.22,15.73,-0.5],[8.11,17.14,-0.91],[9,20.31,0.42]]}],"points":[[1,3.17,-1],[1.89,7.03,-1],[2.78,4.88,-1],[3.67,10.12,-1],[4.56,9.64,-1],[5.44,11.42,-1],[6.33,17.09,-1],[7.22,15.73,-1],[8.11,17.14,-1],[9,20.31,-1]],"x_range":[0,10],"y_range":[0,25]};
 var id = 'viz-steps-leastsq-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;数学Iとのつながり&lt;/strong&gt;：相関係数 \(r\) が「直線っぽさの強さ」（−1 〜 1）を表すのに対して、線形回帰は「その直線の式」を求めます。実は傾き \(a\) は、\(x\) と \(y\) の共分散を \(x\) の分散で割ったものです。データの分析で習う量が、そのまま予測の道具になっています。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="直線の式はこう決まる"&gt;
 直線の式はこう決まる
 
 &lt;a class="anchor" href="#%e7%9b%b4%e7%b7%9a%e3%81%ae%e5%bc%8f%e3%81%af%e3%81%93%e3%81%86%e6%b1%ba%e3%81%be%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;一次関数の形で書くと&lt;/p&gt;</description></item><item><title>層化抽出ってなに？ | 高校生向けにやさしく解説（グループの比率を保ったまま標本を選ぶ）</title><link>https://k-dm.work/prep/sampling/stratified_sampling_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/prep/sampling/stratified_sampling_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;層化抽出は、母集団を&lt;strong&gt;学年や地域などのグループ（層）に分け、各層から母集団と同じ比率になるように人数を割り振って、層の中では無作為に選ぶ&lt;/strong&gt;抽出法です。単純な無作為抽出では「たまたま 3 年生が少なすぎる」ような偶然の偏りが起きますが、層化抽出は&lt;strong&gt;比率を先に固定する&lt;/strong&gt;のでその偏りが消えます。機械学習では、正解ラベルの比率を保ったまま訓練データとテストデータに分ける操作（&lt;code&gt;stratify&lt;/code&gt;）として毎日のように使われています。ただし層の分け方が調べたいことと無関係なら、効果はほとんどありません。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;生徒会が「文化祭の満足度アンケート」を全校 600 人のうち 60 人に取ることになりました。学年の人数は 1 年 300 人、2 年 200 人、3 年 100 人です。&lt;/p&gt;
&lt;p&gt;名簿から 60 人をくじで選ぶと、3 年生は何人になるでしょう。比率どおりなら \(60 \times 100/600 = 10\) 人です。しかし、くじですから毎回 10 人になるわけではありません。確率で考えると、1 人が 3 年生である確率は \(1/6\) なので、60 人の中の 3 年生の人数は&lt;strong&gt;平均 10 人、標準偏差およそ 2.9 人&lt;/strong&gt;。つまり、ふつうに起こる範囲で&lt;strong&gt;4 人から 16 人まで揺れます&lt;/strong&gt;。3 年生だけが文化祭に不満だったとしても、4 人しか選ばれなければその声は埋もれてしまいます。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;母集団&lt;/th&gt;
 &lt;th style="text-align: center"&gt;比率&lt;/th&gt;
 &lt;th style="text-align: center"&gt;単純な無作為抽出（60 人）&lt;/th&gt;
 &lt;th style="text-align: center"&gt;層化抽出（60 人）&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;1 年&lt;/td&gt;
 &lt;td style="text-align: center"&gt;300&lt;/td&gt;
 &lt;td style="text-align: center"&gt;50 %&lt;/td&gt;
 &lt;td style="text-align: center"&gt;25〜35 人くらいで揺れる&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;30 人&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;2 年&lt;/td&gt;
 &lt;td style="text-align: center"&gt;200&lt;/td&gt;
 &lt;td style="text-align: center"&gt;33 %&lt;/td&gt;
 &lt;td style="text-align: center"&gt;14〜26 人くらいで揺れる&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;20 人&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;3 年&lt;/td&gt;
 &lt;td style="text-align: center"&gt;100&lt;/td&gt;
 &lt;td style="text-align: center"&gt;17 %&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4〜16 人くらいで揺れる&lt;/td&gt;
 &lt;td style="text-align: center"&gt;&lt;strong&gt;10 人&lt;/strong&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;右の列が層化抽出です。&lt;strong&gt;学年ごとの人数を 30・20・10 と最初に決めてしまい、各学年の中だけでくじを引く&lt;/strong&gt;。4〜16 人と揺れていた 3 年生の人数が、毎回ぴたりと 10 人になります。&lt;/p&gt;
&lt;h2 id="仕組み先に割り振りあとでくじ"&gt;
 仕組み：先に割り振り、あとでくじ
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%85%88%e3%81%ab%e5%89%b2%e3%82%8a%e6%8c%af%e3%82%8a%e3%81%82%e3%81%a8%e3%81%a7%e3%81%8f%e3%81%98"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、層を決めます。全員が必ずどこか 1 つに入る分け方（学年・クラス・地域など）を選びます。次に、各層の人数を母集団の比率（50 %・33 %・17 %）どおりに割り振ります。標本の大きさ \(n\) に層の比率 \(N_h / N\) を掛けて \(n_h = n \times N_h / N\) とする計算です。続けて、各層の中で無作為抽出します。1 年の名簿から 30 人、2 年から 20 人、3 年から 10 人を、それぞれくじで選びます。最後に全部合わせて 60 人の標本にすると、学年の比率は母集団と同じで、層の中はくじなのでほかの偏りも入りません。&lt;/p&gt;



&lt;div class="mermaid"
 align="center"&gt;
flowchart LR
 A[&amp;#34;母集団 600 人&amp;#34;] --&amp;gt; B[&amp;#34;1 年 300 人&amp;#34;]
 A --&amp;gt; C[&amp;#34;2 年 200 人&amp;#34;]
 A --&amp;gt; D[&amp;#34;3 年 100 人&amp;#34;]
 B --&amp;gt;|&amp;#34;くじで 30 人&amp;#34;| E[&amp;#34;標本 60 人&amp;#34;]
 C --&amp;gt;|&amp;#34;くじで 20 人&amp;#34;| E
 D --&amp;gt;|&amp;#34;くじで 10 人&amp;#34;| E
&lt;/div&gt;

&lt;p&gt;学年ごとの割り振りを、そのまま Python で計算してみます。&lt;/p&gt;</description></item><item><title>StandardScaler ってなに？ | 高校生向けにやさしく解説（偏差値の考え方）</title><link>https://k-dm.work/prep/numerical/standardscaler_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/prep/numerical/standardscaler_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;StandardScaler は、各項目から&lt;strong&gt;平均を引き、標準偏差で割る&lt;/strong&gt;ことで、どの項目も&lt;strong&gt;平均 0・標準偏差 1&lt;/strong&gt; にそろえる変換です（標準化）。変換後の値 \(z\) は「平均から標準偏差いくつ分離れているか」を表し、高校で習う&lt;strong&gt;偏差値&lt;/strong&gt;は \(50 + 10z\) なので中身は同じ計算です。散布図でいえば、点のかたまりが&lt;strong&gt;原点に移動し、縦横の広がりが同じ 1 になる&lt;/strong&gt;だけで、点どうしの並び方（相関の形）は変わりません。距離や内積で「近さ」を測るモデルに入れる前に、項目ごとの単位の差を消すために使います。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;数学と英語のテストが返ってきました。どちらも 80 点です。素直に喜んでいいでしょうか。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;自分の点&lt;/th&gt;
 &lt;th style="text-align: center"&gt;クラス平均&lt;/th&gt;
 &lt;th style="text-align: center"&gt;標準偏差&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;数学&lt;/td&gt;
 &lt;td style="text-align: center"&gt;80&lt;/td&gt;
 &lt;td style="text-align: center"&gt;60&lt;/td&gt;
 &lt;td style="text-align: center"&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;英語&lt;/td&gt;
 &lt;td style="text-align: center"&gt;80&lt;/td&gt;
 &lt;td style="text-align: center"&gt;70&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;数学は平均より 20 点上ですが、クラス全体が 20 点幅でばらついているので「標準偏差 1 個分だけ上」。英語は平均より 10 点上なだけですが、全員が 70 点前後に固まっている中での 10 点差なので「標準偏差 2 個分も上」。&lt;strong&gt;同じ 80 点でも、英語のほうがはるかに目立つ成績&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;「平均からの差を、散らばりの大きさで割る」と、科目ごとの難しさや点数の散らばりのちがいを消して比べられます。StandardScaler がやっているのは、この偏差値の計算をデータの全項目にいっせいに行うことです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/prep/numerical/standardscaler-ja_block01_ja.png"
 alt="変換前は身長 cm と体重 kg の散布図で点のかたまりが (170, 65) 付近に斜めに広がっているが、StandardScaler 適用後は同じ形のかたまりが原点 (0, 0) を中心に移動し、縦横ともに -3〜3 の範囲に収まっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図の左は、身長（cm）と体重（kg）の散布図です。点のかたまりは横軸 170・縦軸 65 のあたりに浮いていて、横軸と縦軸の目盛りの意味もちがいます。右が変換後。&lt;strong&gt;かたまりがそのまま原点 (0, 0) に引っ越し、横も縦も「−3〜3」の同じ目盛り&lt;/strong&gt;になりました。点の並び方（かたまりの形）は左右でまったく同じで、変わったのは目盛りが cm・kg から z スコアになったことだけです。&lt;/p&gt;
&lt;h2 id="仕組み平均を引いて標準偏差で割る"&gt;
 仕組み：平均を引いて、標準偏差で割る
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%b9%b3%e5%9d%87%e3%82%92%e5%bc%95%e3%81%84%e3%81%a6%e6%a8%99%e6%ba%96%e5%81%8f%e5%b7%ae%e3%81%a7%e5%89%b2%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、項目ごとに平均 \(\mu\) を求めます。散布図では、かたまりの中心の位置です。次に、すべての点から \(\mu\) を引きます。かたまりがまるごと平行移動して中心が 0 に来る操作で、これを中心化といい、形は変わりません。続けて、標準偏差 \(\sigma\) を求めてそれで割ります。かたまりの広がりが横方向・縦方向ともに 1 に伸び縮みし、広がりの大きかった項目は縮み、小さかった項目は引き伸ばされます。最後に、できた値を z スコアと呼びます。\(z = 1\) なら「平均より標準偏差 1 個分だけ上」、\(z = -2\) なら「2 個分下」と読みます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="項目ごとに平均 μ を求める -&amp;gt; すべての点から μ を引く（中心が 0 に） -&amp;gt; 標準偏差 σ で割る（広がりが 1 に） -&amp;gt; できた値を z スコアと呼ぶ"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;項目ごとに平均 μ を求める&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;すべての点から μ を引く（中心が 0 に）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;標準偏差 σ で割る（広がりが 1 に）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;できた値を z スコアと呼ぶ&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

$$
z = \frac{x - \mu}{\sigma}
$$&lt;p&gt;さきほどのテストなら、数学は \(z = (80-60)/20 = 1\)、英語は \(z = (80-70)/5 = 2\)。偏差値に直すと 60 と 70 です。5 人の点数で、この式をそのまま計算してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 平均 70&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mean =&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sd =&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# mean = 70.0 sd = 16.43&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# [-1.52, -0.61, 0.0, 0.91, 1.22]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;平均がかたまりの中心&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sum(scores) / len(scores)&lt;/code&gt; で平均 70 を求めます。この 70 を全員から引くことで、70 点の人がちょうど 0、それより上の人がプラス、下の人がマイナスになります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;標準偏差は「ずれの 2 乗の平均」の平方根&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(s - m) ** 2&lt;/code&gt; が各人の平均からのずれの 2 乗、その平均が分散（約 270）、&lt;code&gt;** 0.5&lt;/code&gt; で平方根を取ると標準偏差 16.43 です。数学Iで習う定義どおりの計算で、この値が「1 目盛りの長さ」になります。scikit-learn の &lt;code&gt;StandardScaler&lt;/code&gt; も既定ではこの &lt;code&gt;len(scores)&lt;/code&gt; で割る式（母標準偏差）を使います。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;引いて割れば z スコア&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(s - m) / sd&lt;/code&gt; が本文の式 \(z = (x - \mu)/\sigma\) そのものです。全員に同じ引き算と割り算をするので、点数の順位も、点差の比も変わりません。偏差値にしたいなら、この値を 10 倍して 50 を足すだけです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="6"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;6 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;結果は平均 0 のまわりに散る&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;出力 &lt;code&gt;[-1.52, -0.61, 0.0, 0.91, 1.22]&lt;/code&gt; を見ると、70 点の人が 0、90 点の人が 1.22（偏差値 62.2）です。5 つの z を足すとちょうど 0 になります。平均を引いたので、プラスとマイナスが必ず打ち消し合うからです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>決定係数 R² | 高校生向けにやさしく解説（ばらつきをどれだけ説明できたか）</title><link>https://k-dm.work/eval/regression/r2_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/regression/r2_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;決定係数 \(R^2\) は、「平均だけで予測する」という&lt;strong&gt;いちばん単純な予測&lt;/strong&gt;と比べて、モデルがズレを&lt;strong&gt;どれだけ減らせたか&lt;/strong&gt;の割合です。式は \(R^2 = 1 - \dfrac{\text{モデルのズレの 2 乗和}}{\text{平均からのズレの 2 乗和}}\) で、1 なら完璧、0 なら平均と同じ、負なら平均より悪いと読みます。「予測」を縦軸、「正解」を横軸にした散布図で、点が対角線に寄るほど \(R^2\) は 1 に近づき、5 日分の売上の例では 0.973 になります。直線 1 本の回帰では \(R^2\) は相関係数 \(r\) の 2 乗なので、\(r = 0.9\) なら 0.81 です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;気温からアイスの売上を予測する直線を引きました。「この直線、どのくらい当たっている？」と聞かれたら、何と答えますか。「平均で 3 個外れる」でもよいのですが、3 個が大きいのか小さいのかは売上のばらつき次第です。そこで、&lt;strong&gt;何もモデルを作らなかったときと比べる&lt;/strong&gt;のが決定係数の考え方です。&lt;/p&gt;
&lt;p&gt;モデルを作らなければ、いちばんましな予測は「毎日、平均の売上 \(\bar{y}\) と答える」ことで、5 日分の例なら毎日 62.4 個と答えます。そのときのズレの 2 乗和と、直線で予測したときのズレの 2 乗和を比べます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/regression/r2_files/r2_6_1.png"
 alt="正解を横軸、予測を縦軸にとった散布図。点が対角線（予測＝正解）に沿ってまっすぐ並び、R² は約 0.93"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、横軸が正解、縦軸がモデルの予測です。うすい対角線が「予測＝正解」の線で、点がこの線の近くに並ぶほど予測は正確です。この例では点がきれいに対角線に沿っていて、\(R^2\) は約 0.93。「正解のばらつきの 93% を説明できた」と読みます。&lt;/p&gt;
&lt;h2 id="仕組み平均という基準線と比べる"&gt;
 仕組み：平均という「基準線」と比べる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%b9%b3%e5%9d%87%e3%81%a8%e3%81%84%e3%81%86%e5%9f%ba%e6%ba%96%e7%b7%9a%e3%81%a8%e6%af%94%e3%81%b9%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず&lt;strong&gt;基準線を引きます&lt;/strong&gt;。もとの散布図（横軸に気温、縦軸に売上）に、平均の売上 \(\bar{y}\) の高さで横一直線を引き、各点からこの横線までの縦のズレを 2 乗して足した値が「平均からのズレの 2 乗和」です。これは \(y\) の&lt;strong&gt;分散 × データ数&lt;/strong&gt;にほかなりません。次に&lt;strong&gt;モデルの直線で測り直します&lt;/strong&gt;。同じ点から回帰直線までの縦のズレ（残差）を 2 乗して足します。そして&lt;strong&gt;割り算して 1 から引きます&lt;/strong&gt;。モデルのズレの 2 乗和 ÷ 平均からのズレの 2 乗和 が「残ったズレの割合」で、1 からそれを引いた値が \(R^2\)、つまり「減らせたズレの割合」です。&lt;/p&gt;
&lt;p&gt;直線を動かすと値の意味が見えます。直線が点のまん中を正確に通るほど残差は小さくなり、\(R^2\) は 1 に近づき、予測対正解の散布図では点が対角線に吸い寄せられていきます。逆に直線を平均の横線に重ねると、分子と分母が同じになって \(R^2 = 0\) です。さらに直線をあさっての方向に傾けると、残差が平均より大きくなって \(R^2\) は&lt;strong&gt;負&lt;/strong&gt;になります。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/regression/r2_files/r2_12_1.png"
 alt="正解を横軸、予測を縦軸にとった散布図。予測がほぼ一定の値に張りついて横に寝ており、対角線とまったく合っていない。R² は約 −0.38"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図が負になった例です。正解は −5 から 7 まで広がっているのに、予測は 1 付近に張りついて横に寝ています。平均を答え続けるよりも外れているので、\(R^2\) は −0.38 になりました。&lt;/p&gt;
&lt;p&gt;手計算の確認用に、5 日分のデータで \(R^2\) を出すコードを置いておきます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 実際の売上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 直線による予測&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ss_res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# 直線からのズレの 2 乗和&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ss_tot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 平均からのズレの 2 乗和&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;R2 = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ss_res&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ss_tot&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.3f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;5 日分の正解と直線の予測&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;y&lt;/code&gt; が実際の売上、&lt;code&gt;pred&lt;/code&gt; が直線で予測した売上です。ズレは 2, 1, 2, 2, 4 と小さく、直線がよく当たっている例になっています。&lt;code&gt;pred&lt;/code&gt; の値を書き換えるだけで、当たり方が変わると \(R^2\) がどう動くかを試せます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3, 5"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3, 5 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;分母は「平均からのズレの 2 乗和」&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;mean&lt;/code&gt; は 5 日の平均 62.4 で、&lt;code&gt;ss_tot&lt;/code&gt; は各日の売上から 62.4 を引いて 2 乗し、足したものです。これが「モデルなしで平均を答え続けたときのズレ」で、\(y\) の分散に 5 を掛けた値と同じになります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;分子は「直線からのズレの 2 乗和」&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;ss_res&lt;/code&gt; は &lt;code&gt;zip(y, pred)&lt;/code&gt; で正解と予測を 1 日ずつ組にし、差を 2 乗して足したものです。2² + 1² + 2² + 2² + 4² = 29 で、直線がどれだけ外したかの合計です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="6"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;6 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;1 から割合を引いて R² にする&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;1 - ss_res / ss_tot&lt;/code&gt; が定義そのものです。29 を分母で割った「残ったズレの割合」が約 0.027 なので、\(R^2\) は 0.973 になります。&lt;code&gt;pred&lt;/code&gt; をすべて &lt;code&gt;62.4&lt;/code&gt; にすると &lt;code&gt;ss_res&lt;/code&gt; と &lt;code&gt;ss_tot&lt;/code&gt; が同じになって 0 と表示されます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;出力は &lt;code&gt;R2 = 0.973&lt;/code&gt; です。&lt;code&gt;pred&lt;/code&gt; をすべて &lt;code&gt;62.4&lt;/code&gt;（平均）にすると 0 になることも確かめられます。&lt;/p&gt;</description></item><item><title>適合率と再現率 | 高校生向けにやさしく解説（誤報と見逃しを別々に測る）</title><link>https://k-dm.work/eval/classification/precision-recall/precision-recall_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/classification/precision-recall/precision-recall_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;&lt;strong&gt;適合率&lt;/strong&gt;（Precision）は「陽性と判定したもののうち、本当に陽性だった割合」で、&lt;strong&gt;誤報の少なさ&lt;/strong&gt;を表します。&lt;strong&gt;再現率&lt;/strong&gt;（Recall）は「本当に陽性のもののうち、見つけられた割合」で、&lt;strong&gt;見逃しの少なさ&lt;/strong&gt;を表します。どちらも分子は同じ「正しく見つけた数（真陽性）」で、&lt;strong&gt;分母がちがう&lt;/strong&gt;だけです。しきい値（判定の線）を動かすと片方が上がればもう片方が下がり、その関係を全部の線について描いた曲線が PR 曲線です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;砂浜に 20 枚のコインが埋まっていて、金属探知機で探すゲームをします。探知機が「ピッ」と鳴った場所を掘ると、本物のコインのこともあれば、くぎや空きかんのこともあります。&lt;/p&gt;
&lt;p&gt;1 回目の結果は次のとおりでした。鳴った場所は 25 か所、掘ってみたら本物が 15 枚、はずれが 10 か所。埋まっている 20 枚のうち 5 枚は鳴らずに見つけられませんでした。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;鳴った&lt;/th&gt;
 &lt;th style="text-align: center"&gt;鳴らなかった&lt;/th&gt;
 &lt;th style="text-align: center"&gt;合計&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;本物のコイン&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;15（真陽性）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5（見逃し）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;20&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;コインではない&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;10（誤報）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;—&lt;/td&gt;
 &lt;td style="text-align: center"&gt;—&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;この探知機の「腕前」を 2 つの見方で採点します。&lt;/p&gt;
$$
\text{適合率} = \frac{15}{15 + 10} = 0.60, \qquad
\text{再現率} = \frac{15}{15 + 5} = 0.75
$$&lt;p&gt;適合率 0.60 は&lt;strong&gt;鳴った 25 か所を全体として&lt;/strong&gt;、6 割が本物だったという「掘り損の少なさ」です。再現率 0.75 は&lt;strong&gt;埋まっている 20 枚を全体として&lt;/strong&gt;、75% を回収したという「取りこぼしの少なさ」です。分子はどちらも本物を掘り当てた 15 で、何を分母にするかだけがちがいます。&lt;/p&gt;
&lt;h2 id="仕組みダイヤルを回すと-2-つの数が逆に動く"&gt;
 仕組み：ダイヤルを回すと 2 つの数が逆に動く
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%83%80%e3%82%a4%e3%83%a4%e3%83%ab%e3%82%92%e5%9b%9e%e3%81%99%e3%81%a8-2-%e3%81%a4%e3%81%ae%e6%95%b0%e3%81%8c%e9%80%86%e3%81%ab%e5%8b%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;探知機には感度のダイヤルがあります。機械学習でいう&lt;strong&gt;しきい値&lt;/strong&gt;は、このダイヤルの位置のことです。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="各地点に「コインらしさ」の点数をつける -&amp;gt; ダイヤルの位置（しきい値）で線を引く -&amp;gt; 線を超えた地点だけ「鳴る」 -&amp;gt; 適合率と再現率を数える -&amp;gt; ダイヤルを回して点を打つ -&amp;gt; PR 曲線"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;各地点に「コインらしさ」の点数をつける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ダイヤルの位置（しきい値）で線を引く&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;線を超えた地点だけ「鳴る」&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;適合率と再現率を数える&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ダイヤルを回して点を打つ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;PR 曲線&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;まず、探知機（モデル）は各地点に「コインらしさ」の点数をつけます。次に、ダイヤルの位置がしきい値になり、点数が線を超えた地点だけ「鳴る」（陽性判定）と決まります。ここで感度を上げる（しきい値を下げる）と、鳴る場所が 25 か所から 40 か所に増え、本物 19 枚・はずれ 21 か所になったとします。再現率は 19/20 = 0.95 に&lt;strong&gt;上がり&lt;/strong&gt;、適合率は 19/40 ≒ 0.48 に&lt;strong&gt;下がります&lt;/strong&gt;。見逃しは 5 枚から 1 枚に減ったが、掘り損は 10 か所から 21 か所に増えた、というわけです。逆に感度を下げる（しきい値を上げる）と、鳴る場所が 10 か所、本物 9 枚・はずれ 1 か所のようになり、適合率は 0.90 に上がって再現率は 9/20 = 0.45 に下がります。最後に、横軸に再現率、縦軸に適合率をとって 3 つの設定を打つと (0.45, 0.90)・(0.75, 0.60)・(0.95, 0.48) と&lt;strong&gt;右下がり&lt;/strong&gt;に並び、ダイヤルを細かく回しながら全部つなぐと下の図のような &lt;strong&gt;PR 曲線&lt;/strong&gt;になります。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/classification/precision-recall/pr_curve.png"
 alt="PR 曲線。横軸が再現率、縦軸が適合率。しきい値を下げて右へ進むほど再現率は上がるが適合率は下がり、右端では陽性の割合（約 5%）まで落ちる"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;この図は、陽性が全体の 5% しかないデータでの PR 曲線です。曲線上の 1 点が 1 つのしきい値に対応します。右端（再現率 1.0）は「全部を陽性と言った」状態で、適合率は陽性の割合 0.05 まで落ちています。曲線が右上に張り出すほど良いモデルで、曲線の下の面積（平均適合率 AP）はそのまとめの数字です。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-threshold-1" data-viz-type="steps" data-steps-kind="threshold" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"閾値 0.2：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.5,"f1":0.62,"fn":0,"fp":25,"precision":0.44,"recall":1,"threshold":0.2,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.2,0,1,4,1]],"vlines":[[0.2,"0.2"]]},{"caption":"閾値 0.35：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.74,"f1":0.75,"fn":0,"fp":13,"precision":0.61,"recall":1,"threshold":0.35,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.35,0,1,4,1]],"vlines":[[0.35,"0.35"]]},{"caption":"閾値 0.5：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.84,"f1":0.81,"fn":3,"fp":5,"precision":0.77,"recall":0.85,"threshold":0.5,"tp":17},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.5,0,1,4,1]],"vlines":[[0.5,"0.5"]]},{"caption":"閾値 0.65：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.76,"f1":0.6,"fn":11,"fp":1,"precision":0.9,"recall":0.45,"threshold":0.65,"tp":9},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.65,0,1,4,1]],"vlines":[[0.65,"0.65"]]},{"caption":"閾値 0.8：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.66,"f1":0.26,"fn":17,"fp":0,"precision":1,"recall":0.15,"threshold":0.8,"tp":3},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.8,0,1,4,1]],"vlines":[[0.8,"0.8"]]}],"x_range":[0,1],"y_range":[0,4]};
 var id = 'viz-steps-threshold-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報II「情報とデータサイエンス」の&lt;strong&gt;分類の評価指標（正解率・適合率・再現率）&lt;strong&gt;がここで登場します。どちらも「全体を何にするか」を変えた&lt;/strong&gt;割合&lt;/strong&gt;で、適合率は「鳴った場所」を、再現率は「本物のコイン」を全体とみなします。相対度数で「何を分母にするか」を意識するのと同じ考え方です。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意は、「適合率」か「再現率」の片方だけ見ると簡単にだまされることです。全部を陽性と言えば再現率は 1.0 になり、いちばん自信のある 1 件だけ陽性と言えば適合率はほぼ 1.0 になるので、必ず 2 つセットで見ます。二つ目は、データの偏りが適合率の「床」を決めることです。陽性が 5% なら、しきい値を下げ切ったときの適合率は 0.05 で、同じモデルでも陽性の多いデータでは適合率が高く出ます。三つ目は、2 つを 1 つにまとめるなら足して 2 で割るのではなく F1 スコア（調和平均）を使うことです。片方が 0.1 のように極端に低いと F1 も低くなる性質があるので、「どちらかを捨てた」モデルを高く評価しません。&lt;/p&gt;</description></item><item><title>リッジ回帰・ラッソ回帰ってなに？ | 高校生向けにやさしく解説（係数にブレーキをかける）</title><link>https://k-dm.work/basic/regression/ridge_and_lasso_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:47 +0900</pubDate><guid>https://k-dm.work/basic/regression/ridge_and_lasso_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;リッジ回帰とラッソ回帰は、線形回帰に「&lt;strong&gt;係数が大きくなりすぎたら罰点&lt;/strong&gt;」というルール（&lt;strong&gt;正則化&lt;/strong&gt;）を足した方法です。罰点があると、手元のデータの偶然に合わせすぎる&lt;strong&gt;過学習&lt;/strong&gt;が起きにくくなり、新しいデータでも当たりやすく（&lt;strong&gt;汎化&lt;/strong&gt;しやすく）なります。リッジは係数の 2 乗、ラッソは係数の絶対値を罰点にするので、リッジは全部の係数をなだらかに縮め、ラッソは不要な係数を&lt;strong&gt;ちょうど 0&lt;/strong&gt; にします。罰点の強さ \(\alpha\) を大きくするほど係数は小さくなり、このページではテストの点数を 10 個の材料で予想する例で、その違いを 2 枚の図から読み取ります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;期末テストの点数を予想する式を作るとします。材料は「勉強時間」「睡眠時間」「前回の点数」のほかに、「靴のサイズ」「出席番号」「好きな色の番号」など全部で 10 個。&lt;a href="https://k-dm.work/basic/regression/linear_regression_highschool/"&gt;線形回帰&lt;/a&gt; で 10 個それぞれに係数をつけて、ズレの 2 乗の合計がいちばん小さくなるように決めます。&lt;/p&gt;
&lt;p&gt;ここで問題が起きます。データが 30 人分しかないと、靴のサイズのような&lt;strong&gt;関係ないはずの材料にも係数がついてしまう&lt;/strong&gt;のです。手元の 30 人にはよく合うのに、来年の生徒には外れる。これが&lt;strong&gt;過学習&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/regression/ridge_lasso_block01_ja.png"
 alt="10 個の特徴量 f0〜f9 の係数の大きさを、線形回帰（青）・リッジ（橙）・ラッソ（緑）で比べた棒グラフ。本当に効いている f0〜f2 は 3 本とも高いまま、残りは線形回帰では小さな棒が残るのに対し、リッジでは少し縮み、ラッソでは多くが 0 になって棒が消えている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、本当に効いているのは f0・f1・f2 の 3 つだけ、というデータで係数を比べたものです。青（ふつうの線形回帰）では f3〜f9 にも小さな棒が立っています。橙（リッジ）ではそれが少し縮み、緑（ラッソ）では多くが消えて 0 になっています。&lt;/p&gt;
&lt;h2 id="罰点はどう効く"&gt;
 罰点はどう効く？
 
 &lt;a class="anchor" href="#%e7%bd%b0%e7%82%b9%e3%81%af%e3%81%a9%e3%81%86%e5%8a%b9%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div class="flow" role="img" aria-label="ズレの 2 乗の合計だけを小さくする（線形回帰） -&amp;gt; 「＋ α × 罰点」を足す -&amp;gt; 罰点を減らすために係数が縮む -&amp;gt; α を強めるほど係数は 0 へ向かう"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;ズレの 2 乗の合計だけを小さくする（線形回帰）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;「＋ α × 罰点」を足す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;罰点を減らすために係数が縮む&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;α を強めるほど係数は 0 へ向かう&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ふつうの線形回帰&lt;/strong&gt;は「ズレの 2 乗の合計」だけを小さくし、係数はいくら大きくなっても構いません。そこに&lt;strong&gt;罰点を足します&lt;/strong&gt;。小さくする量を「ズレの 2 乗の合計 ＋ \(\alpha \times\) 罰点」に変え、\(\alpha\) が罰点の強さを決める数（0 なら線形回帰と同じ）です。リッジの罰点は係数を 2 乗して全部足したもの、ラッソの罰点は係数の絶対値を全部足したものです。すると&lt;strong&gt;係数が縮みます&lt;/strong&gt;。罰点を減らすには係数を小さくするしかないので、ズレが少し増えても構わないから係数を小さくする、というバランスが取られ、棒グラフでは青→橙→緑と棒が低くなっていきます。&lt;strong&gt;\(\alpha\) を強める&lt;/strong&gt;と、下の図のように横軸で \(\alpha\) を右に動かすほど係数の線は 0 へ向かいます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/regression/ridge_lasso_block02_ja.png"
 alt="罰点の強さ α を横軸（対数）にとり、10 本の係数が α とともにどう変わるかを描いた図。左のリッジでは全部の線がなだらかなカーブで 0 に近づき、右のラッソでは小さい係数から順に、ある α でぴたりと 0 になって横軸に張り付く"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;左右の図のちがいが、リッジとラッソのちがいそのものです。&lt;strong&gt;リッジ&lt;/strong&gt;（左）は 10 本の線がどれもなだらかに下がり、どこまで行っても 0 にはなりません。&lt;strong&gt;ラッソ&lt;/strong&gt;（右）は小さい係数から順に、ある \(\alpha\) で&lt;strong&gt;ぴたりと 0&lt;/strong&gt; になり、それ以降は横軸に張り付きます。つまりラッソは「この材料は使わない」という選択を自動でやってくれます。&lt;/p&gt;
&lt;p&gt;ちがいの理由は罰点の数え方にあります。係数 \((3, 0, 0)\) と \((1, 1, 1)\) を比べると、絶対値の合計はどちらも 3 ですが、2 乗の合計は 9 と 3。リッジは大きな係数 1 つを強く嫌って&lt;strong&gt;全体に均す&lt;/strong&gt;方向に、ラッソは均す得がないので&lt;strong&gt;小さい係数を 0 に切り捨てる&lt;/strong&gt;方向に働きます。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-ridge-0" data-viz-type="steps" data-steps-kind="ridge" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"α = 1e-05：9 次の曲線に罰則をかける。α を大きくするほど係数が小さくなり（合計 468.18）、曲線が暴れなくなる。","curve":[[0,4.92],[0.1,5.18],[0.2,5.42],[0.3,5.66],[0.4,5.87],[0.5,6.08],[0.6,6.27],[0.7,6.44],[0.8,6.61],[0.9,6.76],[1,6.89],[1.1,7.01],[1.2,7.12],[1.3,7.21],[1.4,7.29],[1.5,7.36],[1.6,7.41],[1.7,7.45],[1.8,7.47],[1.9,7.48],[2,7.48],[2.1,7.47],[2.2,7.44],[2.3,7.4],[2.4,7.35],[2.5,7.29],[2.6,7.22],[2.7,7.13],[2.8,7.04],[2.9,6.94],[3,6.83],[3.1,6.71],[3.2,6.58],[3.3,6.45],[3.4,6.31],[3.5,6.16],[3.6,6.01],[3.7,5.85],[3.8,5.69],[3.9,5.53],[4,5.36],[4.1,5.2],[4.2,5.03],[4.3,4.87],[4.4,4.7],[4.5,4.54],[4.6,4.38],[4.7,4.22],[4.8,4.07],[4.9,3.92],[5,3.78],[5.1,3.64],[5.2,3.51],[5.3,3.39],[5.4,3.28],[5.5,3.18],[5.6,3.09],[5.7,3],[5.8,2.93],[5.9,2.87],[6,2.82],[6.1,2.79],[6.2,2.77],[6.3,2.75],[6.4,2.76],[6.5,2.77],[6.6,2.8],[6.7,2.84],[6.8,2.9],[6.9,2.97],[7,3.05],[7.1,3.15],[7.2,3.25],[7.3,3.37],[7.4,3.5],[7.5,3.64],[7.6,3.79],[7.7,3.95],[7.8,4.11],[7.9,4.29],[8,4.47],[8.1,4.65],[8.2,4.84],[8.3,5.03],[8.4,5.22],[8.5,5.41],[8.6,5.6],[8.7,5.78],[8.8,5.96],[8.9,6.13],[9,6.29],[9.1,6.44],[9.2,6.57],[9.3,6.69],[9.4,6.79],[9.5,6.88],[9.6,6.94],[9.7,6.98],[9.8,6.99],[9.9,6.98],[10,6.94]],"metrics":{"alpha":0.00001,"coef_norm":468.18}},{"caption":"α = 0.001：9 次の曲線に罰則をかける。α を大きくするほど係数が小さくなり（合計 128.03）、曲線が暴れなくなる。","curve":[[0,5.87],[0.1,5.99],[0.2,6.1],[0.3,6.2],[0.4,6.3],[0.5,6.39],[0.6,6.47],[0.7,6.55],[0.8,6.62],[0.9,6.68],[1,6.73],[1.1,6.78],[1.2,6.82],[1.3,6.85],[1.4,6.88],[1.5,6.89],[1.6,6.91],[1.7,6.91],[1.8,6.91],[1.9,6.9],[2,6.88],[2.1,6.86],[2.2,6.83],[2.3,6.8],[2.4,6.76],[2.5,6.71],[2.6,6.65],[2.7,6.59],[2.8,6.53],[2.9,6.46],[3,6.38],[3.1,6.3],[3.2,6.22],[3.3,6.13],[3.4,6.03],[3.5,5.93],[3.6,5.83],[3.7,5.73],[3.8,5.62],[3.9,5.51],[4,5.39],[4.1,5.28],[4.2,5.16],[4.3,5.04],[4.4,4.92],[4.5,4.8],[4.6,4.68],[4.7,4.56],[4.8,4.44],[4.9,4.32],[5,4.21],[5.1,4.1],[5.2,3.99],[5.3,3.88],[5.4,3.78],[5.5,3.68],[5.6,3.58],[5.7,3.5],[5.8,3.42],[5.9,3.34],[6,3.27],[6.1,3.21],[6.2,3.16],[6.3,3.12],[6.4,3.09],[6.5,3.06],[6.6,3.05],[6.7,3.05],[6.8,3.05],[6.9,3.07],[7,3.11],[7.1,3.15],[7.2,3.21],[7.3,3.27],[7.4,3.36],[7.5,3.45],[7.6,3.56],[7.7,3.68],[7.8,3.81],[7.9,3.95],[8,4.11],[8.1,4.27],[8.2,4.45],[8.3,4.63],[8.4,4.83],[8.5,5.03],[8.6,5.24],[8.7,5.45],[8.8,5.67],[8.9,5.89],[9,6.1],[9.1,6.31],[9.2,6.52],[9.3,6.72],[9.4,6.9],[9.5,7.07],[9.6,7.22],[9.7,7.35],[9.8,7.45],[9.9,7.51],[10,7.53]],"metrics":{"alpha":0.001,"coef_norm":128.03}},{"caption":"α = 0.01：9 次の曲線に罰則をかける。α を大きくするほど係数が小さくなり（合計 29.57）、曲線が暴れなくなる。","curve":[[0,6.75],[0.1,6.75],[0.2,6.75],[0.3,6.75],[0.4,6.74],[0.5,6.73],[0.6,6.72],[0.7,6.71],[0.8,6.7],[0.9,6.68],[1,6.67],[1.1,6.65],[1.2,6.63],[1.3,6.6],[1.4,6.58],[1.5,6.55],[1.6,6.52],[1.7,6.49],[1.8,6.45],[1.9,6.42],[2,6.38],[2.1,6.34],[2.2,6.3],[2.3,6.25],[2.4,6.21],[2.5,6.16],[2.6,6.11],[2.7,6.05],[2.8,6],[2.9,5.95],[3,5.89],[3.1,5.83],[3.2,5.77],[3.3,5.71],[3.4,5.64],[3.5,5.58],[3.6,5.51],[3.7,5.44],[3.8,5.37],[3.9,5.3],[4,5.23],[4.1,5.15],[4.2,5.08],[4.3,5.01],[4.4,4.93],[4.5,4.85],[4.6,4.78],[4.7,4.7],[4.8,4.63],[4.9,4.55],[5,4.47],[5.1,4.4],[5.2,4.32],[5.3,4.25],[5.4,4.18],[5.5,4.11],[5.6,4.04],[5.7,3.97],[5.8,3.9],[5.9,3.84],[6,3.78],[6.1,3.72],[6.2,3.67],[6.3,3.62],[6.4,3.58],[6.5,3.54],[6.6,3.5],[6.7,3.47],[6.8,3.45],[6.9,3.43],[7,3.42],[7.1,3.41],[7.2,3.42],[7.3,3.43],[7.4,3.45],[7.5,3.48],[7.6,3.53],[7.7,3.58],[7.8,3.64],[7.9,3.72],[8,3.81],[8.1,3.91],[8.2,4.03],[8.3,4.16],[8.4,4.31],[8.5,4.48],[8.6,4.66],[8.7,4.86],[8.8,5.09],[8.9,5.33],[9,5.59],[9.1,5.88],[9.2,6.19],[9.3,6.53],[9.4,6.9],[9.5,7.29],[9.6,7.71],[9.7,8.16],[9.8,8.64],[9.9,9.15],[10,9.7]],"metrics":{"alpha":0.01,"coef_norm":29.57}},{"caption":"α = 0.1：9 次の曲線に罰則をかける。α を大きくするほど係数が小さくなり（合計 16.21）、曲線が暴れなくなる。","curve":[[0,6.8],[0.1,6.77],[0.2,6.74],[0.3,6.71],[0.4,6.68],[0.5,6.65],[0.6,6.61],[0.7,6.58],[0.8,6.55],[0.9,6.51],[1,6.48],[1.1,6.44],[1.2,6.4],[1.3,6.37],[1.4,6.33],[1.5,6.29],[1.6,6.25],[1.7,6.21],[1.8,6.17],[1.9,6.13],[2,6.09],[2.1,6.04],[2.2,6],[2.3,5.96],[2.4,5.91],[2.5,5.87],[2.6,5.82],[2.7,5.77],[2.8,5.73],[2.9,5.68],[3,5.63],[3.1,5.58],[3.2,5.53],[3.3,5.48],[3.4,5.43],[3.5,5.38],[3.6,5.33],[3.7,5.28],[3.8,5.22],[3.9,5.17],[4,5.12],[4.1,5.06],[4.2,5.01],[4.3,4.96],[4.4,4.9],[4.5,4.85],[4.6,4.79],[4.7,4.74],[4.8,4.69],[4.9,4.63],[5,4.58],[5.1,4.53],[5.2,4.47],[5.3,4.42],[5.4,4.37],[5.5,4.32],[5.6,4.27],[5.7,4.22],[5.8,4.18],[5.9,4.13],[6,4.09],[6.1,4.05],[6.2,4.01],[6.3,3.97],[6.4,3.94],[6.5,3.91],[6.6,3.88],[6.7,3.86],[6.8,3.84],[6.9,3.83],[7,3.81],[7.1,3.81],[7.2,3.81],[7.3,3.82],[7.4,3.83],[7.5,3.85],[7.6,3.88],[7.7,3.91],[7.8,3.96],[7.9,4.01],[8,4.08],[8.1,4.15],[8.2,4.24],[8.3,4.34],[8.4,4.45],[8.5,4.58],[8.6,4.72],[8.7,4.88],[8.8,5.06],[8.9,5.26],[9,5.47],[9.1,5.71],[9.2,5.97],[9.3,6.26],[9.4,6.57],[9.5,6.9],[9.6,7.27],[9.7,7.67],[9.8,8.1],[9.9,8.56],[10,9.07]],"metrics":{"alpha":0.1,"coef_norm":16.21}},{"caption":"α = 1.0：9 次の曲線に罰則をかける。α を大きくするほど係数が小さくなり（合計 5.62）、曲線が暴れなくなる。","curve":[[0,5.85],[0.1,5.84],[0.2,5.82],[0.3,5.81],[0.4,5.8],[0.5,5.78],[0.6,5.77],[0.7,5.75],[0.8,5.74],[0.9,5.73],[1,5.71],[1.1,5.7],[1.2,5.68],[1.3,5.67],[1.4,5.65],[1.5,5.63],[1.6,5.62],[1.7,5.6],[1.8,5.59],[1.9,5.57],[2,5.55],[2.1,5.54],[2.2,5.52],[2.3,5.5],[2.4,5.48],[2.5,5.47],[2.6,5.45],[2.7,5.43],[2.8,5.41],[2.9,5.39],[3,5.38],[3.1,5.36],[3.2,5.34],[3.3,5.32],[3.4,5.3],[3.5,5.28],[3.6,5.26],[3.7,5.24],[3.8,5.22],[3.9,5.2],[4,5.18],[4.1,5.16],[4.2,5.14],[4.3,5.12],[4.4,5.1],[4.5,5.08],[4.6,5.06],[4.7,5.04],[4.8,5.02],[4.9,5],[5,4.99],[5.1,4.97],[5.2,4.95],[5.3,4.93],[5.4,4.91],[5.5,4.89],[5.6,4.87],[5.7,4.86],[5.8,4.84],[5.9,4.82],[6,4.81],[6.1,4.79],[6.2,4.78],[6.3,4.77],[6.4,4.76],[6.5,4.74],[6.6,4.74],[6.7,4.73],[6.8,4.72],[6.9,4.71],[7,4.71],[7.1,4.71],[7.2,4.71],[7.3,4.71],[7.4,4.72],[7.5,4.72],[7.6,4.73],[7.7,4.74],[7.8,4.76],[7.9,4.78],[8,4.8],[8.1,4.83],[8.2,4.86],[8.3,4.9],[8.4,4.94],[8.5,4.98],[8.6,5.03],[8.7,5.09],[8.8,5.15],[8.9,5.22],[9,5.3],[9.1,5.38],[9.2,5.48],[9.3,5.58],[9.4,5.69],[9.5,5.81],[9.6,5.94],[9.7,6.08],[9.8,6.23],[9.9,6.4],[10,6.58]],"metrics":{"alpha":1,"coef_norm":5.62}}],"points":[[0.13,5.5,0],[1.26,6.35,0],[2.2,7.99,0],[2.83,7.09,0],[3.9,6,0],[4.54,4.46,0],[5.48,2.11,0],[6.45,2.88,0],[7.02,3.85,0],[7.81,3.98,0],[8.72,5.56,0],[9.51,6.98,0]],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-ridge-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報IIの「情報とデータサイエンス」で学ぶ&lt;strong&gt;過学習と汎化&lt;/strong&gt;が、このページの背景です。手元のデータに合わせすぎたモデルは新しいデータで外れる（過学習）、だから「当てはまりの良さ」と「モデルの単純さ」の両方を見る必要がある。正則化は、その「単純さ」を「係数の小ささ」として数式に組み込んだものです。正則化そのものは高校の範囲外なので、ここでは「係数の小ささ＝モデルの単純さ」という考え方だけを押さえておけば十分です。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の課題は&lt;strong&gt;単位をそろえないと不公平になる&lt;/strong&gt;ことで、「時間」と「分」では同じ関係でも係数が 60 倍ちがいます。罰点は係数の大きさで決まるので、先に各材料を平均 0・標準偏差 1 にそろえる（標準化する）のが前提です。二つ目は**\(\alpha\) を強くしすぎると、今度は当てはまらない&lt;strong&gt;こと。係数が全部 0 に近づけば、予測は「平均を答えるだけ」になります。弱すぎれば過学習、強すぎれば当てはまり不足で、ちょうどよい強さは学習に使っていないデータで試して決めます。三つ目は&lt;/strong&gt;ラッソが 0 にした材料が「無関係」とは限らない**ことで、似た材料が 2 つあると、ラッソは片方だけ残してもう片方を 0 にしがちです。「もう片方で間に合った」だけのこともあります。&lt;/p&gt;</description></item><item><title>決定木回帰 | 高校生向けにやさしく解説（区間ごとの平均で階段をつくる）</title><link>https://k-dm.work/basic/tree/decision_tree_regressor_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:47 +0900</pubDate><guid>https://k-dm.work/basic/tree/decision_tree_regressor_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;決定木回帰は、データを「\(x\) は 25 以下？」のような質問で&lt;strong&gt;区間に切り分け&lt;/strong&gt;、各区間に入った点の&lt;strong&gt;平均&lt;/strong&gt;を予測値にする方法です。グラフにすると予測は&lt;strong&gt;階段状&lt;/strong&gt;になり、質問を重ねる（木を深くする）ほど段が 2、4、8 と増えて曲線にも近づけます。切る場所は、左右の区間それぞれで「点と平均とのずれの 2 乗の合計」が最小になる場所で、数学Iの分散と同じ発想です。深くしすぎると段が細かくなりすぎて、学習データのノイズまで覚えてしまう過学習が起きます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://k-dm.work/basic/regression/linear_regression_highschool/"&gt;高校生向けの線形回帰&lt;/a&gt; では、気温とアイスの売上の点に 1 本の直線を引きました。でも売店のおばさんの頭の中は、もしかすると直線ではなく「&lt;strong&gt;25 ℃ 以下なら 40 個くらい、25 ℃ を超えたら 75 個くらい&lt;/strong&gt;」という、ざっくりした区切りかもしれません。&lt;/p&gt;
&lt;p&gt;この「区間に分けて、区間ごとに代表の値を決める」考え方を、売上データから自動で作るのが決定木回帰です。分類の決定木と同じ「はい／いいえ」の質問を使いますが、最後に返すのがクラスではなく&lt;strong&gt;平均値&lt;/strong&gt;、たとえば 40 個や 75 個になります。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/tree/decision-tree-regressor_block02.svg"
 alt="回帰木の段差状予測。灰色の点がデータ、なめらかな線が本当の関係、階段状の線が深さ 3 の回帰木の予測。階段が曲線を追いかけている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、なめらかな曲線にノイズを加えたデータに、深さ 3 の回帰木を当てはめた結果です。予測（階段状の線）は &lt;strong&gt;8 段&lt;/strong&gt;の水平線でできていて、それぞれの段の高さが、その区間に入った点の平均です。&lt;/p&gt;
&lt;h2 id="仕組みいちばんばらつきが減る場所で切る"&gt;
 仕組み：いちばん「ばらつきが減る」場所で切る
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%81%84%e3%81%a1%e3%81%b0%e3%82%93%e3%81%b0%e3%82%89%e3%81%a4%e3%81%8d%e3%81%8c%e6%b8%9b%e3%82%8b%e5%a0%b4%e6%89%80%e3%81%a7%e5%88%87%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、全部の点を 1 つの区間に入れます。予測値は全体の平均で、図ではまだ水平線が 1 本だけです。次に、となり合う点の中間を 1 つずつ区切りにしてみて、左右それぞれの区間で「各点と区間の平均とのずれの 2 乗」を合計します。6 点なら候補は 5 か所です。その合計がいちばん小さくなる場所で切ると水平線が 2 段になり、左の段は左の点の平均、右の段は右の点の平均の高さになります。&lt;/p&gt;
&lt;p&gt;できた区間それぞれで同じことを繰り返すと、段が 2、4、8 と増え、点の並びに沿った階段になっていきます。最後に、決めた深さ（&lt;code&gt;max_depth&lt;/code&gt;）に達するか、区間の点が &lt;code&gt;min_samples_leaf&lt;/code&gt; より少なくなったら止めます。新しい \(x\) が来たら、それが入る区間の平均を答えます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="全部の点を 1 区間に（予測は全体の平均） -&amp;gt; 隣り合う点の中間を候補に総当たり -&amp;gt; 左右のずれの 2 乗の合計が最小の場所で切る -&amp;gt; できた区間で繰り返す -&amp;gt; max_depth に達したら止める"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;全部の点を 1 区間に（予測は全体の平均）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;隣り合う点の中間を候補に総当たり&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;左右のずれの 2 乗の合計が最小の場所で切る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;できた区間で繰り返す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;max_depth に達したら止める&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/tree/decision-tree-regressor_block04.svg"
 alt="決定木回帰の構造。各ノードに質問（x1 &amp;lt;= … など）、ずれの 2 乗の平均、サンプル数、その区間の平均値が書かれ、根から葉へ枝分かれしている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;2 枚目の図は、特徴量が 2 つあるときの木を「質問の流れ」として描いたものです。葉に書かれた &lt;code&gt;value&lt;/code&gt; が、その葉にたどりついた点に返す予測値（平均）です。特徴量が 2 つなら、区間は平面上の長方形の部屋になり、部屋ごとに 1 つの高さが決まります。&lt;/p&gt;
&lt;h2 id="電卓感覚で計算してみる"&gt;
 電卓感覚で計算してみる
 
 &lt;a class="anchor" href="#%e9%9b%bb%e5%8d%93%e6%84%9f%e8%a6%9a%e3%81%a7%e8%a8%88%e7%ae%97%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;6 日分の気温と売上で、最初の 1 本をどこで切るかを総当たりで調べます。次のコードは、5 か所の候補すべてについて「左右のずれの 2 乗の合計」を計算し、&lt;code&gt;cut at 25.0 C: error 528.0&lt;/code&gt; の形で 1 行ずつ表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;temps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="c1"&gt;# sum of squared deviations from mean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temps&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cut&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;temps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cut at &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;4.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; C: error &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;7.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;6 日分の気温と売上を並べて持つ&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;temps&lt;/code&gt; は気温（℃）、&lt;code&gt;sales&lt;/code&gt; は売上（個）で、同じ位置どうしが同じ日のデータです。気温が 22 から 32 まで昇順に並んでいるので、&lt;code&gt;sales[:i]&lt;/code&gt; と &lt;code&gt;sales[i:]&lt;/code&gt; で切るだけで「左の区間」「右の区間」が作れます。並んでいないデータなら、先に気温でソートしておく必要があります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3-5"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3-5 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;「ずれの 2 乗の合計」を関数にする&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sse&lt;/code&gt; は区間の平均 &lt;code&gt;m&lt;/code&gt; を求め、各点との差を 2 乗して足します。数学Iの偏差の 2 乗和そのもので、分散に点の数を掛けた値です。2 乗するので、平均から 10 個外れた日は 5 個外れた日の 4 倍の重さで効きます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="6-8"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;6-8 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;となり合う点の中間を切る場所の候補にする&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;i&lt;/code&gt; を 1 から 5 まで動かし、&lt;code&gt;temps[i-1]&lt;/code&gt; と &lt;code&gt;temps[i]&lt;/code&gt; の中間（23、25、27、29、31 ℃）を候補にします。点と点の間のどこで切っても左右の分かれ方は同じなので、中間だけ試せば十分です。これが決定木の「候補の総当たり」です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="9"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;9 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;左右の合計を比べて最小の場所を探す&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;左の区間と右の区間の &lt;code&gt;sse&lt;/code&gt; を足した値が、その切り方の「悪さ」です。実行すると 25 ℃ で 528、27 ℃ で 533 と出て、最小の 25 ℃ が最初の質問に選ばれます。&lt;code&gt;:7.1f&lt;/code&gt; は小数 1 桁・幅 7 文字で揃えて表示する書式で、結果を縦に見比べやすくするためのものです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;結果は 25 ℃ で切ったときが最小（528）で、27 ℃（533）がわずかに続きます。25 ℃ で切ると、左の区間の平均は 40 個、右は 74 個。「25 ℃ 以下なら 40 個、超えたら 74 個」という 2 段の階段が、最初の質問として選ばれます。&lt;/p&gt;</description></item><item><title>回帰直線を重ねた散布図 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/scatter/scatter-lm_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:50 +0900</pubDate><guid>https://k-dm.work/visualize/scatter/scatter-lm_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;回帰直線を重ねた散布図は、点の帯の真ん中に&lt;strong&gt;最も当てはまる直線 \(y = ax + b\)&lt;/strong&gt; を引き、「横の量が 1 増えると縦の量はどれだけ増えるか」を傾きで答える図です。直線の周りの薄い帯は&lt;strong&gt;信頼区間&lt;/strong&gt;で、「直線の位置がどのくらい確からしいか」を表し、点が多く密な場所で細く、端で広がります。グループごとに色分けして直線を引くと、傾きの違い＝「増え方の違い」が比べられます。曲がったデータに直線を引く、1 つの外れ値に直線が引っぱられる、データの範囲外まで延ばす、が代表的な誤りです。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭の模擬店で「気温が 1 ℃ 上がると、かき氷は何個多く売れるか」を知りたいとします。散布図で右上がりの帯は見えても、「1 ℃ あたり何個」という数は、帯の真ん中に 1 本の直線を引いて、その&lt;strong&gt;傾き&lt;/strong&gt;を読まなければ分かりません。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、飲食店の会計額（横軸）とチップ（縦軸）を、昼（Lunch）と夜（Dinner）で色分けし、それぞれに回帰直線を引いたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/scatter/ja/scatter-lm-block01-fig01.png"
 alt="会計額（横軸）とチップ（縦軸）の散布図に、昼と夜の 2 グループで色分けした回帰直線とその周りの信頼区間の帯を重ねた図。どちらも右上がりで、会計額が大きいほどチップが多い"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;2 本の直線はどちらも右上がりで、「会計額が大きいほどチップも多い」ことが分かります。傾きを読めば「会計が 10 ドル増えるとチップは約 1 ドル増える」のような&lt;strong&gt;量の答え&lt;/strong&gt;が得られ、2 本の傾きを比べれば「昼と夜で増え方は違うか」も読めます。&lt;/p&gt;
&lt;h2 id="直線はこう引く"&gt;
 直線はこう引く
 
 &lt;a class="anchor" href="#%e7%9b%b4%e7%b7%9a%e3%81%af%e3%81%93%e3%81%86%e5%bc%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず散布図を描きます。点だけを見て帯がまっすぐか、「U 字」に曲がっていないかを確かめ、曲がっていれば直線を引く前に立ち止まります。次に帯の真ん中に直線を引きます。基準は「各点から直線までの縦のズレを 2 乗して全部足した値が最小」になること（最小二乗法）で、この直線は必ず \(x\) の平均と \(y\) の平均の点 \((\bar{x}, \bar{y})\) を通ります。続いて信頼区間の帯を描きます。もし別の 244 件のデータを集め直したら直線は少し違う位置に来るはずで、その「ありうる位置の幅」が薄い帯になり、点が密な中央で細く、点が少ない両端で広がります。最後にグループごとに繰り返します。昼（Lunch）と夜（Dinner）に分けて直線と帯を引き、色を変えて重ねます。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。相関係数が 0.9 に近いデータでは、点が直線にぴったり寄り添い、信頼区間の帯は直線とほぼ重なるほど細くなります。相関係数が 0.2 程度なら逆です。点は直線から大きく離れて散り、帯は太くなり、傾きの符号すら「本当にプラスか」疑わしくなります。さらに、会計額 50 ドルでチップ 0 ドルという 1 点を加えると、直線の右端はその点に引っぱられて下がり、傾きが小さくなります。&lt;strong&gt;直線は点の「多数決」ではなく「ズレの 2 乗の合計」で決まる&lt;/strong&gt;ので、遠い 1 点の影響が大きいのです。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-leastsq-0" data-viz-type="steps" data-steps-kind="leastsq" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"候補 1：直線 y = 0.2x + 12.0。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,12],[10,14]],"metrics":{"sse":264},"squares":[[1,3.17,-9.03],[1.89,7.03,-5.35],[2.78,4.88,-7.68],[3.67,10.12,-2.61],[4.56,9.64,-3.27],[5.44,11.42,-1.67],[6.33,17.09,3.82],[7.22,15.73,2.28],[8.11,17.14,3.52],[9,20.31,6.51]]},{"caption":"候補 2：直線 y = 0.36x + 11.92。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.92],[10,15.57]],"metrics":{"sse":251.4},"squares":[[1,3.17,-9.11],[1.89,7.03,-5.58],[2.78,4.88,-8.05],[3.67,10.12,-3.14],[4.56,9.64,-3.94],[5.44,11.42,-2.49],[6.33,17.09,2.86],[7.22,15.73,1.17],[8.11,17.14,2.27],[9,20.31,5.11]]},{"caption":"候補 3：直線 y = 0.4x + 11.72。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.72],[10,15.77]],"metrics":{"sse":242.6},"squares":[[1,3.17,-8.95],[1.89,7.03,-5.46],[2.78,4.88,-7.96],[3.67,10.12,-3.08],[4.56,9.64,-3.92],[5.44,11.42,-2.5],[6.33,17.09,2.8],[7.22,15.73,1.09],[8.11,17.14,2.14],[9,20.31,4.95]]},{"caption":"候補 4：直線 y = 0.48x + 11.28。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,11.28],[10,16.03]],"metrics":{"sse":224},"squares":[[1,3.17,-8.58],[1.89,7.03,-5.15],[2.78,4.88,-7.72],[3.67,10.12,-2.9],[4.56,9.64,-3.8],[5.44,11.42,-2.45],[6.33,17.09,2.8],[7.22,15.73,1.02],[8.11,17.14,2.01],[9,20.31,4.76]]},{"caption":"候補 5：直線 y = 0.66x + 10.14。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,10.14],[10,16.71]],"metrics":{"sse":180.2},"squares":[[1,3.17,-7.63],[1.89,7.03,-4.36],[2.78,4.88,-7.09],[3.67,10.12,-2.43],[4.56,9.64,-3.49],[5.44,11.42,-2.3],[6.33,17.09,2.79],[7.22,15.73,0.84],[8.11,17.14,1.68],[9,20.31,4.26]]},{"caption":"候補 6：直線 y = 1.11x + 7.32。各点と直線のズレを 1 辺とする正方形（残差の 2 乗）の面積の合計が SSE。","curve":[[0,7.32],[10,18.39]],"metrics":{"sse":94},"squares":[[1,3.17,-5.25],[1.89,7.03,-2.38],[2.78,4.88,-5.51],[3.67,10.12,-1.26],[4.56,9.64,-2.72],[5.44,11.42,-1.93],[6.33,17.09,2.75],[7.22,15.73,0.41],[8.11,17.14,0.84],[9,20.31,3.03]]},{"caption":"最小二乗解 y = 2.06x + 1.36：正方形の面積の合計がいちばん小さい直線。","curve":[[0,1.36],[10,21.95]],"metrics":{"sse":20.5},"squares":[[1,3.17,-0.25],[1.89,7.03,1.78],[2.78,4.88,-2.2],[3.67,10.12,1.21],[4.56,9.64,-1.09],[5.44,11.42,-1.15],[6.33,17.09,2.69],[7.22,15.73,-0.5],[8.11,17.14,-0.91],[9,20.31,0.42]]}],"points":[[1,3.17,-1],[1.89,7.03,-1],[2.78,4.88,-1],[3.67,10.12,-1],[4.56,9.64,-1],[5.44,11.42,-1],[6.33,17.09,-1],[7.22,15.73,-1],[8.11,17.14,-1],[9,20.31,-1]],"x_range":[0,10],"y_range":[0,25]};
 var id = 'viz-steps-leastsq-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で学ぶ散布図・相関係数の次の一歩が回帰直線で、情報I「データの活用」では表計算ソフトで回帰直線を引いて予測する活動をします。直線の傾き \(a\) は「\(x\) と \(y\) の共分散 ÷ \(x\) の分散」で、相関係数 \(r\) が「直線っぽさの強さ」を表すのに対し、\(a\) は「その直線の傾き」です。\(r\) が同じでも、\(y\) の散らばりが大きければ傾きは急になります。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の課題は、「U 字」に曲がった帯に直線を引くことです。U 字型に並ぶ点に直線を引くと「相関なし」に見えますが関係はあるので、まず散布図の形を確かめます。二つ目は、外れ値を放置することです。1 点が直線を大きく動かすので、入力ミスでないか確かめ、入れた場合と除いた場合を比べます。三つ目は、データの範囲の外へ延ばすことです。会計額 3〜50 ドルで作った直線を 200 ドルに当てても、同じ関係が続くとは限りません。四つ目は、傾きがプラス＝因果と思うことです。チップを増やしても会計額は増えないように、直線は関係の向きと大きさを示すだけです。&lt;/p&gt;</description></item><item><title>ドーナツチャートで割合を見せる | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/category-groupby/pie-dounut_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/category-groupby/pie-dounut_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ドーナツチャートは、全体を 100% として&lt;strong&gt;各カテゴリの割合を扇形の大きさ&lt;/strong&gt;で見せる円グラフの一種で、真ん中の穴には合計などを書けます。答える問いは「全体のうち、どれがどのくらいの割合を占めるか」であり、「どれが大きいか」を正確に比べる図ではありません。割合 \(p\)（%）の扇形の中心角は \(360^\circ \times p / 100\) で、25% なら 90°、半分なら 180° です。カテゴリは 5 個までにし、3D 表示や多すぎる分割は面積と数値の対応をこわすので避けます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラス 40 人に「好きな教科」を聞いたら、国語 8 人、数学 12 人、英語 10 人、理科 6 人、社会 4 人でした。人数そのものより「数学が全体の 3 割」「理科と社会を合わせて 4 分の 1」のように&lt;strong&gt;全体に対する割合&lt;/strong&gt;を伝えたいとき、円の形が役に立ちます。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、投資先の地域ごとの配分をドーナツチャートにしたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/category-groupby/ja/pie-dounut-block01-fig01.png"
 alt="5 つの地域の配分を扇形の大きさで表したドーナツチャート。米国が 40% で円の半分近くを占め、エマージングと日本が 20% ずつ、欧州とその他が 10% ずつと、扇形の角度が割合に比例している"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;米国の扇形は 40% で、ほかの 4 つを合わせたものに近い大きさに見えます。「米国が半分近く」「欧州とその他は合わせてもエマージング 1 つ分」。こうした「全体の中での位置づけ」が、円グラフが得意とする読み方です。&lt;/p&gt;
&lt;h2 id="扇形はこう決まる"&gt;
 扇形はこう決まる
 
 &lt;a class="anchor" href="#%e6%89%87%e5%bd%a2%e3%81%af%e3%81%93%e3%81%86%e6%b1%ba%e3%81%be%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、割合を出します。各カテゴリの値を合計で割って百分率にしますが、図のデータは最初から 40, 20, 20, 10, 10 で合計 100 です。次に、割合を中心角に変えます。360° に割合をかけると 40% → 144°、20% → 72°、10% → 36° になり、全部足すと 360° に戻ることを確かめます。それから 12 時の位置から順に扇形を描きます。コードの &lt;code&gt;startangle=90&lt;/code&gt; は「12 時の位置から始める」という意味で、割合の大きい順に並べると読みやすくなります。最後に真ん中に白い円を重ねて穴をあけるとドーナツになり、穴には「合計 100 万円」のような全体の情報を書けます。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。米国が 40% から 50% になり、その他が 10% から 0% になったとします。米国の扇形は 144° から 180° に広がって円のちょうど半分を占め、その他の扇形は消えます。ほかの 3 つの扇形は角度は変わりませんが、位置が回転してずれます。&lt;strong&gt;1 つのカテゴリが変わると、他の扇形の「位置」も動く&lt;/strong&gt;のが円グラフの性質で、2 枚の円グラフを並べて比べにくい理由の 1 つです。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-composition-0" data-viz-type="steps" data-steps-kind="composition" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"bars":[[0.15,0.85,45,0],[1.15,1.85,30,1],[2.15,2.85,15,2],[3.15,3.85,10,3]],"caption":"各カテゴリの件数（棒の高さ）。合計 100。","labels":[[0.5,48,"A 45"],[1.5,33,"B 30"],[2.5,18,"C 15"],[3.5,13,"D 10"]],"y_range":[0,55]},{"bars":[[0.15,0.85,45,0],[1.15,1.85,30,1],[2.15,2.85,15,2],[3.15,3.85,10,3]],"caption":"合計で割って割合にする。構成比の比較は、件数ではなく割合で行う。","labels":[[0.5,48,"45%"],[1.5,33,"30%"],[2.5,18,"15%"],[3.5,13,"10%"]],"y_range":[0,55]},{"caption":"積み上げ：1 本の棒に割合を積むと、全体に対する各カテゴリの占める大きさが面積で分かる。","labels":[[2.9,22.5,"A 45%"],[2.9,60,"B 30%"],[2.9,82.5,"C 15%"],[2.9,95,"D 10%"]],"regions":[[1.5,0,2.5,45,0],[1.5,45,2.5,75,1],[1.5,75,2.5,90,2],[1.5,90,2.5,100,3]],"y_range":[0,110]}],"x_range":[0,4],"y_range":[0,55]};
 var id = 'viz-steps-composition-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」の相対度数（度数÷全体）が、そのまま扇形の割合です。相対度数の合計は必ず 1 になり、中心角の合計が 360° になることと対応しています。情報I「データの活用」の「データの可視化」では、「割合を伝えるなら円グラフ、値の大小を正確に比べるなら棒グラフ」という選び方の基準を学びます。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の落とし穴はスライスが多すぎることです。6 個以上に分けると、10% と 12% の扇形の差は見分けられないので、上位 3〜5 個に絞り、残りは「その他」にまとめます。二つ目は 3D や立体風にすること。手前の扇形が遠近法で大きく見え、面積が 40% などの割合と一致しなくなるので、必ず平面（2D）で描きます。三つ目は合計が 100% にならないデータに使うことで、「複数回答のアンケート」を円グラフにすると割合の合計が 100% を超えて意味を失います。1 人が 1 つだけ選ぶデータに限ります。四つ目は 2 枚の円を並べて増減を読むこと。角度の差を 2 枚の円で比べるのは目にとって難しい作業なので、増減を見たいなら棒グラフに描き直します。&lt;/p&gt;</description></item><item><title>グループ化棒グラフの読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/bar/grouped-bar_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/bar/grouped-bar_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;グループ化棒グラフは「月ごとに、オンラインと店舗のどちらが大きいか」「その差は月を追ってどう変わるか」という、&lt;strong&gt;2 つの切り口&lt;/strong&gt;をまたぐ問いに答える図です。同じ月の棒を隣に並べ、色で系列（データの種類）を区別します。棒の根元は全部 0 なので、どの棒同士でも長さをそのまま比べられ、読むときは「グループ内の比較」と「同じ色を横にたどる比較」の 2 方向で見ます。系列は 3〜4 本までにしないと、色が増えて区別がつかず、棒が細くなって読めなくなります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;部活の活動記録で、1 月から 4 月までの「平日の練習時間」と「休日の練習時間」を比べたいとします。表にすると 2 行 4 列の数字ですが、知りたいのは「どの月も休日のほうが長いのか」「平日と休日の差は縮まっているのか」という&lt;strong&gt;組み合わせの問い&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、月別の売上をオンラインと店舗で比べたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/bar/ja/grouped-bar-block01-fig01.png"
 alt="4 か月分の売上を、月ごとにオンライン（青）と店舗（オレンジ）の 2 本の棒を並べて比べたグループ化棒グラフ。どの月も青が高く、月を追って両方とも伸びている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;ぱっと見て分かることは 3 つあります。「どの月もオンライン（青）のほうが高い」「両方とも月を追って伸びている」「青とオレンジの差は 1 月の 30 から 4 月の 50 へ少し広がっている」。これが、ふつうの棒グラフ 1 枚では読めない、グループ化棒グラフの答える問いです。&lt;/p&gt;
&lt;h2 id="棒はこう並べる"&gt;
 棒はこう並べる
 
 &lt;a class="anchor" href="#%e6%a3%92%e3%81%af%e3%81%93%e3%81%86%e4%b8%a6%e3%81%b9%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、横軸に「大きな切り口」である月を置きます。図では Jan〜Apr の 4 つの位置が等間隔に並びます。次に、各位置の左右に系列の棒を立てます。中心から左に棒の幅の半分だけずらしてオンライン、右に店舗を置くと、1 つの月が 2 本セットの「グループ」になり、グループの間には余白ができます。それから、青＝オンライン、オレンジ＝店舗という色と凡例で系列を結びつけます。凡例の並び（オンライン→店舗）と棒の左右の順をそろえると目が迷いません。最後に 2 方向で読みます。同じグループの隣同士を比べれば「その月の勝ち負け」、同じ色を横にたどれば「その系列の推移」が読めます。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。もし 4 月だけ店舗が 180 に跳ねたら、Apr グループのオレンジが青（170）を追い越し、「どの月も青が高い」という見出しが成り立たなくなります。1 つの数字の変化が、1 本の棒の高さと、1 つのグループ内の順位に直接現れる。これがこの図の読みやすさの理由です。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-axis-0" data-viz-type="steps" data-steps-kind="axis" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"bars":[[0.15,0.85,92,0],[1.15,1.85,95,0],[2.15,2.85,97,0],[3.15,3.85,99,0]],"caption":"縦軸を 0 から：4 つの値の差は小さく見える（実際の差は数 %）。","labels":[[0.5,104,"A"],[1.5,104,"B"],[2.5,104,"C"],[3.5,104,"D"]],"y_range":[0,110]},{"bars":[[0.15,0.85,92,0],[1.15,1.85,95,0],[2.15,2.85,97,0],[3.15,3.85,99,0]],"caption":"縦軸を 90 から：同じデータでも差が何倍にも見える。軸の省略は読む側が最初に確認すべき点。","labels":[[0.5,99.6,"A"],[1.5,99.6,"B"],[2.5,99.6,"C"],[3.5,99.6,"D"]],"y_range":[90,100]},{"bars":[[0.15,0.85,99,0],[1.15,1.85,97,0],[2.15,2.85,95,0],[3.15,3.85,92,0]],"caption":"大きい順に並べ替え：比較が目的なら、順位が一目で分かる並びにする。","labels":[[0.5,104,"D"],[1.5,104,"C"],[2.5,104,"B"],[3.5,104,"A"]],"y_range":[0,110]}],"x_range":[0,4],"y_range":[0,110]};
 var id = 'viz-steps-axis-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」では、2 つの変量を同時に扱う方法として散布図やクロス集計表を学びます。グループ化棒グラフは「月」と「チャネル」という 2 つのカテゴリでクロス集計した表を、そのまま棒にしたものです。情報I「データの活用」の「データの可視化」で、表の行と列をグラフのどこに割り当てるかを考える練習として、この図は格好の題材になります。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;いちばん多い失敗は、系列を 5 本以上に増やしすぎることです。1 グループに 5 色以上の棒が並ぶと、色を凡例と照合する作業で読む力が尽きるので、3〜4 本に抑えるか、系列ごとに小さな図に分けます。二つ目は似た色を使うこと。青と水色のように近い色だとグループ内の順位が読めないので、色覚の多様性にも配慮して、明暗や色相のはっきり違う色を選びます。三つ目は合計を読もうとすることです。グループ化棒グラフは「各系列の値」を見る図で、月全体の合計は示していません。合計と内訳を見たいなら積み上げ棒グラフの出番です。&lt;/p&gt;</description></item><item><title>移動平均でノイズをならす | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/line/line-rolling-average_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/line/line-rolling-average_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;移動平均は、「直近 7 日の平均」のような&lt;strong&gt;小さな窓の平均を、窓を 1 日ずつずらしながら毎日計算&lt;/strong&gt;して線にしたものです。日ごとの細かい揺れ（ノイズ）を打ち消し、「上り坂か下り坂か」という&lt;strong&gt;トレンド&lt;/strong&gt;を見やすくします。窓を 7 日から 30 日へ広げるほど線はなめらかになりますが、向きが変わった瞬間（転換点）が遅れて見えるのが代償です。元の折れ線も薄く重ねて描くのがコツで、ならした線だけを見ると 1 日だけの突発的な変化を見逃します。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;毎日の勉強時間を 2 か月記録すると、部活のある日は 30 分、休日は 3 時間、とジグザグした折れ線になります。そのままでは「最近は増えているのか減っているのか」が分かりません。知りたいのはジグザグの 1 本 1 本ではなく、その&lt;strong&gt;真ん中を通る大きな流れ&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例です。60 日分の日次売上（灰色）に 7 日移動平均（青）を重ねています。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/line/ja/line-rolling-average-block01-fig01.png"
 alt="60 日分の日次売上を灰色の細い折れ線で、その 7 日移動平均を青い太い線で重ねた図。灰色は毎日ギザギザに揺れ、青はその真ん中をなめらかに通って全体の上がり下がりだけを示している"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;灰色の線は毎日上下していますが、青い線を見れば「どのあたりで上昇が始まり、どこで頭打ちになったか」が読めます。移動平均が答える問いは &lt;strong&gt;「日々の揺れを除くと、この数字はどちらへ向かっているか」&lt;/strong&gt; です。&lt;/p&gt;
&lt;h2 id="窓をずらして平均をとる"&gt;
 窓をずらして平均をとる
 
 &lt;a class="anchor" href="#%e7%aa%93%e3%82%92%e3%81%9a%e3%82%89%e3%81%97%e3%81%a6%e5%b9%b3%e5%9d%87%e3%82%92%e3%81%a8%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず窓の幅を決めます。図では 7 日で、1 週間の曜日のパターン（週末に多い、など）をちょうど 1 周ぶん含むので、曜日の揺れが打ち消されます。次に最初の窓の平均を出します。1 日目から 7 日目の 7 個の値を足して 7 で割り、その値を窓の真ん中の 4 日目に打ちます。続いて窓を 1 日ずらして同じ計算を繰り返し、2 日目から 8 日目の平均を 5 日目に、3 日目から 9 日目の平均を 6 日目に打っていきます。1 日ごとに 1 個の値が入れ替わるだけなので、隣り合う平均は少しずつしか変わらず、線がなめらかになります。最後に元の線と重ねます。灰色の原系列を細く薄く、青の 7 日移動平均を太く描くと、どちらが主役かが一目で分かります。&lt;/p&gt;
&lt;p&gt;窓の幅を変えると図はどう変わるでしょう。窓を 3 日に縮めると、青い線は灰色に近づいてギザギザが残ります。窓を 30 日に広げると、青はほとんど直線になりますが、山の頂上が実際より右（後ろ）にずれて見え、両端の 15 日ずつは値が計算できず欠けます。「なめらかさ」と「反応の速さ」は交換条件です。&lt;/p&gt;
&lt;p&gt;次のコードは、10 日分の値に 3 日の窓をずらして平均を出す手順を、そのまま書いたものです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 10 日分の売上&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sales&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;day &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;.1f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 窓の真ん中の日に書く&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;データと窓の幅を決める&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sales&lt;/code&gt; は 10 日分の売上で、48 や 80 のように飛び出た値を混ぜてあります。&lt;code&gt;window = 3&lt;/code&gt; が窓の幅で、ここを 5 や 7 に変えるだけで「何日分の平均をとるか」が変わります。本文の図は &lt;code&gt;window = 7&lt;/code&gt; に相当します。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;窓を置ける回数は len − window &amp;#43; 1&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;range(len(sales) - window + 1)&lt;/code&gt; は 10 − 3 + 1 = 8 回の繰り返しで、窓の左端 &lt;code&gt;i&lt;/code&gt; を 0 から 7 まで動かします。10 日分あっても 8 個しか平均が出ないのは、窓がデータの端からはみ出す位置には置けないからで、これが移動平均の両端が欠ける理由そのものです。&lt;code&gt;range(len(sales))&lt;/code&gt; と書いてしまうと最後の 2 回で窓が足りず、短い窓の平均が混ざります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;窓の中の合計を窓の幅で割る&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sales[i:i + window]&lt;/code&gt; が窓に入る 3 個の値を切り出し、&lt;code&gt;sum(...) / window&lt;/code&gt; でその平均を出します。1 回ずらすと 1 個が抜けて 1 個が入るだけなので、隣り合う &lt;code&gt;avg&lt;/code&gt; は大きくは変わりません。これが線をなめらかにする仕組みで、&lt;code&gt;window&lt;/code&gt; を大きくすればするほど 1 個の入れ替わりの影響は小さくなります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="5"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;5 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;平均は窓の真ん中の日に書く&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;i + 2&lt;/code&gt; が窓の真ん中の日（&lt;code&gt;i + 1&lt;/code&gt; が窓の最初の日なので、その 1 日後）です。真ん中に置くことで、元の値の山と平均の山が同じ日に出ます。&lt;code&gt;i + 3&lt;/code&gt; のように窓の最後の日に書くと線が 1 日右にずれ、&lt;code&gt;:.1f&lt;/code&gt; は小数第 1 位まで表示する指定です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;出力は day 2 から day 9 までの 8 個。10 日分あっても、両端の 1 日ずつは窓がはみ出すので計算できません。48 や 80 のような飛び出た値が、53.7 や 75.3 のようにならされていることも確かめてください。&lt;/p&gt;</description></item><item><title>MAE と RMSE | 高校生向けにやさしく解説（予測のズレを平均する 2 つの方法）</title><link>https://k-dm.work/eval/regression/mae-rmse_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/regression/mae-rmse_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;MAE と RMSE は、回帰モデル（数を予測するモデル）の&lt;strong&gt;予測と実際のズレ&lt;/strong&gt;をまとめて 1 つの数にした指標で、単位はもとのデータと同じ ℃ や円です。&lt;strong&gt;MAE&lt;/strong&gt;（平均絶対誤差）はズレの&lt;strong&gt;絶対値&lt;/strong&gt;をそのまま平均するので、「平均して何 ℃ 外れるか」と読めます。&lt;strong&gt;RMSE&lt;/strong&gt;（二乗平均平方根誤差）はズレを &lt;strong&gt;2 乗して平均し、平方根&lt;/strong&gt;をとるので、5 ℃ のズレを 25 として数え、大きなズレを重く評価します。つねに MAE ≦ RMSE で、気温予報 5 日分の例なら MAE = 2.0、RMSE ≈ 2.53 となり、2 つの差が大きいほど極端に外れた予測が混ざっています。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;天気アプリの最高気温の予報を 5 日分メモし、実際の気温と比べました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;日&lt;/th&gt;
 &lt;th style="text-align: center"&gt;予報（℃）&lt;/th&gt;
 &lt;th style="text-align: center"&gt;実際（℃）&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ズレ \(e\)&lt;/th&gt;
 &lt;th style="text-align: center"&gt;\(\lvert e \rvert\)&lt;/th&gt;
 &lt;th style="text-align: center"&gt;\(e^2\)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;25&lt;/td&gt;
 &lt;td style="text-align: center"&gt;26&lt;/td&gt;
 &lt;td style="text-align: center"&gt;−1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;27&lt;/td&gt;
 &lt;td style="text-align: center"&gt;26&lt;/td&gt;
 &lt;td style="text-align: center"&gt;+1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;td style="text-align: center"&gt;30&lt;/td&gt;
 &lt;td style="text-align: center"&gt;28&lt;/td&gt;
 &lt;td style="text-align: center"&gt;+2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td style="text-align: center"&gt;24&lt;/td&gt;
 &lt;td style="text-align: center"&gt;25&lt;/td&gt;
 &lt;td style="text-align: center"&gt;−1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;31&lt;/td&gt;
 &lt;td style="text-align: center"&gt;26&lt;/td&gt;
 &lt;td style="text-align: center"&gt;+5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td style="text-align: center"&gt;25&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;「この予報はどのくらい当たっているか」を 1 つの数で言いたいとき、ズレを平均すればよさそうです。でも +1 と −1 をそのまま足すと打ち消し合ってしまうので、符号を消してから平均します。消し方が 2 とおりあり、それが MAE と RMSE です。&lt;/p&gt;
$$
\mathrm{MAE} = \frac{1+1+2+1+5}{5} = 2.0, \qquad
\mathrm{RMSE} = \sqrt{\frac{1+1+4+1+25}{5}} = \sqrt{6.4} \approx 2.53
$$&lt;p&gt;散布図で考えると、横軸に「予報」、縦軸に「実際」をとって 5 つの点を打ち、対角線（予報＝実際）を引いたときの、&lt;strong&gt;各点から対角線までの縦の距離&lt;/strong&gt;がズレです。MAE はその距離の平均、RMSE は距離を 2 乗して平均した値の平方根です。&lt;/p&gt;
&lt;h2 id="仕組み2-乗すると大きなズレが重くなる"&gt;
 仕組み：2 乗すると大きなズレが「重く」なる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf2-%e4%b9%97%e3%81%99%e3%82%8b%e3%81%a8%e5%a4%a7%e3%81%8d%e3%81%aa%e3%82%ba%e3%83%ac%e3%81%8c%e9%87%8d%e3%81%8f%e3%81%aa%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、点ごとに「実際 − 予測」を出して&lt;strong&gt;ズレを測ります&lt;/strong&gt;。回帰直線を引いたグラフなら、点から直線までの縦の長さです。次に&lt;strong&gt;符号を消します&lt;/strong&gt;。MAE は絶対値をとり、RMSE は 2 乗する。ここで分かれ道です。そのうえで \(n\) 個の合計を \(n\) で割って&lt;strong&gt;平均&lt;/strong&gt;し、最後に RMSE だけは 2 乗したぶん単位が「℃²」になっているので、平方根をとって「℃」に&lt;strong&gt;戻します&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;大きなズレを 1 つ入れてみると違いがはっきりします。5 日目のズレが 5 ではなく 10 だったとしましょう。MAE は \((1+1+2+1+10)/5 = 3.0\) と 1.0 増えるだけですが、RMSE は \(\sqrt{(1+1+4+1+100)/5} = \sqrt{21.4} \approx 4.63\) と 2 倍近くに跳ね上がります。2 乗の中では 10 が 100 として効くからです。逆に 5 つのズレが全部 2 なら、MAE = RMSE = 2.0 でぴったり一致します。&lt;/p&gt;</description></item><item><title>MinMaxScaler ってなに？ | 高校生向けにやさしく解説（0〜1 にそろえる）</title><link>https://k-dm.work/prep/numerical/minmaxscaler_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/prep/numerical/minmaxscaler_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;MinMaxScaler は、ある項目の&lt;strong&gt;最小値を 0、最大値を 1&lt;/strong&gt; に置き直し、間の値を比例配分する変換です（区間正規化）。式は一次式 \(x&amp;rsquo; = \dfrac{x - x_{\min}}{x_{\max} - x_{\min}}\) で、平行移動して一定倍するだけなので、&lt;strong&gt;ヒストグラムの形は変わらず、横軸の目盛りだけが置き換わります&lt;/strong&gt;。「秒」と「m」のように単位や桁のちがう項目を、同じものさしで比べたり足し合わせたりしたいときに使います。弱点は外れ値で、1 個の極端な値が最大値を決めてしまうと、残りが 0 のそばに押し込まれます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;体力テストで、50 m 走（秒）とハンドボール投げ（m）の記録から「似た体力の人」を探したいとします。A さんと B さんの 2 人の記録を見てみましょう。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;50 m 走&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ハンドボール投げ&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;A さん&lt;/td&gt;
 &lt;td style="text-align: center"&gt;7.2 秒&lt;/td&gt;
 &lt;td style="text-align: center"&gt;25 m&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;B さん&lt;/td&gt;
 &lt;td style="text-align: center"&gt;9.0 秒&lt;/td&gt;
 &lt;td style="text-align: center"&gt;27 m&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;2 人のちがいは、走りで 1.8、投げで 2。数字の大きさだけ見ると「同じくらいちがう」ように見えます。でも 50 m 走でクラスの記録が 7〜9 秒に収まるなら、1.8 秒差は&lt;strong&gt;最速と最遅の差&lt;/strong&gt;です。一方、ハンドボール投げの記録が 15〜35 m にちらばっているなら、2 m の差はほとんど誤差です。&lt;/p&gt;
&lt;p&gt;つまり「数字の差」を単位のまま比べると、&lt;strong&gt;目盛りの粗い項目が勝手に重く数えられてしまう&lt;/strong&gt;のです。そこで、すべての項目を「最小 0・最大 1」の同じものさしに移してから比べます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/prep/numerical/minmaxscaler-ja_block01_ja.png"
 alt="変換前は 2 つの特徴量のヒストグラムが横軸の別々の場所に別々の幅で立っているが、MinMaxScaler 適用後は両方とも -1〜1 の同じ範囲に収まり山の形はそのまま重なっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;左は変換前。特徴量 1 は 20 のあたりに細く、特徴量 2 は 100 のあたりに幅広く立っていて、横軸の別々の場所にいます。右は変換後（この例では −1〜1 に移しています）。&lt;strong&gt;2 つの山が同じ範囲にぴったり重なり、横軸の目盛りが「最小が −1、最大が 1」に変わった&lt;/strong&gt;だけで、山の形は左右で同じです。&lt;/p&gt;
&lt;h2 id="仕組みものさしを作り直す"&gt;
 仕組み：ものさしを作り直す
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e3%82%82%e3%81%ae%e3%81%95%e3%81%97%e3%82%92%e4%bd%9c%e3%82%8a%e7%9b%b4%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、最小値と最大値を見つけます。ヒストグラムでいえば、山の左端 \(x_{\min}\) と右端 \(x_{\max}\) に印をつける作業です。次に、全部の値から \(x_{\min}\) を引きます。山がまるごと左へ平行移動して左端が 0 に来ますが、形は変わりません。続けて、右端までの長さ \(x_{\max} - x_{\min}\) で割ります。山が横に伸び縮みして右端がちょうど 1 に来て、ここでも山の高さの並びは変わりません。最後に、ほかの項目にも同じことをします。それぞれの項目が自分の最小・最大で 0〜1 に移るので、すべての山が同じ範囲に並びます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="最小値と最大値を見つける -&amp;gt; 全部の値から最小値を引く（左端が 0 に） -&amp;gt; 範囲 x_max − x_min で割る（右端が 1 に） -&amp;gt; ほかの項目にも同じことをする"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;最小値と最大値を見つける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;全部の値から最小値を引く（左端が 0 に）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;範囲 x_max − x_min で割る（右端が 1 に）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;ほかの項目にも同じことをする&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;式にまとめると次の一次式です。&lt;/p&gt;
$$
x' = \frac{x - x_{\min}}{x_{\max} - x_{\min}}
$$&lt;p&gt;50 m 走 4 人分の記録で、この式をそのまま計算してみます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;7.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;8.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;9.1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 50 m 走の記録（秒）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;scaled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hi&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scaled&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# [0.0, 0.32, 0.68, 1.0]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;最小値と最大値がものさしの両端&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;min(x)&lt;/code&gt; が 7.2、&lt;code&gt;max(x)&lt;/code&gt; が 9.1 で、この 2 つが新しいものさしの 0 と 1 になります。ここで決めた &lt;code&gt;lo&lt;/code&gt; と &lt;code&gt;hi&lt;/code&gt; は、あとから別の人の記録を変換するときにも同じ値を使い続けます。毎回取り直すと、同じ 8.0 秒が人によって別の数になってしまいます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;引いて割るだけの一次式&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(v - lo) / (hi - lo)&lt;/code&gt; が本文の式そのものです。&lt;code&gt;v - lo&lt;/code&gt; で左端を 0 に動かし、&lt;code&gt;hi - lo&lt;/code&gt;（= 1.9 秒）で割って右端を 1 にしています。全員に同じ引き算と割り算をするので、順位も値どうしの間かくの比も変わりません。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;結果は 0 と 1 を両端にした割合&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;出力の &lt;code&gt;[0.0, 0.32, 0.68, 1.0]&lt;/code&gt; を見ると、最速の 7.2 秒が 0、最遅の 9.1 秒が 1 になり、7.8 秒は「範囲の 32 % のところ」と読めます。この 0.32 とハンドボール投げの 0〜1 の値を足したり比べたりできるのが、ものさしをそろえた効果です。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>RobustScaler ってなに？ | 高校生向けにやさしく解説（外れ値に負けないスケーリング）</title><link>https://k-dm.work/prep/numerical/robustscaler_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/prep/numerical/robustscaler_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;RobustScaler は、&lt;strong&gt;中央値を引いて四分位範囲（IQR）で割る&lt;/strong&gt;スケーリングです。平均と標準偏差のかわりに、順位で決まる値を使います。平均や標準偏差は外れ値（極端に離れた値）に強く引っぱられますが、中央値と四分位範囲はほとんど動かないので、&lt;strong&gt;外れ値があっても大多数のデータがつぶれない&lt;/strong&gt;のが特徴です。箱ひげ図でいえば&lt;strong&gt;箱の中心を 0 に、箱の幅を 1 にそろえる&lt;/strong&gt;変換で、ひげの外の点（外れ値）は遠くに残ったままです。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;クラス 8 人の通学時間（分）を調べたら、次のようになりました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;12&lt;/th&gt;
 &lt;th style="text-align: center"&gt;15&lt;/th&gt;
 &lt;th style="text-align: center"&gt;18&lt;/th&gt;
 &lt;th style="text-align: center"&gt;20&lt;/th&gt;
 &lt;th style="text-align: center"&gt;22&lt;/th&gt;
 &lt;th style="text-align: center"&gt;25&lt;/th&gt;
 &lt;th style="text-align: center"&gt;28&lt;/th&gt;
 &lt;th style="text-align: center"&gt;&lt;strong&gt;150&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;1 人だけ、遠くから新幹線通学している生徒がいます。この 8 人の「ふつうの通学時間」を代表する数はいくつでしょう。&lt;/p&gt;
&lt;p&gt;平均を計算すると \(290 \div 8 = 36.25\) 分。ところが 8 人のうち 7 人は 30 分以内で、平均より短い通学時間です。標準偏差も約 43 分に膨らみます。平均と標準偏差で &lt;a href="https://k-dm.work/prep/numerical/standardscaler_highschool/"&gt;StandardScaler&lt;/a&gt; のように標準化すると、25 分の人の z スコアは \((25 - 36.25)/43.3 \approx -0.26\)。「ふつうより少し短い」という、実感と合わない値になります。&lt;/p&gt;
&lt;p&gt;一方、中央値は \((20 + 22)/2 = 21\) 分。150 分の生徒が 1500 分でも中央値は 21 のままです。「順位で決まる値は、端の値がどれだけ極端でも動かない」。これが RobustScaler の土台です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/prep/numerical/robustscaler-ja_block01_ja.png"
 alt="変換前の箱ひげ図は 50 付近に小さな箱があり 120〜160 と 4〜8 に外れ値の点が離れて並んでいるが、RobustScaler 適用後は箱の中心が 0、箱の幅が 1 になり、外れ値の点は相対的に同じ遠さで残っている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図の左は変換前の箱ひげ図です。大多数のデータは 50 のまわりに集まって小さな箱を作り、右のほうに 120〜160 の外れ値が点で散っています。右が変換後。&lt;strong&gt;箱の中心（中央値）が 0 に、箱の横幅（四分位範囲）が 1 にそろいました&lt;/strong&gt;。外れ値の点は消えずに、やはり箱から 10 目盛り以上遠く離れたところに残っています。&lt;/p&gt;
&lt;h2 id="仕組み中央値を引いて四分位範囲で割る"&gt;
 仕組み：中央値を引いて、四分位範囲で割る
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e4%b8%ad%e5%a4%ae%e5%80%a4%e3%82%92%e5%bc%95%e3%81%84%e3%81%a6%e5%9b%9b%e5%88%86%e4%bd%8d%e7%af%84%e5%9b%b2%e3%81%a7%e5%89%b2%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、データを小さい順に並べて中央値 \(m\) を見つけます。箱ひげ図の箱の中の線です。次に、第 1 四分位数 \(Q_1\) と第 3 四分位数 \(Q_3\) を求め、四分位範囲 \(\mathrm{IQR} = Q_3 - Q_1\) を出します。箱ひげ図では箱の左端と右端、そして箱の横幅に当たります。続けて、すべての値から \(m\) を引くと、箱ひげ図がまるごと平行移動して箱の中の線が 0 に来ます。最後に \(\mathrm{IQR}\) で割ると、箱の横幅がちょうど 1 になるように全体が伸び縮みします。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="小さい順に並べて中央値 m を見つける -&amp;gt; Q1 と Q3 から四分位範囲 IQR を出す -&amp;gt; すべての値から m を引く（箱の線が 0 に） -&amp;gt; IQR で割る（箱の幅が 1 に）"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;小さい順に並べて中央値 m を見つける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;Q1 と Q3 から四分位範囲 IQR を出す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;すべての値から m を引く（箱の線が 0 に）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;IQR で割る（箱の幅が 1 に）&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

$$
z = \frac{x - m}{\mathrm{IQR}}
$$&lt;p&gt;通学時間 8 人の例で計算してみましょう。四分位数は教科書の方法で求めているので、Python の &lt;code&gt;numpy.percentile&lt;/code&gt; とは少し値がずれることがあります。&lt;/p&gt;</description></item><item><title>季節成分とトレンドの分解 | 高校生向けにやさしく解説（折れ線を 3 つの部品に分ける）</title><link>https://k-dm.work/timeseries/07_state_space/seasonal_decomposition_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/07_state_space/seasonal_decomposition_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;時系列の折れ線は、&lt;strong&gt;トレンド&lt;/strong&gt;（長い期間でゆっくり上がる・下がる流れ）、&lt;strong&gt;季節成分&lt;/strong&gt;（毎年・毎週など決まった間隔でくり返す波）、&lt;strong&gt;残差&lt;/strong&gt;（どちらでも説明できない残りのゆらぎ）の 3 つを足したものと考えられます。分解とは、1 本の折れ線をこの 3 枚のグラフに分けて描き直すことです。トレンドは「1 周期分（図では 365 日）の移動平均」で取り出し、季節成分は「同じ時期どうしの平均」で取り出すので、使うのは引き算と平均だけです。分けて見ると「本当に伸びているのか」「夏が暑かっただけなのか」を 2 段目と 3 段目で区別できます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;学校の近くのコンビニで、冷たい飲み物の売上を 4 年分、毎日記録したとします。折れ線は夏に高く冬に低い波を 4 回くり返しながら、全体としては少しずつ右上がりに見えます。店長が「本当に成長しているの？ 去年の夏が暑かっただけ？」と聞いてきました。1 本の折れ線のままでは答えにくいはずです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/seasonal_decompose.svg"
 alt="上から順に、原系列・トレンド・季節・残差の 4 段。原系列の大きな波が、ほぼ一直線のトレンドと、毎年同じ形をくり返す季節の波と、0 のまわりで細かく散る残差に分かれている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;1 段目が元の折れ線（原系列）。2 段目の&lt;strong&gt;トレンド&lt;/strong&gt;は波が消えてほぼ一直線に上がり、3 段目の&lt;strong&gt;季節&lt;/strong&gt;は同じ形の波が 4 回くり返され、4 段目の&lt;strong&gt;残差&lt;/strong&gt;は 0 を中心に細かく散るだけです。「成長している」のは 2 段目、「夏に高い」のは 3 段目の担当、と切り分けられました。&lt;/p&gt;
&lt;h2 id="仕組み1-本の線を-3-枚に分ける"&gt;
 仕組み：1 本の線を 3 枚に分ける
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf1-%e6%9c%ac%e3%81%ae%e7%b7%9a%e3%82%92-3-%e6%9e%9a%e3%81%ab%e5%88%86%e3%81%91%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;分解の約束は次の 1 行です（加法型）。&lt;/p&gt;
$$
\text{観測値} = \text{トレンド} + \text{季節} + \text{残差}
$$&lt;p&gt;まず&lt;strong&gt;周期を決めます&lt;/strong&gt;。図では毎年同じ形なので 365 日で、くり返しの間隔がそのまま周期になります。次に&lt;strong&gt;トレンドを取り出します&lt;/strong&gt;。1 周期分（365 日）の&lt;a href="https://k-dm.work/timeseries/05_transformations/rolling_statistics_highschool/"&gt;移動平均&lt;/a&gt;をとると、窓にちょうど 1 年分が入るので夏の高さと冬の低さが打ち消し合い、ゆるやかな流れだけが残ります。これが 2 段目です。それから&lt;strong&gt;季節成分を取り出します&lt;/strong&gt;。原系列からトレンドを引くと「季節＋残差」が残り、これを「1 月 1 日どうし」「1 月 2 日どうし」と同じ日付で集めて平均すると、ゆらぎは薄まって毎年共通の形だけが浮かびます。それを 4 年分並べたのが 3 段目です。最後に&lt;strong&gt;残差を求めます&lt;/strong&gt;。原系列からトレンドと季節の両方を引いた残りが 4 段目で、ここに形が残っていなければ分解はうまくいっています。&lt;/p&gt;


 &lt;script src="https://k-dm.work/mermaid.min.js"&gt;&lt;/script&gt;
 
 &lt;script&gt;
 mermaid.initialize({
 "flowchart": {
 "useMaxWidth": false
 },
 "sequence": { "useMaxWidth": false },
 "theme": "default"
}
);
 &lt;/script&gt;
 
 


&lt;div class="mermaid"
 align="center"&gt;
flowchart LR
 A[&amp;#34;原系列&amp;#34;] --&amp;gt; B[&amp;#34;1 周期の移動平均&amp;lt;br&amp;gt;→ トレンド&amp;#34;]
 A --&amp;gt; C[&amp;#34;原系列 − トレンド&amp;#34;]
 C --&amp;gt; D[&amp;#34;同じ時期どうしで平均&amp;lt;br&amp;gt;→ 季節成分&amp;#34;]
 C --&amp;gt; E[&amp;#34;さらに季節を引く&amp;lt;br&amp;gt;→ 残差&amp;#34;]
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-decomp-0" data-viz-type="steps" data-steps-kind="decomp" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"元データ：上向きの傾向（トレンド）と、周期 12 の上下（季節性）と、細かなノイズが重なっている。","curve":[[0,4.27],[1,4.9],[2,4.89],[3,6.36],[4,5.88],[5,5.41],[6,4.59],[7,4.68],[8,3.8],[9,3.84],[10,3.26],[11,3.83],[12,4.38],[13,5.71],[14,4.93],[15,7.76],[16,6.76],[17,6.22],[18,5.96],[19,4.51],[20,4.37],[21,4.55],[22,3.47],[23,6.07],[24,6.01],[25,7.17],[26,6.87],[27,7.41],[28,8.63],[29,6.82],[30,6.17],[31,5.97],[32,6.03],[33,3.63],[34,6.21],[35,6.17],[36,7.42],[37,7.17],[38,8.62],[39,9.68],[40,8.54],[41,7.72],[42,7.12],[43,6.34],[44,6.62],[45,6.13],[46,6.02],[47,7.44]],"metrics":{"period":12}},{"caption":"トレンド：周期 12 の移動平均でならすと、季節の上下が消えて傾向だけが残る（青）。","curve":[[6,4.64],[7,4.65],[8,4.72],[9,4.72],[10,4.84],[11,4.91],[12,4.98],[13,5.09],[14,5.08],[15,5.13],[16,5.19],[17,5.2],[18,5.39],[19,5.53],[20,5.65],[21,5.81],[22,5.78],[23,5.94],[24,5.99],[25,6],[26,6.13],[27,6.26],[28,6.19],[29,6.42],[30,6.42],[31,6.54],[32,6.54],[33,6.69],[34,6.88],[35,6.87],[36,6.94],[37,7.02],[38,7.05],[39,7.1],[40,7.31],[41,7.3]],"curve2":[[0,4.27],[1,4.9],[2,4.89],[3,6.36],[4,5.88],[5,5.41],[6,4.59],[7,4.68],[8,3.8],[9,3.84],[10,3.26],[11,3.83],[12,4.38],[13,5.71],[14,4.93],[15,7.76],[16,6.76],[17,6.22],[18,5.96],[19,4.51],[20,4.37],[21,4.55],[22,3.47],[23,6.07],[24,6.01],[25,7.17],[26,6.87],[27,7.41],[28,8.63],[29,6.82],[30,6.17],[31,5.97],[32,6.03],[33,3.63],[34,6.21],[35,6.17],[36,7.42],[37,7.17],[38,8.62],[39,9.68],[40,8.54],[41,7.72],[42,7.12],[43,6.34],[44,6.62],[45,6.13],[46,6.02],[47,7.44]]},{"caption":"季節成分：元データからトレンドを引き、同じ季節位置ごとに平均すると、毎周期くり返す形が出る。","curve":[[0,5.91],[1,6.59],[2,6.66],[3,8.06],[4,7.69],[5,6.56],[6,6.03],[7,5.42],[8,5.04],[9,4.21],[10,4.43],[11,5.39],[12,5.91],[13,6.59],[14,6.66],[15,8.06],[16,7.69],[17,6.56],[18,6.03],[19,5.42],[20,5.04],[21,4.21],[22,4.43],[23,5.39],[24,5.91],[25,6.59],[26,6.66],[27,8.06],[28,7.69],[29,6.56],[30,6.03],[31,5.42],[32,5.04],[33,4.21],[34,4.43],[35,5.39],[36,5.91],[37,6.59],[38,6.66],[39,8.06],[40,7.69],[41,6.56],[42,6.03],[43,5.42],[44,5.04],[45,4.21],[46,4.43],[47,5.39]],"hband":[[6,6.01,0]]},{"caption":"残差：元データ − トレンド − 季節成分。規則のない部分だけが残る。ここに大きな山があれば異常の候補。","curve":[[6,5.92],[7,6.6],[8,6.04],[9,6.91],[10,6],[11,5.52],[12,5.49],[13,6.03],[14,5.19],[15,6.57],[16,5.88],[17,6.46],[18,6.54],[19,5.56],[20,5.68],[21,6.53],[22,5.26],[23,6.74],[24,6.11],[25,6.58],[26,6.08],[27,5.08],[28,6.75],[29,5.85],[30,5.71],[31,6],[32,6.45],[33,4.73],[34,6.91],[35,5.91],[36,6.57],[37,5.56],[38,6.9],[39,6.51],[40,5.54],[41,5.87]],"hband":[[6,6.01,0]]}],"x_range":[0,47],"y_range":[0,12]};
 var id = 'viz-steps-decomp-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報I「データの活用」では、時系列データから&lt;strong&gt;傾向&lt;/strong&gt;と&lt;strong&gt;季節性&lt;/strong&gt;を読み取ることを学びます。分解の 2 段目がその「傾向」、3 段目が「季節性」を、目で読むのではなく計算で取り出したものです。計算の中身は、数学Iで習った&lt;strong&gt;平均&lt;/strong&gt;（365 日の移動平均・同じ時期どうしの平均）と引き算だけです。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意は、&lt;strong&gt;周期（period）を間違えると分解が崩れる&lt;/strong&gt;ことです。365 日の波に周期 30 で分解すると、季節の段に意味のない形が出て、残差に大きな波が残ります。まず折れ線で山と山の間隔を数えましょう。二つ目は、&lt;strong&gt;4 段目の残差に形が残っていたら要注意&lt;/strong&gt;ということです。「夏だけプラスに偏る」「後半だけ広がる」なら、季節の高さが年ごとに変わる構造があるので、乗法型（かけ算で考える）や STL 分解を試します。三つ目は、&lt;strong&gt;トレンドの端が欠ける&lt;/strong&gt;ことです。1 年分の移動平均を使うので最初と最後の半年分は計算できず、図の 2 段目が両端で切れているのはそのためです。最後に、新商品の発売のような 1 回限りの出来事は、どの段にも入らず残差に飛び出します。&lt;/p&gt;</description></item><item><title>積み上げ棒グラフの読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/bar/stacked-bar_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/visualize/bar/stacked-bar_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;積み上げ棒グラフは、1 本の棒を内訳ごとに色分けして積み、&lt;strong&gt;合計（棒の高さ）と内訳（各段の厚み）を同時に&lt;/strong&gt;見せる図です。答える問いは「全体はどう変わったか」と「その中でどの部分が伸びたか」の 2 つ。各段の厚みを合計で割れば&lt;strong&gt;構成比&lt;/strong&gt;（部分÷全体）になり、100% 積み上げにすると合計をそろえて構成比だけを比べられます。いちばん下の段以外は根元がそろわないので、段の厚みの正確な比較は苦手です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭の売上を「食べ物」「飲み物」「グッズ」に分けて、1 日目から 3 日目まで記録したとします。知りたいのは「合計はどの日が多かったか」と「飲み物の割合は増えたか」の両方。別々の棒グラフを 2 枚描いてもいいのですが、1 枚にまとめられるのが積み上げ棒グラフです。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、月別の売上をオンライン・店舗・卸の 3 段に積んだものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/bar/ja/stacked-bar-block01-fig01.png"
 alt="4 か月分の売上を、下からオンライン（青）・店舗（黄）・卸（緑）の順に積み上げた棒グラフ。棒全体の高さが月の合計を、各段の厚みが内訳を表し、月を追って合計が伸びている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;棒のてっぺんを横にたどれば、合計が 4 月の 310 から 7 月の 445 に伸びていることが分かります。いちばん下の青（オンライン）の段は根元が 0 でそろっているので、150 から 210 へ伸びていることもすぐ読めます。&lt;/p&gt;
&lt;h2 id="棒はこう積む"&gt;
 棒はこう積む
 
 &lt;a class="anchor" href="#%e6%a3%92%e3%81%af%e3%81%93%e3%81%86%e7%a9%8d%e3%82%80"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、3 つの系列の順番を決めて、いちばん大事なものを最下段に置きます。図ではオンラインが最下段で、ここだけは根元が 0 なのでふつうの棒グラフと同じ精度で読めます。次に、2 段目を 1 段目の上に乗せます。店舗の棒は根元を「オンラインの値」に置いて立てるので、4 月なら 150 から 250 までが店舗の段です。それから 3 段目を「1 段目＋2 段目」の上に乗せます。卸の根元は 150 + 100 = 250、てっぺんは 310 になり、これが 4 月の合計です。最後に凡例を段の順に合わせます。下から上の並び（オンライン・店舗・卸）と凡例の並びをそろえると、色と名前の対応で迷いません。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう動くでしょう。もし 7 月の卸だけが 85 から 170 に倍増すると、7 月の緑の段が 2 倍に厚くなり、てっぺんが 530 まで伸びます。一方、7 月のオンラインと店舗の段は位置も厚みも変わりません。「ある段が厚くなると、その上に乗るものはすべて押し上げられる」。この性質が、合計（てっぺん）を読みやすくし、同時に 2 段目以降の比較を難しくしています。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-composition-0" data-viz-type="steps" data-steps-kind="composition" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"bars":[[0.15,0.85,45,0],[1.15,1.85,30,1],[2.15,2.85,15,2],[3.15,3.85,10,3]],"caption":"各カテゴリの件数（棒の高さ）。合計 100。","labels":[[0.5,48,"A 45"],[1.5,33,"B 30"],[2.5,18,"C 15"],[3.5,13,"D 10"]],"y_range":[0,55]},{"bars":[[0.15,0.85,45,0],[1.15,1.85,30,1],[2.15,2.85,15,2],[3.15,3.85,10,3]],"caption":"合計で割って割合にする。構成比の比較は、件数ではなく割合で行う。","labels":[[0.5,48,"45%"],[1.5,33,"30%"],[2.5,18,"15%"],[3.5,13,"10%"]],"y_range":[0,55]},{"caption":"積み上げ：1 本の棒に割合を積むと、全体に対する各カテゴリの占める大きさが面積で分かる。","labels":[[2.9,22.5,"A 45%"],[2.9,60,"B 30%"],[2.9,82.5,"C 15%"],[2.9,95,"D 10%"]],"regions":[[1.5,0,2.5,45,0],[1.5,45,2.5,75,1],[1.5,75,2.5,90,2],[1.5,90,2.5,100,3]],"y_range":[0,110]}],"x_range":[0,4],"y_range":[0,55]};
 var id = 'viz-steps-composition-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で学ぶ相対度数は「度数÷全体」でした。積み上げ棒グラフの各段を合計で割ったものが構成比で、全部足すと 1（100%）になります。情報I では、量か割合かで図を選びます。合計も見せたいなら通常の積み上げ、割合だけなら 100% 積み上げ、と使い分けるのがポイントです。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の落とし穴は、2 段目以降の厚みを目で比べることです。店舗（黄）の段は 4 月が 100、7 月が 150 ですが、根元が 150 と 210 で違うため、長さの差を目で正確に測るのはむずかしい。比べたい系列は最下段に移すか、別の棒グラフで補います。二つ目は段が多すぎること。5 色以上に分けると、どの段がどれだけ寄与したか見えなくなるので、主要な 3〜4 系列に絞り、残りは「その他」にまとめます。三つ目は 100% 積み上げで合計を忘れることです。構成比だけを見ていると、合計が 445 から半分に減っていても気づけないので、合計の数字を別に添えましょう。&lt;/p&gt;</description></item><item><title>多項式回帰ってなに？ | 高校生向けにやさしく解説（二次関数でカーブを当てはめる）</title><link>https://k-dm.work/basic/regression/polynomial_regression_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:47 +0900</pubDate><guid>https://k-dm.work/basic/regression/polynomial_regression_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;多項式回帰は、直線では合わないデータに &lt;strong&gt;\(x^2\) や \(x^3\) の項を足した式&lt;/strong&gt;（多項式）でカーブを当てはめる方法です。やっていることは線形回帰と同じで、「点と曲線のズレの 2 乗を全部足した値」を最小にする係数を探します（最小二乗法）。次数（最高で何乗まで使うか）を上げるほど曲線は自由に曲がりますが、手元の点に合わせすぎる&lt;strong&gt;過学習&lt;/strong&gt;（新しいデータで外れること）が起きやすくなります。2 次なら数学Iの二次関数 \(y = ax^2 + bx + c\) そのもので、「係数をデータから決める二次関数」と考えると見通しがよくなります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;1 年分の「月の平均気温」と「家の光熱費」を散布図にしたとします。寒い月は暖房、暑い月は冷房で光熱費が上がるので、12 個の点は &lt;strong&gt;U の字&lt;/strong&gt;に並ぶはずです。ここに &lt;a href="https://k-dm.work/basic/regression/linear_regression_highschool/"&gt;線形回帰&lt;/a&gt; で直線を 1 本引くと、どうなるでしょうか。&lt;/p&gt;
&lt;p&gt;直線は曲がれないので、U の両端（1 月と 8 月）でも真ん中でも点から大きく外れます。「直線しか引けない」という制限をゆるめて、&lt;strong&gt;カーブを当てはめたい&lt;/strong&gt;。これが多項式回帰の出発点です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/regression/polynomial-regression_block01_ja.png"
 alt="S 字に並んだ観測データに、直線（青の点線）と 3 次の多項式（赤の曲線）を当てはめた図。直線は左端と中央で点から大きく外れるが、3 次の曲線は点の流れに沿って曲がり、真の曲線（緑）とほぼ重なる"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は S 字に並んだデータの例です。青の点線（直線）は左端の \(x = -3\) 付近では点の上を、中央では点の下を通ってしまいます。赤の曲線（3 次の多項式）は 2 回向きを変えながら点の流れに沿っていて、本当の関係を表す緑の線とほぼ重なっています。&lt;/p&gt;
&lt;h2 id="カーブはどうやって引く"&gt;
 カーブはどうやって引く？
 
 &lt;a class="anchor" href="#%e3%82%ab%e3%83%bc%e3%83%96%e3%81%af%e3%81%a9%e3%81%86%e3%82%84%e3%81%a3%e3%81%a6%e5%bc%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;多項式回帰は新しい道具を使うわけではなく、&lt;strong&gt;線形回帰に渡す表に \(x^2\) や \(x^3\) の列を足す&lt;/strong&gt;だけです。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="x の列が 1 つの表 -&amp;gt; x² の列、x³ の列を計算して足す -&amp;gt; 式の形 y = ax² &amp;#43; bx &amp;#43; c を決める -&amp;gt; ズレの 2 乗の合計が最小になる係数を選ぶ -&amp;gt; 次数を変えて比べる"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;x の列が 1 つの表&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;x² の列、x³ の列を計算して足す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;式の形 y = ax² + bx + c を決める&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;ズレの 2 乗の合計が最小になる係数を選ぶ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;次数を変えて比べる&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;まず&lt;strong&gt;列を増やします&lt;/strong&gt;。もとの表には \(x\) の列が 1 つだけあるので、そこに \(x^2\) の列、\(x^3\) の列を計算して付け足します。表は横に広がりますが、各行の \(y\) は変わりません。次に&lt;strong&gt;式の形を決めます&lt;/strong&gt;。たとえば 2 次なら \(y = a x^2 + b x + c\) で、係数 \(a, b, c\) はまだ分かりません。続いて係数 \(a, b, c\) を&lt;strong&gt;最小二乗法で決めます&lt;/strong&gt;。各点と曲線の縦方向のズレを 2 乗して全部足し、それがいちばん小さくなる \(a, b, c\) を選ぶ、線形回帰とまったく同じ計算です。図では、曲線が点の集まりの「まん中」を通るように形が決まっていきます。最後に&lt;strong&gt;次数を選びます&lt;/strong&gt;。1 次なら曲がらない直線、2 次なら 1 回曲がる放物線、3 次なら上の図のように 2 回曲がる S 字で、次数を上げるほど曲線は細かく曲がれるようになります。&lt;/p&gt;
&lt;p&gt;列を増やす作業は、Python の 4 行で確かめられます。次の 4 行は、\(x\) が 5 個だけの表を \(x, x^2, x^3\) の 3 列に広げて表示します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;xs&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# x, x^2, x^3 の 3 列に広げる&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;もとの表は x の 5 個だけ&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;xs&lt;/code&gt; が元の表の \(x\) 列で、−2 から 2 までの 5 個です。実際のデータなら気温 12 か月分などが入りますが、2 乗・3 乗で何が起きるかは 5 個で十分に見えます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;1 列を 3 列に広げる 1 行&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(x, x**2, x**3)&lt;/code&gt; で、1 つの \(x\) から 3 つの数を作っています。これが「列を増やす」操作そのもので、scikit-learn の &lt;code&gt;PolynomialFeatures(degree=3)&lt;/code&gt; も中で同じ計算をしています。&lt;code&gt;x**4&lt;/code&gt; を足せば 4 次、&lt;code&gt;x**2&lt;/code&gt; までにすれば 2 次の表になります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3-4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3-4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;行ごとに表示して符号を確かめる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;1 行ずつ表示すると、\(x = -2\) のとき \(x^2 = 4\) はプラス、\(x^3 = -8\) はマイナスと符号が違うのが分かります。偶数乗はいつもプラス、奇数乗は \(x\) と同じ符号になるので、2 次の列は U 字、3 次の列は S 字の形を担当します。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;出力は &lt;code&gt;(-2, 4, -8)&lt;/code&gt;, &lt;code&gt;(-1, 1, -1)&lt;/code&gt;, … と、もとの 1 列が 3 列に増えます。この 3 列を「3 つの変数」として線形回帰に渡すと、結果が 3 次の曲線になります。&lt;/p&gt;</description></item><item><title>箱ひげ図の読み方 | 高校生向けにやさしく解説</title><link>https://k-dm.work/visualize/distribution/boxplot_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:50 +0900</pubDate><guid>https://k-dm.work/visualize/distribution/boxplot_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;箱ひげ図は、データを小さい順に並べて 4 等分する&lt;strong&gt;四分位数&lt;/strong&gt;で分布を要約し、「箱」と「ひげ」で表した図です。箱の中の線が中央値、箱の高さが真ん中 50% の広がり（四分位範囲 IQR）で、答える問いは「グループごとに、真ん中はどこで、どのくらい散らばっているか」です。横に何本も並べられるのでグループの比較が得意で、散らばりが 2 倍になれば箱の高さも 2 倍、中央値が動けば線が上下します。要約なので山が 2 つある分布などの「形」は見えず、ヒストグラムと組み合わせて使います。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;3 つのクラスの数学のテストを比べるとき、平均点だけ見て「A 組が優秀」と言ってよいでしょうか。A 組は全員 60〜70 点に集まり、B 組は 30 点から 100 点までばらばら、ということがあります。「真ん中はどこか」と「どれくらい散らばっているか」を、クラスごとに並べて見たいのです。&lt;/p&gt;
&lt;p&gt;下の図は標準版の例で、自動車の燃費（1 ガロンで走れるマイル数、大きいほど低燃費）を、生産地域ごとに箱ひげ図で並べたものです。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/visualize/distribution/ja/boxplot-block01-fig01.png"
 alt="自動車の燃費を生産地域（アメリカ・日本・ヨーロッパ）ごとに 3 本の箱ひげ図で並べた図。箱の中の線が中央値、箱の高さが真ん中 50% の広がり、箱の外に点で描かれた値が外れ値を示す"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;図を見ると、アメリカ車の箱は低い位置にあり、日本車の箱はいちばん高い位置にあります。中央値を比べれば「日本車のほうが燃費が良い傾向」、箱の高さを比べれば「どの地域がばらつきが大きいか」が、3 本を一度に見比べて分かります。&lt;/p&gt;
&lt;h2 id="箱とひげはこう組み立てる"&gt;
 箱とひげはこう組み立てる
 
 &lt;a class="anchor" href="#%e7%ae%b1%e3%81%a8%e3%81%b2%e3%81%92%e3%81%af%e3%81%93%e3%81%86%e7%b5%84%e3%81%bf%e7%ab%8b%e3%81%a6%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、データを小さい順に並べて中央値を求めます。ちょうど真ん中の値（偶数個なら中央 2 つの平均）が箱の中の線です。次に、下半分の中央値（第 1 四分位数 \(Q_1\)）と上半分の中央値（第 3 四分位数 \(Q_3\)）を求めます。\(Q_1\) が箱の下端、\(Q_3\) が箱の上端で、箱の高さ \(Q_3 - Q_1\) が&lt;strong&gt;四分位範囲（IQR）&lt;/strong&gt;、データの真ん中 50% が入る幅です。それからひげを伸ばしますが、ここが数学I の教科書と少し違います。教科書の箱ひげ図はひげを最小値・最大値まで伸ばしますが、この図（seaborn）は「箱の端から \(1.5 \times \mathrm{IQR}\) 以内にある、いちばん遠い値」までしか伸ばしません。最後に、\(1.5 \times \mathrm{IQR}\) を超えて離れた値を&lt;strong&gt;外れ値&lt;/strong&gt;の候補として 1 つずつ点で示します。図で箱の外に見える点がそれです。&lt;/p&gt;
&lt;p&gt;データが変わると図はどう変わるでしょう。ある地域の車がすべて 5 だけ低燃費になれば、箱・ひげ・点がそろって 5 だけ上に平行移動し、形は変わりません。逆に、中央値は同じでも値のばらつきが 2 倍になれば、箱の高さとひげの長さが 2 倍に伸び、外れ値の判定ライン（\(1.5 \times \mathrm{IQR}\)）も広がるので、以前は点だった値が「ひげの内側」に取り込まれることがあります。「位置」と「広がり」が別々に図に出るのが箱ひげ図の長所です。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-boxplot-0" data-viz-type="steps" data-steps-kind="boxplot" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"手順 1：データを小さい順に並べる（21 個）。","points":[[0.4,2.5,-1],[3.12,2.7,-1],[3.24,2.9,-1],[3.31,2.6,-1],[3.79,2.8,-1],[3.82,2.5,-1],[3.98,2.7,-1],[4.06,2.9,-1],[4.22,2.6,-1],[4.31,2.8,-1],[4.58,2.5,-1],[4.8,2.7,-1],[4.87,2.9,-1],[5.37,2.6,-1],[5.42,2.8,-1],[5.61,2.5,-1],[5.64,2.7,-1],[5.74,2.9,-1],[6.45,2.6,-1],[7.49,2.8,-1],[9.6,2.5,-1]]},{"caption":"手順 2：まん中の値が中央値（4.58）。","points":[[0.4,2.5,-1],[3.12,2.7,-1],[3.24,2.9,-1],[3.31,2.6,-1],[3.79,2.8,-1],[3.82,2.5,-1],[3.98,2.7,-1],[4.06,2.9,-1],[4.22,2.6,-1],[4.31,2.8,-1],[4.58,2.5,-1],[4.8,2.7,-1],[4.87,2.9,-1],[5.37,2.6,-1],[5.42,2.8,-1],[5.61,2.5,-1],[5.64,2.7,-1],[5.74,2.9,-1],[6.45,2.6,-1],[7.49,2.8,-1],[9.6,2.5,-1]],"vlines":[[4.58,"median"]]},{"caption":"手順 3：下半分のまん中が Q1（3.8）、上半分のまん中が Q3（5.62）。箱はこの間＝データの中央 50%。","points":[[0.4,2.5,-1],[3.12,2.7,-1],[3.24,2.9,-1],[3.31,2.6,-1],[3.79,2.8,-1],[3.82,2.5,-1],[3.98,2.7,-1],[4.06,2.9,-1],[4.22,2.6,-1],[4.31,2.8,-1],[4.58,2.5,-1],[4.8,2.7,-1],[4.87,2.9,-1],[5.37,2.6,-1],[5.42,2.8,-1],[5.61,2.5,-1],[5.64,2.7,-1],[5.74,2.9,-1],[6.45,2.6,-1],[7.49,2.8,-1],[9.6,2.5,-1]],"regions":[[3.8,1.2,5.62,2.2,0]],"vlines":[[4.58,"median"]]},{"caption":"手順 4：箱の長さ（IQR = 1.82）の 1.5 倍までひげを伸ばし、その外の点は外れ値として個別に打つ。","lines":[[[3.12,1.7],[3.8,1.7]],[[5.62,1.7],[7.49,1.7]],[[3.12,1.4],[3.12,2]],[[7.49,1.4],[7.49,2]]],"points":[[0.4,2.5,1,1.5],[3.12,2.7,-1,1],[3.24,2.9,-1,1],[3.31,2.6,-1,1],[3.79,2.8,-1,1],[3.82,2.5,-1,1],[3.98,2.7,-1,1],[4.06,2.9,-1,1],[4.22,2.6,-1,1],[4.31,2.8,-1,1],[4.58,2.5,-1,1],[4.8,2.7,-1,1],[4.87,2.9,-1,1],[5.37,2.6,-1,1],[5.42,2.8,-1,1],[5.61,2.5,-1,1],[5.64,2.7,-1,1],[5.74,2.9,-1,1],[6.45,2.6,-1,1],[7.49,2.8,-1,1],[9.6,2.5,1,1.5]],"regions":[[3.8,1.2,5.62,2.2,0]],"vlines":[[4.58,"median"]]}],"x_range":[0,10],"y_range":[0,4]};
 var id = 'viz-steps-boxplot-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で学ぶ中央値・四分位数・四分位範囲・箱ひげ図そのものです。違いは外れ値の扱いで、ソフトで描くと \(1.5 \times \mathrm{IQR}\) のルールでひげが短くなり、外側の値が点になります。教科書の図と比べて「どちらが何を伝えたいか」を考えると、四分位範囲が「外れ値に影響されにくい散らばりの指標」である理由が見えてきます。情報I「データの活用」の「データの可視化」では、グループ比較の定番として扱います。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;いちばん見逃しやすいのは、山が 2 つある分布です。30 点付近と 90 点付近に分かれたクラスでも、箱ひげ図は「中央値 60、箱が広い」としか見せません。形が気になるときはヒストグラムで確かめます。二つ目は、外れ値の点を「異常」と決めつけること。\(1.5 \times \mathrm{IQR}\) は目安のルールで、右に長く伸びたゆがんだ分布では正常な値も点として描かれます。三つ目はデータ数を見ないことです。5 個のデータでも箱ひげ図は描けてしまうので、箱の根拠になった個数を必ず添えます。&lt;/p&gt;</description></item><item><title>ナイーブベイズ | 高校生向けにやさしく解説（条件付き確率の掛け算で分類）</title><link>https://k-dm.work/basic/classification/naive_bayes_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/classification/naive_bayes_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;ナイーブベイズは、「このクラスなら、この特徴が出る確率はいくつか」という&lt;strong&gt;条件付き確率&lt;/strong&gt;を学習データから数え、それを&lt;strong&gt;掛け算&lt;/strong&gt;してクラスの確率を比べる分類の方法です。「無料」と「部活」のように特徴どうしは本当は関係しあっていても、「おたがい独立」と割り切って掛け算してしまい、この割り切りが「ナイーブ（単純）」の意味です。数える・割る・掛けるだけなので、学習も予測もとても速く、迷惑メール判定のような文章の分類で 20 年以上使われています。確率の大小関係は合いやすい一方、「90 %」のような確率の値そのものはずれやすい、という性質があります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="クイズこのメールは迷惑メール"&gt;
 クイズ：このメールは迷惑メール？
 
 &lt;a class="anchor" href="#%e3%82%af%e3%82%a4%e3%82%ba%e3%81%93%e3%81%ae%e3%83%a1%e3%83%bc%e3%83%ab%e3%81%af%e8%bf%b7%e6%83%91%e3%83%a1%e3%83%bc%e3%83%ab"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;これまでに受け取ったメール 100 通を調べたら、次の表になったとします。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;迷惑メール（40 通）&lt;/th&gt;
 &lt;th style="text-align: center"&gt;普通のメール（60 通）&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;「無料」が入っている&lt;/td&gt;
 &lt;td style="text-align: center"&gt;30 通&lt;/td&gt;
 &lt;td style="text-align: center"&gt;6 通&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;「部活」が入っている&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2 通&lt;/td&gt;
 &lt;td style="text-align: center"&gt;30 通&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;新しく届いたメールには「無料」が入っていて、「部活」は入っていません。迷惑メールでしょうか。&lt;/p&gt;
&lt;p&gt;直感では「無料」があるから怪しい、と思うはずです。ナイーブベイズは、この直感を&lt;strong&gt;条件付き確率の掛け算&lt;/strong&gt;として計算します。「迷惑メールのうち 30/40 に『無料』が入る」「普通のメールのうち 6/60 にしか入らない」という比率の差が、判定の根拠になります。&lt;/p&gt;
&lt;h2 id="仕組み数えて掛けて大きいほうを選ぶ"&gt;
 仕組み：数えて、掛けて、大きいほうを選ぶ
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e6%95%b0%e3%81%88%e3%81%a6%e6%8e%9b%e3%81%91%e3%81%a6%e5%a4%a7%e3%81%8d%e3%81%84%e3%81%bb%e3%81%86%e3%82%92%e9%81%b8%e3%81%b6"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず&lt;strong&gt;クラスごとの割合（事前確率）を数えます&lt;/strong&gt;。迷惑 40/100 = 0.4、普通 60/100 = 0.6。何も見ていない段階では「普通のほうが多い」というスタート地点です。次に&lt;strong&gt;特徴ごとの条件付き確率を 4 つ数えます&lt;/strong&gt;。\(P(\text{無料} \mid \text{迷惑}) = 30/40 = 0.75\)、\(P(\text{無料} \mid \text{普通}) = 6/60 = 0.1\)。「部活なし」も同様に \(38/40 = 0.95\) と \(30/60 = 0.5\) で、表の列ごとに割り算するだけです。&lt;/p&gt;
&lt;p&gt;そのうえで&lt;strong&gt;クラスごとに全部掛けます&lt;/strong&gt;。迷惑は \(0.4 \times 0.75 \times 0.95 = 0.285\)、普通は \(0.6 \times 0.1 \times 0.5 = 0.03\)。本当は「無料」と「部活」の出方は関係しあっているかもしれませんが、&lt;strong&gt;独立だと仮定して掛け算&lt;/strong&gt;してしまいます。最後に&lt;strong&gt;大きいほうを答えにします&lt;/strong&gt;。0.285 &amp;gt; 0.03 なので迷惑メール。2 つを足して割れば確率の形になり、\(0.285 / (0.285 + 0.03) \approx 0.90\)、「90 % 迷惑メール」と言えます。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="新しいメール -&amp;gt; クラスごとに事前確率 × 各特徴の条件付き確率 -&amp;gt; 迷惑: 0.285 / 普通: 0.03 -&amp;gt; 大きいほうを予測クラスに"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;新しいメール&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;クラスごとに事前確率 × 各特徴の条件付き確率&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;迷惑: 0.285 / 普通: 0.03&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;大きいほうを予測クラスに&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-nb-1" data-viz-type="steps" data-steps-kind="nb" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"手順 1：クラスごとに各軸の平均（×）を求める。","centroids":[[3,3.54],[6.57,6.52]],"points":[[5.27,4.82,0],[4.16,4.83,0],[4.1,2.11,0],[2.9,4.38,0],[2.74,0.94,0],[2.55,2.44,0],[2.42,4.16,0],[3,2.46,0],[1.82,3.2,0],[3.01,3.29,0],[3.39,5.05,0],[1.48,2.68,0],[3.89,3.74,0],[1.54,3.48,0],[3.78,5.1,0],[2.48,3.96,0],[3.43,3.08,0],[3.99,3.15,0],[2.76,4.01,0],[1.32,3.88,0],[7.03,7.55,1],[6.01,6.61,1],[7.86,7.43,1],[5.83,6.87,1],[6.42,6.01,1],[7.67,4.38,1],[6.75,8.14,1],[6.53,5.5,1],[6.75,6.72,1],[5.86,6.86,1],[5.66,6.39,1],[6.31,6.14,1],[7,7.56,1],[6.19,6.41,1],[6.33,9.04,1],[7.29,4.76,1],[6.16,7.12,1],[6.44,5.07,1],[6.63,6.09,1],[6.64,5.65,1]]},{"caption":"手順 2：クラスごとに各軸の散らばり（円の半径 = 標準偏差）を求める。軸ごとに独立と「素朴に」仮定する。","centroids":[[3,3.54],[6.57,6.52]],"circles":[[3,3.54,1.03,0],[6.57,6.52,0.84,1]],"points":[[5.27,4.82,0],[4.16,4.83,0],[4.1,2.11,0],[2.9,4.38,0],[2.74,0.94,0],[2.55,2.44,0],[2.42,4.16,0],[3,2.46,0],[1.82,3.2,0],[3.01,3.29,0],[3.39,5.05,0],[1.48,2.68,0],[3.89,3.74,0],[1.54,3.48,0],[3.78,5.1,0],[2.48,3.96,0],[3.43,3.08,0],[3.99,3.15,0],[2.76,4.01,0],[1.32,3.88,0],[7.03,7.55,1],[6.01,6.61,1],[7.86,7.43,1],[5.83,6.87,1],[6.42,6.01,1],[7.67,4.38,1],[6.75,8.14,1],[6.53,5.5,1],[6.75,6.72,1],[5.86,6.86,1],[5.66,6.39,1],[6.31,6.14,1],[7,7.56,1],[6.19,6.41,1],[6.33,9.04,1],[7.29,4.76,1],[6.16,7.12,1],[6.44,5.07,1],[6.63,6.09,1],[6.64,5.65,1]]},{"caption":"手順 3：各点で「どちらのクラスから出やすいか」を確率で比べ、高い方に塗り分ける。","points":[[5.27,4.82,0],[4.16,4.83,0],[4.1,2.11,0],[2.9,4.38,0],[2.74,0.94,0],[2.55,2.44,0],[2.42,4.16,0],[3,2.46,0],[1.82,3.2,0],[3.01,3.29,0],[3.39,5.05,0],[1.48,2.68,0],[3.89,3.74,0],[1.54,3.48,0],[3.78,5.1,0],[2.48,3.96,0],[3.43,3.08,0],[3.99,3.15,0],[2.76,4.01,0],[1.32,3.88,0],[7.03,7.55,1],[6.01,6.61,1],[7.86,7.43,1],[5.83,6.87,1],[6.42,6.01,1],[7.67,4.38,1],[6.75,8.14,1],[6.53,5.5,1],[6.75,6.72,1],[5.86,6.86,1],[5.66,6.39,1],[6.31,6.14,1],[7,7.56,1],[6.19,6.41,1],[6.33,9.04,1],[7.29,4.76,1],[6.16,7.12,1],[6.44,5.07,1],[6.63,6.09,1],[6.64,5.65,1]],"regions":[[0,0,0.5,0.5,0],[0,0.5,0.5,1,0],[0,1,0.5,1.5,0],[0,1.5,0.5,2,0],[0,2,0.5,2.5,0],[0,2.5,0.5,3,0],[0,3,0.5,3.5,0],[0,3.5,0.5,4,0],[0,4,0.5,4.5,0],[0,4.5,0.5,5,0],[0,5,0.5,5.5,0],[0,5.5,0.5,6,0],[0,6,0.5,6.5,0],[0,6.5,0.5,7,0],[0,7,0.5,7.5,0],[0,7.5,0.5,8,0],[0,8,0.5,8.5,0],[0,8.5,0.5,9,0],[0,9,0.5,9.5,0],[0,9.5,0.5,10,0],[0.5,0,1,0.5,0],[0.5,0.5,1,1,0],[0.5,1,1,1.5,0],[0.5,1.5,1,2,0],[0.5,2,1,2.5,0],[0.5,2.5,1,3,0],[0.5,3,1,3.5,0],[0.5,3.5,1,4,0],[0.5,4,1,4.5,0],[0.5,4.5,1,5,0],[0.5,5,1,5.5,0],[0.5,5.5,1,6,0],[0.5,6,1,6.5,0],[0.5,6.5,1,7,0],[0.5,7,1,7.5,0],[0.5,7.5,1,8,0],[0.5,8,1,8.5,0],[0.5,8.5,1,9,0],[0.5,9,1,9.5,0],[0.5,9.5,1,10,0],[1,0,1.5,0.5,0],[1,0.5,1.5,1,0],[1,1,1.5,1.5,0],[1,1.5,1.5,2,0],[1,2,1.5,2.5,0],[1,2.5,1.5,3,0],[1,3,1.5,3.5,0],[1,3.5,1.5,4,0],[1,4,1.5,4.5,0],[1,4.5,1.5,5,0],[1,5,1.5,5.5,0],[1,5.5,1.5,6,0],[1,6,1.5,6.5,0],[1,6.5,1.5,7,0],[1,7,1.5,7.5,0],[1,7.5,1.5,8,0],[1,8,1.5,8.5,0],[1,8.5,1.5,9,0],[1,9,1.5,9.5,0],[1,9.5,1.5,10,0],[1.5,0,2,0.5,0],[1.5,0.5,2,1,0],[1.5,1,2,1.5,0],[1.5,1.5,2,2,0],[1.5,2,2,2.5,0],[1.5,2.5,2,3,0],[1.5,3,2,3.5,0],[1.5,3.5,2,4,0],[1.5,4,2,4.5,0],[1.5,4.5,2,5,0],[1.5,5,2,5.5,0],[1.5,5.5,2,6,0],[1.5,6,2,6.5,0],[1.5,6.5,2,7,0],[1.5,7,2,7.5,0],[1.5,7.5,2,8,0],[1.5,8,2,8.5,0],[1.5,8.5,2,9,0],[1.5,9,2,9.5,0],[1.5,9.5,2,10,0],[2,0,2.5,0.5,0],[2,0.5,2.5,1,0],[2,1,2.5,1.5,0],[2,1.5,2.5,2,0],[2,2,2.5,2.5,0],[2,2.5,2.5,3,0],[2,3,2.5,3.5,0],[2,3.5,2.5,4,0],[2,4,2.5,4.5,0],[2,4.5,2.5,5,0],[2,5,2.5,5.5,0],[2,5.5,2.5,6,0],[2,6,2.5,6.5,0],[2,6.5,2.5,7,0],[2,7,2.5,7.5,0],[2,7.5,2.5,8,0],[2,8,2.5,8.5,0],[2,8.5,2.5,9,0],[2,9,2.5,9.5,0],[2,9.5,2.5,10,0],[2.5,0,3,0.5,0],[2.5,0.5,3,1,0],[2.5,1,3,1.5,0],[2.5,1.5,3,2,0],[2.5,2,3,2.5,0],[2.5,2.5,3,3,0],[2.5,3,3,3.5,0],[2.5,3.5,3,4,0],[2.5,4,3,4.5,0],[2.5,4.5,3,5,0],[2.5,5,3,5.5,0],[2.5,5.5,3,6,0],[2.5,6,3,6.5,0],[2.5,6.5,3,7,0],[2.5,7,3,7.5,0],[2.5,7.5,3,8,0],[2.5,8,3,8.5,0],[2.5,8.5,3,9,0],[2.5,9,3,9.5,0],[2.5,9.5,3,10,0],[3,0,3.5,0.5,0],[3,0.5,3.5,1,0],[3,1,3.5,1.5,0],[3,1.5,3.5,2,0],[3,2,3.5,2.5,0],[3,2.5,3.5,3,0],[3,3,3.5,3.5,0],[3,3.5,3.5,4,0],[3,4,3.5,4.5,0],[3,4.5,3.5,5,0],[3,5,3.5,5.5,0],[3,5.5,3.5,6,0],[3,6,3.5,6.5,0],[3,6.5,3.5,7,0],[3,7,3.5,7.5,0],[3,7.5,3.5,8,0],[3,8,3.5,8.5,0],[3,8.5,3.5,9,0],[3,9,3.5,9.5,0],[3,9.5,3.5,10,0],[3.5,0,4,0.5,0],[3.5,0.5,4,1,0],[3.5,1,4,1.5,0],[3.5,1.5,4,2,0],[3.5,2,4,2.5,0],[3.5,2.5,4,3,0],[3.5,3,4,3.5,0],[3.5,3.5,4,4,0],[3.5,4,4,4.5,0],[3.5,4.5,4,5,0],[3.5,5,4,5.5,0],[3.5,5.5,4,6,0],[3.5,6,4,6.5,0],[3.5,6.5,4,7,0],[3.5,7,4,7.5,0],[3.5,7.5,4,8,0],[3.5,8,4,8.5,0],[3.5,8.5,4,9,0],[3.5,9,4,9.5,1],[3.5,9.5,4,10,1],[4,0,4.5,0.5,0],[4,0.5,4.5,1,0],[4,1,4.5,1.5,0],[4,1.5,4.5,2,0],[4,2,4.5,2.5,0],[4,2.5,4.5,3,0],[4,3,4.5,3.5,0],[4,3.5,4.5,4,0],[4,4,4.5,4.5,0],[4,4.5,4.5,5,0],[4,5,4.5,5.5,0],[4,5.5,4.5,6,0],[4,6,4.5,6.5,0],[4,6.5,4.5,7,0],[4,7,4.5,7.5,0],[4,7.5,4.5,8,1],[4,8,4.5,8.5,1],[4,8.5,4.5,9,1],[4,9,4.5,9.5,1],[4,9.5,4.5,10,1],[4.5,0,5,0.5,0],[4.5,0.5,5,1,0],[4.5,1,5,1.5,0],[4.5,1.5,5,2,0],[4.5,2,5,2.5,0],[4.5,2.5,5,3,0],[4.5,3,5,3.5,0],[4.5,3.5,5,4,0],[4.5,4,5,4.5,0],[4.5,4.5,5,5,0],[4.5,5,5,5.5,0],[4.5,5.5,5,6,0],[4.5,6,5,6.5,1],[4.5,6.5,5,7,1],[4.5,7,5,7.5,1],[4.5,7.5,5,8,1],[4.5,8,5,8.5,1],[4.5,8.5,5,9,1],[4.5,9,5,9.5,1],[4.5,9.5,5,10,1],[5,0,5.5,0.5,0],[5,0.5,5.5,1,0],[5,1,5.5,1.5,0],[5,1.5,5.5,2,0],[5,2,5.5,2.5,0],[5,2.5,5.5,3,0],[5,3,5.5,3.5,0],[5,3.5,5.5,4,0],[5,4,5.5,4.5,0],[5,4.5,5.5,5,0],[5,5,5.5,5.5,1],[5,5.5,5.5,6,1],[5,6,5.5,6.5,1],[5,6.5,5.5,7,1],[5,7,5.5,7.5,1],[5,7.5,5.5,8,1],[5,8,5.5,8.5,1],[5,8.5,5.5,9,1],[5,9,5.5,9.5,1],[5,9.5,5.5,10,1],[5.5,0,6,0.5,0],[5.5,0.5,6,1,0],[5.5,1,6,1.5,0],[5.5,1.5,6,2,0],[5.5,2,6,2.5,0],[5.5,2.5,6,3,0],[5.5,3,6,3.5,0],[5.5,3.5,6,4,1],[5.5,4,6,4.5,1],[5.5,4.5,6,5,1],[5.5,5,6,5.5,1],[5.5,5.5,6,6,1],[5.5,6,6,6.5,1],[5.5,6.5,6,7,1],[5.5,7,6,7.5,1],[5.5,7.5,6,8,1],[5.5,8,6,8.5,1],[5.5,8.5,6,9,1],[5.5,9,6,9.5,1],[5.5,9.5,6,10,1],[6,0,6.5,0.5,0],[6,0.5,6.5,1,0],[6,1,6.5,1.5,0],[6,1.5,6.5,2,0],[6,2,6.5,2.5,0],[6,2.5,6.5,3,1],[6,3,6.5,3.5,1],[6,3.5,6.5,4,1],[6,4,6.5,4.5,1],[6,4.5,6.5,5,1],[6,5,6.5,5.5,1],[6,5.5,6.5,6,1],[6,6,6.5,6.5,1],[6,6.5,6.5,7,1],[6,7,6.5,7.5,1],[6,7.5,6.5,8,1],[6,8,6.5,8.5,1],[6,8.5,6.5,9,1],[6,9,6.5,9.5,1],[6,9.5,6.5,10,1],[6.5,0,7,0.5,0],[6.5,0.5,7,1,0],[6.5,1,7,1.5,0],[6.5,1.5,7,2,0],[6.5,2,7,2.5,1],[6.5,2.5,7,3,1],[6.5,3,7,3.5,1],[6.5,3.5,7,4,1],[6.5,4,7,4.5,1],[6.5,4.5,7,5,1],[6.5,5,7,5.5,1],[6.5,5.5,7,6,1],[6.5,6,7,6.5,1],[6.5,6.5,7,7,1],[6.5,7,7,7.5,1],[6.5,7.5,7,8,1],[6.5,8,7,8.5,1],[6.5,8.5,7,9,1],[6.5,9,7,9.5,1],[6.5,9.5,7,10,1],[7,0,7.5,0.5,0],[7,0.5,7.5,1,0],[7,1,7.5,1.5,0],[7,1.5,7.5,2,1],[7,2,7.5,2.5,1],[7,2.5,7.5,3,1],[7,3,7.5,3.5,1],[7,3.5,7.5,4,1],[7,4,7.5,4.5,1],[7,4.5,7.5,5,1],[7,5,7.5,5.5,1],[7,5.5,7.5,6,1],[7,6,7.5,6.5,1],[7,6.5,7.5,7,1],[7,7,7.5,7.5,1],[7,7.5,7.5,8,1],[7,8,7.5,8.5,1],[7,8.5,7.5,9,1],[7,9,7.5,9.5,1],[7,9.5,7.5,10,1],[7.5,0,8,0.5,0],[7.5,0.5,8,1,0],[7.5,1,8,1.5,1],[7.5,1.5,8,2,1],[7.5,2,8,2.5,1],[7.5,2.5,8,3,1],[7.5,3,8,3.5,1],[7.5,3.5,8,4,1],[7.5,4,8,4.5,1],[7.5,4.5,8,5,1],[7.5,5,8,5.5,1],[7.5,5.5,8,6,1],[7.5,6,8,6.5,1],[7.5,6.5,8,7,1],[7.5,7,8,7.5,1],[7.5,7.5,8,8,1],[7.5,8,8,8.5,1],[7.5,8.5,8,9,1],[7.5,9,8,9.5,1],[7.5,9.5,8,10,1],[8,0,8.5,0.5,0],[8,0.5,8.5,1,1],[8,1,8.5,1.5,1],[8,1.5,8.5,2,1],[8,2,8.5,2.5,1],[8,2.5,8.5,3,1],[8,3,8.5,3.5,1],[8,3.5,8.5,4,1],[8,4,8.5,4.5,1],[8,4.5,8.5,5,1],[8,5,8.5,5.5,1],[8,5.5,8.5,6,1],[8,6,8.5,6.5,1],[8,6.5,8.5,7,1],[8,7,8.5,7.5,1],[8,7.5,8.5,8,1],[8,8,8.5,8.5,1],[8,8.5,8.5,9,1],[8,9,8.5,9.5,1],[8,9.5,8.5,10,1],[8.5,0,9,0.5,0],[8.5,0.5,9,1,0],[8.5,1,9,1.5,1],[8.5,1.5,9,2,1],[8.5,2,9,2.5,1],[8.5,2.5,9,3,1],[8.5,3,9,3.5,1],[8.5,3.5,9,4,1],[8.5,4,9,4.5,1],[8.5,4.5,9,5,1],[8.5,5,9,5.5,1],[8.5,5.5,9,6,1],[8.5,6,9,6.5,1],[8.5,6.5,9,7,1],[8.5,7,9,7.5,1],[8.5,7.5,9,8,1],[8.5,8,9,8.5,1],[8.5,8.5,9,9,1],[8.5,9,9,9.5,1],[8.5,9.5,9,10,1],[9,0,9.5,0.5,0],[9,0.5,9.5,1,0],[9,1,9.5,1.5,1],[9,1.5,9.5,2,1],[9,2,9.5,2.5,1],[9,2.5,9.5,3,1],[9,3,9.5,3.5,1],[9,3.5,9.5,4,1],[9,4,9.5,4.5,1],[9,4.5,9.5,5,1],[9,5,9.5,5.5,1],[9,5.5,9.5,6,1],[9,6,9.5,6.5,1],[9,6.5,9.5,7,1],[9,7,9.5,7.5,1],[9,7.5,9.5,8,1],[9,8,9.5,8.5,1],[9,8.5,9.5,9,1],[9,9,9.5,9.5,1],[9,9.5,9.5,10,1],[9.5,0,10,0.5,0],[9.5,0.5,10,1,0],[9.5,1,10,1.5,0],[9.5,1.5,10,2,1],[9.5,2,10,2.5,1],[9.5,2.5,10,3,1],[9.5,3,10,3.5,1],[9.5,3.5,10,4,1],[9.5,4,10,4.5,1],[9.5,4.5,10,5,1],[9.5,5,10,5.5,1],[9.5,5.5,10,6,1],[9.5,6,10,6.5,1],[9.5,6.5,10,7,1],[9.5,7,10,7.5,1],[9.5,7.5,10,8,1],[9.5,8,10,8.5,1],[9.5,8.5,10,9,1],[9.5,9,10,9.5,1],[9.5,9.5,10,10,1]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-nb-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学A「場合の数と確率」の条件付き確率と、そこで学ぶ「原因の確率（ベイズの定理）」がそのまま土台です。上の 3 つ目の手順は \(P(\text{迷惑}) \times P(\text{無料} \mid \text{迷惑}) \times P(\text{部活なし} \mid \text{迷惑})\) を計算しており、2 つ目以降を掛け算できるのは「独立な事象の確率は積」という性質を仮定しているからです。情報II「情報とデータサイエンス」の分類の一手法として位置づけられます。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="数が連続値のときは平均と散らばりを覚える"&gt;
 数が連続値のときは「平均と散らばり」を覚える
 
 &lt;a class="anchor" href="#%e6%95%b0%e3%81%8c%e9%80%a3%e7%b6%9a%e5%80%a4%e3%81%ae%e3%81%a8%e3%81%8d%e3%81%af%e5%b9%b3%e5%9d%87%e3%81%a8%e6%95%a3%e3%82%89%e3%81%b0%e3%82%8a%e3%82%92%e8%a6%9a%e3%81%88%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;単語の有無のように「ある／ない」なら表を数えれば済みますが、身長や温度のような連続した値はどうするのでしょう。この場合は、クラスごと・特徴量ごとに&lt;strong&gt;平均と標準偏差&lt;/strong&gt;を覚えておき、「平均に近い値ほど出やすく、離れるほど出にくい」釣鐘型の分布で確率を決めます（ガウシアンナイーブベイズ）。&lt;/p&gt;</description></item><item><title>k近傍法 (k-NN) | 高校生向けにやさしく解説（近くの点の多数決で決める）</title><link>https://k-dm.work/basic/classification/knn_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/classification/knn_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;k近傍法（k-NN）は、新しい点に&lt;strong&gt;いちばん近い k 個のデータ&lt;/strong&gt;を探し、その&lt;strong&gt;多数決&lt;/strong&gt;でグループ（クラス）を決める分類の方法です。「近い」は 2 点間の距離で測り、これは中学で習った三平方の定理そのものです。学習のときに式を作らず、データをそのまま覚えておくだけで、予測のたびに距離を測るので「怠惰学習」と呼ばれます。k が小さいと境界はギザギザに、大きいとなめらかになり、握力 kgf と 50 m 走 秒のように単位のちがう特徴量を混ぜるときは先に目盛りをそろえる必要があります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;新入生が「どの部活に入りそうか」を当てるゲームをします。手がかりは体力テストの &lt;strong&gt;握力&lt;/strong&gt; と &lt;strong&gt;50 m 走のタイム&lt;/strong&gt; の 2 つ。先輩たち 600 人の記録と所属（運動部・文化部・帰宅部）は分かっています。&lt;/p&gt;
&lt;p&gt;あなたならどう当てますか。たぶん「この新入生と&lt;strong&gt;記録がいちばん似ている先輩&lt;/strong&gt;」を探し、「その先輩が運動部なら、この子も運動部だろう」と考えるはずです。1 人だけだと偶然かもしれないので、似ている先輩を &lt;strong&gt;5 人&lt;/strong&gt; 選んで多数決にする。これが k近傍法（k = 5）です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/classification/knn_block01_ja.png"
 alt="k-NN の判別領域。3 色の点が正解の分かっているデータ、背景の色は「新しい点がここに落ちたら何色と判定されるか」。色の境目が曲がりくねっているのが特徴"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は、2 つの特徴量で 3 つのクラスを分けた例です。丸い点が覚えているデータ、背景のうすい色が「この場所に新しい点が来たら何色と答えるか」です。直線ではなく、点の並びに合わせた&lt;strong&gt;曲がった境界&lt;/strong&gt;が 3 色の間にできています。&lt;/p&gt;
&lt;h2 id="仕組み距離を測って近い順に並べて多数決"&gt;
 仕組み：距離を測って、近い順に並べて、多数決
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e8%b7%9d%e9%9b%a2%e3%82%92%e6%b8%ac%e3%81%a3%e3%81%a6%e8%bf%91%e3%81%84%e9%a0%86%e3%81%ab%e4%b8%a6%e3%81%b9%e3%81%a6%e5%a4%9a%e6%95%b0%e6%b1%ba"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;新しい点が 1 つ来たとき、k近傍法がやることは 4 つだけです。まず&lt;strong&gt;新しい点を図に打ちます&lt;/strong&gt;。この時点ではまだ色はついていません。次に&lt;strong&gt;覚えているすべての点との距離を 1 つずつ測ります&lt;/strong&gt;。2 点 \((x_1, y_1)\), \((x_2, y_2)\) の距離は \(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\) で、図では新しい点から各点へ線を引いて、その長さを比べるイメージです。そのうえで&lt;strong&gt;近い順に k 個（ここでは 5 個）選びます&lt;/strong&gt;。図では新しい点を中心に、ちょうど 5 個が入る円を描くことに当たります。最後に &lt;strong&gt;5 個の色を数えて多数決&lt;/strong&gt;をとり、いちばん多い色を答えにします。同数のときは「近い点の票を重くする」などで決めます。&lt;/p&gt;
&lt;p&gt;背景の色分けは、図のすべての場所でこの 4 ステップをやった結果です。境界線とは「多数決の結果が入れ替わる場所」のことなので、点の並びに沿ってぐにゃぐにゃになります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="新しい点 -&amp;gt; 全データとの距離を計算 -&amp;gt; 近い順に k 個を選ぶ -&amp;gt; k 個の色で多数決 -&amp;gt; 予測クラス"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;新しい点&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;全データとの距離を計算&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;近い順に k 個を選ぶ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;k 個の色で多数決&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;予測クラス&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-knn-0" data-viz-type="steps" data-steps-kind="knn" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"k = 1：問い合わせ点（黒）から近い順に 1 個（破線の円の内側）を選び、多数決。票は 1:0 → 予測はクラス 0。","circles":[[5,5.1,0.39,0]],"lines":[[[5,5.1],[5.23,5.35]]],"metrics":{"k":1,"votes":"1 : 0"},"points":[[3.25,7.1,0,1],[2.6,6.96,0,1],[4.4,7.03,0,1],[5.23,5.35,0,1.4],[3.29,5.58,0,1],[2.18,6.26,0,1],[3.49,7.04,0,1],[3.86,9.4,0,1],[4.32,4.43,0,1],[3.47,5.69,0,1],[2.53,8.2,0,1],[2.91,3.96,0,1],[3.6,6.12,0,1],[1.67,5.3,0,1],[2.39,6.47,0,1],[2.65,6.59,0,1],[9.19,2.56,1,1],[5.75,3.28,1,1],[8.22,2.68,1,1],[8.66,1.9,1,1],[5.46,3.53,1,1],[5.68,2.8,1,1],[7.39,4.54,1,1],[6.95,3.24,1,1],[8.55,4.12,1,1],[6.49,5.18,1,1],[5.63,3.81,1,1],[7.66,3.59,1,1],[6.05,4.06,1,1],[6.1,2.83,1,1],[5.47,5.3,1,1],[6.09,5.1,1,1],[5,5.1,-1,1.6]]},{"caption":"k = 3：問い合わせ点（黒）から近い順に 3 個（破線の円の内側）を選び、多数決。票は 2:1 → 予測はクラス 0。","circles":[[5,5.1,1,0]],"lines":[[[5,5.1],[5.23,5.35]],[[5,5.1],[5.47,5.3]],[[5,5.1],[4.32,4.43]]],"metrics":{"k":3,"votes":"2 : 1"},"points":[[3.25,7.1,0,1],[2.6,6.96,0,1],[4.4,7.03,0,1],[5.23,5.35,0,1.4],[3.29,5.58,0,1],[2.18,6.26,0,1],[3.49,7.04,0,1],[3.86,9.4,0,1],[4.32,4.43,0,1.4],[3.47,5.69,0,1],[2.53,8.2,0,1],[2.91,3.96,0,1],[3.6,6.12,0,1],[1.67,5.3,0,1],[2.39,6.47,0,1],[2.65,6.59,0,1],[9.19,2.56,1,1],[5.75,3.28,1,1],[8.22,2.68,1,1],[8.66,1.9,1,1],[5.46,3.53,1,1],[5.68,2.8,1,1],[7.39,4.54,1,1],[6.95,3.24,1,1],[8.55,4.12,1,1],[6.49,5.18,1,1],[5.63,3.81,1,1],[7.66,3.59,1,1],[6.05,4.06,1,1],[6.1,2.83,1,1],[5.47,5.3,1,1.4],[6.09,5.1,1,1],[5,5.1,-1,1.6]]},{"caption":"k = 5：問い合わせ点（黒）から近い順に 5 個（破線の円の内側）を選び、多数決。票は 2:3 → 予測はクラス 1。","circles":[[5,5.1,1.49,1]],"lines":[[[5,5.1],[5.23,5.35]],[[5,5.1],[5.47,5.3]],[[5,5.1],[4.32,4.43]],[[5,5.1],[6.09,5.1]],[[5,5.1],[5.63,3.81]]],"metrics":{"k":5,"votes":"2 : 3"},"points":[[3.25,7.1,0,1],[2.6,6.96,0,1],[4.4,7.03,0,1],[5.23,5.35,0,1.4],[3.29,5.58,0,1],[2.18,6.26,0,1],[3.49,7.04,0,1],[3.86,9.4,0,1],[4.32,4.43,0,1.4],[3.47,5.69,0,1],[2.53,8.2,0,1],[2.91,3.96,0,1],[3.6,6.12,0,1],[1.67,5.3,0,1],[2.39,6.47,0,1],[2.65,6.59,0,1],[9.19,2.56,1,1],[5.75,3.28,1,1],[8.22,2.68,1,1],[8.66,1.9,1,1],[5.46,3.53,1,1],[5.68,2.8,1,1],[7.39,4.54,1,1],[6.95,3.24,1,1],[8.55,4.12,1,1],[6.49,5.18,1,1],[5.63,3.81,1,1.4],[7.66,3.59,1,1],[6.05,4.06,1,1],[6.1,2.83,1,1],[5.47,5.3,1,1.4],[6.09,5.1,1,1.4],[5,5.1,-1,1.6]]},{"caption":"k = 7：問い合わせ点（黒）から近い順に 7 個（破線の円の内側）を選び、多数決。票は 2:5 → 予測はクラス 1。","circles":[[5,5.1,1.54,1]],"lines":[[[5,5.1],[5.23,5.35]],[[5,5.1],[5.47,5.3]],[[5,5.1],[4.32,4.43]],[[5,5.1],[6.09,5.1]],[[5,5.1],[5.63,3.81]],[[5,5.1],[6.05,4.06]],[[5,5.1],[6.49,5.18]]],"metrics":{"k":7,"votes":"2 : 5"},"points":[[3.25,7.1,0,1],[2.6,6.96,0,1],[4.4,7.03,0,1],[5.23,5.35,0,1.4],[3.29,5.58,0,1],[2.18,6.26,0,1],[3.49,7.04,0,1],[3.86,9.4,0,1],[4.32,4.43,0,1.4],[3.47,5.69,0,1],[2.53,8.2,0,1],[2.91,3.96,0,1],[3.6,6.12,0,1],[1.67,5.3,0,1],[2.39,6.47,0,1],[2.65,6.59,0,1],[9.19,2.56,1,1],[5.75,3.28,1,1],[8.22,2.68,1,1],[8.66,1.9,1,1],[5.46,3.53,1,1],[5.68,2.8,1,1],[7.39,4.54,1,1],[6.95,3.24,1,1],[8.55,4.12,1,1],[6.49,5.18,1,1.4],[5.63,3.81,1,1.4],[7.66,3.59,1,1],[6.05,4.06,1,1.4],[6.1,2.83,1,1],[5.47,5.3,1,1.4],[6.09,5.1,1,1.4],[5,5.1,-1,1.6]]},{"caption":"k = 11：問い合わせ点（黒）から近い順に 11 個（破線の円の内側）を選び、多数決。票は 5:6 → 予測はクラス 1。","circles":[[5,5.1,1.83,1]],"lines":[[[5,5.1],[5.23,5.35]],[[5,5.1],[5.47,5.3]],[[5,5.1],[4.32,4.43]],[[5,5.1],[6.09,5.1]],[[5,5.1],[5.63,3.81]],[[5,5.1],[6.05,4.06]],[[5,5.1],[6.49,5.18]],[[5,5.1],[5.46,3.53]],[[5,5.1],[3.47,5.69]],[[5,5.1],[3.6,6.12]],[[5,5.1],[3.29,5.58]]],"metrics":{"k":11,"votes":"5 : 6"},"points":[[3.25,7.1,0,1],[2.6,6.96,0,1],[4.4,7.03,0,1],[5.23,5.35,0,1.4],[3.29,5.58,0,1.4],[2.18,6.26,0,1],[3.49,7.04,0,1],[3.86,9.4,0,1],[4.32,4.43,0,1.4],[3.47,5.69,0,1.4],[2.53,8.2,0,1],[2.91,3.96,0,1],[3.6,6.12,0,1.4],[1.67,5.3,0,1],[2.39,6.47,0,1],[2.65,6.59,0,1],[9.19,2.56,1,1],[5.75,3.28,1,1],[8.22,2.68,1,1],[8.66,1.9,1,1],[5.46,3.53,1,1.4],[5.68,2.8,1,1],[7.39,4.54,1,1],[6.95,3.24,1,1],[8.55,4.12,1,1],[6.49,5.18,1,1.4],[5.63,3.81,1,1.4],[7.66,3.59,1,1],[6.05,4.06,1,1.4],[6.1,2.83,1,1],[5.47,5.3,1,1.4],[6.09,5.1,1,1.4],[5,5.1,-1,1.6]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-knn-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報II「情報とデータサイエンス」の「分類による予測」で登場する、いちばん素朴な分類器です。使っている数学は、三平方の定理による 2 点間の距離と、票を数える多数決だけ。数学Iの「データの分析」で習う散布図に、「ここに新しい点が来たらどうなるか」という問いを足したものだと考えると分かりやすいでしょう。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="k-を変えると図はどう変わる"&gt;
 k を変えると図はどう変わる？
 
 &lt;a class="anchor" href="#k-%e3%82%92%e5%a4%89%e3%81%88%e3%82%8b%e3%81%a8%e5%9b%b3%e3%81%af%e3%81%a9%e3%81%86%e5%a4%89%e3%82%8f%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;k = 1&lt;/strong&gt; のときは、いちばん近い 1 点の色をそのまま使います。境界は細かくギザギザになり、1 個だけ別の色の点がまぎれていると、その点のまわりに小さな「島」ができます。上の図はこの状態です。&lt;strong&gt;k を大きくする&lt;/strong&gt;と多数決に参加する点が増えるので、1 個の例外に引きずられなくなり、境界がなめらかになります。ただし k = 50 のように大きくしすぎると、数の少ないクラスが多数決で消えてしまいます。&lt;/p&gt;</description></item><item><title>コサイン類似度ってなに？ | 高校生向けにやさしく解説（ベクトルのなす角で似ている度を測る）</title><link>https://k-dm.work/eval/distance/cosine/cosine-similarity_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/distance/cosine/cosine-similarity_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;コサイン類似度は、数を並べた&lt;strong&gt;ベクトル&lt;/strong&gt;どうしが「どれくらい同じ向きを向いているか」を、&lt;strong&gt;なす角 \(\theta\) の余弦 \(\cos\theta\)&lt;/strong&gt; で表した指標です。1 に近いほど同じ向き（似ている）、0 なら直角（無関係）、−1 に近いほど反対向きで、ベクトルの&lt;strong&gt;長さは無視&lt;/strong&gt;して向きだけを比べます。計算に使うのは内積の公式 \(\mathbf{a}\cdot\mathbf{b} = |\mathbf{a}||\mathbf{b}|\cos\theta\) だけで、これを \(\cos\theta\) について解けば定義になります。距離として使いたいときは \(1 - \cos\theta\) にすると、0 に近いほど似ている、という向きにそろいます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;音楽アプリで、A さん・B さん・C さんの 1 か月の再生回数を「ロック・ポップ・ジャズ」の順に並べました。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: right"&gt;ロック&lt;/th&gt;
 &lt;th style="text-align: right"&gt;ポップ&lt;/th&gt;
 &lt;th style="text-align: right"&gt;ジャズ&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;A さん&lt;/td&gt;
 &lt;td style="text-align: right"&gt;10&lt;/td&gt;
 &lt;td style="text-align: right"&gt;2&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;B さん&lt;/td&gt;
 &lt;td style="text-align: right"&gt;100&lt;/td&gt;
 &lt;td style="text-align: right"&gt;20&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;C さん&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;0&lt;/td&gt;
 &lt;td style="text-align: right"&gt;30&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A さんと好みが似ているのは、B さんと C さんのどちらでしょうか（10 倍聴く人か、ジャズだけの人か）。B さんは A さんの 10 倍聴いていますが、ロックとポップの比率は同じ「5 : 1」。C さんはジャズしか聴きません。直感的には &lt;strong&gt;A さんと B さん（比率 5 : 1 が同じ 2 人）が似ている&lt;/strong&gt;はずです。&lt;/p&gt;
&lt;p&gt;ところが 2 点間の距離で測ると、A と B は \(\sqrt{90^2+18^2} \approx 92\)、A と C は \(\sqrt{10^2+2^2+30^2} \approx 32\) で、C のほうが近いことになってしまいます。再生回数の&lt;strong&gt;多さ&lt;/strong&gt;（ベクトルの長さ）が距離を支配してしまうからです。「好みの傾向」を比べたいなら、長さではなく&lt;strong&gt;向き&lt;/strong&gt;を見る必要があります。&lt;/p&gt;
&lt;h2 id="角度はどうやって求める"&gt;
 角度はどうやって求める？
 
 &lt;a class="anchor" href="#%e8%a7%92%e5%ba%a6%e3%81%af%e3%81%a9%e3%81%86%e3%82%84%e3%81%a3%e3%81%a6%e6%b1%82%e3%82%81%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;3 人の再生回数を、ロック・ポップ・ジャズの 3 軸をもつ空間の&lt;strong&gt;矢印&lt;/strong&gt;だと考えます。A と B の矢印は長さがちがうだけで同じ方向を指し、C の矢印はこの 2 本とほぼ直角の方向を指します。この「矢印のなす角」を数で出すのが次の手順です。&lt;/p&gt;
&lt;p&gt;まず、数を並べてベクトルにします。A さんは \(\mathbf{a} = (10, 2, 0)\)、B さんは \(\mathbf{b} = (100, 20, 0)\)、C さんは \(\mathbf{c} = (0, 0, 30)\) です。次に内積を計算します。成分どうしをかけて足すので、\(\mathbf{a}\cdot\mathbf{b} = 10 \times 100 + 2 \times 20 + 0 \times 0 = 1040\)、\(\mathbf{a}\cdot\mathbf{c} = 0\) です。続いて長さを計算すると \(|\mathbf{a}| = \sqrt{10^2 + 2^2 + 0^2} = \sqrt{104}\)、\(|\mathbf{b}| = \sqrt{10400}\)、\(|\mathbf{c}| = 30\) になります。そして内積を長さの積で割ります。&lt;/p&gt;
$$
\cos\theta = \frac{\mathbf{a}\cdot\mathbf{b}}{|\mathbf{a}|\,|\mathbf{b}|}
$$&lt;p&gt;A と B は \(1040 / 1040 = 1\) で、なす角 0°、完全に同じ向きです。A と C は \(0 / (\sqrt{104} \times 30) = 0\) で、なす角 90°、共通点なしと判定されます。最後に距離に直すなら \(d = 1 - \cos\theta\) とすれば、A と B は 0、A と C は 1 になり、0 に近いほど似ている、という「距離」の向きにそろいます。&lt;/p&gt;</description></item><item><title>階層型クラスタリングってなに？ | 高校生向けにやさしく解説（近いものから順にまとめる）</title><link>https://k-dm.work/basic/clustering/hierarchical_clustering_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/basic/clustering/hierarchical_clustering_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;階層型クラスタリングは、&lt;strong&gt;正解ラベルのないデータ&lt;/strong&gt;を「いちばん近い 2 つをくっつける」の繰り返しでまとめていく方法です。くっつけた順番と、そのときの距離を記録した図が&lt;strong&gt;デンドログラム&lt;/strong&gt;（樹形図）で、枝がつながる高さが「どれくらい離れていたか」を表します。グループの数を先に決める必要はなく、できあがった樹形図を&lt;strong&gt;横に切る高さ&lt;/strong&gt;を変えるだけで、2 グループにも 3 グループにもできます。「グループ同士の距離」の測り方（単連結・完全連結・平均連結・ウォード法）によって、できる枝の形が変わります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;部活の合宿で、30 人を住んでいる場所が近い人同士の班に分けたいとします。ただし「何班にするか」はまだ決まっていません。あなたならどうしますか。&lt;/p&gt;
&lt;p&gt;自然なやり方はこうでしょう。まず&lt;strong&gt;いちばん家が近い 2 人をペア&lt;/strong&gt;にする。次に近い 2 人（またはペアと 1 人）をくっつける。これを繰り返すと小さなかたまりが大きなかたまりに育ち、最後は全員が 1 つになります。くっつけた順番を木の枝のように描いておけば、「3 班にしたい」と言われたとき枝を 3 本に切るだけで済みます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k-dm.work/basic/clustering/k-means1_highschool/"&gt;k-means&lt;/a&gt; が最初にグループ数 \(k\) を決めるのに対して、こちらは&lt;strong&gt;くっつける過程そのものを記録しておく&lt;/strong&gt;のが特徴です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/basic/clustering/hierarchical-clustering_block01.svg"
 alt="ウォード法による階層型クラスタリングのデンドログラム。横軸に 50 個のサンプルが並び、下から順に近いもの同士が低い高さでつながっていく。右側のかたまりは高さ約 40 で 2 つの枝がひとつになり、最後に左のかたまりと高さ約 70 でつながって全体が 1 本になる"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図がデンドログラムです。横軸に 50 個の点（サンプル）が並び、縦軸は「くっついたときの距離」です。下のほうでは高さ 5 以下で細かくつながり、近い点同士が早い段階でまとまったことが分かります。右側の 2 つのかたまりは高さ約 40 で 1 つになり、最後に左のかたまりと高さ約 70 でつながっています。&lt;/p&gt;
&lt;h2 id="樹形図はどう育つ"&gt;
 樹形図はどう育つ？
 
 &lt;a class="anchor" href="#%e6%a8%b9%e5%bd%a2%e5%9b%b3%e3%81%af%e3%81%a9%e3%81%86%e8%82%b2%e3%81%a4"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;図は下から上へ育ちます。まず、全員を 1 人ずつのグループにします。横軸に並んだ 50 個の点が、それぞれ独立したグループで、図の最下段にあたります。次に、全ペアの距離を計算します。いちばん近い 2 つを見つけてくっつけます。図では、その 2 本の縦線が低い位置の横棒で結ばれ、横棒の高さがそのときの距離です。&lt;/p&gt;
&lt;p&gt;ここで、かたまり同士の距離を決めるルールが要ります。いちばん近い点同士で測る（単連結）、いちばん遠い点同士（完全連結）、全ペアの平均（平均連結）、くっつけたときにグループ内のばらつきがどれだけ増えるか（ウォード法）などがあり、上の図はウォード法です。ルールを決めたら、1 つになるまで「近い 2 つをくっつける」を繰り返します。距離が小さい順にくっつくので横棒は下から上へ積み上がり、似たもの同士は低い位置で、遠いもの同士は高い位置でつながって、最後は 1 本の木になります。&lt;/p&gt;
&lt;p&gt;最後に、樹形図を横に切ってグループを読みます。好きな高さで水平線を引き、その線と交わる縦線の本数がグループ数です。上の図なら、高さ 50 で切れば 2 グループ、高さ 20 で切れば 3 グループになります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="全員を 1 人グループに -&amp;gt; いちばん近い 2 つをくっつける -&amp;gt; グループ間の距離を決め直す -&amp;gt; 1 つになった？ -&amp;gt; 樹形図を横に切ってグループ数を決める まだ: いちばん近い 2 つをくっつけるに戻る"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;全員を 1 人グループに&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;いちばん近い 2 つをくっつける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;グループ間の距離を決め直す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;1 つになった？&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;樹形図を横に切ってグループ数を決める&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;まだ: いちばん近い 2 つをくっつけるに戻る&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-hier-0" data-viz-type="steps" data-steps-kind="hier" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"最初は全点が別々のクラスター（12 個）。","metrics":{"clusters":12},"points":[[3.48,7.77,0],[1.4,5.45,1],[2.42,7.61,2],[2.38,5.83,3],[7.1,8.65,4],[6.4,8.34,5],[7.92,7.89,6],[8.11,7.06,7],[4.91,3.94,8],[4.69,2.16,9],[3.88,2.13,10],[5.59,3.5,11]]},{"arrows":[[[7.1,8.65],[6.4,8.34]]],"caption":"結合 1：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 0.77、残り 11 個。","metrics":{"clusters":11,"merge_dist":0.77},"points":[[3.48,7.77,0],[1.4,5.45,1],[2.42,7.61,2],[2.38,5.83,3],[7.1,8.65,10],[6.4,8.34,10],[7.92,7.89,4],[8.11,7.06,5],[4.91,3.94,6],[4.69,2.16,7],[3.88,2.13,8],[5.59,3.5,9]]},{"arrows":[[[4.91,3.94],[5.59,3.5]]],"caption":"結合 2：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 0.81、残り 10 個。","metrics":{"clusters":10,"merge_dist":0.81},"points":[[3.48,7.77,0],[1.4,5.45,1],[2.42,7.61,2],[2.38,5.83,3],[7.1,8.65,8],[6.4,8.34,8],[7.92,7.89,4],[8.11,7.06,5],[4.91,3.94,9],[4.69,2.16,6],[3.88,2.13,7],[5.59,3.5,9]]},{"arrows":[[[4.69,2.16],[3.88,2.13]]],"caption":"結合 3：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 0.81、残り 9 個。","metrics":{"clusters":9,"merge_dist":0.81},"points":[[3.48,7.77,0],[1.4,5.45,1],[2.42,7.61,2],[2.38,5.83,3],[7.1,8.65,6],[6.4,8.34,6],[7.92,7.89,4],[8.11,7.06,5],[4.91,3.94,7],[4.69,2.16,8],[3.88,2.13,8],[5.59,3.5,7]]},{"arrows":[[[5.25,3.72],[4.29,2.15]]],"caption":"結合 8：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 1.92、残り 4 個。","metrics":{"clusters":4,"merge_dist":1.92},"points":[[3.48,7.77,1],[1.4,5.45,0],[2.42,7.61,1],[2.38,5.83,0],[7.1,8.65,2],[6.4,8.34,2],[7.92,7.89,2],[8.11,7.06,2],[4.91,3.94,3],[4.69,2.16,3],[3.88,2.13,3],[5.59,3.5,3]]},{"arrows":[[[1.89,5.64],[2.95,7.69]]],"caption":"結合 9：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 2.38、残り 3 個。","metrics":{"clusters":3,"merge_dist":2.38},"points":[[3.48,7.77,2],[1.4,5.45,2],[2.42,7.61,2],[2.38,5.83,2],[7.1,8.65,0],[6.4,8.34,0],[7.92,7.89,0],[8.11,7.06,0],[4.91,3.94,1],[4.69,2.16,1],[3.88,2.13,1],[5.59,3.5,1]]},{"arrows":[[[4.77,2.93],[2.42,6.67]]],"caption":"結合 10：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 4.63、残り 2 個。","metrics":{"clusters":2,"merge_dist":4.63},"points":[[3.48,7.77,1],[1.4,5.45,1],[2.42,7.61,1],[2.38,5.83,1],[7.1,8.65,0],[6.4,8.34,0],[7.92,7.89,0],[8.11,7.06,0],[4.91,3.94,1],[4.69,2.16,1],[3.88,2.13,1],[5.59,3.5,1]]},{"arrows":[[[7.38,7.98],[3.59,4.8]]],"caption":"結合 11：いちばん近い 2 つのクラスター（線で結ぶ）をまとめる。距離 5.51、残り 1 個。","metrics":{"clusters":1,"merge_dist":5.51},"points":[[3.48,7.77,0],[1.4,5.45,0],[2.42,7.61,0],[2.38,5.83,0],[7.1,8.65,0],[6.4,8.34,0],[7.92,7.89,0],[8.11,7.06,0],[4.91,3.94,0],[4.69,2.16,0],[3.88,2.13,0],[5.59,3.5,0]]}],"x_range":[0,10],"y_range":[0,10]};
 var id = 'viz-steps-hier-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報IIの「情報とデータサイエンス」で学ぶ&lt;strong&gt;クラスタリング&lt;/strong&gt;（正解のないデータをまとめる教師なし学習）の一種です。「近い」は、座標平面の 2 点間の距離 \(\sqrt{(x_1-x_2)^2+(y_1-y_2)^2}\) で測ります。ウォード法で使う「グループ内のばらつき」は、数学Iの&lt;strong&gt;分散&lt;/strong&gt;（平均からのズレの 2 乗の平均）と同じ考え方です。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意点は、&lt;strong&gt;切る高さで答えが変わる&lt;/strong&gt;ことです（高さ 50 なら 2 班、20 なら 3 班）。「どこで切るか」は人に任されており、高さが大きく跳ぶところ（上の図なら 5 から 40 への跳び）で切るのが目安ですが、目的によって正解は変わります。二つ目は、4 つの測り方のうち&lt;strong&gt;単連結は鎖になりやすい&lt;/strong&gt;ことです。いちばん近い点同士で距離を測ると、数珠つなぎに並んだ点は端から端まで 1 グループにつながってしまうので、丸いかたまりを見つけたいならウォード法や完全連結が向いています。三つ目は、&lt;strong&gt;一度くっつけたら戻れない&lt;/strong&gt;ことです（k-means は繰り返しの中で所属を変えられます）。階層型は 1 回目の合体を後から取り消しません。データが何万件もあると、全ペアの距離の計算時間も問題になります。&lt;/p&gt;</description></item><item><title>感度と特異度 | 高校生向けにやさしく解説（条件付き確率で読む検査の性能）</title><link>https://k-dm.work/eval/classification/sensitivity-specificity/sensitivity-specificity_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/classification/sensitivity-specificity/sensitivity-specificity_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;&lt;strong&gt;感度&lt;/strong&gt;は「本当に陽性の人のうち、検査でも陽性と出た割合」で、&lt;strong&gt;見逃しの少なさ&lt;/strong&gt;を表します（再現率と同じものです）。&lt;strong&gt;特異度&lt;/strong&gt;は「本当に陰性の人のうち、検査でも陰性と出た割合」で、&lt;strong&gt;誤報の少なさ&lt;/strong&gt;を表します。どちらも&lt;strong&gt;条件付き確率&lt;/strong&gt;で、感度は \(P(\text{陽性} \mid \text{感染})\)、特異度は \(P(\text{陰性} \mid \text{非感染})\) と書けます。判定の線を動かすと感度が上がれば特異度が下がるので、両方を同時に 1 にするのはふつうはできません。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;インフルエンザの簡易検査キットの箱に「感度 90%、特異度 95%」と書いてあります。学校で 1,000 人が検査を受け、そのうち本当に感染している人が 100 人だとすると、結果はどんな表になるでしょうか。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;検査：陽性&lt;/th&gt;
 &lt;th style="text-align: center"&gt;検査：陰性&lt;/th&gt;
 &lt;th style="text-align: center"&gt;行の合計&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：感染している（100 人）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;90（真陽性）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;10（見逃し）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;100&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：感染していない（900 人）&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;45（誤報）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;855（真陰性）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;900&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;感度 90% は&lt;strong&gt;上の行&lt;/strong&gt;の話で、感染者 100 人のうち 90 人が陽性と出て、見逃しは 10 人です。特異度 95% は&lt;strong&gt;下の行&lt;/strong&gt;の話で、非感染者 900 人のうち 855 人が陰性と出て、誤報は 45 人です。&lt;/p&gt;
$$
\text{感度} = \frac{90}{90 + 10} = 0.90, \qquad
\text{特異度} = \frac{855}{855 + 45} = 0.95
$$&lt;p&gt;ここでクイズです。&lt;strong&gt;陽性と出た 135 人&lt;/strong&gt;が本当に感染している確率はいくつでしょう。陽性と出たのは左の列の 90 + 45 = 135 人で、そのうち感染者は 90 人。だから 90/135 ≒ 0.67 です。感度 0.90 とはまったく別の数で、こちらは「列」で割っています。行で割る（感度 0.90・特異度 0.95）か列で割る（陽性者のうち本物の割合 0.67）かを混ぜないのが、この単元のいちばん大事な点です。&lt;/p&gt;
&lt;h2 id="仕組み線を動かすと-2-つの割合が逆に動く"&gt;
 仕組み：線を動かすと 2 つの割合が逆に動く
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e7%b7%9a%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%e3%81%a8-2-%e3%81%a4%e3%81%ae%e5%89%b2%e5%90%88%e3%81%8c%e9%80%86%e3%81%ab%e5%8b%95%e3%81%8f"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;検査キットは、体の中のウイルス量のようなものを測り、ある基準の線（カットオフ）を超えたら陽性と出します。機械学習のモデルも同じで、「陽性らしさ」の点数に線を引きます。&lt;/p&gt;
&lt;p&gt;まず、横軸に点数をとると、感染者の点数は右寄りの山、非感染者の点数は左寄りの山になり、2 つの山は少し重なっています。次に線を 1 本引き、線より右を陽性、左を陰性と判定します。右側にある感染者の山の面積が感度 0.90、左側にある非感染者の山の面積が特異度 0.95 に当たります。線を左へ動かす（基準をゆるくする）と、感染者の山はほぼ全部が右側に入って感度は 1 に近づきますが、非感染者の山も右側にはみ出して特異度は 0.95 から下がります。表では見逃しの 10 人が減り、誤報の 45 人が増える動きです。線を右へ動かす（基準をきびしくする）と、今度は特異度が 1 に近づいて感度が下がります。最後にバランスを 1 つの数で見るなら、感度 + 特異度 − 1（Youden 指数）が最大になる線が 2 つの山をいちばんうまく分ける位置で、上の例では 0.90 + 0.95 − 1 = 0.85 です。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-threshold-1" data-viz-type="steps" data-steps-kind="threshold" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"閾値 0.2：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.5,"f1":0.62,"fn":0,"fp":25,"precision":0.44,"recall":1,"threshold":0.2,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.2,0,1,4,1]],"vlines":[[0.2,"0.2"]]},{"caption":"閾値 0.35：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.74,"f1":0.75,"fn":0,"fp":13,"precision":0.61,"recall":1,"threshold":0.35,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.35,0,1,4,1]],"vlines":[[0.35,"0.35"]]},{"caption":"閾値 0.5：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.84,"f1":0.81,"fn":3,"fp":5,"precision":0.77,"recall":0.85,"threshold":0.5,"tp":17},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.5,0,1,4,1]],"vlines":[[0.5,"0.5"]]},{"caption":"閾値 0.65：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.76,"f1":0.6,"fn":11,"fp":1,"precision":0.9,"recall":0.45,"threshold":0.65,"tp":9},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.65,0,1,4,1]],"vlines":[[0.65,"0.65"]]},{"caption":"閾値 0.8：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.66,"f1":0.26,"fn":17,"fp":0,"precision":1,"recall":0.15,"threshold":0.8,"tp":3},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.8,0,1,4,1]],"vlines":[[0.8,"0.8"]]}],"x_range":[0,1],"y_range":[0,4]};
 var id = 'viz-steps-threshold-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学A「条件付き確率」で解く「検査で陽性と出た人が本当に病気である確率」の問題そのものです。感度 \(P(\text{陽性} \mid \text{感染})\) と特異度 \(P(\text{陰性} \mid \text{非感染})\) が問題文で与えられ、求めるのは \(P(\text{感染} \mid \text{陽性})\) です。4 マスの表を書けば、ベイズの定理を使わなくても列の合計で割るだけで答えが出ます。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意は、感度と「陽性者が感染している確率」を混同しないことです。感度 90% でも、感染者が 1,000 人に 10 人しかいない集団では、陽性と出た人の多くは誤報になります。4 マスの表を書いて列で割り直す習慣を付けてください。二つ目は、感度と特異度のどちらを優先するかは「間違いの痛さ」で決まることです。重い病気のスクリーニングでは見逃しが致命的なので感度を優先し、陽性なら精密検査に回します。逆に「陽性なら手術」のような重い処置につながる検査では、誤報を避けるために特異度を優先します。三つ目は、感度・特異度は集団の感染率に左右されないが、「陽性と出た」ことの意味は左右されることです。同じキットでも、流行期と平常時では陽性と出たときの重みが変わります。&lt;/p&gt;</description></item><item><title>中央値絶対誤差 | 高校生向けにやさしく解説（外れ値に動じない誤差の測り方）</title><link>https://k-dm.work/eval/regression/median-absolute-error/median-absolute-error_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/regression/median-absolute-error/median-absolute-error_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;中央値絶対誤差（MedAE）は、予測と実際のズレの絶対値を小さい順に並べて、真ん中をとった値です。MAE が「ズレの平均」なら MedAE は「ズレの中央値」で、平均は 1 つの大外れに引っぱられますが、中央値は順位の真ん中しか見ないのでほとんど動きません。「半分のデータはこの値以下のズレに収まる」と読めるので、典型的な誤差を伝えるのに向いています。その代わり、大外れが何件あるかは数字に現れないため、MAE や RMSE と並べて使います。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;文化祭で 7 つの部活が模擬店を出し、それぞれ来場者数を事前に予測しました。実際の人数とのズレ（絶対値）を並べると次のとおりです。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;部活&lt;/th&gt;
 &lt;th style="text-align: center"&gt;A&lt;/th&gt;
 &lt;th style="text-align: center"&gt;B&lt;/th&gt;
 &lt;th style="text-align: center"&gt;C&lt;/th&gt;
 &lt;th style="text-align: center"&gt;D&lt;/th&gt;
 &lt;th style="text-align: center"&gt;E&lt;/th&gt;
 &lt;th style="text-align: center"&gt;F&lt;/th&gt;
 &lt;th style="text-align: center"&gt;G&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;ズレの大きさ（人）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td style="text-align: center"&gt;30&lt;/td&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;F 部だけ、テレビで紹介されたせいで予測が 30 人も外れました。「予測はだいたいどのくらい外れたか」を 1 つの数で言うと、どうなるでしょう。平均（MAE）を取ると \((2+3+1+4+2+30+3)/7 = 45/7 \approx 6.4\) 人です。中央値（MedAE）は、小さい順に 1, 2, 2, &lt;strong&gt;3&lt;/strong&gt;, 3, 4, 30 と並べた真ん中なので &lt;strong&gt;3&lt;/strong&gt; 人になります。&lt;/p&gt;
&lt;p&gt;7 部のうち 6 部は 4 人以内に収まっているのに、平均の 6.4 人はどの部にも当てはまらない数になっています。F 部の 30 が平均を引っぱったからです。中央値の 3 人なら「ふつうはこのくらい外れる」という実感に合います。&lt;/p&gt;
&lt;p&gt;数直線の上にズレの大きさを 7 個の点で打つと、6 個は左側にかたまり、1 個だけ右の遠くにあります。平均はその遠い点に引きずられて右へずれますが、中央値は「左から 4 番目の点」なので、かたまりの中にとどまります。&lt;/p&gt;
&lt;h2 id="仕組み並べて真ん中をとる"&gt;
 仕組み：並べて、真ん中をとる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e4%b8%a6%e3%81%b9%e3%81%a6%e7%9c%9f%e3%82%93%e4%b8%ad%e3%82%92%e3%81%a8%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;div class="flow" role="img" aria-label="各データで「実際 − 予測」の絶対値をとる -&amp;gt; 小さい順に並べる -&amp;gt; 真ん中を選ぶ（奇数なら中央 1 個、偶数なら中央 2 個の平均） -&amp;gt; MedAE"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;各データで「実際 − 予測」の絶対値をとる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;小さい順に並べる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;真ん中を選ぶ（奇数なら中央 1 個、偶数なら中央 2 個の平均）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;MedAE&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;まず、各データで「実際 − 予測」を出して絶対値をとります。散布図なら点から直線までの縦の長さです。次に、そのズレを小さい順に並べます。ここが MAE とのちがいで、MAE は足して 7 で割るだけで並べません。最後に真ん中を選びます。\(n\) が奇数なら中央の 1 個、偶数なら中央 2 個の平均で、これが MedAE です。&lt;/p&gt;
&lt;p&gt;ここで F 部のズレを 30 から 100 に大きくしてみます。並べたときの真ん中は 3 のままですが、MAE は \(115/7 \approx 16.4\) に跳ね上がります。ズレの大きさの箱ひげ図を描くと、箱の中の線が MedAE です。F 部の 30 は、ひげのはるか外側に 1 点だけ飛び出した外れ値として描かれ、線（モデル）を少し動かして各部のズレが 1 人ずつ変わっても、箱の中の線はゆっくりしか動きません。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-errors-1" data-viz-type="steps" data-steps-kind="errors" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"基準：10 点の誤差（縦線）。MAE は誤差の絶対値の平均、RMSE は二乗平均の平方根。","curve":[[0,2],[10,8]],"metrics":{"mae":0.5,"median_ae":0.56,"rmse":0.58},"points":[[0.5,2.87,-1],[1.5,3.15,-1],[2.5,4.27,-1],[3.5,4.74,-1],[4.5,4.51,-1],[5.5,5.29,-1],[6.5,6.84,-1],[7.5,6.77,-1],[8.5,7.65,-1],[9.5,8.51,-1]],"squares":[[0.5,2.87,0.57],[1.5,3.15,0.25],[2.5,4.27,0.77],[3.5,4.74,0.64],[4.5,4.51,-0.19],[5.5,5.29,-0.01],[6.5,6.84,0.94],[7.5,6.77,0.27],[8.5,7.65,0.55],[9.5,8.51,0.81]]},{"caption":"1 点だけ誤差を 2.0 に：MAE は少しずつ増えるが、二乗する RMSE はその 1 点に強く引きずられる。中央絶対誤差はほぼ動かない。","curve":[[0,2],[10,8]],"metrics":{"mae":0.61,"median_ae":0.56,"rmse":0.8},"points":[[0.5,2.87,-1],[1.5,3.15,-1],[2.5,4.27,-1],[3.5,4.74,-1],[4.5,4.51,-1],[5.5,5.29,-1],[6.5,7.9,1],[7.5,6.77,-1],[8.5,7.65,-1],[9.5,8.51,-1]],"squares":[[0.5,2.87,0.57],[1.5,3.15,0.25],[2.5,4.27,0.77],[3.5,4.74,0.64],[4.5,4.51,-0.19],[5.5,5.29,-0.01],[6.5,7.9,2],[7.5,6.77,0.27],[8.5,7.65,0.55],[9.5,8.51,0.81]]},{"caption":"1 点だけ誤差を 4.0 に：MAE は少しずつ増えるが、二乗する RMSE はその 1 点に強く引きずられる。中央絶対誤差はほぼ動かない。","curve":[[0,2],[10,8]],"metrics":{"mae":0.81,"median_ae":0.56,"rmse":1.36},"points":[[0.5,2.87,-1],[1.5,3.15,-1],[2.5,4.27,-1],[3.5,4.74,-1],[4.5,4.51,-1],[5.5,5.29,-1],[6.5,9.9,1],[7.5,6.77,-1],[8.5,7.65,-1],[9.5,8.51,-1]],"squares":[[0.5,2.87,0.57],[1.5,3.15,0.25],[2.5,4.27,0.77],[3.5,4.74,0.64],[4.5,4.51,-0.19],[5.5,5.29,-0.01],[6.5,9.9,4],[7.5,6.77,0.27],[8.5,7.65,0.55],[9.5,8.51,0.81]]},{"caption":"1 点だけ誤差を 7.0 に：MAE は少しずつ増えるが、二乗する RMSE はその 1 点に強く引きずられる。中央絶対誤差はほぼ動かない。","curve":[[0,2],[10,8]],"metrics":{"mae":1.11,"median_ae":0.56,"rmse":2.27},"points":[[0.5,2.87,-1],[1.5,3.15,-1],[2.5,4.27,-1],[3.5,4.74,-1],[4.5,4.51,-1],[5.5,5.29,-1],[6.5,12.9,1],[7.5,6.77,-1],[8.5,7.65,-1],[9.5,8.51,-1]],"squares":[[0.5,2.87,0.57],[1.5,3.15,0.25],[2.5,4.27,0.77],[3.5,4.74,0.64],[4.5,4.51,-0.19],[5.5,5.29,-0.01],[6.5,12.9,7],[7.5,6.77,0.27],[8.5,7.65,0.55],[9.5,8.51,0.81]]}],"x_range":[0,10],"y_range":[0,16]};
 var id = 'viz-steps-errors-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：数学I「データの分析」で、平均値と中央値のどちらが代表値としてふさわしいかを考えました。MAE と MedAE はその議論を「ズレの大きさ」というデータに当てはめたものです。箱ひげ図・四分位数の知識があれば、MedAE が「第 2 四分位数」であること、外れ値がひげの外に出ることもそのまま読めます。情報I/IIで&lt;strong&gt;回帰モデルの当てはまり&lt;/strong&gt;を調べるとき、RMSE（分散の考え方）・MAE・MedAE を並べると誤差の「平均・典型・最悪」が見えてきます。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意は、大失敗が隠れることです。MedAE が 3 人でも、残りの半分に 30 人級の大外れが何件あるかは分かりません。「最悪どのくらい外れるか」が大事な場面（在庫切れ、医療）では RMSE や最大誤差も見ます。二つ目は、データが少ないと値が飛び飛びに変わることで、7 個しかないと 1 個の値が変わるだけで真ん中の順位が入れかわります。三つ目は、MedAE を最小にする直線は、ふつうの回帰直線とちがうという点です。最小二乗法の直線は 2 乗のズレを最小にしているので、MedAE で評価するなら、外れ値に強い別の引き方（ロバスト回帰）も検討します。&lt;/p&gt;</description></item><item><title>日次データの基本プロット | 高校生向けにやさしく解説（折れ線で傾向と季節性を読む）</title><link>https://k-dm.work/timeseries/01_foundations/time_series_overview_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/01_foundations/time_series_overview_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;&lt;strong&gt;時系列データ&lt;/strong&gt;とは、毎日・毎月のように時間順に並んだデータのことで、順番そのものが情報なので、まず&lt;strong&gt;折れ線グラフ&lt;/strong&gt;にして流れを読みます。折れ線から読み取るのは 3 つで、全体がゆっくり上がる・下がる流れの&lt;strong&gt;トレンド&lt;/strong&gt;、約 30 日のように決まった間隔でくり返す山と谷の&lt;strong&gt;季節性&lt;/strong&gt;、それ以外の細かいゆらぎの&lt;strong&gt;ノイズ&lt;/strong&gt;です。月末のような節目の日に点（散布図）を重ねると区切りの値が強調され、外れた日やデータの抜けも見つけやすくなります。細かい分析の前に、この「素朴な 1 枚」で 240 日分の全体像をつかむのが時系列分析の第一歩です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;お店の毎日の売上が、240 行の表になって手元にあるとします。「売上は伸びている？」「同じような上下をくり返している？」「変な日はない？」と聞かれたら、表の 240 個の数字を上から眺めるだけで答えられるでしょうか。数字を見比べるだけでは人間には難しい。でも折れ線にすれば数秒で見えてきます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/overview.svg"
 alt="横軸が日付、縦軸が売上の折れ線。青い線が約 30 日ごとに山と谷をくり返しながら全体として右上がりに進み、30 日おきのオレンジの点が月末の値を強調している"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;青い線が 240 日分の毎日の売上です。見る場所は 3 つ。左端より右端が明らかに高い——&lt;strong&gt;トレンド&lt;/strong&gt;。約 30 日ごとに山と谷がくり返す——&lt;strong&gt;季節性&lt;/strong&gt;（月の周期）。線が細かくギザギザしている——&lt;strong&gt;ノイズ&lt;/strong&gt;。オレンジの点は 30 日おきの月末の値で、節目ごとの高さを比べる目印です。&lt;/p&gt;
&lt;h2 id="仕組み折れ線をどう読むか"&gt;
 仕組み：折れ線をどう読むか
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e6%8a%98%e3%82%8c%e7%b7%9a%e3%82%92%e3%81%a9%e3%81%86%e8%aa%ad%e3%82%80%e3%81%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、&lt;strong&gt;横軸に日付、縦軸に値をとって 240 個の点を打ち、隣どうしを線でつなぎます&lt;/strong&gt;。点の順番＝時間の順番なので、線は「前の日から次の日への変化」を表します。次に&lt;strong&gt;全体の傾きを見ます（トレンド）&lt;/strong&gt;。左端と右端の高さを比べると、図では 120 付近から 150 を超えるまで上がっていて、「伸びている」と判断できます。それから&lt;strong&gt;くり返しの山を数えます（季節性）&lt;/strong&gt;——山と山の間隔を測ると図では約 30 日ごとなので、月の中で売れる時期・売れない時期があるとわかります。間隔が 20 日、45 日とばらつくなら季節性ではなく、たまたまの動きかもしれません。そのうえで&lt;strong&gt;外れた点と途切れを探します&lt;/strong&gt;——1 日だけ飛び出した値（外れ値）や、線が飛んでいる区間（欠測）があれば、分析の前に理由を確かめます。最後に&lt;strong&gt;節目に印をつけます&lt;/strong&gt;。月末や週末だけ点を重ねると、「月末はいつも山の手前にある」のような節目の挙動が読み取りやすくなります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="日付順に点を打って線でつなぐ -&amp;gt; 左端と右端を比べる（トレンド） -&amp;gt; 山と山の間隔を数える（季節性、約 30 日） -&amp;gt; 飛び出した点・途切れた区間を探す -&amp;gt; 月末などの節目に点を重ねる"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;日付順に点を打って線でつなぐ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;左端と右端を比べる（トレンド）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;山と山の間隔を数える（季節性、約 30 日）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;飛び出した点・途切れた区間を探す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;月末などの節目に点を重ねる&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-linechart-0" data-viz-type="steps" data-steps-kind="linechart" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"2 本の系列をそのまま描く。差は小さく、どちらも緩やかに増えている。","curve":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"curve2":[[0,89.27],[1,86.43],[2,88.11],[3,88.67],[4,88.6],[5,89.08],[6,89.25],[7,90.08],[8,89.33],[9,89.52],[10,89.17],[11,90.03],[12,89.9],[13,90.53],[14,90.3],[15,90.87],[16,90.54],[17,90.26],[18,90.82],[19,90.98],[20,92.15],[21,91.63],[22,92.13],[23,92.7],[24,92.62],[25,92.32],[26,92.8],[27,91.45],[28,93.44],[29,92.68],[30,92.24],[31,93.95],[32,93.49],[33,92.89],[34,94.48],[35,95.04]]},{"caption":"縦軸を 85 から始めると、同じデータでも差と変動が大きく見える。折れ線でも軸の省略は要注意。","curve":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"curve2":[[0,89.27],[1,86.43],[2,88.11],[3,88.67],[4,88.6],[5,89.08],[6,89.25],[7,90.08],[8,89.33],[9,89.52],[10,89.17],[11,90.03],[12,89.9],[13,90.53],[14,90.3],[15,90.87],[16,90.54],[17,90.26],[18,90.82],[19,90.98],[20,92.15],[21,91.63],[22,92.13],[23,92.7],[24,92.62],[25,92.32],[26,92.8],[27,91.45],[28,93.44],[29,92.68],[30,92.24],[31,93.95],[32,93.49],[33,92.89],[34,94.48],[35,95.04]],"y_range":[85,100]},{"caption":"7 点移動平均を重ねると、ノイズの奥にある傾向だけが見える。元データは薄く残す。","curve":[[3,90.28],[4,90.55],[5,90.63],[6,90.8],[7,91.08],[8,91.39],[9,91.53],[10,91.67],[11,91.77],[12,91.92],[13,91.98],[14,92.09],[15,92.13],[16,92.1],[17,92.27],[18,92.71],[19,92.79],[20,93.18],[21,93.2],[22,93.26],[23,93.45],[24,93.62],[25,93.52],[26,93.74],[27,93.65],[28,93.93],[29,94.26],[30,94.47],[31,94.75],[32,94.92]],"curve2":[[0,89.24],[1,90.18],[2,90.49],[3,89.96],[4,90.2],[5,91.58],[6,90.34],[7,91.1],[8,90.76],[9,91.65],[10,91.92],[11,92.39],[12,92.52],[13,91.38],[14,91.74],[15,91.84],[16,92.09],[17,92.69],[18,92.63],[19,92.35],[20,92.56],[21,94.78],[22,92.4],[23,94.85],[24,92.85],[25,93.06],[26,93.64],[27,93.78],[28,94.09],[29,93.9],[30,94.23],[31,94.82],[32,95.34],[33,95.16],[34,95.69],[35,95.3]],"y_range":[85,100]}],"x_range":[0,35],"y_range":[0,110]};
 var id = 'viz-steps-linechart-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報I「データの活用」で学ぶ&lt;strong&gt;時系列データの傾向・季節性の読み取り&lt;/strong&gt;が、このページの内容そのものです。数学Iの「データの分析」で描いた散布図は 2 つの量の関係を見るものでしたが、時系列の折れ線は横軸を時間に固定し、「いつ・どう変わったか」を読む道具です。平均や分散を計算する前に「まず折れ線で形を見る」という順番を覚えておきましょう。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;いちばん多い誤読は、&lt;strong&gt;縦軸の範囲で印象が変わる&lt;/strong&gt;ことを忘れることで、縦軸を 0 から始めると「ほぼ横ばい」、120 から始めると「急成長」に見えるので、軸の数字を必ず読みましょう。二つ目は、&lt;strong&gt;季節性とトレンドが混ざると増減の判断が難しい&lt;/strong&gt;ことです。「先月より下がった」が 30 日周期の谷に入っただけなのか本当に落ちたのかは、この図だけでは決められず、&lt;a href="https://k-dm.work/timeseries/07_state_space/seasonal_decomposition_highschool/"&gt;季節成分とトレンドの分解&lt;/a&gt;で切り分けます。三つ目は、&lt;strong&gt;線でつなぐと「抜け」が隠れる&lt;/strong&gt;こと。10 日分データがなくても線でつなげば続いているように見えるので、点も重ねて描くと抜けが見つかります。最後に、&lt;strong&gt;月末の 8 個の点だけ見ると山谷を見逃します&lt;/strong&gt;。オレンジの点だけを追うと月の中の 30 日の波は消えてなめらかに見えるので、間引いた点と毎日の線は必ず一緒に見ます。&lt;/p&gt;</description></item><item><title>F1 スコア | 高校生向けにやさしく解説（適合率と再現率の調和平均）</title><link>https://k-dm.work/eval/classification/f1-score/f1-score_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/classification/f1-score/f1-score_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;F1 スコアは、&lt;strong&gt;適合率&lt;/strong&gt;（誤報の少なさ）と&lt;strong&gt;再現率&lt;/strong&gt;（見逃しの少なさ）を 1 つの数にまとめた指標です。計算は&lt;strong&gt;調和平均&lt;/strong&gt; \(F_1 = \dfrac{2PR}{P+R}\) で、「足して 2 で割る」ふつうの平均より、&lt;strong&gt;低い方に強く引っぱられる&lt;/strong&gt;のが特徴です。適合率 1.0・再現率 0.05 のように片方だけ高いモデルは F1 が約 0.1 と低くなり、両方そろって高いときだけ F1 は 1 に近づきます。しきい値を 0 から 1 まで動かすと F1 は山の形に変化し、山の頂上が「バランスのよい線の位置」です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://k-dm.work/eval/classification/precision-recall/precision-recall_highschool/"&gt;適合率・再現率（高校生向け）&lt;/a&gt; で使った金属探知機で、感度の設定を 3 とおり試しました。どの設定がいちばん「よい腕前」でしょうか。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;設定&lt;/th&gt;
 &lt;th style="text-align: center"&gt;適合率 P&lt;/th&gt;
 &lt;th style="text-align: center"&gt;再現率 R&lt;/th&gt;
 &lt;th style="text-align: center"&gt;ふつうの平均 (P+R)/2&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;A（感度 低）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.90&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.45&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.675&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;B（感度 中）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.60&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.75&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.675&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;C（感度 高）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.475&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.95&lt;/td&gt;
 &lt;td style="text-align: center"&gt;0.7125&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;ふつうの平均では A と B が 0.675 で同点、C が 0.7125 でいちばんです。でも C は「鳴った場所の半分以上がはずれ」で、掘ってばかりの設定です。もっと極端に、&lt;strong&gt;1 か所だけ鳴って本物だった&lt;/strong&gt;設定 D（P = 1.0、R = 0.05）を考えると、ふつうの平均は 0.525 で B より下なのにそれほど悪く見えません。「片方だけ良い」を高く評価しすぎるのが、ふつうの平均の弱点です。&lt;/p&gt;
&lt;h2 id="仕組み低い方に引っぱられる平均"&gt;
 仕組み：低い方に引っぱられる平均
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e4%bd%8e%e3%81%84%e6%96%b9%e3%81%ab%e5%bc%95%e3%81%a3%e3%81%b1%e3%82%89%e3%82%8c%e3%82%8b%e5%b9%b3%e5%9d%87"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、逆数にして平均します。F1 は P と R の&lt;strong&gt;調和平均&lt;/strong&gt;、つまり逆数の平均の逆数で、&lt;/p&gt;
$$
F_1 = \frac{2}{\dfrac{1}{P} + \dfrac{1}{R}} = \frac{2PR}{P + R}
$$&lt;p&gt;と計算します。P と R のうち小さい方（たとえば 0.45）の逆数が大きくなって平均を支配するので、結果は&lt;strong&gt;小さい方に近づきます&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;次に、3 つの設定を計算し直します。A は \(2 \times 0.90 \times 0.45 / 1.35 = 0.60\)、B は \(2 \times 0.60 \times 0.75 / 1.35 \approx 0.67\)、C は \(2 \times 0.475 \times 0.95 / 1.425 \approx 0.63\)。順位は &lt;strong&gt;B &amp;gt; C &amp;gt; A&lt;/strong&gt; に変わり、バランスのよい B が選ばれます。極端な D は \(2 \times 1.0 \times 0.05 / 1.05 \approx 0.095\) と、きちんと低い点になります。&lt;/p&gt;
&lt;p&gt;最後に、しきい値を 0 から動かしてみます。しきい値 0 では全部を陽性と言うので R = 1、P は陽性の割合（下の図のデータでは約 0.05）で、F1 は約 0.1 です。線を右へ動かすと誤報が減って P が上がり、R は 1 から少しずつ下がります。F1 はしばらく上がり続け、山の頂上を迎えます。線を右端まで動かして陽性判定が 1 件もなくなると R = 0 となり、F1 は 0 に落ちます。&lt;/p&gt;</description></item><item><title>移動平均と移動標準偏差 | 高校生向けにやさしく解説（ギザギザの線をなめらかにする）</title><link>https://k-dm.work/timeseries/05_transformations/rolling_statistics_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/05_transformations/rolling_statistics_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;&lt;strong&gt;移動平均&lt;/strong&gt;は「直近 14 日分の平均」を 1 日ずつずらしながら計算したもので、細かい上下（ノイズ）が打ち消されて折れ線がなめらかになり、&lt;strong&gt;トレンド&lt;/strong&gt;（大きな流れ）が見えてきます。&lt;strong&gt;移動標準偏差&lt;/strong&gt;は同じ 14 日の窓の中での&lt;strong&gt;ばらつき&lt;/strong&gt;（標準偏差）で、移動平均の上下に帯として描くと「荒れている時期」「落ち着いている時期」が一目で分かります。窓の幅を 7 日から 14 日、30 日と広げるほど線はなめらかになりますが、山や谷が小さく・遅れて見える副作用があります。図を読むときは「青い線の傾き」と「水色の帯の広さ」を別々に見ます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;スマホの歩数を 200 日分、毎日記録したとします。折れ線にすると、部活のある日は多く、休みの日は少なく、テスト期間はがくんと減る……と線は毎日激しく上下します。「この半年で歩く量は増えた？ 減った？」と聞かれたら、ギザギザの線のどこを見れば答えられるでしょうか。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/rolling_stats.svg"
 alt="灰色のギザギザした元データの上に、14 日移動平均の青いなめらかな線と、その上下に移動標準偏差の水色の帯が重なっている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;灰色の細い線が元のデータで、毎日の上下が激しく流れが読みにくい。青い太い線は &lt;strong&gt;14 日移動平均&lt;/strong&gt;で、ギザギザが消えて「ゆるやかに上がりながら、20 日ほどの周期で波打っている」ことが見えます。水色の帯は移動平均に&lt;strong&gt;移動標準偏差&lt;/strong&gt;を足し引きした「平均 ± 標準偏差 1 つ分」の範囲で、広いところほど値が荒れています。&lt;/p&gt;
&lt;h2 id="仕組み窓をずらしながら平均をとる"&gt;
 仕組み：窓をずらしながら平均をとる
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e7%aa%93%e3%82%92%e3%81%9a%e3%82%89%e3%81%97%e3%81%aa%e3%81%8c%e3%82%89%e5%b9%b3%e5%9d%87%e3%82%92%e3%81%a8%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず&lt;strong&gt;窓の幅&lt;/strong&gt;を決めます。図では 14 日で、「何日分をひとまとめにして平均するか」を先に決めるのがこの一歩です。次に最初の 14 日分の値を平均し、窓の真ん中の日に点を打ちます。「多い日」と「少ない日」が打ち消し合って、1 つの落ち着いた値になります。それから窓を 1 日ずらして同じことを繰り返すと、点がつながって青い線になります。ギザギザはどの窓の中でもプラスとマイナスが相殺されて消え、ゆっくり動く部分だけが残ります。同じ窓で&lt;strong&gt;標準偏差&lt;/strong&gt;も計算し、「移動平均＋標準偏差」と「移動平均−標準偏差」を上下に塗ると水色の帯になります。窓の中の 14 個の値が散らばっている時期ほど帯は広がります。最後に読み方です。青い線の傾きがトレンド、帯の広さがばらつきの大きさを表します。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="窓の幅を決める（14 日） -&amp;gt; 窓の中の 14 個を平均して真ん中の日に点を打つ -&amp;gt; 窓を 1 日ずらす -&amp;gt; 点をつないで青い線に -&amp;gt; 同じ窓で標準偏差も計算して帯を塗る"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;窓の幅を決める（14 日）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;窓の中の 14 個を平均して真ん中の日に点を打つ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;窓を 1 日ずらす&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;点をつないで青い線に&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;同じ窓で標準偏差も計算して帯を塗る&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;7 日分の値を幅 3 の窓で平均すると、元の値は 9〜16 の間で跳ねるのに、移動平均は 11〜14.3 に収まります。これが「なめらかになる」の中身です。下の短いコードがその計算を 5 回分そのまま行います。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 7 日分の値&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="c1"&gt;# 窓の幅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;day&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mean =&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1-2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1-2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;7 個の値と窓の幅 3 を用意する&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;steps&lt;/code&gt; が 7 日分の歩数のつもりの値、&lt;code&gt;w&lt;/code&gt; が窓の幅です。値を 10, 14, 9, 15 … と交互に上下させているのは、隣どうしのプラスとマイナスが平均で打ち消される様子を見せるためです。&lt;code&gt;w&lt;/code&gt; を 5 に変えると平均は 11.8〜13.6 にさらに狭まり、1 にすると元の値がそのまま出ます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;窓を置ける回数は 7 − 3 &amp;#43; 1 = 5 回&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;7 日分に幅 3 の窓を置けるのは day 1-3 から day 5-7 までの 5 回で、&lt;code&gt;len(steps) - w + 1&lt;/code&gt; がちょうどその回数です。これが「端では計算できない」の正体で、図の青い線が灰色の線より両端で短いのも同じ理由です。&lt;code&gt;range(len(steps))&lt;/code&gt; と書くと最後の 2 回で窓が足りず、短い窓の平均が混ざってしまいます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4-5"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4-5 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;窓を切り出して平均し、位置とともに表示する&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;steps[i:i + w]&lt;/code&gt; で i 日目から 3 日分を切り出し、&lt;code&gt;sum(window) / w&lt;/code&gt; で平均を取っています。&lt;code&gt;round(..., 1)&lt;/code&gt; は表示を小数 1 桁にそろえるだけで、計算そのものは変えません。&lt;code&gt;print&lt;/code&gt; に「day 1 - 3」と窓の範囲を添えているのは、どの 3 日の平均かを後から追えるようにするためです。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>曜日別の平均をバーで確認 | 高校生向けにやさしく解説（曜日のクセを棒グラフで見つける）</title><link>https://k-dm.work/timeseries/03_seasonality_patterns/weekday_averages_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/03_seasonality_patterns/weekday_averages_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;毎日のデータには「土曜は多い、日曜は少ない」のような&lt;strong&gt;曜日のクセ&lt;/strong&gt;（曜日効果）が隠れていることがあり、7 日ごとにくり返すので週単位の&lt;strong&gt;季節性&lt;/strong&gt;と呼びます。折れ線のままでは見えにくいクセも、同じ曜日の値を集めて平均し、7 本の棒グラフにすると一目でわかります。棒の上の I の形（誤差バー）はその曜日の&lt;strong&gt;標準偏差&lt;/strong&gt;、つまりばらつきの大きさで、棒の高さの差が誤差バーより大きければ曜日の差は本物と考えられます。差がはっきりしていれば、予測モデルに「曜日」を入力として加える価値があります。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;学校の近くのコンビニが、7 か月（210 日）分の毎日の売上を記録しています。折れ線にすると 1 週間ごとに上下をくり返すギザギザの線になりますが、「何曜日がいちばん売れる？」「日曜はほかの曜日より本当に低い？」と聞かれると、210 個の点を曜日ごとに目で追うのは無理です。&lt;/p&gt;
&lt;p&gt;そこで、**月曜の 30 日分、火曜の 30 日分……**と同じ曜日の値を集めて平均し、7 本の棒にします。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/weekday_average.svg"
 alt="月〜日の 7 本の青い棒が各曜日の平均売上を表し、棒の上の黒い I 字の線が標準偏差を表している。土曜の棒が突出して高く、日曜の棒がいちばん低い"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;7 本のうち土曜の棒がはっきり高く、日曜の棒がいちばん低いことがすぐわかります。折れ線では毎週のギザギザにしか見えなかったものが、「週のどこで高く、どこで低いか」という&lt;strong&gt;形&lt;/strong&gt;になりました。棒の上の黒い I 字は、その曜日の 30 日分の値の散らばり（標準偏差）です。&lt;/p&gt;
&lt;h2 id="仕組み曜日ごとに集めて平均とばらつきを出す"&gt;
 仕組み：曜日ごとに集めて、平均とばらつきを出す
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e6%9b%9c%e6%97%a5%e3%81%94%e3%81%a8%e3%81%ab%e9%9b%86%e3%82%81%e3%81%a6%e5%b9%b3%e5%9d%87%e3%81%a8%e3%81%b0%e3%82%89%e3%81%a4%e3%81%8d%e3%82%92%e5%87%ba%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、210 日分の値それぞれに曜日のラベルをつけます。これで「月・火・水・木・金・土・日」の 7 グループに分かれ、1 グループあたり 30 日分になります。次に、グループごとに平均を計算します。これが棒の高さで、「たまたま多かった日」「少なかった日」は 30 日の平均の中で薄まり、その曜日に共通する水準だけが残ります。さらに、グループごとに標準偏差を計算して誤差バーの長さにします。同じ曜日でも値が毎週ばらつく曜日は I 字が長く、30 日とも似た値の曜日は短くなります。&lt;/p&gt;
&lt;p&gt;最後に、棒の高さの差と誤差バーの長さを比べます。土曜と日曜の棒の差が誤差バーよりずっと大きければ、「土曜は日曜より高い」は毎週ほぼ成り立つクセです。差が誤差バーの範囲に埋もれるなら、たまたまかもしれません。クセがはっきりしていれば、売上を予測するモデルに「何曜日か」を入力として加えると当たりやすくなります。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="210 日の記録 -&amp;gt; 各日に曜日ラベル -&amp;gt; 7 グループに分ける -&amp;gt; 平均 = 棒の高さ -&amp;gt; 標準偏差 = 誤差バー -&amp;gt; 棒の差と誤差バーを比べる"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;210 日の記録&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;各日に曜日ラベル&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;7 グループに分ける&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;平均 = 棒の高さ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;標準偏差 = 誤差バー&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;棒の差と誤差バーを比べる&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;script&gt;(function(){"use strict";var e=window.VizCore=window.VizCore||{};e.i18n={ja:{threshold:"閾値",tpr:"真陽性率(TPR)",fpr:"偽陽性率(FPR)",accuracy:"正解率",precision:"適合率",recall:"再現率",f1:"F1スコア",tp:"TP(真陽性)",fp:"FP(偽陽性)",tn:"TN(真陰性)",fn:"FN(偽陰性)",k_neighbors:"近傍数 k",train_acc:"訓練正解率",components:"主成分数",cum_var:"累積寄与率",positive:"陽性",negative:"陰性",predicted:"予測",actual:"実際",alpha:"正則化 α",degree:"次数",c_param:"罰則 C",gamma:"γ",eps:"半径 ε",min_samples:"最小点数",n_clusters:"クラスタ数",perplexity:"Perplexity",max_depth:"最大深さ",n_estimators:"推定器数",learning_rate:"学習率",temperature:"温度",quantile:"分位点",l1_ratio:"L1比率",n_neighbors:"近傍数",min_cluster_size:"最小クラスタ",noise_points:"ノイズ点数",n_components:"成分数",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"マージン",support_vectors:"サポートベクタ数",train_error:"訓練誤差",test_error:"テスト誤差",probability:"確率",class_label:"クラス",silhouette:"シルエット係数",noise:"ノイズ",n_nonzero:"非ゼロ係数数",coef_index:"係数番号",cut_height:"カット高さ",k_folds:"分割数",train:"訓練",validation:"検証",noise_level:"ノイズ量",distance:"距離",specificity:"特異度",sensitivity:"感度",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"平均適合率",balanced_acc:"バランス正解率",mape:"MAPE",mbe:"MBE",median_ae:"中央絶対誤差",explained_var:"説明分散",adjusted_r2:"調整済みR²",corr:"相関係数",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},en:{threshold:"Threshold",tpr:"TPR",fpr:"FPR",accuracy:"Accuracy",precision:"Precision",recall:"Recall",f1:"F1 Score",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k neighbors",train_acc:"Train Acc.",components:"Components",cum_var:"Cum. Variance",positive:"Positive",negative:"Negative",predicted:"Predicted",actual:"Actual",alpha:"Reg. α",degree:"Degree",c_param:"Penalty C",gamma:"γ",eps:"Radius ε",min_samples:"Min Points",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Max Depth",n_estimators:"Estimators",learning_rate:"Learning Rate",temperature:"Temperature",quantile:"Quantile",l1_ratio:"L1 Ratio",n_neighbors:"Neighbors",min_cluster_size:"Min Cluster",noise_points:"Noise Pts",n_components:"Components",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support Vectors",train_error:"Train Error",test_error:"Test Error",probability:"Probability",class_label:"Class",silhouette:"Silhouette",noise:"Noise",n_nonzero:"Non-zero Coefs",coef_index:"Coef. #",cut_height:"Cut Height",k_folds:"Folds",train:"Train",validation:"Validation",noise_level:"Noise Level",distance:"Distance",specificity:"Specificity",sensitivity:"Sensitivity",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},es:{threshold:"Umbral",tpr:"TPR",fpr:"FPR",accuracy:"Exactitud",precision:"Precisión",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vecinos",train_acc:"Acc. entren.",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Predicho",actual:"Real",alpha:"Reg. α",degree:"Grado",c_param:"Penaliz. C",gamma:"γ",eps:"Radio ε",min_samples:"Pts mín.",n_clusters:"Clústeres",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Tasa aprend.",temperature:"Temperatura",quantile:"Cuantil",l1_ratio:"Ratio L1",n_neighbors:"Vecinos",min_cluster_size:"Clúster mín.",noise_points:"Pts ruido",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margen",support_vectors:"Vectores soporte",train_error:"Error entren.",test_error:"Error prueba",probability:"Probabilidad",class_label:"Clase",silhouette:"Silueta",noise:"Ruido",n_nonzero:"Coefs no cero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Pliegues",train:"Entren.",validation:"Valid.",noise_level:"Nivel ruido",distance:"Distancia",specificity:"Especificidad",sensitivity:"Sensibilidad",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. media",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlación",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},id:{threshold:"Ambang",tpr:"TPR",fpr:"FPR",accuracy:"Akurasi",precision:"Presisi",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k tetangga",train_acc:"Aku. latih",components:"Komponen",cum_var:"Var. kum.",positive:"Positif",negative:"Negatif",predicted:"Prediksi",actual:"Aktual",alpha:"Reg. α",degree:"Derajat",c_param:"Penalti C",gamma:"γ",eps:"Radius ε",min_samples:"Titik min.",n_clusters:"Kluster",perplexity:"Perplexity",max_depth:"Kedalaman maks.",n_estimators:"Estimator",learning_rate:"Laju belajar",temperature:"Suhu",quantile:"Kuantil",l1_ratio:"Rasio L1",n_neighbors:"Tetangga",min_cluster_size:"Kluster min.",noise_points:"Titik noise",n_components:"Komponen",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margin",support_vectors:"Support vector",train_error:"Error latih",test_error:"Error uji",probability:"Probabilitas",class_label:"Kelas",silhouette:"Siluet",noise:"Noise",n_nonzero:"Koef. non-nol",coef_index:"Koef. #",cut_height:"Tinggi potong",k_folds:"Lipatan",train:"Latih",validation:"Validasi",noise_level:"Tingkat noise",distance:"Jarak",specificity:"Spesifisitas",sensitivity:"Sensitivitas",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Presisi rata²",balanced_acc:"Akurasi seimbang",mape:"MAPE",mbe:"MBE",median_ae:"MAE median",explained_var:"Var. terjelaskan",adjusted_r2:"R² disesuaikan",corr:"Korelasi",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},th:{threshold:"เกณฑ์",tpr:"TPR",fpr:"FPR",accuracy:"ความแม่นยำ",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k เพื่อนบ้าน",train_acc:"Acc. ฝึก",components:"องค์ประกอบ",cum_var:"ความแปรปรวนสะสม",positive:"บวก",negative:"ลบ",predicted:"ทำนาย",actual:"จริง",alpha:"Reg. α",degree:"ดีกรี",c_param:"โทษ C",gamma:"γ",eps:"รัศมี ε",min_samples:"จุดขั้นต่ำ",n_clusters:"คลัสเตอร์",perplexity:"Perplexity",max_depth:"ความลึกสูงสุด",n_estimators:"ตัวประมาณ",learning_rate:"อัตราเรียนรู้",temperature:"อุณหภูมิ",quantile:"ควอนไทล์",l1_ratio:"อัตราส่วน L1",n_neighbors:"เพื่อนบ้าน",min_cluster_size:"คลัสเตอร์ขั้นต่ำ",noise_points:"จุดรบกวน",n_components:"องค์ประกอบ",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"มาร์จิน",support_vectors:"ซัพพอร์ตเวกเตอร์",train_error:"ข้อผิดพลาดฝึก",test_error:"ข้อผิดพลาดทดสอบ",probability:"ความน่าจะเป็น",class_label:"คลาส",silhouette:"ซิลูเอตต์",noise:"สัญญาณรบกวน",n_nonzero:"สัมประสิทธิ์ไม่เป็นศูนย์",coef_index:"สัมประสิทธิ์ #",cut_height:"ความสูงตัด",k_folds:"การพับ",train:"ฝึก",validation:"ตรวจสอบ",noise_level:"ระดับรบกวน",distance:"ระยะทาง",specificity:"ความจำเพาะ",sensitivity:"ความไว",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Avg. Precision",balanced_acc:"Balanced Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Median AE",explained_var:"Expl. Var.",adjusted_r2:"Adj. R²",corr:"Correlation",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},el:{threshold:"Κατώφλι",tpr:"TPR",fpr:"FPR",accuracy:"Ακρίβεια",precision:"Precision",recall:"Recall",f1:"F1",tp:"TP",fp:"FP",tn:"TN",fn:"FN",k_neighbors:"k γείτονες",train_acc:"Acc. εκπ.",components:"Συνιστώσες",cum_var:"Αθρ. διακ.",positive:"Θετικό",negative:"Αρνητικό",predicted:"Πρόβλεψη",actual:"Πραγματικό",alpha:"Reg. α",degree:"Βαθμός",c_param:"Ποινή C",gamma:"γ",eps:"Ακτίνα ε",min_samples:"Ελάχ. σημεία",n_clusters:"Συστάδες",perplexity:"Perplexity",max_depth:"Μέγ. βάθος",n_estimators:"Εκτιμητές",learning_rate:"Ρυθμός μάθ.",temperature:"Θερμοκρασία",quantile:"Ποσοστημόριο",l1_ratio:"Λόγος L1",n_neighbors:"Γείτονες",min_cluster_size:"Ελάχ. συστάδα",noise_points:"Σημεία θορ.",n_components:"Συνιστώσες",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Περιθώριο",support_vectors:"Διανύσματα υποστ.",train_error:"Σφάλμα εκπ.",test_error:"Σφάλμα δοκ.",probability:"Πιθανότητα",class_label:"Κλάση",silhouette:"Σιλουέτα",noise:"Θόρυβος",n_nonzero:"Μη μηδ. συντ.",coef_index:"Συντ. #",cut_height:"Ύψος τομής",k_folds:"Πτυχώσεις",train:"Εκπαίδ.",validation:"Επικύρ.",noise_level:"Επίπεδο θορ.",distance:"Απόσταση",specificity:"Ειδικότητα",sensitivity:"Ευαισθησία",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Μέση Precision",balanced_acc:"Ισορρ. Acc.",mape:"MAPE",mbe:"MBE",median_ae:"Διάμεση AE",explained_var:"Εξηγ. Διακ.",adjusted_r2:"Προσ. R²",corr:"Συσχέτιση",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"},pt:{threshold:"Limiar",tpr:"TPR",fpr:"FPR",accuracy:"Acurácia",precision:"Precisão",recall:"Recall",f1:"F1",tp:"VP",fp:"FP",tn:"VN",fn:"FN",k_neighbors:"k vizinhos",train_acc:"Acc. treino",components:"Componentes",cum_var:"Var. acum.",positive:"Positivo",negative:"Negativo",predicted:"Previsto",actual:"Real",alpha:"Reg. α",degree:"Grau",c_param:"Penalidade C",gamma:"γ",eps:"Raio ε",min_samples:"Pts mín.",n_clusters:"Clusters",perplexity:"Perplexity",max_depth:"Prof. máx.",n_estimators:"Estimadores",learning_rate:"Taxa aprend.",temperature:"Temperatura",quantile:"Quantil",l1_ratio:"Razão L1",n_neighbors:"Vizinhos",min_cluster_size:"Cluster mín.",noise_points:"Pts ruído",n_components:"Componentes",mse:"MSE",mae:"MAE",r2:"R²",rmse:"RMSE",margin:"Margem",support_vectors:"Vetores suporte",train_error:"Erro treino",test_error:"Erro teste",probability:"Probabilidade",class_label:"Classe",silhouette:"Silhueta",noise:"Ruído",n_nonzero:"Coefs não zero",coef_index:"Coef. #",cut_height:"Altura corte",k_folds:"Dobras",train:"Treino",validation:"Validação",noise_level:"Nível ruído",distance:"Distância",specificity:"Especificidade",sensitivity:"Sensibilidade",log_loss:"Log Loss",brier:"Brier Score",avg_precision:"Prec. média",balanced_acc:"Acc. balanc.",mape:"MAPE",mbe:"MBE",median_ae:"MAE mediana",explained_var:"Var. expl.",adjusted_r2:"R² ajust.",corr:"Correlação",mase:"MASE",wape:"WAPE",rmsle:"RMSLE",rmspe:"RMSPE"}},e.t=function(t,n){var s=t.getAttribute("data-lang")||"en",o=e.i18n[s]||e.i18n.en;return o[n]||n},e.getColors=function(){var e=getComputedStyle(document.documentElement);return{text:e.getPropertyValue("--text").trim()||"#1e293b",muted:e.getPropertyValue("--muted").trim()||"#64748b",border:e.getPropertyValue("--border").trim()||"#e2e8f0",bg:e.getPropertyValue("--bg").trim()||"#f8fafc",surface:e.getPropertyValue("--surface").trim()||"#ffffff",brand:e.getPropertyValue("--brand").trim()||"#2563eb",accent2:e.getPropertyValue("--accent-2").trim()||"#10b981"}},e.isDark=function(){return document.documentElement.getAttribute("data-theme")==="dark"||!document.documentElement.getAttribute("data-theme")&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").matches},e.setupCanvas=function(e,t,n){var o,s=window.devicePixelRatio||1;return e.width=t*s,e.height=n*s,e.style.width=t+"px",e.style.height=n+"px",o=e.getContext("2d"),o.scale(s,s),o},e.onThemeChange=function(e){var t=new MutationObserver(function(t){t.forEach(function(t){t.attributeName==="data-theme"&amp;&amp;e()})});t.observe(document.documentElement,{attributes:!0}),window.matchMedia&amp;&amp;window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e)},e.initSlider=function(e,t){var o,s=e.querySelector(".viz-slider-row"),n=s.querySelector(".viz-slider"),i=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label");return n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,o=t.format||function(e){return e},i.textContent=o(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);i.textContent=o(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.addSlider=function(e,t){var n,o,i,a,r=e.querySelector(".viz-controls"),s=document.createElement("div");return s.className="viz-slider-row",s.innerHTML='&lt;label class="viz-slider-label"&gt;&lt;/label&gt;&lt;input type="range" class="viz-slider" /&gt;&lt;span class="viz-slider-value"&gt;&lt;/span&gt;',r.appendChild(s),n=s.querySelector(".viz-slider"),o=s.querySelector(".viz-slider-value"),a=s.querySelector(".viz-slider-label"),n.min=t.min,n.max=t.max,n.step=t.step,n.value=t.value,a.textContent=t.label,i=t.format||function(e){return e},o.textContent=i(t.value),n.addEventListener("input",function(){var e=parseFloat(this.value);o.textContent=i(e),t.onChange&amp;&amp;t.onChange(e)}),n},e.setMetrics=function(e,t){var n=e.querySelector(".viz-metrics");n.innerHTML=t.map(function(e){return'&lt;div class="viz-metric"&gt;&lt;span class="viz-metric__label"&gt;'+e.label+'&lt;/span&gt;&lt;span class="viz-metric__value"&gt;'+e.value+"&lt;/span&gt;&lt;/div&gt;"}).join("")},e.line=function(e,t,n,s){if(t.length&lt;2)return;e.beginPath(),e.strokeStyle=n,e.lineWidth=s||2,e.moveTo(t[0][0],t[0][1]);for(var o=1;o&lt;t.length;o++)e.lineTo(t[o][0],t[o][1]);e.stroke()},e.dot=function(e,t,n,s,o,i){e.beginPath(),e.arc(t,n,s,0,Math.PI*2),o&amp;&amp;(e.fillStyle=o,e.fill()),i&amp;&amp;(e.strokeStyle=i,e.lineWidth=1,e.stroke())},e.text=function(e,t,n,s,o){o=o||{},e.font=(o.weight||"")+" "+(o.size||"11px")+" system-ui, sans-serif",e.fillStyle=o.color||"#000",e.textAlign=o.align||"left",e.textBaseline=o.baseline||"top",e.fillText(t,n,s)}})()&lt;/script&gt;&lt;script&gt;(function(){"use strict";var t,n,e=window.VizCore;if(!e)return;t=["#0038ff","#e4572e","#0a7a4a","#b45309","#8b5cf6","#ec4899","#14b8a6"],n={ja:{step:"手順",play:"▶ 再生",pause:"❚❚ 停止",prev:"◀ 前へ",next:"次へ ▶",wcss:"WCSS（まとまりの悪さ）",sse:"SSE（残差二乗和）",misclassified:"誤分類数",k:"k",votes:"票",iteration:"反復",clusters:"クラスター数",merge_dist:"結合距離",angle:"角度",variance:"分散",depth:"深さ",round:"ラウンド",error:"誤り率",window:"窓幅",alpha:"α",outliers:"外れ値",bins:"階級数",r:"相関係数 r",threshold:"閾値",median_ae:"中央絶対誤差",degree:"次数",coef_norm:"係数の大きさ",cos:"cos",sigma:"σ",n_trees:"木の本数",sampled:"抽出数",period:"周期"},en:{step:"Step",play:"▶ Play",pause:"❚❚ Pause",prev:"◀ Prev",next:"Next ▶",wcss:"WCSS",sse:"SSE",misclassified:"Misclassified",k:"k",votes:"Votes",iteration:"Iteration",clusters:"Clusters",merge_dist:"Merge dist.",angle:"Angle",variance:"Variance",depth:"Depth",round:"Round",error:"Error rate",window:"Window",alpha:"α",outliers:"Outliers",bins:"Bins",r:"r",threshold:"Threshold",median_ae:"Median AE",degree:"Degree",coef_norm:"Coef. size",cos:"cos",sigma:"σ",n_trees:"Trees",sampled:"Sampled",period:"Period"}},e.steps=function(s,o){if(u=document.getElementById(s),!u)return;var l,u,g,v,w,C,E,k,A,S,T=u.getAttribute("data-lang")||"en",m=n[T]||n.en,F=u.querySelector(".viz-canvas"),O=440,j=380,i={top:14,right:14,bottom:34,left:40},_=O-i.left-i.right,f=j-i.top-i.bottom,h=o.x_range,c=o.y_range,p=o.frames||[];if(!p.length)return;S=h,k=c;function r(e){return i.left+(e-h[0])/(h[1]-h[0])*_}function a(e){return i.top+(1-(e-c[0])/(c[1]-c[0]))*f}function M(e){return e/(c[1]-c[0])*f}function d(e,t){var n=parseInt(e.slice(1),16);return"rgba("+(n&gt;&gt;16)+","+(n&gt;&gt;8&amp;255)+","+(n&amp;255)+","+t+")"}function y(e){return e==null||e&lt;0?null:t[e%t.length]}A=u.querySelector(".viz-canvas-wrap"),w=document.createElement("p"),w.className="viz-caption",A.appendChild(w),C=u.querySelector(".viz-controls"),g=document.createElement("div"),g.className="viz-transport",g.innerHTML='&lt;button type="button" class="viz-btn" data-act="prev"&gt;'+m.prev+'&lt;/button&gt;&lt;button type="button" class="viz-btn viz-btn--play" data-act="play"&gt;'+m.play+'&lt;/button&gt;&lt;button type="button" class="viz-btn" data-act="next"&gt;'+m.next+"&lt;/button&gt;",C.insertBefore(g,C.firstChild),l=0,v=null;function b(n){l=Math.max(0,Math.min(p.length-1,n));var s,v,b,x,g=p[l];h=g.x_range||S,c=g.y_range||k,s=e.setupCanvas(F,O,j),v=e.getColors(),s.fillStyle=v.surface,s.fillRect(0,0,O,j),(g.hband||[]).forEach(function(e){t=y(e[2])||v.brand,s.fillStyle=d(t,.1);var t,n=a(e[1]),o=a(e[0]);s.fillRect(i.left,n,_,o-n)}),(g.regions||[]).forEach(function(e){o=y(e[4])||v.muted,s.fillStyle=d(o,.13);var o,t=r(e[0]),i=r(e[2]),n=a(e[3]),c=a(e[1]);s.fillRect(t,n,i-t,c-n),s.strokeStyle=d(o,.6),s.lineWidth=1,s.strokeRect(t,n,i-t,c-n)}),s.strokeStyle=v.border,s.lineWidth=1,s.strokeRect(i.left,i.top,_,f),e.text(s,String(h[0]),i.left,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(h[1]),O-i.right,j-i.bottom+8,{color:v.muted,size:"10px",align:"center"}),e.text(s,String(c[0]),i.left-6,i.top+f,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),e.text(s,String(c[1]),i.left-6,i.top,{color:v.muted,size:"10px",align:"right",baseline:"middle"}),(g.squares||[]).forEach(function(e){var n=r(e[0]),o=a(e[1]),t=M(Math.abs(e[2])),i=e[2]&gt;=0?o-t:o,c=e[2]&gt;=0?n:n-t;s.fillStyle=d("#e4572e",.18),s.fillRect(c,i,t,t),s.strokeStyle=d("#e4572e",.7),s.lineWidth=1,s.strokeRect(c,i,t,t)}),(g.bars||[]).forEach(function(e){var o=y(e[3])||v.brand,t=r(e[0]),l=r(e[1]),n=Math.max(i.top,a(e[2])),u=Math.min(i.top+f,a(Math.max(c[0],0)));s.fillStyle=d(o,.75),s.fillRect(t+1,n,Math.max(1,l-t-2),u-n)}),(g.circles||[]).forEach(function(e){var t=y(e[3])||v.brand,n=e[2]/(h[1]-h[0])*_,o=e[2]/(c[1]-c[0])*f;s.beginPath(),s.ellipse(r(e[0]),a(e[1]),n,o,0,0,Math.PI*2),s.strokeStyle=d(t,.8),s.lineWidth=1.5,s.setLineDash([3,3]),s.stroke(),s.setLineDash([]),s.fillStyle=d(t,.06),s.fill()}),(g.vlines||[]).forEach(function(t){var n=r(t[0]);s.setLineDash([5,4]),e.line(s,[[n,i.top],[n,i.top+f]],v.text,1.5),s.setLineDash([]),t[1]&amp;&amp;e.text(s,String(t[1]),n+4,i.top+4,{color:v.text,size:"10px",weight:"700"})}),(g.lines||[]).forEach(function(t){e.line(s,[[r(t[0][0]),a(t[0][1])],[r(t[1][0]),a(t[1][1])]],d("#e4572e",.7),1)}),g.curve2&amp;&amp;e.line(s,g.curve2.map(function(e){return[r(e[0]),a(e[1])]}),d(v.muted,.6),1.5),g.curve&amp;&amp;e.line(s,g.curve.map(function(e){return[r(e[0]),a(e[1])]}),v.brand,2.5),x=g.points||o.points||[],x.forEach(function(t){var o=y(t[2]),n=t[3]?4*t[3]:4;o?e.dot(s,r(t[0]),a(t[1]),n,o,"#fff"):t[2]===-2?e.dot(s,r(t[0]),a(t[1]),n,d(v.muted,.35),null):e.dot(s,r(t[0]),a(t[1]),n,"#fff",v.text)}),(g.arrows||[]).forEach(function(n,o){var l,d=r(n[0][0]),u=a(n[0][1]),i=r(n[1][0]),c=a(n[1][1]),h=t[o%t.length];s.setLineDash([4,3]),e.line(s,[[d,u],[i,c]],h,1.5),s.setLineDash([]),l=Math.atan2(c-u,i-d),s.beginPath(),s.moveTo(i,c),s.lineTo(i-8*Math.cos(l-.4),c-8*Math.sin(l-.4)),s.lineTo(i-8*Math.cos(l+.4),c-8*Math.sin(l+.4)),s.closePath(),s.fillStyle=h,s.fill()}),(g.centroids||[]).forEach(function(n,o){var i=r(n[0]),c=a(n[1]),l=t[o%t.length];s.lineWidth=3,s.strokeStyle="#fff",e.line(s,[[i-7,c-7],[i+7,c+7]],"#fff",5),e.line(s,[[i-7,c+7],[i+7,c-7]],"#fff",5),e.line(s,[[i-7,c-7],[i+7,c+7]],l,3),e.line(s,[[i-7,c+7],[i+7,c-7]],l,3)}),(g.labels||[]).forEach(function(t){e.text(s,String(t[2]),r(t[0]),a(t[1]),{color:v.text,size:"11px",weight:"700",align:"center",baseline:"bottom"})}),w.textContent=g.caption||"",b=[{label:m.step,value:l+1+" / "+p.length}],Object.keys(g.metrics||{}).forEach(function(t){b.push({label:m[t]||e.t(u,t),value:String(g.metrics[t])})}),e.setMetrics(u,b),E&amp;&amp;(E.value=l,u.querySelector(".viz-slider-value").textContent=l+1)}function x(){v&amp;&amp;(clearInterval(v),v=null),g.querySelector('[data-act="play"]').textContent=m.play}function z(){if(v){x();return}l&gt;=p.length-1&amp;&amp;b(0),g.querySelector('[data-act="play"]').textContent=m.pause,v=setInterval(function(){if(l&gt;=p.length-1){x();return}b(l+1)},1300)}g.addEventListener("click",function(e){var t,n=e.target.closest("[data-act]");if(!n)return;t=n.getAttribute("data-act"),t==="play"?z():(x(),b(l+(t==="next"?1:-1)))}),E=e.initSlider(u,{min:0,max:p.length-1,step:1,value:0,label:o.step_label||m.step,format:function(e){return String(Math.round(e)+1)},onChange:function(e){x(),b(Math.round(e))}}),b(0),e.onThemeChange(function(){b(l)})}})()&lt;/script&gt;&lt;div class="viz-container viz-container--steps" id="viz-steps-weekday-0" data-viz-type="steps" data-steps-kind="weekday" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"日次データ：ぎざぎざの中に 7 日周期が隠れている。","curve":[[0,4.89],[1,5.25],[2,6.41],[3,7.21],[4,7.37],[5,10.67],[6,4.28],[7,3.83],[8,4.53],[9,6.58],[10,5.47],[11,7.54],[12,9.17],[13,4.68],[14,4.42],[15,5.73],[16,5.52],[17,6.89],[18,8.2],[19,9.77],[20,3.66],[21,5.86],[22,4.97],[23,5.15],[24,6.33],[25,6.91],[26,9.97],[27,4.36],[28,4.84],[29,5.35],[30,6.67],[31,5.81],[32,7.88],[33,9.62],[34,4.12]]},{"caption":"曜日ごとに色分けすると、同じ曜日が似た高さに並ぶのが見える。","curve2":[[0,4.89],[1,5.25],[2,6.41],[3,7.21],[4,7.37],[5,10.67],[6,4.28],[7,3.83],[8,4.53],[9,6.58],[10,5.47],[11,7.54],[12,9.17],[13,4.68],[14,4.42],[15,5.73],[16,5.52],[17,6.89],[18,8.2],[19,9.77],[20,3.66],[21,5.86],[22,4.97],[23,5.15],[24,6.33],[25,6.91],[26,9.97],[27,4.36],[28,4.84],[29,5.35],[30,6.67],[31,5.81],[32,7.88],[33,9.62],[34,4.12]],"points":[[0,4.89,0],[1,5.25,1],[2,6.41,2],[3,7.21,3],[4,7.37,4],[5,10.67,5],[6,4.28,6],[7,3.83,0],[8,4.53,1],[9,6.58,2],[10,5.47,3],[11,7.54,4],[12,9.17,5],[13,4.68,6],[14,4.42,0],[15,5.73,1],[16,5.52,2],[17,6.89,3],[18,8.2,4],[19,9.77,5],[20,3.66,6],[21,5.86,0],[22,4.97,1],[23,5.15,2],[24,6.33,3],[25,6.91,4],[26,9.97,5],[27,4.36,6],[28,4.84,0],[29,5.35,1],[30,6.67,2],[31,5.81,3],[32,7.88,4],[33,9.62,5],[34,4.12,6]]},{"bars":[[0.15,0.85,4.77,0],[1.15,1.85,5.17,1],[2.15,2.85,6.07,2],[3.15,3.85,6.34,3],[4.15,4.85,7.58,4],[5.15,5.85,9.84,5],[6.15,6.85,4.22,6]],"caption":"曜日ごとの平均（棒）：どの曜日が高いかが一目で分かる。週の形を取り出したことになる。","labels":[[0.5,5.27,"Mon"],[1.5,5.67,"Tue"],[2.5,6.57,"Wed"],[3.5,6.84,"Thu"],[4.5,8.08,"Fri"],[5.5,10.34,"Sat"],[6.5,4.72,"Sun"]],"x_range":[0,7]}],"x_range":[0,34],"y_range":[0,12]};
 var id = 'viz-steps-weekday-0';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報I「データの活用」で学ぶ&lt;strong&gt;時系列データの季節性の読み取り&lt;/strong&gt;を、「年」ではなく「週」の周期で行っています。計算に使うのは数学I「データの分析」で習った&lt;strong&gt;平均&lt;/strong&gt;と&lt;strong&gt;標準偏差&lt;/strong&gt;で、違いはデータ全体ではなく「曜日というグループごと」に計算することです。グループに分けて代表値とばらつきを比べる、という見方は他の分野でもよく使います。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の落とし穴は祝日で、「曜日」と関係なく動きます。月曜が祝日の週は、月曜の値が土日に近づくので、祝日を除くか別グループにしてから平均をとると、曜日のクセがきれいに出ます。二つ目は、誤差バーが重なる程度の差は偶然かもしれないことです。火曜と水曜のように棒の高さが近く、I 字が重なっている組は「差がある」と言い切れません。三つ目は強いトレンドで、売上がどんどん伸びていると、どの曜日も「前半は低く後半は高い」ので誤差バーが長くなります。先にトレンドを取り除いてから集計します。四つ目は、平均 1 つだけでは分布の形がわからないことです。「毎週ほぼ同じ 82」と「大当たりと不発が半々の 82」は平均が同じでも別物なので、曜日ごとの箱ひげ図で確かめます。&lt;/p&gt;</description></item><item><title>学習データとテストデータの区切り | 高校生向けにやさしく解説（未来を隠して実力を測る）</title><link>https://k-dm.work/timeseries/01_foundations/train_test_split_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/01_foundations/train_test_split_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;予測モデルの実力は、&lt;strong&gt;モデルが一度も見ていないデータ&lt;/strong&gt;で測ります。見せる部分を&lt;strong&gt;学習データ&lt;/strong&gt;、隠しておく部分を&lt;strong&gt;テストデータ&lt;/strong&gt;と呼び、時系列ではデータを&lt;strong&gt;日付順のまま&lt;/strong&gt;「前の 180 日＝学習」「後ろの 60 日＝テスト」のように区切って、シャッフルして混ぜることはしません。本番で予測するのはいつも「まだ来ていない未来」なので、テストもそれと同じ状況にしないと実力より良い点数が出てしまいます（未来のリーク）。区切りは図に点線で描いて、「どこから先を隠したか」を誰が見てもわかるようにします。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;模試の前に問題集で練習するとします。本番の問題が練習した問題とまったく同じだったら、満点でも「実力」とは言えませんよね。予測モデルも同じで、&lt;strong&gt;練習に使っていない問題で採点&lt;/strong&gt;しないと本当の力はわかりません。&lt;/p&gt;
&lt;p&gt;時系列ではもう 1 つ条件が増えます。「来月の売上を予測する」モデルの実力を測るのに、来月のデータを練習に混ぜていたらカンニングです。だから区切りは必ず&lt;strong&gt;時間の順&lt;/strong&gt;に 1 本だけ入れます。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/train_test_split.svg"
 alt="日付順の折れ線の前半 180 日が青い学習データ、後ろ 60 日が赤いテストデータとして描かれ、境目に点線と「テスト開始」の印がある"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;240 日分のうち前の 180 日が青い&lt;strong&gt;学習データ&lt;/strong&gt;、後ろの 60 日が赤い&lt;strong&gt;テストデータ&lt;/strong&gt;です。点線より右はモデルから見れば「まだ来ていない未来」。モデルは青い部分だけで作られ、赤い部分を予測し、実際の赤い線とのズレで採点されます。&lt;/p&gt;
&lt;h2 id="仕組み時間順に切って後ろを隠す"&gt;
 仕組み：時間順に切って、後ろを隠す
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e6%99%82%e9%96%93%e9%a0%86%e3%81%ab%e5%88%87%e3%81%a3%e3%81%a6%e5%be%8c%e3%82%8d%e3%82%92%e9%9a%a0%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、&lt;strong&gt;日付順に並べます&lt;/strong&gt;。時系列は順番そのものが情報なので、並べ替えやシャッフルはしません。次に&lt;strong&gt;区切りの日を決めます&lt;/strong&gt;。図では「最後の 60 日をテストにする」と決め、その境目に点線を引きました。本番で予測したい長さ（来月なら 30 日）以上をテストに取るのが目安です。それから&lt;strong&gt;青い部分だけでモデルを作ります&lt;/strong&gt;。モデルは点線の右側を一度も見ません。そのうえで&lt;strong&gt;赤い 60 日分を予測させ、実際の値と比べます&lt;/strong&gt;。ズレ（誤差）の大きさが、このモデルの「本番での実力」の見積もりになります。最後に&lt;strong&gt;区切りをずらしてくり返します&lt;/strong&gt;——区切りを 1 か月ずつ後ろに動かして同じことを何回も行うと、「たまたま簡単な期間だった」偶然を減らせます。これが時系列版の交差検証（ウォークフォワード検証）です。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="日付順に並べる -&amp;gt; 最後の 60 日を区切る（点線） -&amp;gt; 前の 180 日だけでモデルを作る -&amp;gt; 後ろの 60 日を予測して実際と比べる -&amp;gt; 区切りを 1 か月ずらしてくり返す"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;日付順に並べる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;最後の 60 日を区切る（点線）&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;前の 180 日だけでモデルを作る&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;後ろの 60 日を予測して実際と比べる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;区切りを 1 か月ずらしてくり返す&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;区切りの計算そのものは、リストを前後に切るだけです。10 日分の値から後ろ 3 日をテストに取ると、学習は 7 個、テストは 3 個になります。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;499&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;505&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;510&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;508&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;515&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;520&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;518&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;525&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 10 日分、日付順&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;n_test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;train&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n_test&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 前の 7 日 = 学習データ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;n_test&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="c1"&gt;# 後ろの 3 日 = テストデータ&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;train:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test :&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;日付順に並んでいることが前提&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;values&lt;/code&gt; の 10 個は 1 日目から 10 日目の順に並んでいます。この順番が「時間」なので、&lt;code&gt;random.shuffle(values)&lt;/code&gt; のように混ぜてから切ると、テストの 3 日の両隣が学習側に入り、下の「ランダムに分けると成績が良すぎる」が起きます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;テストの長さを先に決める&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;n_test = 3&lt;/code&gt; が「後ろ何日を隠すか」で、図の 60 日に当たります。本番で 3 日先まで予測したいなら 3 以上にします。&lt;code&gt;n_test&lt;/code&gt; を 1 にすると最後の 1 日だけで採点することになり、たまたま当たった・外れたで評価が決まってしまいます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3-4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3-4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;負のインデックスで前後に切る&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;values[:-3]&lt;/code&gt; は「最後の 3 個を除いた前の部分」で &lt;code&gt;[500, …, 515]&lt;/code&gt; の 7 個、&lt;code&gt;values[-3:]&lt;/code&gt; は「最後の 3 個」で &lt;code&gt;[520, 518, 525]&lt;/code&gt; です。2 つを合わせると元の 10 個に戻り、重なりも抜けもありません。&lt;code&gt;n_test&lt;/code&gt; を 1 か所変えれば両方がずれるので、区切りを動かして何回も試す（ウォークフォワード）ときもこの 2 行のままで済みます。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="5-6"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;5-6 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;分けた結果を目で確かめる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;train:&lt;/code&gt; と &lt;code&gt;test :&lt;/code&gt; の表示で、学習側が 7 個・テスト側が 3 個になっていることと、テスト側が時間的に後ろの値であることを確認します。実際のモデル作りでは、この &lt;code&gt;train&lt;/code&gt; だけで学習し、&lt;code&gt;test&lt;/code&gt; は予測の答え合わせにだけ使います。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>パーセント変化の推移 | 高校生向けにやさしく解説（増減率で勢いを比べる）</title><link>https://k-dm.work/timeseries/01_foundations/percent_change_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/01_foundations/percent_change_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;&lt;strong&gt;パーセント変化（増減率）&lt;strong&gt;は、「前の日からどれだけ増えたか」を前の日の値を基準にした割合（%）で表したもので、1000 人が 1050 人になれば +5 %、100 人が 120 人になれば +20 % です。元の値の大きさに関係なく比べられるので、規模の違うお店や部活のアカウントの「勢い」を同じ土俵で見られます。毎日の増減率を棒グラフにすると棒はプラスとマイナスが入り乱れますが、そこに 14 日分を平均した&lt;/strong&gt;移動平均&lt;/strong&gt;の線を重ねると、ちらつきが消えて「勢いの向き」が読めます。棒が極端に長い日は、キャンペーンやニュースのようなイベントが起きた合図です。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;野球部の SNS アカウントは 1 日でフォロワーが 1000 人から 1050 人に、文芸部は 100 人から 120 人に増えました。増えた人数は野球部が 50 人、文芸部が 20 人。でも「勢いがあるのはどっち？」と聞かれたら、20 人増の文芸部と答えたくなりませんか。増え方は野球部 5 %、文芸部 20 %。この「前の日を基準にした割合」が&lt;strong&gt;パーセント変化&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;これを毎日計算して並べたのが下の図です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/percent_change.svg"
 alt="横軸が日付、縦軸が変化率（%）。日ごとの増減率が 0 の線をはさんで上下に伸びる水色の棒で描かれ、その上に 14 日移動平均の赤い線が重なって勢いの向きを示している"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;水色の棒 1 本が 1 日分の増減率で、0 の線より上なら増えた日、下なら減った日。棒は毎日プラスとマイナスを行ったり来たりして、流れが読めません。そこで赤い線——14 日分の増減率を平均した&lt;strong&gt;移動平均&lt;/strong&gt;——を重ねると、線が 0 より上にいる時期は「伸びている」、下に沈む時期は「縮んでいる」とわかります。&lt;/p&gt;
&lt;h2 id="仕組み前の日を基準に割合を出す"&gt;
 仕組み：前の日を基準に割合を出す
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%89%8d%e3%81%ae%e6%97%a5%e3%82%92%e5%9f%ba%e6%ba%96%e3%81%ab%e5%89%b2%e5%90%88%e3%82%92%e5%87%ba%e3%81%99"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初にやるのは、&lt;strong&gt;前の日との差を、前の日の値で割る&lt;/strong&gt;ことです（100 → 110 なら 10 ÷ 100）。日 \(t\) の増減率は次の式になります。&lt;/p&gt;
$$
r_t = \frac{x_t - x_{t-1}}{x_{t-1}} \times 100\ (\%)
$$&lt;p&gt;次に、この計算を毎日くり返して棒グラフにします。最初の日は「前の日」がないので計算できず、棒は 2 日目から始まります。0 の線を引くと、棒が 0 より上か下かが増えたか減ったかの境目になります。そのうえで直近 14 日分の増減率の平均を線にして重ねると、日ごとのプラスとマイナスが打ち消され、ゆっくり動く「勢いの向き」だけが残ります。最後に、他の日より明らかに長い棒（たとえば他が ±3 % なのに 1 本だけ +12 %）を探します。極端な棒は、キャンペーンやニュースなど外からの出来事を疑う手がかりです。&lt;/p&gt;
&lt;div class="flow" role="img" aria-label="前の日の値を基準にする -&amp;gt; (今日 − 前日) ÷ 前日 × 100 で増減率 -&amp;gt; 毎日くり返して棒にする -&amp;gt; 0 の線を引く -&amp;gt; 14 日分の平均の線を重ねる -&amp;gt; 極端に長い棒の日を調べる"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;前の日の値を基準にする&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;(今日 − 前日) ÷ 前日 × 100 で増減率&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;毎日くり返して棒にする&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;0 の線を引く&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;14 日分の平均の線を重ねる&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;極端に長い棒の日を調べる&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;100 → 110 → 99 → 108 → 120 を増減率にすると、+10 %、−10 %、+9.1 %、+11.1 % です。次の 3 行は、この計算を隣り合う 2 日ずつに対してくり返します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;108&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;5 日分の値を日付順に並べる&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;values&lt;/code&gt; は 5 日分のフォロワー数のつもりで、順番が「時間の順」になっていることが前提です。並べ替えると「前の日」が変わって増減率の意味がなくなります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="2"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;zip で「前の日」と「今日」のペアを作る&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;values[:-1]&lt;/code&gt; は最後を除いた 4 つ（前の日の側）、&lt;code&gt;values[1:]&lt;/code&gt; は最初を除いた 4 つ（今日の側）で、&lt;code&gt;zip&lt;/code&gt; で &lt;code&gt;(100, 110)&lt;/code&gt;, &lt;code&gt;(110, 99)&lt;/code&gt;, … と隣どうしのペアにします。ペアが 4 組しかできないので、増減率も 4 つ。「最初の日は計算できない」が、ここでも自然に起きています。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;(b − a) / a が「前の日を基準にした割合」&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;(b - a) / a&lt;/code&gt; が式 \(r_t\) の分数の部分で、&lt;code&gt;* 100&lt;/code&gt; で % に、&lt;code&gt;round(…, 1)&lt;/code&gt; で小数第 1 位に丸めています。&lt;code&gt;a&lt;/code&gt; で割っているのが「前の日を基準にする」という意味で、&lt;code&gt;b&lt;/code&gt; で割ってしまうと「今日を基準にした割合」になり、110 → 99 が −10 % ではなく −11.1 % になります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;</description></item><item><title>Z スコアで異常値を見つける | 高校生向けにやさしく解説（標準偏差いくつ分？）</title><link>https://k-dm.work/timeseries/04_data_quality/anomaly_zscore_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:49 +0900</pubDate><guid>https://k-dm.work/timeseries/04_data_quality/anomaly_zscore_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;Z スコアは \(z = (x - \mu)/\sigma\)、つまり「&lt;strong&gt;平均から標準偏差いくつ分はなれているか&lt;/strong&gt;」を表す数です。異常値検出では、すべての観測値の \(z\) を計算し、&lt;strong&gt;\(|z|\) が閾値（2.5 や 3）を超えた点を「異常」として印をつけます&lt;/strong&gt;。グラフでいえば、平均の高さに中心線を引き、その上下に標準偏差 2.5 個分の帯をかぶせて、&lt;strong&gt;帯の外に飛び出した点だけが赤くなる&lt;/strong&gt;という絵です。180 日の歩数や売上のような記録から、「ふだんとちがう日」を人の目に頼らず自動で見つけられます。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;スマートウォッチで毎日の歩数を半年分記録しました。ふだんは 8,000〜12,000 歩ですが、遠足の日は 25,000 歩、熱で寝込んだ日は 1,500 歩でした。こうした「ふだんとちがう日」を自動で見つけるには、どんなルールを書けばよいでしょう。&lt;/p&gt;
&lt;p&gt;「5,000 歩以上はなれたら異常」と決めても、毎日 20,000 歩歩く部活生には通用しません。そこで**「はなれ方」を、そのデータ自身の散らばり（標準偏差）を単位にして測る**。これが Z スコアの発想です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/timeseries/anomaly_zscore.svg"
 alt="日付を横軸にした青い折れ線が 100 のまわりで周期的に上下しており、途中の 2 日だけ大きく飛び出した点が赤い丸で「異常値」として強調されている"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は 180 日分の値（青い線）です。線は 100 を中心に 90〜110 の間で波打っていますが、60 日目あたりで 125 近くまで跳ね、140 日目あたりで 80 近くまで落ちています。Z スコアを計算して \(|z| &amp;gt; 2.5\) の点だけに赤い印をつけると、&lt;strong&gt;ちょうどその 2 日だけが赤くなり、ふだんの波の山や谷は赤くなりません&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="仕組み平均の帯からの飛び出しを測る"&gt;
 仕組み：平均の帯からの飛び出しを測る
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e5%b9%b3%e5%9d%87%e3%81%ae%e5%b8%af%e3%81%8b%e3%82%89%e3%81%ae%e9%a3%9b%e3%81%b3%e5%87%ba%e3%81%97%e3%82%92%e6%b8%ac%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、全部の値の平均 \(\mu\) を求めます。グラフでは、青い線のまん中を通る水平な中心線で、図では 100 のあたりです。次に標準偏差 \(\sigma\) を求めます。青い線が中心線からふだんどれくらいはなれて上下しているか、その「ふつうの幅」です。続いて各日の Z スコア \(z = (x - \mu)/\sigma\) を計算します。中心線の上なら正、下なら負で、中心線から標準偏差 1 個分はなれると \(z = \pm 1\) です。最後に閾値を決めて判定します。\(|z| &amp;gt; 2.5\) なら異常で、グラフでは中心線の上下に \(2.5\sigma\) の帯をかぶせて、&lt;strong&gt;帯の外に出た点だけを赤く塗る&lt;/strong&gt;のと同じです。&lt;/p&gt;
$$
z_t = \frac{x_t - \mu}{\sigma}, \qquad |z_t| &gt; 2.5 \ \Rightarrow\ \text{異常}
$$&lt;div class="flow" role="img" aria-label="全部の値 -&amp;gt; 平均 μ を出す -&amp;gt; 標準偏差 σ を出す -&amp;gt; 各日の z = (x − μ)/σ -&amp;gt; |z| &amp;gt; 2.5 の日だけ赤く塗る"&gt;
 &lt;div class="flow__row"&gt;
 &lt;span class="flow__node flow__node--start"&gt;全部の値&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;平均 μ を出す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;標準偏差 σ を出す&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node"&gt;各日の z = (x − μ)/σ&lt;/span&gt;&lt;span class="flow__arrow" aria-hidden="true"&gt;→&lt;/span&gt;
 &lt;span class="flow__node flow__node--end"&gt;|z| &amp;gt; 2.5 の日だけ赤く塗る&lt;/span&gt;
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;10 個の数で同じ計算を手で追えるのが、次の短いコードです。8 番目の 125 だけが「異常」になるはずです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;102&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;103&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;125&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 平均 102.4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="c1"&gt;# 標準偏差 7.7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sd&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mean =&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sd =&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# mean = 102.4 sd = 7.7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;2.5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="c1"&gt;# [7]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;aside class="code-notes" data-code-notes&gt;
 &lt;div class="code-notes__head"&gt;
 &lt;span class="code-notes__title"&gt;コードの解説&lt;/span&gt;
 &lt;span class="code-notes__hint"&gt;番号をクリックすると、コード内の該当行がハイライトされます。&lt;/span&gt;
 &lt;/div&gt;
 &lt;ol class="code-notes__list"&gt;
&lt;li class="code-note" data-lines="1"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;1 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;異常を 1 個だけ混ぜた 10 個の値&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;9 個は 97〜103 のふだんの値で、8 番目（添字 7）の 125 だけが飛び出しています。こうして答えを知っている数で試すと、計算結果の &lt;code&gt;[7]&lt;/code&gt; が正しいかどうかを自分で確かめられます。125 を 105 に変えると \(z\) は約 2.0 に下がり、閾値 2.5 を超えなくなります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="2-3"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;2-3 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;平均と標準偏差を式のとおりに計算する&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;sum(x) / len(x)&lt;/code&gt; が平均 \(\mu\)、&lt;code&gt;(v - m) ** 2&lt;/code&gt; の平均の平方根が標準偏差 \(\sigma\) で、数学Iの定義そのままです。125 が混ざっているので平均は 100 ではなく 102.4、標準偏差は 2 程度ではなく 7.7 になっています。異常値が自分で物差しを大きくしてしまう、という落とし穴がここに出ています。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="4"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;4 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;10 個すべての z を一度に出す&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;リスト内包表記で各値から平均を引き、標準偏差で割っています。結果は「標準偏差いくつ分はなれているか」の 10 個の数で、125 は \((125 - 102.4)/7.7 \approx 2.9\)、ふだんの値は \(-0.7 \sim 0.1\) の範囲に収まります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;li class="code-note" data-lines="6"&gt;
 &lt;span class="code-note__marker" aria-hidden="true"&gt;&lt;/span&gt;
 &lt;div class="code-note__body"&gt;
 &lt;span class="code-note__meta"&gt;&lt;span class="code-note__lines"&gt;6 行目&lt;/span&gt;&lt;span class="code-note__title"&gt;閾値 2.5 を超えた添字だけを取り出す&lt;/span&gt;&lt;/span&gt;
 &lt;div class="code-note__text"&gt;&lt;code&gt;abs(v) &amp;gt; 2.5&lt;/code&gt; で絶対値を見ているので、大きすぎる値も小さすぎる値も同じ基準で拾います。閾値を 2.0 に下げても今回は &lt;code&gt;[7]&lt;/code&gt; のままですが、正規分布では約 4.6 % の日が引っかかるので、180 日なら 8 日前後がふだんの揺れなのに赤くなります。&lt;/div&gt;
 &lt;/div&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/aside&gt;

&lt;p&gt;8 番目の値 125 だけが \(z \approx 2.9\) で閾値を超え、異常と判定されます。&lt;/p&gt;</description></item><item><title>混同行列 | 高校生向けにやさしく解説（当たり外れを 4 マスに整理する）</title><link>https://k-dm.work/eval/classification/confusion-matrix/confusion-matrix_highschool/</link><pubDate>Sun, 01 Nov 2026 12:03:48 +0900</pubDate><guid>https://k-dm.work/eval/classification/confusion-matrix/confusion-matrix_highschool/</guid><description>&lt;div class="summary-box"&gt;
 &lt;strong class="summary-box__title"&gt;まとめ&lt;/strong&gt;
 &lt;div class="summary-box__content"&gt;混同行列は、分類モデルの答えを「実際 × 予測」の &lt;strong&gt;2 行 2 列の表&lt;/strong&gt;に数え上げたものです。対角線の 2 マスが当たり（真陽性 TP・真陰性 TN）、残り 2 マスが外れ（誤報の偽陽性 FP・見逃しの偽陰性 FN）で、114 人分なら 4 マスの合計は必ず 114 になります。正解率・再現率・適合率・特異度は、ぜんぶこの 4 マスの&lt;strong&gt;割り算&lt;/strong&gt;で出てきます。しきい値（判定の線）を動かすと件数が左右の列の間を移動しますが、行の合計、つまり実際の陽性・陰性の人数は変わりません。&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="こんな場面を想像してみよう"&gt;
 こんな場面を想像してみよう
 
 &lt;a class="anchor" href="#%e3%81%93%e3%82%93%e3%81%aa%e5%a0%b4%e9%9d%a2%e3%82%92%e6%83%b3%e5%83%8f%e3%81%97%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;「正解率 95% のモデルを作った」と友だちが言いました。このモデル、&lt;strong&gt;どんな間違いをしているか&lt;/strong&gt;分かるでしょうか。実は 1 つの数字からでは分かりません。見逃しばかりなのか、誤報ばかりなのか、両方少しずつなのか、95 % という数字は何も教えてくれません。それを見るための表が混同行列です。&lt;/p&gt;
&lt;p&gt;&lt;img
 src="https://k-dm.work/images/eval/confusion-matrix/binary_matrix.png"
 alt="乳がん診断データで学習したモデルの混同行列。左上 39 と右下 70 が当たり、右上 3 が誤報、左下 2 が見逃し。色が濃いマスほど件数が多い"
 
 loading="lazy" decoding="async" fetchpriority="low"&gt;&lt;/p&gt;
&lt;p&gt;上の図は 114 人分の検査データで作った混同行列です。2 つの行が&lt;strong&gt;実際&lt;/strong&gt;（上段が陰性、下段が陽性）、2 つの列が&lt;strong&gt;予測&lt;/strong&gt;（左列が陰性、右列が陽性）を表します。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: left"&gt;&lt;/th&gt;
 &lt;th style="text-align: center"&gt;予測：陰性&lt;/th&gt;
 &lt;th style="text-align: center"&gt;予測：陽性&lt;/th&gt;
 &lt;th style="text-align: center"&gt;行の合計&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：陰性&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;39（真陰性 TN）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;3（偽陽性 FP）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;42&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: left"&gt;&lt;strong&gt;実際：陽性&lt;/strong&gt;&lt;/td&gt;
 &lt;td style="text-align: center"&gt;2（偽陰性 FN）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;70（真陽性 TP）&lt;/td&gt;
 &lt;td style="text-align: center"&gt;72&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;左上から右下への&lt;strong&gt;対角線&lt;/strong&gt;（39 と 70）が当たりです。右上の 3 は「陰性なのに陽性と言った」&lt;strong&gt;誤報&lt;/strong&gt;、左下の 2 は「陽性なのに陰性と言った」&lt;strong&gt;見逃し&lt;/strong&gt;です。「正解率 95%」の中身は、対角線の 109 件 ÷ 全体の 114 件 ≒ 0.956 で、間違いは誤報 3 件と見逃し 2 件、ということが表から読めます。&lt;/p&gt;
&lt;h2 id="仕組み点を-4-つのマスに振り分ける"&gt;
 仕組み：点を 4 つのマスに振り分ける
 
 &lt;a class="anchor" href="#%e4%bb%95%e7%b5%84%e3%81%bf%e7%82%b9%e3%82%92-4-%e3%81%a4%e3%81%ae%e3%83%9e%e3%82%b9%e3%81%ab%e6%8c%af%e3%82%8a%e5%88%86%e3%81%91%e3%82%8b"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;まず、モデルは 1 人ずつに「陽性らしさ」の点数（0〜1）をつけます。数直線の上に 114 個の点が並ぶと想像してください。次に、しきい値の位置に線を引き、右なら「陽性」、左なら「陰性」と判定します。そして 1 人ずつ、実際のラベルと判定の組み合わせで 4 マスのどれか 1 つに入れていきます。全員がちょうど 1 マスに入るので、4 マスの合計は必ず全件数の 114 になります。&lt;/p&gt;
&lt;p&gt;ここで線を動かしてみます。しきい値を&lt;strong&gt;下げる&lt;/strong&gt;と「陽性」判定が増え、件数が&lt;strong&gt;左列から右列へ&lt;/strong&gt;移ります。下段では見逃し FN が真陽性 TP に変わり（うれしい）、上段では真陰性 TN が誤報 FP に変わります（うれしくない）。上段 42 人・下段 72 人という&lt;strong&gt;行の合計は変わりません&lt;/strong&gt;。実際の人数は線とは無関係だからです。&lt;/p&gt;
&lt;p&gt;最後に割り算で指標を出します。正解率は対角線 ÷ 全体 = 109/114 ≒ 0.956 です。再現率は TP ÷ 下段の合計 = 70/72 ≒ 0.972、適合率は TP ÷ 右列の合計 = 70/73 ≒ 0.959。特異度は TN ÷ 上段の合計 = 39/42 ≒ 0.929 になります。「どの行・どの列で割るか」を表で指させれば、4 つの指標の意味は忘れません。&lt;/p&gt;
&lt;h3 id="動かして見てみよう"&gt;
 動かして見てみよう
 
 &lt;a class="anchor" href="#%e5%8b%95%e3%81%8b%e3%81%97%e3%81%a6%e8%a6%8b%e3%81%a6%e3%81%bf%e3%82%88%e3%81%86"&gt;#&lt;/a&gt;
 
&lt;/h3&gt;
&lt;p&gt;下の図で「再生」を押すと、説明した手順が 1 つずつ進みます。手順ごとの説明は図の下に出ます。&lt;/p&gt;
&lt;div class="viz-container viz-container--steps" id="viz-steps-threshold-1" data-viz-type="steps" data-steps-kind="threshold" data-lang="ja"&gt;
 &lt;div class="viz-main"&gt;
 &lt;div class="viz-canvas-wrap"&gt;&lt;canvas class="viz-canvas"&gt;&lt;/canvas&gt;&lt;/div&gt;
 &lt;div class="viz-metrics"&gt;&lt;/div&gt;
 &lt;/div&gt;
 &lt;div class="viz-controls"&gt;
 &lt;div class="viz-slider-row"&gt;
 &lt;label class="viz-slider-label"&gt;&lt;/label&gt;
 &lt;input type="range" class="viz-slider" /&gt;
 &lt;span class="viz-slider-value"&gt;&lt;/span&gt;
 &lt;/div&gt;
 &lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
(function() {
 var data = {"frames":[{"caption":"閾値 0.2：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.5,"f1":0.62,"fn":0,"fp":25,"precision":0.44,"recall":1,"threshold":0.2,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.2,0,1,4,1]],"vlines":[[0.2,"0.2"]]},{"caption":"閾値 0.35：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.74,"f1":0.75,"fn":0,"fp":13,"precision":0.61,"recall":1,"threshold":0.35,"tp":20},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.35,0,1,4,1]],"vlines":[[0.35,"0.35"]]},{"caption":"閾値 0.5：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.84,"f1":0.81,"fn":3,"fp":5,"precision":0.77,"recall":0.85,"threshold":0.5,"tp":17},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.5,0,1,4,1]],"vlines":[[0.5,"0.5"]]},{"caption":"閾値 0.65：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.76,"f1":0.6,"fn":11,"fp":1,"precision":0.9,"recall":0.45,"threshold":0.65,"tp":9},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.65,0,1,4,1]],"vlines":[[0.65,"0.65"]]},{"caption":"閾値 0.8：スコアが閾値以上（右側）を陽性と予測。閾値を上げると見逃し（FN）が増え、下げると誤警報（FP）が増える。","metrics":{"accuracy":0.66,"f1":0.26,"fn":17,"fp":0,"precision":1,"recall":0.15,"threshold":0.8,"tp":3},"points":[[0.26,1,0],[0.48,1.3,0],[0.22,1.6,0],[0.39,1.15,0],[0.2,1.45,0],[0.34,1,0],[0.5,1.3,0],[0.39,1.6,0],[0.42,1.15,0],[0.36,1.45,0],[0.32,1,0],[0.74,1.3,0],[0.16,1.6,0],[0.37,1.15,0],[0.63,1.45,0],[0.19,1,0],[0.25,1.3,0],[0.31,1.6,0],[0.21,1.15,0],[0.33,1.45,0],[0.39,1,0],[0.34,1.3,0],[0.19,1.6,0],[0.51,1.15,0],[0.2,1.45,0],[0.24,1,0],[0.36,1.3,0],[0.24,1.6,0],[0.53,1.15,0],[0.07,1.45,0],[0.81,2.4,1],[0.71,2.7,1],[0.58,3,1],[0.79,2.55,1],[0.57,2.85,1],[0.65,2.4,1],[0.5,2.7,1],[0.43,3,1],[0.94,2.55,1],[0.55,2.85,1],[0.73,2.4,1],[0.92,2.7,1],[0.71,3,1],[0.48,2.55,1],[0.62,2.85,1],[0.57,2.4,1],[0.7,2.7,1],[0.57,3,1],[0.57,2.55,1],[0.64,2.85,1]],"regions":[[0.8,0,1,4,1]],"vlines":[[0.8,"0.8"]]}],"x_range":[0,1],"y_range":[0,4]};
 var id = 'viz-steps-threshold-1';
 function init() { if (window.VizCore &amp;&amp; window.VizCore.steps) window.VizCore.steps(id, data); }
 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init); else init();
})();
&lt;/script&gt;

&lt;aside class="audience-note" data-audience="highschool"&gt;
 &lt;span class="audience-note__label"&gt;高校生向け&lt;/span&gt;
 &lt;div class="audience-note__body"&gt;&lt;strong&gt;学校の数学との接点&lt;/strong&gt;：情報II「情報とデータサイエンス」の&lt;strong&gt;分類の評価指標（正解率・適合率・再現率）&lt;strong&gt;は、すべてこの表から計算します。表そのものは、中学の「データの活用」で作った&lt;/strong&gt;度数分布表&lt;/strong&gt;を 2 つの観点（実際と予測）で組み合わせた&lt;strong&gt;クロス集計表&lt;/strong&gt;です。「行で割るか、列で割るか」で意味が変わる点は、相対度数を「何を全体とみなすか」で考えるのと同じです。&lt;/div&gt;
&lt;/aside&gt;

&lt;h2 id="気をつけたいこと"&gt;
 気をつけたいこと
 
 &lt;a class="anchor" href="#%e6%b0%97%e3%82%92%e3%81%a4%e3%81%91%e3%81%9f%e3%81%84%e3%81%93%e3%81%a8"&gt;#&lt;/a&gt;
 
&lt;/h2&gt;
&lt;p&gt;最初の注意点は、&lt;strong&gt;行と列の向きはソフトによって逆&lt;/strong&gt;なことです。この本では行が実際・列が予測ですが、逆に並べる流儀もあるので、表を見たら最初に「行は何か」を確認します。二つ目は、&lt;strong&gt;件数だけでは偏りが見えない&lt;/strong&gt;ことで、陰性 1,000 人・陽性 10 人のデータでは、見逃し 5 件は「陽性の半分」なのに、表の中では小さく見えます。そこで行ごとに割合、つまり 5/10 = 50 % のように行の合計で割った値も出して読みます。三つ目は、&lt;strong&gt;多クラスでも考え方は同じ&lt;/strong&gt;で、3 クラスなら 3 行 3 列になることです。対角線が当たりで、対角線から外れたマスが「どのクラスをどのクラスと間違えたか」を教えてくれます。&lt;/p&gt;</description></item></channel></rss>