ac elper ext(パックヘルパーテキスト)ページ

         Total   Yesterday   Today

ここでは試験公開中のPythonによるPAC分析支援ツール「PHT」を説明します。

(試験的な運用です。ご感想ご要望などは、「お問い合わせ」ページで送ってください)

※ PAC分析用の「データ収集」後すぐに「デンドログラム作図」が可能です。

3段階で説明しています。必要な箇所から読み進めてください。(2023.4.5)

  1.Python と Google Colaboratory の説明

  2.実際の利用法(テキストベースの実施方法)

  3.各種設定や変更の仕方


.Python と Google Colaboratory の説明

Python(パイソン)は、命令コードを書いて機械(PC)に実行させると、すぐに結果を
得られるとても手軽な言語(スクリプト)です。シンプルなテキストベースで動きますが、
とても多くのライブラリー(道具になるアプリケーション)があるので、高度な使い方も
可能です。このPHTでは、GUI(Graphical User Interface)は使わないで、一行ずつ
のテキスト形式で進めます。見たままの入力なのですぐに始められます。

プログラム(アプリ)を自分のPCに導入する使い方もありますが、ここではクラウドに
置かれたプログラムを動かす使い方をします。そのためにはGoogleのアカウントで、
Colaboratory(略称Colab)を使えるようにします。既にアカウントがありColabの経験が
ある場合は、次の段落に進んでください。まだの方は、Googleの ページでアカウントを
取得したり、Colabの基本的な使用法を確認してください。

      ・Google アカウントの取得

      ・Colaboratory の説明

Googleのアカウントを取得して、Colaboratoryにログインしたことで、実際の利用法に
進むことができます。

「Colaboratoryへようこそ」では、インタラクティブなページを試すことができます。
充分に試用を重ねて慣れてください。その後に次の段階に進んでください。


2.実際の利用法

 PAC分析の提示刺激を調査協力者に示して説明を終えてから、このプログラムを
動かし、データ収集をします。手順はステップは4段階で、@調査協力者が想起した
項目を記録し、A重要度順の並び替えをし、B項目間の類似度を評定し、C各項目
との正負評定を記録して収集は終わります。

その後に、類似度評定のデータからデンドログラムを作図して処理は終わります。
最初の、コードを読み込ませてプログラムを走らせるところから順に説明します。

2−1 コードを「コピペ」してスタートボタンをクリックする -----------------

プログラム(のコード)は、この項の末尾に載せています。それをColabのページ
にコピー&ペーストしてから、横向き三角のスタートボタンを押すことで聞き取り
を始められます。

「Colaboratoryへようこそ」のページで、左上にある「ファイル」をクリックすると、
プルダウンメニューに「ノートブックを新規作成」が出てくるので、それを選んで
ください。新しい白い画面が出たら、そこにコードをコピペします。

上の図は新規作成直後のノートブックです。ファイル名は自分で書き換え可能です。
1の数字部分にコードを書き込み(貼り付け)ます。実行は左にある三角ボタンです。
最初に一回だけ動かすコードを読み込ませて実行します。次の図で説明します。

作図用のサブルーチンで日本語を扱うための読み込みです。三角ボタンでスタート
させると、画面に処理経過のテキスト列が並びますが、そのまま処理が終わるまで
待ちます。ネットの回線速度やPCの処理能力で待ち時間は変わりますが、1分間
を越えることはないでしょう。処理が進行中は三角ボタンの外側で円が回転します。
(行番号の数字は自動で割り振られるので、気にしなくて結構です)

読み込みが終わると、上のような表示が出て、三角ボタンの回転も止まります。
もしボタンが赤色になったり、回転が続くようならエラーなので最初からの手順を
見直し、再度やり直してください。同じエラーが続くようなら、別な対応が必要です。

次に本体のプログラムをコピペします(この項の末尾にある長い方のコードです)。
この時に、左上の「+コード」の部分をクリックして新しいコード入力枠を用意すると
便利です。新しいコード枠にペーストすると、独立した操作ができるようになります。
下の図は新しい枠にコードを貼り付けた状態の例です。

ここまでが準備です。この状態で下の△ボタン(赤い円表示)をクリックすると、本体
プログラムが動き出します。

