「データサイエンスを利用した需要ベースのホテルルーム価格設定をMLOpsで実装する」

「MLOpsを用いた需要ベースのホテルルーム価格設定をデータサイエンスで実現する」

イントロダクション

COVID-19の間、ホスピタリティ産業は売上の大幅な減少を経験しました。したがって、人々がより多く旅行する中でも、顧客の獲得は課題であり続けます。我々はこの問題に対処するためにMLツールを開発し、適切な価格設定を行い、宿泊率を向上させ、ホテルの収益を増やすためのフィッティングルームを提供します。ホテルのデータセットを使用して、正しい部屋の価格を選択し、宿泊率を増加させ、ホテルの収益を増やすAIツールを構築します。

学習目標

  • ホテルの部屋の適切な価格設定の重要性。
  • データのクリーニング、データセットの変換、データの前処理。
  • ホテルの予約データを使用したマップと視覚化プロットの作成。
  • データサイエンスで使用されるホテルの予約データ分析の現実世界への応用。
  • Pythonプログラミング言語を使用したホテルの予約データ分析の実施。

この記事はデータサイエンスブログマラソンの一部として公開されました。

ホテルルーム価格データセットとは何ですか?

ホテルの予約データセットには、ホテルタイプ、成人の人数、滞在時間、特別な要件など、異なる情報源からのデータが含まれています。これらの値は、ホテルの部屋の価格予測やホテルの収益の増加に役立ちます。

ホテルルーム価格分析とは何ですか?

ホテルの部屋の価格分析では、データセットのパターンやトレンドを分析します。この情報を使用して、価格設定や運営に関する意思決定を行います。これらの要素はいくつかの要因に依存します。

  1. 季節性: 繁忙期(祝日など)において、部屋の価格は著しく上昇します。
  2. 需要: イベントの祝賀やスポーツイベントなど、需要が高まると部屋の価格も上昇します。
  3. 競争: 近くのホテルの価格がホテルの部屋の価格に大きく影響を与えます。エリア内のホテルの数が多いほど、部屋の価格は低くなります。
  4. 設備: プール、スパ、ジムなどの設備があるホテルは、これらの施設に対してより高い料金を請求します。
  5. 場所: 中心地のホテルは、郊外のホテルと比べて高い料金を請求することがあります。

適切なホテルの部屋の価格設定の重要性

部屋の価格設定は収益と利益の増加に不可欠です。適切なホテルの価格設定の重要性は以下のとおりです:

  • 収益最大化: ホテルの価格は収益の主要な鍵です。競争力のある価格設定により、ホテルは収益を増やすことができます。
  • 顧客の増加: 部屋の価格が適正な場合、より多くのゲストがホテルを予約します。これにより、宿泊率が向上します。
  • 利益最大化: ホテルは利益を増やすためにより多くの料金を請求しようとしますが、これによりゲストの数が減少します。一方、適切な価格設定により、ゲストの数を増やすことができます。

データ収集と前処理

データ収集前処理は、ホテルルーム価格分析の重要な部分です。データはホテルのウェブサイト、予約サイト、公共のデータセットから収集されます。このデータセットは、視覚化のために必要な形式に変換されます。前処理では、データセットをクリーニングして変換します。新しい変換されたデータセットは、視覚化とモデル構築に使用されます。

ツールとテクニックを使用したデータセットの視覚化

データセットを視覚化することで、洞察力を得てパターンを把握し、より良い意思決定を行うことができます。以下は、より良い視覚化を提供するためのPythonツールです。

  • Matplotlib: Matplotlibは、バー グラフや折れ線グラフなどのチャートやグラフを作成するために使用されるPythonの重要なツールです。
  • Seaborn: Seabornは、Pythonのもうひとつの視覚化ツールです。ヒートマップやバイオリンプロットなどの詳細な視覚化イメージを作成するのに役立ちます。

ホテル予約データセットを可視化するために使用される技術。

  • 箱ひげ図:このライブラリは市場セグメントと滞在期間のグラフをプロットし、顧客タイプの理解に役立ちます。
  • 棒グラフ:棒グラフを使用して、平均日別収益と月の間のグラフをプロットし、より占有率の高い月を理解するのに役立ちます。
  • カウントプロット:マーケットセグメントとデポジットタイプの間のグラフをカウントプロットでプロットし、どのセグメントのホテルがより多くのデポジットを受け取るかを理解するのに役立ちます。

データサイエンスでのホテルの部屋データ分析のユースケースと応用

ホテル予約データセットには、以下のような複数のユースケースと応用があります。

  1. 顧客の感情分析:顧客のレビューから顧客の感情分析などの機械学習技術を使用することで、マネージャーは顧客の感情を判断し、より良い体験のためにサービスを改善することができます。
  2. 宿泊率の予測:顧客のレビューや評価から、マネージャーは短期間の部屋の宿泊率を推定することができます。
  3. ビジネス運営:このデータセットは在庫を追跡するためにも使用できます。これにより、ホテルは十分な部屋と資材を持つことができます。
  4. フード・アンド・ビバレッジ:データはまた、食品や飲み物の価格設定に使用することができ、収益を最大化しながら競争力を保ちます。
  5. パフォーマンス評価:このデータセットはまた、ゲストの体験に対する個別の提案を開発するのに役立ちます。したがって、ホテルの評価を向上させます。

ホテルの部屋データ分析の課題

ホテルの部屋予約データには、さまざまな理由によりいくつかの課題があります:

  • データの品質:複数のデータセットからデータを収集しているため、データの品質が損なわれ、データの欠落、一貫性の欠如、不正確さの可能性があります。
  • データのプライバシー:ホテルは顧客からの機密データを収集しますが、これらのデータが漏洩すると顧客に脅威が及びます。そのため、データの安全なガイドラインに従うことがほぼ最優先事項となります。
  • データの統合:ホテルにはプロパティ管理や予約サイトなどの複数のシステムがあり、これらのシステムを統合することは困難です。
  • データの量:ホテルの部屋データは膨大であり、管理や分析が困難です。

ホテルの部屋データ分析のベストプラクティス

ホテルの部屋データ分析のベストプラクティス:

  • データを収集するために、プロパティ管理システム、オンライン予約プラットフォーム、ゲストフィードバックシステムを使用します。
  • データの品質を保証するため、定期的にデータを監視し、クリーニングします。
  • データのプライバシーを保護するために、セキュリティ対策を実施し、データプライバシーの規制を遵守します。
  • 異なるシステムからデータを統合して、ホテルの部屋データの完全な画像を得ます。
  • 部屋料金を予測するために、LSTMなどの機械学習技術を使用します。
  • 在庫やスタッフなどのビジネス運営を最適化するために、データ分析を使用します。
  • データ分析を使用して、より多くのゲストを引き付けるためのマーケティングキャンペーンをターゲットにします。
  • データ分析を使用して、パフォーマンスを評価し、革新的なゲスト体験を提供します。
  • データ分析の助けを借りて、管理者はより良いサービスを提供するために顧客をより良く理解することができます。

消費者の支出が増加することは、ホテルおよび観光業界に大きな利益をもたらします。これにより、顧客の支出と行動を分析するための新しいトレンドとデータを探索する機会が生まれます。AIツールの増加により、業界を最大限に活かすことができます。AIツールの助けを借りて、必要なデータを収集し、不要なデータを削除することができます、つまり、データの前処理を実行することができます。

このデータの上に、モデルをトレーニングして貴重な洞察を生成し、リアルタイムの分析を行うことができます。これにより、個々の顧客やゲストに基づいたパーソナライズされた体験を提供するのに役立ちます。これはホテルと顧客の両方に大きな利益をもたらします。

データ分析はまた、マネジメントチームが顧客と在庫を理解するのに役立ちます。これにより、需要に基づいてダイナミックな部屋料金を設定することができます。良い在庫管理はコスト削減に役立ちます。

Pythonを使用したホテルの部屋データ分析

Kaggleからのデータセットを使用して、Pythonを使った基本的なデータ分析を行いましょう。データセットをダウンロードするには、ここをクリックしてください。

データの詳細

ホステルの予約データセットには、リゾートホテルや都市ホテルなどの異なるホテルタイプや市場セグメントの情報が含まれています。

データセットの可視化

ステップ1. ライブラリのインポートとデータセットの読み込み

#ライブラリのインポートimport numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.preprocessing import LabelEncoder

ステップ2. データセットのインポートとデータの検証

#ファイルを読み込んでデータフレームに変換df = pd.read_csv('data\hotel_bookings.csv')#データフレームの形を表示df.shape(119390, 32)#データのサンプルを確認df.head()#データセットの情報を確認df.info()#欠損値を確認df.isna().sum()

出力

ステップ3. データセットの可視化

#マーケットセグメントとホテルタイプ別の滞在週間数の箱ひげ図plt.figure(figsize = (15,8))sns.boxplot(x = "market_segment", y = "stays_in_week_nights", data = df, hue = "hotel", palette = 'Set1')

出力

#マーケットセグメントと週末の滞在数の箱ひげ図plt.figure(figsize=(12,5))sns.boxplot(x = "market_segment", y = "stays_in_weekend_nights", data = df, hue = "hotel", palette = 'Set1');

出力

観察

上記のプロットから、ほとんどのグループが正規分布に従っており、一部には高い歪度があることがわかります。ほとんどの人は1週間以下滞在する傾向があります。航空セグメントの顧客はリゾートホテルに滞在しておらず、比較的低い平均滞在日数です。

#月別の平均日収の棒グラフplt.figure(figsize = (12,5))sns.barplot(x = 'arrival_date_month', y = 'adr', data = df);

出力

作業の説明

実装部分では、ZenMLパイプラインを使用して、過去の顧客データを使用して次回の注文や購入のレビュースコアを予測するモデルを作成する方法を示します。また、Streamlitアプリケーションを展示するために展開しました。

ZenMLとは

ZenMLは、本番リーディMLパイプラインの作成を効率化するオープンソースMLOpsフレームワークです。パイプラインは、出力が次のステップの入力となり、仕上がり品の作成につながる一連の相互に接続されたステップのシリーズです。以下は、ZenMLパイプラインを選択する理由です:

  • 効率的なパイプラインの作成
  • MLワークフローの標準化
  • リアルタイムデータ分析

モデルの構築だけでは不十分です。モデルを本番環境にデプロイし、時間の経過と正確な実データとの相互作用を監視する必要があります。エンドツーエンドの機械学習パイプラインは、データの準備からモデルのトレーニング、デプロイメントまで、このプロセスを通じて自動化できます。これにより、機械学習モデルの持続的な予測と自信を持って展開できます。これにより、本番対応のモデルを追跡することができます。詳細については、ZenMLのドキュメントを参照することを強くお勧めします。

最初のパイプラインは、次のステップで構成されています:

  • ingest_data: データを取り込み、データフレームを作成します。
  • clean_data: データをクリーニングし、不要な列を削除します。
  • model_train: MLflowの自動ログを使用してモデルをトレーニングし、保存します。
  • Evaluation: モデルを評価し、メトリクスをアーティファクトストアに保存します。

モデルの開発

前述の通り、異なる手順があります。今度は、コーディングの部分に焦点を当てましょう。

データの読み込み

class IngestData:    """    データパスからデータを読み込む    """    def __init__(self, data_path: str) -> None:        """        Args:            data_path: データファイルの場所のパス        """        self.data_path = data_path    def get_data(self):        """        data_pathからデータを読み込む        読み込んだデータを返す        """        logging.info(f"{self.data_path}からデータを読み込んでいます")        return pd.read_csv(self.data_path)    @stepdef ingest_df(data_path: str) -> pd.DataFrame:    """"       データパスからデータを読み込む。       Args:       data_path: データのパス       Returns:       pd.DataFrame: 読み込まれたデータ     """    try:        ingest_data = IngestData(data_path)        df = ingest_data.get_data()        return df    except Exception as e:        logging.error(f"データの読み込み中にエラーが発生しました")        raise e

上記では、ファイルパスを引数としてデータフレームを返すingest_df()メソッドを定義しています。ここで@stepはzenmlのデコレーターです。このデコレーターを使って関数をパイプラインのステップとして登録します。

データのクリーニングと処理

