徐暢暢
摘要:采用VB 6.0語言開發(fā)數(shù)據(jù)錄入問卷、核對并修改問錄入數(shù)據(jù)錯誤等功能,PYTHON 3.5語言進(jìn)行數(shù)據(jù)統(tǒng)計并繪制相應(yīng)統(tǒng)計學(xué)圖表,Excel文檔進(jìn)行問卷數(shù)據(jù)的保存、輔助問卷錄入,自主研發(fā)出“先行”問卷錄入與分析系統(tǒng)。該系統(tǒng)可高效完成數(shù)據(jù)采集和管理工作,節(jié)約了紙質(zhì)問卷錄入時間;同時該軟件易于實施,數(shù)據(jù)移植性好,后續(xù)輸出的電子數(shù)據(jù)基本不存在亂碼現(xiàn)象;軟件后續(xù)數(shù)據(jù)進(jìn)行科學(xué)管理和統(tǒng)計分析,功能更趨完善,便于社會調(diào)查最終順利實施。
關(guān)鍵詞:計算機;調(diào)查問卷;數(shù)據(jù)錄入;數(shù)據(jù)管理;編程;軟件;VB 6.0;PYTHON 3.5
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2017)35-0109-05
1 背景
隨著21世紀(jì)的到來,我們的社會逐步邁入大數(shù)據(jù)時代,數(shù)據(jù)的收集、分析是處理大數(shù)據(jù)的基礎(chǔ)。目前數(shù)據(jù)收集常采用紙質(zhì)調(diào)查問卷,但紙質(zhì)調(diào)查問卷需要手工輸入問卷數(shù)據(jù),進(jìn)而進(jìn)行統(tǒng)計學(xué)處理。手工轉(zhuǎn)換為電子版的調(diào)查問卷數(shù)據(jù)統(tǒng)計學(xué)處理工作量大,后期數(shù)據(jù)匯總工作繁瑣?,F(xiàn)有的問卷錄入軟件界面繁瑣,使用時往往需要操作者具備一定的專業(yè)常識。以EPIDATA問卷錄入系統(tǒng)為代表相關(guān)軟件,在錄入中文內(nèi)容時容易出現(xiàn)亂碼,并且數(shù)據(jù)的移植性差。
Excel是Windows平臺下電子表格處理軟件,能夠進(jìn)行各種數(shù)據(jù)的處理、統(tǒng)計分析和輔助決策操作。Excel文檔擁有良好的數(shù)據(jù)保管能力,數(shù)據(jù)移植性好,廣泛地應(yīng)用于眾多領(lǐng)域。Visual Basic 6.0(VB 6.0)語言擁有易于學(xué)習(xí),界面設(shè)計容易,與Excel的結(jié)合效果好。PYTHON語言同樣易于學(xué)習(xí),其強大之處在于它有豐富和強大的類庫,可以方便地處理各種需求。PYTHON的繪圖庫(matplotlib庫),是一款功能強大的科學(xué)繪圖庫,修復(fù)中文顯示問題后可以高效率的繪制各種統(tǒng)計學(xué)圖表。綜上所述,結(jié)合Excel、VB 6.0、PYTHON優(yōu)秀之處,可以很好地解決目前問卷錄入系統(tǒng)目前存在的問題。
2 研究內(nèi)容
2.1 軟件設(shè)計的思維導(dǎo)圖
1) 數(shù)據(jù)錄入模塊
2) 數(shù)據(jù)格式判斷模塊:統(tǒng)計學(xué)處理前準(zhǔn)備工作
2.2 “先行”(Forerun)問卷錄入與分析系統(tǒng)設(shè)計理念
“先行”(Forerun)問卷錄入與分析系統(tǒng)(簡稱先行系統(tǒng))應(yīng)該包括問卷錄入、數(shù)據(jù)統(tǒng)一格式保存、數(shù)據(jù)備份和統(tǒng)計學(xué)處理等功能。數(shù)據(jù)錄入工作重復(fù)性質(zhì)較強,需要一定效率的工作,強調(diào)錄入系統(tǒng)準(zhǔn)確和簡潔特質(zhì)。數(shù)據(jù)統(tǒng)一格式保存需要一定的兼容性,文字不易發(fā)生改變。數(shù)據(jù)備份同樣需要一定的格式,保存內(nèi)容在不同機器上不易發(fā)生改變,對于編程語言較為容易操作的性質(zhì)。統(tǒng)計學(xué)處理建立在一定的數(shù)據(jù)保存格式下才能進(jìn)行,需要效率高、精確度高。針對以上的問題,我結(jié)合自身先前的編程經(jīng)歷,決定設(shè)計一套軟件組成的系統(tǒng),配合不同語言的優(yōu)勢進(jìn)行問卷錄入系統(tǒng)軟件設(shè)計。
2.3 先行系統(tǒng)設(shè)計的過程與實際操作流程
VB 6.0語言具有簡單、易于組合軟件界面的特點,且VB與Excel之間的兼容性好,我又經(jīng)常使用,因此我設(shè)計先行系統(tǒng)時首先著手從上述語言開始編寫。我先結(jié)合Excel設(shè)計問卷,并將問卷按照特定形式放于Excel中,方便使用VB進(jìn)行處理。
2.4 先行系統(tǒng)的錄入模塊(基于VB6.0)
1) 問卷錄入的準(zhǔn)備工作
在VB中調(diào)用了“Microsoft Excel 15.0 Object Library”,使VB可以實現(xiàn)對于Excel的打開、關(guān)閉、讀取、寫入功能。新建窗體FORM1,將其命名為 “問題與選項”,聲明與Excel處理有關(guān)的內(nèi)容。
以下為聲明內(nèi)容:
Dim ExApp As New Excel.Application
Dim ExBook As Excel.Workbook
Dim ExWorksheet As Excel.Worksheet
2) 電子問卷模板形成
按下FORM1的按鍵,將Excel中的問題、選項提取至軟件中。
以下代碼實現(xiàn)軟件的問題與選項提取:
Dim aata(1000) As String
……
Dim hata(1000) As String
Set ExApp = CreateObject("Excel.Application")
Set ExApp = New Excel.Application
Set ExBook = ExApp.Workbooks.Open(Text1.Text)
Set xlsheet = ExBook.Worksheets("sheet1")
For i = 1 To Val(Form2.wt.Text) — 1 ‘確定問題的個數(shù),再導(dǎo)入問題及選項內(nèi)容
aata(i) = ExApp.Sheets("sheet1").Range("a" & i).Value
……
hata(i) = ExApp.Sheets("sheet1").Range("h" & i).Value
Next i
ExApp.ActiveWorkbook.Save
ExApp.Workbooks.Close
ExApp.Quit
For q = 0 To Val(Form2.wt.Text) - 2
List1.AddItem aata(q + 1)
……
List8.AddItem hata(q + 1)
Next q
3) 問卷錄入
隨后新建FORM2,將其命名為“錄入?yún)^(qū)”,在其中新建按鈕等。利用CHECK選擇框進(jìn)行問題的勾選,TEXT輸入框進(jìn)行錄入選項,錄入選項同時進(jìn)行備份,配有防關(guān)閉功能,斷點重錄功能,激活“臨時休息區(qū)”(詳見“操作流程”:1.3、1.4)。
以下代碼實現(xiàn)錄入時選項的顯示:
If Check3.Caption = "" Then ‘查找空白項:check1c和heck2為非空白項,檢查check3-8
Check3.Visible = False
End If
……
If Check7.Caption = "" Then
Check7.Visible = False
End If
If Check1.Caption = "(" Then
Text1.Visible = False
Text4.Visible = True ‘打開手工填寫窗口
Text4.SetFocus
End If
以下代碼實現(xiàn)選擇問題選項:
If Val(Text1.Text) = 1 And Len(Check1.Caption) > 0 Then
‘問卷中相應(yīng)問題項,其Len(object.Caption)>0
Check1.Value = 1
End If
……
If Val(Text1.Text) = 7 And Len(Check7.Caption) > 0 Then
Check7.Value = 1
End If
If Val(Text1.Text) = 8 And Len(Check1.Caption) > 0 Then ‘特殊情況窗口被激活
Check8.Value = 1
End If
Text1.Text = ""
以下代碼負(fù)責(zé)在錄入時進(jìn)行備份:
If Text1.Visible = True Then
‘nb.text為問卷序號(1、2、3….),text2.text為問題號,no.caption為問卷編號(例:vx0001)
……
Open "d:\副本 內(nèi)容.txt" For Append As #1
Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & b ‘b為選項
Close #1
Open "d:\副本 數(shù)字.txt" For Append As #2
Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & c ‘c為機械碼
Close #2
Open "d:\副本 內(nèi)容" & no.Caption & ".txt" For Append As #3
Print #3, b
Close #3
Open "d:\副本 數(shù)字" & no.Caption & ".txt" For Append As #4
Print #4, c
Close #4
Text1.SetFocus
End If
If Text4.Visible = True And Len(Text4.Text) > 0 Then
……
Open "d:\副本 內(nèi)容.txt" For Append As #1
Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & Text4.Text
‘text4.text為特殊情況與文字問題錄入的窗口
Close #1
Open "d:\副本 數(shù)字.txt" For Append As #2
Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & "無"
Close #2
Open "d:\副本 內(nèi)容" & no.Caption & ".txt" For Append As #3
Print #3, Text4.Text
Close #3
Open "d:\副本 數(shù)字" & no.Caption & ".txt" For Append As #4
Print #4, "無"
Close #4
4) 數(shù)據(jù)導(dǎo)出
新建FORM3,命名為“導(dǎo)出區(qū)”,保存同時進(jìn)行備份(詳見“操作流程”中1.6)。
以下代碼實現(xiàn)臨時緩存區(qū)內(nèi)的所有內(nèi)容進(jìn)行備份:
listnum = Form4.List4.ListCount
Open "d:\副本 1號.txt" For Append As #1
Print #1, Now
Close #1
Open "d:\副本 2號.txt" For Append As #2
Print #2, Now
Close #2
For i = 1 To listnum
Open "d:\副本 1號.txt" For Append As #3
Print #3, Form4.List3.List(i) ‘備份問題選項臨時存放區(qū)
Close #3
Open "d:\副本 2號.txt" For Append As #4
Print #4, Form4.List4.List(i) ‘備份機械碼臨時存放區(qū)
Close #4
Next i
以下代碼實現(xiàn)保存問題選項的功能(與機械碼保存相同):
Command4_Click ‘對臨時緩存區(qū)內(nèi)的所有內(nèi)容進(jìn)行備份
Label3.Caption = ""
listnum = Form4.List3.ListCount
Dim bata(80000) As String ‘儲存所有問題的選項結(jié)果
Dim x(80000) As String ‘x、y分別儲存Excel文檔的保存坐標(biāo)
Dim y(80000) As String ‘記錄切分點
Dim z(80000) As Single
If Text1.Text = "" Or Text2.Text = "" Then
a = MsgBox("無效路徑!", 256)
Exit Sub
End If
For o = 0 To listnum
bata(o + 1) = Form4.List3.List(o)
Next o
Set ExApp = CreateObject("Excel.Application")
Set ExApp = New Excel.Application
Set ExBook = ExApp.Workbooks.Open(Text1.Text)
Set xlsheet = ExBook.Worksheets("sheet1")
……
For la = 1 To listnum
On Error Resume Next
xlsheet.Cells(Val(y(la)), Val(x(la))).Value = Mid(bata(la), z(la) + 2)
Next la
Label3.Caption = "done"
ExApp.ActiveWorkbook.Save
ExApp.Workbooks.Close
ExApp.Quit
5) 問卷數(shù)據(jù)錄入內(nèi)容的保存與修改
新建FORM4,命名為“臨時收錄區(qū)”,用于支持?jǐn)?shù)據(jù)的保存、修改。
以下部分實現(xiàn)“刪除直接改正法”的“刪除”按鈕:
On Error Resume Next
List1.RemoveItem (List1.ListIndex)
List2.RemoveItem (List2.ListIndex)
List3.RemoveItem (List3.ListIndex)
List4.RemoveItem (List4.ListIndex)
以下部分實現(xiàn)“刪除直接改正法”的“插入”按鈕:
Private Sub List3_Click() ‘問題選項臨時存放區(qū)
Text3.Text = 3
List1.ListIndex = -1
List2.ListIndex = -1
List4.ListIndex = -1
End Sub
Private Sub List4_Click() ‘機械碼臨時存放區(qū)
Text3.Text = 4
List1.ListIndex = -1
List2.ListIndex = -1
List3.ListIndex = -1
End Sub
Private Sub Command4_Click() ‘添加修改內(nèi)容(注意:第一個格子不能修改)
a = InputBox("輸入修改內(nèi)容")
If Len(a) = 0 Then
Exit Sub
End If
If Text3.Text = "1" Then
List1.AddItem a, List1.ListIndex + 1
End If
If Text3.Text = "3" Then
List3.AddItem a, List3.ListIndex + 1
End If
If Text3.Text = "4" Then
List4.AddItem a, List4.ListIndex + 1
End If
End Sub
Private Sub Command6_Click( ) ‘添加修改內(nèi)容(注意:僅能修改第一個格子)
a = InputBox("輸入修改內(nèi)容")
If Len(a) = 0 Then
Exit Sub
End If
If Text3.Text = "1" Then
List1.AddItem a, 0
End If
If Text3.Text = "3" Then
List3.AddItem a, 0
End If
If Text3.Text = "4" Then
List4.AddItem a, 0
End If
End Sub
6) 問卷錄入的安全
新建FORM5,命名為“臨時休息區(qū)”,用于錄入人員在錄入時的臨時休息。臨時休息區(qū)一但激活會關(guān)閉所有其他窗口,解除需要密碼(詳見“操作流程”中1.7)。
以下代碼實現(xiàn)臨時休息區(qū):
Private Sub Command1_Click()
If Text1.Text = "abcdef" Then ‘密碼為abcdef
Form1.Visible = True
Form2.Visible = True
Form4.Visible = True
Form5.Visible = False
End If
Text1.Text = ""
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
‘拒絕常規(guī)關(guān)閉(與錄入?yún)^(qū)防關(guān)閉的代碼相同)
Cancel = True
End Sub
2.3 先行系統(tǒng)的判斷、繪圖模塊(基于PYTHON)
先行系統(tǒng)的錄入部分組裝完成后,我想起新學(xué)的PYTHON語言擁有有高效的、優(yōu)秀的matplotlib庫繪圖能力與良好的數(shù)據(jù)處理能力,采用PYTHON進(jìn)行統(tǒng)計學(xué)處理能提高統(tǒng)計學(xué)處理的速度,同時降低代碼編寫時的錯誤發(fā)生率。
首先進(jìn)行編寫的是排除人工填寫部分,人工填寫部分的內(nèi)容之間存在較大差異性,因此先行系統(tǒng)對這部分?jǐn)?shù)據(jù)不自動進(jìn)行統(tǒng)計學(xué)處理。判斷后的結(jié)果,均以文本文檔形式(后綴為“.txt”的文件,簡稱TXT)保存。
以下代碼實現(xiàn)判斷是否需要進(jìn)行自動繪圖:
a=str(0) #不是為0
b=str(1) #是為1
q=open("1.txt",'r')
for line in q:
s=line
t=s.split()
if (t[0][0].__contains__("(")) == True:
t1=open("2.txt",'a')
t1.write(b+"\n")
t1.close()
if (t[0][0].__contains__("(")) == False:
t2=open("2.txt",'a')
t2.write(a+"\n")
t2.close()
q.close()
繪圖部分以TXT為媒介,結(jié)合之前的判斷內(nèi)容與后續(xù)添加的內(nèi)容進(jìn)行科學(xué)繪圖。
以下代碼實現(xiàn)自動繪圖:
cnames = [ #繪圖顏色(無黑色和不易辨別的顏色)
'#F0F8FF',
'#00FFFF',
'#7FFFD4',
……]
panduan=[] #判斷是否需要自動繪圖
cn=[] #所有問題的選項結(jié)果
que=[] #問卷的問題
choose=[] #問卷題目的選項
huancun1=[] #緩存區(qū)1
huancun2=[] #緩存區(qū)2
huancun3=[] #緩存區(qū)3
qunub=0 #問題數(shù)量
st1=open("2.txt",'r')#讀取判斷表
for line in st1:
s=line
t=s.split()
panduan=panduan + t
st1.close()
t=""
s=""
st2=open("cn.txt",'r') #讀取錄入的中文
for line in st2:
s=line
t=s.split()
if len(huancun1) huancun1=huancun1 + t if len(huancun1)==len(t): cn.append(huancun1) huancun1=[] st2.close() t="" s="" st4=open("que.txt",'r') #讀取問題 for line in st4: s=line t=s.split() que=que+t qunub=int(qunub)+1 st4.close() t="" s="" st5=open("1.txt",'r') #讀取問題的選項
for line in st5:
s=line
t=s.split()
if len(huancun3) huancun3=huancun3 + t if len(huancun3)==len(t): choose.append(huancun3) huancun3=[] st5.close() del s,t,line,huancun1,huancun2,huancun3 import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib.font_manager import FontProperties for i in range(qunub): savename=i+1 tit=str(i+1)+"."+que[i] cn1=cn[i] pan=panduan[i] labels=[] inside=[] if pan=="0": #pan為1或其他字符,則不需畫圖 …… for s4 in range(len(labels)): #對選項進(jìn)行折疊,防止問題過長超出畫布 labels[s4]=labels[s4]+'('+inside[s4]+'人)' if len(labels[s4])>15: zz=len(labels[s4]) for n in range (10,zz+1,10): labels[s4]=labels[s4][:n]+'\n'+labels[s4][n:] …… pie=plt.pie(inside,labels=labels,autopct='%1.2f%%',colors=cnames) #設(shè)置為繪制餅圖,顯示百分比 …… a.set_size_inches(18.5, 10.5) #設(shè)置畫布大小 a.savefig('圖表/'+str(savename)+'.png',dpi=90) a.show() 以上海市xxx小學(xué)的數(shù)據(jù)為例,成功的導(dǎo)出了錄入數(shù)據(jù)與統(tǒng)計學(xué)圖表,軟件的測試獲得了成功(詳見“操作流程”、“圖表”文件夾)。 3 結(jié)束語 本軟件界面操作簡潔,無需太多計算機方面的知識即可掌握操作方法。 軟件運行快捷,有效的提高了問卷錄入的速度;基層使用者大多數(shù)熟悉Excel的基本操作,對于數(shù)據(jù)的管理提供了便利,也減低了數(shù)據(jù)管理對使用者的難度。充分利用了VB的界面設(shè)計、PYTHON的繪圖能力與Excel的數(shù)據(jù)移植性方面的優(yōu)勢,與現(xiàn)有的許多的問卷錄入軟件不支持中文相比,本軟件幾乎完美 地支持中文。有關(guān)閉密碼,無法通過常規(guī)方法關(guān)閉,提高了錄入的安全性。因此,該軟件的適用范圍較為廣泛,有較大的使用前景和推廣價值。 總之,通過先行系統(tǒng)進(jìn)行數(shù)據(jù)錄入及統(tǒng)計學(xué)處理,可高效完成數(shù)據(jù)采集和管理工作,大大節(jié)約了紙質(zhì)問卷錄入時間與確保錄入時的安全,軟件后續(xù)數(shù)據(jù)進(jìn)行科學(xué)管理和統(tǒng)計分析,便于社會調(diào)查最終順利實施。 參考文獻(xiàn): [1] 范蔭恒.《物理化學(xué)實驗》數(shù)據(jù)處理系統(tǒng)軟件的開發(fā)及應(yīng)用[J]. 計算機與應(yīng)用化學(xué), 2005(11):1066-1069. [2] 孔玉. 臨床試驗數(shù)據(jù)管理軟件的開發(fā)與應(yīng)用[J]. 第二軍醫(yī)大學(xué), 2007(63). [3] 龐勝利. Python環(huán)境下用pyExcelerator操作Excel[J]. 電腦編程技巧與維護(hù), 2009(20):48-49,64. [4] 魏紹蓉. 基于Visual Basic與Excel相結(jié)合的問題研究[J]. 青海師范大學(xué)學(xué)報:自然科學(xué)版, 2010(1):67-69. [5] 羅隆福. 基于VB的電力機車牽引變壓器分析軟件開發(fā)[J]. 湖南大學(xué)學(xué)報:自然科學(xué)版, 2011(7):43-47. [6] 陸健. 臨床試驗電子化數(shù)據(jù)管理與統(tǒng)計分析系統(tǒng)的開發(fā)及應(yīng)用[D].上海: 第二軍醫(yī)大學(xué), 2012. [7] 孫玉環(huán). 基于EpiData與SAS系統(tǒng)的紙版問卷數(shù)據(jù)錄入質(zhì)量控制技巧[J]. 中國衛(wèi)生統(tǒng)計, 2012(4):607-608,611. [8] 李瀟. 基于excel的數(shù)據(jù)管理及其在公共衛(wèi)生領(lǐng)域內(nèi)的應(yīng)用[J]. 中國衛(wèi)生統(tǒng)計, 2014(6):1084-1086.