2−2 想起項目の入力 --------------------------------------------

まず最初に保存ファイル名を入力します。
半角英数字のみで、特殊文字や記号は使えません。プログラムの途中で自動的に
保存されるファイルを見分けやすくするためには、10文字程度までがよいでしょう。
(拡張子は不要です。保存ファイル名には自動で付加されます)

ファイル名を書き込んでリターンキーを押すと、項目入力が始まります。協力者の
言葉を聞き取りテキスト入力します。文字数に制限はありませんが、長すぎると図示
する際などに特別な調整が必要になる場合があります。

最後の項目を入力した後は、半角で eee と入力します。これが合図になって入力
が終わり、次の重要度順の並び替えに進みます。

入力する項目数に制限はありませんが、類似度評定で対比する組み合わせが多く
なる場合があります。n項目あると、(n*(n-1))/2の組み合わせとなります。10項目だ
と、(10*9)/2で45の組み合わせで、15項目だと105の組み合わせになります。
同じような内容があれば、項目をまとめるなどの対応も考えられます。

2−3 重要度順の並び替え -----------------------------------------

入力欄がつぎの図のように変わります。重要度順の並び替えの指定は、1_2の
ように半角数字で書きます。元の番号数字にスペースを挟み移動先の数字を書く、
という意味です。この指示では、項目が入れ替わるだけなので順番が自動で繰り
上がったりはしないので注意してください。

並び替えが終わったら、0 0(0スペース0)と半角で入力します。これが合図です。
協力者から「並び替えなくてよい(想起した順番=重要度順)」、と言われた場合
は、1 1(1スペース1)のように入力した後で、終わりの合図の0 0を入力するよう
にしてください。プログラム上の手順と理解してください。

2−4 類似度評定 ---------------------------------------------

入力欄が切り替わると、対になった項目を比べて両者の距離評定となります。
(この項目間の距離を「類似度」と表現しています)
入力枠左端を1として、右端を7として、その間の任意の位置に入力プロンプト
(カーソル)を移動させてリターンキーを押します。右への移動はspaceキーで、
左への移動はBack spaceキーを使います。

組み合わせの数が決まっているので、最後の比較が終わるまで自動的に進み
ます。全ての組み合わせが終わると次ステップに進みます。表示される項目は
文字数が制限されています。長い項目の場合は、省略された部分を補って説明
してください。入力枠の幅と、上の尺度がずれる場合は、入力枠の端から端まで
が基準になると説明してください。PCの解像度などに影響されるせいです。

2−5 正負の評定 ---------------------------------------------

最後の入力は、項目ごとに正(プラスのイメージ)か、負(マイナスのイメージ)か
を順に聞き取るものです。どちらでもない、決めかねる、ちょうど真ん中ぐらい、
という場合は、*(アスタリスク)を入力します。

入力枠の上に表示されているのは、距離行列です。確認用に表示させているだけ
なので、特に気にする必要はありません。入力は、半角で−か、+か、*を書いて
リターンキーを押します。項目数だけ繰り返して入力は終了します。

2−6 デンドログラムの作図 ---------------------------------------

データ入力が終わると、「これで入力は終わりです。デンドログラムを作図します。
Enterキーを押すと、描画後に終了します。」と表示されます。
説明文の通りにEnterキーを押して、作図に進んでください。

自動的にデンドログラムの描画が始まり、自動で終了します。グラフ画像の部分
が最下段に表示されるので、画面の右にあるスクロールバーを動かして図が見
えるようにしてください。(エラーが出た場合でも、データは保存されています)

図の上にマウスのポインター移動させ、右クリックしてポップアップメニューを出し
て、そこの「画像をコピー」をするとデンドログラムがコピーされるので、別に用意
したプレゼンテーションソフト(パワーポイントなど)に貼り付けて、PAC分析の次
に行う統合過程の聞き取りに進めていきます。

 

コード(この2種類のスクリプトを、Google Colabにコピー&ペーストする)


#グラフ画面の日本語処理用ライブラリー導入(最初に一回だけ)
!apt-get -y install fonts-ipafont-gothic
!pip install japanize-matplotlib
#Pac_Helper_Text(PHT) Ver.1 20230321 H.Konno
#保存ファイル名入力、項目入力、重要度順、類似度、正負評定
#引き続きデンドログラムを描画し終了
#必要なファイル(kyori.txtなど)はローカルにダウンロード可能
#1.データ収集
import random #乱数利用のインポート
namae0 = input('Filesname? ')
namae1 = namae0 + "_bun.txt"
f = open(namae1, 'w')
print('[浮かんだイメージを教えてください]')
print('---最後はeeeと入力---')
kazu = 0
bun = ""
hako = [namae0]
hako1 = ['dummy']
hako2 = ['dummy']
while True:
    kazu += 1
    bun = input('入力(Last:eee) ')
    bun1 = bun + str(kazu)
    hako.append(bun1)
    hako1.append(bun)
    hako2.append(bun1)
    if bun == ('eee'):
        break   
f.writelines(hako)
f.close()
namae2 = namae0+"_juyou.txt"
f = open(namae2,'w')
print('[反応文一覧]')
for i,youso in enumerate(hako):
    if i != 0 and i != kazu:
        print (i,youso)
print('[重要度順の入れ替え]')
print('---最後は0space0と入力---')
print('(同順の場合は1 1の後に0 0と入力')
i = 0; bun=""; jubun=""
while True:
    moto,saki=(int(x) for x in input('元(space)先 ').split())
    if moto == 0 and saki == 0: 
        break
    jubun=""
    hako[moto], hako[saki] = hako[saki], hako[moto]
    hako1[moto],hako1[saki]=hako1[saki],hako1[moto] 
    for i,youso in enumerate(hako):
      if i != 0 and i != kazu:
        bun = str(i)+youso
        print(bun) #(i,youso)
        jubun=jubun+bun+','
f.writelines(jubun) #重要度順のファイル保存
f.close()
hako1.pop(0)
str1 = jubun
seibun = str1.split(',')
print('[類似度の評定]')
print('---対提示文相互の距離---')
print('---SpaceキーとBSキーで操作し、Enterキーで確定---')
import random #乱数利用のインポート
kazu = kazu-1
kazu1 = int(kazu * (kazu-1) / 2)
print('kazu1=', kazu1)
check1 = [[0] * kazu for i in range(kazu)]#配列を0で初期化
count=0; i=0; j=0; hajime=1
jun = random.sample(range(kazu1), kazu1) #重複なし乱数を変数に代入
print('jun',jun) #(random.sample(range(kazu1), kazu1)) #乱数変数を表示
for i in range(kazu):
  for j in range(hajime, kazu):
      check1[i][j] = jun[count]+1
      count += 1
  hajime = hajime + 1
print(*check1, sep='\n') #配列の改行表示
f = open('ransu.txt','w')
check1list = str(check1)
f.writelines(check1list) #checklistのファイル保存
f.close()
ban=0
kyori = [[0] * kazu for i in range(kazu)] #距離保存の配列宣言
#2.保存乱数から行と列を取得し類似度評定
for h in range(kazu1):
  ban = h+1
  for i in range(kazu):
     for j in range(kazu):
      if check1[i][j]==ban:
        tt=i+1; yy=j+1
        print(tt,'-',yy)
        tate=tt-1; yoko=yy-1 #二次元配列の指定
        print(check1[tate][yoko])
  print('「',hako1[tate][:12],'」と','「',hako1[yoko][:12],'」の遠近を、')
  print('7段階のspace距離で評定します。')
  print('1近2 3 4 5 6遠7')
  aida1 = input()
  print(aida1)
  aida2 = len(aida1); aida3 = aida2 / 6.9 +1
  if aida3 > 7:
      aida3 = 7
  #print(aida2,aida3)
  kyori[tate][yoko]=aida3
  kyori[yoko][tate]=aida3
print(seibun)
print(*kyori, sep='\n')
#3.正負評定
print('[正負の評定]')
print('---(―) (*) (+)---')
namae3 = namae0+"_seifu.txt"
f = open(namae3,'w')
for i in range(kazu):
  seifu = seibun[i]
  print(seifu)
  pm=input('[- * +]? ')
  seibun[i]=seifu+pm
