進化学実習 2024 牧野研 東北大学

岩嵜 航
東北大学 生命科学研究科 進化ゲノミクス分野 牧野研 特任助教
  1. 導入: データ解析の全体像。Rの基本。
  2. データの可視化。
  3. データ構造の処理1: 抽出、集約など。
  4. データ構造の処理2: 結合、変形など。
  5. データ内容の処理: 数値、文字列など。
  6. データ入力、レポート作成
  7. 統計モデリング1: 確率分布、尤度
  8. 統計モデリング2: 一般化線形モデル
  9. 発表会
2024-04-10 東北大学 理学部生物学科 進化学実習
https://heavywatal.github.io/slides/tohoku2024r/

データ解析のおおまかな流れ

  1. コンピュータ環境の整備 ✅
  2. データの取得、読み込み 👈 今回はここから
  3. 探索的データ解析
    • 前処理、加工 ✅ 完全に理解した
    • 可視化、仮説生成 ✅ 完全に理解した
    • 統計解析、仮説検証 ⬜ 次回
  4. 報告、発表 ⬜ Quarto楽しい
https://r4ds.had.co.nz/introduction.html

data.frameの読み書き

  • 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/ 以下に書き出してみよう。

🔰 それらを別の名前で読み込み直してみよう。

🔰 最終課題予告

読み込み → 前処理 → 可視化 → 余裕でクリア、、、となるか?

実演: e-Stat 国勢調査 CSV

2020年 → 小地域 → 年齢(5歳階級、4区分)別、男女別人口 → 宮城県

うまくすれば次のような人口ピラミッドを描けるはずのファイルだが…

plot of chunk estat-plot

オープンデータを入手できても簡単には読み込めない

