Big-data-analytics-statistical-methods
ビッグデータ分析-統計的手法
データを分析するとき、統計的アプローチをとることができます。 基本的な分析を実行するために必要な基本的なツールは-
- 相関分析
- 分散分析
- 仮説検定
大規模なデータセットを使用する場合、これらの方法は相関分析を除いて計算集約的ではないため、問題はありません。 この場合、サンプルを取得することは常に可能であり、結果は堅牢である必要があります。
相関分析
相関分析は、数値変数間の線形関係を見つけようとします。 これはさまざまな状況で使用できます。 一般的な用途の1つは、探索的データ分析です。本のセクション16.0.2には、このアプローチの基本的な例があります。 まず、前述の例で使用される相関メトリックは、*ピアソン係数*に基づいています。 ただし、異常値の影響を受けない相関の別の興味深いメトリックがあります。 このメトリックは、スピアマン相関と呼ばれます。
- スピアマン相関*メトリックは、ピアソン法よりも外れ値の存在に対してロバストであり、データが正規分布していない場合の数値変数間の線形関係の推定値を向上させます。
library(ggplot2)
# Select variables that are interesting to compare pearson and spearman
correlation methods.
x = diamonds[, c('x', 'y', 'z', 'price')]
# From the histograms we can expect differences in the correlations of both
metrics.
# In this case as the variables are clearly not normally distributed, the
spearman correlation
# is a better estimate of the linear relation among numeric variables.
par(mfrow = c(2,2))
colnm = names(x)
for(i in 1:4) {
hist(x[[i]], col = 'deepskyblue3', main = sprintf('Histogram of %s', colnm[i]))
}
par(mfrow = c(1,1))
次の図のヒストグラムから、両方のメトリックの相関関係の違いを予測できます。 この場合、変数は明らかに正規分布していないため、スピアマン相関は数値変数間の線形関係のより良い推定値です。
Rの相関を計算するには、このコードセクションがある bda/part2/statistical_methods/correlation/correlation.R ファイルを開きます。
## Correlation Matrix - Pearson and spearman
cor_pearson <- cor(x, method = 'pearson')
cor_spearman <- cor(x, method = 'spearman')
### Pearson Correlation
print(cor_pearson)
# x y z price
# x 1.0000000 0.9747015 0.9707718 0.8844352
# y 0.9747015 1.0000000 0.9520057 0.8654209
# z 0.9707718 0.9520057 1.0000000 0.8612494
# price 0.8844352 0.8654209 0.8612494 1.0000000
### Spearman Correlation
print(cor_spearman)
# x y z price
# x 1.0000000 0.9978949 0.9873553 0.9631961
# y 0.9978949 1.0000000 0.9870675 0.9627188
# z 0.9873553 0.9870675 1.0000000 0.9572323
# price 0.9631961 0.9627188 0.9572323 1.0000000
カイ二乗検定
カイ2乗検定では、2つの確率変数が独立しているかどうかをテストできます。 これは、各変数の確率分布が他の変数に影響を与えないことを意味します。 Rでテストを評価するには、最初に分割表を作成し、次にテーブルを chisq.test R 関数に渡す必要があります。
たとえば、変数間に関連があるかどうかを確認しましょう:ダイヤモンドデータセットのカットと色。 テストは次のように正式に定義されています-
- H0:可変カットとダイヤモンドは独立しています
- H1:可変カットとダイヤモンドは独立していません
名前によってこれら2つの変数間に関係があると仮定しますが、テストはこの結果がどれほど重要であるかを示す客観的な「ルール」を与えることができます。
次のコードスニペットでは、テストのp値が2.2e-16であることがわかりました。これは実際的にはほぼゼロです。 次に、モンテカルロシミュレーション*を実行してテストを実行した後、p値は0.0004998であり、しきい値0.05よりもかなり低いことがわかりました。 この結果は、帰無仮説(H0)を棄却することを意味するため、変数 *cut と color は独立していないと考えられます。
library(ggplot2)
# Use the table function to compute the contingency table
tbl = table(diamonds$cut, diamonds$color)
tbl
# D E F G H I J
# Fair 163 224 312 314 303 175 119
# Good 662 933 909 871 702 522 307
# Very Good 1513 2400 2164 2299 1824 1204 678
# Premium 1603 2337 2331 2924 2360 1428 808
# Ideal 2834 3903 3826 4884 3115 2093 896
# In order to run the test we just use the chisq.test function.
chisq.test(tbl)
# Pearson’s Chi-squared test
# data: tbl
# X-squared = 310.32, df = 24, p-value < 2.2e-16
# It is also possible to compute the p-values using a monte-carlo simulation
# It's needed to add the simulate.p.value = TRUE flag and the amount of
simulations
chisq.test(tbl, simulate.p.value = TRUE, B = 2000)
# Pearson’s Chi-squared test with simulated p-value (based on 2000 replicates)
# data: tbl
# X-squared = 310.32, df = NA, p-value = 0.0004998
T検定
*t-test* の考え方は、名義変数の異なるグループ間で数値変数の分布に違いがあるかどうかを評価することです。 これを実証するために、因子変数カットの公正レベルと理想レベルのレベルを選択し、それら2つのグループ間で数値変数の値を比較します。
data = diamonds[diamonds$cut %in% c('Fair', 'Ideal'), ]
data$cut = droplevels.factor(data$cut) # Drop levels that aren’t used from the
cut variable
df1 = data[, c('cut', 'price')]
# We can see the price means are different for each group
tapply(df1$price, df1$cut, mean)
# Fair Ideal
# 4358.758 3457.542
t検定は、 t.test 関数を使用してRに実装されています。 t.testへの式インターフェースは、それを使用する最も簡単な方法です。アイデアは、数値変数はグループ変数によって説明されるということです。
例:* t.test(numeric_variable〜group_variable、data = data)。 前の例では、 *numeric_variable は price で、 group_variable は cut です。
統計的な観点から、数値変数の分布に2つのグループの違いがあるかどうかをテストしています。 正式には、仮説検定は帰無仮説(H0)と対立仮説(H1)で記述されます。
- H0:公正および理想グループ間で価格変数の分布に違いはありません
- H1公正なグループと理想的なグループの間で価格変数の分布に違いがある
以下は、次のコードでRに実装することができます-
t.test(price ~ cut, data = data)
# Welch Two Sample t-test
#
# data: price by cut
# t = 9.7484, df = 1894.8, p-value < 2.2e-16
# alternative hypothesis: true difference in means is not equal to 0
# 95 percent confidence interval:
# 719.9065 1082.5251
# sample estimates:
# mean in group Fair mean in group Ideal
# 4358.758 3457.542
# Another way to validate the previous results is to just plot the
distributions using a box-plot
plot(price ~ cut, data = data, ylim = c(0,12000),
col = 'deepskyblue3')
p値が0.05未満かどうかを確認することで、テスト結果を分析できます。 この場合、対立仮説を維持します。 これは、カットファクターの2つのレベル間で価格の違いが見つかったことを意味します。 レベルの名前では、この結果を期待していましたが、Failグループの平均価格がIdealグループの平均価格よりも高いとは予想していませんでした。 これは、各因子の平均を比較することで確認できます。
*plot* コマンドは、価格とカット変数の関係を示すグラフを作成します。 それは箱ひげ図です。このプロットはセクション16.0.1で説明しましたが、基本的には分析している2つのカットレベルの価格変数の分布を示しています。
分散分析
分散分析(ANOVA)は、各グループの平均と分散を比較することにより、グループ分布間の差異を分析するために使用される統計モデルです。モデルはRonald Fisherによって開発されました。 ANOVAは、いくつかのグループの平均が等しいかどうかの統計的検定を提供するため、t検定を3つ以上のグループに一般化します。
ANOVAは、複数の2サンプルt検定を実行すると統計タイプIエラーが発生する可能性が高くなるため、3つ以上のグループの統計的有意性を比較するのに役立ちます。
数学的な説明を提供するという点で、テストを理解するには以下が必要です。
x〜ij〜= x (x〜i〜-x)(x〜ij〜-x)
これは、次のモデルにつながります-
x〜ij〜=μ+α〜i〜+ε〜ij〜
ここで、μは総平均、α〜i〜_はi番目のグループ平均です。 エラー項∈〜ij〜_は、正規分布からiidであると仮定されます。 テストの帰無仮説は次のとおりです-
α〜1〜=α〜2〜=…=α〜k〜
検定統計量の計算に関しては、2つの値を計算する必要があります-
- グループ間の差の平方和-
SSD_B = \ sum _ \ {i} ^ \ {k} \ sum _ \ {j} ^ \ {n}(\ bar \ {x _ \ {\ bar \ {i}}}-\ bar \ {x}) ^ 2
*グループ内の平方和
SSD_W = \ sum _ \ {i} ^ \ {k} \ sum _ \ {j} ^ \ {n}(\ bar \ {x _ \ {\ bar \ {ij}}}-\ bar \ {x _ \ { \ bar \ {i}}})^ 2
ここで、SSD〜B〜はk-1の自由度を持ち、SSD〜W〜はN-kの自由度を持ちます。 次に、各メトリックの平均平方差を定義できます。
MS〜B〜= SSD〜B〜/(k-1)
MS〜w〜= SSD〜w〜/(N-k)
最後に、ANOVAの検定統計量は、上記の2つの量の比率として定義されます
F = MS〜B〜/MS〜w〜
_k-1_および_N-k_の自由度を持つF分布に従います。 帰無仮説が真の場合、Fは1に近い可能性があります。 そうでない場合、グループ間平均二乗MSBは大きくなる可能性が高く、その結果、F値が大きくなります。
基本的に、ANOVAは合計分散の2つのソースを調べ、どの部分がより寄与しているのかを確認します。 グループ平均を比較することを目的としていますが、これが分散分析と呼ばれる理由です。
統計の計算に関しては、実際にはRで行うのはかなり簡単です。 次の例は、その方法を示し、結果をプロットします。
library(ggplot2)
# We will be using the mtcars dataset
head(mtcars)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
# Let's see if there are differences between the groups of cyl in the mpg variable.
data = mtcars[, c('mpg', 'cyl')]
fit = lm(mpg ~ cyl, data = mtcars)
anova(fit)
# Analysis of Variance Table
# Response: mpg
# Df Sum Sq Mean Sq F value Pr(>F)
# cyl 1 817.71 817.71 79.561 6.113e-10* * *
# Residuals 30 308.33 10.28
# Signif. codes: 0* * *0.001* *0.01* 0.05 .
# Plot the distribution
plot(mpg ~ as.factor(cyl), data = mtcars, col = 'deepskyblue3')
コードは次の出力を生成します-
この例で取得するp値は0.05より大幅に小さいため、Rはこれを示すために記号「*」を返します。 これは、帰無仮説を棄却し、 cyl 変数の異なるグループ間でmpg平均の差を見つけることを意味します。