社会調査情報処理実習A 2組

2017年度 後期 木04 15:15-16:45 瀬田2-119

欠損値

欠損値とは何らかの理由で集計に含めることが出来ない値である。未入力データなどが該当する。数値型データに対して欠損値に「NA」など文字列を使うと多くのソフトウェアでは問題が出るので、あり得ない数値(今回の例では99999)を入力してあることが多い。

今回は元データでは欠損値が99999と入力されているものとする。

物件一覧の平均価格・平均築年数および全項目の相関係数行列を求めよ。

物件一覧
価格(万円)敷地面積(m^2)駅からの距離(km)築年数(年)
3440611.423
4320600.16
4820991.220
3900821.425
3680630.825
99999711.81
58901011.43
5200999990.715
480065999990
#99999という数値データのまま
data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/house-prices-missingValue.csv", fileEncoding = "utf-8")
summary(data)

mean(data$price) #平均価格
mean(data$year) #平均築年数

cor(data) #相関行列

99999という値がそのまま数値として計算されるので、例えば平均値は大きく上昇してしまう。もちろん相関係数も結果が変わってしまう。

値の置き換え

na.strings オプション(関数の引数として指定する)
function.name(x, …, na.strings = c(欠損値として扱いたい値1,欠損値として扱いたい値2,…) )
#欠損値処理
data.na <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/house-prices-missingValue.csv", na.strings=c(99999), fileEncoding = "utf-8")
summary(data.na)

mean(data.na$price) #平均価格
mean(data.na$year) #平均築年数

cor(data.na) #相関行列

summaryの結果を見れば、価格・敷地面積・駅からの距離に一件ずつNA'sとして計上されているのが分かる。

物件一覧
価格(万円)敷地面積(m^2)駅からの距離(km)築年数(年)
3440611.423
4320600.16
4820991.220
3900821.425
3680630.825
NA711.81
58901011.43
5200NA0.715
480065NA0

NAは数値ではないので、NAを含むデータは平均などの数値計算は出来ない(計算結果もNAとなる)。

欠損値の扱い

  • NAが除去されたデータ <- na.omit(NAを含むデータ)
  • その他関数のオプションとして欠損値の扱いを指定できる場合がある。
    • rm.na…NAをその関数の処理内でのみ除去する
    • use=c("pairwise","complete")…欠損値除去を直接計算対象としているペア単位で行うか、関数に渡されたデータ全体で行うか
#99999という数値データのまま
data <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/house-prices-missingValue.csv", fileEncoding = "utf-8")
#欠損値処理
data.na <- read.csv("http://kyoto-edu.sakura.ne.jp/weblesson/statistics/data/house-prices-missingValue.csv", na.strings=c(99999), fileEncoding = "utf-8")

#欠損値をリストごと削除
data.omit <- na.omit(data.na)
summary(data.omit)

#priceのデータ数
length(data$price) #全データ
length(data.na$price) #全データ
length(na.omit(data.na$price)) #当該変数に登場する欠損値のみ除去
length(data.omit$price) #他項目で欠損値があればその行も除去(リスト全体)

#priceの平均値
mean(data$price) #無意味
mean(data.na$price) #エラー
mean(na.omit(data.na$price))  #当該変数に登場する欠損値のみ除去
mean(data.na$price,na.rm=TRUE)  #当該変数に登場する欠損値のみ除去
mean(data.omit$price)  #他項目で欠損値があればその行も除去(リスト全体)

#yearの平均値
mean(data$year) #全データ
mean(data.na$year) #全データ
mean(na.omit(data.na$year))  #全データ
mean(data.na$year,na.rm=TRUE)  #全データ
mean(data.omit$year)  #他項目で欠損値があればその行は除去(リスト全体)

#相関行列
cor(data) #無意味
cor(data.na) #エラー
cor(data.na,use="pairwise") #計算対象の相手に欠損値があればその行も除去(ペア単位)
cor(data.na,use="complete") #他項目で欠損値があればその行も除去(リスト全体)
cor(data.omit) #他項目で欠損値があればその行も除去(リスト全体)

各列個別に分析する

欠損値指定後
ABCD
11NA34
2NA234
312NA4
41234
51NA34
6123NA
na.omit(dat.na$~)
ABCD
11NA34
2NA234
312NA4
41234
51NA34
6123NA
data.omit
ABCD
1-NA--
2NA---
3--NA-
41234
5-NA--
6---NA

A,B,Cで一つの分析にかける。

pairewise A-B
ABCD
1-NA34
2NA-34
312NA4
41234
5-NA34
6123NA
pairewise B-C
ABCD
11NA-4
2NA234
31-NA4
41234
51NA-4
6123NA
pairewise C-A
ABCD
11NA34
2NA2-4
3-2NA4
41234
51NA34
6123NA
complete
ABCD
1-NA-4
2NA--4
3--NA4
41234
5-NA-4
6123NA
data.omit
ABCD
1-NA--
2NA---
3--NA-
41234
5-NA--
6---NA