初手エラー:

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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
 ,,,,,,,\x91\x8d\x90\x94\x81A\x94N\x97\xee\x81u\x95s\x8fځv\x8a܂\xde,\x91\x8d\x90\x94\x82O\x81`\x82S\x8d\xce,\x91\x8d\x90\x94\x82T\x81`\x82X\x8d\xce,\x91\x8d\x90\x94\x82P\x82O\x81`\x82P\x82S\x8d\xce,\x91\x8d\x90\x94\x82P\x82T\x81`\x82P\x82X\x8d\xce,\x91\x8d\x90\x94\x82Q\x82O\x81`\x82Q\x82S\x8d\xce,\x91\x8d\x90\x94\x82Q\x82T\x81`\x82Q\x82X\x8d\xce,\x91\x8d\x90\x94\x82R\x82O\x81`\x82R\x82S\x8d\xce,\x91\x8d\x90\x94\x82R\x82T\x81`\x82R\x82X\x8d\xce,\x91\x8d\x90\x94\x82S\x82O\x81`\x82S\x82S\x8d\xce,\x91\x8d\x90\x94\x82S\x82T\x81`\x82S\x82X\x8d\xce,\x91\x8d\x90\x94\x82T\x82O\x81`\x82T\x82S\x8d\xce,\x91\x8d\x90\x94\x82T\x82T\x81`\x82T\x82X\x8d\xce,\x91\x8d\x90\x94\x82U\x82O\x81`\x82U\x82S\x8d\xce,\x91\x8d\x90\x94\x82U\x82T\x81`\x82U\x82X\x8d\xce,\x91\x8d\x90\x94\x82V\x82O\x81`\x82V\x82S\x8d\xce,\x91\x8d\x90\x94\x82P\x82T\x8dΖ\xa2\x96\x9e,\x91\x8d\x90\x94\x82P\x82T\x81`\x82U\x82S\x8d\xce,\x91\x8d\x90\x94\x82U\x82T\x8dΈȏ\xe3,\x91\x8d\x90\x94\x82V\x82T\x8dΈȏ\xe3,\x92j\x82̑\x8d\x90\x94\x81A\x94N\x97\xee\x81u\x95s\x8fځv\x8a܂\xde,\x92j\x82O\x81`\x82S\x8d\xce,\x92j\x82T\x81`\x82X\x8d\xce,\x92j\x82P\x82O\x81`\x82P\x82S\x8d\xce,\x92j\x82P\x82T\x81`\x82P\x82X\x8d\xce,\x92j\x82Q\x82O\x81`\x82Q\x82S\x8d\xce,\x92j\x82Q\x82T\x81`\x82Q\x82X\x8d\xce,\x92j\x82R\x82O\x81`\x82R\x82S\x8d\xce,\x92j\x82R\x82T\x81`\x82R\x82X\x8d\xce,\x92j\x82S\x82O\x81`\x82S\x82S\x8d\xce,\x92j\x82S\x82T\x81`\x82S\x82X\x8d\xce,\x92j\x82T\x82O\x81`\x82T\x82S\x8d\xce,\x92j\x82T\x82T\x81`\x82T\x82X\x8d\xce,\x92j\x82U\x82O\x81`\x82U\x82S\x8d\xce,\x92j\x82U\x82T\x81`\x82U\x82X\x8d\xce,\x92j\x82V\x82O\x81`\x82V\x82S\x8d\xce,\x92j\x82P\x82T\x8dΖ\xa2\x96\x9e,\x92j\x82P\x82T\x81`\x82U\x82S\x8d\xce,\x92j\x82U\x82T\x8dΈȏ\xe3,\x92j\x82V\x82T\x8dΈȏ\xe3,\x8f\x97\x82̑\x8d\x90\x94\x81A\x94N\x97\xee\x81u\x95s\x8fځv\x8a܂\xde,\x8f\x97\x82O\x81`\x82S\x8d\xce,\x8f\x97\x82T\x81`\x82X\x8d\xce,\x8f\x97\x82P\x82O\x81`\x82P\x82S\x8d\xce,\x8f\x97\x82P\x82T\x81`\x82P\x82X\x8d\xce,\x8f\x97\x82Q\x82O\x81`\x82Q\x82S\x8d\xce,\x8f\x97\x82Q\x82T\x81`\x82Q\x82X\x8d\xce,\x8f\x97\x82R\x82O\x81`\x82R\x82S\x8d\xce,\x8f\x97\x82R\x82T\x81`\x82R\x82X\x8d\xce,\x8f\x97\x82S\x82O\x81`\x82S\x82S\x8d\xce,\x8f\x97\x82S\x82T\x81`\x82S\x82X\x8d\xce,\x8f\x97\x82T\x82O\x81`\x82T\x82S\x8d\xce,\x8f\x97\x82T\x82T\x81`\x82T\x82X\x8d\xce,\x8f\x97\x82U\x82O\x81`\x82U\x82S\x8d\xce,\x8f\x97\x82U\x82T\x81`\x82U\x82X\x8d\xce,\x8f\x97\x82V\x82O\x81`\x82V\x82S\x8d\xce,\x8f\x97\x82P\x82T\x8dΖ\xa2\x96\x9e,\x8f\x97\x82P\x82T\x81`\x82U\x82S\x8d\xce,\x8f\x97\x82U\x82T\x8dΈȏ\xe3,\x8f\x97\x82V\x82T\x8dΈȏ\xe3
 04101,1,\x90\xe5\x91\xe4\x8es\x90\u0097t\x8b\xe6,,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,\x90\xe5\x91\xe4\x8es\x90\u0097t\x8b\xe6,\x90\u0097t\x92\xac,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,\x90\xe5\x91\xe4\x8es\x90\u0097t\x8b\xe6,\x82\xa0\x82\xaf\x82ڂ̒\xac,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>                      -            -            -                -                -                -                -                -                -                -                -                -                -                -                -                -              -                -              -              -                          -          -          -              -              -              -              -              -              -              -              -              -              -              -              -              -            -              -            -            -                          -          -          -              -              -              -              -              -              -              -              -              -              -              -              -              -            -              -            -            -

左側と右側を分けて読み、それぞれ削ってからbind

