matlab统计 频数、频率和累积频率
(2011-03-30 21:03:26)
function result = HistRate(x)
%  HistRate(x),统计数组 x 中的元素出现的频数、频率和累积频率,以表格形式显示在屏幕上.
%  x可以是数值型数组、字符串、字符型数组、字符串元胞数组和名义尺度数组。
%
%  result = HistRate(x),返回矩阵或元胞数组result,它是多行4列的矩阵或元胞数组,
四列分别对应取值、频数、频率、累积频率。当x是数值型数组时,result为矩阵;当x
是字符串、字符型数组、字符串元胞数组和名义尺度数组时,result为元胞数组。
%
用户还可参考tabulate函数,该函数比tabulate函数的效率高。

%  Copyright xiezhh2010.3.8
if isnumeric(x)
    x = x(:);
    x = x(~isnan(x));
    xid = [];
else
    [x,xid] = grp2idx(x);
    x = x(~isnan(x));
end
x = sort(x(:));    % 排序
m = length(x);
x1 = diff(x);    % 求差分
x1(end + 1) = 1;
x1 = find(x1);
CumFreq = x1/m;
value = x(x1);
x1 = [0; x1];
Freq1 = diff(x1);
Freq2 = Freq1/m;
if  nargout == 0
    if isempty(xid)
        fmt1 = 's  %8s  %6s    %6s\n';
        fmt2 = '  d        %6.2f%%    %6.2f%%\n';
        fprintf(1, fmt1, '取值', '频数', '频率', '累积频率');
        fprintf(1, fmt2, [value'; Freq1'; 100*Freq2'; 100*CumFreq']);
    else
        head = {'取值', '频数', '频率(%)', '累积频率(%)'};
        [head;xid,num2cell([Freq1, 100*Freq2, 100*CumFreq])]
    end
else
    if isempty(xid)
        result = [value Freq1 Freq2 CumFreq];
    else
        result = [xid,num2cell([Freq1, Freq2, CumFreq])];
    end
end


如何统计一个数组中各数字(元素)出现的频数、频率和累积频率?这里以案例形式做一个总结。
第一种方法:调用MATLAB自带的函数tabulate统计一个数组中各数字(元素)出现的频数、频率
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2  2  6  5  2  3  2  4  3  4  3  4  4  4  4  2  2
      6  0  4  7  2  5  8  3  1  3  2  5  3  6  2  3  5
      4  3  1  4  2  2  2  3  1  5  2  6  3  4  1  2  5];
>> tabulate(x(:))
  Value    Count   Percent
      0        1      1.96%
      1        4      7.84%
      2      14     27.45%
      3      10     19.61%
      4      10     19.61%
      5        6     11.76%
      6        4      7.84%
      7        1      1.96%
      8        1      1.96%
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']';
>> tabulate(x)
  Value    Count   Percent
      I        1      2.44%
      f        1      2.44%
      x        2      4.88%
      i        5     12.20%
      s        2      4.88%
      a        5     12.20%
      n        2      4.88%
      u        2      4.88%
      m        3      7.32%
      e        2      4.88%
      r        5     12.20%
      c        2      4.88%
      y        1      2.44%
      ,        1      2.44%
      T        1      2.44%
      A        1      2.44%
      B        1      2.44%
      L        1      2.44%
      E        1      2.44%
      t        1      2.44%
      .        1      2.44%
复制代码
【例3】统计字符型数组中各行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立';'王洪武';'王玉杰';'高纯静';'崔家峰';
        '叶鹏';'关泽满';'谢中华';'**';'孙乃喆';'崔家峰';'谢中华'];
