如何判断一组数据是不是为正态分布
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断一组数据是不是为正态分布相关的知识,希望对你有一定的参考价值。
参考技术A 当我们应用统计方法对数据进行分析时,会发现许多计量资料的分析方法,例如常用的T检验、方差分析、相关分析以及线性回归等等,都要求数据服从正态分布或者近似正态分布,但这一前提条件往往被使用者所忽略。因此为了保证数据满足上述统计方法的应用条件,对原始数据进行正态性检验是十分必要的,这一节内容我们主要向大家介绍如何对数据资料进行正态性检验。一、正态性检验:偏度和峰度
1、偏度(Skewness):描述数据分布不对称的方向及其程度(见图1)。
当偏度≈0时,可认为分布是对称的,服从正态分布;
当偏度>0时,分布为右偏,即拖尾在右边,峰尖在左边,也称为正偏态;
当偏度<0时,分布为左偏,即拖尾在左边,峰尖在右边,也称为负偏态;
注意:数据分布的左偏或右偏,指的是数值拖尾的方向,而不是峰的位置,容易引起误解。
2、峰度(Kurtosis):描述数据分布形态的陡缓程度(图2)。
当峰度≈0时,可认为分布的峰态合适,服从正态分布(不胖不瘦);
当峰度>0时,分布的峰态陡峭(高尖);
当峰度<0时,分布的峰态平缓(矮胖);
利用偏度和峰度进行正态性检验时,可以同时计算其相应的Z评分(Z-score),即:偏度Z-score=偏度值/标准误,峰度Z-score=峰度值/标准误。在α=0.05的检验水平下,若Z-score在±1.96之间,则可认为资料服从正态分布。
了解偏度和峰度这两个统计量的含义很重要,在对数据进行正态转换时,需要将其作为参考,选择合适的转换方法
如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?
【中文标题】如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?【英文标题】:How do I tell if a column in a pandas dataframe is of type datetime? How do I tell if a column is numerical?如何判断 pandas 数据框中的列是否为 datetime 类型?如何判断一列是否为数字? 【发布时间】:2017-08-30 01:34:08 【问题描述】:我正在尝试根据它们是否为日期类型来过滤熊猫数据框中的列。我可以弄清楚哪些是,但随后必须解析该输出或手动选择列。我想自动选择日期列。这是我到目前为止的示例 - 在这种情况下,我只想选择“date_col”列。
import pandas as pd
df = pd.DataFrame([['Feb-2017', 1, 2],
['Mar-2017', 1, 2],
['Apr-2017', 1, 2],
['May-2017', 1, 2]],
columns=['date_str', 'col1', 'col2'])
df['date_col'] = pd.to_datetime(df['date_str'])
df.dtypes
输出:
date_str object
col1 int64
col2 int64
date_col datetime64[ns]
dtype: object
【问题讨论】:
【参考方案1】:我刚遇到这个问题,发现@charlie-haley 的回答对于我的用例来说不够笼统。特别是np.datetime64
似乎与datetime64[ns, UTC]
不匹配。
df['date_col'] = pd.to_datetime(df['date_str'], utc=True)
print(df.date_str.dtype) # datetime64[ns, UTC]
您还可以扩展 dtypes 列表以包含其他类型,但这似乎不是未来兼容性的好解决方案,因此我最终使用了 pandas api 中的 is_datetime64_any_dtype
函数。
在:
from pandas.api.types import is_datetime64_any_dtype as is_datetime
df[[column for column in df.columns if is_datetime(df[column])]]
输出:
date_col
0 2017-02-01 00:00:00+00:00
1 2017-03-01 00:00:00+00:00
2 2017-04-01 00:00:00+00:00
3 2017-05-01 00:00:00+00:00
【讨论】:
尽管严格来说是正确的,但我想指出的是,这个解决方案没有检测到datetime.date
字段【参考方案2】:
Pandas 有一个很酷的函数select_dtypes
,它可以将排除或包含(或两者)作为参数。它根据 dtypes 过滤数据框。因此,在这种情况下,您需要包含 dtype np.datetime64
的列。要按整数过滤,您可以使用[np.int64, np.int32, np.int16, np.int]
,对于浮点数:[np.float32, np.float64, np.float16, np.float]
,仅按数字列过滤:[np.number]
。
df.select_dtypes(include=[np.datetime64])
输出:
date_col
0 2017-02-01
1 2017-03-01
2 2017-04-01
3 2017-05-01
在:
df.select_dtypes(include=[np.number])
输出:
col1 col2
0 1 2
1 1 2
2 1 2
3 1 2
【讨论】:
【参考方案3】:有点丑的 Numpy 替代方案:
In [102]: df.loc[:, [np.issubdtype(t, np.datetime64) for t in df.dtypes]]
Out[102]:
date_col
0 2017-02-01
1 2017-03-01
2 2017-04-01
3 2017-05-01
In [103]: df.loc[:, [np.issubdtype(t, np.number) for t in df.dtypes]]
Out[103]:
col1 col2
0 1 2
1 1 2
2 1 2
3 1 2
【讨论】:
【参考方案4】:此代码自动识别日期列并将数据类型从对象更改为“datetime64[ns]”。获得日期数据类型后,您可以轻松执行其他操作。
for col in data.columns:
if data[col].dtype == 'object':
try:
data[col] = pd.to_datetime(data[col])
except ValueError:
pass
【讨论】:
【参考方案5】:最近我需要检查列的任何元素是日期还是数字
我的方法是,尝试转换为类型(日期时间或数字),然后检查是否有任何元素为空
pd.to_datetime( data_temp.eval('col_name'), format='%d/%m/%Y', errors='coerce')
输出:
0 2010-09-16
1 2010-09-16
2 2018-06-04
3 NaT
4 NaT
5 2018-11-30
然后使用isnull()
检查元素是否可以转换
pd.to_datetime( data_temp.eval('col_name'), format='%d/%m/%Y', errors='coerce').isnull().any()
这将返回 True,因为最后一个元素是 null/NaT
检查数字
data_temp.eval('col_name').astype(str).str.isnumeric().all()
如果列上的所有元素都是数字,这将返回 True
两者都会返回一个 numpy.bool_,但如果需要,它可以很容易地转换为 bool
type(pd.to_datetime( data_temp.eval(name), format='%d/%m/%Y', errors='coerce').isnull().any())
输出:
numpy.bool_
--
type(bool(pd.to_datetime( data_temp.eval(name), format='%d/%m/%Y', errors='coerce').isnull().any()))
输出:
bool
【讨论】:
【参考方案6】:这应该适用于其中包含时区信息的日期时间。在这里,我将一个日期时间对象(最初存储为对象)转换为日期时间,然后将其本地化。
我的初始日期时间值如下所示
2021-06-15 23:35:00+05:30
for i,j in zip(data.dtypes.index,data.dtypes.values):
if type(j) == pd.core.dtypes.dtypes.DatetimeTZDtype:
data[i] = pd.to_datetime(data[i],utc=True)
data[i] = data[i].dt.tz_convert(tz='Asia/Kolkata')
data[i] = data[i].dt.tz_localize(tz=None)
【讨论】:
以上是关于如何判断一组数据是不是为正态分布的主要内容,如果未能解决你的问题,请参考以下文章