人見知りでも初対面のデータと仲良くなれる方法

5 min read読了の目安(約4500字

タイトルは、少しキャッチーさを狙ったものですが(?)、本記事のタイトルを真面目に書くとすれば、「分析前にデータの何を把握すればいいのか+把握する方法」と言ったところでしょうか。

本記事のスコープ

  • データ分析(特にモデリングフェーズ)の準備段階における データ理解 をターゲットとする
  • 表形式のデータをターゲットとする

Kaggleでも実務の分析でもなんでもいいのですが、データを入手したら、まずは「データ理解[1]」というプロセスを経るはずです。具体的には、以下のような作業が挙げられるでしょう。

  • データのスペックを見て、各カラムの意味を理解する
  • 要約統計量や変数の相関係数をとり、全体感を把握する

この作業は、いわゆる Data PreprocessingEDA の中の一部の作業と考えています。[2]

本記事は、この「データ理解」に関してまとめたものになります。

本記事を読むことで何ができるようになるのか

  • データ分析の準備段階における「データを理解する」ということが何なのか分かる
  • データを理解するためのプロセスが分かる

目次

  1. データを理解するとはどういうことか
  2. STEP0:前提知識の整理
  3. STEP1:カラムを理解する
  4. STEP2:レコードを理解する
  5. 【番外編】データの癖を見つけ出す
  6. おわりに
  7. 参考文献

データを理解するとはどういうことか

自身の経験則と参考書籍の内容を照らし合わせた結果、以下のように整理できると考えました。

  1. そのデータにおいて指標[3]となり得るものは何かが分かる
  2. そのデータにおいてディメンション[4]となり得るものは何かが分かる
  3. そのデータの各変数について基本統計量分布が分かる
  4. そのデータに含まれる変数間の相関が分かる
  5. そのデータにどんなクセが含まれているかが分かる(難しい

さらに、これらは以下のようにグルーピングできると考えます。

  • ■ カラムの理解(1, 2
  • ■ レコードの理解(3, 4, 5

ということで、各グループごとに解説していきます。

STEP0:前提知識の整理

以降の説明を理解するために、必要となる前提知識をここで解説します。すでにご存知の方は読み飛ばしていただいて構いません。

尺度という観点でデータ類型を整理

データは尺度という観点から、以下の4つに分類することができます。

大分類(別名) 小分類 説明
指標データ 間隔尺度データ 定義: 間隔のみに意味があるデータ(絶対的ゼロなし)
例示: 知能指数、標準偏差
比例尺度データ 定義: 間隔にも絶対的大きさにも意味があるデータ(絶対的ゼロあり)
例示: 売上、身長、体重
属性データ
(ディメンション)
名義尺度データ 定義: 一つとその他を区別することだけできるデータ
例示: 名前、住所
順序尺度データ 定義: 一つとその他を区別でき、さらに順序に意味があるデータ
例示: 大中小、松竹梅、金銀銅

指標データは、集計対象になります。(合計とか平均とかを算出するもの)属性データ集計軸になります。(「○○毎の平均」とかの○○部分)

余談ですが、原則として上記4分類なのですが、間隔尺度データのサブクラスである「日付・時刻データ」と名義尺度データのサブクラスである「地理データ」は頻出かつ重要な役割を果たすので、別枠で説明されたりもします。

STEP1:カラムを理解する

このステップは、 『分析軸を決められるようにすること』 が目的と言えるでしょう。

具体的に言うと、「○○ごとの▼▼値を集計する」という意思決定をする上で、○○と▼▼の候補をリストアップできるようにすることです。

STEP1-1:指標とディメンションに振り分け

まずは、機械的に各カラムを指標とディメンションに振り分けます。原則として、数値型変数かカテゴリカル変数かで判断できると考えます。一応、代表的なデータ型について載せておきましょう。

表:データタイプ別の指標・ディメンション振り分け方

データタイプ 振り分け結果
数値 指標
文字列 ディメンション
日付・日時 ディメンション
論理値 ディメンション

バイナリデータは本記事の対象外とします

STEP1-2:指標に手を加えてディメンションを増やせることを確認する

指標データは、新たなディメンションを生み出す種でもあります。ただし、無秩序にディメンションを増やすことは控えるべきでしょう。どんな感じで増やせそうか、選択肢が挙げられれば十分で、あとは適宜実行可否を選択すると良いと思います。

表:指標データから作られる新しいディメンション例

ケース説明 具体例
ドメイン知識から推論するケース ホテルの予約データなどから、「1人で予約=ビジネス用途」「子供連れ=ファミリー層」「2人で予約=カップル利用」などと推測
適切な粒度でグループ化する(日時・時刻) ・曜日区分を作る
・時間帯区分を作る
適切な粒度でグループ化する(年齢・性別) ・年齢を計算+性別と掛け合わせて顧客層を分類
適切な粒度でグループ化する(都道府県) ・8地方区分を作る
・寒冷地帯/温暖地帯区分を作る
・沿岸部/内陸部区分を作る
2つのデータから導く(日時・時刻) ・ホテル予約日と宿泊日の差をとり、宿泊までのリードタイムを割り出す
・予約日/宿泊日の曜日から宿泊行動区分を作る(平日予約&平日宿泊=出張かも、平日予約&休日宿泊=レジャーかも)
2つのデータから導く(都道府県) ・顧客の居住地×予約したホテルの所在地によって、
隣接区分(遠方/隣接/自県)を作る
回数を数える ・訪問回数がn回以上
・当該機能使用回数がn回以上
・商品閲覧回数がn回以上

STEP2:レコードを理解する

このステップは、 『データの数値的な特性を簡単に把握すること』 が目的と言えるでしょう。

ここに記載していることは、とてもシンプルで地味です。処理自体は仮にPythonで実装するなら、 pandas_profiling とか Sweetviz とかがだいたいやってくれます。(参考記事

STEP2-1:データボリュームの把握

  • データの行数(欠損値含む / 含まない)を把握する
  • データの列数を把握する

STEP2-2:変数の分布を把握する

  • 要約統計量を把握する
  • 可視化して分布を把握する
    • 箱ひげ図、バイオリンプロット
    • ヒストグラム

STEP2-3:変数間の相関

  • 数値変数の相関係数行列を算出
  • 相関係数をヒートマップなどで可視化

【番外編】クセのあるデータと仲良くする方法

  1. そのデータにどんなクセが含まれているかが分かる(難しい

冒頭で、上記のように述べました。特に文字列データがたくさんある場合などは、テーブル内に様々なクセが入る余地があります。あとはテーブル定義書がない場合などですかね。ここでは、参考までに簡単な事例集を載せておきます。

前提として、初見のデータに対しては1000件ぐらいはざっと目グレップした方が良いと思います。

クセの分類 クセの内容 付き合い方 備考
なんでも文字列 本来別の型にすべき値がすべて文字列として格納されている 適切にデータ変換する(INT/FLOAT/DATETIME/BOOL...
1カラムの中にいろいろ入ってる[5] 適切に分解する(DICT/ARRAY
データ仕様に関するもの 主キーだと思ったカラムが実は主キーじゃない。複合主キーなのか?そうであればどれだ?そもそもレコードを一意に特定できないのか? ディメンションの中からキーになりそうなものをピックアップして地道に重複チェック 特にテーブル定義書がない時
同じカラムでもレコードによって入っているデータが違う なんとか、正規表現を使って除外・分離を試みる データ収集スクリプトのパースミスなどで起こり得る

おわりに

今後、実装部分(サンプルデータとPythonコードとSQL)を追記したいなと思っています。

参考文献

  1. 田宮直人・西山悠太朗(2019)仕事の説明書(土日出版)出版社リンク
  2. 藤俊久仁・渡部良一(2019)データビジュアライゼーションの教科書(秀和システム)出版社リンク
  3. 石井大輔・漆畑家充・及川大智・大下健史・オング優也(2020)現場のプロが伝える前処理技術(マイナビ出版)出版社リンク
脚注
  1. データ分析の前準備を実行するシーンを想定しています ↩︎

  2. Data Preprocessing vs. Data Wrangling in Machine Learning Projects ↩︎

  3. 間隔尺度データ・比例尺度データのうち、KPIになり得るもの(例:売上高) ↩︎

  4. 名義尺度データ・順序尺度データ全般。中でも日付や地理情報は代表的。 ↩︎

  5. BigQueryなどでは構造体をサポートしていますが、ここでは、分解して格納すべきなのに文字列カラムに埋め込まれてしまっているケースを指しています。 ↩︎