数据分析系列 之python中数据统计与分析

1 概述
数据探索:检查数据错误,了解数据特征和分布规律
数据特征分析:分布分析、统计量分析、相关分析

2 分布分析
2.1 定量分析:数量分布
可利用直方图

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import scipy

iris=datasets.load_iris()
iris_df=pd.DataFrame(iris.data)
iris_df.columns=iris.feature_names
iris_df['target']=iris.target

#将int--->float
iris_df.target.astype(float)

#选择第0列数据
iris_df.iloc[:,0]
#绘制直方图,把区域等分成20份
plt.hist(iris_df.iloc[:,0],20,color='c')

#检验是否符合正态分布,对第0轴(列 上下轴)做检验,p值大于0.05基本满足正态分布
scipy.stats.normaltest(iris_df.iloc[:,0],axis=0)

plt.hist(iris_df.iloc[:,1],20,color='c')
plt.hist(iris_df.iloc[:,2],20,color='c')
plt.hist(iris_df.iloc[:,3],20,color='c')

2.2 定性分析:类别分布
可使用饼图来做

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import scipy

iris=datasets.load_iris()
iris_df=pd.DataFrame(iris.data)
iris_df.columns=iris.feature_names
iris_df['target']=iris.target

#数据类别的分布
iris_df.target.value_counts()

#饼图
iris_df.target.value_counts().plot(kind='pie')

3 统计量分析
3.1 集中趋势分析(均值、中位数)
3.2 离中趋势分析(标准差、四分位距)

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import scipy

iris=datasets.load_iris()
iris_df=pd.DataFrame(iris.data)
iris_df.columns=iris.feature_names
iris_df['target']=iris.target

#均值
iris_df.iloc[:,0].mean()
#中位数
iris_df.iloc[:,0].median()
#标准差
iris_df.iloc[:,0].std()
#四分位距,默认0.5
iris_df.iloc[:,0].quantile()
#四分位距,上四分位数和下四分位数
iris_df.iloc[:,0].quantile([0.25,0.75])
#求四分位距
iris_df.iloc[:,0].quantile([0.75]).loc[0.75]-iris_df.iloc[:,0].quantile([0.25]).loc[0.25]

#使用describe()方法
iris_df.iloc[:,0].describe()

4 相关分析
可使用散点图
相关系数:独立且符合正太分布,使用Pearson相关系数;不符合则使用Spearson相关系数

from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import scipy
import seaborn as sns

#选择第0和2列数据
iris=datasets.load_iris()
x=[item[0] for item in iris.data]
y=[item[2] for item in iris.data]

#画出散点图
plt.scatter(x[0:50],y[0:50],color='blue')
plt.scatter(x[50:100],y[50:100],color='red')
plt.scatter(x[100:],y[100:],color='green')
plt.legend(loc='best')
plt.show()

#Pearson相关系数,正相关大于0,负相关小于0,等于0不相关,仅指示线性相关程度
iris_df.iloc[:,[0,1,4]].corr()
#计算两个变量
iris_df['target'].corr(iris_df.iloc[:,0])

#绘制热力图,颜色越深代表相关性越高
#cmap调整整体色彩,可取coolwarm、copper等
sns.heatmap(iris_df.iloc[:,[0,1,4]].corr(),annot=True,fmt='.1f',cmap='rainbow')

5 基于pandas的数据分析
5.1 简单筛选和统计
筛选语法:对象名[筛选条件]

#如:筛选出考试成绩大于等于80或小于60的同学信息
stu_score[(stu_score.score>=80) | (stu_score.score<60)]

#如:统计出8月份出勤的天数
days=len(stu_score[(stu_score.index>='2020-08-01') & (stu_score.index<='2020-08-31')])

#如:统计班级中相邻学号同学之间数学成绩的情况,用diff函数
status=np.sign(np.diff(stu_score.math))
#1代表后者分数高,-1代表后者分数低
len(status[status==1])
len(status[status==-1])

#如:取出数学成绩较好的前五名同学信息
#sort_values()  sort_index()
#ascending=False代表逆序排列
x=stu_score.sort_values(by='math',ascending=False) 
print(x[:3].name)

5.2 分组groupby()
Grouping的顺序:拆分、应用、合并
apply()函数
语法:df.apply(函数,axis=0),默认按照列进行遍历计算

#如:统计出一年以来同学每个月出勤的天数
#2020-11-20 月份是第五个和第六个索引位置的字符
month=[item[5:7] for item in stu_score.index]
#查看情况
stu_score.group(month).groups
#查看分组以后的形态
for k,data in stu_score.groupby(month):
	print(k)
	print(data)
#统计天数
stu_score.group(month).studyday.count()

#Grouping的顺序:拆分、应用、合并
#apply()函数
#语法:df.apply(函数,axis=0),默认按照列进行遍历计算
month=[item[5:7] for item in stu_score.index]
#统计天数
stu_score.groupby(month).apply(len)

#求每个科目的最大值,按照列
stu_score.max()
#或者
stu_score.apply(max)
#计算每位同学的最好的科目成绩,按照行
stu_score.max(axis=1)
#或者
stu_score.apply(max,axis=1)

#将语文和数学成绩转成int类型,方法1
stu_score.loc[:,['chinese','math']].astype(int)
#方法2
import numpy as np
stu_score.loc[:,['chinese','math']].apply(np.int32)
#方法3
import numpy as np
stu_score.loc[:,['chinese','math']].applymap(int)
#如果对原始数据修改,可采用以下方法
import numpy as np
stu_score.loc[:,['chinese','math']] = stu_score.loc[:,['chinese','math']].apply(np.int32)

#求月平均出勤人数
stu_score.groupby(month).daynum.mean()
#或者
stu_score.groupby(month).daynum.apply(np.mean)

合并的形式
Append:加行到DataFrame
Concat:连接pandas对象,有参数是ignore_index,设置为True可以忽略维度,即不同的数据维度可以连接
Join:SQL类型的连接

#Append举例:把2020年9月1日到9月3日的数据追加到7月最后两天的信息中
x=stu_score['2020-07-01':'2020-07-31'][-2:]
y=stu_score['2020-09-01':'2020-09-03']
x.append(y)

#Concat举例:把2020年8月的数据前3个和后3个合并
import pandas as pd
z=tu_score['2020-08-01':'2020-08-31']
#或者
z=tu_score[(tu_score.index>='2020-08-01') & (tu_score.index<='2020-08-31')]
pieces=[z[:3],z[:,-3]]
pd.concat(pieces)

#Join举例:将班级分数表和出勤表合并,通过学号num
#也可以使用left join和right join
import pandas as pd
pd.merge(tu_score.drop(['english'],axis=1),tu_num,on='num')

参考资料:
https://www.icourse163.org/learn/NJU-1001571005?tid=1463102441&from=study#/learn/content?type=detail&id=1240380196&sm=1 用python玩转数据

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值