【第 1集】 均值 中位数 众数平均数(Mean):指在一组数据中所有数据之和再除以这组数据的个数。
中位数(Median):按顺序排列的一组数据中居于中间位置的数,如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
众数(Mode):一组数据中出现次数最多的数值,有时众数在一组数中有好几个。
import numpy as np
from scipy import stats
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
nums1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 8]
print(np.mean(nums))# 均值 5.5
print(np.median(nums))# 中位数 5.5
print(np.median(nums1))# 中位数 6.0
print(stats.mode(nums)[0][0]) #没有众数
print(stats.mode(nums1)) #众数 8
【第 2集】 极差 中程数极差:其最大值与最小值之间的差距,即最大值减最小值后所得之数据
中程数(Mid-range)是一组统计数据值的最大值和最小值的平均数
import numpy as np
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(np.ptp(nums)) #极差 9
print(np.ptp(nums)/2) #中程数 4.5
【第 3集】 象形统计图
象形统计图:表现统计数字大小和变动的各种图形总称。其中有条形统计图、扇形统计图、折线统计图、象形图等。
O-型血人数:2×8=16
【第 4集】 条形图
条形统计图:是用一个单位长度表示一定的数量,根据数量的多少画成长短不同的直条,然后把这些直条按一定的顺序排列起来。从条形统计图中很容易看出各种数量的多少条形图:参考https://blog.csdn.net/hohaizx/article/details/79101322
import matplotlib.pyplot as plt
import matplotlib
# 设置中文字体和负号正常显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
label_list = ['Jasmine', 'Jeff', 'nevin', 'Alejandrn', 'Marta'] # 横坐标刻度显示值
list1 = [72, 86, 82, 81, 96] # 纵坐标值1
list2 = [78, 84, 88, 95, 90] # 纵坐标值2
x = np.arange(len(list1))
"""
绘制条形图
left:长条形中点横坐标
height:长条形高度
width:长条形宽度,默认值0.8
label:为后面设置legend准备
"""
rects1 = plt.bar(x=x, height=list1, width=0.4, alpha=0.4, color='blue', label="期中考试")
rects2 = plt.bar(x=x+0.4, height=list2, width=0.4, alpha=0.5, color='red', label="期末考试")
plt.ylim(0, 110) # y轴取值范围
plt.ylabel("成绩")
"""
设置x轴刻度显示值
参数一:中点坐标
参数二:显示值
"""
plt.xticks(x+0.2, label_list)
plt.xlabel("名字")
plt.title("成绩单")
plt.legend() # 设置题注
# 编辑文本
for rect in rects1:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height),
ha="center", va="bottom")
for rect in rects2:
height = rect.get_height()
plt.text(rect.get_x() + rect.get_width() / 2, height+1, str(height),
ha="center", va="bottom")
plt.show()
【第 5集】 线形图
线形图又称为“点状图”(point chart)、“停顿图”(Stopping chart)或“星状图”(star chart)。线形图属于图表分析的一类,仅记录收盘价,至於开盘价、当日最高价、当日最高的变动及波动幅度则欠缺。以线形图捕捉长期趋势还可以,但却难于捕捉短线和中线趋势,目前已较少有人使用。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
#X轴,Y轴数据
x = [0, 1, 2, 3, 4, 5, 6, 7, 8]
y = [6.59, 6.70, 6.95, 7.30, 7.30, 7.37, 7.1, 7.51, 7.58]
plt.figure(figsize=(8, 4)) # 创建绘图对象
plt.style.use('ggplot') # 网格
plt.plot(x, y, "b--", linewidth=1) #(X轴,Y轴,蓝色虚线,线宽度)
plt.xlabel("时间") #X轴标签
plt.ylabel("股票价格") #Y轴标签
plt.title("股票价格-时间") #图标题
plt.show()
【第 6集】 饼图
饼图显示一个数据系列中各项的大小与各项总和的比例。饼图中的数据点显示为整个饼图的百分比。
每个季度的收入:
import matplotlib.pyplot as plt
labels = ['quarter1', 'quarter2', 'quarter3', 'quarter4']
sizes = [40, 30, 20, 10]
plt.pie(sizes, labels=labels, autopct='%1.1f%%')
# plt.legend(loc=[0.9, 0.6])
plt.axis('equal')
plt.show()
【第 7集】 误导人的线形图
若线形图的刻度不一样容易引起误解,为了不引起误解,线性图画在一张图中。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
#X轴,Y轴数据
x = [0, 1, 2, 3, 4, 5, 6, 7, 8]
y = [6.59, 6.70, 6.95, 7.30, 7.30, 7.37, 7.1, 7.51, 7.58]
y1 = [3.295, 3.35, 3.475, 3.65, 4, 3.685, 3.55, 3.755, 3.79]
# print(y1)
plt.figure(figsize=(8, 4)) # 创建绘图对象
plt.style.use('ggplot') # 网格
plt.plot(x, y, "b--", linewidth=1) #(X轴,Y轴,蓝色虚线,线宽度)
plt.plot(x, y1, "r--", linewidth=1) #(X轴,Y轴,红色虚线,线宽度)
plt.xlabel("时间") #X轴标签
plt.ylabel("股票价格") #Y轴标签
plt.title("股票价格-时间") #图标题
plt.show()
【第 8集】 茎叶图
茎叶图的思路是将数组中的数按位数进行比较,将数的大小基本不变或变化不大的位作为一个主干(茎),将变化大的位的数作为分枝(叶),列在主干的后面,这样就可以清楚地看到每个主干后面的几个数,每个数具体是多少。
上图是12个足球队员的各自得分,总共得多少分?
Stem:得分十位数
Leaf:得分个位数
总计得分:(0+0+2+4+7+7+9) + (11+11+11+13+18) + (20)
from itertools import groupby
nums2 = [0, 0, 2, 4, 7, 7, 9, 11, 11, 13, 18, 20]
for k, g in groupby(sorted(nums2), key=lambda x: int(x) // 10):
# print('k', k)
# print('g', list(g))
lst = map(str, [int(y) % 10 for y in list(g)])
print(k, '|', ' '.join(lst))
【第 9集】 箱线图
顾客距离餐厅远近的分布,可以用箱线图。
箱形图(Box plot):又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况资料的统计图。因型状如箱子而得名。其最大的优点就是不受异常值的影响,可以以一种相对稳定的方式描述数据的离散分布情况。线形图:适于了解变量随时间变化的趋势,也可以是一个变量对另外一个变量的趋势。
条形图:适于将事物归类,看类别的分布情况。
饼图:适于看到各部分的占比。
茎叶图:适于了解分布的情况。
箱线图:适于了解中位数和散布的情况。作者求解四分位数的方法是第一种方法
另一种求解箱线图的的方法:箱线图中的四分位数是第二种求解方法
import pandas as pd
import matplotlib.pyplot as plt
from pandas.plotting import table
data = {
'distance': [1, 1, 2, 2, 3, 3, 4, 4, 6, 7, 8, 10, 11, 14, 15, 20, 22]
}
df = pd.DataFrame(data)
fig, ax = plt.subplots(1, 1)
table(ax, np.round(df.describe(), 2),
loc='upper right',
colWidths=[0.2, 0.2]
)
# df.plot.box(title="Consumer spending in each country", vert=False)
df.plot.box(title="customer distance",
ax=ax,
ylim=(0, 30))
plt.grid(linestyle="--", alpha=0.3)
plt.show()
四分位数:有两种求法不包含中位数,求解四分位数
包含中位数,求解四分位数例子:2、4、4、5、6、7、8
第一四分位数(Q1) = 4
第二四分位数(Q2) = 5
第三四分位数(Q3) = 7例子:1、3、3、4、5、6、6、7、8、8
第一四分位数(Q1) = 3
第二四分位数(Q2) = 5.5
第三四分位数(Q3) = 7
import numpy as np
def quartile_t1(data):
'''四分位数'''
n = len(data)
q1, q2, q3 = None, None, None
if n >= 4:
sorted_data = sorted(data)
q2 = np.median(sorted_data)
if n % 2 == 1:
q1 = np.median(sorted_data[:n//2])
q3 = np.median(sorted_data[n//2 + 1:])
else:
q1 = np.median(sorted_data[:n // 2])
q3 = np.median(sorted_data[n // 2:])
return q1, q2, q3
# 不包含中位数,求解四分位数
# 包含中位数,求解四分位数
data1 = [5, 7, 4, 4, 6, 2, 8]
print(quartile_t1(data1)) # 4, 5, 7
print(np.percentile(data1, [25, 50, 75])) # 4. 5. 6.5
data2 = [1, 3, 3, 4, 5, 6, 6, 7, 8, 8]
print(quartile_t1(data2)) # 3, 5.5, 7
print(np.percentile(data2, [25, 50, 75])) # 3.25 5.5 6.75
【第10集】 箱线图2
上图是100棵树的树龄箱线图,问树龄极差是多少,树龄中位数是多少?
由图可以看出:最小值是8,最大值是50,所以极差是50-8=42;中位数是竖线坐标21。