data["agent"].fillna(data["agent"].median(), inplace=True)data["children"].replace(np.nan, 0, inplace=True)data = data.drop(data[data['adr'] < 50].index)data = data.drop(data[data['adr'] > 5000].index)data["total_stay"] = data['stays_in_week_nights'] + data['stays_in_weekend_nights']            data["total_person"] = data["adults"] + data["children"] + data["babies"]  #特徴エンジニアリングle = LabelEncoder()data['hotel'] = le.fit_transform(data['hotel'])data['arrival_date_month'] = le.fit_transform(data['arrival_date_month'])data['meal'] = le.fit_transform(data['meal'])data['country'] = le.fit_transform(data['country'])data['market_segment'] = le.fit_transform(data['market_segment'])data['reserved_room_type'] = le.fit_transform(data['reserved_room_type'])data['assigned_room_type'] = le.fit_transform(data['assigned_room_type'])data['deposit_type'] = le.fit_transform(data['deposit_type'])data['customer_type'] = le.fit_transform(data['customer_type'])
  • 上記のコードでは、null値と外れ値を削除しています。週間滞在日数と週末滞在日数を結合し、総滞在日数を取得しています。
  • また、ホテル、国、デポジットタイプなどのカテゴリカルデータに対してラベルエンコーディングを行っています。

モデルのトレーニング

from zenml import pipeline@pipeline(enable_cache=False)def train_pipeline(data_path: str):    df = ingest_df(data_path)    X_train, X_test, y_train, y_test = clean_df(df)    model = train_model(X_train, X_test, y_train, y_test)    r2_score, rsme = evaluate_model(model, X_test, y_test)

このtrain_pipeline()メソッドを定義するためにzenmlの@pipelineデコレーターを使用します。train_pipelineメソッドはファイルパスを引数として受け取ります。データの読み込みやトレーニングセットとテストセットへのデータの分割後、train_model()メソッドが呼び出されます。このtrain_model()メソッドでは、Lightgbm、Random Forest、Xgboost、Linear_Regressionなど異なるアルゴリズムを使用してデータセットをトレーニングします。

モデルの評価

RMSE、R2スコア、およびMSEを使用して異なるアルゴリズムの評価を行います。以下のコードでは、他の評価メトリックスを使用するためにevaluate_model()メソッドを定義しています。

@step(experiment_tracker=experiment_tracker.name)def evaluate_model(model: RegressorMixin,                   X_test: pd.DataFrame,                   y_test: pd.DataFrame,                   ) -> Tuple[                       Annotated[float, "r2_score"],                       Annotated[float, "rmse"]                   ]:    """    インジェストされたデータに対してモデルを評価する。        Args:        model: RegressorMixin        x_test: pd.DataFrame        y_test: pd.DataFrame        Returns:        r2 R2スコア、        rmse RSME    """    try:        prediction = model.predict(X_test)        mse_class = MSE()        mse = mse_class.calculate_scores(y_test, prediction)        mlflow.log_metric("mse", mse)                r2_class = R2()        r2 = r2_class.calculate_scores(y_test, prediction)        mlflow.log_metric("r2", r2)        rmse_class = RMSE()        rmse = rmse_class.calculate_scores(y_test, prediction)        mlflow.log_metric("rmse", rmse)        return r2, rmse    except Exception as e:        logging.error("モデルの評価中にエラーが発生しました: {}".format(e))        raise e

環境の設定

PythonまたはAnacondaを使用して仮想環境を作成します。

#仮想環境の作成コマンドpython3 -m venv <virtual_environment_name>

以下のコマンドを使用して、環境にいくつかのPythonパッケージをインストールする必要があります。

cd zenml -project /hotel-room-bookingpip install -r requirements.txt

run_deployment.pyスクリプトを実行するには、ZenMLを使用していくつかの統合もインストールする必要があります。

zenml initzenml integration install mlflow -y

このプロジェクトでは、2つのパイプラインが作成されています

  • run_pipeline.py:モデルのトレーニングのみを行うパイプライン
  • run_deployment.py:モデルのトレーニングと連続的なデプロイも行うパイプライン

run_pipeline.pyでは、ファイルパスを引数として取り、train_pipeline()メソッドを実行します。以下はrun_pipeline()が実行する異なる操作の図解です。これはZenmlが提供するダッシュボードを使用して表示できます。

ダッシュボードのURL:http://127.0.0.1:8237/workspaces/default/pipelines/95881272-b1cc-46d6-9f73-7b967f28cbe1/runs/803ae9c5-dc35-4daa-a134-02bccb7d55fd/dag

run_deployment.py:このファイルの下で、continuous_deployment_pipelineとinference_pipelineを実行します。

continuous_deployment_pipeline

from pipelines.deployment_pipeline import continuous_deployment_pipeline,inference_pipelinedef main(config: str,min_accuracy:float):    mlflow_model_deployment_component = MLFlowModelDeployer.get_active_model_deployer()    deploy = config == DEPLOY or config == DEPLOY_AND_PREDICT    predict = config == PREDICT or config == DEPLOY_AND_PREDICT     if deploy:        continuous_deployment_pipeline(            data_path=str            min_accuracy=min_accuracy,            workers=3,            timeout=60        )            df = ingest_df(data_path=data_path)    X_train, X_test, y_train, y_test = clean_df(df)    model = train_model(X_train, X_test, y_train, y_test)    r2_score, rmse = evaluate_model(model,X_test,y_test)    deployment_decision = deployment_trigger(r2_score)    mlflow_model_deployer_step(model=model,                               deploy_decision=deployment_decision,                               workers=workers,                               timeout=timeout)

上記のコードでは、データの取り込み、分割、モデルのトレーニングを行うために連続的なデプロイメントパイプラインが作成されます。モデルのトレーニングが完了したら、評価が行われます。

inference_pipeline

@pipeline(enable_cache=False, settings={"docker": docker_settings})def inference_pipeline(pipeline_name: str, pipeline_step_name: str):    # すべてのステップのアーティファクトをリンクする    batch_data = dynamic_importer()    model_deployment_service = prediction_service_loader(        pipeline_name=pipeline_name,        pipeline_step_name=pipeline_step_name,        running=False,    )    predictor(service=model_deployment_service, data=batch_data)

inference_pipelineでは、モデルがトレーニングされた後にテストデータセットで予測を行います。上記のコードでは、dynamic_importer、prediction_service_loader、およびpredictorを使用しています。それぞれのメソッドには異なる機能があります。

  • dynamic_importer:データセットを読み込み、前処理を行います。
  • prediction_service_loader:-Zenmlが提供するパラメーターであるパイプライン名とステップ名を使用してデプロイされたモデルを読み込みます。
  • Predictor:-モデルがトレーニングされた後、テストデータセット上で予測を行います。

これで、Zenmlダッシュボードを使用してパイプラインを視覚化します。

continuous_deployment_pipelineダッシュボード:

ダッシュボードのURL:http://127.0.0.1:8237/workspaces/default/pipelines/9eb06aba-d7df-43ef-a017-8cb5bb13cd89/runs/e4208fa5-48c8-4a8c-91f1-011c5e1ddbf9/dag

inference_pipelineダッシュボード:

ダッシュボード URL: -http://127.0.0.1:8237/workspaces/default/pipelines/07351bb1-6b0d-400e-aeea-551159346f0e/runs/c1ce61f8-dd12-4244-a4d6-514e5520b879/dag

最新のモデルサービスをパイプラインから非同期に使用する Streamlit アプリをデプロイしました。この Streamlit コード内で、ZenML を使用して簡単に実行できます。ローカルシステムでこの Streamlit アプリを実行するには、以下のコマンドを使用してください:

# シングルアプリをローカルで実行するためのコマンドstreamlit run streamlit_app.py

ここで完全なエンドツーエンドの実装コードを入手できます

結果

複数のアルゴリズムを試行し、各モデルのパフォーマンスを比較しました。結果は以下の通りです:

ランダムフォレストモデルが最も優れており、最も低い MSE と最も高い R^2 スコアを示しています。つまり、目標変数を予測するのに最も正確であり、目標変数の最も多くの分散を説明しています。LightGBM モデルが2番目に優れており、XGBoost モデルが続きます。リニア回帰モデルは最も悪い結果です。リニア回帰モデル

デモアプリケーション

Streamlit を使用したこのプロジェクトのライブデモアプリケーションです。製品のいくつかの入力特性を取り入れ、トレーニング済みのモデルを使用して顧客満足度を予測します。

結論

ホテルの客室予約業界もインターネットのアクセシビリティが世界のさまざまな地域で増加したことにより、急速に進化しています。それに伴い、オンラインのホテルの客室予約の需要も増えています。ホテルの経営者は、ゲストを維持し、製品とサービスを改善してより良い意思決定をする方法を知りたいと考えています。機械学習は、顧客セグメンテーション、需要予測、製品推薦、ゲスト満足度など、さまざまなビジネスにおいて重要な役割を果たしています。

よくある質問

この記事で表示されるメディアは Analytics Vidhya の所有物ではなく、著者の裁量で使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more