baseR DS講座 tidyverse講座

【R前処理講座5】データ型【baseR】

こんにちは,shun(@datasciencemore)です!!
前回までR前処理講座の環境構築編をやってきました.
今回からいよいよRについて本格的に学んでいきますよ~

今回は,R前処理講座のbaseR編の第1弾,データ型についてです.
データ型については,Rだからというわけではなく,他のプログラミング(PythonやC言語など)でも重要な概念です.

1.データ型ってなに??

データ型ってなんですか?

データ型っていうのは,データの種類のことだよ!
データの種類が明確になることで色々な処理が可能となるんだ!

さて,上のざっくりした説明で理解できたでしょうか?笑
私たち人間は,普段生活する上で色々な分類をしています.
例えば,

  1. ぼくは男で君は女だね ⇒ 人を男と女で分類
  2. お酒を買うときに,店員さんから20歳以上ですかと尋ねられる ⇒ 人を成人と未成年で分類
  3. この部品は,OKだけど,あの部品は壊れているね ⇒ 部品を正常と異常で分類

などなど...

さて,私たち人間がいろんな物事を分類するのはなんでなのでしょうか?
具体的な理由は様々だと思いますが,要は分類するといいことがあるからですね.

上の例でいうと,人を成人と未成年で分類できれば,お酒を与えていいか悪いか判断できますし,部品を正常と異常で分類できれば,正常の部品のみを使用することができますね.

このように私たち人間がいろんな物事を分類するのと同様,コンピュータもデータを分類する必要があるんですね.
その分類先の種類のことがデータ型です.

なるほど!

そういう風にコンピュータにデータの種類を教えてあげることで,コンピュータはそのデータの種類に応じた処理ができるってことですね!

そのとおり!
だからそんなに難しく考える必要はないよ!!

よく使うデータ型を次の表にまとめました.

以下,これらについて説明していきますね.

上の表は,すべてのデータ型を示しているわけではありません.
あくまで代表的なデータ型に絞ったものです.
最初からたくさんデータ型明示しちゃうとやる気なくなっちゃうと思うので,少なくしました笑
これら以外のデータ型については,必要に応じて覚えていけばOKです.

2.数値型(numeric)

数値型は,numericともいい,integerとdoubleの2つに細分化されます.

2.1.integer

integerは整数を表します.
1, 200, 9999などが該当します.

typeofという関数を使用することで型を調べることができます.
また1Lと1の隣にLがくっついていますが,これはintegerで扱うときにするおまじないです.
Lを付けないと通常doubleで認識するので,こうしました.
正直,intgerとdoubleの違いはあんまり気にしなくていいので深く考えないでください笑

2.2.double

doubleは小数を表します.
1.36, 3.14, 33.9などですね.

3.文字列型

文字列型は,character,factor,orderの3つに細分化されます.
それぞれ特徴が違うので,要注意です.

数値型のところでは,integerとdoubleをそんなに意識的に分類しなくていいといいました.
しかし,文字列型では,character,factor,orderのそれぞれをきちんと意識してください

3.1.character

シングルクォーテーション「'」,もしくはダブルクォーテーション「”」で文字を囲うと文字列になります.
基本的にダブルクォーテーション「”」で囲うようにしましょう.

数値であってもダブルクォーテーション「”」で囲ったら文字列になります.

 ややこしい...笑

3.2.factor

factorは,文字列に水準というラベルを付与したデータ型です.

??
(何言ってるんだこいつ??)

はい,その気持ちわかります,ぼくも最初は意味不明でした笑
例えば,以下のような春夏秋冬を表すcharacter型のベクトルを考えてみましょう.

ベクトルについては,別途記事に書くのでいまはわからなくて結構です.

文字列にfactorという関数を適用することでfactor型に変換できます.

character型のベクトルとfactor型のベクトルを比較すると,似ていますが,ちょっと違いますね.
1つ目の違いは,character型のベクトルは,ダブルクォーテーション「"」があるのに,factor型のベクトルはないです.
2つ目の違いは,factor型のベクトルは下のほうにLevelsというわけわからんものがくっついています.

まず1つ目の違いについてですが,これはコンピュータの認識の違いです.
実は,コンピュータは,character型を文字列,factor型を数値と認識しています.