なんか数値の列のはずなのに - という文字が混じっている。(中には 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>                      -            -            -                -                -                -                -                -                -                -                -                -                -                -                -                -              -                -              -              -                          -          -          -              -              -              -              -              -              -              -              -              -              -              -              -              -            -              -            -            -                          -          -          -              -              -              -              -              -              -              -              -              -              -              -              -              -            -              -            -            -

数値のはずの列に混じる -XNA 扱い

これでようやくスタート地点。。。

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

あとはdplyrとtidyrでお掃除

まだ罠はたくさん: 列名の頭にスペース。全角数字。変な区分。

tidy_miyagi = raw_miyagi |>
  dplyr::rename_with(stringr::str_trim) |>
  dplyr::filter(HYOSYO == 1) |>
  dplyr::select(CITYNAME, matches("[男女].+歳")) |>
  tidyr::pivot_longer(!CITYNAME, names_to = "category", values_to = "count") |>
  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)

plot of chunk estat-plot

前処理の前処理が必要になるようなデータは困る

Rを使ったデータ前処理を習得した✨
雑然データからでも下ごしらえして解析できるぞ!

とはいえ…

  • まず、読み込めないと始まらない。
  • dplyrやtidyrで手に負えないほど不規則では困る。

自分が一次データを作る立場なら、どう気をつけたらいいか?


総務省が2020年に発表して「全国民が見るべき」と話題になった
「統計表における機械判読可能なデータの表記方法の統一ルール」 から抜粋。

データ入力の心得 1. 1つのセルに1つの値

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: tidyr::separate(), stringr::str_split(), stringr::str_extract()

データ入力の心得 1. 1つのセルに1つの値

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: tidyr::separate(), stringr::str_split(), stringr::str_extract()

データ入力の心得 2. 余計な文字列が数値扱いを妨げる

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: readr::parse_number(), stringr::str_remove(), stringr::str_replace()

データ入力の心得 2. 余計な文字列が数値扱いを妨げる

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: readr::parse_number(), stringr::str_remove(), stringr::str_replace()

データ入力の心得 2. 余計な文字列が数値扱いを妨げる

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

いやいや、欄外に記載するのも不規則でダメですよ。別シートか、別カラムに。

悪い形に遭遇したときに使える関数: readr::parse_number(), stringr::str_remove(), stringr::str_replace()

データ入力の心得 3. 空白や改行で見た目を整えない

機械にとって " A""A" は違う値。

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: stringr::str_trim(), stringr::str_remove(), stringr::str_replace()

データ入力の心得 3. 空白や改行で見た目を整えない

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: stringr::str_trim(), stringr::str_remove(), stringr::str_replace()

データ入力の心得 4. セルを結合しない、絶対に

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: tidyr::fill()

データ入力の心得 4. セルを結合しない、絶対に

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: tidyr::fill()

データ入力の心得 5. 同じものが続いても省略しない

人が見れば分かるけど、機械も同じように読んではくれない。

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: tidyr::fill(), tidyr::separate(), stringr::str_replace()

データ入力の心得 6. 機種依存文字を避ける

できれば全角・日本語も避けてすべて半角英数で。

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

悪い形に遭遇したときに使える関数: stringi::stri_trans_nfkc()

データ入力の心得 7. 1つのシートには1つの表

もっと言うと、複数シートのファイルを作らず、それぞれ別ファイルに。

総務省 2020「統計表における機械判読可能なデータの表記方法の統一ルール」より

データ入力の心得 8. その他

  • 1行目ではすべての列に名前を与える。
    • なんとなく1行目は空行1列目は名前無しとかやりがち。ダメ。
    • 2行目以降に列名がハミ出してもダメ。
    • プログラム内で参照される変数名として成立するように。
      • アンダースコア_以外の記号・空白を入れないのが安全。
      • 先頭は数字も避ける
  • 保存形式はプレーンテキスト推奨。Excel形式(.xlsx)は扱いにくい。
    • タブ区切り(.tsv) or カンマ区切り(.csv)
    • ファイル名、フォルダ名も機械処理するつもりで規則的に。

熊谷直喜さんのブログ「R解析用データフォーマット例」 も一読を。

データ入力の心得おさらい

つまり、Rで前処理・可視化・解析するぞという気持ち:

  1. 1つのセルに1つの値
  2. 余計な文字列が数値扱いを妨げる
  3. 空白や改行で見た目を整えない
  4. セルを結合しない、絶対に
  5. 同じものが続いても省略しない
  6. 機種依存文字、というか半角英数以外を避ける
  7. 1つのシート(ファイル)には1つの表
  8. 1行目は列名

🔰 総務省ルールの「修正後」にまだ残る改善点を最大3つ列挙しよう。

Excelの親切あるいは裏切りに要注意

表形式のファイルを閲覧・作成するソフトとしてよく普及。
しかし親切設計がユーザーに牙を剥く

🔰 CSVファイルを読み書きして恐怖を体感しよう:

gene,label
MARCH1,22-4
SEPT1,4-14
  1. ↑からのコピペで excel.csv という名のプレーンテキストを作成。
  2. Excelでそれで開き、日付になることを確認。
  3. それを別名のCSVとして保存し、テキストの中身を確認してレポート。

🔰 最終課題: オープンデータを拾って解析しよう。

発表・レポートの条件
最低1枚の図と、そこに至る前処理+可視化のコード。
グラフから読み取れることを一言。
4日目に習う統計解析も組み込めるとなおよし。

週明けに発表会をやります。

Rコードの実行結果をとっておきたい

スクリプト.Rさえ保存しておけばいつでも実行できるけど… 面倒

ggsave() で画像を書き出しておけるけど… どのコードの結果か分からない

スクリプトと実行結果を一緒に見渡せる形式が欲しい。

3 * 14
ggplot(mpg) + aes(displ, hwy) + geom_point(aes(color = drv))
[1] 42

plot of chunk hello

Quarto Document として研究ノートを作る

プログラミングからレポート作成まで一元管理できて楽ちん。

  • 本文とRコードを含むテキストファイル.qmdを作る。
  • HTML, PDFなどリッチな形式に変換して読む。
    • コードだけでなく実行結果のも埋め込める。

Quarto Markdown (.qmd)
Markdown亜種。RやPythonのコードと図表を埋め込める。
Quarto登場前にほぼR専用だった .Rmd と使い勝手は同じ。
Markdown (.md)
最もよく普及している軽量マークアップ言語のひとつ。
微妙に異なる方言がある。qmdで使うのは Pandoc Markdown 。

(どんなものが作れるのか 作成例ギャラリー を見てみよう。)

マークアップ言語

文書の構造や視覚的修飾を記述するための言語。
e.g., HTML+CSS, XML, LaTeX

<h3>見出し3</h3>
<p>ここは段落。
<em>強調(italic)</em><strong>強い強調(bold)</strong><a href="https://www.lifesci.tohoku.ac.jp/">リンク</a>とか。
</p>

見出し3

ここは段落。 強調(italic)強い強調(bold)リンクとか。

表現力豊かで強力だが人間が読み書きするには複雑すぎ、機械寄り。

(好きなウェブサイトのHTMLソースコードを見てみよう。)

軽量マークアップ言語

マークアップ言語の中でも人間が読み書きしやすいもの。
e.g., Markdown, reStructuredText, 各種Wiki記法など

### 見出し3

