<div style="font-size:16px;">
<p>不可否认的是python的统计功能若于R和SAS,但对于常见的统计分析,python亦可以实现。本文介绍Python中的ggplot2绘图库:plotnine,使用python完成常见的统计描述、分布差异检验、相关分析和回归分析方法。</p>
<p># plotnine:python中的ggplot2</p>
<p>import plotnine as pn</p>
<p>from plotnine import data</p>
<p>import numpy as np</p>
<p>import pandas as pd</p>
<p># 统计分析</p>
<p>from scipy import stats</p>
<p>import statsmodels.api as sm</p>
<p>from statsmodels.formula.api import ols, glm, poisson</p>
<p>import copy</p>
<p># 阻止pandas产生warnings(提示DataFrame的相关操作生成引用or副本)</p>
<p>import warnings</p>
<p>warnings.filterwarnings("ignore")</p>
<p># jupyter中同一个cell的多个结果均自动输出,不需挨个手工print</p>
<p>from IPython.core.interactiveshell import InteractiveShell</p>
<p>InteractiveShell.ast_node_interactivity = "all"</p>
<p>使用 plotnine 库自带的 mtcars 汽车数据集</p>
<p>选取 mtcars 的子集 df,共 32 个记录,6 个变量</p>
<p>df = data.mtcars[["wt", "mpg", "cyl", "vs", "am", "gear"]]</p>
<p>df.shape</p>
<p>df.dtypes</p>
<p>print(df.head())</p>
<p>(32, 6)</p>
<p>wt float64</p>
<p>mpg float64</p>
<p>cyl int64</p>
<p>vs int64</p>
<p>am int64</p>
<p>gear int64</p>
<p>dtype: object</p>
<p>wt mpg cyl vs am gear</p>
<p>0 2.620 21.0 6 0 1 4</p>
<p>1 2.875 21.0 6 0 1 4</p>
<p>2 2.320 22.8 4 1 1 4</p>
<p>3 3.215 21.4 6 1 0 3</p>
<p>4 3.440 18.7 8 0 0 3</p>
<p>将变量 vs、am、gear 由数值型连续变量转为字符型分类变量</p>
<p>df["vs"] = df["vs"].astype(str)</p>
<p>df["am"] = df["am"].astype(str)</p>
<p>df["gear"] = df["gear"].astype(str)</p>
<p>df.dtypes</p>
<p>wt float64</p>
<p>mpg float64</p>
<p>cyl int64</p>
<p>vs object</p>
<p>am object</p>
<p>gear object</p>
<p>dtype: object</p>
<p>变量分布</p>
<p># 连续变量的常见分布统计量</p>
<p>print(df.describe())</p>
<p># 分类变量的类别及频数</p>
<p>df["vs"].value_counts()</p>
<p>df["am"].value_counts()</p>
<p>df["gear"].value_counts()</p>
<p>wt mpg cyl</p>
<p>count 32.000000 32.000000 32.000000</p>
<p>mean 3.217250 20.090625 6.187500</p>
<p>std 0.978457 6.026948 1.785922</p>
<p>min 1.513000 10.400000 4.000000</p>
<p>25% 2.581250 15.425000 4.000000</p>
<p>50% 3.325000 19.200000 6.000000</p>
<p>75% 3.610000 22.800000 8.000000</p>
<p>max 5.424000 33.900000 8.000000</p>
<p>0 18</p>
<p>1 14</p>
<p>Name: vs, dtype: int64</p>
<p>0 19</p>
<p>1 13</p>
<p>Name: am, dtype: int64</p>
<p>3 15</p>
<p>4 12</p>
<p>5 5</p>
<p>Name: gear, dtype: int64</p>
<p>plotnine 绘图</p>
<p>plotnine 是 python 的一个绘图库,模仿了 ggplot2 的语法和绘图样式,如果熟悉 R 的 ggplot2,那么该库可快速上手。</p>
<p>该库与 R 的 ggplot2 使用中主要有以下 2 点不同:ggplot() 的 mapping 参数,R 中写为 aes(x = mpg, y = wt),plotnine 写为 aes(x="mpg", y="wt")</p>
<p>plotnine 要求整个绘图语句为一个语句,若中间需要换行,需要使用 \ 连接或者语句首尾加括号</p>
<p>以下是几个简单的例子</p>
<p>散点图 + 回归线</p>
<p>pn.ggplot(data = df, mapping=pn.aes(x="mpg", y="wt")) + \</p>
<p>pn.geom_point() + \</p>
<p>pn.geom_smooth(method="lm") + \</p>
<p align="center"> pn.theme_classic()<img alt="" src=""></p>
<p>分组</p>
<p>按照 vs 分组,分别绘制散点图、回归线及其 95% 置信区间</p>
<p>pn.ggplot(data = df, mapping=pn.aes(x="mpg", y="wt", color="vs")) + \</p>
<p>pn.geom_point() + \</p>
<p>pn.geom_smooth(method="lm") + \</p>
<p align="center"> pn.theme_classic()<img alt="" src=""></p>
<p>分面(xkcd 主题)</p>
<p>按照变量 vs 和 gear 进行分面</p>
<p>pn.ggplot(data = df, mapping=pn.aes(x="mpg", y="wt")) + \</p>
<p>pn.facet_grid("vs ~ gear") + \</p>
<p>pn.geom_point() + \</p>
<p>pn.geom_smooth(method="lm") + \</p>
<p align="center"> pn.theme_xkcd()<img alt="" src=""></p>
<p>描述性统计量</p>
<p>各变量的缺失值</p>
<p>df.apply(lambda x: sum(x.isnull())).sort_values()</p>
<p>wt 0</p>
<p>mpg 0</p>
<p>cyl 0</p>
<p>vs 0</p>
<p>am 0</p>
<p>gear 0</p>
<p>count 0</p>
<p>dtype: int64</p>
<p>连续变量和分类变量的分布信息</p>
<p>print(df.describe())</p>
<p># count:分类变量非缺失值的数量</p>
<p># unique:分类变量唯一值的数量</p>
<p># top:分类变量中出现频次最高的数</p>
<p># freq:分类变量中出现频次最高的数出现了几次</p>
<p>print(df.describe(include="object"))</p>
<p>wt mpg cyl</p>
<p>count 32.000000 32.000000 32.000000</p>
<p>mean 3.217250 20.090625 6.187500</p>
<p>std 0.978457 6.026948 1.785922</p>
<p>min 1.513000 10.400000 4.000000</p>
<p>25% 2.581250 15. |
|