ノート/ノート
ノート/R
訪問者数 4933      最終更新 2014-08-04 (月) 16:52:45

後の方で、グラフを描画する。その時の参照ページはここ

Pandas 〜 Pythonで統計処理(2014-08-01)

元はといえば、Rで相関行列を求めたい? なのだが、入力データを整形するのに、Pythonの方が慣れていそう、という理由。

整形が必要な理由は、文字データが含まれたフィールドがあると、関数corがエラーを返すから。

>>> x <- read.csv("s.csv")
>>> > cor(x)
  以下にエラー cor(x) : 'x' は数値でなければなりません

今対象とするデータには、たとえば学部の欄に「理学部」と書かれたり、選択肢A/Bに対して文字「A」や「B」が書かれているので、こういうところがエラーになるのだろう。これらの部分は、corを用いるには適当なる整形を必要とする(特にA/Bのフィールドなど)。

参考にしたサイト

整形の手段は、

Pandasのインストール

pip install pandas

Pandasのread_csvを使う

参考書 Pythonによるデータ分析入門

参考ページ

Pandasのread_csvを使ってみる

>>> import pandas
>>> x = pandas.read_csv('s.csv')

要素の取り出し

xに対してixを使い、要素のインデックスで指定。二次元なので

print x.ix[1:, 0:2]
  基本情報 Unnamed: 1
1  NaN        NaN
2   10    4432341
3   10    4432131
4   10    4434780
5   10    4432094
6   10    4432072
7   10    4432352
8   10    4432083

範囲指定は、普通はコロンを使うが、複数範囲を結合することはそのままでは出来ない。 それで、rangeジェネレータとリストの'+'演算を使って、こんなことをやってみる。

print x.ix[:, range(0,2)+range(7,12)]
   基本情報 Unnamed: 1 Unnamed: 7 Unnamed: 8 Unnamed: 9 Unnamed: 10 Unnamed: 11
0  検査ID     回答用紙番号      学部コード      学科コード      漢字大学名       漢字学部名       漢字学科名
1   NaN        NaN        NaN        NaN        NaN         NaN         NaN
2    10    4432341         51        523         東邦           理           化学
3    10    4432131         51        523         東邦           理          化学
4    10    4434780         51        523         東邦           理          化学
5    10    4432094         51        523         東邦           理          化学
6    10    4432072         51        523         東邦           理          化学
7    10    4432352         51        523         東邦           理          化学
8    10    4432083         51        523         東邦           理          化学

よしこれで、不要の欄は削ることができる。

表のデータの書き換えをする

表中に、2択の設問でA/Bで答えさせているものがあるが、相関行列を求める際に「文字だとダメ」というルールがあるので、表のその部分の解答結果をA->1、B->0に置き換える。

(失敗した方法)Pythonのmapを使ってみる。

>>> def ab(v):
...     if v=='A':
...         return 1
...     if v=='B':
...         return 0
...     return v
...
>>> list = [1, 3, 'A', 'A', 'B', 4, 2]

>>> map(ab, list)
[1, 3, 1, 1, 0, 4, 2]

のようにしてみる。

ところが、Pandasで読み込んだcsvはデータフレームで、リストではないので、 うまく関数を適用するが(つまり入力側はリストに変換しているらしい)、 出力結果はフレームになっていない。リストになる。

(「カテゴリカルデータをダミー変数化」という方法)

参照 > カテゴリカルデータをダミー変数化

get_dummies()は、A/Bで表しているような「カテゴリカルデータ(統計学を参照)」を、0/1に変換してくれる機能。

>>> import pandas
>>> x = pandas.read_csv('s.csv')
>>> x.ix[2:,99]    初めに中身を見ておくと
2                   B
3                   A
4                   B
5                   B
6                   B
7                   A
8                   A
Name: Unnamed: 99, dtype: object

>>> u = pandas.get_dummies(x.ix[2:,99])  これに対してget_dummiesをすると
>>> u
   A  B
2  0  1
3  1  0
4  0  1
5  0  1
6  0  1
7  1  0
8  1  0

つまり、2列分のデータを生成し、Aの列には(Aなら1、そうでなければ0)、Bの列には(Bなら1、そうでなければ0)を設定するらしい。

これの良い点はpandasのフレームを扱っている中でできること。欠点は、元の列を置き換えてくれるわけではないので、生成結果を元のフレームに追加し、形を整える必要がある(元のA/Bを書いた列を消して、その代わりにたとえばAの列を埋めるとか)。相手がフレームなので、扱いに慣れていない。

(これならいいだろう方法)
いろいろ考えるのも面倒になったので、csvファイルの段階で変換してしまう。csvなら文字列として読んで書き換えをし、結果を書き出せば、まあ性は知れているだろう。

最大の手抜きは、csvファイルのすべてについて、Aなら0、Bなら1と置き換えること。この欠点は、たとえばタイトル行にAとかが入っていると書き換えられてしまう。理想的には、タイトル行を除いて処理すべき。データ中にももし他の欄でAを含むカテゴリカルデータがあると(たとえば、すきな果物は? Apples/Oranges/Bananas/Grapes)、Aだけを書き直してしまうだろう。

幸い、対象のデータではこのような問題はない。どうしても気になるなら、CSVをきちんと理解して(つまりエントリー要素に分けて)、単独のAからなるエントリーを1に変換する、とすれば、Applesを1pplesに変換しない。

もう1つ、カテゴリカルデータの修正が望ましい

被験者の属性のうち、入試区分(フィールド#=16)がカテゴリカルデータであるが、この数値を以下のように変更したい。

入試区分 元の値改変後
一般入試 1030
推薦入試 2020
AO入試 3010
センタ入試4040
その他501

これは、csv取込み後の処理でやってみる。

その他の入力準備

漢字コードは、CSVファイルの状態でnkfなどを使って変換してしまうのが楽だ。
  nkfの引数

出力コード指定-s シフトJIS-w UTF-8-e EUC
入力コード指定(通常は自動判別)-S シフトJISと仮定-E EUCと仮定

相関行列計算と、それをCSV形式で出力すること

pandasでは、corrによって相関行列を求めることができる。

相関係数を出すには

print x.corr()

pandasでは、その出力(フレームになっている)をCSVで吐き出すことができる。

pandas.DataFrame.to_csv
いろいろと指定できるが、あまり凝ることもない。

(x.corr()).to_csv('output.csv')

printで吐き出すと、後で使うのにあまり具合が良くないので、CSVにした。

おまけ CSVをExcelに取り込んだ後、相関係数が大きいところ、小さいところをマークしておく

Excelの「条件付き書式」をつかう。条件付き書式(基本編)

「条件付き書式」から、「セルの強調表示ルール」を選び、そのうちの

ヒストグラムを描く (2014-08-04)

pandasでヒストグラムを描くには、(dataframe名).hist()

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import code
import pandas
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import *

font = {'family': 'VL Gothic',
        'size': '9' }
matplotlib.rc('font', **font)

#xx = pandas.read_csv('s2.csv')
xx = pandas.read_csv('studentdata2.csv')

# フレーム全体に対して、欠測値があればそれを0で置き換える
# fillnaあたりの使い方はたとえば http://highschoolstudent.hatenablog.com/entry/2014/06/15/161125
x = xx.fillna(0)

#ixによって添え字付にみなす。縦軸は:として全要素、横軸は指定範囲のリスト
#print x.ix[:,range(0,10)+range(23,30)+range(99,106)]
#print x.ix[:,range(19,35)]
#print x.ix[:,range(0,10)]
##print x.ix[:,15]

for i in range(0, len(x)):
    u = x.ix[i,15]
    if u == 50:     # その他
        x.ix[i,15] = 1
    elif u == 40:   # センター
        x.ix[i,15] = 40
    elif u == 30:   # AO入試
        x.ix[i,15] = 10
    elif u == 20:   # 推薦入試
        x.ix[i,15] = 20
    elif u == 10:   # 一般入試
        x.ix[i,15] = 30
    else:           # エラー
        x.ix[i,15] = 0

###x.to_csv('temp.csv')  # チェックのため出力

#相関係数を計算する
# 参考 http://oceanmarine.sakura.ne.jp/sphinx/group/group_pandas.html#id33
#c = x.corr()
#print x.corr()

#(x.corr()).to_csv('output.csv')

#ヒストグラムを生成する。pandasでは「ビンニング」と呼ぶ。pandas.cutメソッドを使 う。

#print x.ix[:,40]

#bins = [30,40,50,60,70,80,100]
#groupnames = ["30-40","40-50","50-60","60-70","70-80","80-"]
#hist = pandas.cut(x["意欲_偏差値"], bins, labels=groupnames)
#print hist

#x["5_宿題・課題はきちんとやった"].hist()
#x["学びへの意識(%)"].hist()
#x["進路総合(%)"].hist()
#x["自己理解(%)"].hist()
#x["6_復習をした"].hist()
#x["5_宿題・課題はきちんとやった"].hist()
#x["Q35 機会があれば、外国で勉強や仕事をしてみたい"].hist()
#plt.show()
#plt.savefig("hist.png")
#plt.clf()

i=0
list = ["自己理解(%)","進路条件の明確化(%)","働くことの意味(%)","職業内容理解(%)",
"学びへの意識(%)","意欲_偏差値","自主性_偏差値","適応力_偏差値","自己統制力_ 偏差値",
"ストレス耐性_偏差値","持続力_偏差値","協調性_偏差値","共感力_偏差値","発信力_偏差値",
"説得力_偏差値","指導性_偏差値","創造的態度_偏差値","現実的態度_偏差値","情報収 集力_偏差値",
"論理性_偏差値","規律性_偏差値","国際性_偏差値","IT適応力_偏差値","自己コントロ ール力_偏差値",
"対人関係力_偏差値","社会的な態度_偏差値","営業・販売_得点","広報・宣伝_得点"," 教育_得点",
"運営・調整_得点","社会福祉_得点","システム_得点","技術・生産_得点","企画・開発_得点","国際_得点",
"起業_得点","Q1_進学理由","Q2_入学理由 1位","Q2_入学理由 2位","Q2_入学理由 3位",
"Q3_役立った情報 1位","Q3_役立った情報 2位","Q4_進学先決定時期","Q5_入試形態","Q6_大学志望度",
"Q7_学部・学科志望度","Q8_教育理念","1_専門的勉強","2_コンピューター","3_語学","4_資格取得",
"5_公務員試験対策","6_教員との交流","7_クラブ・サークル","8_社会活動","9_海外留 学","10_友達との交際",
"11_アルバイト","12_対人コミュニケーション","13_思考力","14_文章作成能力","15_幅広い教養",
"16_自己責任能力","17_業種・企業研究","0_楽な授業 1_興味のある授業","0_基礎・基 本 1_応用・発展",
"0_講義形式 1_演習形式","0_決められた履修 1_自由な履修","0_教員の指導 1_学生の自主性",
"Q11_授業への期待 1位","Q11_授業への期待 2位","1_友人ができるか","2_授業についていけるか",
"3_学びたいことがみつかるか","4_学びたいことが学べるか","5_編入・他大学の受験意 向",
"1_できるだけ予習した","2_板書はノートにとった","3_板書以外もノートにとった","4_先生に質問・相談に行った",
"5_宿題・課題はきちんとやった","6_復習をした","7_計画や目標を立てて勉強した","8_予備校や塾で勉強した",
"Q14_英語を身につけたいレベル","Q15_英語の辞書の使い方","1_わかりやすい文章を書 く",
"2_意見や考えを発表する","3_ディスカッションをする","4_図書室や図書館で調べる","5_インターネットで検索する",
"6_新聞やニュースで社会を知る","Q17_読書量","Q18_卒業後の進路","Q19_進路への不安",
#"60.000 ","61.000 ","62.000 ","63.000 ","64.000 ","65.000 ","66.000 ","67.000 ","68.000 ","69.000 ",
#"70.000 ","71.000 ","72.000 ","73.000 ","74.000 ",
"正解4","正解3","正解2","正解5","正解1","正解3.1","正解5.1","正解1.1","正解2.1","正解4.1","正解2.2","正解3.2",
"正解4.2","正解4.3","正解4.4","正解5.2","正解3.3","正解1.2",
#"Q19 アンケート−議論の明確化","Q20 アンケート−議論の明確化","Q21 アンケート−議論の明確化",
#"Q22 アンケート−隠れた前提","Q23 アンケート−隠れた前提","Q24 アンケート−隠れた前提",
#"Q25 アンケート−議論の確かさ","Q26 アンケート−議論の確かさ","Q27 アンケート−議論の確かさ",
"Q1 自分のセールスポイントを把握している","Q6 自分の行動上の強みを知っている",
"Q11 自分の性格の長所と短所をわかっている","Q16 自分の得意な能力分野を知っている",
"Q21 自分に向いた学習方法を知っている","Q2 志望業界がほぼ決まっている",
"Q7 自分の興味に直結する仕事がはっきりしている","Q12 希望の職業に対する条件がは っきりしている",
"Q17 将来のワークスタイルについて希望が明確である","Q22 自分の将来のライフスタイルについてイメージができている",
"Q3 仕事は自分や家族を豊かにできることを理解している",
"Q8 仕事を通じて社会や人間のあり方を学習できることがわかっている",
"Q13 働くことは幸福を追求することにつながることがわかっている","Q18 職業を通じて社会に貢献できることを理解している",
"Q23 仕事を通じて自分の能力や適性を伸ばせることがわかっている","Q4 いろいろな職 業について内容の研究をしている",
"Q9 どのような進路にはどのような適性が必要か理解している",
"Q14 休日の設定、勤務開始時間の違いなどから、仕事内容の違いがイメージできる",
"Q19 どんな仕事にはどんな免許・資格が必要か知っている","Q24 さまざまな仕事について、それぞれどのような講義が役に立つか理解している",
"Q5 大学で学びたい学問がある","Q10 大学で学ぶべきことがわかっている","Q15 自分が大学で身につけたい力がわかっている",
"Q20 大学での学びと自分の目標との関係を理解している","Q25 大学での学びを通じて自分が成長するイメージをもっている",
"Q19 目標が高いほどやる気が出る","Q37 苦手なことにもまずは取り組んでみる","Q109 難しいことでもあきらめないで、努力してやる",
"Q2 手が空いた時には、自分にできることを探して周囲の人に声をかける","Q38 困って いる人に対しては、こちらから声をかける",
"Q74 指示されなくてもやるべきことを見つけて動くことができる","Q39 友人はすぐ作れる方である",
"Q75 新しい学校に入学した時に、すぐに慣れる方である","Q93 いろいろな人と話をして、打ち解けあう",
"Q4 腹が立つと人前でも怒ってしまう方である(逆)","Q58 人から感情的だ、と言われ たことがある(逆)",
"Q112 言ってはいけないことをつい言ってしまう(逆)","Q5 挫折しても立ち直りは早い方だ","Q59 自分は精神的に強い方だ",
"Q113 試験の時あがらない方である","Q60 面倒な作業も途中で投げ出さない","Q96 一度決めたことは、最後までやり遂げる",
"Q114 人からねばり強いと言われる","Q61 ひとりで考えるよりも、みんなと一緒に考え るほうが好きだ",
"Q79 グループ活動には協力的な方である","Q97 何かをする時、友人に手伝ってほしいと頼める",
"Q26 場の空気を読むのが得意","Q44 他人が求めていることがよくわかり、それに応えようとする",
"Q62 人に合わせるのがうまい","Q9 自分の意見をうまく伝えることができる","Q45 あなたの話はわかりやすいと言われたことがある",
"Q81 考えをまとめるのが得意だ","Q46 初対面の人でも、自分の言いたいことをきちんと理解してもらうことができる",
"Q82 何かを決める時、自分の意見が通る方である","Q118 他人に働きかけてものごとを 進めるのは得意である",
"Q65 授業や話し合いの場面では、積極的に自分の意見を言う","Q83 話をまとめたり役割を決めたりするのが得意である",
"Q101 大勢の前で、あいさつをしたり司会をしたりするのが苦にならない","Q66 アイデ アは、人よりもたくさん思い浮かぶ方だ",
"Q102 いろいろ組み合わせて新しいものをつくり出す方だ","Q120 すでに確立された方法や既存の考えにとらわれずに考えることができる",
"Q31 試験勉強をする時は必ず計画を立てる","Q67 限られた時間やお金をいかにうまく使うことができるか注意している",
"Q121 将来の自分に何が必要なのかを考えて、履修科目を選んでいる","Q32 新聞やニュ ースを見る時、いつも「なぜだろう」と考える",
"Q68 ニュースについて自分なりの考えをまとめることができる","Q122 多くの情報から 何が言えるのかを考えることが好きだ",
"Q15 人の意見に対して論理的に反論できる","Q69 議論やディベートが得意である",
"Q87 自分の出した結論について、なぜそう考えたのかを筋道立てて説明できる","Q70 厳しい規則があっても苦にならない",
"Q106 グループで行動する場合、身勝手な行動をすることはない","Q124 何事もフェアでなければ気がすまない",
"Q35 機会があれば、外国で勉強や仕事をしてみたい","Q71 外国語能力の向上のための勉強を継続的にしている",
"Q89 外国の経済・政治・文化など、異文化理解を積極的に行っている","Q18 パソコンやソフトの使い方について人に教えることができる",
"Q72 パソコンを使い、データの加工・分析や結果をグラフなどで表現できる","Q126 パ ソコンのセッティングは自分でできる"]

#list = ["意欲_偏差値", "学びへの意識(%)", "進路総合(%)", "自己理解(%)", "6_復習をした",
  "5_宿題・課題はきちんとやった", "Q35 機会があれば、外国で勉強 や仕事をしてみたい"]

#for u in list:
#    plt.title(u.decode("utf-8"), fontname="VL Gothic", size=10)
#    x[u].hist()
#    plt.show()  # 全部まとめて表示
#    plt.savefig("hist.png")
#    plt.clf()

# subplot間のスペースの調整。wspaceで横、hspaceで縦
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=0.2, hspace=0.4)
for u in list:
    i = i + 1
    print i, "subplot", str((i%9)+1), "savefig",  str(int(i/9))
    subplot(3,3,(i%9)+1)  # 複数の図を同時表示。3x3の図のうちのi番目を描くぞ
    plt.title(u.decode("utf-8"), fontname="VL Gothic", size=10)
    x[u].hist()
    if i%9==0:
          plt.show()  # 9枚まとめて表示
          plt.savefig("hist"+str(int(i/9))+".png")
          plt.clf()

plt.show()  # 最後のページを表示
plt.savefig("hist"+str(int(i/9)+1)+".png")
plt.clf()

#ここから対話モードに移る
####code.InteractiveConsole(globals()).interact()#対話的コンソール

グラフの描画はmatplotlibを使う。参照ページはここ


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-08-04 (月) 16:52:45 (1147d)