ここは段落。
*強調(italic)***強い強調(bold)**[リンク](https://www.lifesci.tohoku.ac.jp/)とか。

見出し3

ここは段落。 強調(italic)強い強調(bold)リンクとか。

Quartoする環境は既に整っているはず

  • R (≥ 4.3.3): 最新版 – 0.1 くらいまでが許容範囲
  • RStudio (≥ 2023.12.1+402): Quarto CLI を同梱
  • tidyverse (≥ 2.0.0): 次の2つを自動インストール
    • rmarkdown (≥ 2.26)
    • knitr (≥ 1.45)

(示してあるバージョンは最低要件ではなく私の現在の環境の)


  • Quarto CLI: 最新版を求めるなら手動で入れる。
  • install.packages("quarto"): 多くの人には不要。 Quarto CLIをRコマンドで呼べるようにするだけ。
  • pandoc: Quarto CLI に同梱。 手動で最新版を入れてもRStudio+Quartoがそれを使うかは不明。

Markdown記法で書いてみよう

  1. RStudio > New File > Markdown File
  2. “markdown 記法"で検索して何か書く。 最低限、次の概念を含むように:
    • 見出し1, 2, 3
    • コードブロック、インラインコード
    • 箇条書き (番号あり・なし)
  3. Previewボタンで確認

Quarto Document を作ってみよう

RStudio > New File > Quarto Document…
(DocumentとHTMLを選択し、)タイトルと著者を埋めて、OK。

普通のmdには無いqmdの特徴

ヘッダー (フロントマター)
最上部の --- で挟まれた部分。 文書全体に関わるメタデータを入力。
オプションは出力形式によって異なる。 e.g., html
R code chunk
```{r} のように始まるコードブロック。
コードの実行結果を最終産物に埋め込める。
オプションがいろいろある。e.g.,
  • echo: false: コードを非表示。結果は表示。
  • eval: false: コードを実行せず表示だけ。
  • include: false: コードも結果も表示せず、実行だけする。
  • fig.width: 7, fig.height: 7: 図の大きさを制御。

まあ細かいことは必要になってから調べるとして…

qmdをHTMLに変換してみよう

左のqmdを “→Render” すると右のができる。手順は次スライド。

qmdをHTMLに変換してみよう

  1. ソースコードに名前をつけて保存 commands
    e.g., report.qmd
  2. ⚙️ ボタンから “Preview in Viewer Pane” を選択。
  3. “→Render” を押す。
    • 埋め込まれたRコードが実行される。
    • 実行結果を含むMarkdownが作られる。
    • MarkdownからHTMLに変換される。 e.g., report.html
    • プレビューが自動的に開く。
  4. 編集 → 保存 → Render を繰り返して作り込む。

🔰 レポート (締切: 2024-05-13)

  • 課題: 講義資料の🔰若葉マークすべて。
  • 様式: Quarto Markdownで書き、Render済みHTMLを提出。
    • 1日分で1ファイル、それぞれClassroomトピックに提出。計4つ。
    • {ID}-{name}-day{d}.html, e.g., C0SB0000-iwasaki-day2.html
    • embed-resources: true で画像などを埋め込んだ独立HTML。
  • 評価ポイント
    • エラーも警告も無くコードが走る。
    • 文書の構造や図が視覚的に見やすく整理されている。
    • 半年後の自分が読んでわかるような # 親切コメント
  • 手抜きポイント
    • 生物学的な意義があるか、みたいなのはほぼ不問。

レポートの体裁の例

左のようなqmdを作ってRenderし、右のようなHTMLファイルを提出。

ヘッダーとおまじないコードの例

---
title: "進化学実習 day 2"
author: "C0SB0000 9班 Jean Sibelius"
date: "2024-04-10"
format:
  html:
    embed-resources: true
    toc: true
---
library(conflicted)
library(tidyverse)
grDevices::palette("Okabe-Ito")
options(
  ggplot2.continuous.colour = "viridis",
  ggplot2.continuous.fill = "viridis",
  ggplot2.discrete.colour = grDevices::palette()[-1],
  ggplot2.discrete.fill = grDevices::palette()[-1]
)
knitr::opts_chunk$set(dev = "ragg_png")  # ggplot 日本語

今日の残り時間

  • 班やTAに相談し、消化しきれなかった部分をなるべく解消する。
  • まずは個人で課題1(組み込みデータの可視化)に取り組む。
  • ある程度できたら班内で見せ合い、よかった部分を自分のに取り込む。
  • TAが評価して合格した班から解散。
  • 最終課題は週明け月曜に発表してもらえればいいので今日は未完成でOK。
  • 居残って取り組んでもOK。

参考文献

7. 統計モデリング1: 確率分布、尤度