数据分析系列 之python中数据统计与分析
Posted 琅晓琳
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析系列 之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玩转数据
以上是关于数据分析系列 之python中数据统计与分析的主要内容,如果未能解决你的问题,请参考以下文章
python大数据挖掘系列之基础知识入门 知识整理(入门教程含源码)