Google スプレッドシートで管理されているデータのデータクレンジングを Gemini で試してみた
こんにちは。組織開発室に所属し、組織開発を担当しているてぃーびーです。
システム開発のデータベースで管理されるデータは、基本的にはデータとして活用可能な一貫性のある状態だと思います。
一方で、人事・バックオフィス・ビジネス関係者などが独自で管理している Google スプレッドシートや Excel 等で管理されているデータは、データとして一貫性があるとは限りません。もしかすると、開発関係者が管理しているデータに関しても、開発外で扱っているデータはきれいな状態とは限らないかもしれません。
そして、蓄積していた情報をいざデータ分析に活用しようとすると一貫性のある状態に修正する必要がでてきます。
実際に一貫性の無いデータを扱う機会があり、 Google スプレッドシートで管理されているデータのデータクレンジングを Gemini で試してみました。
データクレンジングについて
データクレンジングとは、不正確、不完全、または不適切なデータを見つけ出して修正し、分析や利用に適した状態にする作業のことです。一貫性のないデータはダーティーデータ、一貫性のあるデータはクリーンデータと呼ばれ、ダーティデータをクリーンデータにするのがデータクレンジングです。
- ダーティデータ (Dirty Data): 不正確、不完全、または一貫性のないデータ
- クリーンデータ (Clean Data): データクレンジングによってエラーが修正され、整理されたデータ
データクレンジングの例
今回は、 Gemini を活用して一貫性のない日付データのデータクレンジングを試してみました。
Step1 データのパターンを判別する
入力
A列のデータに関して、どのような意味のデータがありそうか種類ごとに予想してください
例
yyyy/mm/dd
yy/mm/dd
yy/mm
mm/dd
出力
データの内容を分析したところ、以下の3種類のデータフォーマットが存在すると予想されます。
* **yy/mm/dd**: 最も多い形式で、`19/1/1`や`20/1/1`のようなデータが含まれています。これは年、月、日を表す形式です。
* **yy/mm**: `24/8`のように、年と月のみで日が欠落している形式です。
* **不明な形式**: `9/1予定`のような、日付ではないテキストを含む形式です。
これらの分析結果を踏まえて、再度データ変換を行う場合は、各形式に合わせた処理が必要となります。
入力
10/1 は私目線だと mm/dd だとわかるのですが、AIのあなた目線だと yy/mm と mm/dd どちらの可能性もあるものなので上記の例だと yy/mm として解釈したということでしょうか?
出力
ご指摘の通り、`10/1`のようなデータは、人間にとっては文脈によって`mm/dd`(10月1日)だと理解できますが、AIにとっては解釈が分かれる可能性があります。
### AIが`yy/mm`と解釈した理由
提供されたデータ(`19/1/1`、`20/1/1`、`21/6/1`など)を分析すると、**スラッシュで区切られた最初の数字が2桁の年を表す**という一貫したパターンが見られました。
このパターンを元に、私の変換スクリプトでは、スラッシュが2つあるデータ (`19/1/1`) と、スラッシュが1つあるデータ (`24/8`) を区別して処理するようにしました。
そのため、`10/1`というデータが入力された場合、以下のルールが適用されます。
1. スラッシュが1つある。
2. 最初の2桁の数字は年を表すというパターンを適用する。
3. 日が省略されていると判断し、`01`を補完する。
4. **20**を年の先頭に加えて、**2010年1月1日**(`2010/01/01`)と解釈する。
***
### 人間とAIの解釈の違い
人間は、現在の年や一般的な日付の慣習といった**外部の文脈**を用いて「これは月日だ」と判断できます。
一方、AIは、提供された**データそのものに含まれるパターン**に基づいて最も可能性の高い解釈を試みます。今回の場合、`yy/mm`というパターンがデータ全体で支配的だったため、`10/1`もそのパターンに沿って解釈されました。
結論として、ご推察の通り、**提供されたデータ内の既存のパターンから、`yy/mm`という解釈が最も合理的だと判断したため**、そのように変換しました。
Step2 関数作成
変換のための Spreadsheet 関数を Gemini に作ってもらいました。
=IF(OR(REGEXMATCH(TEXT(A1,"yyyy/MM/dd"),"[^0-9/]"), (LEN(A1)-LEN(SUBSTITUTE(A1,"/","")))=0), "",
IF((LEN(A1)-LEN(SUBSTITUTE(A1,"/","")))=2, TEXT(A1,"yyyy/MM/dd"),
IF(AND((LEN(A1)-LEN(SUBSTITUTE(A1,"/","")))=1, VALUE(INDEX(SPLIT(A1,"/"),1,1))>=20),
TEXT(DATE(20 & INDEX(SPLIT(A1,"/"), 1, 1), INDEX(SPLIT(A1,"/"), 1, 2), 1), "yyyy/MM/dd"),
"")))
これによって以下に変換できました。
- yy/mm/dd: yyyy/MM/dd に変換される
- yy/mm: yyyy/MM/dd に変換される。日付は1日になる
- mm/dd: 空欄で出力する(年数の判断が自動では不可能なため手動で対応する)
- テキストを含む形式: 空欄で出力する
Step3 関数の実行
関数を実行し、変換後の一貫したデータ形式にしました。
そのうえで空欄の部分は手動で修正し、対応完了です。
予防策
なお、今回のデータ分析は単発の対応だったのですが、もし継続的にデータ分析する場合に今後入力されるデータは最初からクリーンにしたいはずです。
そのためには入力を明示的にするためにスプレッドシートのデータをテーブル形式に変換し、該当データを日付形式にするとよいでしょう。