使用数据网址
- 下载方法
- 网址:https://www3.norc.org
- 搜索框 GSS 2012 merged
- 点击链接 SPSS|NORC
- 下载 GSS 2012 merged with all cases and variables
- 在网站http://gss.norc.org/Get-Documentation下载index to Data Set,可以知道数据中各列的编号以及实际意义
- 读取STATA数据的方法,pandas中read_stata
- 函数说明 read_stata
- 参数
- filepath_or_buffer:string或者类似file的对象
- convert_dates:bool,默认True;True那么将日期类型转换为DF中时间值
- convert_categoricals:bool,默认True,True将列转化为Categorical/Factor变量
- encoding:string,默认None;读取文件的字符集,默认是iso-8859-1
- index:DF的行索引
- convert_missing:bool,默认False;True,将缺失数据转换成StataMissingValue 对象
- preserve_dtypes:保存数据类型,bool,默认True,如果是False,那么数值数据类型保存为Int64,float64,True:那么就保存Stata数据类型
- columns:list或者None,默认None;如果是list,那么就可以指定读取的DF对象的列和顺序,None:默认选取所有的列
- order_categoricals:bool,默认True;显示是否将种类按序排列
- chunksize:int或者None,读取内存的数据块大小
- iterator:bool,默认False;True就返回一个StataReader对象
- 备注:
- categorical data是pandas中数据类型,与统计学中categorical variable不同
- 对数据进行一些加工
- 数据中有id列,现在想将id列作为DataFrame中的索引,那么进行以下操作:
- gss_data.set_index('id') #将id列数据作为索引
- 现在gss_data中已经将id作为行索引,但是id会出现在数据的第一行作为索引名称,现在将该行删除
- gss_data.drop('id',1,inplace=True)#1:表示数据的轴编号
- 数据中有id列,现在想将id列作为DataFrame中的索引,那么进行以下操作:
单变量数据
- 当看到一个新数据的时候,可能开始我们想了解数据的分布情况,那么最简单方式就是数据可视化
- 最简单数据可视化就是利用单变量数据(数据中一个变化量)
直方图
- 直方图可以用来可视化单变量数据,并且展现数据分布情况
- 例子
gss_data['age'].hist() #利用gss_data中age数据画直方图
plt.grid()#显示图中的网格线
plt.locator_params(nbins=5)#控制刻度,减少刻度的数量
- 直接绘制Series中多个变量直方图,例子:
inc_age=gss_data[['realrinc','age']].dropna()
ax_list=inc_age.hist(bins=40,figsize=(8,3),xrot=45)#xrot=45就是x轴标签旋转45度
for ax in ax_list[0]:
ax.locator_params(axis='x',nbins=6)
ax.locator_params(axis='y',nbins=3)
- KDE(核密度估计)
- KDE是平滑的直方图,利用pandas可以很简单生成KDE图
- 例子
age = gss_data['age'].dropna()
age.plot(kind='kde', lw=2, color='green')
plt.title('KDE plot for Age')
plt.xlabel('Age (years)')
-
结果
- pandas不支持设置KDE图像的参数,特别是平滑方面的设置,不同bandwidth会产生不同估计,pandas产生一个针对大多数情况下的平滑方案但在某些场合结果可能不是最好的
- 正态分布图
- 根据已有数据,绘制数据相应正态分布图形,目前pandas中不支持绘制,但Scipy可以绘制
- 例子
import scipy.stats as stats
stats.probplot(age, dist='norm', plot=plt)
-
结果
- 从结果可以知道,数据越服从正态分布那么数据与直线之间拟合程度越好,但从结果可以知道数据的尾部与正态直线之间的差距较大,所以数据不符合正态分布
统计推断概念
- 研究过程
- 从总体中抽取无偏差的样本
- 通过数据分析,获得样本数据中的特点
- 通过统计检验,参数估计和相似工具,可以根据样本得出结论
- 根据推断,最后对总体得出一个结论
- 目的
- 通过图表可以描述数据并且能够得到数据的一些特点,数值分析可以得到一定准确度是结果但是没有上下文,可能会对数据进行错误解读
- 针对数值数据需要考虑的问题
- 数据范围是什么?最大值,最小值
- 数据中位数,均值是什么
- 数据与中心点之间的分布情况是什么样子的?是松散还是紧密分布
- 这些问题都可以通过pandas中describle()函数获得
- describle()函数会返回一些数据如:
count 2751.000000
mean 18582.194656
std 14841.581333
min 245.000000
25% 6737.500000
50% 15925.000000
75% 26950.000000
max 68600.000000
Name: realrinc, dtype: float64 - count:整个数据一共有多少样本点
- mean:数据的均值
- std:标准差
- min:最小值
- 25%:4分位数
- 50%:中位数
- 75%:3/4位数
- max:最大值
- describle()函数会返回一些数据如:
- describle(percentiles=np.arange(0,1.0,0.1):将数据分成10个区间,每个区间包含总数据的10%各数,当每个区间边界都代表一个百分位数,这里是10%位数
- 数据的摘要显示一些统计数值,但没有可视化那么清楚,为了更加清楚数据分布情况,使用箱线图
- 箱线图会标记中位数,1/4位数,3/4位数,离群点等
-
例子:
- 同样可以利用箱线比较两个数据对象之间的分布情况
- 例子
inc_gen = gss_data[['realrinc','sex']]
inc_gen = inc_gen[inc_gen['realrinc'] <3.0E5]
inc_gen.boxplot(column='realrinc', by='sex');#column指定数据是那一列,by:按照该列对column对应数据进行分组
-
结果
- 可以比较两个数据之间的分布情况
- 散点图-描述数据变量之间的相关性
- 散点图描述x与y之间的相关关系,直观感受数据之间是否具有相关关系的可能
- 假设检验:提出假设(零假设和备择假设),根据显著性水平判断检验统计量是否支持零假设,如果不能否决那就是支持否则拒绝零假设,接受备择假设
- 可能单纯绘制散点图并不能完全说明数据之间的相关性,可以在图上添加趋势线,利用线性回归
- 线性回归的代码:
from scipy.stats import linregress
rv = hubble_data.as_matrix(columns=['r','v'])
a, b, r, p, stderr = linregress(rv) #
print(a, b, r, p, stderr)
- 代码结果的解释:
a:回归线的斜率,b:截距,r:相关系数(两个变量之间的),p:零假设:斜率=0 两个变量之间没有关系的一个双边检验的p值- pandas中不支持在散点图中添加回归线,可以借助pyplot在散点图基础上绘制回归线