進(jìn)行調(diào)查和民意調(diào)查是收集數(shù)據(jù)和深入了解諸如客戶為何離開(kāi)我們網(wǎng)站等問(wèn)題的最佳方法之一。還是為什么選民會(huì)吸引這位候選人?但是分析調(diào)查數(shù)據(jù)可能是一個(gè)真正的挑戰(zhàn)!
在本教程中,我們將逐步介紹如何使用Python分析調(diào)查數(shù)據(jù)。但是不用擔(dān)心-即使您以前從未編寫(xiě)過(guò)代碼,也可以處理!我們將逐步進(jìn)行它,到本教程結(jié)束時(shí),您將看到如何僅用幾行代碼就能釋放出相當(dāng)不錯(cuò)的分析能力!
出于本文的目的,我們將分析StackOverflow的2019年開(kāi)發(fā)人員調(diào)查數(shù)據(jù),因?yàn)檫@是一個(gè)公開(kāi)的,經(jīng)過(guò)適當(dāng)匿名的大型調(diào)查數(shù)據(jù)集。但是這些技術(shù)將適用于幾乎所有類型的調(diào)查數(shù)據(jù)。
大多數(shù)調(diào)查數(shù)據(jù)的格式與我們?cè)诖颂幨褂玫母袷筋愃疲弘娮颖砀?,其中每一行包含一個(gè)人的答案,而每一列包含特定問(wèn)題的所有答案。這是我們的數(shù)據(jù)集的一個(gè)片段;您的外觀可能相似。
現(xiàn)在,讓我們深入分析這些數(shù)據(jù)!我們將從幾個(gè)快速步驟開(kāi)始,以進(jìn)行分析。
步驟1:以CSV檔案的形式取得問(wèn)卷調(diào)查回應(yīng)
要使用代碼分析調(diào)查數(shù)據(jù),我們需要以.csv文件的形式獲取它。如果您想使用與我們相同的數(shù)據(jù)集來(lái)完成本教程,則可以在此處獲取2019 StackOverflow開(kāi)發(fā)人員調(diào)查結(jié)果數(shù)據(jù),該數(shù)據(jù)已經(jīng)作為CSV文件(在文件內(nèi)部.zip)準(zhǔn)備好了。
如果您想開(kāi)始使用自己的數(shù)據(jù),請(qǐng)按照以下方式以CSV格式獲取數(shù)據(jù):
a.如果您運(yùn)行在線調(diào)查,則可能可以直接從所使用的調(diào)查服務(wù)下載CSV。Typeform和許多其他在線調(diào)查工具將使您能夠下載包含所有調(diào)查回復(fù)的CSV,這使事情變得輕松而簡(jiǎn)單。
b.如果您使用Google表格進(jìn)行調(diào)查,那么您的數(shù)據(jù)將以在線Google表格的形式提供。在Google表格界面中,點(diǎn)擊File > Download,然后選擇Comma-separated values (.csv, current sheet)以CSV格式下載數(shù)據(jù)。
c.如果您以其他方式收集了數(shù)據(jù),但是以電子表格格式保存了數(shù)據(jù),則可以從Excel或幾乎所有其他電子表格程序中將電子表格保存為CSV文件。在Excel中,您需要導(dǎo)航到File > Save As。在Save as type:字段中,選擇CSV (Comma delimited) (*.csv),然后單擊“保存”。在其他電子表格軟件中,過(guò)程應(yīng)非常相似。
在繼續(xù)之前,您可能想使用電子表格軟件打開(kāi)CSV文件并查看格式。如果看起來(lái)像我們之前看過(guò)的代碼片段,那么分析將是最簡(jiǎn)單的:電子表格第一行中的問(wèn)題,隨后每一行中的受訪者回答。例如,如果您的數(shù)據(jù)頂部有一些額外的行,則最好在繼續(xù)操作之前刪除這些行,以使數(shù)據(jù)集中的第一行是您的調(diào)查問(wèn)題,隨后的每一行都是一個(gè)受訪者的答案。
步驟2:設(shè)置您的編碼環(huán)境
(如果您已經(jīng)安裝了Anaconda并且熟悉Jupyter Notebook,則可以跳過(guò)此步驟。)
下一步是設(shè)置一個(gè)名為Jupyter Notebooks的工具。Jupyter筆記本電腦是一種流行的數(shù)據(jù)分析工具,因?yàn)樗鼈冊(cè)O(shè)置迅速且使用非常方便。我們已經(jīng)編寫(xiě)了深入的Jupyter Notebooks教程,其中有很多詳細(xì)信息,但是我們將在此處介紹啟動(dòng)和運(yùn)行所需的內(nèi)容。
首先,訪問(wèn)Anaconda網(wǎng)站。稍微向下滾動(dòng),選擇計(jì)算機(jī)的操作系統(tǒng),然后單擊Download以獲取Python 3.7版本。
下載文件后,將其打開(kāi),然后按照提示在您選擇的位置將其安裝到計(jì)算機(jī)上。如果您不確定需要什么,則默認(rèn)選項(xiàng)會(huì)很好。
安裝完成后,打開(kāi)Anaconda Navigator應(yīng)用程序。您可以在剛安裝Anaconda的任何目錄中找到此文件,也可以通過(guò)在計(jì)算機(jī)上搜索“ Anaconda”來(lái)找到它。應(yīng)用程序打開(kāi)時(shí),您可能會(huì)看到幾個(gè)屏幕閃爍,然后您將看到以下內(nèi)容:
單擊該中心選項(xiàng)Jupyter Notebook下的“啟動(dòng)”。這將在您的Web瀏覽器中打開(kāi)一個(gè)新標(biāo)簽。從那里,單擊右上角的“新建”,然后在下拉菜單的“筆記本”下,單擊“ Python 3”。
快點(diǎn)!您已經(jīng)打開(kāi)了一個(gè)新的Jupyter筆記本,我們準(zhǔn)備開(kāi)始編寫(xiě)一些代碼!
第3步:將調(diào)查數(shù)據(jù)導(dǎo)入Python
我們編寫(xiě)的前兩行代碼將使我們能夠?qū)?shù)據(jù)集放入Python和Jupyter Notebook中,以便我們可以開(kāi)始使用它。
我們將從導(dǎo)入名為的Python庫(kù)開(kāi)始pandas,并對(duì)其進(jìn)行昵稱,pd以便我們可以在代碼中輕松引用它。為此,我們將使用語(yǔ)法import pandas as pd。此代碼告訴Python導(dǎo)入pandas庫(kù),然后告訴我們?cè)谑褂米帜笗r(shí)pd,我們希望它引用該pandas庫(kù)。
Python庫(kù)有點(diǎn)像瀏覽器插件。它們添加了額外的功能,因此我們可以使用Python做更多的事情。Pandas是一個(gè)非常流行的數(shù)據(jù)分析庫(kù),它將使我們的分析工作更加輕松。
使用“昵稱” pd不是強(qiáng)制性的,但這是熊貓用戶常見(jiàn)的約定,因此習(xí)慣使用它會(huì)更容易閱讀其他人的代碼。
導(dǎo)入熊貓后,我們需要閱讀CSV來(lái)創(chuàng)建所謂的熊貓DataFrame。DataFrame只是我們可以使用熊貓?zhí)幚淼臄?shù)據(jù)表。稍后,我們將在視覺(jué)上看到DataFrame的外觀,但是要將數(shù)據(jù)導(dǎo)入Python和熊貓,我們需要做兩件事:
1)閱讀我們下載的CSV文件,我們可以使用名為pandas的函數(shù)來(lái)完成此操作 .read_csv()
2)將CSV數(shù)據(jù)分配給變量,以便我們可以輕松地引用它
函數(shù)是對(duì)輸入執(zhí)行操作的代碼位。在這種情況下,我們將輸入CSV文件的文件名,然后.read_csv()函數(shù)將自動(dòng)為我們將其解析為pandas DataFrame。
您可以將Python中的變量想像成書(shū)名。書(shū)名使參考書(shū)變得容易-我們可以說(shuō)“殺死一只知更鳥(niǎo)”,人們就會(huì)知道我們?cè)谡f(shuō)什么,因此我們不必背誦整本書(shū)。變量的工作原理類似。它們就像是簡(jiǎn)短的標(biāo)題,我們可以用來(lái)將更大量的信息(例如我們要分析的調(diào)查數(shù)據(jù))引薦給Python,而不必重述所有這些信息。
但是,我們確實(shí)必須告訴Python我們第一次使用變量時(shí)在說(shuō)什么。我們將變量名稱df(DataFrame的縮寫(xiě))用于調(diào)查數(shù)據(jù)。
因此,我們將用于讀取數(shù)據(jù)集的代碼如下所示:df = pd.read_csv('survey_results_public.csv')。這是該代碼從左到右告訴Python的內(nèi)容:
1)df =告訴Python我們正在創(chuàng)建一個(gè)名為的新變量df,當(dāng)您看到時(shí)df,請(qǐng)參考以下信息:
2)pd 告訴Python查看我們之前導(dǎo)入的pandas庫(kù)。
3).read_csv('survey_results_public.csv')告訴Python使用函數(shù).read_csv()讀取文件survey_results_public.csv。
請(qǐng)注意,如果CSV文件未與正在使用的Jupyter Notebook存儲(chǔ)在同一文件夾中,則需要指定數(shù)據(jù)集的文件路徑。保存時(shí)間會(huì)有所不同,但是可能看起來(lái)像這樣:df = pd.read_csv('C://Users/Username/Documents/Filename.csv')。
這就足夠了。通過(guò)在Jupyter Notebook的第一個(gè)單元格中鍵入以下代碼來(lái)運(yùn)行代碼,然后單擊“ 運(yùn)行”按鈕:
但是等等,什么也沒(méi)發(fā)生!那是因?yàn)槲覀儗?shí)際上并沒(méi)有告訴Python給我們?nèi)魏涡问降捻憫?yīng)。我們的代碼實(shí)際起作用了嗎?
為了進(jìn)行檢查,讓我們使用另一個(gè)名為的熊貓方法.head()。這將向我們展示DataFrame的前幾行。我們可以通過(guò)在括號(hào)之間放置一個(gè)數(shù)字來(lái)指定要查看的行數(shù),或者我們可以簡(jiǎn)單地將其保留不變,它將顯示前五行。
不過(guò),我們確實(shí)需要告訴.head()我們要看什么DataFrame,因此我們將使用語(yǔ)法df.head()。該df通知的Python我們想看看該數(shù)據(jù)幀,我們只是用我們的CSV數(shù)據(jù)所做的.告訴Python我們要做的東西的數(shù)據(jù)幀,然后head()告訴Python的是什么,我們想做的事:顯示前五行。
有我們的DataFrame!看起來(lái)很像電子表格,對(duì)吧?我們可以看到一些答案看起來(lái)被截?cái)嗔?,但是不用?dān)心,數(shù)據(jù)并沒(méi)有丟失,只是沒(méi)有直觀地顯示出來(lái)。
我們可能還會(huì)注意到此數(shù)據(jù)中還有其他一些奇怪的事情,例如NaN在某些行中的外觀。稍后我們將對(duì)此進(jìn)行處理,但是首先,讓我們使用另一個(gè)稱為pandas的功能.shape來(lái)仔細(xì)查看我們的數(shù)據(jù)集,以賦予我們數(shù)據(jù)集的大小。
這說(shuō)明我們的數(shù)據(jù)集中有88,883行和85列。這些數(shù)字應(yīng)與調(diào)查中被調(diào)查者(行)和問(wèn)題(列)的數(shù)量完全對(duì)應(yīng)。如果這樣做的話,這意味著我們所有的調(diào)查數(shù)據(jù)現(xiàn)在都存儲(chǔ)在該DataFrame中,可以進(jìn)行分析了。
步驟4:分析多項(xiàng)選擇調(diào)查問(wèn)題
你如何繼續(xù)進(jìn)行分析,從這里真的是你的,并與85題,有噸不同的東西,我們可以用這個(gè)數(shù)據(jù)做。但是,讓我們從簡(jiǎn)單的問(wèn)題開(kāi)始:是或否的問(wèn)題。
(注意:要弄清楚某些列名在StackOverflow數(shù)據(jù)中的含義可能很困難,但是數(shù)據(jù)集下載隨附一個(gè)隨附的模式文件,其中包含每個(gè)問(wèn)題的全文,因此您可能需要不時(shí)引用它有時(shí)間將列名與受訪者實(shí)際看到的問(wèn)題進(jìn)行匹配。)
該調(diào)查中比較獨(dú)特的是或否問(wèn)題之一是:“您認(rèn)為今天出生的人的生活會(huì)比父母更好嗎?”
看到樂(lè)觀的StackOverflow社區(qū)對(duì)未來(lái)的感覺(jué)可能會(huì)很有趣!我們可以使用名為的方便的熊貓函數(shù)來(lái)做到這一點(diǎn)value_counts()。
該value_counts()函數(shù)一次查看一列數(shù)據(jù),并計(jì)算該列包含的每個(gè)唯一條目的實(shí)例數(shù)。(在熊貓語(yǔ)中,單列稱為“系列”,因此您可能會(huì)將此功能稱為Series.value_counts()。)
要使用它,我們需要做的就是告訴Python我們要查看的特定Series(又稱專欄),然后告訴它執(zhí)行.value_counts()。我們可以通過(guò)寫(xiě)數(shù)據(jù)框的名稱來(lái)指定特定的列,然后在方括號(hào)內(nèi)寫(xiě)該列的名稱,如下所示:df['BetterLife']。
(就像我們的列表一樣,由于'BetterLife'是字符串而不是數(shù)字或變量名,因此我們需要將其放在撇號(hào)或引號(hào)中,以防止Python引起混淆)。
讓我們運(yùn)行該代碼,看看我們得到了什么!
真好!現(xiàn)在我們知道,在我們的數(shù)據(jù)集中的88883位受訪者中,有54938位認(rèn)為未來(lái)前景一片光明。
不過(guò),將其表示為響應(yīng)總數(shù)的百分比可能會(huì)更有用。值得慶幸的是,我們可以通過(guò)在value_counts()括號(hào)內(nèi)添加一個(gè)輸入來(lái)做到這一點(diǎn)。函數(shù)輸入在編程中稱為自變量,可以使用它們將信息傳遞給影響其輸出內(nèi)容的函數(shù)。
在這種情況下,我們將傳遞一個(gè)看起來(lái)像這樣的參數(shù):normalize=True。該大熊貓文檔大約有一些這方面的細(xì)節(jié),但長(zhǎng)話短說(shuō):value_counts將承擔(dān)我們希望normalize是False,如果我們不把任何東西里面的功能,因此將返回原始計(jì)數(shù)為每個(gè)值。
但是,如果設(shè)置normalize為True,它將通過(guò)將它們表示為我們指定的pandas系列中總行數(shù)的百分比來(lái)“標(biāo)準(zhǔn)化”計(jì)數(shù)。
現(xiàn)在我們可以看到大約64%的開(kāi)發(fā)人員認(rèn)為今天出生的孩子的生活會(huì)越來(lái)越好,大約36%的開(kāi)發(fā)人員認(rèn)為今天的孩子生活質(zhì)量相近或較差。
讓我們?cè)诹硪粋€(gè)有趣的是/否問(wèn)題上嘗試相同的事情:“您是否認(rèn)為需要成為經(jīng)理才能賺更多的錢?” 許多硅谷公司聲稱,管理不是獲得財(cái)務(wù)成功的唯一途徑,但開(kāi)發(fā)商是否會(huì)購(gòu)買?
顯然,大多數(shù)開(kāi)發(fā)人員都沒(méi)有購(gòu)買它。實(shí)際上,只有不到30%的人相信他們無(wú)需進(jìn)入管理就能賺更多的錢!
我們還可以看到,盡管這是一個(gè)是/否問(wèn)題,但是StackOverflow包含了第三個(gè)響應(yīng)選項(xiàng)(“不確定”),我們的代碼仍然以相同的方式工作。value_counts()將適用于任何選擇題。
步驟5:繪制多項(xiàng)選擇答案
查看數(shù)字可能會(huì)很有啟發(fā)性,但人類是視覺(jué)生物。幸運(yùn)的是,對(duì)于我們來(lái)說(shuō),直觀地繪制這些問(wèn)題的答案非常簡(jiǎn)單!
由于我們是在Jupyter Notebook中編寫(xiě)代碼的,因此我們將從Jupyter的魔力開(kāi)始:
此代碼不是我們分析的一部分,它只是一條指令,告訴Jupyter Notebook在我們正在使用的筆記本中內(nèi)嵌顯示圖表。
運(yùn)行完之后,我們所要做的就是在代碼末尾添加一個(gè)小片段.plot(kind='bar')。這告訴Python接受我們剛剛提供的內(nèi)容,然后將結(jié)果繪制在條形圖中。(如果需要,我們可以替換'bar'為'pie'以獲得餅圖)。
讓我們嘗試一下有關(guān)開(kāi)發(fā)人員偏愛(ài)的社交媒體網(wǎng)站的多項(xiàng)選擇問(wèn)題:
那已經(jīng)很酷了,但是我們可以通過(guò)向該.plot()函數(shù)添加更多參數(shù)來(lái)使它看起來(lái)更快。具體來(lái)說(shuō),讓我們添加兩個(gè):
a.稱為參數(shù)的參數(shù)figsize,以英寸為單位的寬度和高度定義圖表的大小(即(15,7)
b.稱為的參數(shù)color定義了條形的顏色。
讓我們使用Dataquest的綠色#61D199:
我們可以使用此圖表做更多的工作,但是就我們?cè)谶@里的目的而言,這已經(jīng)足夠了-我們只是在快速可視化之后!
步驟6:分析調(diào)查數(shù)據(jù)的子集
當(dāng)然,與打印簡(jiǎn)單的結(jié)果計(jì)數(shù)相比,我們通常會(huì)想做得更多!根據(jù)我們?cè)O(shè)置的幾乎任何條件,我們可以使用Python和熊貓輕松地選擇和分析非常細(xì)粒度的數(shù)據(jù)子集。
例如,我們較早時(shí)看到,基于StackOverflow用戶對(duì)'BetterLife'我們所分析問(wèn)題的回答,他們占少數(shù),但相當(dāng)少數(shù)的人期望世界變得更糟。例如,與更樂(lè)觀的開(kāi)發(fā)人員相比,此用戶子集可能年齡更大或更年輕嗎?
我們可以使用所謂的布爾值對(duì)我們的數(shù)據(jù)進(jìn)行排序,并僅顯示對(duì)該問(wèn)題回答“是”或“否”的人的回答。
我們將通過(guò)指定要查看的DataFrame和Series(即列)來(lái)創(chuàng)建布爾值,然后使用條件運(yùn)算符僅過(guò)濾該Series中滿足特定條件的響應(yīng)。
這次,讓我們先運(yùn)行代碼,然后再仔細(xì)看看它在做什么:
為確認(rèn)此方法是否有效,我們可以使用來(lái)檢查該數(shù)據(jù)集的大小.shape,然后said_no使用我們的老朋友將行數(shù)與對(duì)該問(wèn)題回答“否”的人數(shù)進(jìn)行比較.value_counts()。
我們可以看到我們的新數(shù)據(jù)框有31,331行,對(duì)更好的生活問(wèn)題回答“否”的人數(shù)相同。我們可以通過(guò)value_counts()在此新數(shù)據(jù)幀上快速運(yùn)行來(lái)進(jìn)一步確認(rèn)過(guò)濾器是否有效:
完善。好的,讓我們回頭看一下這段代碼:
這里發(fā)生了什么事?從左到右:
1)said_no = 告訴Python創(chuàng)建一個(gè)名為said_no的新變量,并使其等于等號(hào)右側(cè)的任何內(nèi)容。
2)df告訴Python使它said_no等效于dfDataFrame(我們的原始數(shù)據(jù)集),但是……
3)[df['BetterLife'] == 'No']告訴Python 僅包含df其中'BetterLife'列的答案等于的行'No'。
注意這里的雙等號(hào)。在Python中,當(dāng)我們要分配值時(shí),即使用單個(gè)等號(hào)a = 1。我們使用雙等號(hào)檢查等價(jià)性,Python實(shí)際返回的是True或False。在這種情況下,我們告訴Python來(lái),其中只有返回行df['BetterLife'] == 'No'的回報(bào)True。
現(xiàn)在,我們有了一個(gè)僅包含“否”答復(fù)者的數(shù)據(jù)框,讓我們?yōu)?ldquo;是”人們創(chuàng)建一個(gè)等效的答復(fù)者,然后進(jìn)行一些比較。
現(xiàn)在,讓我們看看通過(guò)將這些群體與人們?nèi)绾位卮鹩嘘P(guān)其年齡的問(wèn)題進(jìn)行比較,可以確定什么。該問(wèn)題的答案是整數(shù),因此我們可以對(duì)它們執(zhí)行數(shù)學(xué)運(yùn)算。我們可以進(jìn)行的一項(xiàng)快速檢查是,對(duì)更好的生活問(wèn)題說(shuō)“是”與“否”的人的平均年齡或中位數(shù)年齡是否存在顯著差異。
我們將在此代碼中使用幾個(gè)新技巧:.mean()和.median()函數(shù),它們將分別自動(dòng)計(jì)算一列數(shù)值數(shù)據(jù)的平均值和中位數(shù)。我們還將把我們的計(jì)算結(jié)果包含在一個(gè)print()命令中,以便同時(shí)打印所有四個(gè)數(shù)字。
正如我們?cè)谶@里看到的那樣,悲觀主義者的年齡往往稍大一些,但幅度不大??纯刺囟挲g段的人如何回答這個(gè)問(wèn)題以及是否有所不同可能會(huì)很有趣。如果悲觀主義者傾向于年齡稍大一些,例如,我們是否會(huì)看到50歲以上和25歲以下的開(kāi)發(fā)人員的答案之間存在顯著差異?
我們可以使用我們一直在使用的布爾運(yùn)算來(lái)找出答案,但是==我們將使用>=,<=因?yàn)槲覀円^(guò)濾掉'Age'50歲以上或25歲以下的受訪者,而不是使用它來(lái)檢查條件。
有趣!看起來(lái)最老的開(kāi)發(fā)人員確實(shí)非常悲觀,其中一半以上的人說(shuō)今天出生的孩子的生活不會(huì)比父母更好。另一方面,年輕開(kāi)發(fā)者似乎比平均水平更為樂(lè)觀。
但是,值得檢查一下我們實(shí)際上要處理的樣本有多大。我們可以使用len()函數(shù)快速完成此操作,該函數(shù)將計(jì)算DataFrame的列表或行中的項(xiàng)目數(shù)。
與總數(shù)據(jù)量相比,這兩個(gè)組都沒(méi)有很大,但是兩者都足夠大,足以代表真正的分裂。
步驟7:過(guò)濾更具體的子集
到目前為止,我們一直在一次使用布爾值過(guò)濾數(shù)據(jù),以查看以特定方式回答特定問(wèn)題的人員。但是我們實(shí)際上可以將布爾值鏈接在一起,以非??焖俚剡^(guò)濾到非常細(xì)粒度的級(jí)別。
要做到這一點(diǎn),我們將使用一對(duì)大熊貓的布爾運(yùn)算符,&和&~。
&如我們所料,允許我們將兩個(gè)布爾值串在一起,并且True僅在兩個(gè)條件都為真時(shí)才返回。因此,在我們的上下文中,如果要通過(guò)過(guò)濾原始DataFrame中的行來(lái)創(chuàng)建新的DataFrame,則&在兩個(gè)布爾值之間使用將允許我們僅添加同時(shí)滿足兩個(gè)條件的行。
我們可以認(rèn)為&~是“不是”。如果我們&~在兩個(gè)布爾值之間使用,則僅當(dāng)?shù)谝粋€(gè)布爾值求值為,True而第二個(gè)布爾值為時(shí),它才返回一行False。
在語(yǔ)法方面,使用單個(gè)布爾值的唯一變化是,當(dāng)我們將多個(gè)布爾值串在一起時(shí),需要將每個(gè)布爾值括在括號(hào)中,因此基本格式如下所示: df[(Boolean 1) & (Boolean 2)]
讓我們通過(guò)篩選對(duì)更好的生活問(wèn)題回答“是”并且居住在印度的人們來(lái)進(jìn)行嘗試:
我們可以通過(guò)快速檢查我們篩選出的答案的值計(jì)數(shù)來(lái)確認(rèn)此功能是否按預(yù)期工作:
如我們所見(jiàn),我們的新DataFrame 僅filtered_1包含印度人,他們對(duì)未來(lái)給出了樂(lè)觀的答案。
剛才,我們結(jié)合了兩個(gè)布爾值。但是我們可以串在一起的數(shù)目沒(méi)有限制,所以讓我們嘗試更復(fù)雜的下鉆。我們將僅過(guò)濾以下人員:
a.對(duì)美好生活的問(wèn)題回答“是”
b.超過(guò)50歲
c.住在印度
d.不要編碼為愛(ài)好
e.至少偶爾為開(kāi)源項(xiàng)目做貢獻(xiàn)
開(kāi)始了:
現(xiàn)在,我們開(kāi)始看到使用編程來(lái)分析調(diào)查數(shù)據(jù)的真正力量!從超過(guò)了88,000響應(yīng)的初始數(shù)據(jù)集,我們找到了一個(gè)非常五個(gè)人的特定受眾!
嘗試使用電子表格軟件快速篩選出如此特定的受眾非常困難,但是在這里,我們僅用一行代碼構(gòu)建并運(yùn)行了篩選器。
步驟8:分析多答案調(diào)查問(wèn)題
在分析調(diào)查數(shù)據(jù)的背景下,我們可能需要做的另一件事是處理多答案問(wèn)題。例如,在此調(diào)查中,受訪者被問(wèn)及他們使用哪種編程語(yǔ)言,并指示他們選擇盡可能多的答案。
不同的調(diào)查對(duì)這些問(wèn)題的答案可能會(huì)有所不同。有時(shí),每個(gè)答案可能在單獨(dú)的列中,或者所有受訪者的答案都可以存儲(chǔ)在單個(gè)列中,每個(gè)答案之間使用某種分隔符。因此,我們的首要任務(wù)是查看相關(guān)列,以了解在此特定調(diào)查中如何記錄答案。
在本次調(diào)查中,我們可以看到受訪者的答案被存儲(chǔ)在一個(gè)單獨(dú)的列中,;用作分隔符。
由于在本教程中我們正在使用Python,因此讓我們開(kāi)始分析調(diào)查數(shù)據(jù)以了解有多少開(kāi)發(fā)人員正在使用Python。
一種方法是查看Python此列中包含該字符串的行數(shù)。Pandas有一個(gè)內(nèi)置方法,可通過(guò)一系列稱為的方法來(lái)實(shí)現(xiàn)Series.str.contains。這將查看系列中的每一行(在本例中為我們的LanguageWorkedWith列),并確定該行是否包含我們作為參數(shù)提供的任何字符串。如果該行確實(shí)包含該字符串參數(shù),則將返回True,否則將返回False。
知道了這一點(diǎn),我們可以快速找出有多少受訪者在使用的語(yǔ)言中包含Python。我們將告訴Python我們要查看的系列(df["LanguageWorkedWith"]),然后將str.contains()其與參數(shù)一起使用Python。這將給我們一個(gè)布爾序列,然后我們要做的就是使用來(lái)計(jì)數(shù)“ True”響應(yīng)的數(shù)量value_counts()。
再一次,我們可以使用該參數(shù)normalize=True以百分比形式查看結(jié)果,而不是查看原始計(jì)數(shù)。
這是獲得我們答案的一種快捷方法(幾乎所有開(kāi)發(fā)人員中有42%使用Python!)。但是通常,我們可能希望能夠細(xì)分本專欄中的答案,以進(jìn)行更深入的分析。
舉例來(lái)說(shuō),我們想弄清楚提及每種語(yǔ)言的頻率。要使用上面的代碼來(lái)完成此操作,我們需要知道每個(gè)可能的響應(yīng),然后針對(duì)每個(gè)可能的答案運(yùn)行類似于以上代碼的內(nèi)容。
在某些情況下,這可能是可行的,但如果有大量潛在答案(例如,如果允許受訪者選擇“其他”選項(xiàng)并填寫(xiě)自己的選擇),則該方法可能不可行。相反,我們需要使用我們之前找到的定界符將每個(gè)答案分開(kāi)。
就像我們Series.str.contains以前看過(guò)pandas系列中的字符串是否包含子字符串一樣,我們可以Series.string.split基于定界分隔該系列中的每一行,并將其作為參數(shù)傳遞給該函數(shù)。在這種情況下,我們知道定界符為;,因此我們可以使用.str.split(';')。
我們也將增加一個(gè)額外的參數(shù),expand=True以str.split()。通過(guò)將每種語(yǔ)言設(shè)置為自己的列(每行仍代表一個(gè)受訪者),這將從我們的系列中創(chuàng)建一個(gè)新的數(shù)據(jù)框。您可以在此處閱讀有關(guān)其工作原理的更多信息。
讓我們?cè)谠?#39;LanguageWorkedWith'列上運(yùn)行該代碼,并將結(jié)果存儲(chǔ)為名為的新熊貓系列l(wèi)ang_lists。
如我們所見(jiàn),字符串拆分有效。現(xiàn)在,我們系列中的每一行都是新數(shù)據(jù)框中的一行,并且每種語(yǔ)言都已從其他語(yǔ)言拆分為唯一的列。
但是我們想弄清楚每種語(yǔ)言被提及過(guò)多少次,我們還沒(méi)有完成。value_counts()在這里無(wú)濟(jì)于事-我們只能在pandas系列上使用它,而不能在DataFrame上使用它。
為了能夠看到每種語(yǔ)言被提及的總次數(shù),我們需要做更多的工作。我們可以采用多種方法來(lái)解決此問(wèn)題,但這是一種:
a.使用df.stack()堆棧該數(shù)據(jù)幀,把每個(gè)列,然后互相使頂部堆疊它們每一個(gè)在數(shù)據(jù)幀的數(shù)據(jù)點(diǎn)出現(xiàn)在一個(gè)單一的熊貓系列。
b.value_counts()在這個(gè)新的“堆疊式”系列上 使用,可以得出提到每種語(yǔ)言的總次數(shù)。
這有點(diǎn)復(fù)雜,所以讓我們先用一個(gè)簡(jiǎn)單的示例進(jìn)行嘗試,以便我們可以直觀地觀察正在發(fā)生的事情。我們將從與十分相似的DataFame開(kāi)始lang_lists,但它要短得多,以便更容易理解。
這是我們的DataFrame(由于這不是我們真實(shí)數(shù)據(jù)集的一部分,因此您可能不想嘗試與此代碼一起編寫(xiě)代碼,只需閱讀此頁(yè)上的代碼并嘗試了解正在發(fā)生的事情):
首先,我們將使用.stack()該數(shù)據(jù)幀進(jìn)行分割,然后將各列彼此堆疊。請(qǐng)注意,發(fā)生這種情況時(shí),將自動(dòng)刪除插入到上述數(shù)據(jù)框中的空值。
這是發(fā)生的事情的動(dòng)畫(huà)視圖:
現(xiàn)在,我們已經(jīng)將每個(gè)答案堆疊到一個(gè)系列中,可以value_counts()用來(lái)計(jì)算總數(shù):
那就是我們需要的原始計(jì)數(shù)!請(qǐng)注意,normalize=True此處無(wú)法使用基于百分比的讀數(shù),因?yàn)樵撚?jì)算基于序列的長(zhǎng)度,該序列有9行,而我們的原始數(shù)據(jù)集只有3個(gè)響應(yīng)。
現(xiàn)在,我們知道如何執(zhí)行此操作,讓我們使用已經(jīng)創(chuàng)建的系列在真實(shí)數(shù)據(jù)集上嘗試相同的操作lang_lists。
這就是我們正在尋找的信息!現(xiàn)在,讓我們通過(guò)使用與之前使用的相同繪圖方法直觀地繪制此信息的圖表,最后對(duì)我們的分析項(xiàng)目進(jìn)行潤(rùn)色。
分析調(diào)查數(shù)據(jù):后續(xù)步驟
在本教程中,我們介紹了一些使用Python分析調(diào)查數(shù)據(jù)的基本方法。盡管閱讀了很長(zhǎng)時(shí)間,但如果回頭看,您會(huì)發(fā)現(xiàn)我們實(shí)際上只使用了幾行代碼。一旦掌握了這些要點(diǎn),進(jìn)行這種分析實(shí)際上非???
當(dāng)然,我們只是在這里刮了一下表面。您還可以做更多的事情,尤其是對(duì)于如此龐大的數(shù)據(jù)集。如果您正在尋找挑戰(zhàn),可以嘗試回答以下問(wèn)題。
a.如果您根據(jù)以上數(shù)據(jù)計(jì)算出的百分比除以調(diào)查受訪者總數(shù)(88,883),您會(huì)發(fā)現(xiàn)它們與StackOverflow報(bào)告的數(shù)字并不完全相同。這是因?yàn)樯贁?shù)受訪者沒(méi)有回答語(yǔ)言問(wèn)題。您如何找到并計(jì)算這些受訪者,以找到列出每種語(yǔ)言的受訪者的確切百分比?
b.上面的結(jié)果為我們提供了在所有接受調(diào)查的開(kāi)發(fā)人員中使用最流行的語(yǔ)言,但是此調(diào)查的另一個(gè)問(wèn)題確定了不同類型的角色,包括數(shù)據(jù)科學(xué)家,數(shù)據(jù)分析師等。您是否可以創(chuàng)建一個(gè)圖表來(lái)顯示最受歡迎的語(yǔ)言數(shù)據(jù)專業(yè)人員之間?
填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢不夠?可先就業(yè)掙錢后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ mwtacok.cn 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc