在数据分析中,判断数据是否服从正态分布是一个常见且重要的步骤。尤其在许多统计方法和机器学习算法中,假设数据满足正态分布会带来更好的性能和结果。本文将介绍如何使用 Shapiro-Wilk 检验对中国各省第三产业数据进行正态分布检验,并对结果进行解释。
数据导入与准备
首先,我们需要导入包含中国各省第三产业数据的 Excel 文件。在本次分析中,我们使用名为“各省.xlsx”的文件,并选择第2到第7列的数据进行分析。
地 区 | 第三产业 | 批发和零售业 | 交通运输、仓储和邮政业 | 住宿和餐饮业 | 金融业 | 房地产业 | 其他 |
北 京 | 34894.3 | 3110.3 | 879.2 | 372.6 | 8196.7 | 2594.5 | 19741 |
天 津 | 9999.3 | 1401.7 | 1061.1 | 126.2 | 2197.3 | 1020.8 | 4192.2 |
河 北 | 20910 | 3429.1 | 3013.3 | 358.3 | 2931.8 | 2403.1 | 8774.4 |
山 西 | 10461.3 | 1666.7 | 1198.5 | 213.8 | 1359 | 1165.5 | 4857.8 |
内蒙古 | 9263.1 | 1585.3 | 1317.9 | 291.6 | 981.7 | 830.3 | 4256.3 |
辽 宁 | 14621.7 | 2229.1 | 1367.6 | 302.9 | 2138.3 | 1501.1 | 7082.7 |
吉 林 | 6752.8 | 785.5 | 592.1 | 163.3 | 1000.4 | 706.7 | 3504.8 |
黑龙江 | 7642.2 | 1294.3 | 553.1 | 210.1 | 1127.2 | 695.1 | 3762.4 |
上 海 | 33097.4 | 5068.5 | 1914.5 | 330.5 | 8626.3 | 3619.2 | 13538.4 |
江 苏 | 62027.5 | 13350.7 | 3655.6 | 1550.7 | 9689.9 | 7932.6 | 25848 |
浙 江 | 42185.4 | 9404.2 | 2375.5 | 1223.6 | 6690 | 5019.7 | 17472.4 |
安 徽 | 22943.3 | 4240.8 | 2171.7 | 825.9 | 2935.1 | 2937.1 | 9832.7 |
福 建 | 24955.5 | 6230.4 | 1960 | 734.4 | 3889.8 | 2674.9 | 9466 |
江 西 | 15263.7 | 2844.5 | 1341.7 | 555.5 | 2140.5 | 2117.4 | 6264.1 |
山 东 | 46122.3 | 11819.1 | 4911 | 1276.2 | 5203.1 | 4406.7 | 18506.2 |
河 南 | 30062.2 | 4496.5 | 3721.1 | 1066.5 | 3301.3 | 3631 | 13845.8 |
湖 北 | 27507.6 | 3593.4 | 2313.9 | 1186.5 | 3639.7 | 3909.4 | 12864.7 |
湖 南 | 24885.1 | 4787.1 | 1696.9 | 951.5 | 2421.5 | 2822 | 12206.1 |
广 东 | 70934.7 | 12319.7 | 4040.9 | 1765.2 | 11825.8 | 10450.6 | 30532.5 |
广 西 | 13092.5 | 2156.3 | 1098.3 | 385.9 | 1834.7 | 1899.3 | 5718 |
海 南 | 4089.5 | 958.8 | 371.9 | 231.8 | 438.7 | 571 | 1517.3 |
重 庆 | 15423.1 | 2816.7 | 1084 | 567.7 | 2491 | 1668.6 | 6795.1 |
四 川 | 29628.4 | 5132.1 | 1587.5 | 1180.1 | 3840.1 | 3446 | 14442.6 |
贵 州 | 10190.4 | 1582.2 | 838.2 | 449.4 | 1193.5 | 863.1 | 5264 |
云 南 | 14470.8 | 2990.7 | 1335.4 | 653.1 | 1594.6 | 1633.6 | 6263.4 |
西 藏 | 1147.8 | 101.6 | 42.5 | 26.1 | 215.4 | 92.9 | 669.3 |
陕 西 | 14264.2 | 2103.3 | 1293.8 | 400.8 | 2109.7 | 1617.9 | 6738.7 |
甘 肃 | 5741.2 | 795.6 | 555.6 | 155 | 925.1 | 573.2 | 2736.7 |
青 海 | 1644.2 | 171.1 | 155.2 | 34.6 | 286.2 | 144.9 | 852.2 |
宁 夏 | 2213 | 218.8 | 213.5 | 54.1 | 352.2 | 185.1 | 1189.3 |
新 疆 | 7961 | 784.4 | 845.3 | 135.9 | 1216.9 | 575.5 | 4403 |
% 导入Excel数据
data = readtable('各省.xlsx');
% 提取第2到第7列的数据
data_subset = data{:, 2:7};
Shapiro-Wilk 检验函数实现
MATLAB 自带的统计和机器学习工具箱中并没有直接实现 Shapiro-Wilk 检验的函数,因此我们需要自定义一个 swtest
函数。以下是 swtest.m
的实现:
function [h, pValue, W] = swtest(x, alpha)
% Shapiro-Wilk Normality Test
% x - data vector
% alpha - significance level (default 0.05)
if nargin < 2
alpha = 0.05;
end
% Remove missing values
x = x(~isnan(x));
% Check if the data is a vector
if ~isvector(x)
error('Input must be a vector');
end
x = sort(x);
n = length(x);
if n < 3 || n > 5000
error('Sample size must be between 3 and 5000');
end
% Mean and standard deviation
m = mean(x);
s = std(x);
% Calculate the coefficients for the test
a = zeros(n, 1);
for i = 1:n
a(i) = norminv((i - 0.375) / (n + 0.25));
end
a = a / sqrt(sum(a.^2));
% Calculate W statistic
W = (sum(a .* (x - m)))^2 / sum((x - m).^2);
% Approximate p-value (using an approximation for small sample sizes)
if n <= 11
mu = -2.273 + 0.459 * n;
sigma = exp(0.631 - 0.043 * n);
gamma = -2.706056;
beta = 4.434685;
delta = -2.071190;
else
mu = 0;
sigma = 1;
gamma = -2.706056;
beta = 4.434685;
delta = -2.071190;
end
lnW = log(1 - W);
z = (lnW - mu) / sigma;
pValue = 1 - normcdf(gamma * z + beta * z^2 + delta * z^3);
% Test decision
h = (pValue < alpha);
end
function p = norminv(p, mu, sigma)
if nargin < 2
mu = 0;
end
if nargin < 3
sigma = 1;
end
p = -sqrt(2) * erfcinv(2 * p) * sigma + mu;
end
function p = normcdf(x, mu, sigma)
if nargin < 2
mu = 0;
end
if nargin < 3
sigma = 1;
end
p = 0.5 * erfc(-(x - mu) / (sigma * sqrt(2)));
end
进行 Shapiro-Wilk 检验
接下来,我们对每一列数据进行 Shapiro-Wilk 检验,并将结果存储在新的 Excel 文件中。
% 初始化结果存储
p_values = zeros(size(data_subset, 2), 1);
h_values = zeros(size(data_subset, 2), 1);
% 对每一列进行Shapiro-Wilk检验
for i = 1:size(data_subset, 2)
[h_values(i), p_values(i)] = swtest(data_subset(:, i));
end
% 创建一个表格存储结果
results = table((2:7)', h_values, p_values, 'VariableNames', {'Column', 'H_Value', 'P_Value'});
% 将结果写入新的Excel文件
writetable(results, 'shapiro_wilk_results.xlsx');
结果解读
在新的 Excel 文件中,我们得到了如下结果:
2 | 1 | 0 |
3 | 1 | 0 |
4 | 1 | 0 |
5 | 1 | 0 |
6 | 1 | 0 |
7 | 1 | 0 |
结果解释
- Column:表示进行检验的列编号,即数据集中的第2到第7列。
- H_Value:检验结果的决策变量。H = 1 表示拒绝原假设(数据不服从正态分布),H = 0 表示不拒绝原假设(数据服从正态分布)。
- P_Value:p 值,表示在原假设(数据服从正态分布)为真的情况下,观测到当前统计量的概率。如果 p 值小于设定的显著性水平(通常为 0.05),则拒绝原假设。
从结果中可以看出:
- 所有列(第2到第7列)的 H_Value 都为 1,表示在显著性水平 0.05 下,所有列的数据都拒绝了原假设,即所有列的数据都不服从正态分布。
- 所有列的 P_Value 都为 0,表示在假设数据服从正态分布的前提下,观测到当前数据的概率几乎为 0。由于 p 值小于 0.05,进一步支持拒绝原假设的结论。
总之,这些结果表明数据集中第2到第7列的数据在显著性水平 0.05 下都不服从正态分布。
总结
通过本文的介绍和代码示例,我们成功地使用 Shapiro-Wilk 检验对中国各省第三产业数据的正态分布进行了检验。结果表明,所有列的数据在显著性水平 0.05 下均不服从正态分布。希望本文对您的数据分析工作有所帮助。