2.1 调查数据。某公司对财务部门人员是否抽烟进行调查,结果为:
否,否,否,是,是,否,否,是,否,是,否,否,是,是,否,是,否,否,是,是。
请用value_count函数统计人数,并绘制条图,按颜色区分是否。
dat=['否','否','否','是','是','否','否','是','否','是','否','否','是','是','否','是','否','否','是','是'];
print(dat)
['否', '否', '否', '是', '是', '否', '否', '是', '否', '是', '否', '否', '是', '是', '否', '是', '否', '否', '是', '是']
import pandas as pd
pd.set_option('display.max_rows',10)
dat=pd.DataFrame(dat,columns=['抽烟状况']);dat
抽烟状况 | |
---|---|
0 | 否 |
1 | 否 |
2 | 否 |
3 | 是 |
4 | 是 |
... | ... |
15 | 是 |
16 | 否 |
17 | 否 |
18 | 是 |
19 | 是 |
20 rows × 1 columns
dat1=dat.抽烟状况.value_counts();dat1
否 11 是 9 Name: 抽烟状况, dtype: int64
dat1.values
array([11, 9], dtype=int64)
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'];
plt.rcParams['axes.unicode_minus']=False;
dat1.plot.bar(color=['blue','yellow']);
2.2 医学数据:对一组50人的饮酒者所饮酒类进行调查,把饮酒者按红酒(1)、白酒(2)、黄酒(3)、啤酒(4)分成四类。调查数据如下:
3,4,1,1,3,4,3,3,1,3,2, 1,2,1,3,4,1,1,3,4,3,3,1,3,2,1,2,1,2,3,2,3,1,1,1,1,4,3,1,2,3,2,3,1,1,1,1,4,3,1。
(1)请用value_count()函数统计饮酒人数,用pie()函数绘制饼图,并按颜色和文字区分酒的类型
data22=pd.read_excel('PyDm_exer.xlsx','2.2');data22
data221=data22.酒类.value_counts();data221
1 20 3 16 2 8 4 6 Name: 酒类, dtype: int64
plt.pie(data221,labels=["红酒","白酒","黄酒","啤酒"]);
(2)请用value_count()函数构建自己的计数频数表函数
types=[1,2,3,4]
counts=[20,16,8,6]
data222=pd.DataFrame({'types':types,'counts':counts});data222
types | counts | |
---|---|---|
0 | 1 | 20 |
1 | 2 | 16 |
2 | 3 | 8 |
3 | 4 | 6 |
(3)请自定义一个计数数据的频数表生成函数和频数图绘制函数
import numpy as np
def freq(X,bins=10):
H=plt.hist(X,bins)
a=H[1][:-1];a
b=H[1][1:];b
f=H[0];f
p=f/sum(f)*100;p
cp=np.cumsum(p);cp
Freq=pd.DataFrame([a,b,f,p,cp])
Freq.index=['[下限a','上限b)','频数f','频率p(%)','累计频数cp(%)']
return(round(Freq.T,2))
freq(data22.酒类)
[下限a | 上限b) | 频数f | 频率p(%) | 累计频数cp(%) | |
---|---|---|---|---|---|
0 | 1.0 | 1.3 | 20.0 | 40.0 | 40.0 |
1 | 1.3 | 1.6 | 0.0 | 0.0 | 40.0 |
2 | 1.6 | 1.9 | 0.0 | 0.0 | 40.0 |
3 | 1.9 | 2.2 | 8.0 | 16.0 | 56.0 |
4 | 2.2 | 2.5 | 0.0 | 0.0 | 56.0 |
5 | 2.5 | 2.8 | 0.0 | 0.0 | 56.0 |
6 | 2.8 | 3.1 | 16.0 | 32.0 | 88.0 |
7 | 3.1 | 3.4 | 0.0 | 0.0 | 88.0 |
8 | 3.4 | 3.7 | 0.0 | 0.0 | 88.0 |
9 | 3.7 | 4.0 | 6.0 | 12.0 | 100.0 |
2.3 工资数据。上述企业财务部员工的月工资数据如下:
2050,2100,2200,2300,2350,2450,2500,2700,2900, 2850,3500,3800,2600,3000,3300,3200,4000,3100,4200,3500。
(1)试用mean、median、var、sd函数求数据的均值、中位数、方差、标准差。
data23=pd.read_excel('PyDm_exer.xlsx','2.3');data23.head()
月工资 | |
---|---|
0 | 2050 |
1 | 2100 |
2 | 2200 |
3 | 2300 |
4 | 2350 |
data23.月工资.mean()
2930.0
data23.月工资.median()
2875.0
data23.月工资.var()
406421.05263157893
data23.月工资.std()
637.511609801405
(2)绘制该数据的散点图和直方图,应用hist函数构建自己的计量频数表函数。
plt.scatter(data23.月工资.index,data23.月工资);
plt.hist(data23.月工资)
(array([3., 3., 2., 3., 2., 2., 2., 0., 1., 2.]), array([2050., 2265., 2480., 2695., 2910., 3125., 3340., 3555., 3770., 3985., 4200.]), <BarContainer object of 10 artists>)
(3)请自定义一个计量数据的频数表生成函数和频数图绘制函数。
import numpy as np
def freq(X,bins=10):
H=plt.hist(X,bins)
a=H[1][:-1];a
b=H[1][1:];b
f=H[0];f
p=f/sum(f)*100;p
cp=np.cumsum(p);cp
Freq=pd.DataFrame([a,b,f,p,cp])
Freq.index=['[下限a','上限b)','频数f','频率p(%)','累计频数cp(%)']
return(round(Freq.T,2))
freq(data23.月工资)
[下限a | 上限b) | 频数f | 频率p(%) | 累计频数cp(%) | |
---|---|---|---|---|---|
0 | 2050.0 | 2265.0 | 3.0 | 15.0 | 15.0 |
1 | 2265.0 | 2480.0 | 3.0 | 15.0 | 30.0 |
2 | 2480.0 | 2695.0 | 2.0 | 10.0 | 40.0 |
3 | 2695.0 | 2910.0 | 3.0 | 15.0 | 55.0 |
4 | 2910.0 | 3125.0 | 2.0 | 10.0 | 65.0 |
5 | 3125.0 | 3340.0 | 2.0 | 10.0 | 75.0 |
6 | 3340.0 | 3555.0 | 2.0 | 10.0 | 85.0 |
7 | 3555.0 | 3770.0 | 0.0 | 0.0 | 85.0 |
8 | 3770.0 | 3985.0 | 1.0 | 5.0 | 90.0 |
9 | 3985.0 | 4200.0 | 2.0 | 10.0 | 100.0 |
2.4 经理年薪。收集某沿海发达城市2015年66个年薪超过10万元的公司经理的收入(单位:万元)为
11,19,14,22,14,28,13,81,12,43,11,16,31,16,23,42,22,26,17,22, 13,27,108,16,
43,82,14,11,51,76,28,66,29,14,14,65,37,16,37,35,39,27,14,17,13,38,28,40,
85,32,25,26,16,120,54,40,18,27,16,14,33,29,77,50,19,34。
(1)可以对这些薪酬的分布状况作何分析?
对于这些年薪的分布状况,可以对其平均数、中位数、方差、标准差进行统计分析,也可以制作频数分布表、分布图分析。
(2)试通过编写计算基本统计量的函数来分析数据的集中趋势和离散程度。
data24=pd.read_excel('PyDm_exer.xlsx','2.4');data24
年薪 | |
---|---|
0 | 11 |
1 | 19 |
2 | 14 |
3 | 22 |
4 | 14 |
... | ... |
61 | 29 |
62 | 77 |
63 | 50 |
64 | 19 |
65 | 34 |
66 rows × 1 columns
data24.年薪.mean()
33.27272727272727
data24.年薪.median()
27.0
data24.年薪.var()
574.6937062937063
data24.年薪.std()
23.972770100547546
(3)试分析为何该数据的均值和中位数差别如此之大,方差、标准差在此有何作用?如何正确分析该数据的集中趋势和离散程度?
该数据的均值与中位数差别较大的原因是:这66个经理的年薪中,有几个经理年薪值较大,从而提高了平均年薪水平。方差与标准差反映了66个经理年薪偏离平均年薪的程度较大,因此本题中平均年薪并不能准确反映66个经理年薪的一般水平。故在该数据中,可以通过年薪的中位数27万元来反映集中程度,通过极差、四分位差等反映其离散程度,较为可靠。
(4)绘制该数据的散点图和直方图。
plt.scatter(data24.年薪.index,data24.年薪);
plt.hist(data24.年薪)
(array([25., 17., 12., 3., 1., 2., 4., 0., 1., 1.]), array([ 11. , 21.9, 32.8, 43.7, 54.6, 65.5, 76.4, 87.3, 98.2, 109.1, 120. ]), <BarContainer object of 10 artists>)
(5)请用自定义函数生成频数表和频数图。
freq(data24.年薪)
[下限a | 上限b) | 频数f | 频率p(%) | 累计频数cp(%) | |
---|---|---|---|---|---|
0 | 11.0 | 21.9 | 25.0 | 37.88 | 37.88 |
1 | 21.9 | 32.8 | 17.0 | 25.76 | 63.64 |
2 | 32.8 | 43.7 | 12.0 | 18.18 | 81.82 |
3 | 43.7 | 54.6 | 3.0 | 4.55 | 86.36 |
4 | 54.6 | 65.5 | 1.0 | 1.52 | 87.88 |
5 | 65.5 | 76.4 | 2.0 | 3.03 | 90.91 |
6 | 76.4 | 87.3 | 4.0 | 6.06 | 96.97 |
7 | 87.3 | 98.2 | 0.0 | 0.00 | 96.97 |
8 | 98.2 | 109.1 | 1.0 | 1.52 | 98.48 |
9 | 109.1 | 120.0 | 1.0 | 1.52 | 100.00 |
2.5 economics数据集(来自pydataset包)给出了美国经济增长变化的数据。该数据是数据框格式,由478行和6个变量组成,变量如下。
date:日期,单位为月份;psavert:个人存款率;pce:个人消费支出,单位为十亿美元;
uemploy:失业人数,单位为千人;unempmed:失业时间中位数,单位为周;pop:人口数,单位为千人。
请用matplotlib,pandas两种绘图方法绘制统计图:
#!pip install pydataset #安装pydataset包
from pydataset import data #加载pydataset包
economics = data('economics') #调用pydataset包中的数据框economics
economics.info() #显示数据
<class 'pandas.core.frame.DataFrame'> Int64Index: 478 entries, 1 to 478 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 date 478 non-null object 1 pce 478 non-null float64 2 pop 478 non-null int64 3 psavert 478 non-null float64 4 uempmed 478 non-null float64 5 unemploy 478 non-null int64 dtypes: float64(3), int64(2), object(1) memory usage: 26.1+ KB
economics['unemploy_pop']=economics['unemploy']/economics['pop']
print(economics) #显示数据
date pce pop psavert uempmed unemploy unemploy_pop 1 1967-06-30 507.8 198712 9.8 4.5 2944 0.014815 2 1967-07-31 510.9 198911 9.8 4.7 2945 0.014806 3 1967-08-31 516.7 199113 9.0 4.6 2958 0.014856 4 1967-09-30 513.3 199311 9.8 4.9 3143 0.015769 5 1967-10-31 518.5 199498 9.7 4.7 3066 0.015369 .. ... ... ... ... ... ... ... 474 2006-11-30 9478.5 301070 -1.1 7.3 6849 0.022749 475 2006-12-31 9540.3 301296 -0.9 8.1 7017 0.023289 476 2007-01-31 9610.6 301481 -1.0 8.1 6865 0.022771 477 2007-02-28 9653.0 301684 -0.7 8.5 6724 0.022288 478 2007-03-31 9705.0 301913 -1.3 8.7 6801 0.022526 [478 rows x 7 columns]
(1)以date为横坐标,unemploy/pop为纵坐标画折线图。
plt.plot(economics['date'],economics['unemploy_pop']);
(2)以date为横坐标,unemploy为纵坐标画折线图。
plt.plot(economics['date'],economics['unemploy']);
#将数据设置为pandas绘图格式
economics.set_index('date',inplace=True);print(economics)
pce pop psavert uempmed unemploy unemploy_pop date 1967-06-30 507.8 198712 9.8 4.5 2944 0.014815 1967-07-31 510.9 198911 9.8 4.7 2945 0.014806 1967-08-31 516.7 199113 9.0 4.6 2958 0.014856 1967-09-30 513.3 199311 9.8 4.9 3143 0.015769 1967-10-31 518.5 199498 9.7 4.7 3066 0.015369 ... ... ... ... ... ... ... 2006-11-30 9478.5 301070 -1.1 7.3 6849 0.022749 2006-12-31 9540.3 301296 -0.9 8.1 7017 0.023289 2007-01-31 9610.6 301481 -1.0 8.1 6865 0.022771 2007-02-28 9653.0 301684 -0.7 8.5 6724 0.022288 2007-03-31 9705.0 301913 -1.3 8.7 6801 0.022526 [478 rows x 6 columns]
economics['unemploy_pop'].plot();
economics['pop'].plot();