徐暢暢
摘要:采用VB 6.0語言開發(fā)數據錄入問卷、核對并修改問錄入數據錯誤等功能,PYTHON 3.5語言進行數據統(tǒng)計并繪制相應統(tǒng)計學圖表,Excel文檔進行問卷數據的保存、輔助問卷錄入,自主研發(fā)出“先行”問卷錄入與分析系統(tǒng)。該系統(tǒng)可高效完成數據采集和管理工作,節(jié)約了紙質問卷錄入時間;同時該軟件易于實施,數據移植性好,后續(xù)輸出的電子數據基本不存在亂碼現(xiàn)象;軟件后續(xù)數據進行科學管理和統(tǒng)計分析,功能更趨完善,便于社會調查最終順利實施。
關鍵詞:計算機;調查問卷;數據錄入;數據管理;編程;軟件;VB 6.0;PYTHON 3.5
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2017)35-0109-05
1 背景
隨著21世紀的到來,我們的社會逐步邁入大數據時代,數據的收集、分析是處理大數據的基礎。目前數據收集常采用紙質調查問卷,但紙質調查問卷需要手工輸入問卷數據,進而進行統(tǒng)計學處理。手工轉換為電子版的調查問卷數據統(tǒng)計學處理工作量大,后期數據匯總工作繁瑣。現(xiàn)有的問卷錄入軟件界面繁瑣,使用時往往需要操作者具備一定的專業(yè)常識。以EPIDATA問卷錄入系統(tǒng)為代表相關軟件,在錄入中文內容時容易出現(xiàn)亂碼,并且數據的移植性差。
Excel是Windows平臺下電子表格處理軟件,能夠進行各種數據的處理、統(tǒng)計分析和輔助決策操作。Excel文檔擁有良好的數據保管能力,數據移植性好,廣泛地應用于眾多領域。Visual Basic 6.0(VB 6.0)語言擁有易于學習,界面設計容易,與Excel的結合效果好。PYTHON語言同樣易于學習,其強大之處在于它有豐富和強大的類庫,可以方便地處理各種需求。PYTHON的繪圖庫(matplotlib庫),是一款功能強大的科學繪圖庫,修復中文顯示問題后可以高效率的繪制各種統(tǒng)計學圖表。綜上所述,結合Excel、VB 6.0、PYTHON優(yōu)秀之處,可以很好地解決目前問卷錄入系統(tǒng)目前存在的問題。
2 研究內容
2.1 軟件設計的思維導圖
1) 數據錄入模塊
2) 數據格式判斷模塊:統(tǒng)計學處理前準備工作
2.2 “先行”(Forerun)問卷錄入與分析系統(tǒng)設計理念
“先行”(Forerun)問卷錄入與分析系統(tǒng)(簡稱先行系統(tǒng))應該包括問卷錄入、數據統(tǒng)一格式保存、數據備份和統(tǒng)計學處理等功能。數據錄入工作重復性質較強,需要一定效率的工作,強調錄入系統(tǒng)準確和簡潔特質。數據統(tǒng)一格式保存需要一定的兼容性,文字不易發(fā)生改變。數據備份同樣需要一定的格式,保存內容在不同機器上不易發(fā)生改變,對于編程語言較為容易操作的性質。統(tǒng)計學處理建立在一定的數據保存格式下才能進行,需要效率高、精確度高。針對以上的問題,我結合自身先前的編程經歷,決定設計一套軟件組成的系統(tǒng),配合不同語言的優(yōu)勢進行問卷錄入系統(tǒng)軟件設計。
2.3 先行系統(tǒng)設計的過程與實際操作流程
VB 6.0語言具有簡單、易于組合軟件界面的特點,且VB與Excel之間的兼容性好,我又經常使用,因此我設計先行系統(tǒng)時首先著手從上述語言開始編寫。我先結合Excel設計問卷,并將問卷按照特定形式放于Excel中,方便使用VB進行處理。
2.4 先行系統(tǒng)的錄入模塊(基于VB6.0)
1) 問卷錄入的準備工作
在VB中調用了“Microsoft Excel 15.0 Object Library”,使VB可以實現(xiàn)對于Excel的打開、關閉、讀取、寫入功能。新建窗體FORM1,將其命名為 “問題與選項”,聲明與Excel處理有關的內容。
以下為聲明內容:
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 ‘確定問題的個數,再導入問題及選項內容
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,將其命名為“錄入區(qū)”,在其中新建按鈕等。利用CHECK選擇框進行問題的勾選,TEXT輸入框進行錄入選項,錄入選項同時進行備份,配有防關閉功能,斷點重錄功能,激活“臨時休息區(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
‘問卷中相應問題項,其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 = ""
以下代碼負責在錄入時進行備份:
If Text1.Visible = True Then
‘nb.text為問卷序號(1、2、3….),text2.text為問題號,no.caption為問卷編號(例:vx0001)
……
Open "d:\副本 內容.txt" For Append As #1
Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & b ‘b為選項
Close #1
Open "d:\副本 數字.txt" For Append As #2
Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & c ‘c為機械碼
Close #2
Open "d:\副本 內容" & no.Caption & ".txt" For Append As #3
Print #3, b
Close #3
Open "d:\副本 數字" & 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:\副本 內容.txt" For Append As #1
Print #1, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & Text4.Text
‘text4.text為特殊情況與文字問題錄入的窗口
Close #1
Open "d:\副本 數字.txt" For Append As #2
Print #2, Val(nb.Text) & "(" & Val(Text2.Text) - 1 & ")" & "無"
Close #2
Open "d:\副本 內容" & no.Caption & ".txt" For Append As #3
Print #3, Text4.Text
Close #3
Open "d:\副本 數字" & no.Caption & ".txt" For Append As #4
Print #4, "無"
Close #4
4) 數據導出
新建FORM3,命名為“導出區(qū)”,保存同時進行備份(詳見“操作流程”中1.6)。
以下代碼實現(xiàn)臨時緩存區(qū)內的所有內容進行備份:
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ū)內的所有內容進行備份
Label3.Caption = ""
listnum = Form4.List3.ListCount
Dim bata(80000) As String ‘儲存所有問題的選項結果
Dim x(80000) As String ‘x、y分別儲存Excel文檔的保存坐標
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) 問卷數據錄入內容的保存與修改
新建FORM4,命名為“臨時收錄區(qū)”,用于支持數據的保存、修改。
以下部分實現(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() ‘添加修改內容(注意:第一個格子不能修改)
a = InputBox("輸入修改內容")
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( ) ‘添加修改內容(注意:僅能修改第一個格子)
a = InputBox("輸入修改內容")
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ū)一但激活會關閉所有其他窗口,解除需要密碼(詳見“操作流程”中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ī)關閉(與錄入區(qū)防關閉的代碼相同)
Cancel = True
End Sub
2.3 先行系統(tǒng)的判斷、繪圖模塊(基于PYTHON)
先行系統(tǒng)的錄入部分組裝完成后,我想起新學的PYTHON語言擁有有高效的、優(yōu)秀的matplotlib庫繪圖能力與良好的數據處理能力,采用PYTHON進行統(tǒng)計學處理能提高統(tǒng)計學處理的速度,同時降低代碼編寫時的錯誤發(fā)生率。
首先進行編寫的是排除人工填寫部分,人工填寫部分的內容之間存在較大差異性,因此先行系統(tǒng)對這部分數據不自動進行統(tǒng)計學處理。判斷后的結果,均以文本文檔形式(后綴為“.txt”的文件,簡稱TXT)保存。
以下代碼實現(xià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為媒介,結合之前的判斷內容與后續(xù)添加的內容進行科學繪圖。
以下代碼實現(xiàn)自動繪圖:
cnames = [ #繪圖顏色(無黑色和不易辨別的顏色)
'#F0F8FF',
'#00FFFF',
'#7FFFD4',
……]
panduan=[] #判斷是否需要自動繪圖
cn=[] #所有問題的選項結果
que=[] #問卷的問題
choose=[] #問卷題目的選項
huancun1=[] #緩存區(qū)1
huancun2=[] #緩存區(qū)2
huancun3=[] #緩存區(qū)3
qunub=0 #問題數量
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)): #對選項進行折疊,防止問題過長超出畫布 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) #設置為繪制餅圖,顯示百分比 …… a.set_size_inches(18.5, 10.5) #設置畫布大小 a.savefig('圖表/'+str(savename)+'.png',dpi=90) a.show() 以上海市xxx小學的數據為例,成功的導出了錄入數據與統(tǒng)計學圖表,軟件的測試獲得了成功(詳見“操作流程”、“圖表”文件夾)。 3 結束語 本軟件界面操作簡潔,無需太多計算機方面的知識即可掌握操作方法。 軟件運行快捷,有效的提高了問卷錄入的速度;基層使用者大多數熟悉Excel的基本操作,對于數據的管理提供了便利,也減低了數據管理對使用者的難度。充分利用了VB的界面設計、PYTHON的繪圖能力與Excel的數據移植性方面的優(yōu)勢,與現(xiàn)有的許多的問卷錄入軟件不支持中文相比,本軟件幾乎完美 地支持中文。有關閉密碼,無法通過常規(guī)方法關閉,提高了錄入的安全性。因此,該軟件的適用范圍較為廣泛,有較大的使用前景和推廣價值。 總之,通過先行系統(tǒng)進行數據錄入及統(tǒng)計學處理,可高效完成數據采集和管理工作,大大節(jié)約了紙質問卷錄入時間與確保錄入時的安全,軟件后續(xù)數據進行科學管理和統(tǒng)計分析,便于社會調查最終順利實施。 參考文獻: [1] 范蔭恒.《物理化學實驗》數據處理系統(tǒng)軟件的開發(fā)及應用[J]. 計算機與應用化學, 2005(11):1066-1069. [2] 孔玉. 臨床試驗數據管理軟件的開發(fā)與應用[J]. 第二軍醫(yī)大學, 2007(63). [3] 龐勝利. Python環(huán)境下用pyExcelerator操作Excel[J]. 電腦編程技巧與維護, 2009(20):48-49,64. [4] 魏紹蓉. 基于Visual Basic與Excel相結合的問題研究[J]. 青海師范大學學報:自然科學版, 2010(1):67-69. [5] 羅隆福. 基于VB的電力機車牽引變壓器分析軟件開發(fā)[J]. 湖南大學學報:自然科學版, 2011(7):43-47. [6] 陸健. 臨床試驗電子化數據管理與統(tǒng)計分析系統(tǒng)的開發(fā)及應用[D].上海: 第二軍醫(yī)大學, 2012. [7] 孫玉環(huán). 基于EpiData與SAS系統(tǒng)的紙版問卷數據錄入質量控制技巧[J]. 中國衛(wèi)生統(tǒng)計, 2012(4):607-608,611. [8] 李瀟. 基于excel的數據管理及其在公共衛(wèi)生領域內的應用[J]. 中國衛(wèi)生統(tǒng)計, 2014(6):1084-1086.