seibun.pop
seibunlist = str(seibun)
f.writelines(seibunlist) # 正負評定のファイル保存
f.close()
hako1.pop()
namae4 = namae0+"_kyori.txt"
f = open(namae4,'w')
bubun1 = str(kazu)
bubun2 = str(seibun)
zenbu = bubun1+bubun2+str(kyori)
f.writelines(zenbu)
f.close()
print('これで入力は終わりです。デンドログラムを作図します。')
sakuzu = input('Enterキーを押すと、描画後に終了します。')
#-----------------------------------------------------------
import japanize_matplotlib
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import scipy.spatial.distance as distance
#import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram
from random import random
from pandas import DataFrame, Series
import pandas as pd
import io
koumoku = ""
data_labels = []
n0 = str(kazu) ##  n0 = f.readline()
print ("第1行"+n0) 
n=n0; n1=n0  #    n, n1 = n0.split(',')
n = int(n)
koumoku = seibun[:-1]    ##koumoku0 = f.readline().rstrip()
koumoku0 = str(koumoku)
print(koumoku0)
#距離行列データ読み込み
data = kyori #data = pd.read_csv(f,header=None)
data_labels = koumoku
#距離行列の要素間距離計算(ユークリッド距離)
dMatrix = np.zeros([n, n])
for i in range(n):
  for j in range(n):
            dMatrix[i, j] = distance.euclidean(data[i], data[j])
#距離ベクトル生成
dArray = distance.squareform(dMatrix)
 
#クラスタリング(ward法)
result = linkage(dArray, method = 'ward')
 
#図示(左側に項目で右に統合)
dendrogram(result, labels = data_labels, orientation = 'right')
plt.savefig("namae1.jpg")

 

3.各種設定や変更の仕方

3−1 自動保存ファイルのダウンロード

自動で保存されたファイルにアクセスするには、ノードブックの左端に並んでいる
アイコンの一つ(下図の赤い円)をクリックして、フォルダを表示させます。

 

フォルダ内には、つぎのようなファイルが保存されています。
ただし、これらのファイルは仮の保存なので、ダウンロードしておくことで確実に
保存しておくことが可能になります。

最も重要なのは、○○○_kyori.txt と名付けられたファイルです。この中には、
全ての想起項目・想起順(項目の右)・重要度順(項目の左)・項目の正負評定
・距離行列が書き込まれています。ファイル名にマウスのポインタを置くと右に
三つ星のメニューが出ます。そこをクリックすると、ダウンロードを選べるので、
自分のPCやネット上(クラウド)の指定した場所に保存してください。

namae1.jpgは、デンドログラムの画像ファイルで、同様にダウンロードできます。

3−2 デンドログラムの描画設定

デンドログラムの描画法を指定しているコードは、長いスクリプトの最後部分
にあります。'ward'の部分でward法を指定しています。ここを書き換えると、
別なタイプの表示にできます。

(指定箇所1)

#クラスタリング(ward法)
result = linkage(dArray, method = 'ward')

同様に、グラフを横向きにする指定は、'right'の部分です。ここを書き換える
ことで縦に表現することもできます。

(指定箇所2)

#図示(左側に項目で右に統合)
dendrogram(result, labels = data_labels, orientation = 'right')

(#が先頭にある行は、コメントです。実際の処理には関係しません)

他にもグラフ作成についての細かい指定ができます。詳しい指定方法などは、
個別に調べてください。

3−3 共有フォルダからのColab利用

共有フォルダにあるコードを使って、コピペなしでプログラムを走らせる方法
もあります。その手順については、もう少しこのコピペ方式を試した後に考え
ていきます。それまでに使い勝手について感想やご意見をお寄せください。
学会ホームページの「お問い合わせ」から送ることができます。

3−4 入力間違いで書き直しをしたい場合

テキストベースで、一行ずつ処理していくスタイルなので溯っての修正が
しにくいです。書き間違いがあった場合でも、そのまま進めて行って、後で
ファイルを開き直して修正をしてください。協力者にも説明して、誤入力でも
そのまま進めることで了承を得てください。

その他、プログラム(コード)のバージョンアップや修正は、ホームページ上
に書いていきます。お気づきの点なども、お気軽に「お問い合わせ」まで
送ってください。

                           H.Konno (2023.3.30)