>> tabulate(x)
  Value    Count   Percent
    崔家峰        3     21.43%
    孙乃喆        2     14.29%
    安立        1      7.14%
    王洪武        1      7.14%
    王玉杰        1      7.14%
    高纯静        1      7.14%
            1      7.14%
    关泽满        1      7.14%
    谢中华        2     14.29%
    **        1      7.14%
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'**';'孙乃喆';'崔家峰';'谢中华'};
>> tabulate(x)
  Value    Count   Percent
    崔家峰        3     21.43%
    孙乃喆        2     14.29%
    安立        1      7.14%
    王洪武        1      7.14%
    王玉杰        1      7.14%
    高纯静        1      7.14%
     叶鹏        1      7.14%
    关泽满        1      7.14%
    谢中华        2     14.29%
    **        1      7.14%
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> tabulate(species)
      Value    Count   Percent
      setosa      50     33.33%
  versicolor      50     33.33%
   virginica      50     33.33%
复制代码
第二种方法:自编效率更高的函数HistRate(代码如下),调用HistRate函数统计一个数组中各数字(元素)出现的频数、频率和累积频率。
函数HistRate的代码:
function result = HistRate(x)
%   HistRate(x),统计数组 x 中的元素出现的频数、频率和累积频率,以表格形式显示在屏幕上.
%   x可以是数值型数组、字符串、字符型数组、字符串元胞数组和名义尺度数组。
%
%   result = HistRate(x),返回矩阵或元胞数组result,它是多行4列的矩阵或元胞数组,
%   四列分别对应取值、频数、频率、累积频率。当x是数值型数组时,result为矩阵;当x
%   是字符串、字符型数组、字符串元胞数组和名义尺度数组时,result为元胞数组。
%
%   用户还可参考tabulate函数,该函数比tabulate函数的效率高。
%   
%   Copyright xiezhh2010.3.8
if isnumeric(x)
    x = x(:);
    x = x(~isnan(x));
    xid = [];
else
    [x,xid] = grp2idx(x);
    x = x(~isnan(x));
end
x = sort(x(:));    % 排序
m = length(x);
x1 = diff(x);    % 求差分
x1(end + 1) = 1;
x1 = find(x1);
CumFreq = x1/m;
value = x(x1);
x1 = [0; x1];
Freq1 = diff(x1);
Freq2 = Freq1/m;
if  nargout == 0
    if isempty(xid)
        fmt1 = 's   %8s   %6s    %6s\n';
        fmt2 = '  d          %6.2f%%     %6.2f%%\n';
        fprintf(1, fmt1, '取值', '频数', '频率', '累积频率');
        fprintf(1, fmt2, [value'; Freq1'; 100*Freq2'; 100*CumFreq']);
    else
        head = {'取值', '频数', '频率(%)', '累积频率(%)'};
        [head;xid,num2cell([Freq1, 100*Freq2, 100*CumFreq])]
    end
else
    if isempty(xid)
        result = [value Freq1 Freq2 CumFreq];
    else
        result = [xid,num2cell([Freq1, Freq2, CumFreq])];
    end
end
复制代码
【例1】统计数值型数组中各元素出现的频数、频率。
>> x = [2  2  6  5  2  3  2  4  3  4  3  4  4  4  4  2  2
      6  0  4  7  2  5  8  3  1  3  2  5  3  6  2  3  5
      4  3  1  4  2  2  2  3  1  5  2  6  3  4  1  2  5];
>> HistRate(x)
         取值         频数       频率      累积频率
           0            1      1.96%      1.96%
           1            4      7.84%      9.80%
           2           14      27.45%      37.25%
           3           10      19.61%      56.86%
           4           10      19.61%      76.47%
           5            6      11.76%      88.24%
           6            4      7.84%      96.08%
           7            1      1.96%      98.04%
           8            1      1.96%     100.00%
复制代码
【例2】统计字符串中各字符出现的频数、频率。
>> x = ['If x is a numeric array, TABLE is a numeric matrix.']';
>> HistRate(x)
ans =
    '取值'    '频数'    '频率(%)'    '累积频率(%)'
    'I'      [   1]    [ 2.4390]    [     2.4390]
    'f'      [   1]    [ 2.4390]    [     4.8780]
    'x'      [   2]    [ 4.8780]    [     9.7561]
    'i'      [   5]    [12.1951]    [    21.9512]
    's'      [   2]    [ 4.8780]    [    26.8293]
    'a'      [   5]    [12.1951]    [    39.0244]
    'n'      [   2]    [ 4.8780]    [    43.9024]
    'u'      [   2]    [ 4.8780]    [    48.7805]
    'm'      [   3]    [ 7.3171]    [    56.0976]
    'e'      [   2]    [ 4.8780]    [    60.9756]
    'r'      [   5]    [12.1951]    [    73.1707]
    'c'      [   2]    [ 4.8780]    [    78.0488]
    'y'      [   1]    [ 2.4390]    [    80.4878]
    ','      [   1]    [ 2.4390]    [    82.9268]
    'T'      [   1]    [ 2.4390]    [    85.3659]
    'A'      [   1]    [ 2.4390]    [    87.8049]
    'B'      [   1]    [ 2.4390]    [    90.2439]
    'L'      [   1]    [ 2.4390]    [    92.6829]
    'E'      [   1]    [ 2.4390]    [    95.1220]
    't'      [   1]    [ 2.4390]    [    97.5610]
    '.'      [   1]    [ 2.4390]    [        100]
复制代码

行元素出现的频数、频率。
>> x = ['崔家峰';'孙乃喆';'安立';'王洪武';'王玉杰';'高纯静';'崔家峰';
        '叶鹏';'关泽满';'谢中华';'**';'孙乃喆frequency函数计算频数';'崔家峰';'谢中华'];
>> HistRate(x)
ans =
    '取值'      '频数'    '频率(%)'    '累积频率(%)'
    '崔家峰'    [   3]    [21.4286]    [    21.4286]
    '孙乃喆'    [   2]    [14.2857]    [    35.7143]
    '安立'    [   1]    [ 7.1429]    [    42.8571]
    '王洪武'    [   1]    [ 7.1429]    [         50]
    '王玉杰'    [   1]    [ 7.1429]    [    57.1429]
    '高纯静'    [   1]    [ 7.1429]    [    64.2857]
    ' '     [   1]    [ 7.1429]    [    71.4286]
    '关泽满'    [   1]    [ 7.1429]    [    78.5714]
    '谢中华'    [   2]    [14.2857]    [    92.8571]
    '**'    [   1]    [ 7.1429]    [        100]
复制代码
【例4】统计字符串元胞数组中各字符串出现的频数、频率。
>> x = {'崔家峰';'孙乃喆';'安立';'王洪武';'王玉杰';'高纯静';'崔家峰';
'叶鹏';'关泽满';'谢中华';'**';'孙乃喆';'崔家峰';'谢中华'};
>> HistRate(x)
ans =
    '取值'      '频数'    '频率(%)'    '累积频率(%)'
    '崔家峰'    [   3]    [21.4286]    [    21.4286]
    '孙乃喆'    [   2]    [14.2857]    [    35.7143]
    '安立'    [   1]    [ 7.1429]    [    42.8571]
    '王洪武'    [   1]    [ 7.1429]    [         50]
    '王玉杰'    [   1]    [ 7.1429]    [    57.1429]
    '高纯静'    [   1]    [ 7.1429]    [    64.2857]
    '叶鹏'      [   1]    [ 7.1429]    [    71.4286]
    '关泽满'    [   1]    [ 7.1429]    [    78.5714]
    '谢中华'    [   2]    [14.2857]    [    92.8571]
    '**'    [   1]    [ 7.1429]    [        100]
复制代码
【例5】统计名义尺度(如性别,职业,产品型号等)数组中各元素出现的频数、频率。
>> load fisheriris
>> species = nominal(species);
>> HistRate(species)
ans =
    '取值'          '频数'    '频率(%)'    '累积频率(%)'
    'setosa'        [  50]    [33.3333]    [    33.3333]
    'versicolor'    [  50]    [33.3333]    [    66.6667]
    'virginica'     [  50]    [33.3333]    [        100]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。