BigQuery DataFrames を使用する
BigQuery DataFrames は、BigQuery エンジンによる Pythonic DataFrame と ML API を提供します。BigQuery DataFrames は、オープンソースのパッケージです。pip install --upgrade bigframes
を実行すると、最新バージョンをインストールできます。
BigQuery DataFrames には、次の 2 つのライブラリが用意されています。
bigframes.pandas
: 分析用の pandas 互換 API を提供します。bigframes.ml
: scikit-learn に似た ML 用の API を提供します。
必要な権限
- BigQuery DataFrames を使用するには、BigQuery ジョブユーザーと BigQuery 読み取りセッション ユーザーのロールが必要です。
- ノートブック、Python REPL、コマンドラインなどのインタラクティブ環境でエンドユーザー認証を実行する場合は、必要に応じて BigQuery DataFrames が認証を要求します。それ以外の場合は、さまざまな環境でアプリケーションのデフォルト認証情報を設定する方法をご覧ください。
- リモート関数と ML リモートモデルの使用に対しては、追加の Identity and Access Management(IAM)要件が適用されます。
-
BigQuery ノートブックで BigQuery DataFrames を使用するには、次の IAM ロールが必要です。
オプション
インストールした後は、BigQuery DataFrames を使用するロケーションとプロジェクトを指定する必要があります。ノートブックのロケーションとプロジェクトは、次の方法で定義できます。bf.options.bigquery.project
が設定されていない場合は、$GOOGLE_CLOUD_PROJECT
環境変数が使用されます。これは、BigQuery Studio と Vertex AI ノートブックを提供するノートブック ランタイムで設定されます。
データ処理のロケーション
BigQuery DataFrames はスケールすることを考慮して設計されており、BigQuery サービス上にデータと処理を保持することで実現しています。ただし、DataFrame オブジェクトや Series オブジェクトで .to_pandas()
を呼び出すと、クライアント マシンのメモリにデータを取り込むことができます。この方法を選択した場合は、クライアント マシンのメモリ制限が適用されます。
セッションの場所
BigQuery DataFrames は、メタデータの管理に内部的にローカル セッション オブジェクトを使用します。このセッションはロケーションに関連付けられます。BigQuery DataFrames は、デフォルトのロケーションとして US
マルチリージョンを使用しますが、session_options.location
を使用して別のロケーションを設定できます。セッション内の各クエリは、そのセッションが作成されたロケーションで実行されます。ユーザーが read_gbq/read_gbq_table/read_gbq_query()
で開始し、直接または SQL ステートメントでテーブルを指定すると、BigQuery DataFrames により、テーブルのロケーションが bf.options.bigquery.location
に自動的に入力されます。
作成した DataFrame オブジェクトや Series オブジェクトのロケーションをリセットする場合は、bigframes.pandas.close_session()
を実行してセッションを閉じます。その後、bigframes.pandas.options.bigquery.location
を再利用して別のロケーションを指定できます。
read_gbq()
では、クエリ対象のデータセットが US
のマルチリージョンにない場合は、ロケーションを指定する必要があります。別のロケーションからテーブルを読み取ろうとすると、NotFound
例外が発生します。
データ型
BigQuery DataFrames は、次の numpy と pandas の dtype をサポートしています。
BigQuery | BigQuery DataFrames と pandas |
---|---|
ARRAY |
pandas.ArrowDtype(pa.list_()) |
BOOL |
pandas.BooleanDtype() |
DATE |
pandas.ArrowDtype(pa.date32()) |
DATETIME |
pandas.ArrowDtype(pa.timestamp("us")) |
FLOAT64 |
pandas.Float64Dtype() |
GEOGRAPHY |
|
INT64 |
pandas.Int64Dtype() |
STRING |
pandas.StringDtype(storage="pyarrow") |
STRUCT |
pandas.ArrowDtype(pa.struct()) |
TIME |
pandas.ArrowDtype(pa.time64("us")) |
TIMESTAMP |
pandas.ArrowDtype(pa.timestamp("us", tz="UTC")) |
BigQuery DataFrames では、以下の BigQuery データ型をサポートしていません。
NUMERIC
BIGNUMERIC
INTERVAL
RANGE
JSON
他のすべての BigQuery データ型はオブジェクト型として表示されます。
部分順序モード
BigQuery DataFrames には順序モード機能が用意されています。より効率的なクエリを生成するには、ordering_mode
を partial
に設定します。
partial
順序モードと対照的に、デフォルトの strict
モードでは、すべての行に全順序を作成します。全順序では、DataFrame.iloc
プロパティを使用して行に順序ベースでアクセスできるため、BigQuery DataFrames と pandas の互換性が向上します。ただし、全順序とその順序のデフォルトのシーケンシャル インデックスの場合、列フィルタも行フィルタも、read_gbq
関数と read_gbq_table
関数にパラメータとして適用されない限り、スキャンされるバイト数は削減されません。DataFrame 内のすべての行に全順序を設定するため、BigQuery DataFrames はすべての行のハッシュを作成します。これにより、行フィルタと列フィルタが無視され、データ全体がスキャンされる可能性があります。
ordering_mode
プロパティを partial
に設定すると、BigQuery DataFrame がすべての行の全順序を生成しなくなります。部分順序モードでは、DataFrame.iloc
プロパティなど、すべての行の全順序を必要とする機能も無効になります。部分順序モードでは、順序付けでシーケンシャル インデックスではなく、DefaultIndexKind
が null インデックスに設定されます。
ordering_mode
が partial
に設定された DataFrame をフィルタリングする場合、BigQuery DataFrames はシーケンシャル インデックスに欠落している行を計算する必要がないため、より高速で効率的なクエリを生成できます。BigQuery DataFrames API は、厳密な順序モードのデフォルト エクスペリエンスと同様に pandas に似ています。ただし、部分順序モードは一般的な pandas の動作とは異なります。たとえば、部分順序モードではインデックスによる暗黙的な結合は実行されません。
部分順序モードと厳密な順序モードの両方で、使用した BigQuery リソースに対して料金が発生します。ただし、部分順序モードを使用すると、クラスタ列とパーティション列の行フィルタによって処理されるバイト数が減るため、大規模なクラスタ化テーブルやパーティション分割テーブルを操作する際の費用を削減できます。
使用方法
部分順序を使用するには、次のコードサンプルに示すように、BigQuery DataFrames で他のオペレーションを実行する前に ordering_mode
を partial
に設定します。
import bigframes.pandas as bdp bpd.options.bigquery.ordering_mode = "partial"
部分順序モードにはシーケンシャル インデックスがないため、関連のない BigQuery DataFrame は暗黙的に結合されません。代わりに、DataFrame.merge
メソッドを明示的に呼び出して、異なるテーブル式から派生した 2 つの BigQuery DataFrame を結合する必要があります。
Series.unique()
機能と Series.drop_duplicates()
機能は、部分順序モードに対応していません。代わりに、groupby
メソッドを使用して、次のように一意の値を検索します。
unique_col = df.groupby(["column"], as_index=False).size().drop(columns="size")
部分順序モードでは、DataFrame.head(n)
関数と Series.head(n)
関数の出力がすべての呼び出しでべき等であるとは限りません。小さな任意のデータサンプルをダウンロードするには、DataFrame.peek()
メソッドまたは Series.peek()
メソッドを使用します。
ordering_mode = "partial"
プロパティを使用する詳細なチュートリアルについては、部分順序モードの使用方法を示す BigQuery DataFrames ノートブックをご覧ください。
トラブルシューティング
順序必須エラー
一部の機能(DataFrame.head()
関数や DataFrame.iloc
関数など)では、順序が必須です。順序が必要な機能の一覧については、サポートされている pandas API で「順序が必要」列をご覧ください。
オブジェクトに順序がない場合、オペレーションは失敗し、次のような OrderRequiredError
メッセージが表示されます。
OrderRequiredError: Op iloc requires an ordering. Use .sort_values or .sort_index
to provide an ordering.
エラー メッセージに記載されているように、DataFrame.sort_values()
メソッドを使用して順序を指定し、列または列で並べ替えることができます。DataFrame.groupby()
オペレーションなどの他のオペレーションは、グループキー全体の全順序を暗黙的に提供します。
すべての行に対する完全な安定した全順序であることが決定できない場合、後続のオペレーションで次のような AmbiguousWindowWarning
メッセージが表示されることがあります。
AmbiguousWindowWarning: Window ordering may be ambiguous, this can cause unstable
results.
ワークロードが非決定的結果に対応している場合、または指定した順序が全順序であることを手動で確認できる場合は、次の方法で AmbiguousWindowWarning
メッセージをフィルタできます。
import warnings import bigframes.exceptions warnings.simplefilter("ignore", category=bigframes.exceptions.AmbiguousWindowWarning)
null インデックス エラー
DataFrame.unstack()
プロパティや Series.interpolate()
プロパティなど、インデックスが必要な機能もあります。インデックスが必要な機能の一覧については、サポートされている pandas API で「インデックスが必要」列をご覧ください。
部分順序モードでインデックスを必要とするオペレーションを使用すると、オペレーションは次のような NullIndexError
メッセージを生成します。
NullIndexError: DataFrame cannot perform interpolate as it has no index. Set an index using
set_index.
エラー メッセージに記載されているように、DataFrame.set_index()
メソッドを使用してインデックスを指定し、列または列で並べ替えることができます。DataFrame.groupby()
オペレーションなどの他のオペレーションでは、as_index=False
パラメータが設定されていない限り、インデックスはグループキーに基づいて暗黙的に指定されます。
bigframes.pandas
ライブラリを使用する
bigframes.pandas
ライブラリは、BigQuery でデータの分析と操作に使用できる pandas
のような API を提供します。bigframes.pandas
API は、テラバイト単位の BigQuery データの処理をサポートするようにスケーラブルで、BigQuery クエリエンジンを使用して計算を実行します。bigframes.pandas
API には次の機能があります。
入力と出力
ローカル CSV ファイル、Cloud Storage ファイル、pandas
DataFrame、BigQuery モデル、BigQuery 関数など、さまざまなソースのデータにアクセスし、BigQuery DataFrames DataFrame に読み込めます。BigQuery DataFrames から BigQuery テーブルを作成することもできます。
データの操作
開発には、SQL の代わりに Python を使用できます。BigQuery データ操作はすべて Python で開発でき、言語を切り替えて SQL ステートメントをテキスト文字列としてキャプチャする必要がなくなります。bigframes.pandas
API には 750 を超える pandas
関数が用意されています。
Python エコシステムと可視化
bigframes.pandas
API は、ツールの Python エコシステム全体へのゲートウェイになります。この API は高度な統計オペレーションをサポートし、BigQuery DataFrames から生成された集計を可視化できます。また、組み込みのサンプリング オペレーションを使用して、BigQuery DataFrames の DataFrame から pandas
DataFrame に切り替えることもできます。
カスタム Python 関数
BigQuery DataFrames を使用すると、カスタム スカラー関数を BigQuery リモート関数に変換できます。BigQuery DataFrames でリモート関数を作成すると、次のものが作成されます。
BigQuery 接続。デフォルトでは、
bigframes-default-connection
という名前の接続が使用されます。必要に応じて、事前構成済みの BigQuery 接続も使用できます。この場合、接続の作成はスキップされます。デフォルト接続のサービス アカウントには、Cloud Run 起動元(
roles/run.invoker
)の IAM ロールが付与されます。BigQuery 接続(2)を使用して Cloud Functions の関数(1)を使用する BigQuery リモート関数。
例については、リモート関数を作成するをご覧ください。
BigQuery 接続は、BigQuery DataFrames セッションと同じロケーションに、カスタム関数定義で指定した名前を使用して作成されます。接続を表示して管理するには、次の手順を行います。
Google Cloud コンソールで BigQuery に移動します。
リモート関数を作成したプロジェクトを選択します。
[エクスプローラ] ペインで、そのプロジェクトを開き、[外部接続] を開きます。
BigQuery リモート関数は、指定したデータセットまたは匿名データセット(非表示のデータセットの一種)に作成されます。作成時にリモート関数の名前を設定しないと、BigQuery DataFrames は bigframes
で始まるデフォルトの名前を適用します。ユーザー指定のデータセットに作成されたリモート関数を表示して管理するには、次の操作を行います。
Google Cloud コンソールで BigQuery に移動します。
リモート関数を作成したプロジェクトを選択します。
[エクスプローラ] ペインで、そのプロジェクトを開き、リモート関数を作成したデータセットを開いて、[ルーティン] を開きます。
Cloud Run functions の関数を表示して管理するには、[関数] ページで、プロジェクト ピッカーを使用して、関数を作成したプロジェクトを選択します。簡単に識別できるように、BigQuery DataFrames で作成される関数名の先頭には bigframes
が付加されます。
名前のない BigQuery リモート関数とそれに関連する Cloud Run functions の関数は、次の方法でクリーンアップできます。
- BigQuery DataFrames の
session
の場合は、session.close()
を使用します。 - デフォルトの BigQuery DataFrames セッションの場合は、
bigframes.pandas.close_session()
を使用します。 session_id
を使用した過去のセッションの場合は、bigframes.pandas.clean_up_by_session_id(session_id)
を使用します。
要件
BigQuery DataFrames リモート関数を使用するには、次の API を有効にする必要があります。
BigQuery API(
bigquery.googleapis.com
)BigQuery Connection API(
bigqueryconnection.googleapis.com
)Cloud Functions API(
cloudfunctions.googleapis.com
)Cloud Run Admin API(
run.googleapis.com
)Artifact Registry API(
artifactregistry.googleapis.com
)Cloud Build API(
cloudbuild.googleapis.com
)Compute Engine API(
compute.googleapis.com
)Cloud Resource Manager API(
cloudresourcemanager.googleapis.com
)この要件を回避するには、
bigframes.pandas.options.bigquery.skip_bq_connection_check
オプションをTrue
に設定します。この場合、接続(デフォルトまたは事前構成済み)は、接続の存在を確認することや、権限を検証することなく、そのまま使用されます。
BigQuery DataFrames リモート関数を使用するには、プロジェクトで次の IAM ロールを付与する必要があります。
BigQuery データ編集者(
roles/bigquery.dataEditor
)BigQuery Connection Admin(
roles/bigquery.connectionAdmin
)Cloud Functions 開発者(
roles/cloudfunctions.developer
)サービス アカウント ユーザー(
roles/iam.serviceAccountUser
)Storage オブジェクト閲覧者(
roles/storage.objectViewer
)デフォルトの BigQuery 接続を使用する場合はプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
)、事前構成済みの接続を使用する場合は参照者(roles/browser)。この要件は、bigframes.pandas.options.bigquery.skip_bq_connection_check
オプションをTrue
に設定することで回避できます。この場合、接続(デフォルトまたは事前構成)は存在チェックや権限チェックなしでそのまま使用されます。事前構成された接続を使用して接続チェックを省略する場合は、接続が正しいロケーションで作成され、そのサービス アカウントにプロジェクトの Cloud Run 起動元(roles/run.invoker
)ロールが付与されていることを確認してください。
制限事項
リモート関数を初めて作成してから、使用可能になるまでに約 90 秒かかります。
新しいセルの挿入や変数の名前変更など、ノートブックでの些細な変更によって、これらの変更がリモート関数コードに関係ない場合でもリモート関数が再作成されることがあります。
BigQuery DataFrames では、リモート関数コードに含める個人データが区別されません。リモート関数コードは不透明ボックスとしてシリアル化され、Cloud Run functions の関数としてデプロイされます。
BigQuery DataFrames によって作成された Cloud Run functions(第 2 世代)の関数、BigQuery 接続、BigQuery リモート関数は Google Cloud に保持されます。これらのリソースを保持しない場合は、適切な Cloud Run functions や BigQuery インターフェースを使用して個別に削除する必要があります。
プロジェクトには、一度に最大 1,000 個の Cloud Run 関数(第 2 世代)の関数を含めることができます。すべての上限については、Cloud Run 関数の割り当てをご覧ください。
bigframes.pandas
の例
次の例では、bigframes.pandas
の一般的な使用方法を示します。
BigQuery テーブルまたはクエリからデータを読み込む
DataFrame は、次の方法で BigQuery テーブルやクエリから作成できます。
CSV ファイルからデータを読み込む
DataFrame は、ローカル ファイルや Cloud Storage CSV ファイルから、次の方法で作成できます。
データの検査と操作
bigframes.pandas
を使用して、データの検査と計算のオペレーションを実行できます。
次のコードサンプルでは、bigframes.pandas
を使用することで、body_mass_g
列を検査し、平均 body_mass
を計算して、species
ごとの平均 body_mass
を計算します。
bigframes.ml
ライブラリを使用する
BigQuery DataFrames の ML 機能を使用すると、データを前処理してから、そのデータでモデルをトレーニングできます。また、これらのアクションを連結してデータ パイプラインを作成することもできます。
ML のロケーション
bigframes.ml
は、BigQuery ML と同じロケーションをサポートしています。BigQuery ML モデル予測および他の ML 関数は、すべての BigQuery リージョンでサポートされています。モデル トレーニングのサポートはリージョンによって異なります。詳細については、BigQuery ML のロケーションをご覧ください。
データを前処理する
bigframes.ml.preprocessing モジュールと bigframes.ml.compose モジュールを使用して、推定ツール(モデル)で使用するデータを準備するために変換ツールを作成します。BigQuery DataFrames では、次の変換が用意されています。
bigframes.ml.preprocessing
モジュールの KBinsDiscretizer クラスを使用し、連続データを区間データにビン化します。bigframes.ml.preprocessing
モジュールの LabelEncoder クラスを使用し、ターゲット ラベルを整数値として正規化します。bigframes.ml.preprocessing
モジュールの MaxAbsScaler クラスを使用し、各特徴量を最大絶対値で[-1, 1]
の範囲にスケールします。bigframes.ml.preprocessing
モジュールの MinMaxScaler クラスを使用し、各特徴量を範囲[0, 1]
にスケーリングすることで特徴量を標準化します。bigframes.ml.preprocessing
モジュールの StandardScaler クラスを使用し、平均値を除去して、単位分散にスケーリングすることで特徴を標準化します。bigframes.ml.preprocessing
モジュールの OneHotEncoder クラスを使用し、カテゴリ値を数値形式に変換します。bigframes.ml.compose
モジュールの ColumnTransformer クラスを使用し、DataFrame 列にトランスフォーマーを適用します。
モデルをトレーニングする
BigQuery DataFrames でモデルをトレーニングする推定ツールを作成します。
クラスタ化モデル
bigframes.ml.cluster モジュールを使用して、クラスタリング モデルの推定ツールを作成します。
- KMeans クラスを使用して、K 平均法クラスタリング モデルを作成します。これらのモデルはデータのセグメンテーションに使用します。たとえば、お客様のセグメントを特定します。K 平均法は教師なし学習にあたるため、モデルのトレーニングを行う際にラベルは必要なく、トレーニングや評価用にデータの分割を行う必要もありません。
bigframes.ml.cluster
モジュールを使用して、クラスタリング モデル用の推定ツールを作成できます。
次のコードサンプルでは、データ セグメンテーション用の K 平均法クラスタリング モデルを作成するために bigframes.ml.cluster KMeans
クラスを使用する場合を示します。
分解モデル
bigframes.ml.decomposition モジュールを使用して、分解モデルの推定ツールを作成します。
- PCA クラスを使用して、主成分分析(PCA)モデルを作成します。このモデルは、主成分を計算し、その結果を使用してデータに基底変換を行うために使用します。これにより、データのバリエーションをできるだけ多く保持しながら、各データポイントを最初のいくつかの主成分にのみ射影して低次元のデータを取得することで、次元数を削減します。
モデルのアンサンブル
bigframes.ml.ensemble モジュールを使用して、アンサンブル モデルの推定ツールを作成します。
RandomForestClassifier クラスを使用して、ランダム フォレスト分類モデルを作成します。このモデルは、分類を目的とする複数の学習方法のディシジョン ツリーを構築するために使用します。
RandomForestRegressor クラスを使用して、ランダム フォレスト回帰モデルを作成します。このモデルは、回帰を目的とする複数の学習方法のディシジョン ツリーを構築するために使用します。
XGBClassifier クラスを使用して、勾配ブーストツリー分類モデルを作成します。このモデルは、分類を目的とする複数の学習方法のディシジョン ツリーを追加的に構築するために使用します。
XGBRegressor クラスを使用して、勾配ブーストツリー回帰モデルを作成します。このモデルは、回帰を目的とする複数の学習方法のディシジョン ツリーを追加的に構築するために使用します。
予測モデル
bigframes.ml.forecasting モジュールを使用して、予測モデルの推定ツールを作成します。
- ARIMAPlus クラスを使用して、時系列予測モデルを作成します。
インポートされたモデル
bigframes.ml.imported モジュールを使用して、インポートしたモデルの推定ツールを作成します。
ONNXModel クラスを使用して、Open Neural Network Exchange(ONNX)モデルをインポートします。
TensorFlowModel クラスを使用して、TensorFlow モデルをインポートします。
XGBoostModel クラスを使用して、XGBoostModel モデルをインポートします。
線形モデル
bigframes.ml.linear_model モジュールを使用して、線形モデルの推定ツールを作成します。
LinearRegression クラスを使用して、線形回帰モデルを作成します。このモデルは予測に使用します。たとえば、特定の日の商品の売上を予測します。
LogisticRegression クラスを使用して、ロジスティック回帰モデルを作成します。このモデルは、入力が
low-value
、medium-value
、high-value
のいずれであるかなど、2 つ以上の有効な値を分類するために使用します。
以下のコードサンプルでは、bigframes.ml
を使用して次のことを行います。
- BigQuery からデータを読み込む
- トレーニング データをクリーニングして準備する
bigframes.ml.LinearRegression
回帰モデルを作成して適用する
大規模言語モデル
bigframes.ml.llm モジュールを使用して、LLM の推定ツールを作成します。
GeminiTextGenerator クラスを使用して、Gemini テキスト生成モデルを作成します。このモデルは、テキスト生成タスクに使用します。
PaLM2TextGenerator クラスを使用して、PaLM2 テキスト生成モデルを作成します。このモデルは、テキスト生成タスクに使用します。
PaLM2TextEmbeddingGenerator クラスを使用して、PaLM2 テキスト エンベディング生成モデルを作成します。このモデルは、テキスト エンベディング生成タスクに使用します。
bigframes.ml.llm
モジュールを使用して、リモート大規模言語モデル(LLM)用の推定ツールを作成できます。
次のコードサンプルでは、bigframes.ml.llm
GeminiTextGenerator
クラスを使用して、コード生成用の Gemini モデルを作成します。
リモートモデル
BigQuery DataFrames ML リモートモデル(bigframes.ml.remote または bigframes.ml.llm)を使用するには、次の API を有効にする必要があります。
- BigQuery API(
bigquery.googleapis.com
) - BigQuery Connection API(
bigqueryconnection.googleapis.com
) - Vertex AI API(
aiplatform.googleapis.com
) - Cloud Resource Manager API(
cloudresourcemanager.googleapis.com
)この要件を回避するには、
bigframes.pandas.options.bigquery.skip_bq_connection_check
オプションをTrue
に設定します。この場合、接続(デフォルトまたは事前構成済み)は、接続の存在を確認することや、権限を検証することなく、そのまま使用されます。
また、プロジェクトで次の IAM ロールが付与されている必要もあります。
- BigQuery Connection Admin(
roles/bigquery.connectionAdmin
) - デフォルトの BigQuery 接続を使用する場合はプロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
)、事前構成済みの接続を使用する場合は参照者(roles/browser)。この要件は、bigframes.pandas.options.bigquery.skip_bq_connection_check
オプションをTrue
に設定することで回避できます。この場合、接続(デフォルトまたは事前構成)は存在の確認や権限の確認なしでそのまま使用されます。事前構成された接続を使用して接続チェックを省略する場合は、接続が正しいロケーションで作成され、そのサービス アカウントにプロジェクトの Vertex AI ユーザー(roles/aiplatform.user
)ロールが付与されていることを確認してください。
BigQuery DataFrames でリモートモデルを作成すると、BigQuery 接続が作成されます。デフォルトでは、bigframes-default-connection
という名前の接続が使用されます。必要に応じて、事前構成済みの BigQuery 接続も使用できます。この場合、接続の作成はスキップされます。デフォルト接続のサービス アカウントには、Vertex AI ユーザー(roles/aiplatform.user
)IAM ロールが付与されます。
パイプラインを作成する
bigframes.ml.pipeline モジュールを使用して、ML パイプラインを作成します。パイプラインを使用すると、さまざまなパラメータを設定しながら、複数の ML ステップを組み合わせてクロス検証できます。これにより、コードが簡素化され、データの前処理ステップと推定ツールを一緒にデプロイできます。
Pipeline クラスを使用して、最終的な推定ツールを含む変換のパイプラインを作成します。