R(R言語)で、外れ値を考える(相関係数(ピアソン)、散布図、外れ値の除去・削除、相関係数の再確認、順位相関係数(ケンドール、スピアマン)

Rコード

#
# R(R言語)で、外れ値を考える
#




#
# 使用するデータと解説は、『実践形式で学ぶ SPSSとAmosによる心理・調査データ解析』
# Exercise 1 p.2~9
#




#
# 書籍通りに従うと、
# 相関係数(ピアソン)、散布図、外れ値の除去・削除、相関係数の再確認、
# 順位相関係数(ケンドール、スピアマン) の順
#




#
# 研究テーマと分析の背景
#
# "自分で自分を知的だと思うことと、友人にそう思われることとの間には、
# どれくらい関連があるだろうか"
#
# そこで、大学生20名に対し、自分自身の知性を1点(まったく知的ではないと思う場合)、
# 9点(非常に知的であると思う場合)までの選択肢で尋ねた。
# 次に、彼らの最も親しい同性の友人に対し、「この人がどれくらい知的であると思うか」を、
# 同様に1点から9点までの得点範囲で尋ねた。
#




# 使用するデータ
ID_vec <- c(1:20)

自己評定_vec <- c(3, 2, 4, 3, 3, 4, 4, 3, 6, 5,
                1, 3, 2, 4, 4, 5, 4, 9, 4, 8)

友人評定_vec <- c(3, 5, 5, 3, 5, 5, 2, 6, 4, 3,
                3, 2, 4, 3, 4, 6, 5, 9, 3, 4)

df1 <- data.frame(ID = ID_vec,
                自己評定 = 自己評定_vec,
                友人評定 = 友人評定_vec)

df1




summary(df1)




# 記述統計量(要約統計量, 基本統計量)
#
# 自己評定
round(mean(df1$自己評定), 2)
round(sd(df1$自己評定), 3) # 不偏標準偏差でいい
round(sd(df1$自己評定), 2) #
length(df1$自己評定)

# 友人評定
round(mean(df1$友人評定), 2)
round(sd(df1$友人評定), 3) # 不偏標準偏差でいい
round(sd(df1$友人評定), 2) #
length(df1$友人評定)




# 相関係数と検定(ピアソン)
round(cor(df1$自己評定, df1$友人評定), 3)
round(cor(df1$自己評定, df1$友人評定), 2)
cor.test(df1$自己評定, df1$友人評定)




#
# 結論
# 知性の自己評定の平均値は4.05(SD 1.91)、友人評定の平均値は4.20(SD 1.64)であった。
# 自己評定と友人評定の相関係数は、r = 0.47であり、5%水準で有意であった。
# したがって、"自分で自分を知的だと思うことと、友人にそう思われることとの間には、
# どれくらい関連があるだろうか" にはある程度の関連があると考えられる。
#
# ((R(R言語)の四捨五入について) "平均値は4.05(SD 1.91)"としたが、
# 1.9という"四捨五捨"になる。
# 参考Webサイト http://www.okadajp.org/RWiki/?JIS%2CISO式四捨五入 )
#




#
# だが、しかし...
#
# 以下、検討する
#




# 散布図
# ggplot2
library("ggplot2")
theme_set(theme_grey(base_family = "Osaka"))

ggplot(df1, aes(x = 自己評定, y = 友人評定)) +
    geom_point() +
    geom_text(aes(label = ID), size = 4, hjust = -1) +
    annotate("text", x = 5, y = 10,
            label = "数字はID", family = "Osaka", colour = "steelblue", size = 10) # ここでまたfamiliyでフォントを指定しないと日本語が文字化けする
# 散布図を見ると、
# ID18は外れ値ではないだろうか。
#




# ID18が外れ値だとして、除外して相関係数を算出
#
# df1からID18を削除したデータフレームを作成する。
df2 <- df1[-18, ] # df1の18行目を削除するコード
df2
# ちょっとした確認 属性等を見てみる
attributes(df2)
class(df2)
str(df2)




# 相関係数(ピアソン)
cor.test(df2$自己評定, df2$友人評定)
# r = 0.08が算出され、これで有意ではなくなったことがわかる。
#
# ID18を外れ値であるとみなしてよいと思われる。
#




#
# 外れ値がある場合や正規分布からの逸脱がみられる場合、
# ピアソンの積率相関係数は、それらに大きな影響を受けてしまう。
#
# そこで、順位相関係数を算出する手段もある。
#




# 順位相関係数 ケンドールとスピアマン
#
# df1 (外れ値があるままのデータフレームでいい)
cor.test(df1$自己評定, df1$友人評定, method = "kendall")
cor.test(df1$自己評定, df1$友人評定, method = "spearman")
# いずれも有意な相関係数ではない。
#




#
# 他の可能性
# ID18が外れ値とはいえ、1点から9点までの範囲で測定されている。
# 測定範囲内に収まっているのである。
# もしかすると、今回のデータは、ID18を除いて、偶然に自己・友人評定の低い人ばかりを
# 調査対象としてしまったのかもしれない。
# 解決策の1つとしては、もっと多くの人を調査対象とすることである。
# また、評定を1項目ではなく、複数の質問項目で尋ねることで、
# 偶然に生じる誤差を低めることができる。
# さらに、質問内容を工夫することも考えたほうがよい。
#

R Console

> #
> # R(R言語)で、外れ値を考える
> #
> 
> 
> 
> 
> #
> # 使用するデータと解説は、『実践形式で学ぶ SPSSとAmosによる心理・調査データ解析』
> # Exercise 1 p.2~9
> #
> 
> 
> 
> 
> #
> # 書籍通りに従うと、
> # 相関係数(ピアソン)、散布図、外れ値の除去・削除、相関係数の再確認、
> # 順位相関係数(ケンドール、スピアマン) の順
> #
> 
> 
> 
> 
> #
> # 研究テーマと分析の背景
> #
> # "自分で自分を知的だと思うことと、友人にそう思われることとの間には、
> # どれくらい関連があるだろうか"
> #
> # そこで、大学生20名に対し、自分自身の知性を1点(まったく知的ではないと思う場合)、
> # 9点(非常に知的であると思う場合)までの選択肢で尋ねた。
> # 次に、彼らの最も親しい同性の友人に対し、「この人がどれくらい知的であると思うか」を、
> # 同様に1点から9点までの得点範囲で尋ねた。
> #
> 
> 
> 
> 
> # 使用するデータ
> ID_vec <- c(1:20)
> 
> 自己評定_vec <- c(3, 2, 4, 3, 3, 4, 4, 3, 6, 5,
+                 1, 3, 2, 4, 4, 5, 4, 9, 4, 8)
> 
> 友人評定_vec <- c(3, 5, 5, 3, 5, 5, 2, 6, 4, 3,
+                 3, 2, 4, 3, 4, 6, 5, 9, 3, 4)
> 
> df1 <- data.frame(ID = ID_vec,
+                 自己評定 = 自己評定_vec,
+                 友人評定 = 友人評定_vec)
> 
> df1
   ID 自己評定 友人評定
1   1        3        3
2   2        2        5
3   3        4        5
4   4        3        3
5   5        3        5
6   6        4        5
7   7        4        2
8   8        3        6
9   9        6        4
10 10        5        3
11 11        1        3
12 12        3        2
13 13        2        4
14 14        4        3
15 15        4        4
16 16        5        6
17 17        4        5
18 18        9        9
19 19        4        3
20 20        8        4
> 
> 
> 
> 
> summary(df1)
       ID           自己評定       友人評定  
 Min.   : 1.00   Min.   :1.00   Min.   :2.0  
 1st Qu.: 5.75   1st Qu.:3.00   1st Qu.:3.0  
 Median :10.50   Median :4.00   Median :4.0  
 Mean   :10.50   Mean   :4.05   Mean   :4.2  
 3rd Qu.:15.25   3rd Qu.:4.25   3rd Qu.:5.0  
 Max.   :20.00   Max.   :9.00   Max.   :9.0  
> 
> 
> 
> 
> # 記述統計量(要約統計量, 基本統計量)
> #
> # 自己評定
> round(mean(df1$自己評定), 2)
[1] 4.05
> round(sd(df1$自己評定), 3) # 不偏標準偏差でいい
[1] 1.905
> round(sd(df1$自己評定), 2) #
[1] 1.9
> length(df1$自己評定)
[1] 20
> 
> # 友人評定
> round(mean(df1$友人評定), 2)
[1] 4.2
> round(sd(df1$友人評定), 3) # 不偏標準偏差でいい
[1] 1.642
> round(sd(df1$友人評定), 2) #
[1] 1.64
> length(df1$友人評定)
[1] 20
> 
> 
> 
> 
> # 相関係数と検定(ピアソン)
> round(cor(df1$自己評定, df1$友人評定), 3)
[1] 0.468
> round(cor(df1$自己評定, df1$友人評定), 2)
[1] 0.47
> cor.test(df1$自己評定, df1$友人評定)

    Pearson's product-moment correlation

data:  df1$自己評定 and df1$友人評定
t = 2.2461, df = 18, p-value = 0.03749
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.03199201 0.75424317
sample estimates:
      cor 
0.4678888 

> 
> 
> 
> 
> #
> # 結論
> # 知性の自己評定の平均値は4.05(SD 1.91)、友人評定の平均値は4.20(SD 1.64)であった。
> # 自己評定と友人評定の相関係数は、r = 0.47であり、5%水準で有意であった。
> # したがって、"自分で自分を知的だと思うことと、友人にそう思われることとの間には、
> # どれくらい関連があるだろうか" にはある程度の関連があると考えられる。
> #
> # ((R(R言語)の四捨五入について) "平均値は4.05(SD 1.91)"としたが、
> # 1.9という"四捨五捨"になる。
> # 参考Webサイト http://www.okadajp.org/RWiki/?JIS%2CISO式四捨五入 )
> #
> 
> 
> 
> 
> #
> # だが、しかし...
> #
> # 以下、検討する
> #
> 
> 
> 
> 
> # 散布図
> # ggplot2
> library("ggplot2")
> theme_set(theme_grey(base_family = "Osaka"))
> 
> ggplot(df1, aes(x = 自己評定, y = 友人評定)) +
+     geom_point() +
+     geom_text(aes(label = ID), size = 4, hjust = -1) +
+     annotate("text", x = 5, y = 10,
+             label = "数字はID", family = "Osaka", colour = "steelblue", size = 10) # ここでまたfamiliyでフォントを指定しないと日本語が文字化けする
> # 散布図を見ると、
> # ID18は外れ値ではないだろうか。
> #
> 
> 
> 
> 
> # ID18が外れ値だとして、除外して相関係数を算出
> #
> # df1からID18を削除したデータフレームを作成する。
> df2 <- df1[-18, ] # df1の18行目を削除するコード
> df2
   ID 自己評定 友人評定
1   1        3        3
2   2        2        5
3   3        4        5
4   4        3        3
5   5        3        5
6   6        4        5
7   7        4        2
8   8        3        6
9   9        6        4
10 10        5        3
11 11        1        3
12 12        3        2
13 13        2        4
14 14        4        3
15 15        4        4
16 16        5        6
17 17        4        5
19 19        4        3
20 20        8        4
> # ちょっとした確認 属性等を見てみる
> attributes(df2)
$names
[1] "ID"       "自己評定" "友人評定"

$row.names
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 19 20

$class
[1] "data.frame"

> class(df2)
[1] "data.frame"
> str(df2)
'data.frame':  19 obs. of  3 variables:
 $ ID      : int  1 2 3 4 5 6 7 8 9 10 ...
 $ 自己評定: num  3 2 4 3 3 4 4 3 6 5 ...
 $ 友人評定: num  3 5 5 3 5 5 2 6 4 3 ...
> 
> 
> 
> 
> # 相関係数(ピアソン)
> cor.test(df2$自己評定, df2$友人評定)

    Pearson's product-moment correlation

data:  df2$自己評定 and df2$友人評定
t = 0.33839, df = 17, p-value = 0.7392
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.3867829  0.5168050
sample estimates:
       cor 
0.08179636 

> # r = 0.08が算出され、これで有意ではなくなったことがわかる。
> #
> # ID18を外れ値であるとみなしてよいと思われる。
> #
> 
> 
> 
> 
> #
> # 外れ値がある場合や正規分布からの逸脱がみられる場合、
> # ピアソンの積率相関係数は、それらに大きな影響を受けてしまう。
> #
> # そこで、順位相関係数を算出する手段もある。
> #
> 
> 
> 
> 
> # 順位相関係数 ケンドールとスピアマン
> #
> # df1 (外れ値があるままのデータフレームでいい)
> cor.test(df1$自己評定, df1$友人評定, method = "kendall")

    Kendall's rank correlation tau

data:  df1$自己評定 and df1$友人評定
z = 1.0018, p-value = 0.3164
alternative hypothesis: true tau is not equal to 0
sample estimates:
      tau 
0.1847134 

 警告メッセージ: 
 cor.test.default(df1$自己評定, df1$友人評定, method = "kendall"): 
   タイのため正確な p 値を計算することができません 
> cor.test(df1$自己評定, df1$友人評定, method = "spearman")

    Spearman's rank correlation rho

data:  df1$自己評定 and df1$友人評定
S = 1032.3, p-value = 0.3427
alternative hypothesis: true rho is not equal to 0
sample estimates:
     rho 
0.223859 

 警告メッセージ: 
 cor.test.default(df1$自己評定, df1$友人評定, method = "spearman"): 
   タイのため正確な p 値を計算することができません 
> # いずれも有意な相関係数ではない。
> #
> 
> 
> 
> 
> #
> # 他の可能性
> # ID18が外れ値とはいえ、1点から9点までの範囲で測定されている。
> # 測定範囲内に収まっているのである。
> # もしかすると、今回のデータは、ID18を除いて、偶然に自己・友人評定の低い人ばかりを
> # 調査対象としてしまったのかもしれない。
> # 解決策の1つとしては、もっと多くの人を調査対象とすることである。
> # また、評定を1項目ではなく、複数の質問項目で尋ねることで、
> # 偶然に生じる誤差を低めることができる。
> # さらに、質問内容を工夫することも考えたほうがよい。
> #

なお、ケンドールとスピアマンの警告メッセージは無視していい。

散布図のスクリーンショット

f:id:my_notes:20170713045334p:plain

参考文献

実践形式で学ぶSPSSとAmosによる心理・調査データ解析

実践形式で学ぶSPSSとAmosによる心理・調査データ解析