サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大そうじへの備え
www.salesanalytics.co.jp
在庫管理は多くの企業にとって重要な課題です。 在庫が少なすぎれば機会損失、多すぎれば保管コストが膨らみます。 今回は、Pythonを使った数理最適化モデルを構築し、最適な在庫水準を決定する方法を解説します。 先ずは経済発注量(EOQ)モデルから始め、より複雑な確率的在庫モデル(モンテカルロシミュレーション)、そして安全在庫を考慮した多期間の在庫計画問題を扱います。 はじめに 在庫管理は、多くの企業にとって収益性と効率性を大きく左右する重要な課題です。 適切な在庫水準を維持することで、品切れによる機会損失を防ぎつつ、過剰在庫による保管コストを抑えることができます。 しかし、需要の変動、リードタイムの不確実性、複数の商品カテゴリーなど、多くの変数と制約が絡み合う複雑な問題を、直感や経験だけで最適に解決するのは困難です。 ここで数理最適化の出番です。数理最適化とは、与えられた制約条件の下で目的関
時系列データ関連のお勉強をしたときに、必ず登場する厄介な概念の1つが「定常性(Stationarity)」です。 定常性(Stationarity)は、時系列データの統計的な特性(平均、分散、自己相関など)が時間によらず一定であるという性質を指します。これは、時系列分析において重要な前提条件となる場合が多いです。 具体的には、定常性には以下のような特性があります。 平均が時間によらず一定: これはデータの「中心」が時間とともに変化しないことを意味します。つまり、ある時点での平均値が別の時点での平均値と同じであることを示します。 分散が時間によらず一定: これはデータの「ばらつき」が時間とともに変化しないことを意味します。つまり、ある時点での分散が別の時点での分散と同じであることを示します。 自己共分散(または自己相関)が時間によらず一定: これは2つの時点間の関連性がラグにのみ依存し、時間
機械学習は、データから学ぶ技術です。しかし、実際のデータは完璧ではありません。特に、データセットにおける欠損データの問題は、機械学習プロジェクトにおいて避けられない課題です。欠損データをどのように扱うかは、モデルの性能に大きな影響を与えます。 伝統的に、欠損データを扱う一般的な方法は「一変量代入法」です。この方法は、欠損値をその変数の平均値や中央値で置き換えるなど、単純明快であり、実装が容易です。しかし、これは各変数を独立して扱うため、変数間の関係を無視してしまうという欠点があります。 ここで、より洗練されたアプローチとして「多変量代入法」が登場します。 この方法は、欠損データのある変数と他の変数との関係を考慮に入れ、欠損値をより正確に推定しようと試みます。多変量代入法は、変数間の相関関係を利用して、欠損データを推測することにより、よりリアルなデータセットを作成することを目指しています。
ビジネスの世界のデータの多くは、時間軸のあるデータである時系列データです。 時系列データを手に入れたら、どのようなデータかなんとなく知りたくなります。 時系列データの多くは色々な変化をしながら推移していきます。 例えば…… 全体の水準が大きくなったと思えば、水準が急激に落ちたり 上昇トレンドがあったかと思えば、下降トレンドになったり 振幅の幅が急激に大きくなったり、小さくなったり ……などなど。 時系列データは一定ではなく、このような変化をすることも少なくありません そこで知りたくなるのが、このような変化をする時期、つまり変化点です。 変化点を検出する技術は色々とあります。 幸いにも、Pythonのライブラリーの中に時系列データの変化点を見つけるためのパッケージがいくつかあります。 今回は、「Python ruptures でサクッと時系列データの変化点を見つける方法」というお話しをします
Pandasは、データ分析にPythonを使うデータサイエンティストにとって、最もよく使われているツールの1つです。 GPU データフレームのライブラリーの1つに、pandasライクなRAPIDS cuDF(cuda based Dataframes)というものがあります。 v23.10から、cuDFはpandasアクセラレータモードを提供するようになりました。 このことによって、%load_ext cudf.pandasをjupyterノートブックに追加するだけで、Pandasを150倍速く動かすことができます。 GPUが利用可能な場合、データ操作を高速化します。GPUが利用できない場合、CPUにフォールバックし高速化の程度が弱くなります。 RAPIDSのインストール 以下から、インストールするためのコードを取得できます。 今現在(2023年11月16日現在)、pipでインストールすると
説明変数Xを主成分分析(PCA)を行い、その主成分で回帰モデルを構築するのが、主成分回帰(PCR)です。 主成分は、主成分の分散が最大になるように作成され、できるだけ元の説明変数Xのもっている情報量を保持しようとします。 この主成分は、目的変数Yとは無関係に主成分分析で算出されます。 回帰モデルを構築するという視点で考えると、できれば目的変数Yと相関の高い主成分であると嬉しいでしょう。 それを実現するのが、部分的最小2乗回帰(PLS)です。 主成分は、目的変数Yと主成分の共分散が最大になるように作成され、目的変数Yを考慮したものになります。 今回は、「Pythonによる主成分回帰(PCR)と部分的最小2乗回帰(PLS)」というお話しをします。 なぜ、PCRとPLSを使うといいのか 回帰モデルを構築するとき、マルチコという推定した係数がおかしくなる現象が起こることがあります。その原因の1つが
特徴量選択(変数選択)は、機械学習系の予測モデルなどを構築するとき、最初に行う重要なステップの1つです。 予測に寄与しない特徴量(説明変数)を取り除くことで、よりシンプルな予測モデルを構築を目指します。 色々な考え方や手法、アプローチ方法があります。 今回は、「基本となる3つの特徴選択手法とPythonでの実装」というお話しです。 基本となる3つの考え方 幾つかやり方がありますが、基本となるのは次の3つ考え方です。 フィルター法(Filter Method) ラッパー法(Wrapper Method) 埋め込み法(Embedded Method) フィルター法(Filter Method) フィルター法は最もシンプルなアプローチです。 ある基準をもとに、必要な特徴量選択(変数選択)していくからです。 最も簡単なのは、相関係数を利用した方法です。 各特徴量(説明変数)に対し目的変数との相関係
それぞれのアルゴリズムが最適な状況は異なります。以下に、いくつかの主要なアルゴリズムとそれらが最適となる状況について説明します。 近傍法 (k-Nearest Neighbors):評価値の分布が一様でなく、ユーザーやアイテム間に明確な関連性が存在する場合に有効です。 SVD (Singular Value Decomposition):データセットが大きく、スパース性(欠損値が多い)が高い場合に適しています。 NMF (Non-negative Matrix Factorization):SVDと同様。元の評価行列の全ての要素が非負(0以上)。 Slope One:スピーディーに妥当な精度の予測を行いたい場合に適しています。 Co-clustering:データセットが明確なクラスタ構造を持っているときに有効です。 推薦システム(レコメンドエンジン)を作る 流れ 取り急ぎ、以下の手順で作っ
ChatGPT は優れたプログラマーでもあります。 そのため、Pythonのプログラミングするとき、ChatGPT に質問した体験をした方も多いことでしょう。 例えば、Jupyter Lab でプログラミングをしながら、ChatGPT に質問し、みたいな感じです。 いったりきたりする手間が、ちょと不便です。 ChatGPT 機能が Jupyter Lab に追加されると便利かもしれません。 Jupyter AIです。 Jupyter AI は、Jupyter Lab にChatGPT の機能を追加するだけなく、ChatGPT 以外の生成モデル プロバイダーもサポートしています。 今回は、今現在(2023年6月26日現在)の「Jupyter Lab の AI 拡張『Jupyter AI』」の紹介を簡単にします。 ChatGPT3.5に絞って、非常に簡単に紹介します。 まだOpenAIのアカウ
Jupyter NotebookやJupyter Labといった、Notebookでデータ分析業務をする人が、ここ数年で増えてきました。 Notebook上でデータ分析をするとき、外部のCSVファイルやDBのデータテーブルなどからデータセットを取得する必要があります。 よくあるのが、Pandasを利用し取得したデータセットをデータフレームに格納するケースです。 データ規模が大きいほど、ある問題が起こります。 例えば、メモリの消費の問題です。 データフレームに格納するということは、PCなどのメモリをそれだけ消費します。 多くの場合、読み込んだ直後のデータフレームは、そのままデータ分析に使えることは少なく、何かしらの加工なり処理がなされ整えられます。 ある程度整えられたデータセットの状態で、データフレームとして格納した方が、メモリの消費量は少なくてすみます。 他には、外部DBのパフォーマンス低
データがSQL対応のDB(データベース)に格納されている場合、SQLを使いデータを取得し操作することが多いことでしょう。 Python上ではPandasやPolarを使うかもしれませんが、SQLを利用したほうが便利な場面も少なくありません。 そこで登場するのがDuckDBです。 DuckDBは、インプロセス(例えば、Python内駆動)で動作するRDBMS(リレーショナルデータベース管理システム) で、指示を送信するクライアントもそれらを読み取って処理するサーバーも必要ありません。 そこが、PostgreSQLやMySQLなどの通常のRDBMSとの大きな違いです。 また、オンライン分析処理 (OLAP) 系のRDBMSのため、データ分析に適しています。 要するに、DuckDBは「組み込み用途のOLAP系のRDBMS」ということです。 似たようなものに、SQLiteというものがありますが遅速
データを入手したとき、最初に実施するタスクの1つが、探索的データ分析 (EDA) です。 探索的データ分析 (EDA) は、データをより深く理解するプロセスにおける重要なタスクです。 データの大まかな概要を把握するためのツールがいくつかあります。例えば、Tableauです。Tableauは無料ではありません。それなりにコストがかかります。 PandasやPolarsのデータフレーム(DataFrame)を、Tableau風のユーザーインターフェイスで操作できるようにするPythonライブラリーがあります。 PyGWalkerです。 PyGWalkerは、Tableauの代替品とも言われているオープンソースであるGraphic Walkerを利用したものです。 以前、Jupyter上でPyGWalkerを使う方法について簡単に説明しました。 Tableau風にデータ操作できるPythonライ
時系列データのデータセットには、時間変数や指標変数、層別変数の他にも変数があります。時間や指標、層別などの特徴を表す変数です。「特徴量」と言ったりします。 例えば、休日かどうかを表す変数であったり、過去1周間の平均売上を表す変数であったり、顧客の属性を表す変数であったり、色々な特徴量が考えられます。 特徴量は、時系列データのデータセットにだけに存在するものではなく、通常のテーブルデータのデータセットなどにも存在します。 ただ、時系列ならではの特徴量が幾つかあります。 例えば、次の7つの特徴量です。ここでは、時系列特徴量と呼ぶことにします。他にも色々あるかもしれませんが、この7つを紹介します。 トレンド特徴量 三角関数特徴量 ドメイン固有カレンダー特徴量 ラグ特徴量 ローリング特徴量 エクスパンディング特徴量 RFM特徴量 今回は、言葉だけだとイメージが付きにくいので、それぞれ簡単に説明して
Pythonでデータ分析するとき、Jupyter Notebookを使う人は多いことでしょう。 試行錯誤の結果、ほぼ分析の流れが定型化した場合、必要の都度、Jupyter Notebook に記載されたPythonコードを頭から単に実行するケースも、まぁまぁあります。 定型化された分析業務を、データサイエンティストなどが実施する必要はありません。 そのため、Jupyter Notebookのファイルを共有し、必要な人(データサイエンティストでない人)が必要なときに、定型化された分析業務を実施する、ということも実務の世界では起こっています。 必要な人(データサイエンティストでない人)にとっての興味は分析結果であって、Pythonコードではありません。 PythonのライブラリーMercuryを使うことで、Jupyter NotebookをWebアプリ化し、グラフなどの出力のみを表示することが
需要予測などで、特定の値(予測値が1つ)だけではなく、予測値の区間や分布が手に入った方が嬉しい場合があります。 区間だけであれば、従来の推定方法(最尤法など)で求めることはできます。95%信頼区間(予測区間)などです。 もちろん、このような区間はベイズ推定でも求めることはできます。 知り得たいのが区間だけであれば、従来の推定方法だろうがベイズ推定であろうが、どちらでもいいかもしれません。 しかし、ベイズ推定の場合、区間以上の情報を得ることができます。 どのような情報かというと、分布です。 この分布から平均値や最頻値などを予測値やその区間などを求めることができます。 それだけではありません。 ベイズ推定の面白いところは、今手元にあるデータが多かろうが少なかろうが取り急ぎ分布などを計算し、新たなデータを手にしたときにその分布を更新していく、というアプローチを取ります。 更新前の分布を「事前分布
顧客別CLTV(Individual CLTV)とは、顧客の金銭的価値のことで、将来行う取引に基づいて算出されます。 個々の顧客が将来どのくらいの利益を生み出すかがわかれば、価値の高い顧客に対し、マーケティング活動などを集中できます。 顧客別CLTV(Individual CLTV)が分かれば、例えば以下の2つの分析につなげることが多いです。 離反阻止分析(チャーン分析) 出世魚分析(隠れた宝石探し) 価値の高い顧客は、離反阻止すべきですし、取引額拡大に向けて活動すべきです。 要は、短期的な収益ではなく、長期的な収益に視点を当てた活動ができるということです。 では、実際にどのようなデータで、どのようなモデルを構築すれば、CLTV(顧客生涯価値)を求めることができるのか? 今回は、「顧客別CLTV(顧客生涯価値)モデルを Python Lifetimes でサクッと作る方法を事例で学ぶ」とい
予測モデルなどを構築するとき、パイプライン化することがあります。 もちろん、探索的なデータ分析でも、パイプラインを使いながら実施することもあります。 例えば、Rなどでは伝統的に、パイプラインを使いながら探索データ分析をします。しかし、そうでなければならないというわけでもありません。 一方で予測モデルは、機械学習パイプライン化したほうが、分かりやすいですし扱いやすいです。 今回は、「予測モデルは機械学習パイプライン化しよう(Python)」ということで、PythonのScikit-learn(sklearn)を使い、パイプラインの構築の仕方について簡単に説明します。 パイプラインとは? 「パイプライン」というキーワードは、色々な分野で使われています。今回の「パイプライン」(pipeline)は、「パイプライン処理」と呼ばれるコンピュータ用語です。 パイプライン処理とは、複数の処理プログラムを
データセット手にしたら、数理モデルを作ったりする前に、通常はEDA(探索的データ分析)を実施します。 端的に言うと、データと仲良くなるための会話です。 ざっくり次のような流れになります。 データコンディションチェック(欠測値や基本統計量など) 単変量の分析(各変数の分布など) 多変量の分析(変数間の関係性など) 正直、EDA(探索的データ分析)はほぼ半分は似たような分析を実施します。 そこで、EDA(探索的データ分析)の中で似たような分析は自動化しようということで幾つかのライブラリーがあります。 今回は、「データセット手にしたら、Pythonでサクッと半自動EDA(探索的データ分析)をしよう」というお話しをします。 Rに関しては「Rでシンプル半自動EDA(探索的データ分析)」で紹介しています。 半自動EDAライブラリー 色々な半自動EDAライブラリーがあります。 今回紹介するのは、以下の3
このページを最初にブックマークしてみませんか?
『株式会社セールスアナリティクス』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く