人見知りでも初対面のデータと仲良くなれる方法
タイトルは、少しキャッチーさを狙ったものですが(?)、本記事のタイトルを真面目に書くとすれば、「分析前にデータの何を把握すればいいのか+把握する方法」と言ったところでしょうか。
本記事のスコープ
- データ分析(特にモデリングフェーズ)の準備段階における データ理解 をターゲットとする
- 表形式のデータをターゲットとする
本記事を読むことで何ができるようになるのか
- データ分析の準備段階における「データを理解する」ということが何なのか分かる
- データを理解するためのプロセスが分かる
目次
- データを理解するとはどういうことか
- STEP0:前提知識の整理
- STEP1:カラムを理解する
- STEP2:レコードを理解する
- 【番外編】データの癖を見つけ出す
- おわりに
- 参考文献
データを理解するとはどういうことか
自身の経験則と参考書籍の内容を照らし合わせた結果、以下のように整理できると考えました。
- そのデータにおいて指標[3]となり得るものは何かが分かる
- そのデータにおいてディメンション[4]となり得るものは何かが分かる
- そのデータの各変数について基本統計量や分布が分かる
- そのデータに含まれる変数間の相関が分かる
- そのデータにどんなクセが含まれているかが分かる(難しい)
さらに、これらは以下のようにグルーピングできると考えます。
- ■ カラムの理解(1, 2)
- ■ レコードの理解(3, 4, 5)
ということで、各グループごとに解説していきます。
STEP0:前提知識の整理
以降の説明を理解するために、必要となる前提知識をここで解説します。すでにご存知の方は読み飛ばしていただいて構いません。
尺度という観点でデータ類型を整理
データは尺度という観点から、以下の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:変数間の相関
- 数値変数の相関係数行列を算出
- 相関係数をヒートマップなどで可視化
【番外編】クセのあるデータと仲良くする方法
- そのデータにどんなクセが含まれているかが分かる(難しい)
冒頭で、上記のように述べました。特に文字列データがたくさんある場合などは、テーブル内に様々なクセが入る余地があります。あとはテーブル定義書がない場合などですかね。ここでは、参考までに簡単な事例集を載せておきます。
クセの分類 | クセの内容 | 付き合い方 | 備考 |
---|---|---|---|
なんでも文字列 | 本来別の型にすべき値がすべて文字列として格納されている | 適切にデータ変換する(INT/FLOAT/DATETIME/BOOL... ) |
|
1カラムの中にいろいろ入ってる[5] | 適切に分解する(DICT/ARRAY ) |
||
データ仕様に関するもの | 主キーだと思ったカラムが実は主キーじゃない。複合主キーなのか?そうであればどれだ?そもそもレコードを一意に特定できないのか? | ディメンションの中からキーになりそうなものをピックアップして地道に重複チェック | 特にテーブル定義書がない時 |
同じカラムでもレコードによって入っているデータが違う | なんとか、正規表現を使って除外・分離を試みる | データ収集スクリプトのパースミスなどで起こり得る |
おわりに
今後、実装部分(サンプルデータとPythonコードとSQL)を追記したいなと思っています。
参考文献
- 田宮直人・西山悠太朗(2019)仕事の説明書(土日出版)出版社リンク
- 藤俊久仁・渡部良一(2019)データビジュアライゼーションの教科書(秀和システム)出版社リンク
- 石井大輔・漆畑家充・及川大智・大下健史・オング優也(2020)現場のプロが伝える前処理技術(マイナビ出版)出版社リンク
Discussion