Last updated: May 2011. Kajiyama                    [ 目次に戻る ]

線形への変換


  1. 非線形のデータ分布は直線関係に変換できる

    曲線の分布を持つデータは,片対数方眼紙や両対数方眼紙に,データをプロットすると直線関係を持つ分布になるものがある.

    この場合は,線形の回帰分析が利用できる.

    分布が累乗モデル・指数モデル・対数モデルのケースではこれを直線関係に変換して回帰分析を,以前行っていた.


    [1] 累乗モデル(べき乗モデル) Y= a Xb   [Y ~ a * X ^ b]  ただしx≠0.
    
    log Y = log(a Xb) = log(a) +b log X に変形しパラメータabを求める.
    
    2変数YXは曲線関係であるが,これを対数にすると[log Y]と[log X]は切片と傾きを持つ直線関係に変わる.
    
    
    
    [2] 指数モデル Y= a bX   [Y ~ a * b ^ X]
    
    log Y = log( a bX) = log(a) + log(bX) = log(a) +  log(b) X に変形しパラメータabを求める.
    
    2変数YXは曲線関係であるが,これを対数にすると[log Y]とXは切片と傾きを持つ直線関係に変わる.
    
    
    
    [3] 対数モデル Y= a+blog(X)
    
    Y = a + b log(X) に変形しパラメータabを求める.
    
    2変数YXは曲線関係であるが,Ylog(X)は切片と傾きを持つ直線関係に変わる.
    




  2. 「2007年度都道府県別総人口と順位」のデータの分布


    2007年度の47都道府県別の総人口(万人単位)と順位のデータをデータフレームにする.

    データの出典:政府統計局都道府県の指標 e-State

    ・「コンソール」 画面に,

    都道府県名 <- c( "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県",
    "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県",
    "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県",
    "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県" )


    # と記述し都道府県名を入力

    順位 <- c( 8, 29, 32, 15, 37, 34, 18, 11, 20, 19, 5, 6, 1, 2, 14, 38, 35, 43 , 41, 16, 17, 10, 4, 22, 30, 13, 3, 7, 28,
    39, 47, 46, 21, 12, 25, 44, 40, 27, 45, 9, 42, 26, 23, 33, 36, 24, 31 )


    # と記述し総人口の順位を入力

    総人口万 <- c( 557, 141, 136, 235, 112, 120, 207, 297, 201, 202, 709, 610, 1276, 888, 240, 111, 117, 82, 88, 218, 210, 380,
    736, 188, 140, 264, 881, 559, 141, 102, 60, 73, 195, 287, 147, 80, 101, 145, 78, 506, 86, 145, 183, 120, 114, 173, 137 )


    # と記述し総人口(万人単位)を入力

    # 次に,

    x <- data.frame( 都道府県名, 順位, 総人口万 )

    # と記述し3つの変数を結合して都道府県順の並びのデータフレームを作成

    x1 <- order( x$順位 ) #   と記述し,順位変数の人口の順番で並べ替え

    人口分布2007 <- x[x1,] #   と記述し,総人口の順番で並べ替えしたデータフレームを作成

    str( 人口分布2007 ) #   と記述し,データ構造を表示する.

    人口分布2007 #   と記述し,データフレームを表示する.

    # 次に,

    plot (人口分布2007$順位, 人口分布2007$総人口万 ) #   と記述し順位と総人口の散布図を作成,分布が曲線であることを確認する.


    > 都道府県名 <- c( "北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", 
    "福島県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", 
    "茨城県","長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", 
    "奈良県", "石川県", "福井県",  "和歌山県", "山梨県","鳥取県", "島根県", "岡山県", "広島県", "山口県", 
    "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", 
    "鹿児島県", "沖縄県" ) 
    
    > 順位 <- c( 8, 29, 32, 15, 37, 34, 18, 11, 20, 19, 5, 6, 1, 2, 14, 38, 35, 43 , 41, 16, 17, 10,  
    4, 22, 30, 13, 3, 7, 28, 39, 47, 46, 21, 12, 25, 44, 40, 27, 45, 9, 42, 26, 23, 33, 36, 24, 31 ) 
    
    > 総人口万 <- c( 557, 141, 136, 235, 112, 120, 207, 297, 201, 202, 709, 610, 1276, 888, 240, 111, 
    117, 82, 88, 218, 210, 380, 736, 188, 140, 264, 881, 559, 141, 102, 60, 73, 195, 287, 147, 80, 101, 
    145, 78, 506, 86, 145, 183, 120, 114, 173, 137 ) 
    
    > x <- data.frame( 都道府県名, 順位, 総人口万 ) 
    
    > x1 <- order( x$順位 )    
    
    > 人口分布2007 <- x[x1,]    
    
    > str( 人口分布2007 ) 
    'data.frame':   47 obs. of  3 variables:
     $ 都道府県名: Factor w/ 47 levels "愛知県","愛媛県",..: 37 26 31 1 17 30 45 46 43 28 ...
     $ 順位      : num  1 2 3 4 5 6 7 8 9 10 ...
     $ 総人口万  : num  1276 888 881 736 709 ...
    
    > 人口分布2007    
       都道府県名 順位 総人口万
    13     東京都    1     1276
    14   神奈川県    2      888
    27     大阪府    3      881
    23     愛知県    4      736
       ・・・・・・・・
    18     福井県   43       82
    36     徳島県   44       80
    39     高知県   45       78
    32     島根県   46       73
    31     鳥取県   47       60
    
    > plot (人口分布2007$順位, 人口分布2007$総人口万 )
    

    図 人口分布2007


    結果: 散布図より,x(順位)とy(総人口)の2つの変数x,yは直線的な相関はなく,単調減少の相関関係を示している.

    この関係を線形モデル( 直線の式 Y=a+bX )に置き換えてモデル式に当てはめたい.このため2つの変数x,yを対数 X=log(x), Y=log(y)に置き換えて検討する.



  3. 新しい変数 X=log(x), Y=log(y) を作成


    順位を自然対数logに置き換える.変数名 順位logとする. 計算式 順位log = log( 順位 )

    総人口万を自然対数logに置き換える.変数名 総人口万logとする. 計算式 総人口万log = log( 総人口万 )

    (1) 一度に2変数を追加する

    「コンソール」 画面に,

    人口分布2007log <- data.frame ( 人口分布2007 )

    # と記述し,人口分布2007のデータを持つ,新しいデータフレーム 人口分布2007log を定義する.

    # 失敗するとオリジナルのデータフレームがなくなってしまうので注意する.

    人口分布2007log <- transform ( 人口分布2007log, 順位log = log( 順位 ), 総人口万log = log( 総人口万 ) )

    # logの計算式で作られた変数 順位logと総人口万logが追加される.

    str ( 人口分布2007log )

    # と記述し,人口分布2007log のデータ構造を確認する.変数が3個から5個に変わっている.

    人口分布2007log

    # と記述し,データフレーム 人口分布2007log の内容を確認する.

    plot ( 人口分布2007log$順位log, 人口分布2007log$総人口万log )

    # と記述し,2変数のプロット図を作成する.


    > 人口分布2007log <- data.frame ( 人口分布2007 )
    
    > 人口分布2007log <- transform ( 人口分布2007log, 順位log = log( 順位 ), 総人口万log = log( 総人口万 ) )
    
    > str ( 人口分布2007log )
    'data.frame':   47 obs. of  5 variables:
     $ 都道府県名 : Factor w/ 47 levels "愛知県","愛媛県",..: 37 26 31 1 17 30 45 46 43 28 ...
     $ 順位       : num  1 2 3 4 5 6 7 8 9 10 ...
     $ 総人口万   : num  1276 888 881 736 709 ...
     $ 順位log    : num  0 0.693 1.099 1.386 1.609 ...
     $ 総人口万log: num  7.15 6.79 6.78 6.6 6.56 ..
    
    > 人口分布2007log
       都道府県名 順位 総人口万  順位log   総人口万log
    13     東京都    1     1276  0.0000000    7.151485
    14   神奈川県    2      888  0.6931472    6.788972
    27     大阪府    3      881  1.0986123    6.781058
    23     愛知県    4      736  1.3862944    6.601230
    11     埼玉県    5      709  1.6094379    6.563856
    12     千葉県    6      610  1.7917595    6.413459
    28     兵庫県    7      559  1.9459101    6.326149
    1      北海道    8      557  2.0794415    6.322565
    40     福岡県    9      506  2.1972246    6.226537
    
    41     佐賀県   42       86  3.7376696    4.454347
    18     福井県   43       82  3.7612001    4.406719
    36     徳島県   44       80  3.7841896    4.382027
    39     高知県   45       78  3.8066625    4.356709
    32     島根県   46       73  3.8286414    4.290459
    31     鳥取県   47       60  3.8501476    4.094345
    
    >  plot ( 人口分布2007log$順位log, 人口分布2007log$総人口万log )
    

    図 人口分布2007log


    結果: logに変換した散布図より,X(順位og)とY(総人口og)の2つの変数x,yは,何とか直線的な関係を観察できる.

    次節で,この関係を線形モデル( 直線の式 Y=a+bX )に当てはめる.



  4. 「人口分布2007」への線形モデル Y= a +bX の当てはめ


    (1) 線形回帰分析

    Y= a +bX を当てはめパラメータ a, b を推測する.

    ・「コンソール」 画面に,

    plot ( log(人口分布2007$順位), log(人口分布2007$総人口万) ) # (ここでは,前節と異なり,データフレーム「人口分布2007」を直接検討する.)

    # と記述し,XYの変数を自然対数logに変換し,分布を観察する.常用対数で検討する場合は log10( )を使用する.

    何とか直線関係が観察できるので,無理やり直線の回帰分析に進む.

    図 log(人口分布2007)



    線形 <- lm( log(人口分布2007$順位) ~ log(人口分布2007$総人口万) )

    abline (線形, col = "black", lwd=1) # 回帰直線を描く

    summary (線形)

    # と記述し,線形単回帰分析を行う


    > plot (log(人口分布2007$順位), log(人口分布2007$総人口万) ) 
    
    > 線形 <- lm( log(人口分布2007$順位) ~ log(人口分布2007$総人口万) )
    
    > abline (線形, col = "black", lwd=1) 
    
    > summary ( 線形 )  
    
    Call:
    lm(formula = log(人口分布2007$順位) ~ log(人口分布2007$総人口万))
    
    Residuals:
         Min       1Q   Median       3Q      Max 
    -0.77806 -0.03608  0.03413  0.10723  0.36284 
    
    Coefficients:           回帰係数 標準偏差  t値   p値
                     Estimate  Std. Error  t value  Pr(>|t|)    
    切片 (Intercept)                 8.94533    0.20356     43.94   <2e-16 ***
    傾き log(人口分布2007$総人口万) -1.14204    0.03814    -29.94   <2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
    
    Residual standard error: 0.1956 on 45 degrees of freedom
    Multiple R-squared(決定係数): 0.9522,     Adjusted R-squared: 0.9511 
    F-statistic: 896.4 on 1 and 45 DF,  p-value: < 2.2e-16 
    

    図 log(人口分布2007)


    結果

    回帰直線は logY= (8.95)+ (-1.14)logX となる.うまく当たらなかった.

    par ( new=T ) # と記述しグラフの重ね図を指示

    lines( 人口分布2007$順位, (8.945)+人口分布2007$順位*(-1.142), col = "red" )

    # と記述し,回帰直線を再度グラフに書き込み確認する.

    切片 log(a)=8.95    対数を元に戻すには exp( log(a) )

    a <- exp(coefficients(線形)[1])=7671.965 a=7672

    傾き b=-1.14  よって 回帰式は Y= a Xb = 7672 X(-1.14)


  5. 散布図と線形モデルと累乗(べき乗)モデルの作図


    ・Rの「コンソール」画面に,

    plot (人口分布2007$順位, 人口分布2007$総人口万, main="Y=7672*X^(-1.14)  Y=1437*X^(-0.622)" )

    # と記述し測定値の散布図を作成

    par ( new=T ) # と記述しグラフの重ね図を指示

    # (1)対数に変換し線形で求めた値abを用いた回帰曲線 Y= 7672 X-1.14 を赤色で描く.

    lines(人口分布2007$順位, 7672*人口分布2007$順位^(-1.14), col = "red" )

    par ( new=T ) # と記述しグラフの重ね図を指示

    # (2)非線形回帰分析の「
    累乗(べき乗)モデル」で求めた値abを用いた回帰曲線Y= 1436 X-0.62を青色で描く.

    lines(人口分布2007$順位, 1437*人口分布2007$順位^(-0.622), col = "blue" )


     > plot (人口分布2007$順位, 人口分布2007$総人口万, main="Y=7672*X^(-1.14)  Y=1437*X^(-0.622)" )
    
    > par ( new=T ) # と記述しグラフの重ね図を指示
    
    > lines(人口分布2007$順位, 7672*人口分布2007$順位^(-1.14), col = "red" ) 
    
    > par ( new=T ) # と記述しグラフの重ね図を指示
    
    > lines(人口分布2007$順位, 1437*人口分布2007$順位^(-0.622), col = "blue" ) 
    

    図 人口分布2007



    結果と考察

    二つの方法で「人口分布2007」に回帰曲線を当てはめてみた.伝統的な線形(赤色)と非線形(青色)の計算モデルの違いが現れている.

    このデータの分布の場合は非線形のモデルを使用した回帰分析がより適合してる.

線形回帰分析                          [ 目次に戻る ]