119、均值、中位数、众数的认识及直方图的描绘

2018-01-03  本文已影响0人  陈容喜

这两天学习一点统计学的知识。
均值:均值就是将所有数字加起来,然后除以数字个数。
均值作用:给出典型值(不存在异常值时用)
均值危害:存在当常值时会将数据向左或向右偏斜,它会给出一个不存在于数据集中区的数值。
异常值:与其他数据格格不入的极高或极低的数值。

中位数:永远处于数据中间的值,存在异常值时可用中位数表示典型值。 1.png 实例:下面是一个游泳班的成员年龄: 2.png

参加这个班的有9个孩子及其父母,分别求出年龄的均值和中位数,还要画出直方图。
我试着用代码实现:

先导入相关模块,使用sorted()函数进行临时排序: 3.png 使用Series()给数据添加标签: 4.png 使用value_counts()统计各个年龄出现的频率(频数),按照降序排列: 5.png 使用mean()计算年龄是均值: 6.png 定义一个get_median()函数用于计算年龄的中位数: 7.png

其中size存储着所有年龄的个数,size % 2 表示求余数,如果余数等于0,则所有年龄的个数为偶数,中位数就是中间两个数的和除以2;如果余数不等于0,则所有年龄的个数为奇数,中位数就是处于中间的数值。

接下来使用matplotlib描绘直方图: 8.png 显示的结果如下: 9直方图.png

其中 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岁的人,所以在这里均值和中位数都不能代表这个游泳班的年龄情况,所以这时候要引入众数。

众数:就是一堆数据中出现最频繁的数值,众数可以不止一个,甚至是一组数值。 10.png

众数的好处:当众数的数目较少时,或者,当数据为类别数据而不是数值型数据时.均值和中位数都不能用于类别数据。
众数的劣势:当众数很多时并不能表示典型值。

最近看了罗胖的跨年演讲,想想这已经是第三个年头,最大的触动是有关人生算法:成就=核心算法X大量重复动作,从一开始决定学Python不就是为了找到属于自己的人生算法,可回顾这半年以来,并没有完成自己的计划,连每天敲一段代码这样简单的重复动作,还是没能坚持下来。木心先生说“岁月不饶人,我也未曾饶过岁月”,岁月确实没饶过我,可我却饶了岁月好几回。
2018继续加油吧,即使没有如期完成计划,好歹我们已在路上!

源码:


# coding: utf-8

# In[1]:


import numpy as np
from pandas import Series,DataFrame
import pandas as pd
import matplotlib.pyplot as plt
data = [1,33,1,32,2,31,2,3,33,2,31,32,2,32,32,1,33,3]
d = sorted(data)  # 对数据进行临时排序(从小到大)
print(d)


# In[2]:


# 给数据添加标签
frame = Series(d)
print(frame)       


# In[3]:


# 统计各个年龄出现的频率(频数),按照降序排列
value_counts =frame.value_counts()
print(value_counts)


# In[4]:


# 统计年龄的均值
mean = frame.mean()
print(mean)


# In[5]:


# 统计年龄的中位数
def get_median(data):   # 定义一个用于计算中位数的函数
    data = sorted(data) 
    size = len(data)    # 统计数据有多少个
    n = size/2
    if size % 2 == 0:   # 通过求余数判断数据总数是否为偶数
        median = (data[n] + data[n-1]) / 2.0
    else:
        median = data[n]
    print(median)
    
get_median(data)


# In[6]:


# 画直方图
fig1 = plt.figure(6)       # 设置直方图中有6组数据
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)

# 增加直方图脚注
plt.xticks((1,2,3,4,5,6),('1','2','3','31','32','33'))

# 修改直方图上显示具体的数字
def autolabel(rects):
    for rect in rects:
        height = rect.get_height()
        plt.text(rect.get_x()+rect.get_width()/2,1.01*height,'%s' % int(height))
autolabel(rects)

plt.title('Swimming class frequency histogram') # 修改标题
plt.xlabel('age')                               # 修改x轴标签
plt.ylabel('Frequency')                         # 修改y轴标签
plt.show()
上一篇 下一篇

猜你喜欢

热点阅读