【学習動機】
人工データを作るとき, いつもテキトーに思いついた乱数で作っているが, 楽にできないかと思っていたら, 偶然, 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
## .. ... ... ... ... ... ...
【学習予定】
人工データのデータセットが作りやすくなったので活用していきたい.