均值、中位數、眾數的認識及直方圖的描繪

這兩天學習一點統計學的知識。

均值:均值就是將所有數字加起來,然後除以數字個數。

均值作用:給出典型值(不存在異常值時用)

均值危害:存在異常值時會將數據向左或向右偏斜,它會給出一個不存在於數據集中區的數值。

異常值:與其他數據格格不入的極高或極低的數值。

中位數:永遠處於數據中間的值,存在異常值時可用中位數表示典型值。

實例:下面是一個游泳班的成員年齡:

參加這個班的有9個孩子及其父母,分別求出年齡的均值和中位數,還要畫出直方圖。

我試著用代碼實現:

先導入相關模塊,使用sorted()函數進行臨時排序:

使用Series()給數據添加標籤:

使用value_counts()統計各個年齡出現的頻率(頻數),按照降序排列:

使用mean()計算年齡是均值:

定義一個get_median()函數用於計算年齡的中位數:

其中size存儲著所有年齡的個數,size % 2 表示求餘數,如果餘數等於0,則所有年齡的個數為偶數,中位數就是中間兩個數的和除以2;如果餘數不等於0,則所有年齡的個數為奇數,中位數就是處於中間的數值。

接下來使用matplotlib描繪直方圖:

顯示的結果如下:

其中 rects =plt.bar(left = (1,2,3,4,5,6),height = (3,4,2,2,4,3),width = 0.8,align="center",yerr=0.000001)

這句代碼是最重要的,其中left表示直方圖的開始的位置(也就是最左邊的地方),height是指直方圖的高度,當直方圖太粗時,可以通過width來定義直方圖的寬度,注意多個直方圖要用元組,yerr這個參數是防止直方圖觸頂。

從上面的結果我們還發現了一個問題,就是這個班級的年齡均值和中位數都是17,而這個班裡根本沒有17歲的人,所以在這裡均值和中位數都不能代表這個游泳班的年齡情況,所以這時候要引入眾數。

眾數:就是一堆數據中出現最頻繁的數值,眾數可以不止一個,甚至是一組數值。

眾數的好處:當眾數的數目較少時,或者,當數據為類別數據而不是數值型數據時.均值和中位數都不能用於類別數據。

眾數的劣勢:當眾數很多時並不能表示典型值。

最近看了羅胖的跨年演講,想想這已經是第三個年頭,最大的觸動是有關人生演算法:成就=核心演算法X大量重複動作,從一開始決定學Python不就是為了找到屬於自己的人生演算法,可回顧這半年以來,並沒有完成自己的計劃,連每天敲一段代碼這樣簡單的重複動作,還是沒能堅持下來。木心先生說「歲月不饒人,我也未曾饒過歲月」,歲月確實沒饒過我,可我卻饒了歲月好幾回。

2018繼續加油吧,即使沒有如期完成計劃,好歹我們已在路上!

源碼:

# coding: utf-8nn# In[1]:nnnimport numpy as npnfrom pandas import Series,DataFramenimport pandas as pdnimport matplotlib.pyplot as pltndata = [1,33,1,32,2,31,2,3,33,2,31,32,2,32,32,1,33,3]nd = sorted(data) # 對數據進行臨時排序(從小到大)nprint(d)nnn# In[2]:nnn# 給數據添加標籤nframe = Series(d)nprint(frame) nnn# In[3]:nnn# 統計各個年齡出現的頻率(頻數),按照降序排列nvalue_counts =frame.value_counts()nprint(value_counts)nnn# In[4]:nnn# 統計年齡的均值nmean = frame.mean()nprint(mean)nnn# In[5]:nnn# 統計年齡的中位數ndef get_median(data): # 定義一個用於計算中位數的函數n data = sorted(data) n size = len(data) # 統計數據有多少個n n = size/2n if size % 2 == 0: # 通過求餘數判斷數據總數是否為偶數n median = (data[n] + data[n-1]) / 2.0n else:n median = data[n]n print(median)n nget_median(data)nnn# In[6]:nnn# 畫直方圖nfig1 = plt.figure(6) # 設置直方圖中有6組數據nrects =plt.bar(left = (1,2,3,4,5,6),height = (3,4,2,2,4,3),width = 0.8,align="center",yerr=0.000001)nn# 增加直方圖腳註nplt.xticks((1,2,3,4,5,6),(1,2,3,31,32,33))nn# 修改直方圖上顯示具體的數字ndef autolabel(rects):n for rect in rects:n height = rect.get_height()n plt.text(rect.get_x()+rect.get_width()/2,1.01*height,%s % int(height))nautolabel(rects)nnplt.title(Swimming class frequency histogram) # 修改標題nplt.xlabel(age) # 修改x軸標籤nplt.ylabel(Frequency) # 修改y軸標籤nplt.show()n

推薦閱讀:

Python數據處理 II:數據的清洗(預處理)
為什麼要學習Python?
左手用R右手Python系列11——相關性分析

TAG:Python | 数据分析 |