霞と側杖を食らう

ほしいものです。なにかいただけるとしあわせです。[https://www.amazon.jp/hz/wishlist/ls/2EIEFTV4IKSIJ?ref_=wl_share]

{wakefield}パッケージの学習記録

【学習動機】

人工データを作るとき, いつもテキトーに思いついた乱数で作っているが, 楽にできないかと思っていたら, 偶然, Rの{wakefield}パッケージを発見した. データセットを乱数で発生させるパッケージのようだが, 日本語で説明をしているものは見当たらないので, 自分でメモを記録しておくことにした.

パッケージの公式ドキュメント[https://cran.r-project.org/web/packages/wakefield/wakefield.pdf]

パッケージ製作者のブログがあって, ほとんどそれの模倣と簡単な情報追加なので, 英語が読めるならそちらのほうが良いかもしれない.

Random Data Sets Quickly | TRinker's R Blog

Wakefield: Random Data Set (Part II) | TRinker's R Blog

 

【学習内容】

パッケージ読み込み.

library(tidyverse)
library(wakefield)

ベクトル生成

ベクトルを生成する関数. 以下に一覧と簡単な説明.

variables(TRUE)
## $character
## [1] "lorem_ipsum" "name"        "sentence"    "string"      "upper"      
## [6] "zip_code"   
## 
## $date
## [1] "date_stamp" "dob"       
## 
## $factor
##  [1] "animal"           "answer"           "area"            
##  [4] "car"              "coin"             "color"           
##  [7] "dna"              "education"        "employment"      
## [10] "eye"              "grade_level"      "group"           
## [13] "hair"             "internet_browser" "language"        
## [16] "marital"          "military"         "month"           
## [19] "political"        "race"             "religion"        
## [22] "sex"              "sex_inclusive"    "state"           
## 
## $integer
## [1] "age"      "children" "dice"     "level"    "year"    
## 
## $logical
## [1] "death"  "smokes" "valid" 
## 
## $numeric
## [1] "dummy"  "grade"  "height" "income" "iq"     "normal" "sat"    "speed" 
## 
## $`ordered factor`
## [1] "likert"
  • age(デフォルトだと18~89歳から一様分布で生成),
  • animal(デフォルトだとanimal_listという591の動物のリストのうち10種ランダムで選ばれて生成),
  • answer(デフォルトだとYes, Noから生成), area(デフォルトだとUrban, SubUrban, Ruralから生成),
  • car(デフォルトだと32種類の車から生成),
  • children(0~10人を確率(デフォルトだと0.25,0.25,0.15,0.15,0.1,0.02,0.02,0.02,0.02,0.01,0.01)で生成),
  • coin(HeadsとTailsを生成),
  • color(grDevices::colors()の657種の色から生成),
  • date_stamp(引数randomがデフォルトだと現在の日付をSys.Date()でとって, 日付を生成),
  • death(TRUEかFALSEを生成),
  • dice(デフォルトは1~6を生成),
  • dna(Guanine,Adenine,Thymine,Cytosineから生成),
  • dob(date of birth, 誕生部の生成),
  • dummy(0と1を生成),
  • education(“No Schooling Completed”, “Regular High School Diploma”, “Bachelor’s Degree”, “Some - College, Less than 1 Year”, “Some College, 1 or More Years, No Degree” “Associate’s Degree”, - “Professional School Degree”, “GED or Alternative Credential”, “9th Grade to 12th Grade, No Diploma”, “Nursery School to 8th Grade”, “Master’s Degree”から生成),
  • employment(デフォルトだとFull Time, Part Time, Unemployed, Retired, - Studentから確率(0.6,0.1,0,1,0.1,0.1)で生成),
  • eye(デフォルトだとBrown, Blue, Green, Hazel, Grayから確率(0.44,0.3,0.13,0.09,0.04)で生成),
  • grade_level(Kと1~12で生成),
  • grade(デフォルトだと平均88,標準偏差4の正規分布で生成),
  • group(ControlとTreatmentを割り付け),
  • hair(デフォルトだとBrown Black Blonde Redから確率()),
  • height(デフォルトだと平均69, 標準偏差3.75の正規分布で生成. minとmaxを超えていたらその値に打ち止め),
  • income(shape=2のガンマ分布からの乱数を20000倍してroundで丸めたもの),
  • internet_browser(デフォルトだと“Chrome”, “IE”, “Firefox”, “Safari”, “Opera”, “Android”から確率(0.5027, 0.175, 0.1689, 0.0994, 0.017, 0.0132)で生成),
  • iq(デフォルトだと, 平均100, 標準偏差10の正規分布で生成),
  • language(languagesの99種類からそれぞれの確率で生成),
  • level(1~4のレベルを生成),
  • likert(リッカート尺度. “Strongly Agree”, “Agree”, “Neutral”, “Disagree”, “Strongly Disagree”から生成. likert_5とlikert_7もある),
  • lorem_ipsum(ダミーテキスト生成),
  • marital(結婚状態をデフォルトで“Married”, “Divorced”, “Widowed”, “Separated”, “Never Married”から生成),
  • military(デフォルトでは“Army”, “Air Force”, “Navy”, “Marine Corps”, “Coast Guard”から(0.3785, 0.2334, 0.2218, 0.1366, 0.0296)で生成),
  • month(January~Decemberを生成),
  • name(name_neutralという95025の名前から生成),
  • normal(rnormとほとんど一緒),
  • pet(ペット, デフォルトだとDog, Cat, None, Bird, Horseから生成),
  • political(デフォルトだと“Democrat”, “Republican”, “Constitution”, “Libertarian”, “Green”から確率(0.577269133302094, 0.410800432748879, 0.00491084954793489, 0.00372590303330866, 0.0032936813677832)で生成),
  • race(デフォルトだと“White”, “Hispanic”, “Black”, “Asian”, “Bi-Racial”, “Native”, “Other”, “Hawaiian”から確率(0.637, 0.163, 0.122, 0.047, 0.019, 0.007, 0.002, 0.0015)で生成),
  • religion(デフォルトだと“Christian”, “Muslim”, “None”,“Hindu”, “Buddhist”, “Folk”, “Other”, “Jewish”から確率(0.31477, 0.23163, 0.16323, 0.14985,0.07083, 0.05882, 0.00859, 0.00227)で生成),
  • sat(平均1500標準偏差100でSATの点数生成),
  • sentence(presidential_debates_2012からsentenceを生成),
  • sex_inclusive(“Male”, “Female”, “Intersex”から生成),
  • sex(“Male”, “Female”から確率(0.51219512195122,0.48780487804878)で生成),
  • smokes(FALSEかTRUEを確率(0.822, 0.178)で生成),
  • speed(平均55,標準偏差10の正規分布で生成),
  • state(米国50州をstate_populationsから生成),
  • string([A-Za-z0-9]からデフォルトだと10文字の長さで生成),
  • upper(大文字アルファベットを生成. lowerで小文字アルファベットを生成),
  • valid(TRUEかFALSEを生成),
  • year(1996からSys.Dateでとってきた年から生成),
  • zip_code(10000~99999から生成) とたくさんある.

引数は, 基本的にサンプルサイズ(n)と生成する要素の集合(x)と確率(p)と名前(name).
xはデフォルトがあるが変更できる, nameは後でデータフレームを作るときの変数の名前になる. nは後に説明するように, データフレームやリストを生成のときにグローバルに設定できる.

たとえば, ageだと, こんな感じで使う.

age(10)
##  [1] 48 73 49 42 55 29 57 34 38 26

データフレーム生成

r_data_frame関数でデータフレームを作成できる. 最初にnを設定. あとはベクトルを作る関数を並べるだけ.
各関数のデフォルトのnameが変数名がつく. 別の変数名を付けたければ指定すればよい.

r_data_frame(
    n = 500,
    id,
    race,
    age,
    smokes,
    marital,
    Start = hour,
    End = hour,
    iq,
    height,
    died
)
## # A tibble: 500 x 10
##    ID    Race      Age Smokes Marital     Start   End       IQ Height Died 
##    <chr> <fct>   <int> <lgl>  <fct>       <times> <time> <dbl>  <dbl> <lgl>
##  1 001   White      79 FALSE  Separated   00:00:~ 00:00~   110     70 FALSE
##  2 002   Black      73 FALSE  Married     00:00:~ 00:00~   105     71 TRUE 
##  3 003   White      48 FALSE  Separated   00:00:~ 00:00~   100     73 FALSE
##  4 004   White      75 FALSE  Never Marr~ 00:00:~ 00:00~   101     75 TRUE 
##  5 005   White      79 FALSE  Divorced    00:00:~ 00:00~    88     68 TRUE 
##  6 006   White      80 FALSE  Widowed     00:00:~ 00:00~    93     67 TRUE 
##  7 007   White      83 FALSE  Married     00:00:~ 00:00~   104     69 TRUE 
##  8 008   Hispan~    52 FALSE  Divorced    00:00:~ 00:00~    97     73 FALSE
##  9 009   White      19 FALSE  Divorced    00:00:~ 00:00~    95     65 TRUE 
## 10 010   Black      81 FALSE  Separated   00:00:~ 00:00~   106     67 TRUE 
## # ... with 490 more rows

デフォルトで簡単にあるあるデータセットを作成できる. 変数はID, Race, Age, Sex, Hour, IQ, Height, Died.

r_data(100)
## # A tibble: 100 x 8
##    ID    Race       Age Sex    Hour        IQ Height Died 
##    <chr> <fct>    <int> <fct>  <times>  <dbl>  <dbl> <lgl>
##  1 001   Black       25 Male   00:00:00    92     66 TRUE 
##  2 002   White       46 Male   00:00:00   123     73 FALSE
##  3 003   Hispanic    36 Female 00:30:00    95     67 TRUE 
##  4 004   White       42 Male   01:00:00   106     76 TRUE 
##  5 005   Hispanic    35 Male   01:00:00    82     63 FALSE
##  6 006   Black       39 Male   02:00:00   104     74 FALSE
##  7 007   White       89 Male   02:30:00    87     65 FALSE
##  8 008   White       30 Female 02:30:00   115     67 TRUE 
##  9 009   White       58 Male   02:30:00   116     76 FALSE
## 10 010   White       61 Male   03:00:00    89     67 TRUE 
## # ... with 90 more rows

ランダムに欠測値も発生させられる. ランダムな割合をprobで設定できる.

r_data(100) %>% r_na(prob = 0.2)
## # A tibble: 100 x 8
##    ID    Race       Age Sex    Hour        IQ Height Died 
##    <chr> <fct>    <int> <fct>  <times>  <dbl>  <dbl> <lgl>
##  1 001   Asian       73 Female 00:00:00   113     70 FALSE
##  2 002   White       NA Female 01:00:00   102     75 FALSE
##  3 003   <NA>        36 Male   01:00:00    NA     69 TRUE 
##  4 004   White       32 Female 01:00:00   115     67 FALSE
##  5 005   Black       30 Female 01:30:00   123     72 TRUE 
##  6 006   White       71 Male   02:00:00   116     73 TRUE 
##  7 007   White       45 Male   02:00:00    92     70 TRUE 
##  8 008   White       75 <NA>   <NA>        94     69 FALSE
##  9 009   Black       NA Female 02:30:00   101     70 TRUE 
## 10 010   Hispanic    29 <NA>   02:30:00    98     63 NA   
## # ... with 90 more rows

繰り返しデータも簡単に作れてしまう.

r_data_frame(
    n = 500,
    id,
    pet,
    age, age, age,
    likert_5, likert_5, likert_5)
## # A tibble: 500 x 8
##    ID    Pet   Age_1 Age_2 Age_3 Likert_1       Likert_2      Likert_3     
##    <chr> <fct> <int> <int> <int> <ord>          <ord>         <ord>        
##  1 001   Cat      45    69    54 Disagree       Strongly Agr~ Agree        
##  2 002   Dog      84    25    49 Strongly Disa~ Strongly Dis~ Neutral      
##  3 003   Dog      25    30    79 Strongly Disa~ Strongly Agr~ Agree        
##  4 004   Cat      32    36    21 Agree          Strongly Agr~ Agree        
##  5 005   Dog      48    38    74 Disagree       Disagree      Strongly Agr~
##  6 006   Dog      44    36    70 Disagree       Strongly Dis~ Disagree     
##  7 007   Bird     20    49    48 Strongly Agree Strongly Dis~ Strongly Dis~
##  8 008   Horse    54    20    68 Disagree       Neutral       Neutral      
##  9 009   Dog      73    27    89 Disagree       Strongly Agr~ Neutral      
## 10 010   Dog      48    78    40 Neutral        Neutral       Neutral      
## # ... with 490 more rows

何度も同じ関数名を打たなくてもいいように, r_seriesという関数もある.

r_data_frame(
    n = 500,
    id,
    pet,
    r_series(age,3),
    r_series(likert_5,3))
## # A tibble: 500 x 8
##    ID    Pet   Age_1 Age_2 Age_3 Likert_1       Likert_2      Likert_3     
##    <chr> <fct> <int> <int> <int> <ord>          <ord>         <ord>        
##  1 001   Cat      58    27    72 Disagree       Neutral       Agree        
##  2 002   Cat      89    47    81 Strongly Agree Strongly Agr~ Strongly Dis~
##  3 003   Dog      22    65    19 Neutral        Agree         Disagree     
##  4 004   Dog      87    74    52 Strongly Disa~ Strongly Dis~ Strongly Agr~
##  5 005   Dog      62    75    24 Agree          Strongly Agr~ Strongly Dis~
##  6 006   None     43    60    72 Strongly Disa~ Disagree      Agree        
##  7 007   Cat      82    76    70 Neutral        Neutral       Neutral      
##  8 008   Dog      61    77    36 Neutral        Disagree      Strongly Agr~
##  9 009   Cat      81    24    26 Strongly Agree Neutral       Agree        
## 10 010   Dog      52    51    36 Strongly Disa~ Neutral       Strongly Agr~
## # ... with 490 more rows

r_dummyで1,0のダミー変数で変数の生成もできる. prefixは変数名の頭に元の変数名を残す.

r_data_frame(n=20,
    id,
    age,
    r_dummy(sex_inclusive, prefix = TRUE),
    r_dummy(race)
)
## # A tibble: 20 x 9
##    ID      Age Sex_Male Sex_Female Sex_Intersex White Black Asian Native
##    <chr> <int>    <int>      <int>        <int> <int> <int> <int>  <int>
##  1 01       27        0          0            1     0     0     1      0
##  2 02       58        0          1            0     0     1     0      0
##  3 03       31        0          1            0     1     0     0      0
##  4 04       83        0          0            1     0     0     1      0
##  5 05       33        0          0            1     1     0     0      0
##  6 06       46        1          0            0     1     0     0      0
##  7 07       41        0          0            1     1     0     0      0
##  8 08       53        0          0            1     0     1     0      0
##  9 09       51        1          0            0     1     0     0      0
## 10 10       50        0          0            1     1     0     0      0
## 11 11       28        1          0            0     1     0     0      0
## 12 12       46        0          1            0     1     0     0      0
## 13 13       46        0          0            1     1     0     0      0
## 14 14       54        0          1            0     0     0     1      0
## 15 15       41        0          0            1     1     0     0      0
## 16 16       51        0          0            1     1     0     0      0
## 17 17       56        0          0            1     0     0     0      1
## 18 18       75        0          0            1     1     0     0      0
## 19 19       19        0          0            1     1     0     0      0
## 20 20       51        1          0            0     1     0     0      0

変数が長すぎて見えないケースはpeekを使うと頭を見せてくれる.

r_data_frame(100,
    id, 
    name,
    sex,
    r_series(sentence,3)
) %>% peek
## Source: local data frame [100 x 6]
## 
##     ID     Name    Sex Sentence_1 Sentence_2 Sentence_3
## 1  001  Yamarie Female Your home  That's ano Asking the
## 2  002  Aliesha Female Well, I wo Let me to  I got to I
## 3  003     Suni Female Don't go a I'm excite We're goin
## 4  004   Jawaad Female I think th You'll get This is ob
## 5  005   Enrica Female We've been But it doe I like Ame
## 6  006     Buna   Male That's bee Their oil  Your secre
## 7  007   Saleen   Male And as a c Tonight's  You didn't
## 8  008 Trenisha   Male You know w This seems And I've g
## 9  009  Doniece Female I said we' You know,  But we hav
## 10 010    Javia Female And in you Secretary  Why, when 
## .. ...      ...    ...        ...        ...        ...

【学習予定】

人工データのデータセットが作りやすくなったので活用していきたい.