MAGAZINE
ルーターマガジン
データチェックに便利なSQL

スクレイピング業務で一番使うのはSQL
スクレイピング業務で一番使うのは実はSQLです。プログラムを作った後にまともにデータが入っているかどうか、ゴミデータなどが混じってないかどうかを確認します。
期待通りのデータかどうかは目視でないと確認できませんが全量チェックはできません。
エクセルで開けるデータの規模であれば、フィルタをかけてデータのグループ化ができますが、エクセルで開けない規模では見落としがちです。
エクセルでできることはSQLでもできますので、やってみましょう。
サンプルとして、国税庁が公開している法人番号リストをみてみましょう。
MariaDBに取り込んだ全国の法人番号リストをサンプルに解説します。 まずは件数をみて、社会常識と照らし合わせて妥当かどうかを確認します。 500万件あるので一旦よしとします(数年前のデータなので今はもっと多いはず)。
MariaDB [to_csv_test]> select count(*) from companies;
+----------+
| count(*) |
+----------+
| 5015295 |
+----------+
まずは一行目をみます。
MariaDB [to_csv_test]> select * from companies limit 1\G
*************************** 1. row ***************************
id: 1
corporate_number: 1000012160153
process: 01
correct: 1
update_date: 2018-04-02
change_date: 2015-10-05
name: 釧路検察審査会
name_image_id:
kind: 101
prefecture_name: 北海道
city_name: 釧路市
street_number: 柏木町4-7
address_image_id:
prefecture_code: 01
city_code: 206
post_code: 0850824
address_outside:
address_outside_image_id:
close_date: 0000-00-00
close_cause:
successor_corporate_number: 0
change_cause:
assignment_date: 2015-10-05
latest: 1
en_name: Kushiro Committee for the Inquest of Prosecution
en_prefecture_name: Hokkaido
en_city_name: 4-7, Kashiwagicho, Kushiro shi
en_address_outside:
furigana: クシロケンサツシンサカイ
hihyoji: 0
created_at: 2021-05-30 13:23:15
updated_at: 2021-05-30 13:23:15
1 row in set (0.00 sec)
こういうデータが入ってるということは分かりました。次にゴミデータが入ってないかどうかを一発のSQLで確認します。
各フールドごとに上位5件と下位5件をピックアップします。一個のSQLでは表現できないので、UNION句を使って、一個の出力にまとめます。
MariaDB [to_csv_test]> (select '> corporate_number' as label , corporate_number from companies order by corporate_number limit 5) union all
-> (select '< corporate_number' as label , corporate_number from companies order by corporate_number desc limit 5) union all
-> (select '> name' as label , name from companies order by name limit 5) union all
-> (select '< name' as label , name from companies order by name desc limit 5) union all
-> (select '> prefecture_name' as label , prefecture_name from companies order by prefecture_name limit 5) union all
-> (select '< prefecture_name' as label , prefecture_name from companies order by prefecture_name desc limit 5) ;
+--------------------+----------------------------------------------+
| label | corporate_number |
+--------------------+----------------------------------------------+
| > corporate_number | 1000011000005 |
| > corporate_number | 1000012010003 |
| > corporate_number | 1000012010011 |
| > corporate_number | 1000012010028 |
| > corporate_number | 1000012010036 |
| < corporate_number | 9700150102995 |
| < corporate_number | 9700150102938 |
| < corporate_number | 9700150102847 |
| < corporate_number | 9700150102839 |
| < corporate_number | 9700150102723 |
| > name | Κmワークス株式会社 |
| > name | М’s OFFICE株式会社 |
| > name | М fоr win株式会社 |
| > name | М&М TRADING株式会社 |
| > name | МTCホールディングス合同会社 |
| < name | ?足院 |
| < name | ?山英産業有限会社 |
| < name | ?形水産有限会社 |
| < name | ?川生産森林組合 |
| < name | ?川牧野農業協同組合 |
| > prefecture_name | |
| > prefecture_name | |
| > prefecture_name | |
| > prefecture_name | |
| > prefecture_name | |
| < prefecture_name | 鹿児島県 |
| < prefecture_name | 鹿児島県 |
| < prefecture_name | 鹿児島県 |
| < prefecture_name | 鹿児島県 |
| < prefecture_name | 鹿児島県 |
+--------------------+----------------------------------------------+
はい。早速おかしなデータがみつかりました。社名欄で上位と下位で並び替えると、文字化けをしている箇所が見つかりました。必ずしも文字化けしたコードが並び替えで見つかるとは限ららないのですが、それでも見つかりやすくはなりました。
また、都道府県が入ってないレコードも存在しました。ここから先は本当に都道府県がない法人などいるのか(海外法人などはないかもしれない)というのを確認して、システム上の異常なのか、「そういうデータ」なのかを切り分けます。
シンプルですが、上位下位を眺めるだけでもそのデータ処理のミスを発見することの助けにはなります。
CONTACT
お問い合わせ・ご依頼はこちらから