先ほどの表では,factor型を文字列型として紹介しました.
ですから,正確にいうと上の表は間違いかもしれないです.
ただ,実用上,factorは文字列と考えたほうが都合がいいことが多いので,上の表の分類にしました.

それでは,この数値とは具体的に何を表すのでしょうか?
それのキーとなるのが,2つ目の違いにでてきたfactor型のベクトルについているLevelsです.
このLevelsというものを水準と呼んでおり,これが数値のラベルを示しているのです.
この例の場合,autumn, spring, summer, winterの順にそれぞれ1,2,3,4が対応しているのです.

 

 

なるほど!
なんとなくわかりました.
けど,どんなときにfactor型を使用すればいいのでしょうか??

主に以下の3点だね!!
①メモリの節約
②機械学習をする際の前処理
③水準を利用した前処理

この中で一番よく使われるのが3なので,3について解説します.
さきほどのfactor型のベクトル,vec_season_fctの水準は,autumn, spring, summer, winterでしたね.
水準の順番は,辞書順に決まります.
この例の場合,spring, summer, autumn, winterを辞書順に並べると
autumn, spring, summer, winter
となるので,この順に水準が設定されます.

さて,以下のような春夏秋冬のそれぞれの平均気温が示されたデータがあったとします.
これを棒グラフにすると次のようになります.(コードは省略)

x軸にご注目ください.
左から水準の順番に出力されていますね.
でもこれ,春夏秋冬の平均気温をグラフなので,x軸もspring, summer, autumn, winterの順番にしたほうが見やすそうです.
どうすればいいかというと,水準の順番を変更すればいいんです.
水準の順番の変え方については,かなり奥が深いので別途記事を書きます.
今回は,水準は変えられるということだけ理解いただければOKです.
以下のコードで水準をspring, summer, autumn, winterの順番に変更できます.


こうすることで,先ほどの図の出力は次のようになります.(コード省略)

はい,うまくできましたね.
こんな感じで水準を変更することでグラフがきれいにすることがよくあります.

3.3.order

文字列型の最後は,order型です.
これは先ほど説明したfactor型の特別版と考えてください.
何が特別なのかというと,order型は水準に大小関係がついているんですね.

??
(なんとかfactor型理解したのに,またわけのわからないことを...)

大丈夫,order型はイメージしやすいと思うよ!!

先ほど説明したfactor型は,水準に大小関係がなく,order型は,水準に大小関係があります.

イメージにすると次のような感じです.
この大小関係とはなんなのでしょうか?
例えば,先ほどの季節の平均気温データを考えてみましょう.
全ての季節の情報が表示されていますね.
ここからautumnとwinterの情報だけ欲しくなったとします.
もし,季節の情報がorder型であればautumnよりも大きいものを抽出したいとお願いすれば,autumnとwinterの情報を抽出してくれます.
しかし,季節の情報がfactor型である場合,autumnよりも大きいものを抽出したいとお願いしてもうまくいきません# factor型のデータ
factor型は大小関係がないので,大小を比較することができないからです.
このような感じで大小関係があったほうがより柔軟な操作が可能となるのです.

上のコードの意味も今はわからなくて大丈夫ですからね.
別記事でデータフレームの処理の仕方を解説するので,そのあとにでも見てみてください.
今は,factorとorderは微妙に違うってことがわかれば十分です

4.論理値型

さ,データ型の最後,論理値型でlogicalともいいます.
これは簡単,TRUEとFALSEのどちらかをとるデータ型のことです.

さて,そんな2種類しかとらないlogicalですが,その用途はさまざまで,主に条件分岐に使用されます.

こんな感じで
条件1がTRUE ⇒ 処理1
条件1がFALSE ⇒ 処理0
など,条件によって処理を分析させるときによく使います.
具体的な使い方については別記事で紹介していきますね.

まとめ

今回はbaseRのデータ型について学習しました.

どれも重要ですが,文字列型(character, factor, order)の分類が難しかったと思います.
安心してください,今回の内容を一回で完璧にすることはほぼ不可能です笑
今回は,データ型というデータの種類がいろいろあって,それぞれで特徴が違うんだくらいの理解で十分だと思います.
今後,様々なデータを扱っていきますが,そのときにデータ型についてわからなくなったらこの記事を振り返ってみましょう.
そうすることで徐々に理解が深まると思います.

お疲れ様でした!!

-baseR, DS講座, tidyverse講座