readxlパッケージを使えば .xlsx
ファイルも読める、けど
カンマ区切り(CSV)とかタブ区切り(TSV)のテキストが無難。
R標準の関数ではなく readr パッケージを使う。
ファイル名は作業ディレクトリからの相対パスで指定。
readr::write_tsv(iris, "data/iris.tsv") # 書き出し
iris2 = readr::read_tsv("data/iris.tsv") # 読み込み
あれれー、エラーが出る?
Error: Cannot open file for writing:
* 'data/iris.tsv'
冷静に、現在の作業ディレクトリとその中身を確認しよう:
getwd() # GET Working Directory
fs::dir_ls(".") # List files in "." (here)
fs::dir_ls("data") # List files in "./data"
fs::dir_create("data") # Create directory
よくあるエラー集 (石川由希さん@名古屋大) を読んでおきましょう。
🔰 これまでに登場したデータを data/
以下に書き出してみよう。
🔰 それらを別の名前で読み込み直してみよう。
読み込み → 前処理 → 可視化 → 余裕でクリア、、、となるか?
2020年 → 小地域 → 年齢(5歳階級、4区分)別、男女別人口 → 宮城県
うまくすれば次のような人口ピラミッドを描けるはずのファイルだが…
初手エラー:
infile = "tblT001082C04.txt"
readr::read_csv(infile)
Error in nchar(x, keepNA = FALSE): invalid multibyte string, element 2
RStudioでテキストとして開いてみると文字化け:
KEY_CODE,HYOSYO,CITYNAME,NAME,HTKSYORI,HTKSAKI,GASSAN,T001082001,T001082002,T001082003,T001082004,T001082005,T001082006,T001082007,T001082008,T001082009,T001082010,T001082011,T001082012,T001082013,T001082014,T001082015,T001082016,T001082017,T001082018,T001082019,T001082020,T001082021,T001082022,T001082023,T001082024,T001082025,T001082026,T001082027,T001082028,T001082029,T001082030,T001082031,T001082032,T001082033,T001082034,T001082035,T001082036,T001082037,T001082038,T001082039,T001082040,T001082041,T001082042,T001082043,T001082044,T001082045,T001082046,T001082047,T001082048,T001082049,T001082050,T001082051,T001082052,T001082053,T001082054,T001082055,T001082056,T001082057,T001082058,T001082059,T001082060
,,,,,,,<91><8d><90><94><81>A<94>N<97><ee><81>u<95>s<8f>ځv<8a>܂<de>,<91><8d><90><94><82>O<81>`<82>S<8d><ce>,<91><8d><90><94><82>T<81>`<82>X<8d><ce>,<91><8d><90><94><82>P<82>O<81>`<82>P<82>S<8d><ce>,<91><8d><90><94><82>P<82>T<81>`<82>P<82>X<8d><ce>,<91><8d><90><94><82>Q<82>O<81>`<82>Q<82>S<8d><ce>,<91><8d><90><94><82>Q<82>T<81>`<82>Q<82>X<8d><ce>,<91><8d><90><94><82>R<82>O<81>`<82>R<82>S<8d><ce>,<91><8d><90><94><82>R<82>T<81>`<82>R<82>X<8d><ce>,<91><8d><90><94><82>S<82>O<81>`<82>S<82>S<8d><ce>,<91><8d><90><94><82>S<82>T<81>`<82>S<82>X<8d><ce>,<91><8d><90><94><82>T<82>O<81>`<82>T<82>S<8d><ce>,<91><8d><90><94><82>T<82>T<81>`<82>T<82>X<8d><ce>,<91><8d><90><94><82>U<82>O<81>`<82>U<82>S<8d><ce>,<91><8d><90><94><82>U<82>T<81>`<82>U<82>X<8d><ce>,<91><8d><90><94><82>V<82>O<81>`<82>V<82>S<8d><ce>,<91><8d><90><94><82>P<82>T<8d>Ζ<a2><96><9e>,<91><8d><90><94><82>P<82>T<81>`<82>U<82>S<8d><ce>,<91><8d><90><94><82>U<82>T<8d>Έȏ<e3>,<91><8d><90><94><82>V<82>T<8d>Έȏ<e3>,<92>j<82>̑<8d><90><94><81>A<94>N<97><ee><81>u<95>s<8f>ځv<8a>܂<de>,<92>j<82>O<81>`<82>S<8d><ce>,<92>j<82>T<81>`<82>X<8d><ce>,<92>j<82>P<82>O<81>`<82>P<82>S<8d><ce>,<92>j<82>P<82>T<81>`<82>P<82>X<8d><ce>,<92>j<82>Q<82>O<81>`<82>Q<82>S<8d><ce>,<92>j<82>Q<82>T<81>`<82>Q<82>X<8d><ce>,<92>j<82>R<82>O<81>`<82>R<82>S<8d><ce>,<92>j<82>R<82>T<81>`<82>R<82>X<8d><ce>,<92>j<82>S<82>O<81>`<82>S<82>S<8d><ce>,<92>j<82>S<82>T<81>`<82>S<82>X<8d><ce>,<92>j<82>T<82>O<81>`<82>T<82>S<8d><ce>,<92>j<82>T<82>T<81>`<82>T<82>X<8d><ce>,<92>j<82>U<82>O<81>`<82>U<82>S<8d><ce>,<92>j<82>U<82>T<81>`<82>U<82>X<8d><ce>,<92>j<82>V<82>O<81>`<82>V<82>S<8d><ce>,<92>j<82>P<82>T<8d>Ζ<a2><96><9e>,<92>j<82>P<82>T<81>`<82>U<82>S<8d><ce>,<92>j<82>U<82>T<8d>Έȏ<e3>,<92>j<82>V<82>T<8d>Έȏ<e3>,<8f><97><82>̑<8d><90><94><81>A<94>N<97><ee><81>u<95>s<8f>ځv<8a>܂<de>,<8f><97><82>O<81>`<82>S<8d><ce>,<8f><97><82>T<81>`<82>X<8d><ce>,<8f><97><82>P<82>O<81>`<82>P<82>S<8d><ce>,<8f><97><82>P<82>T<81>`<82>P<82>X<8d><ce>,<8f><97><82>Q<82>O<81>`<82>Q<82>S<8d><ce>,<8f><97><82>Q<82>T<81>`<82>Q<82>X<8d><ce>,<8f><97><82>R<82>O<81>`<82>R<82>S<8d><ce>,<8f><97><82>R<82>T<81>`<82>R<82>X<8d><ce>,<8f><97><82>S<82>O<81>`<82>S<82>S<8d><ce>,<8f><97><82>S<82>T<81>`<82>S<82>X<8d><ce>,<8f><97><82>T<82>O<81>`<82>T<82>S<8d><ce>,<8f><97><82>T<82>T<81>`<82>T<82>X<8d><ce>,<8f><97><82>U<82>O<81>`<82>U<82>S<8d><ce>,<8f><97><82>U<82>T<81>`<82>U<82>X<8d><ce>,<8f><97><82>V<82>O<81>`<82>V<82>S<8d><ce>,<8f><97><82>P<82>T<8d>Ζ<a2><96><9e>,<8f><97><82>P<82>T<81>`<82>U<82>S<8d><ce>,<8f><97><82>U<82>T<8d>Έȏ<e3>,<8f><97><82>V<82>T<8d>Έȏ<e3>
04101,1,<90><e5><91><e4><8e>s<90>t<8b><e6>,,0,,,311590,10231,11633,11838,15944,23772,17838,17677,19028,21113,23299,20544,18295,16702,17137,17700,33702,194212,69969,35132,150932,5350,6087,6066,8321,12579,8669,8600,9241,10232,11412,10317,9031,7893,8010,8082,17503,96295,29477,13385,160658,4881,5546,5772,7623,11193,9169,9077,9787,10881,11887,10227,9264,8809,9127,9618,16199,97917,40492,21747
041010010,2,<90><e5><91><e4><8e>s<90>t<8b><e6>,<90>t<92><ac>,0,,,649,16,15,17,23,53,62,49,40,40,40,45,33,28,38,38,48,413,143,67,307,8,10,7,10,26,30,27,21,18,14,25,16,11,15,16,25,198,60,29,342,8,5,10,13,27,32,22,19,22,26,20,17,17,23,22,23,215,83,38
041010020,2,<90><e5><91><e4><8e>s<90>t<8b><e6>,<82><a0><82><af><82>ڂ̒<ac>,0,,,741,23,18,13,26,32,55,48,42,60,51,48,47,38,55,43,54,447,209,111,365,12,10,4,15,16,22,28,19,39,27,25,16,23,24,21,26,230,89,44,376,11,8,9,11,16,33,20,23,21,24,23,31,15,31,22,28,217,120,67
メニューから “File → Reopen with Encoding…” を選択。
たいてい、古い日本語ファイルにありがちなSHIFT-JISが正解。
(もっと古いファイルならEUC-JPとかの場合もある。)
よく見ると、8列目以降の列名が2行にまたがっている:
sjis = readr::locale(encoding = "SHIFT-JIS")
readr::read_csv(infile, locale = sjis)
KEY_CODE HYOSYO CITYNAME NAME HTKSYORI HTKSAKI GASSAN T001082001 T001082002 T001082003 T001082004 T001082005 T001082006 T001082007 T001082008 T001082009 T001082010 T001082011 T001082012 T001082013 T001082014 T001082015 T001082016 T001082017 T001082018 T001082019 T001082020 T001082021 T001082022 T001082023 T001082024 T001082025 T001082026 T001082027 T001082028 T001082029 T001082030 T001082031 T001082032 T001082033 T001082034 T001082035 T001082036 T001082037 T001082038 T001082039 T001082040 T001082041 T001082042 T001082043 T001082044 T001082045 T001082046 T001082047 T001082048 T001082049 T001082050 T001082051 T001082052 T001082053 T001082054 T001082055 T001082056 T001082057 T001082058 T001082059 T001082060
1 <NA> NA <NA> <NA> NA <NA> <NA> 総数、年齢「不詳」含む 総数0〜4歳 総数5〜9歳 総数10〜14歳 総数15〜19歳 総数20〜24歳 総数25〜29歳 総数30〜34歳 総数35〜39歳 総数40〜44歳 総数45〜49歳 総数50〜54歳 総数55〜59歳 総数60〜64歳 総数65〜69歳 総数70〜74歳 総数15歳未満 総数15〜64歳 総数65歳以上 総数75歳以上 男の総数、年齢「不詳」含む 男0〜4歳 男5〜9歳 男10〜14歳 男15〜19歳 男20〜24歳 男25〜29歳 男30〜34歳 男35〜39歳 男40〜44歳 男45〜49歳 男50〜54歳 男55〜59歳 男60〜64歳 男65〜69歳 男70〜74歳 男15歳未満 男15〜64歳 男65歳以上 男75歳以上 女の総数、年齢「不詳」含む 女0〜4歳 女5〜9歳 女10〜14歳 女15〜19歳 女20〜24歳 女25〜29歳 女30〜34歳 女35〜39歳 女40〜44歳 女45〜49歳 女50〜54歳 女55〜59歳 女60〜64歳 女65〜69歳 女70〜74歳 女15歳未満 女15〜64歳 女65歳以上 女75歳以上
2 04101 1 仙台市青葉区 <NA> 0 <NA> <NA> 311590 10231 11633 11838 15944 23772 17838 17677 19028 21113 23299 20544 18295 16702 17137 17700 33702 194212 69969 35132 150932 5350 6087 6066 8321 12579 8669 8600 9241 10232 11412 10317 9031 7893 8010 8082 17503 96295 29477 13385 160658 4881 5546 5772 7623 11193 9169 9077 9787 10881 11887 10227 9264 8809 9127 9618 16199 97917 40492 21747
3 041010010 2 仙台市青葉区 青葉町 0 <NA> <NA> 649 16 15 17 23 53 62 49 40 40 40 45 33 28 38 38 48 413 143 67 307 8 10 7 10 26 30 27 21 18 14 25 16 11 15 16 25 198 60 29 342 8 5 10 13 27 32 22 19 22 26 20 17 17 23 22 23 215 83 38
4 041010020 2 仙台市青葉区 あけぼの町 0 <NA> <NA> 741 23 18 13 26 32 55 48 42 60 51 48 47 38 55 43 54 447 209 111 365 12 10 4 15 16 22 28 19 39 27 25 16 23 24 21 26 230 89 44 376 11 8 9 11 16 33 20 23 21 24 23 31 15 31 22 28 217 120 67
--
5941 04606004015 4 南三陸町 歌津字石浜 0 <NA> <NA> 295 9 7 11 6 6 12 6 18 16 19 21 36 18 30 26 27 158 110 54 146 5 5 5 3 5 8 2 6 8 10 14 16 8 11 20 15 80 51 20 149 4 2 6 3 1 4 4 12 8 9 7 20 10 19 6 12 78 59 34
5942 04606004016 4 南三陸町 歌津字田の浦 0 <NA> <NA> 144 5 2 5 3 5 7 5 7 6 5 15 12 17 14 4 12 82 50 32 66 - 1 3 1 3 4 3 4 3 2 6 5 9 9 4 4 40 22 9 78 5 1 2 2 2 3 2 3 3 3 9 7 8 5 - 8 42 28 23
5943 04606004017 4 南三陸町 歌津字草木沢 0 <NA> <NA> 457 21 16 18 16 12 13 20 18 18 41 34 28 37 46 43 55 237 165 76 234 11 6 8 10 11 5 9 10 11 22 18 15 17 19 29 25 128 81 33 223 10 10 10 6 1 8 11 8 7 19 16 13 20 27 14 30 109 84 43
5944 04606004018 4 南三陸町 歌津字伊里前 0 <NA> <NA> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
なんか数値の列のはずなのに -
という文字が混じっている。(中には X
も):
dfL = readr::read_csv(infile, locale = sjis, col_select = seq(1, 7)) |>
dplyr::slice(-1)
dfR = readr::read_csv(infile, locale = sjis, col_select = -seq(1, 7),
skip = 1L)
raw_miyagi = dplyr::bind_cols(dfL, dfR) |> print()
KEY_CODE HYOSYO CITYNAME NAME HTKSYORI HTKSAKI GASSAN 総数、年齢「不詳」含む 総数0〜4歳 総数5〜9歳 総数10〜14歳 総数15〜19歳 総数20〜24歳 総数25〜29歳 総数30〜34歳 総数35〜39歳 総数40〜44歳 総数45〜49歳 総数50〜54歳 総数55〜59歳 総数60〜64歳 総数65〜69歳 総数70〜74歳 総数15歳未満 総数15〜64歳 総数65歳以上 総数75歳以上 男の総数、年齢「不詳」含む 男0〜4歳 男5〜9歳 男10〜14歳 男15〜19歳 男20〜24歳 男25〜29歳 男30〜34歳 男35〜39歳 男40〜44歳 男45〜49歳 男50〜54歳 男55〜59歳 男60〜64歳 男65〜69歳 男70〜74歳 男15歳未満 男15〜64歳 男65歳以上 男75歳以上 女の総数、年齢「不詳」含む 女0〜4歳 女5〜9歳 女10〜14歳 女15〜19歳 女20〜24歳 女25〜29歳 女30〜34歳 女35〜39歳 女40〜44歳 女45〜49歳 女50〜54歳 女55〜59歳 女60〜64歳 女65〜69歳 女70〜74歳 女15歳未満 女15〜64歳 女65歳以上 女75歳以上
1 04101 1 仙台市青葉区 <NA> 0 <NA> <NA> 311590 10231 11633 11838 15944 23772 17838 17677 19028 21113 23299 20544 18295 16702 17137 17700 33702 194212 69969 35132 150932 5350 6087 6066 8321 12579 8669 8600 9241 10232 11412 10317 9031 7893 8010 8082 17503 96295 29477 13385 160658 4881 5546 5772 7623 11193 9169 9077 9787 10881 11887 10227 9264 8809 9127 9618 16199 97917 40492 21747
2 041010010 2 仙台市青葉区 青葉町 0 <NA> <NA> 649 16 15 17 23 53 62 49 40 40 40 45 33 28 38 38 48 413 143 67 307 8 10 7 10 26 30 27 21 18 14 25 16 11 15 16 25 198 60 29 342 8 5 10 13 27 32 22 19 22 26 20 17 17 23 22 23 215 83 38
3 041010020 2 仙台市青葉区 あけぼの町 0 <NA> <NA> 741 23 18 13 26 32 55 48 42 60 51 48 47 38 55 43 54 447 209 111 365 12 10 4 15 16 22 28 19 39 27 25 16 23 24 21 26 230 89 44 376 11 8 9 11 16 33 20 23 21 24 23 31 15 31 22 28 217 120 67
4 041010030 3 仙台市青葉区 旭ケ丘 0 <NA> <NA> 9160 279 289 272 315 766 880 771 643 633 713 561 493 436 363 358 840 6211 1671 950 4274 149 161 141 155 315 366 352 308 296 350 278 237 220 165 167 451 2877 697 365 4886 130 128 131 160 451 514 419 335 337 363 283 256 216 198 191 389 3334 974 585
--
5940 04606004015 4 南三陸町 歌津字石浜 0 <NA> <NA> 295 9 7 11 6 6 12 6 18 16 19 21 36 18 30 26 27 158 110 54 146 5 5 5 3 5 8 2 6 8 10 14 16 8 11 20 15 80 51 20 149 4 2 6 3 1 4 4 12 8 9 7 20 10 19 6 12 78 59 34
5941 04606004016 4 南三陸町 歌津字田の浦 0 <NA> <NA> 144 5 2 5 3 5 7 5 7 6 5 15 12 17 14 4 12 82 50 32 66 - 1 3 1 3 4 3 4 3 2 6 5 9 9 4 4 40 22 9 78 5 1 2 2 2 3 2 3 3 3 9 7 8 5 - 8 42 28 23
5942 04606004017 4 南三陸町 歌津字草木沢 0 <NA> <NA> 457 21 16 18 16 12 13 20 18 18 41 34 28 37 46 43 55 237 165 76 234 11 6 8 10 11 5 9 10 11 22 18 15 17 19 29 25 128 81 33 223 10 10 10 6 1 8 11 8 7 19 16 13 20 27 14 30 109 84 43
5943 04606004018 4 南三陸町 歌津字伊里前 0 <NA> <NA> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
と X
を NA
扱いこれでようやくスタート地点。。。
dfL = readr::read_csv(infile, locale = sjis, col_select = seq(1, 7)) |>
dplyr::slice(-1)
dfR = readr::read_csv(infile, locale = sjis, col_select = -seq(1, 7),
skip = 1L, na = c("-", "X"))
raw_miyagi = dplyr::bind_cols(dfL, dfR) |> print()
KEY_CODE HYOSYO CITYNAME NAME HTKSYORI HTKSAKI GASSAN 総数、年齢「不詳」含む 総数0〜4歳 総数5〜9歳 総数10〜14歳 総数15〜19歳 総数20〜24歳 総数25〜29歳 総数30〜34歳 総数35〜39歳 総数40〜44歳 総数45〜49歳 総数50〜54歳 総数55〜59歳 総数60〜64歳 総数65〜69歳 総数70〜74歳 総数15歳未満 総数15〜64歳 総数65歳以上 総数75歳以上 男の総数、年齢「不詳」含む 男0〜4歳 男5〜9歳 男10〜14歳 男15〜19歳 男20〜24歳 男25〜29歳 男30〜34歳 男35〜39歳 男40〜44歳 男45〜49歳 男50〜54歳 男55〜59歳 男60〜64歳 男65〜69歳 男70〜74歳 男15歳未満 男15〜64歳 男65歳以上 男75歳以上 女の総数、年齢「不詳」含む 女0〜4歳 女5〜9歳 女10〜14歳 女15〜19歳 女20〜24歳 女25〜29歳 女30〜34歳 女35〜39歳 女40〜44歳 女45〜49歳 女50〜54歳 女55〜59歳 女60〜64歳 女65〜69歳 女70〜74歳 女15歳未満 女15〜64歳 女65歳以上 女75歳以上
1 04101 1 仙台市青葉区 <NA> 0 <NA> <NA> 311590 10231 11633 11838 15944 23772 17838 17677 19028 21113 23299 20544 18295 16702 17137 17700 33702 194212 69969 35132 150932 5350 6087 6066 8321 12579 8669 8600 9241 10232 11412 10317 9031 7893 8010 8082 17503 96295 29477 13385 160658 4881 5546 5772 7623 11193 9169 9077 9787 10881 11887 10227 9264 8809 9127 9618 16199 97917 40492 21747
2 041010010 2 仙台市青葉区 青葉町 0 <NA> <NA> 649 16 15 17 23 53 62 49 40 40 40 45 33 28 38 38 48 413 143 67 307 8 10 7 10 26 30 27 21 18 14 25 16 11 15 16 25 198 60 29 342 8 5 10 13 27 32 22 19 22 26 20 17 17 23 22 23 215 83 38
3 041010020 2 仙台市青葉区 あけぼの町 0 <NA> <NA> 741 23 18 13 26 32 55 48 42 60 51 48 47 38 55 43 54 447 209 111 365 12 10 4 15 16 22 28 19 39 27 25 16 23 24 21 26 230 89 44 376 11 8 9 11 16 33 20 23 21 24 23 31 15 31 22 28 217 120 67
4 041010030 3 仙台市青葉区 旭ケ丘 0 <NA> <NA> 9160 279 289 272 315 766 880 771 643 633 713 561 493 436 363 358 840 6211 1671 950 4274 149 161 141 155 315 366 352 308 296 350 278 237 220 165 167 451 2877 697 365 4886 130 128 131 160 451 514 419 335 337 363 283 256 216 198 191 389 3334 974 585
--
5940 04606004015 4 南三陸町 歌津字石浜 0 <NA> <NA> 295 9 7 11 6 6 12 6 18 16 19 21 36 18 30 26 27 158 110 54 146 5 5 5 3 5 8 2 6 8 10 14 16 8 11 20 15 80 51 20 149 4 2 6 3 1 4 4 12 8 9 7 20 10 19 6 12 78 59 34
5941 04606004016 4 南三陸町 歌津字田の浦 0 <NA> <NA> 144 5 2 5 3 5 7 5 7 6 5 15 12 17 14 4 12 82 50 32 66 NA 1 3 1 3 4 3 4 3 2 6 5 9 9 4 4 40 22 9 78 5 1 2 2 2 3 2 3 3 3 9 7 8 5 NA 8 42 28 23
5942 04606004017 4 南三陸町 歌津字草木沢 0 <NA> <NA> 457 21 16 18 16 12 13 20 18 18 41 34 28 37 46 43 55 237 165 76 234 11 6 8 10 11 5 9 10 11 22 18 15 17 19 29 25 128 81 33 223 10 10 10 6 1 8 11 8 7 19 16 13 20 27 14 30 109 84 43
5943 04606004018 4 南三陸町 歌津字伊里前 0 <NA> <NA> NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
まだ罠はたくさん: 列名の頭にスペース。全角数字。変な区分。
tidy_miyagi = raw_miyagi |>
dplyr::filter(HYOSYO == 1) |>
dplyr::select(CITYNAME, matches("[男女].+[歳上]$")) |>
tidyr::pivot_longer(!CITYNAME, names_to = "category", values_to = "count") |>
dplyr::mutate(category = stringr::str_trim(category)) |>
tidyr::separate(category, c("sex", "age"), 1) |>
dplyr::mutate(age = stringi::stri_trans_nfkc(age)) |>
tidyr::separate(age, c("lower", "upper"), "〜", fill = "right") |>
dplyr::mutate(lower = readr::parse_number(lower),
upper = readr::parse_number(upper)) |>
dplyr::filter((upper - lower) < 5 | lower == 75) |>
dplyr::mutate(age = (lower + upper) / 2) |>
print()
CITYNAME sex lower upper count age
1 仙台市青葉区 男 0 4 5350 2
2 仙台市青葉区 男 5 9 6087 7
3 仙台市青葉区 男 10 14 6066 12
4 仙台市青葉区 男 15 19 8321 17
--
1245 南三陸町 女 60 64 507 62
1246 南三陸町 女 65 69 553 67
1247 南三陸町 女 70 74 450 72
1248 南三陸町 女 75 NA 1602 NA
tidy_miyagi |>
dplyr::mutate(count = ifelse(sex == "男", -1, 1) * count) |>
ggplot() +
geom_col(aes(age, count, fill = sex)) +
facet_wrap(vars(CITYNAME), nrow = 4L) +
coord_flip() + theme_minimal(base_size = 15)
Rを使ったデータ前処理を習得した✨
雑然データからでも下ごしらえして解析できるぞ!
とはいえ…
自分が一次データを作る立場なら、どう気をつけたらいいか?
総務省が2020年に発表して「全国民が見るべき」と話題になった
「統計表における機械判読可能なデータの表記方法の統一ルール」
から抜粋。
悪い形に遭遇したときに使える関数:
tidyr::separate()
, tidyr::separate_rows()
, stringr::str_split()
, stringr::str_extract()
悪い形に遭遇したときに使える関数:
tidyr::separate()
, tidyr::separate_rows()
, stringr::str_split()
, stringr::str_extract()
悪い形に遭遇したときに使える関数:
readr::parse_number()
, stringr::str_remove()
, stringr::str_replace()
悪い形に遭遇したときに使える関数:
readr::parse_number()
, stringr::str_remove()
, stringr::str_replace()
いやいや、欄外に記載するのも不規則でダメですよ。別シートか、別カラムに。
悪い形に遭遇したときに使える関数:
readr::parse_number()
, stringr::str_remove()
, stringr::str_replace()
機械にとって " A"
と "A"
は違う値。
悪い形に遭遇したときに使える関数:
stringr::str_remove()
, stringr::str_replace()
悪い形に遭遇したときに使える関数:
stringr::str_remove()
, stringr::str_replace()
悪い形に遭遇したときに使える関数:
tidyr::fill()
悪い形に遭遇したときに使える関数:
tidyr::fill()
人が見れば分かるけど、機械も同じように読んではくれない。
悪い形に遭遇したときに使える関数:
tidyr::fill()
, tidyr::separate()
, stringr::str_replace()
できれば全角・日本語も避けてすべて半角英数で。
悪い形に遭遇したときに使える関数:
stringi::stri_trans_nfkc()
もっと言うと、複数シートのファイルを作らず、それぞれ別ファイルに。
つまり、Rで前処理・可視化・解析するぞという気持ち:
🔰 総務省ルールの「修正後」にまだ残る改善点をなるべく多く列挙しよう。
表形式のファイルを閲覧・作成するソフトとしてよく普及。
しかし親切設計がユーザーに牙を剥く!
22-4
, 4-14
MARCH1
, SEPT1
🔰 CSVファイルを読み書きして恐怖を体感しよう:
gene,label
MARCH1,22-4
SEPT1,4-14
excel.csv
と名付ける✅ データ入力の心得
⬜ データ解釈の心得 (理論や手法の詳細には触れない)
どんなに素晴らしい統計処理をしようとも、データがゴミなら結論もゴミ。
e.g., 服を着たまま体重測定を10回繰り返す → どれも違う値
データの採れかたが結果に傾向をもたらしてしまう。
🔰 生物学研究における選択バイアスにはどういうものがありそう?
表に数字、裏にアルファベットが書いてあるカード。
「偶数の裏は必ずA、という法則があるか?」
これを確かめるには次の4枚のうちどれを裏返せばいいか?
認知バイアス・誤謬はほかにもいろいろある。
データ解析とは関係なく、知っておくのは悪くない。
次回 7. 統計モデリング1 でやります。
背後にあるメカニズムによっていろんな形になる。
目的や状況に応じて使い分けよう。
同じデータでも見せ方で印象・情報量が変わる。
ばらつきの度合いも加味して判断する。
「こんなことがたまたま起こる確率はすごく低いです!」
をちゃんと示す手続きが統計的仮説検定→
例えば「2つの量の大小を比較したい」だけでもいくつかある。
今回は選定には深入りせず、検定の考え方だけ触れておく。
🎲サイコロを10回振ったら9回も6の目が出たぞ。イカサマじゃないか?
🎲サイコロを12回振ったら4回も6の目が出たぞ。
これも1/6よりは高いけど、イカサマのダイスかな?
帰無仮説のもとで12回中4回以上6が出る確率: $p = 0.125 > \alpha$
帰無仮説を棄却できず。6の目の出る確率が1/6と有意に異なるとは言えない。
平たく言えば「普通のサイコロでもそんなに珍しい出目じゃない」
危険率$\alpha=0.05$の検定は、最大5%の確率で誤って帰無仮説を棄却(偽陽性)。
同様の検定を10回やると、そのうち少なくとも1つで偽陽性になる確率は
$1 - (1 - 0.05)^{10} \approx 0.40$ まで上昇。
データの荒波を泳ぎきってもどこにも「究極の真実」などありはしないのだ。 統計学はそのときその場かぎりでの「最良の結論」を導くための方便に過ぎないのだ。 —— 三中信宏「統計思考の世界」
誤: 🍦アイスの売り上げが増えるほど🍺ビールの売り上げが増える。
正: 🍦アイスも🍺ビールも気温が高いほど売れる。
誤: 警察官が多いほど犯罪が増える。
正: 犯罪が多いから警察官が多く配備される。
(x + y) が一定の幅に収まるようなペアだけを集めてしまうとか
少数の外れ値やグループ構造によって相関係数rが跳ね上がりうる。
ニコラス・ケイジの映画出演が増えるほど溺死する人が増える?
このウェブサイトにはジョークとしてこうした例が多数集められている↑
🔰 これら4つの関係性に該当する事例をそれぞれ1つ以上探してみよう。
書籍、ニュースサイト、ブログ記事などを検索し、
良くないデータ解析の例を探して改善案を挙げよう。
それぞれの例について、下記の項目を報告してください: