photo by Steve Webel
久しぶりにmatlabネタ。
今朝の新聞にジニ係数についての記事がありました。結構簡単な数式で求まるみたいですね。
今日はmatlabをつかってジニ係数を求めてみます。
ソースコード
%ジニ係数を求めるプログラム
%Aは一人一人の所得が格納されているベクトル。
n=length(A);
average=sum(A)/n;A2=repmat(A,n);%Aベクトルをn行分複製する。A2はn×nの行列になる。
B=zeros(n,n);for j=2:n-1
B(j,:)=horzcat(A(1,n-j+1:1:n),A(1,1:n-j)); % A1,A2...AnをAn,A1,...,An-1 に入れ替え。
end
B(1,:)=horzcat(A(1,n),A(1,1:n-1));
B(n,:)=A;C=abs(B-A);
D=sum(sum(C))/n^2; %これが平均差。gini=D/(average*2);
disp(gini);
平均差を求めるところを工夫しました。for文を多用してもできますが、Aのサイズが大きくなると計算にかなり時間がかかると思うので。(n^2回とn回の差。n=10ならその差は1024-10=1014回!)