尹喆 尚笑梅
摘 要:以目前熱門的數(shù)據(jù)分析處理編程語言Python為開發(fā)工具,綜合運(yùn)用numpy、pandas、matplotlib等第三方庫,對(duì)用服裝非接觸式人體測(cè)量儀測(cè)得的頸根圍、胸圍、腰圍原數(shù)據(jù)進(jìn)行清洗,去噪,以及可視化展示,最終得到高質(zhì)量可用數(shù)據(jù);并用成對(duì)樣本t檢驗(yàn)評(píng)判非接觸式人體測(cè)量和傳統(tǒng)手測(cè)方法,結(jié)果差異性顯著。
關(guān)鍵詞:Python;數(shù)據(jù)分析;非接觸人體測(cè)量;成對(duì)樣本t檢驗(yàn)
中圖分類號(hào):TS941.17? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識(shí)碼:B? ? ? ? ? ? ? ? ?文章編號(hào):1674-2346(2019)03-0031-06
人體測(cè)量是服裝工業(yè)化設(shè)計(jì)生產(chǎn)基礎(chǔ),它是服裝號(hào)型制定以及人體體型結(jié)構(gòu)設(shè)計(jì)、樣版制作等所需數(shù)據(jù)的來源和支撐。[1]傳統(tǒng)意義上的量體裁衣是測(cè)量人員借助軟尺工具對(duì)人體關(guān)鍵部位進(jìn)行手工精確測(cè)量,這種手法一直延續(xù)至今。但是測(cè)量耗時(shí)長,人力物力浪費(fèi)大,收集的數(shù)據(jù)量遠(yuǎn)遠(yuǎn)不能滿足大批量的工業(yè)生產(chǎn)。近幾年出現(xiàn)的非接觸式三維人體測(cè)量技術(shù)為服裝人體部位數(shù)據(jù)的獲取提供了很大的便利,通過定點(diǎn)掃描和計(jì)算機(jī)三維建模,可在半分鐘內(nèi)將人體各部位尺寸測(cè)量出來,測(cè)量效率可以達(dá)到工業(yè)所需數(shù)據(jù)量的要求。然而,當(dāng)測(cè)量的數(shù)據(jù)集過于龐大時(shí),對(duì)于原始數(shù)據(jù)的篩選、處理和精準(zhǔn)性驗(yàn)證成為企業(yè)一大問題。因此,合適的數(shù)據(jù)處理技術(shù)對(duì)高質(zhì)量的數(shù)據(jù)采集至關(guān)重要。
1? ? 數(shù)據(jù)分析技術(shù)簡介
Python是荷蘭計(jì)算機(jī)工程師Guido von Rossum在1989年發(fā)明的輕量級(jí)腳本語言。[2]它以優(yōu)雅簡明的編程風(fēng)格和豐富的第三方庫深受廣大程序員的喜愛,[3]并迅速發(fā)展成為僅次于C++和Java的編程語言。
Python在數(shù)據(jù)分析的層面上,有numpy、pandas、matplotlib等強(qiáng)大的第三方庫。numpy庫能夠提供向量、數(shù)組、矩陣等便于進(jìn)行數(shù)據(jù)分析的數(shù)據(jù)結(jié)構(gòu);pandas構(gòu)造在numpy基礎(chǔ)之上,它包含了Series(序列)和DataFrame(數(shù)據(jù)框),提供數(shù)據(jù)結(jié)構(gòu)使得Python數(shù)據(jù)處理更加靈活、迅速;matplotlib是Python中基本的繪圖庫,它能將數(shù)據(jù)統(tǒng)計(jì)信息進(jìn)行可視化展示,直觀的分析各變量之間關(guān)系。[4]
數(shù)據(jù)分析與挖掘技術(shù),就是從大量的、不完全的、有噪聲的、模糊的實(shí)際應(yīng)用數(shù)據(jù)中提取隱含的、潛在的信息。其中數(shù)據(jù)預(yù)處理階段就是對(duì)數(shù)據(jù)“清洗”、“去噪”,得到可用于分析研究的高質(zhì)量數(shù)據(jù)的過程。[5]
2? ? 實(shí)驗(yàn)背景及驗(yàn)證方法
2.1? ? 背景介紹
本次數(shù)據(jù)驗(yàn)證分析實(shí)驗(yàn)基于蘇州大學(xué)服裝工程人體測(cè)量實(shí)驗(yàn)團(tuán)隊(duì)通過非接觸式三維人體掃描儀(SizeStream)獲得的人體數(shù)據(jù)。為了獲得有效的、符合檔差范圍內(nèi)的數(shù)據(jù),我們需要對(duì)原始的數(shù)據(jù)用
Python進(jìn)行預(yù)處理。原始數(shù)據(jù)集中涉及人體部位有28個(gè)左右,但由于非接觸式人體掃描儀和手工測(cè)量時(shí)要求被測(cè)者的站姿不同,可能造成多個(gè)測(cè)量部位的數(shù)據(jù)差異,而圍度數(shù)據(jù)受站姿的影響基本可以忽略,故此次數(shù)據(jù)分析實(shí)驗(yàn)只處理頸根圍、胸圍、腰圍機(jī)測(cè)與手測(cè)數(shù)據(jù)300個(gè)。
2.2? ? 數(shù)據(jù)可用性驗(yàn)證
數(shù)據(jù)驗(yàn)證的過程遵循GB/T30548-2004三維測(cè)量儀獲取的服裝用人體數(shù)據(jù)驗(yàn)證方法。[6]具體步驟如下:
1)機(jī)測(cè)數(shù)據(jù)可靠性驗(yàn)證,|Amax-Amin|≤檔差,即可用來實(shí)驗(yàn)分析;
2)手測(cè)數(shù)據(jù)可靠性驗(yàn)證,|Bmax-Bmin|≤檔差,即可用來實(shí)驗(yàn)分析;
3)機(jī)測(cè)數(shù)據(jù)均值可用性驗(yàn)證,|Amean-Bmean|≤檔差,即數(shù)據(jù)測(cè)量準(zhǔn)確。
2.3? 測(cè)量方法成對(duì)樣本t檢驗(yàn)
為了評(píng)判兩種方法對(duì)同一樣本測(cè)得數(shù)據(jù)的效果如何,將機(jī)測(cè)數(shù)據(jù)和手測(cè)數(shù)據(jù)進(jìn)行成對(duì)樣本t檢驗(yàn)。[7]
3? ? 數(shù)據(jù)處理分析
實(shí)驗(yàn)測(cè)得數(shù)據(jù)在Anaconda3的Jupyter Notebook環(huán)境中進(jìn)行分析。Jupyter Notebook通過瀏覽器遠(yuǎn)程訪問方式進(jìn)行Python交互式編程,支持運(yùn)行40多種編程語言,并且便于創(chuàng)建和共享程序文檔,程序運(yùn)行結(jié)果可視化效果佳。[8]
3.1? ? 數(shù)據(jù)導(dǎo)入
首先,導(dǎo)入數(shù)據(jù)分析處理三大庫:nump、pandas、matplotlib。數(shù)據(jù)導(dǎo)入之前轉(zhuǎn)為.csv文件格式,pandas的DataFrame格式并不能識(shí)別中文,故將表格中對(duì)應(yīng)的屬性改為英文或英文縮寫形式(measure times,neck base girth,chest girth,waist girth)。在各個(gè)部位英文后面加“1”如:chest girth 1,代表機(jī)測(cè)數(shù)據(jù);加“2”如:chest girt 2代表手測(cè)數(shù)據(jù)。用“.head()”函數(shù)展示數(shù)據(jù)表前5行,如表1所示。
3.2? ? 原數(shù)據(jù)預(yù)處理
原始數(shù)據(jù)是300€?,共100個(gè)樣本,每個(gè)樣本3組數(shù)據(jù)。需先將數(shù)據(jù)進(jìn)行分組操作,再對(duì)分組后每個(gè)樣本求均值、極值。用“.set_index()”函數(shù)將ID和measure times組成復(fù)合索引,將每個(gè)樣本3組數(shù)據(jù)歸為1組,部分?jǐn)?shù)據(jù)展示如表2。
3.2.1? ? 數(shù)據(jù)可靠性驗(yàn)證
對(duì)表2中的每組數(shù)據(jù)求極差的絕對(duì)值,并將不在檔差范圍值賦為空值(NaN),等待剔除。核心代碼如下:
#求每個(gè)樣本三組數(shù)據(jù)間的極差絕對(duì)值,并修改列名
data_Range = abs(data.max(level=0) - data.min(level=0))
data_Range.columns = ['nbg1R', 'cg1R', 'wg1R', 'nbg2R', 'cg2R', 'wg2R']
#遍歷數(shù)組極差絕對(duì)值,將不符合條件的值賦空值
for index, row in data_Range.iterrows():
if row['nbg1R']? > 2:
row['nbg1R'] = None
elif row['nbg2R'] > 2:
row['nbg2R'] = None
elif row['cg1R'] > 4:
row['cg1R'] = None
elif row['cg2R'] > 4:
row['cg2R'] = None
elif row['wg1R'] > 4:
row['wg1R'] = None
elif row['wg2R'] > 4:
row['wg2R'] = None
else:
continue
3.2.2? ? 數(shù)據(jù)均值可用性驗(yàn)證
將分組后數(shù)據(jù)每組求均值,并賦新列名。由于每個(gè)樣本數(shù)據(jù)由兩種測(cè)量方法測(cè)得,如若兩種方法測(cè)得的同一部位值相差過大則為視為異常值。設(shè)定將每個(gè)部位由兩種方法測(cè)得的均值極差值大于5的異常點(diǎn)賦空值(NaN)。
將數(shù)據(jù)集中含有空值(NaN)的列用“.dropna()”函數(shù)剔除。得到“清潔”、“干凈”的數(shù)據(jù)集,合并數(shù)據(jù)均值表和極差表,最終得到可供實(shí)驗(yàn)分析的數(shù)據(jù)表4,數(shù)據(jù)維度變?yōu)椋?7€?6)。上述步驟核心代碼如下:
data_mean = data.mean(level='ID')
data_mean.columns =['nbg1M', 'cg1M', 'wg1M', 'nbg2M', 'cg2M', 'wg2M']
data_mean['nbgMr'] = abs(data_mean['nbg1M'] - data_mean['nbg2M'])
data_mean['cgMr'] = abs(data_mean['cg1M'] - data_mean['cg2M'])
data_mean['wgMr'] = abs(data_mean['wg1M'] - data_mean['wg2M'])
#選出均值大于5的數(shù)值
def function(a):
if a > 5:
return np.NaN
else:
return a
data_mean['nbgMr'] = data_mean.apply(lambda x: function(x.nbgMr), axis=1)
data_mean['cgMr'] = data_mean.apply(lambda x: function(x.cgMr), axis=1)
data_mean['wgMr'] = data_mean.apply(lambda x: function(x.wgMr), axis=1)
#得可用數(shù)據(jù)集,并保留小數(shù)點(diǎn)后1位
new_data = pd.concat([data_mean, data_Range],axis=1)
new_data = new_data.round(1)
avavilable_data = new_data.dropna(axis=0)
3.3? ? ?多個(gè)變量之間相關(guān)性分析
seaborn庫是在matplotlib繪圖庫的一個(gè)延伸,對(duì)于多個(gè)變量之間關(guān)系的展示,seaborn優(yōu)于matplotlib。通過seaborn庫中“.pairplot()”函數(shù),繪出3個(gè)部位機(jī)測(cè)數(shù)據(jù)和手測(cè)數(shù)據(jù)之間的散點(diǎn)圖(圖1)。
觀察散點(diǎn)圖1可發(fā)現(xiàn),兩種方法測(cè)得的數(shù)據(jù),胸圍和腰圍的數(shù)據(jù)集中性高,與頸根圍相比,這兩個(gè)部位彼此之間相關(guān)性更強(qiáng)。頸根圍與其他變量之間數(shù)據(jù)離散程度較大,這也可能與各個(gè)圍度數(shù)據(jù)間的差值大小有關(guān)。從圖1初步推斷,用非接觸式測(cè)量儀測(cè)得的人體數(shù)據(jù)與傳統(tǒng)手工測(cè)量數(shù)據(jù)之間存在差異性。
3.4? ? 成對(duì)樣本t檢驗(yàn)結(jié)果
盒形圖2給出了單個(gè)變量數(shù)據(jù)之間的分布。從盒中可以看出,頸根圍整體數(shù)據(jù)間離散程度小,受體型影響相對(duì)較小;胸圍和腰圍數(shù)據(jù)離散程度大,這可能與樣本處在不同身高檔差范圍有關(guān)。并且,圖中3個(gè)部位對(duì)應(yīng)機(jī)測(cè)、手測(cè)最大值和最小值及中位數(shù)的分布都有明顯差異。
為了定量的驗(yàn)證這種直觀結(jié)論,從scipy庫中引入統(tǒng)計(jì)分析函數(shù)stats,做成對(duì)樣本t檢驗(yàn),判斷非接觸式測(cè)量和傳統(tǒng)手工測(cè)量方法的差異性。核心代碼如下:
from scipy import stats
#頸根圍
stats.ttest_rel(new_nbg_mean['nbg1M'],new_nbg_mean['nbg2M'])
#胸圍
stats.ttest_rel(new_cg_mean['cg1M'],new_cg_mean['cg2M'])
#腰圍
stats.ttest_rel(new_wg_mean['wg1M'],new_wg_mean['wg2M'])
t檢驗(yàn)(雙側(cè))結(jié)果如表5。
由表5中成對(duì)樣本t檢驗(yàn)結(jié)果得出:頸根圍、胸圍、臀圍的P/2(單側(cè))值均小于0.05,故拒絕原假設(shè)H0,即認(rèn)為這3個(gè)部位用非接觸式測(cè)量儀和傳統(tǒng)手工方法測(cè)得的數(shù)據(jù)均值差異性顯著。
綜上,本文從應(yīng)用的視角出發(fā)詮釋了Python在數(shù)據(jù)分析與挖掘領(lǐng)域的內(nèi)涵。通過處理服裝行業(yè)人體測(cè)量數(shù)據(jù),實(shí)現(xiàn)了大數(shù)據(jù)時(shí)代背景下服裝用非接觸式人體數(shù)據(jù)可用性的分析。然而,當(dāng)面對(duì)龐大數(shù)據(jù)量時(shí),對(duì)有“噪”的臟數(shù)據(jù)的預(yù)處理遠(yuǎn)不止這些??蓪?duì)缺失值數(shù)據(jù)填充、修改、異常值剔除;可對(duì)數(shù)據(jù)做探索性數(shù)據(jù)分析,可對(duì)數(shù)據(jù)進(jìn)行更多的可視化展示等。本文的例子只是大數(shù)據(jù)應(yīng)用的冰山一角,數(shù)據(jù)分析與挖掘的熱度正在上升。作為數(shù)據(jù)分析者,須理解和熟悉數(shù)據(jù)挖掘原理與技術(shù),綜合利用編程語言技能,利于自己工作,服務(wù)于行業(yè)。
參考文獻(xiàn)
[1]陳益松,夏明. 光學(xué)三角測(cè)量法及其在人體測(cè)量中的應(yīng)用[J].紡織學(xué)報(bào),2012,33(12):95-101.
[2]李俊華.基于Python的數(shù)據(jù)分析[J].電子技術(shù)與軟件工程,2018(17):167.
[3]王海濤,齊達(dá).基于Python下的數(shù)據(jù)采集和分析在融媒體中的作用[J].電聲技術(shù),2018,42(06):63-64+67.
[4]阮敬. Python數(shù)據(jù)分析基礎(chǔ)[M].北京:中國統(tǒng)計(jì)出版社,2017.
[5]呂曉玲,謝邦昌.數(shù)據(jù)挖掘方法與應(yīng)用[M].北京:中國人民大學(xué)出版社,2008.
[6]GB/T 30548-2014.服裝用人體數(shù)據(jù)驗(yàn)證方法用三維測(cè)量儀獲取的數(shù)據(jù)[S].北京:中國標(biāo)準(zhǔn)出版社,2014.
[7]汪潔.t-檢驗(yàn)成對(duì)二樣本分析法在船舶定線制中的應(yīng)用[J].中國水運(yùn)(下半月),2010,10(06):8,37.
[8]薛煜陽.Jupyter Notebook在Python教學(xué)中的應(yīng)用探索[J].信息技術(shù)與信息化,2018(07):168-169.
浙江紡織服裝職業(yè)技術(shù)學(xué)院學(xué)報(bào)2019年3期