前回の
表データの把握
(2)colsummary
の結果を眺めることで、venn
により、csel
でいくつか選んで、crosstable
でクロス集計表を作成することで、
クロス集計表の作成 ──crosstable
crosstable
の基本機能は、
Twitterから収集したデータに対する例
Twitterのツイートを特定のキーワード群で検索して取得したデータであるtwitter.
に対してcrosstable
を実行し、
twitter.
は各行に日付、crosstable
で集計します。
各行「年-月-日\t時:分:秒\t発言内容」の:以下をPerlで除去
$ crosstable <( perl -pe's/:.*//' twitter.tsv )
得られた結果をターミナルからExcelにコピー&ペーストし、
![図1 crosstableでツイート収集件数を日付×時刻帯ごとに集計 図1 crosstableでツイート収集件数を日付×時刻帯ごとに集計](/assets/images/dev/serial/01/perl-hackers-hub/0069/thumb/TH800_002.png)
出力からの知見
図1から、
全列の特徴量の表示 ──colsummary
全列のさまざまな特徴量を、colsummary
です。列の特徴量として表1の各項目を色付きで出力します。
列番 | 入力表の列の番号。1始まり |
異なる値 | 入力表のその列が、 |
値の範囲 | 各出現値を |
最頻値 | 頻度 |
頻度 | 上位と下位の頻度を、 |
桁数 | 各値の文字数を0か1以上により|で区切り、 |
これらの出力項目を目で読み取ることで、
TRC書誌情報の表に対する例
次の例では、colsummary
を実行しています。
ダウンロードしたZIPファイルの解凍。次で使うT*0710.txtを生成 $ unzip TRCOpenBibData_20210710.zip 出力表の視認性のためにexpandtabを使用 $ colsummary -g3 -v9 -j -m0 T*0710.txt | expandtab -s30
実行結果は図2です。図2の出力の18行は、T*0710.
![図2 colsummaryでTSVファイルの各列の性質を把握 図2 colsummaryでTSVファイルの各列の性質を把握](/assets/images/dev/serial/01/perl-hackers-hub/0069/thumb/TH800_003.png)
複数データの重なり把握 ──venn
venn
は、venn
では出現延べ数と具体値も出力されるため、
4個のファイルに対する例
ここでは、
自作シェル関数yを作成。引数を文字ごとにばらして改行を挿入 $ function y(){ echo -n $* | perl -pe's/./$&\n/g' } cardi.はcardinalityの略。minstrとmaxstrは辞書順の先頭と末尾 $ venn <(y ABCCC) <(y AABDEFG) <(y ABBDEFG) <(y DEEEFG) cardi. file1 file2 file3 file4 minstr maxstr 2. 2 3 3 0 'A' 'B' 1. 3 0 0 0 'C' 4. 0 4 4 6 'D' 'G'
最初に自作シェル関数y
を定義します。y
は、
次のコマンドラインは、{A,B,C,C,C}
と{A,A,B,D,E,F,G}
と{A,B,B,D,E,F,G}
と{D,E,E,E,F,G}
に対応する4個のファイルfile1~4
とします)venn
に与えるかのように振る舞います。
vennのアルゴリズム
上記の例をもとに、venn
のアルゴリズムを説明します。
まず、
次に、
file1~4のそれぞれに、
最後に、
出力表から読みとれること
出力の0の出現パターンなどから、
データの値の簡便な解読
本節では、digitdemog
は、colgrep
を意味の不明な値を持つ行の抽出に使えば、
各行各桁に出現した全文字の頻度集計 ──digitdemog
ある列の文字列の出現パターンを知る場合は、digitdemog
digitdemog
の基本機能は、
以下では、csel -p11
を使うことにより、T*0710.
の11列目を取り出しています。
各文字が各行先頭から何文字目に何度出現したか。-.で追加のヒント
$ digitdemog -. <( csel -p11 T*0710.txt ) | expandtab
1 2 3 4 5 6 7 8 9
'.' 0 1. 0 0 0 0 0 0 0
'0' 0 132 0 0 7 0 0 0 0
'1' 504 308 0 7 4 0 0 0 0
'2' 753 70 0 22 3 1. 0 0 0
'3' 102 13 0 7 3 0 0 0 0
'4' 0 10 0 0 0 0 0 0 0
'5' 0 96 0 0 2 0 0 0 0
'6' 0 312 0 0 11 0 0 0 0
'7' 0 31 1. 0 3 0 0 0 0
'8' 0 101 0 0 1 0 0 0 0
'9' 1. 286 0 0 3 0 0 0 0
'c' 0 0 1323. 0 0 36. 1. 0 0
'm' 0 0 0 1323. 0 0 36. 1. 0
'×' 0 0 36. 1. 0 0 0 0 0
end 134 0 0 0 1323. 0 0 36. 1.
※各値の末尾に仮想的な文字endを伴うと見なしている
この結果から、.
)0
は、
文字列パターンの解読
上記でdigitdemog
にオプション-.
を与えたので、1.
36.
1323.
1323.
と示された3ヵ所は、'c'
と'm'
とend
)
この追加のヒントから元データをもとに謎解きをすると、T*0710.
の11列目の出現値は、
この11列目は、
指定列で正規表現検索 ──colgrep
colgrep
は、
以下では、
1列目のISBNコードが空の図書をすべて検出。cselでタイトルなどのみ表示
$ colgrep -c1 -e'^$' T*0710.txt | csel -p11,17,2
match:7 unmatch:1487 total:1494 (colgrep)
30cm ¥1800 東京2020オリンピック公式ガイドブック
30cm ¥1800 東京2020パラリンピック公式ガイドブック
21cm ¥545 現代俳句 令和3年7月号
26cm ¥8100 法令全書 令和3年5月号
30cm ¥3000 賃金事情調査 令和2年
30cm ¥4500 水産油脂統計年鑑 2020年
26cm ¥1000 法と民主主義 NO.559(2021-6)
-c1
と-e'^$'
により、^$
にマッチ
上記の結果から、
特別値を持つ行の特徴を比較でとらえる
また別の少し実用的な例で試してみます。
抽出した行全体についての性質をcolsummaryで調べる $ colgrep -c11 -e'^$' T*0710.txt | colsummary 134 line(s) read;... ※11列目が空なら10、15、16、18列目もすべて空とわかる 比較のために、上記で抽出した行以外(-~指定)を調べる $ colgrep -~ -c11 -e'^$' T*0710.txt | colsummary 1360 line(s) read;... ※比較してわかることは、すべてが空でないのは10列目のみ
ここではcolsummary
も併用しています。別の列との関係をきちんと把握するには、colgrep
にオプション-~
を与えて、
紙幅の都合で出力は省略しましたが、
このようにcolgrep
とcolsummary
を使った比較で、
まとめ
本稿は、
さて、
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現! - 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう - 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、 NFT