Up

ˆ๖Žq•ชอ

’ผฺลฌ‚Qๆ–@

 

@ˆ๖Žq•ชอ‚อAˆ๖Žq‚ฦ‚ข‚ค๖•ฯ”‚ฬ‚PŽŸŽฎ‚ษ‚ๆ‚ม‚ฤƒf[ƒ^i•ฯ—สj‚ฬ•ฯ“ฎ‚๐เ–พ‚ท‚้ƒ‚ƒfƒ‹‚ล‚ ‚่AŽŸŽฎi‚Pj

 

i‚Pj                

 

‚ษ‚ๆ‚ม‚ฤ•\‚ํ‚ณ‚๊‚้B‘ฝ‚ญ‚ฬ‰๐–@‚ช’๑ˆฤ‚ณ‚๊‚ฤ‚ข‚้‚ชAลฌ‚Qๆ–@‚ฬŠ๎€‚ษ‚ๆ‚่A’ผฺAˆ๖Žq•‰‰ืs—๑‚๐‹‚฿‚้•๛–@i‰ช–{A2014App.95-97j‚๐ˆศ‰บ‚ษŽŽ‚‚ฝB

’ผฺลฌ‚Qๆ–@‚อA‹ค’สซicommunalityj‚ช‚P‚ๆ‚่‘ๅ‚ซ‚ญ‚ศ‚้‚ฦ‚ข‚คƒwƒCƒEƒbƒhƒP[ƒX‚ช–ณ‚ญAˆ๖Žq“พ“_‚เ’ผฺ‹‚฿‚็‚๊‚้B

 

ˆ๊”ส‚ษAs—๑‚ฬAƒ‰ƒ“ƒN‚ฬs—๑‚ษ‚ๆ‚้ลฌ2ๆ‹฿Ž—‚อA“มˆู’l•ช‰๐‚ฬ“มˆู’l‚ช‘ๅ‚ซ‚ข‚เ‚ฬ‚ฉ‚็Œย‚ฦ‚ม‚ฝ‚เ‚ฬ‚ล—^‚ฆ‚็‚๊‚้B‚ฑ‚๊‚อƒGƒbƒJ[ƒgEƒ„ƒ“ƒO‚ฬ’่—iEckart and Young, 1936j‚ฦŒฤ‚ฮ‚๊‚ฤ‚ข‚้‚ชA‚ป‚๊‚ๆ‚่ˆศ‘O‚ษ”ญ•\‚ณ‚๊‚ฤ‚ข‚้(e.g. Schmidt, 1906)‚ฦGifi (1990), p.518‚อเ–พ‚ต‚ฤ‚ข‚้B

‚ข‚AŽฎi‚Pj‚ฬถ•ำƒf[ƒ^‚อ•W€“พ“_‰ป‚ณ‚๊‚ฤ‚ข‚้‚ฦ‚ตA‚ป‚ฬ“มˆู•ช‰๐‚๐

 

 

‚ฦ‚จ‚ญB‚ฑ‚ฬ‚ฦ‚ซAƒ‰ƒ“ƒN‚ฬลฌ‚Qๆ‹฿Ž—‚อA“มˆู’l‚ฬ‘ๅ‚ซ‚ข‚เ‚ฬ‚ฉ‚็Œย‚๐‘I‚๑‚ล

 

 

‚ล—^‚ฆ‚็‚๊‚้BŽฎi‚Qj‚ฦŽฎi‚Pj‚๐”ไ‚ืAˆ๖Žq‚ช•ฝ‹ฯ0A•ชŽU1‚ฬ•W€‰ป“พ“_‚ล‚ ‚้‚ฑ‚ฦ‚ษ’ˆำ‚ท‚้‚ฦ

 

 

‚ล—^‚ฆ‚็‚๊‚้‚ฑ‚ฦ‚ช‚ํ‚ฉ‚้B‚ฑ‚ฑ‚ลA‚อƒf[ƒ^”‚ล‚ ‚้B‚‚ฝA‚ๆ‚่A‚ล‚ ‚้B

Žๅฌ•ช•ชอ‚ล‚เŒ`Žฎ‚อ“ฏ‚ถŽฎ‚ชŽg‚ํ‚๊‚้‚ชAŽๅฌ•ช•ชอ‚ฬ๊‡‚อAƒf[ƒ^‚ฬณŽห‰e‚ษ‚ๆ‚้ˆณk‚ล‚ ‚้‚ฬ‚ษ‘ฮ‚ต‚ฤAใ‹Li‚Rj‚อƒf[ƒ^‚ษ‘ฮ‚ท‚้ˆ๖Žqƒ‚ƒfƒ‹i‚Pj‚ษ‚ๆ‚้ˆ๖Žq“พ“_‚ฦˆ๖Žq•‰‰ื‚ฬ„’่’l‚ล‚ ‚้Bƒf[ƒ^‚๐Œ๘—ฆ‚ๆ‚ญˆณk‚ต‚ฝ‚เ‚ฬiŽๅฌ•ช•ชอj‚ฦƒf[ƒ^‚๐‚ๆ‚ญ•\‚ท„’่’liˆ๖Žq•ชอj‚ช”’l‚ฦ‚ต‚ฤˆ๊’v‚ท‚้‚ฑ‚ฦ‚อŽฉ‘R‚ศ‚ฑ‚ฦ‚ล‚ ‚้‚ฦŒพ‚ฆ‚ๆ‚คB

 

Žฎi‚Pj‚ๆ‚่AŽŸŽฎ‚๐“พ‚้B

 

 

—ผ•ำ‚ฬih,hjฌ•ช‚ษ’–ฺ‚ต‚ฤAŽŸŽฎ‚๐“พ‚้B

 

 

‚ฑ‚ฑ‚ลA

 

 

‚ๆ‚่A

 

 

‚ช“ฑ‚ฉ‚๊‚้B‚ท‚ศ‚ํ‚ฟA‹ค’สซ‚อ‚P‚๐’ด‚ฆ‚้‚ฑ‚ฦ‚อ‚ศ‚ขB

 

ณ‘ฅs—๑‚ษ‘ฮ‚ต‚ฤAŽŸŽฎ‚ชฌ‚่—ง‚ยB

 

 

‚ฑ‚ฬ‚อA‰๑“]‚ฦŒฤ‚ฮ‚๊‚ฤ‚ข‚้B

 

 

’ผฺลฌ2ๆ–@‚ฬƒXƒNƒŠƒvƒg‚๐ƒŠƒXƒg‚P‚ฬ‚ๆ‚ค‚ษ์ฌ‚ต‚ฤ‚‚ฝBƒtƒ@ƒCƒ‹‚อA‚‚ฦ‚฿‚ฤˆณkƒtƒ@ƒCƒ‹fa_direct_files.zip‚ฦ‚ต‚ฝB

 

“—อƒf[ƒ^ƒtƒ@ƒCƒ‹‚อAExcelƒtƒ@ƒCƒ‹‚ฦ‚ต‚ฤ}‚Pa,b‚ฬ‚ๆ‚ค‚ษ—pˆำ‚ท‚้B}‚Pa,b‚ฬƒf[ƒ^‚อA‰ช–{i2014jA•\5.1.1‚๐“—อ‚ต‚ฝ‚เ‚ฬ‚ล‚ ‚้B

 

ƒe[ƒuƒ‹

AI ถฌƒRƒ“ƒeƒ“ƒc‚อŒ๋‚่‚๐Š‚‰ย”\ซ‚ช‚ ‚่‚‚ทB

}‚Pa

ƒe[ƒuƒ‹

AI ถฌƒRƒ“ƒeƒ“ƒc‚อŒ๋‚่‚๐Š‚‰ย”\ซ‚ช‚ ‚่‚‚ทB

}‚Pb

 

‚Ps–ฺ‚ษ•ฯ”–ผ‚๐’่‚ท‚้B‚P—๑–ฺ‚อAƒP[ƒXID‚ฬ”ิ†‚๐’่‚ท‚้BƒP[ƒXID‚ฬ”ิ†‚อAฎ”‚ล‚ ‚๊‚ฮ”Cˆำ‚ล‚ ‚่Aธ‡‚ล‚ศ‚ญ‚ฤ‚เƒ‰ƒ“ƒ_ƒ€‚ศ‡˜‚ล‚เ‚ๆ‚ข‚ชAˆ๖Žq“พ“_‚ฬo—อ‚ษ‚จ‚ข‚ฤ—p‚ข‚็‚๊‚้‚ชA•ชอ‚ษ‚อ—p‚ข‚็‚๊‚ศ‚ขB‚Q—๑–ฺˆศ~‚ษAƒf[ƒ^’l‚๐’่‚ท‚้B

 

ƒŠƒXƒg‚P‚ฬƒXƒNƒŠƒvƒg‚๐Žภs‚ท‚้‚ฦA“—อƒf[ƒ^ƒtƒ@ƒCƒ‹–ผ‚๐•ท‚ข‚ฤ‚ญ‚้BŽŸ‚ฬ—แ‚ล‚อA}‚P‚ฬƒf[ƒ^ƒtƒ@ƒCƒ‹–ผData6Subj100.xlsx‚ช’่‚ณ‚๊‚ฤ‚ข‚้B“—อƒf[ƒ^ƒtƒ@ƒCƒ‹‚อAƒXƒNƒŠƒvƒgƒtƒ@ƒCƒ‹‚ฦ“ฏ‚ถƒtƒHƒ‹ƒ_“เ‚ษ‚ ‚้‚เ‚ฬ‚ฦ‚ท‚้B

 

Input file name(*.xlsx) = Data6Subj100.xlsx

Output file name(*.txt) = Results.txt

 

“—อƒf[ƒ^ƒtƒ@ƒCƒ‹–ผ‚๐’่‚ท‚้‚ฦAo—อƒtƒ@ƒCƒ‹–ผ‚ฬ’่‚ช‹‚฿‚็‚๊‚้B“K“–‚ศƒeƒLƒXƒgƒtƒ@ƒCƒ‹–ผ‚๐’่‚ท‚้Bใ‚ฬ—แ‚ล‚อAResults.txt‚ช’่‚ณ‚๊‚ฤ‚ข‚้Bo—อƒtƒ@ƒCƒ‹‚อAƒXƒNƒŠƒvƒg‚ฦ“ฏ‚ถƒtƒHƒ‹ƒ_“เ‚ษ•‘ถ‚ณ‚๊‚้B

o—อƒeƒLƒXƒgƒtƒ@ƒCƒ‹–ผ‚๐’่‚ท‚้‚ฦAŒvŽZ‚ชŽn‚‚่A‘ŠŠึs—๑‚ฬŒล—L’l‚ฬƒXƒNƒŠ[ƒvƒƒbƒg‚ช•\Žฆ‚ณ‚๊‚้i}‚QjB

 

}‚Q

 

}‚Q‚ฬ๊‡Aˆ๖Žq”‚อ‚Q‚ช“K“–‚ล‚ ‚้‚ฦ”ป’f‚ณ‚๊‚้B

}‚Q‚ฬWindow‚๐•ย‚ถ‚้‚ฦAˆ๖Žq”q‚ฬ’l‚ฬ’่‚ชuq = v‚ฦ‹‚฿‚็‚๊‚้i}‚RjB

 

ƒeƒLƒXƒg

AI ถฌƒRƒ“ƒeƒ“ƒc‚อŒ๋‚่‚๐Š‚‰ย”\ซ‚ช‚ ‚่‚‚ทB

}‚R

 

}‚R‚ล‚อA‚Q‚ช’่‚ณ‚๊‚ฤ‚ข‚้B

ˆ๖Žq”q‚๐’่‚ต‚ฤAEnterƒL[‚๐‰Ÿ‚ท‚ฦA’ผฺลฌ2ๆ–@‚ษ‚ๆ‚้ŒvŽZ‚ชŽn‚‚้B

ŒvŽZ‚ชI—น‚ท‚้‚ฦA‰๑“]‘O‚ฬˆ๖Žq•‰‰ื—สA‚ฬ’l‚ฬ•z’u‚ช‰Š๚’l‚ฦ‚ต‚ฤ•\Žฆ‚ณ‚๊‚้i}‚SjB

 

}‚S

 

}‚S‚ฬWindow‚๐•ย‚ถ‚้‚ฦAŽŸ‚ษ•\Žฆ‚ท‚้•z’u‚ฬ‰กŽฒiXŽฒj‚ฬ•\‚ทˆ๖Žq‚ฬŽw’่‚ช‹‚฿‚็‚๊‚้i}‚TjB

 

}‚T

 

ˆ๖Žq‚ฦ‚ต‚ฤ‚Oˆศ‰บ‚ฬฎ”’l‚๐’่‚ท‚้‚ฦA‰Š๚’l‚ษ‚ๆ‚้•z’u‚ฬ•\Žฆ‚ชI—น‚ท‚้B

•z’u‚ษ•\Žฆ‚ท‚้ˆ๖Žq‚ฦ‚ต‚ฤ‚Oˆศ‰บ‚ฬฎ”’l‚๐’่‚ต‚ฤA‰Š๚’l‚ษ‚ๆ‚้•z’u‚ฬ•\Žฆ‚๐I—น‚ท‚้‚ฦAŽŸ‚ษƒoƒŠƒ}ƒbƒNƒX‰๑“]‚ษ‚ๆ‚้’ผŒ๐‰๑“]‚ชs‚ํ‚๊‚้B

ƒoƒŠƒ}ƒbƒNƒX‰๑“]‚อAŽŸ‚ฬŠ๎€‚๐ลฌ‰ป‚ท‚้‚เ‚ฬ‚ฦ‚ต‚ฤA‘ซ—งEŽR–{i2024jAp.137‚ฬƒAƒ‹ƒSƒŠƒYƒ€‚ษ‚ๆ‚่s‚ม‚ฝiƒŠƒXƒg‚QjB

 

 

ƒoƒŠƒ}ƒbƒNƒX‰๑“]Œใ‚ฬ•z’u‚อA}‚U‚ฬ‚ๆ‚ค‚ษ•\Žฆ‚ณ‚๊‚้B

 

}‚U

 

}‚U‚ฬWindow‚๐•ย‚ถ‚้‚ฦAŽŸ‚ฬ•z’u‚ฬ•\Žฆ‚ษ—p‚ข‚้‰กŽฒ‚ฬ•\‚ทˆ๖Žq‚ฬ’่‚ช‹‚฿‚็‚๊‚้B

ˆ๖Žq‚ฦ‚ต‚ฤ‚Oˆศ‰บ‚ฬฎ”’l‚๐’่‚ท‚้‚ฦAƒoƒŠƒ}ƒbƒNƒX‰๑“]Œใ‚ฬ•z’u‚ฬ•\Žฆ‚อI—น‚ท‚้B

ŽŸ‚ษAŽฮŒ๐‰๑“]‚ฦ‚ต‚ฤƒR[ƒeƒBƒ~ƒ“‰๑“]‚ชs‚ํ‚๊‚้B

ƒR[ƒeƒBƒ~ƒ“Š๎€‚อ

 

 

‚ล—^‚ฆ‚็‚๊A‘ซ—งEŽR–{i2024jAp.140‚ฬƒAƒ‹ƒSƒŠƒYƒ€‚๐ŽQl‚ษ‚ต‚ฤƒŠƒXƒg‚Q‚ษŽฆ‚ทƒXƒNƒŠƒvƒg‚๐—pˆำ‚ต‚ฝB

ŽฮŒ๐‰๑“]‚ชI—น‚ท‚้‚ฦAƒXƒNƒŠƒvƒg‚ฬŽภsI—น‚ล‚ ‚้i}‚VjB

 

}‚V

 

‰๑“]‘O‚ฬ‰Š๚‰๐‚ฬˆ๖Žq“พ“_‚ชAfi.csv‚ษAƒoƒŠƒ}ƒbƒNƒX‰๑“]Œใ‚ฬˆ๖Žq“พ“_‚ชfv.csv‚ษAƒR[ƒeƒBƒ~ƒ“‰๑“]Œใ‚ฬˆ๖Žq“พ“_‚ชfq.csv‚ษ•‘ถ‚ณ‚๊‚ฤ‚ข‚้‚ฑ‚ฦ‚ชŽฆ‚ณ‚๊‚ฤ‚ข‚้B‚ฑ‚๊‚็‚ฬCSVƒtƒ@ƒCƒ‹‚อAExcel‚ลŠJ‚ญ‚ฑ‚ฦ‚ช‚ล‚ซ‚้BExcel‚ลŠJ‚ฉ‚๊‚ฝCSVƒtƒ@ƒCƒ‹‚อAŠg’ฃŽq‚๐.xlsx‚ษ•ฯX‚ต‚ฤExcelƒtƒ@ƒCƒ‹‚ฦ‚ต‚ฤ•‘ถ‚ท‚้‚ฑ‚ฦ‚ช‚ล‚ซ‚้B

 

ŽภsI—นŒใAo—อƒtƒ@ƒCƒ‹Results.txt‚๐ŠJ‚ญ‚ฦAˆศ‰บ‚ฬ‚ๆ‚ค‚ล‚ ‚้B

 

Input fie = Data6Subj100.xlsx.

var_names =

['Jpn' 'Eng' 'Hist' 'Math' 'Phys' 'Chem']

 

1: [48 46 60 47 68 44]

2: [54 49 63 61 49 45]

3: [48 55 47 49 49 47]

E

E

E

98: [84 84 96 69 60 69]

99: [39 51 39 59 60 65]

100: [47 45 60 68 72 70]

 

 

                mean        sd

Jpn           58.750    15.213

Eng           59.310    15.591

Hist          59.310    15.059

Math          60.520    13.056

Phys          60.090    13.287

Chem          58.940    13.981

 

R =

                 Jpn       Eng      Hist      Math      Phys      Chem

       Jpn   1.00000   0.84066   0.87327   0.23810   0.19741   0.29807

       Eng   0.84066   1.00000   0.82001   0.20751   0.12885   0.24563

      Hist   0.87327   0.82001   1.00000   0.27644   0.20387   0.24637

      Math   0.23810   0.20751   0.27644   1.00000   0.60998   0.67641

      Phys   0.19741   0.12885   0.20387   0.60998   1.00000   0.84128

      Chem   0.29807   0.24563   0.24637   0.67641   0.84128   1.00000

 

 

Eigen values of R

                                 Cum.Sum    Cum.Prop(%)

         1        3.25276        3.25276          54.21

         2        1.86791        5.12067          85.34

         3        0.42494        5.54561          92.43

         4        0.20646        5.75207          95.87

         5        0.14753        5.89960          98.33

         6        0.10040        6.00000         100.00

 

 

Before rotation

 

                 Factor-1       Factor-2 Communalitites

Jpn               0.82210        0.48694        0.91297

Eng               0.77575        0.52727        0.87981

Hist              0.81441        0.48464        0.89813

Math              0.64182       -0.53731        0.70064

Phys              0.62907       -0.67123        0.84628

Chem              0.71006       -0.61535        0.88285

 

 

Varimax rotation

 

            Factor-1  Factor-2  Communalities

Jpn          0.94506  -0.14083        0.91297

Hist         0.93763  -0.13776        0.89813

Eng          0.93454  -0.08029        0.87981

Chem         0.16272  -0.92540        0.88285

Phys         0.06463  -0.91766        0.84628

Math         0.15901  -0.82180        0.70064

Contri         2.702     2.419

 

 

Quartimin rotation

 

 

Correlation between factors...

            Factor-1  Factor-2

    comp.1   1.00000  -0.26029

    comp.2  -0.26029   1.00000

 

Factor loadings

 

                 Factor-1       Factor-2

Jpn               0.94954       -0.02195

Eng               0.94735        0.03888

Hist              0.94236       -0.01976

Phys             -0.06404       -0.93452

Chem              0.03549       -0.92974

Math              0.04640       -0.82376

 

 

Structure matrix

                 Factor-1       Factor-2

Jpn               0.95526       -0.26911

Hist              0.94751       -0.26505

Eng               0.93723       -0.20770

Chem              0.27749       -0.93897

Phys              0.17921       -0.91785

Math              0.26082       -0.83584

 

 

 

ŽQl•ถŒฃ

‘ซ—ง_•ฝEŽR–{—ฯถi2024jŽๅฌ•ช•ชอ‚ฦˆ๖Žq•ชอF“มˆู’l•ช‰๐‚๐o”ญ“_‚ฦ‚ต‚ฤD‹ค—งo”ล

Gifi, A. (1990). Nonlinear multivariate analysis. John Wiley & Sons.

‰ช–{ˆภฐi2019j‚ข‚‚ณ‚็•ท‚ฏ‚ศ‚ขPython‚ลƒf[ƒ^•ชอF‘ฝ•ฯ—ส‰๐อAƒxƒCƒY“Œv•ชอDŠ‘Po”ล

‰ช–{ˆภฐi2014jS—Šwƒf[ƒ^•ชอ‚ฦ‘ช’่Fƒf[ƒ^‚ฬŒฉ•๛‚ฦS‚ฬ‘ช‚่•๛D™ค‘‘–[

 

 

 

ƒŠƒXƒg‚P@’ผฺลฌ2ๆ–@‚ฬƒXƒNƒŠƒvƒgifa_direct_main.pyj

 

import scipy.stats as ss

import pandas as pd

import numpy as np

from mymodule import *     #   arrng_pttn, draw_map,

from rotate import *       #   Varimax_Orthomax, Oblique_Quartimin

 

fin_nm = input('Input file name(*.xlsx) = ')

df_data = pd.read_excel(fin_nm)              #   Excelƒtƒ@ƒCƒ‹‚ฬ“ว‚ž‚

fout_nm = input('Output file name(*.txt) = ')

fout = open(fout_nm, 'w')                    #   o—อ—pƒeƒLƒXƒgƒtƒ@ƒCƒ‹‚ฬƒI[ƒvƒ“

fout.write(f'Input fie = {fin_nm}.\n')

var_names = np.array(df_data.keys())

caseIDs = np.array(df_data[var_names[0]])

var_names = var_names[1:]                  #   •ฯ”–ผƒŠƒXƒg               

print('var_names =\n', var_names)

fout.write(f'var_names =\n{var_names}\n\n')

N = len(caseIDs)

print('n =', len(caseIDs))

X = np.array(df_data.values)[:,1:]         #   •ฯ”’l‚ฬ”z—๑is—๑j

 

for i, v in zip(caseIDs, X):

    print(i, v)

    fout.write(f'{i}: {v}\n')

 

means = np.mean(X, axis=0)

sds = np.std(X, axis=0)

print()

print(f'{" ":10s}{"mean":>10s}{"sd":>10s}')

fout.write(f'\n\n{" ":10s}{"mean":>10s}{"sd":>10s}\n')

for i, v in enumerate(var_names):

    print(f'{v:<10s}{means[i]:>10.3f}{sds[i]:>10.3f}')

    fout.write(f'{v:<10s}{means[i]:>10.3f}{sds[i]:>10.3f}\n')

 

X = ss.zscore(X, axis=0)              #   •W€“พ“_‰ป

print(np.mean(X, axis=0))

print(np.std(X, axis=0))

   

R = np.corrcoef(X, rowvar=False)      #   ‘ŠŠึs—๑

print()

print('‘ŠŠึs—๑')

fout.write('\nR =\n')

print(f'{" ":>10s}', end='')

fout.write(f'{" ":>10s}')

for v in var_names:

    print(f'{v:>10s}', end='')

    fout.write(f'{v:>10s}')

fout.write('\n')

print()

for i, s in enumerate(var_names):

    print(f'{s:>10s}', end='')

    fout.write(f'{s:>10s}')

    for j in range(len(var_names)):

        print(f'{R[i][j]:>10.5f}', end='')

        fout.write(f'{R[i][j]:>10.5f}')

    print()

    fout.write('\n')

 

Lmbd, V = np.linalg.eigh(R)       #   ‘ŠŠึs—๑‚ฬŒล—L•ช‰๐

idx = np.argsort(-Lmbd)           #   Œล—L’l‚ฬ~‡‚ษ•ภ‚ื‘ึ‚ฆ‚้‚ฝ‚฿‚ฬƒCƒ“ƒfƒbƒNƒX

Lmbd = Lmbd[idx]

 

n_vars = len(var_names)

cum_sum = np.cumsum(Lmbd)

print('\n‘ŠŠึs—๑‚ฬŒล—L’l')

fout.write('\n\nEigen values of R\n')

print(f'{"Cum.Sum":>40s}{"Cum.Prop(%)":>15s}')

fout.write(f'{"Cum.Sum":>40s}{"Cum.Prop(%)":>15s}\n')

for i in range(n_vars):

    print(f'{i+1:>10d}{Lmbd[i]:>15.5f}', end ='')

    print(f'{cum_sum[i]:>15.5f}{100*cum_sum[i]/cum_sum[n_vars-1]:>15.2f}')

    fout.write(f'{i+1:>10d}{Lmbd[i]:>15.5f}')

    fout.write(f'{cum_sum[i]:>15.5f}{100*cum_sum[i]/cum_sum[n_vars-1]:>15.2f}\n')

 

"""

       Œล—L’l‚ฬƒXƒNƒŠ[ƒvƒƒbƒg

"""

plt.title('Scree plot', fontsize=16)

plt.plot(np.arange(n_vars)+1, Lmbd, ls='-')

plt.ylabel('Eigen values', fontsize=14)

plt.tight_layout()

plt.show()

 

q = int(input('q = '))   #   ˆ๖Žq”‚ฬ“—อ

if q <= 0:

    q = 1

if q > n_vars:

    q = n_vars

 

"""

        ’ผฺลฌ2ๆ–@

"""

U, Lmbd, Vh = np.linalg.svd(X)

print('Vh.T[:q] =\n', Vh.T[:q])

print('np.diag(Lmbd[:q]) =\n', np.diag(Lmbd[:q]))

A = Vh[:q].T @ np.diag(Lmbd[:q]) / (N**0.5)

 

"""

        ‹ค’สซ

"""

communlty = np.sum(A ** 2, axis=1)

print('\n‰Š๚‰๐')

fout.write('\n\nBefore rotation\n')

print(f'{" ":10s}', end='')

fout.write(f'\n{" ":10s}')

for i in range(q):

    tstr = f"Factor-{i+1}"

    print(f'{tstr:>15s}', end='')

    fout.write(f'{tstr:>15s}')

print(f'{"Communalities":>15s}')

fout.write(f'{"Communalitites":>15s}\n')

for i in range(n_vars):

    print(f'{var_names[i]:<10s}', end='')

    fout.write(f'{var_names[i]:<10s}')

    for j in range(q):

        print(f'{A[i][j]:>15.5f}', end='')

        fout.write(f'{A[i][j]:>15.5f}')

    print(f'{communlty[i]:>15.5f}')

    fout.write(f'{communlty[i]:>15.5f}\n')

"""

        ‰Š๚’l‚ฬƒ}ƒbƒv

"""

dim1 = 1

dim2 = 2 if q >= 2 else 1

while True:

    draw_map(var_names, A.T[dim1-1], A.T[dim2-1],

             'Before Rotation',

             f'Factor-{dim1}', f'Factor-{dim2}')

    dim1 = int(input('dim_x = '))

    if dim1 <= 0:

        break

    if dim1 > q:

        dim1 = q

    dim2 = int(input('dim-y = '))

    if dim2 <= 0:

        break

    if dim2 > q:

        dim2 = q

"""

        ƒoƒŠƒ}ƒbƒNƒX‰๑“]

"""

var_rot = Varimax_Orthomax(A)

A_vmax = var_rot.rotate()

print('\nƒoƒŠƒ}ƒbƒNƒX‰๑“]')

fout.write('\n\nVarimax rotation\n')

 

v_names, pttn = arrng_pttn(var_names, A_vmax)

dim1 = 1

dim2 = 2 if q >= 2 else 1

while True:

    draw_map(var_names, A_vmax.T[dim1-1], A_vmax.T[dim2-1],

             'Varimax rotation', f'dim-{dim1}', f'dim-{dim2}')

    dim1 = int(input('dim_x = '))

    if dim1 <= 0:

        break

    if dim1 > q:

        dim1 = q

    dim2 = int(input('dim-y = '))

    if dim2 <= 0:

        break

    if dim2 > q:

        dim2 = q

 

comm_vmax = np.sum(pttn**2, axis=1)

contrib = np.sum(pttn**2, axis=0)

print('\nƒoƒŠƒ}ƒbƒNƒX‰๑“]Œใ‚ฬˆ๖Žqƒpƒ^[ƒ“')

print(f'{" ":10s}', end='')

fout.write(f'\n{" ":10s}')

for i in range(q):

    vs = f'Factor-{i+1}'

    print(f'{vs:>10s}', end='')

    fout.write(f'{vs:>10s}')

print(f'{"Communalities":>15s}')

fout.write(f'{"Communalities":>15s}\n')

for i in range(n_vars):

    print(f'{v_names[i]:<10s}', end='')

    fout.write(f'{v_names[i]:<10s}')

    for j in range(q):

        print(f'{pttn[i][j]:>10.5f}', end='')

        fout.write(f'{pttn[i][j]:>10.5f}')

    print(f'{comm_vmax[i]:>15.5f}')

    fout.write(f'{comm_vmax[i]:>15.5f}\n')

 

print(f'{"Contri":<10s}', end='')

fout.write(f'{"Contri":<10s}')

for j in range(q):

    print(f'{contrib[j]:>10.3f}', end='')

    fout.write(f'{contrib[j]:>10.3f}')

print()

print()

fout.write('\n\n')

 

"""

       ƒR[ƒeƒBƒ~ƒ“‰๑“]

"""

q_rot = Oblique_Quartimin(A)

A_qrot, Phi = q_rot.rotate()

 

v_names, pttn = arrng_pttn(var_names, A_qrot)

print('\nƒR[ƒeƒBƒ~ƒ“‰๑“]Œใ‚ฬˆ๖Žqƒpƒ^[ƒ“\n')

fout.write('\nQuartimin rotation\n')

print(f'{" ":10s}', end='')

fout.write(f'\n{" ":10s}')

for i in range(q):

    vs = f'Factor-{i+1}'

    print(f'{vs:>15s}', end='')

    fout.write(f'{vs:>15s}')

print()

fout.write('\n')

for i in range(n_vars):

    print(f'{v_names[i]:<10s}', end='')

    fout.write(f'{v_names[i]:<10s}')

    for j in range(q):

        print(f'{pttn[i][j]:>15.5f}', end='')

        fout.write(f'{pttn[i][j]:>15.5f}')

    print()

    fout.write('\n')

 

"""

        \‘ขs—๑

"""

Strctr = A_qrot @ Phi

v_names, pttn = arrng_pttn(var_names, Strctr)

print('\n\‘ขs—๑')

fout.write('\n\nStructure matrix\n')

print(f'{" ":10s}', end='')

fout.write(f'{" ":10s}')

for i in range(q):

    vs = f'Factor-{i+1}'

    print(f'{vs:>15s}', end='')

    fout.write(f'{vs:>15s}')

print()

fout.write('\n')

for i in range(n_vars):

    print(f'{v_names[i]:<10s}', end='')

    fout.write(f'{v_names[i]:<10s}')

    for j in range(q):

        print(f'{pttn[i][j]:>15.5f}', end='')

        fout.write(f'{pttn[i][j]:>15.5f}')

    print()

    fout.write('\n')

 

fout.close()

print(f'\n{fout_nm} is saved.\n')

 

 

 

 

ƒŠƒXƒg‚Q@‰๑“]‚ฬƒXƒNƒŠƒvƒgirotate.pyj

 

"""

       Y.Okamoto, 2025.06

 

       ŽQl•ถŒฃ

       ‘ซ—ง_•ฝEŽR–{—ฯถi‚Q‚O‚Q‚Sj

       Žๅฌ•ช•ชอ‚ฦˆ๖Žq•ชอA‹ค—งo”ล

"""

 

import numpy as np

import scipy.optimize as so

 

 

class Varimax_Orthomax:

    def __init__(self, C):

        """

                C: •‰‰ืs—๑

        """

        self.C = C

 

    def rotate(self):

        """

               ‘ซ—งEŽR–{i2014jAp.137

        """

        p = len(self.C)

        Mw = np.identity(p) - np.ones((p,p))/p    #  w==1

        Gmma = self.C

 

        while True:

            Gmma2 = Gmma * Gmma

            S_tilde = Gmma * (Mw @ Gmma2)

            U, Delta, Vh = np.linalg.svd(self.C.T @ S_tilde)

            T = U @ Vh

            Gmma_new = self.C @ T

            ck = np.sum((Gmma - Gmma_new)**2)

            Gmma = Gmma_new

            #print(ck)

            if ck < 1.0e-6:

                break

        return Gmma     #   ‰๑“]Œใ‚ฬs—๑

 

 

 

class Oblique_Quartimin():

    """

            C: •‰‰ืs—๑

    """

    def __init__(self, C):

        self.C = C

 

    def rotate(self):

        """

               ‘ซ—งEŽR–{i2014jAp.140

        """

        p, m = np.shape(self.C)

        Gmma = self.C

        Phi = np.identity(m)

        T = np.identity(m)

 

        def calc_tjk(gmma, phi, j, k):

 

            class Gammas():

                def __init__(self, C, Phi, j, k):

                    #self.c = Gmma

                    self.C = C

                    self.Phi = Phi

                    self.j = j

                    self.k = k

 

                def f_gammas(self, t):

                    """

                          Quartimin criterion

                    """

                    c = self.C

                    Phi = self.Phi

                    p = np.shape(c)[0]

                    j = self.j

                    k = self.k

                    v = 0.0

                    for i in range(p):

                        g2_ij = (1 - 2*t*Phi[j][k] + (t**2)) * (c[i][j]**2)

                        g2_ik = (t**2) * (c[i][j]**2) + \

                                2 * t * c[i][j] * c[i][k] + c[i][k]**2

                        v += g2_ij * g2_ik

                    return v

 

            calc_g = Gammas(gmma, phi, j, k)

            result = so.minimize_scalar(calc_g.f_gammas, [-10, 10])

            #print(result)

            return result.x                   

 

        n_try = 0

        while True:

            Gmma0 = Gmma

            for j in range(m):

                for k in range(m):

                    if j != k:      #   j < k ‚๐ j != k ‚ษ•ฯX

                        tjk = calc_tjk(Gmma, Phi, j, k)

                        tjj = (1 - 2 * tjk * Phi[j][k] + (tjk**2)) ** 0.5

                        T_jk = np.identity(m)

                        T_jk[j][j] = tjj

                        T_jk[j][k] = tjk

                        Gmma = Gmma @ T_jk

                        inv_T_jk = np.linalg.inv(T_jk)

                        Phi = inv_T_jk @ Phi @ (inv_T_jk.T)

                        T = T @ T_jk

            n_try += 1

 

            ck = np.sum((Gmma0 - Gmma) ** 2)

            #print('ck =', ck, '   n_try =', n_try)

            if (ck < 1.0e-6) or (n_try > 50):

                break

            else:

                T = np.identity(m)

 

        return Gmma, Phi      #   ‰๑“]Œใ‚ฬ•‰‰ืs—๑‚ฦ‹ค•ชŽUs—๑

 

 

 

 

ƒŠƒXƒg‚R@•ฯ”‚ฬฎ—๑A•z’u‚ฬ•`‰ๆƒXƒNƒŠƒvƒgimymodule.pyj

 

import copy

import numpy as np

import matplotlib.pyplot as plt

 

 

 

def arrng_pttn(names, A):

    v_nms = copy.copy(names)

    pttn = copy.copy(A)

    n = len(v_nms)

    q = len(pttn[0])

    vals = np.empty(n)

    for i in range(n):

        mx_p = np.argsort(-np.abs(pttn[i]))

        vals[i] = np.abs(pttn[i][mx_p[0]]) * (0.1**mx_p[0])

    idx = np.argsort(-vals)

    return v_nms[idx], pttn[idx]

 

 

 

def draw_map(names, xcoord, ycoord, stitle, sxlabel, sylabel):

    plt.figure(figsize=(5, 5))

    plt.title(stitle, fontsize=14)

    plt.xticks([-1, 0, 1])

    plt.yticks([-1, 0, 1])

    plt.xlabel(sxlabel, fontsize=12)

    plt.ylabel(sylabel, fontsize=12)

    plt.plot([-1, 1], [0, 0], c='k', lw=1)

    plt.plot([0, 0], [-1, 1], c='k', lw=1)

    n = len(names)

    for i in range(n):

        plt.plot(xcoord[i], ycoord[i], 'bo', mfc='none')

    for i in range(n):

        plt.text(xcoord[i], ycoord[i], names[i], c='k')

 

    plt.tight_layout()

    plt.show()

 

 

 

Home