In [1]:
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
In [3]:
import matplotlib.font_manager as fm
fonts = fm.findSystemFonts() #fontsリストから使いたいフォントを探しておく
font = fm.FontProperties(fname = '/Users/momma/Library/Fonts/ipag.ttf')
print(font.get_name() , font.get_family()) #seaborn はfontname, matplotlibはfontnameとfamily
sns.set (font=['IPAGothic']) # なぜか1回だけ実行すると sans selifが出るので2回実行
In [4]:
qah = pd.read_csv('2018C1.csv', usecols=[12,14,16,18,20,22,24,26,28,30,32,34,36,38,42,44])
hlist = list(qah)
In [5]:
# dtypeを'category'にするとRでのfactorと同じに扱える
qa = pd.read_csv('2018C1.csv', names=('div','CD','LecName','Lecturer','Season','Day','Time','T','Num','AnsNum',
'AnsTime','Q1','Q1v','Q2','Q2v','Q3','Q3v','Q4','Q4v','Q5','Q5v','Q6','Q6v','Q7','Q7v','Q8','Q8v',
'Q9','Q9v','Q10','Q10v','Q11','Q11v','Q12','Q12v','Q13','Q13v','Q14','Q14v','Q15','Q15v',
'Q16','Q16v','Q17','Q17v','Q18','Q18v'), header=0, dtype='category')
# そのまま読むと数値として扱われる
numqa = pd.read_csv('2018C1.csv', names=('div','CD','LecName','Lecturer','Season','Day','Time','T','Num','AnsNum',
'AnsTime','Q1','Q1v','Q2','Q2v','Q3','Q3v','Q4','Q4v','Q5','Q5v','Q6','Q6v','Q7','Q7v','Q8','Q8v',
'Q9','Q9v','Q10','Q10v','Q11','Q11v','Q12','Q12v','Q13','Q13v','Q14','Q14v','Q15','Q15v',
'Q16','Q16v','Q17','Q17v','Q18','Q18v'), header=0)
In [6]:
qlist = ['Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8', 'Q9','Q10','Q11','Q12']
#qlist = ['Q1','Q2','Q3','Q4','Q5','Q6','Q7','Q8', 'Q9','Q10','Q11','Q12','Q13','Q14','Q16','Q17']
subnumqa = numqa[qlist]
subnumqa.describe()
subqa = qa[qlist]
subqa.describe()
Out[6]:
In [7]:
sns.heatmap(subnumqa.corr())
sns.clustermap(subnumqa.corr())
Out[7]:
In [8]:
ax = sns.countplot('Q1',data=subqa, order=['1','2','3','4','5']) # hue='Q2'とか入れると質問間での関係性が一応見られる
ax.set_xticklabels(['全くそう思わない', 'そう思わない','どちらとも言えない', 'そう思う', '強くそう思う'])
ax.set(xlabel=hlist[0])
Out[8]:
In [9]:
# columnごとに比率を求めるにはapplyでvalue_countsをすると一気に取れる(頻度0はNaNになる)
totalbar = subqa.apply(pd.value_counts)
totalbar = totalbar.fillna(0)
totalbar = totalbar *100/142.0
anslist = ['全くそう思わない', 'そう思わない','どちらとも言えない', 'そう思う', '強くそう思う']
# 積み上げ棒グラフのところはまんま
# https://bunseki-train.com/python_barplot_and_stack_plot_with_color_change/
# を使わせて貰う
fig, ax = plt.subplots()
nQ = len(totalbar.columns)
ticks = np.arange(nQ)
left_data = pd.Series(np.zeros(nQ), index = totalbar.columns.tolist())
for i in range(len(totalbar.index)):
bar_list = ax.barh(ticks, totalbar.iloc[i], left=left_data)
left_data += totalbar.iloc[i]
ax.set_xlim([0,100])
ax.set_yticks(ticks)
ax.set_yticklabels(hlist)
ax.legend(anslist, loc='lower left', shadow=True, frameon=True, bbox_to_anchor=(-1.0, 0.1, 0.5, 0.9))
Out[9]:
In [ ]: