教程來自扇貝編程
數(shù)值分析:
平均數(shù)献雅、中位數(shù)邪媳、分位數(shù)久又、眾數(shù)煞茫、極差、方差噩茄、標(biāo)準(zhǔn)差
均值
均值也稱為平均值或平均數(shù)下面。它等于數(shù)值之和除以數(shù)值個(gè)數(shù)。當(dāng)數(shù)值在列表中時(shí)绩聘,我們可以用Python內(nèi)置的sum() 來計(jì)算列表內(nèi)的數(shù)值之和沥割,用 len() 來計(jì)算列表內(nèi)的數(shù)值個(gè)數(shù)。
# score 內(nèi)是學(xué)生在某個(gè)Python項(xiàng)目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# ave_score 計(jì)算score的均值
sum_score = sum(score)
print(sum_score) # 輸出:800
num_score = len(score)
print(num_score) # 輸出:10
ave_score = sum_score / num_score
print(ave_score) # 輸出: 80.0
上例中凿菩,學(xué)生的總分 sum_score 為 800机杜,分?jǐn)?shù) num_score 有10個(gè),均值 ave_score 為 80.0
中位數(shù)
中位數(shù)是指一組數(shù)值中間點(diǎn)的值衅谷,當(dāng)數(shù)值個(gè)數(shù)為奇數(shù)時(shí)椒拗,中位數(shù)就正好是中間點(diǎn)的值;如果數(shù)值個(gè)數(shù)為偶數(shù),中位數(shù)為中間兩個(gè)點(diǎn)的均值蚀苛。
我們來看如何用代碼計(jì)算一組數(shù)值的中位數(shù)在验,首先需要大家知道 Python 內(nèi)置的 sorted(),它可以將一組數(shù)值自小到大排序:
numbers = [2,3,4,2]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
# 輸出:[2, 2, 3, 4]
在此基礎(chǔ)上枉阵,我們寫個(gè)函數(shù)求中位數(shù):
def get_median(numbers):
"""
找到numbers最中間的數(shù)
"""
length = len(numbers) #數(shù)值個(gè)數(shù)
sorted_numbers = sorted(numbers) #將數(shù)值排序
mid_point = int(length/2) #中位數(shù)的位置译红,需要是int類型
if length % 2 == 1: # 如果數(shù)值個(gè)數(shù)為奇數(shù)
median = sorted_numbers[mid_point]
else: # 如果數(shù)值個(gè)數(shù)為偶數(shù)
# 中位數(shù)為中間兩個(gè)數(shù) mid_a 和 mid_b 的均值
mid_a = sorted_numbers[mid_point-1]
mid_b = sorted_numbers[mid_point]
median = (mid_a + mid_b)/2
# 函數(shù)返回 median
return median
score = [96,80,85,79,92,42,84,72,93,77]
print(get_median(score))
# 輸出:82.0
分位數(shù)
分位數(shù):它是指一組數(shù)值中,大于或等于特定百分比的一個(gè)值兴溜。比如,75分位指一組數(shù)值中耻陕,大于或等于75%數(shù)值的值拙徽。
我們來寫一個(gè)函數(shù),計(jì)算一組數(shù)值中的 n分位數(shù)是多少:
def find_nperc(numbers,n):
"""
返回numbers中诗宣,n分位對(duì)應(yīng)的數(shù)值是多少
"""
# 先將數(shù)值排序
sorted_numbers = sorted(numbers)
# 找到n分位對(duì)應(yīng)數(shù)值的索引位置
n_index = int(n/100 * len(sorted_numbers))
return sorted_numbers[n_index]
score = [96,80,85,79,92,42,84,72,93,77]
print("25分位數(shù)為{}".format(find_nperc(score,25)))
# 輸出:25分位數(shù)為77
print("75分位數(shù)為{}".format(find_nperc(score,75)))
# 輸出:75分位數(shù)為92
眾數(shù)
一組數(shù)值中膘怕,出現(xiàn)頻次最多的數(shù)值為眾數(shù),有時(shí)一組數(shù)值中會(huì)有多個(gè)眾數(shù)召庞。
借此機(jī)會(huì)岛心,我們學(xué)習(xí)Python中內(nèi)置的max(),它可以返回一組列表中數(shù)值最大的元素篮灼。
下方函數(shù)求得一個(gè)列表 numbers 中的眾數(shù)忘古,思路如下:
1)用 count() 計(jì)算列表 numbers 中每個(gè)元素出現(xiàn)的次數(shù);
2)將上述元素和對(duì)應(yīng)的出現(xiàn)次數(shù)存入字典 count_num 中诅诱;
3)用 max() 找到 count_num 中最大的值髓堪,并找到擁有該值的字典鍵添加到 max_count_num 中;
4)max_count_num 中的元素就是眾數(shù)娘荡,count_num 是眾數(shù)出現(xiàn)的次數(shù)干旁。
def get_mode(numbers):
"""
返回 numbers中出現(xiàn)次數(shù)最多的數(shù)值(眾數(shù))及其出現(xiàn)次數(shù)
"""
count_num = {}
max_count_num = []
# 循環(huán)numbers,建立字典 count_num:{數(shù)值:出現(xiàn)次數(shù)}
for num in numbers:
count_num[num] = numbers.count(num)
# 循環(huán)count_num
# 用max() 得到數(shù)值出現(xiàn)次數(shù)的最大值炮沐,賦值給 max_count
# 將出現(xiàn)次數(shù)最大值的數(shù)值(眾數(shù))放入 max_count_num
for num,count in count_num.items():
if count == max(count_num.values()):
max_count = count
max_count_num.append(num)
return "眾數(shù)為{}争群,出現(xiàn)次數(shù){}次".format(max_count_num,max_count)
score = [96,80,85,79,93,42,84,72,93,77]
print(get_mode(score))
# 眾數(shù)為[93],出現(xiàn)次數(shù)2次
極差
有些情況下大年,當(dāng)我們面對(duì)一組數(shù)據(jù)時(shí)换薄,我們會(huì)分析它的“分散”情況。
極差是指一組數(shù)據(jù)中最大值減去最小值的差鲜戒。
極差雖然簡單易得专控,但是有其局限性。它只受數(shù)據(jù)中的最大值和最小值影響遏餐。
我們可以用 max() 來獲得數(shù)據(jù)的最大值伦腐,用 min() 來獲得數(shù)據(jù)的最小值。
# score 是一群學(xué)生在某個(gè)Python項(xiàng)目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# score_range 為 score 的極差
score_range = max(score) - min(score)
print(score_range)
# 輸出:54
方差
方差:在一組數(shù)據(jù)集中失都,數(shù)值與均值之間的距離柏蘑。
在下方圖中幸冻,我們紅點(diǎn)與藍(lán)點(diǎn)所代表的數(shù)據(jù)集均值相同(黃線水平),但是用肉眼來看咳焚,我們發(fā)現(xiàn)紅點(diǎn)較集中在均值附近洽损,而藍(lán)點(diǎn)則較遠(yuǎn)「锇耄可以初步判斷碑定,紅點(diǎn)所代表數(shù)據(jù)集的方差要小于藍(lán)點(diǎn)。如果一組數(shù)據(jù)集的方差越大又官,那么數(shù)據(jù)集的“波動(dòng)性”也會(huì)越大延刘。
??
方差的計(jì)算方法為:
1)先求得一組數(shù)據(jù)集的均值 mean;
2)用數(shù)據(jù)集中的每一個(gè)數(shù)值減去均值六敬,其差為 de_mean碘赖;求每個(gè)差值 de_mean 的平方 sqr;
3)將所有 sqr 相加外构,得到和為 sum_sqr普泡;
4)如果數(shù)據(jù)集的數(shù)據(jù)個(gè)數(shù)為 n,則 sum_sqr / (n-1) 的結(jié)果审编,即是該數(shù)據(jù)集的方差 variance撼班。
# score 是一群學(xué)生在某個(gè)Python項(xiàng)目上的得分
score = [96,80,85,79,92,42,84,72,93,77]
# 1)先求得一組數(shù)據(jù)集的均值 mean;
mean = sum(score) / len(score)
# 2)用數(shù)據(jù)集中的每一個(gè)數(shù)值減去 mean割笙,并求得差值的平方 sqr权烧,
# 將所有 sqr 相加,求得 sum_sqr伤溉;
sum_sqr = 0
for num in score:
sum_sqr += (num - mean) ** 2
# 3)求 sum_sqr / (n-1)般码,結(jié)果就是方差 variance。
variance = sum_sqr / (len(score)-1)
print(variance)
# 輸出:236.44444444444446
標(biāo)準(zhǔn)差
上一頁講到的方差是一系列平方的求和乱顾,比較難以理解和溝通板祝。因此人們?cè)诜讲畹幕A(chǔ)上創(chuàng)造了更便于交流、理解的概念——標(biāo)準(zhǔn)差走净。標(biāo)準(zhǔn)差為方差的平方根券时。
# variance 為剛才計(jì)算的方差:
variance = 236.44
# 標(biāo)準(zhǔn)差為 variance 的平方根
standard_deviation = variance ** 0.5
print(standard_deviation)
# 輸出:15.37660560722034
另外,我們之前學(xué)過 Python 中內(nèi)置的 Math 庫伏伯,其中有計(jì)算平方根的 .sqrt() 方法橘洞,我們也可以通過其來根據(jù)方差計(jì)算標(biāo)準(zhǔn)差:
import math
variance = 236.44
standard_deviation = math.sqrt(variance)
print(standard_deviation)
# 輸出:15.37660560722034