在上一節中,我們看到了一個散點圖的例子,它可以使我們看到兩組數字之間存在相關性的初步迹象。在本節中,我們将通過查看包含4組數據的數集來分析散點圖的重要性。對于這個數據集,傳統的統計量結果都是相同的,但每個數據集的散點圖顯示出重要的差異。
首先來看看如何在Python中創建一個散點圖:
>>> x = [1, 2, 3, 4]
>>> y = [2, 4, 6, 8]
>>> import matplotlib.pyplot as plt
>>> plt.scatter(x, y)
<matplotlib.collections.PathCollection object at 0x000001A8088089E8>
>>> plt.show()
scatter()函數用于在兩個數字列表x與y之間創建一個散點圖。這個圖與我們第二章學到的繪制圖形相比較,唯一的區别在于不使用plot()函數,而是使用scatter()。同樣,必須調用show()函數來顯示圖形。
要了解更多散點圖的信息,我們來看一個重要的統計學研究:統計學家Francis Anscombe 的統計分析圖。該研究考察了4各不同的數據集,稱為Anscombe四重奏,他們具有相同的屬性:均值,方差和相關系數。
數據集如下表所示(從原始研究轉載)。
Anscombe四重奏
我們分别将(X1,Y1)、(X2,Y2)、(X3,Y3)和(X4,Y4)稱為數據集A、B、C和D。下表顯示了四舍五入到兩位小數的數據集統計量。
Anscombe四重奏的統計量
各個數據的散點圖如圖所示。
Anscombe四重奏的散點圖
如果我們僅僅看傳統的統計量,如均值、标準差和相關系數,這些數據集幾乎是完全相同的。但散點圖顯示這些數據實際上差異非常大。因此,散點圖是一個重要工具,在得出數據集的任何結論之前,他應該與其他統計量一起使用。
第七節 從文件中讀取數據在本章的所有程序中,我們在計算中使用的數字列表都是自己輸入到程序中的。如果你想計算不同數據集的統計量,你必須在程序中輸入整個新的數據集。還學習了如何使程序提示用戶輸入數據并将輸入的數據作為輸入參數,但是對于大數據集,讓用戶在每次使用該程序時都輸入長的數字列表并不方便。 更好的選擇是從文件中讀取用戶數據。我們來看一個簡單的例子,介紹如何從文件中讀取數字并對其執行數學運算。首先,我将演示如何從一個簡單的文本文件 中讀取數據,文件的每一行包含-一個新的數據元素。然後,我将向你展示如何從以 csv格式存儲數據的文件中讀取數據,這将拓展很多應用,因為有大量有用的數據 集可以通過CSV格式從網上下載。
3.7.1 從文本文件中讀取數據我們先來看一個文件mydata.txt,它包含我們在本章一開始就講解的捐贈列表(一行一個數字)
100
60
70
900
100
200
500
500
503
600
1000
1200
以下程序将讀取該文件并輸出文件中存儲的數字的總和。
# find the sum of numbers stored in a file
def sum_data(filename):
s = 0
with open(filename) as f:
for line in f:
s = float(line)
print('Sum of the numbers : {0}'.format(s))
if __name__ == '__main__':
sum_data('mydata.txt')
首先打開filename指定的文件,并逐行讀取(f為文件的對象,你可以使用它來指代打開的文件)。打開後将裡面的每行數據轉為浮點數,然後相加求和,直到讀取完所有的數據。最後一個數據(标簽為s)包含數字的總和并在執行結束時輸出
運行程序前,在.py文件同目錄下需要有一個名為”mydata.txt“文件,其中數據内容為上述剛剛提到的捐款清單,運行程序:
Sum of the numbers : 5733.0
本章中的所有程序都是從列表中讀取數據。要讀取文件中的數據并且複用之前的代碼,我們可以将文件中的數據讀取出來然後創建一個列表來存儲數據,然後既可以使用之前的代碼啦。以下程序可以計算存儲在mydata.txt文件中數字均值:
'''
Calculating the mean of numbers stored in a file
'''
def read_data(filename):
numbers = []
with open(filename) as f:
for line in f:
numbers.append(float(line))
return numbers
def calculate_mean(numbers):
return sum(numbers) / len(numbers)
if __name__ == '__main__':
numbers = read_data('mydata.txt')
mean = calculate_mean(numbers)
print('Mean : {0}'.format(mean))
可以看到,我們在調用calculate_mean()函數之前,先把文件中的數據讀取出來,轉成浮點數後存儲到一個列表中,然後傳入calcula_mean()函數進行求均值,剩下的部分之前已經說過,此處不再贅述。
運行程序:
Mean : 477.75
對于mydata.txt裡面的數據,大家可以多做一些修改來試試。
當然也可以做一些修改,就是可以讓用戶輸入輸出文件名稱,這樣用戶就可以指定數據文件。
3.7.2 從CSV文件中讀取數據如果把一個csv文件使用記事本打開的話,我們就可以看到,csv文件值之間使用逗号分隔,也就是列和列之間用逗号分隔。
以下是一個csv文件樣本,其中包含幾個數字以及他們的平方。
Number,Squared
10,100
9,81
22,484
第一行為列名稱。在本例中告訴我們,第一列為數字,第二列為他們的平方。接下來包括三行數據,每行的值之間使用逗号隔開。可以使用類似于.txt文件的讀取方式來讀取數據。但是,Python的标準庫有一個用于讀取(和寫入)csv文件的專用模塊(csv),這個模塊可以讓讀取變得更容易一些。
将以上數據保存到名為numbers.csv文件中,并與程序放到同一目錄下。以下程序演示了如何讓讀取此文件,然後創建一個散點圖來顯示數字與其平方值。
import csv
import matplotlib.pyplot as plt
def scatter_plot(x, y):
plt.scatter(x, y)
plt.xlabel('Number')
plt.ylabel('Squared')
plt.show()
def read_csv(filename):
numbers = []
squared = []
with open(filename) as f:
reader = csv.reader(f)
next(reader)
for row in reader:
numbers.append(int(row[0]))
squared.append((int(row[1])))
return numbers, squared
if __name__ == '__main__':
numbers, squared = read_csv('numbers.csv')
scatter_plot(numbers, squared)
read csv()函數使用csv模塊(在程序開始時導入)中定義的reader()函數讀取CSV文件(可以理解為使用csv方式打開),調用該函數,将文件對象f作為參數傳遞它。然後,該函數返回一個指向CSV文件第一行的指針(pointer)。我們知道文件的第一行是标題, 我們要跳過,所以我們使用next()函 數将指針移動到下一行。然後,使用for循環讀取文件的每一行,每一行由标簽row 指代,row[0]指代數據的第一列, row[1]指代第二列。對于這個特定的文件,我們知道這兩個數字都是整數,所以我們使用int()函數将它們的類型從字符串轉換為整數,并将它們存儲在兩個列表中。返回結果是一個包含數字,另一個包含平方值的兩個列表。
然後我們使用numbers和squared這兩個列表作為參數來調用scatter_ plot()函數,創建散點圖。我們之前寫的find_corr_x_y()函數也可以很容易地用于計算兩組數字之間的相關系數。
現在我們來處理一個更複雜的CSV文件。在你的浏覽器中打開Google Correlate的頁面,輸入你想搜索的任何查詢(例如,夏天),然後單擊搜索相關按鈕。你将看到在“與夏天相關”标題下返回了一些結果,第一個結果是相關性最高(每個結果左邊的數字)。單擊圖形上方的“散點圖”選項可查看散點圖,其中x軸标記為夏天,y軸用頂部結果标記。忽略在兩個軸上繪制的精确數字,因為我們隻對相關性和散點圖感興趣。
在散點圖上方,單擊“導出數據為CSV",文件下載将開始。将此文件保存在與程序相同的目錄中。
此CSV文件與我們之前看到的文件略有不同。在文件的開頭,你會看到一些空行和帶有#符号的行,直到最後你會看到标題和數據。這些行對我們來說是沒有用的,使用能打開CSV文件的任何軟件,手動删除它們,使得文件的第一行是标題。你還需要删除文件末尾的空行。然後保存文件。在這個步驟中,我們清理了文件以便能更簡單地使用Python執行操作,此步驟通常稱為預處理數據。
标題有幾列,第一列包含每行中數據的日期(每行的數據對應于此列中日期開始的周數),第二列是你輸入的搜索查詢,第三列顯示與你的搜索查詢相關性最高的搜索查詢,其他列包含與你輸入的搜索查詢按相關性降序排列的其他多個搜索查詢。這些列中的數字是相應搜索查詢的z分數。z分數表示在特定周期間搜索詞語的次數與該詞每周的總平均搜索次數之間的差異。正的z分數值表示搜索次數高于該周搜索次數的均值,負的z分數值表示低于均值。 現在,我們隻處理第二和第三列。你可以使用read_csv()函數來讀取這些列,隻需修改上述代碼中的read_csv()函數,并且修改也很簡單,讀取第二列和第三列,并且将其轉為浮點數即可。
def read_csv(filename):
summer = []
highest_correlated = []
with open(filename) as f:
reader = csv.reader(f)
next(reader)
for row in reader:
print(row)
summer.append(float(row[1]))
highest_correlated.append((float(row[2])))
return summer, highest_correlated
然後加入到剛剛程序中,即可繪制出你輸入和搜索和與其相關性最高的搜索的散點圖:
Summer與Highest_correlataed的散點圖
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!