本周内容总结:
参加此统计学习小组主要是巩固python语言,故所有笔记都以python代码实现
一、数据预处理
1.数据审核、筛选、排序
表一:
姓名 | 统计学成绩 | 数学成绩 | 英语成绩 | 经济学成绩 |
---|---|---|---|---|
张松 | 69 | 68 | 84 | 86 |
王翔 | 91 | 75 | 95 | 94 |
田雨 | 54 | 88 | 67 | 78 |
李华 | 81 | 60 | 86 | 64 |
赵颖 | 75 | 96 | 81 | 83 |
宋媛 | 83 | 72 | 66 | 71 |
袁方 | 75 | 58 | 76 | 90 |
陈风 | 87 | 76 | 92 | 77 |
# 找出统计学成绩等于75的学生
df1 = df[df['统计学成绩'] == 75]
# 找出英语成绩最高的前三名学生
df2 = df.nlargest(3, columns='英语成绩')
# df2 = df.nsmallest(3, columns='英语成绩') #英语成绩最低的前三名学生
# 找出四门课程成绩都大于70分的学生
df3 = df[(df['统计学成绩'] > 70) &
(df['数学成绩'] > 70) &
(df['英语成绩'] > 70) &
(df['经济学成绩'] > 70)]
# 排序,升序ascending=False,降序ascending=Trued
df4 = df.sort_values(by='统计学成绩', ascending=False)
2.数据透视表
表二:
编号 | 性别 | 家庭所在地区 | 平均月生活费(元) | 月平均衣物支出(元) | 买衣物首选因素 |
---|---|---|---|---|---|
1 | 男 | 大型城市 | 800 | 200 | 价格 |
2 | 女 | 中小城市 | 600 | 180 | 款式 |
3 | 男 | 大型城市 | 1000 | 300 | 品牌 |
4 | 男 | 中小城市 | 400 | 40 | 价格 |
5 | 女 | 中小城市 | 500 | 150 | 款式 |
6 | 女 | 乡镇地区 | 800 | 80 | 品牌 |
7 | 男 | 中小城市 | 600 | 180 | 品牌 |
8 | 女 | 乡镇地区 | 400 | 120 | 价格 |
9 | 男 | 中小城市 | 1000 | 300 | 款式 |
10 | 女 | 大型城市 | 600 | 180 | 款式 |
11 | 女 | 中小城市 | 500 | 150 | 价格 |
12 | 男 | 乡镇地区 | 300 | 30 | 价格 |
13 | 男 | 乡镇地区 | 500 | 50 | 价格 |
14 | 女 | 中小城市 | 300 | 35 | 价格 |
15 | 男 | 中小城市 | 1000 | 300 | 款式 |
16 | 女 | 大型城市 | 800 | 350 | 款式 |
17 | 男 | 中小城市 | 500 | 150 | 款式 |
18 | 男 | 乡镇地区 | 1000 | 100 | 价格 |
19 | 女 | 中小城市 | 800 | 80 | 价格 |
20 | 男 | 乡镇地区 | 800 | 240 | 品牌 |
21 | 女 | 大型城市 | 500 | 50 | 品牌 |
22 | 女 | 大型城市 | 300 | 30 | 价格 |
23 | 男 | 大型城市 | 500 | 150 | 款式 |
24 | 女 | 中小城市 | 500 | 150 | 价格 |
25 | 男 | 大型城市 | 300 | 30 | 价格 |
26 | 女 | 大型城市 | 400 | 200 | 价格 |
27 | 男 | 中小城市 | 1000 | 300 | 品牌 |
28 | 男 | 中小城市 | 500 | 50 | 款式 |
29 | 女 | 大型城市 | 700 | 70 | 款式 |
30 | 女 | 中小城市 | 500 | 50 | 价格 |
# 数据透视表,行变量为性别,列变量为家庭所在地区
df1 = df.pivot_table(index='性别', columns='家庭所在地区', values='平均月生活费(元)')
二、品质数据的分类与展示
品质数据:包括分类数据和顺序数据,一般为非数字型数据。分类数据一般为无序数据,顺序数据一般为有序数据。
表三(部分):
顾客性别 | 饮料类型 |
---|---|
女 | 碳酸饮料 |
男 | 绿茶 |
男 | 矿泉水 |
女 | 矿泉水 |
男 | 碳酸饮料 |
男 | 矿泉水 |
女 | 碳酸饮料 |
女 | 绿茶 |
男 | 果汁 |
男 | 碳酸饮料 |
女 | 矿泉水 |
1.条形图
频数:df.value_count()
# 频数分布表
data = [(df.loc[:, x].value_counts()) for x in df.columns]
# 条形图
fig = plt.figure()
fig.set(alpha=0.2) # 设定图表颜色alpha参数
plt.subplot2grid((1, 2), (0, 0)) # 在一张大图里分列几个小图,位置是(0,0)
data1 = df['顾客性别'].value_counts(ascending=True)
data1.plot(kind='bar',
title='顾客性别')
print(data1)
plt.xlabel("顾客性别")
plt.ylabel("频数")
plt.subplot2grid((1, 2), (0, 1))
data2 = df['饮料类型'].value_counts(ascending=True)
data2.plot(kind='bar',
title='饮料类型')
plt.xlabel("顾客性别")
plt.ylabel("频数")
注:
条形图:条形图用长条形表示每一个类别,长条形的长度表示类别的频数,宽度表示表示类别。多用于分类数据。
直方图:直方图是一种统计报告图,形式上也是一个个的长条形,但是直方图用长条形的面积表示频数。多用于数值型数据。
2.饼图
# 饼图
# 控制饼图为正圆
plt.axes(aspect='equal')
# plot方法对序列进行绘图
data2.plot(kind='pie', # 选择图形类型
autopct='%.1f%%', # 饼图中添加数值标签
radius=1, # 设置饼图的半径
startangle=180, # 设置饼图的初始角度
counterclock=False, # 将饼图的顺序设置为顺时针方向
title='不同类型饮料构成的饼图', # 为饼图添加标题
wedgeprops={'linewidth': 1.5, 'edgecolor': 'green'}, # 设置饼图内外边界的属性值 textprops={'fontsize': 10, 'color': 'black'}) # 设置文本标签的属性值
plt.show()
三、数值型数据的整理与展示
数值型数据:数字尺度测量的观察值,通常用数值来表现。
表四(部分):
销售量 |
---|
234 |
143 |
187 |
161 |
150 |
228 |
153 |
166 |
154 |
174 |
156 |
203 |
159 |
198 |
160 |
1.直方图
# 按照固定区间长度绘制频率分布直方图
# bins_interval 区间的长度
# margin 设定的左边和右边空留的大小
def probability_distribution(data, bins_interval=1, margin=1):
bins = range(min(data), max(data) + bins_interval - 1, bins_interval)
print(len(bins))
for i in range(0, len(bins)):
print(bins[i])
plt.xlim(min(data) - margin, max(data) + margin)
plt.title("Probability-distribution")
plt.xlabel('Interval')
plt.ylabel('Probability')
# 频率分布density=True,频次分布density=False
prob,left,rectangle = plt.hist(x=data, bins=bins, density=False, histtype='bar', color=['r'])
plt.show()
if __name__ == '__main__':
df = pd.read_excel('data/1_table4.xlsx')
data = df['销售量'].values
# print(data)
probability_distribution(data=data, bins_interval=10, margin=10)
2.茎叶图
# 茎叶图
def stem(data, n):
for k,g in groupby(sorted(data),key = lambda x: math.floor(x/n)):
lst = map(str, [d % n for d in list(g)])
print(k, '|', ' '.join(lst))
注:此茎叶图有点点问题,待解决。
3.箱线图
# 箱线图
def boxplot(data):
plt.boxplot(data, labels=['销售量(台)'])
plt.title('某电脑公司销售量数据的箱线图')
plt.show()
4.散点图
散点图:两个变量之间的关系。一个变量放在横轴,另一个变量放在纵轴。
表五:
温度 | 降雨量 | 产量 |
---|---|---|
6 | 25 | 2250 |
8 | 40 | 3450 |
10 | 58 | 4500 |
13 | 68 | 5750 |
14 | 110 | 5800 |
16 | 98 | 7500 |
21 | 120 | 8250 |
# 散点图
# 输入产量与温度数据
rainfall = df['降雨量'].values
production = df['产量'].values
colors = np.random.rand(len(rainfall)) # 颜色数组
plt.scatter(rainfall, production, s=200, c=colors) # 画散点图,大小为 200
plt.xlabel('降雨量') # 横坐标轴标题
plt.ylabel('产量') # 纵坐标轴标题
plt.title('小麦产量与降雨量的散点图')
plt.show()
5.气泡图
气泡图:三个变量之间的关系。一个变量放在横轴,一个变量放在纵轴,另一个变量用气泡的大小来表示。
# 气泡图
tem = df['温度'].values
size = production
plt.scatter(tem, rainfall, s=production, c=colors, alpha=0.6) # 画散点图, alpha=0.6 表示不透明度为 0.6
plt.xlabel('温度') # 横坐标轴标题
plt.ylabel('降雨量') # 纵坐标轴标题
plt.title('小麦产量与降雨量和温度的气泡图(气泡大小表示产量)')
plt.show()
# 气泡图
tem = df['温度'].values
size = production
plt.scatter(tem, rainfall, s=production, c=colors, alpha=0.6) # 画散点图, alpha=0.6 表示不透明度为 0.6
plt.xlabel('温度') # 横坐标轴标题
plt.ylabel('降雨量') # 纵坐标轴标题
plt.title('小麦产量与降雨量和温度的气泡图(气泡大小表示产量)')
plt.show()