Shapiro-Wilk 检验中国各省第三产业数据正态分布

在数据分析中,判断数据是否服从正态分布是一个常见且重要的步骤。尤其在许多统计方法和机器学习算法中,假设数据满足正态分布会带来更好的性能和结果。本文将介绍如何使用 Shapiro-Wilk 检验对中国各省第三产业数据进行正态分布检验,并对结果进行解释。

数据导入与准备

首先,我们需要导入包含中国各省第三产业数据的 Excel 文件。在本次分析中,我们使用名为“各省.xlsx”的文件,并选择第2到第7列的数据进行分析。

地  区第三产业批发和零售业交通运输、仓储和邮政业住宿和餐饮业金融业房地产业其他
北  京34894.33110.3879.2372.68196.72594.519741
天  津9999.31401.71061.1126.22197.31020.84192.2
河  北209103429.13013.3358.32931.82403.18774.4
山  西10461.31666.71198.5213.813591165.54857.8
内蒙古9263.11585.31317.9291.6981.7830.34256.3
辽  宁14621.72229.11367.6302.92138.31501.17082.7
吉  林6752.8785.5592.1163.31000.4706.73504.8
黑龙江7642.21294.3553.1210.11127.2695.13762.4
上  海33097.45068.51914.5330.58626.33619.213538.4
江  苏62027.513350.73655.61550.79689.97932.625848
浙  江42185.49404.22375.51223.666905019.717472.4
安  徽22943.34240.82171.7825.92935.12937.19832.7
福  建24955.56230.41960734.43889.82674.99466
江  西15263.72844.51341.7555.52140.52117.46264.1
山  东46122.311819.149111276.25203.14406.718506.2
河  南30062.24496.53721.11066.53301.3363113845.8
湖  北27507.63593.42313.91186.53639.73909.412864.7
湖  南24885.14787.11696.9951.52421.5282212206.1
广  东70934.712319.74040.91765.211825.810450.630532.5
广  西13092.52156.31098.3385.91834.71899.35718
海  南4089.5958.8371.9231.8438.75711517.3
重  庆15423.12816.71084567.724911668.66795.1
四  川29628.45132.11587.51180.13840.1344614442.6
贵  州10190.41582.2838.2449.41193.5863.15264
云  南14470.82990.71335.4653.11594.61633.66263.4
西  藏1147.8101.642.526.1215.492.9669.3
陕  西14264.22103.31293.8400.82109.71617.96738.7
甘  肃5741.2795.6555.6155925.1573.22736.7
青  海1644.2171.1155.234.6286.2144.9852.2
宁  夏2213218.8213.554.1352.2185.11189.3
新  疆7961784.4845.3135.91216.9575.54403
% 导入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 文件中,我们得到了如下结果:

210
310
410
510
610
710
结果解释
  • 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 下均不服从正态分布。希望本文对您的数据分析工作有所帮助。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值