何をする?

dplyrの解説について調べていると、lm()やbline()、plot()nなどの長らく使っていない関数が説明されていました。

なつかしいので、baseの関数を含めて、簡単な集計の仕方を復習します。 R初心者向けの説明です。

I.データのロード

試験結果のサンプルを取得します。

# ライブラリのインポート
library(tidyverse) # アンブレラ・ライブラリ
# rawのCSVのURLで取得
df = read_csv("https://pastebin.com/raw/nWkAe1qR")
# はじめの6行を取得
head(df)
## # A tibble: 6 x 7
##      id english japanese nationality department  year gender
##   <dbl>   <dbl>    <dbl> <chr>       <chr>      <dbl> <chr> 
## 1     1    17.8     75.6 japanese    literature     1 male  
## 2     2    64.4     53.3 nepal       literature     1 male  
## 3     3    86.7     31.1 nepal       literature     1 male  
## 4     4    60       62.2 indonesia   literature     1 male  
## 5     5    42.2     80   japanese    literature     1 male  
## 6     6    33.3     75.6 japanese    literature     1 male

注意する点

  1. tidyverseは、複数のライブリを集めたものです。read_csvを使って、URLでデータをtibble(データ・フレーム)として取得していますが、これは、tidyverseに含まれるreadrの関数です。

  2. 表示する行を指定することができます。例えば、先頭の10行表示したい場合は、head(df, 10)を実行します。

II.英語と日本語の得点の関係

英語の点数の高い学生は日本語の得点も高いと思いますか?関係ないと思いますか?

これを確かめる一つの方法は、平面に得点を配置して、すべての得点にもっとも近くなる直線を描いて、その傾きを算出することです。

一本の直線だけで両者の関係を表現するのですから、かなり無理やりですが、直線の傾きは一つの数値ですから他と簡単に比較できる利点があります。

スクリプトの説明は次にあります。

A quick and easy function to plot lm() results with ggplot2 in R

英語の得点と日本語の関係を要約します。

fit1 <- lm(english ~ japanese, data = df)
summary(fit1)
## 
## Call:
## lm(formula = english ~ japanese, data = df)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -27.426 -14.126  -4.737  11.068  50.153 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 44.67466    5.03649   8.870 4.31e-16 ***
## japanese    -0.02748    0.07678  -0.358    0.721    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 18.07 on 198 degrees of freedom
## Multiple R-squared:  0.0006466,  Adjusted R-squared:  -0.004401 
## F-statistic: 0.1281 on 1 and 198 DF,  p-value: 0.7208

散布図を描き、回帰直線を加えます。

plot(english ~ japanese, data = df)
abline(fit1)

相関を調べる場合、まず、グラフを描きます。

数学、英語それぞれのデータはヒストグラム、2変数以上は散布図を作成するのが原則です。

英語のヒストグラム

hist(df$english)

日本語のヒストグラム

hist(df$japanese)

英語は低いところによっています。数値で確認します。

summary(df$english)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   15.60   28.90   37.80   42.93   53.30   93.30

日本語は比較的高いですが、山が2つあります。

数値で確認します。

summary(df$japanese)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   20.00   53.30   64.40   63.45   75.60   91.10

これまでで、次のことがわかります。

  1. 英語もに日本語も正規分布からかなり離れている。

  2. 正規分布から離れているので、ピアソンの相関係数は用いられない。

  3. 散布図から英語の得点が高ければ日本語の得点も高い、あるいはその逆である関係はなさそうだ。

学力試験は正規分布(ベルの形の分布)することが知られています。つまり、平均点あたりの得点の人数が多く、高得点あるいは低い得点になるほど人数が少なくなるはずです、、、なぜそうなるかは不明ですが。

英語は問題が難しかったために低い点数にかたよったと考えるとしても、日本語は正規分布と形が異なっています。

この試験の点数が正規分布しない理由には次が考えられます。

  1. 受験者数が少なすぎる。例えば、全国の大学1年生が受験していれば正規分布していたはずだ。

  2. 受験者が偏っている。特定の傾向を持つグループを対象にしている。

  3. 問題が不適切なために得点が学力を反映していない。

  4. 英語や国語の学力は正規分布しない。この大発見の可能せは低いです。

  5. そのほか?

このデータは、大学で実施された1年生の学力試験のデータをもとにしています。そもそも、学校で、あるいは、クラスで試験をして、正規分布になることは多くないです。学校ごと、クラスごとの試験で偏差値を出さないのはこのためです。

このサンプルデータの場合は、1、2、3の理由で正規分布からはずれたと考えられます。中でも大きいのは2のサンプリングの偏りです。

データをよくみれば、留学生が入っています。国籍別の人数をだします。

table(df$nationality)
## 
##     china indonesia  japanese     nepal   vietnam 
##        12         3       135        26        24

特に習いはじめたところだと、母語によって日本語の習熟度がはっきり異なりますので、当然偏りがででます。まして、日本語を母語とする学生といっしょにする正規分布することはありません。

留学生が多い場合、問題の種類別配点の違い、たとえば、漢字、読解、文法、それぞれの配点が総得点に大きく影響します。このため、配点が不適切であると試験問題が学力を適切に測っていないことになります。

実は、この問題の種類別配点の問題は、日本語母語者だけの試験の場合も同様に生じます。ですから、学力を適切に測るためには、問題の種類別に適切な配点にする必要があると思いますが、これについては別に論じたいと思います。

To be continued.