こんにちは,shun(@datasciencemore)です!!
前回までR前処理講座の環境構築編をやってきました.
今回からいよいよRについて本格的に学んでいきますよ~
今回は,R前処理講座のbaseR編の第1弾,データ型についてです.
データ型については,Rだからというわけではなく,他のプログラミング(PythonやC言語など)でも重要な概念です.
1.データ型ってなに??
データ型っていうのは,データの種類のことだよ!
データの種類が明確になることで色々な処理が可能となるんだ!
さて,上のざっくりした説明で理解できたでしょうか?笑
私たち人間は,普段生活する上で色々な分類をしています.
例えば,
- ぼくは男で君は女だね ⇒ 人を男と女で分類
- お酒を買うときに,店員さんから20歳以上ですかと尋ねられる ⇒ 人を成人と未成年で分類
- この部品は,OKだけど,あの部品は壊れているね ⇒ 部品を正常と異常で分類
などなど...
さて,私たち人間がいろんな物事を分類するのはなんでなのでしょうか?
具体的な理由は様々だと思いますが,要は分類するといいことがあるからですね.
上の例でいうと,人を成人と未成年で分類できれば,お酒を与えていいか悪いか判断できますし,部品を正常と異常で分類できれば,正常の部品のみを使用することができますね.
このように私たち人間がいろんな物事を分類するのと同様,コンピュータもデータを分類する必要があるんですね.
その分類先の種類のことがデータ型です.
なるほど!
そういう風にコンピュータにデータの種類を教えてあげることで,コンピュータはそのデータの種類に応じた処理ができるってことですね!
そのとおり!
だからそんなに難しく考える必要はないよ!!
よく使うデータ型を次の表にまとめました.
以下,これらについて説明していきますね.
上の表は,すべてのデータ型を示しているわけではありません.
あくまで代表的なデータ型に絞ったものです.
最初からたくさんデータ型明示しちゃうとやる気なくなっちゃうと思うので,少なくしました笑
これら以外のデータ型については,必要に応じて覚えていけばOKです.
2.数値型(numeric)
数値型は,numericともいい,integerとdoubleの2つに細分化されます.
2.1.integer
integerは整数を表します.
1, 200, 9999などが該当します.
1 2 |
# 1の型は何か? typeof(1L) |
1 |
[1] "integer" |
2.2.double
doubleは小数を表します.
1.36, 3.14, 33.9などですね.
1 2 |
# 3.14の型は何か? typeof(3.14) |
1 |
[1] "double" |
3.文字列型
文字列型は,character,factor,orderの3つに細分化されます.
それぞれ特徴が違うので,要注意です.
数値型のところでは,integerとdoubleをそんなに意識的に分類しなくていいといいました.
しかし,文字列型では,character,factor,orderのそれぞれをきちんと意識してください
3.1.character
シングルクォーテーション「'」,もしくはダブルクォーテーション「”」で文字を囲うと文字列になります.
基本的にダブルクォーテーション「”」で囲うようにしましょう.
1 2 |
# "apple"の型は何か? typeof("apple") |
1 |
[1] "character" |
数値であってもダブルクォーテーション「”」で囲ったら文字列になります.
1 2 |
# "1"の型は何か? typeof("1") |
1 2 |
> typeof("1") [1] "character" |
ややこしい...笑
3.2.factor
factorは,文字列に水準というラベルを付与したデータ型です.
(何言ってるんだこいつ??)
はい,その気持ちわかります,ぼくも最初は意味不明でした笑
例えば,以下のような春夏秋冬を表すcharacter型のベクトルを考えてみましょう.
ベクトルについては,別途記事に書くのでいまはわからなくて結構です.
1 2 |
# character型のベクトル vec_season_chr = c("spring", "summer", "autumn", "winter") |
1 |
[1] "spring" "summer" "autumn" "winter" |
文字列にfactorという関数を適用することでfactor型に変換できます.
1 2 |
# factor型のベクトル vec_season_fct = factor(vec_season_chr) |
1 2 |
[1] spring summer autumn winter Levels: autumn spring summer winter |
character型のベクトルとfactor型のベクトルを比較すると,似ていますが,ちょっと違いますね.
1つ目の違いは,character型のベクトルは,ダブルクォーテーション「"」があるのに,factor型のベクトルはないです.
2つ目の違いは,factor型のベクトルは下のほうにLevelsというわけわからんものがくっついています.
まず1つ目の違いについてですが,これはコンピュータの認識の違いです.
実は,コンピュータは,character型を文字列,factor型を数値と認識しています.
先ほどの表では,factor型を文字列型として紹介しました.
ですから,正確にいうと上の表は間違いかもしれないです.
ただ,実用上,factorは文字列と考えたほうが都合がいいことが多いので,上の表の分類にしました.
それのキーとなるのが,2つ目の違いにでてきたfactor型のベクトルについているLevelsです.
このLevelsというものを水準と呼んでおり,これが数値のラベルを示しているのです.
なんとなくわかりました.
けど,どんなときにfactor型を使用すればいいのでしょうか??
主に以下の3点だね!!
①メモリの節約
②機械学習をする際の前処理
③水準を利用した前処理
さきほどのfactor型のベクトル,vec_season_fctの水準は,autumn, spring, summer, winterでしたね.
さて,以下のような春夏秋冬のそれぞれの平均気温が示されたデータがあったとします.
x軸にご注目ください.
左から水準の順番に出力されていますね.
でもこれ,春夏秋冬の平均気温をグラフなので,x軸もspring, summer, autumn, winterの順番にしたほうが見やすそうです.
どうすればいいかというと,水準の順番を変更すればいいんです.
水準の順番の変え方については,かなり奥が深いので別途記事を書きます.
今回は,水準は変えられるということだけ理解いただければOKです.
以下のコードで水準をspring, summer, autumn, winterの順番に変更できます.
1 2 3 |
# factor型のベクトル 水準変更 vec_season_fct_rev = vec_season_fct %>% fct_relevel("spring", "summer", "autumn", "winter") |
1 2 |
[1] spring summer autumn winter Levels: spring summer autumn winter |
こうすることで,先ほどの図の出力は次のようになります.(コード省略)
はい,うまくできましたね.
こんな感じで水準を変更することでグラフがきれいにすることがよくあります.
3.3.order
文字列型の最後は,order型です.
これは先ほど説明したfactor型の特別版と考えてください.
何が特別なのかというと,order型は水準に大小関係がついているんですね.
(なんとかfactor型理解したのに,またわけのわからないことを...)
大丈夫,order型はイメージしやすいと思うよ!!
先ほど説明したfactor型は,水準に大小関係がなく,order型は,水準に大小関係があります.
例えば,先ほどの季節の平均気温データを考えてみましょう.
ここからautumnとwinterの情報だけ欲しくなったとします.
もし,季節の情報がorder型であればautumnよりも大きいものを抽出したいとお願いすれば,autumnとwinterの情報を抽出してくれます.
1 2 3 4 5 6 7 8 |
# order型のデータ df_order = tibble( season = c("spring", "summer", "autumn", "winter") %>% factor(ordered = TRUE) %>% fct_relevel("spring", "summer", "autumn", "winter"), avg_temp = c(22, 30, 18, 9) ) # autumnよりも大きいデータを抽出 df_order %>% filter(season >= "autumn") |
1 2 3 4 5 |
# A tibble: 2 x 2 season avg_temp <ord> <dbl> 1 autumn 18 2 winter 9 |
1 2 3 4 5 6 7 8 |
df_factor = tibble( season = c("spring", "summer", "autumn", "winter") %>% factor() %>% fct_relevel("spring", "summer", "autumn", "winter"), avg_temp = c(22, 30, 18, 9) ) # autumnよりも大きいデータを抽出 df_factor %>% filter(season >= "autumn") |
1 2 3 4 |
# A tibble: 0 x 2 # … with 2 variables: season <fct>, avg_temp <dbl> Warning message: In Ops.factor(season, "autumn") : ‘>=’ not meaningful for factors |
このような感じで大小関係があったほうがより柔軟な操作が可能となるのです.
上のコードの意味も今はわからなくて大丈夫ですからね.
別記事でデータフレームの処理の仕方を解説するので,そのあとにでも見てみてください.
今は,factorとorderは微妙に違うってことがわかれば十分です
4.論理値型
さ,データ型の最後,論理値型でlogicalともいいます.
これは簡単,TRUEとFALSEのどちらかをとるデータ型のことです.
1 2 |
# TRUEの型は何か? typeof(TRUE) |
1 2 |
> typeof(TRUE) [1] "logical" |
1 2 |
# FALSEの型は何か? typeof(FALSE) |
1 2 |
> typeof(FALSE) [1] "logical" |
さて,そんな2種類しかとらないlogicalですが,その用途はさまざまで,主に条件分岐に使用されます.
こんな感じで
条件1がTRUE ⇒ 処理1
条件1がFALSE ⇒ 処理0
など,条件によって処理を分析させるときによく使います.
具体的な使い方については別記事で紹介していきますね.
まとめ
今回はbaseRのデータ型について学習しました.
どれも重要ですが,文字列型(character, factor, order)の分類が難しかったと思います.
安心してください,今回の内容を一回で完璧にすることはほぼ不可能です笑
今回は,データ型というデータの種類がいろいろあって,それぞれで特徴が違うんだくらいの理解で十分だと思います.
今後,様々なデータを扱っていきますが,そのときにデータ型についてわからなくなったらこの記事を振り返ってみましょう.
そうすることで徐々に理解が深まると思います.
お疲れ様でした!!