Python数据相关性分析实践记录
数据分析是很多建模挖掘类任务的基础,也是非常重要的一项工作,在我之前的系列博文里面已经详细介绍过很多数据分析相关的内容和实践工作了,与之对应的最为常见的分析手段就是热力图可视化分析了,这里我简单给出来自己之前的几篇相关的文章,感兴趣的话可以前去查阅。
《Python基于seaborn绘制喜欢的热力图,不同色系一览》
《python实践统计学中的三大相关性系数,并绘制相关性分析的热力图》
里面有很详细的对应的实践,今天看到一个不错的新闻文章,里面简单介绍了一些相关性分析的内容,我觉得整体的实现上面比较简洁,为什么说是比较简洁呢,因为大量使用了Numpy、Scipy和Pandas这三款神器,我之前的文章里面大量的操作都是自己实现的,比较少去使用到Pandas这类的工具,但是作为神器,还是很有必要学习了解一下的,所以这里就当做是一个简单的学习实践的记录吧,一起总结实践一下数据相关性分析的内容。
本文的所有数据+代码+可视化结果已经上传到资源目录了,地址在这里,需要的可以下载使用。
闲话就说到这里了,接下来我们开始本文的实践。主要基于iris数据集进行的相关性分析。
首先是数据集的加载部分:
data=sns.load_dataset('iris', data_home='seaborn-data/')
df=data.iloc[:, :4]
print(df)
seaborn-data是从GitHub上面下载的完整的数据包,可以直接使用的,我也已经把整个数据包一同上传到了本文对应的资源目录里面了,这里简单看下seaborn-data的数据组成:
我们使用的就是红框对应的数据集,这里有一个点需要注意的就是在数据集加载这里,我们看下seaborn对应加载函数的源码:
def load_dataset(name, cache=True, data_home=None, **kws):
"""Load a dataset from the online repository (requires internet).
Parameters
----------
name : str
Name of the dataset (`name`.csv on
https://github.com/mwaskom/seaborn-data). You can obtain list of
available datasets using :func:`get_dataset_names`
cache : boolean, optional
If True, then cache data locally and use the cache on subsequent calls
data_home : string, optional
The directory in which to cache data. By default, uses ~/seaborn-data/
kws : dict, optional
Passed to pandas.read_csv
"""
path = ("https://raw.githubusercontent.com/"
"mwaskom/seaborn-data/master/{}.csv")
full_path = path.format(name)
if cache:
cache_path = os.path.join(get_data_home(data_home),
os.path.basename(full_path))
if not os.path.exists(cache_path):
urlretrieve(full_path, cache_path)
full_path = cache_path
df = pd.read_csv(full_path, **kws)
if df.iloc[-1].isnull().all():
df = df.iloc[:-1]
if not pandas_has_categoricals:
return df
# Set some columns as a categorical type with ordered levels
if name == "tips":
df["day"] = pd.Categorical(df["day"], ["Thur", "Fri", "Sat", "Sun"])
df["sex"] = pd.Categorical(df["sex"], ["Male", "Female"])
df["time"] = pd.Categorical(df["time"], ["Lunch", "Dinner"])
df["smoker"] = pd.Categorical(df["smoker"], ["Yes", "No"])
if name == "flights":
df["month"] = pd.Categorical(df["month"], df.month.unique())
if name == "exercise":
df["time"] = pd.Categorical(df["time"], ["1 min", "15 min", "30 min"])
df["kind"] = pd.Categorical(df["kind"], ["rest", "walking", "running"])
df["diet"] = pd.Categorical(df["diet"], ["no fat", "low fat"])
if name == "titanic":
df["class"] = pd.Categorical(df["class"], ["First", "Second", "Third"])
df["deck"] = pd.Categorical(df["deck"], list("ABCDEFG"))
return df
这里看完函数的注释就会明白如果data_home这个参数没有指定的话就会每次执行的时候都去下载数据集,我本机执行的时候报错如下:
这个应该还是网络政策的原因吧,导致连接失败的,所以最好的就是提前下载好数据集,之后通过指定data_homt这个参数就行了。
结果输出如下所示:
sepal_length sepal_width petal_length petal_width
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
5 5.4 3.9 1.7 0.4
6 4.6 3.4 1.4 0.3
7 5.0 3.4 1.5 0.2
8 4.4 2.9 1.4 0.2
9 4.9 3.1 1.5 0.1
10 5.4 3.7 1.5 0.2
11 4.8 3.4 1.6 0.2
12 4.8 3.0 1.4 0.1
13 4.3 3.0 1.1 0.1
14 5.8 4.0 1.2 0.2
15 5.7 4.4 1.5 0.4
16 5.4 3.9 1.3 0.4
17 5.1 3.5 1.4 0.3
18 5.7 3.8 1.7 0.3
19 5.1 3.8 1.5 0.3
20 5.4 3.4 1.7 0.2
21 5.1 3.7 1.5 0.4
22 4.6 3.6 1.0 0.2
23 5.1 3.3 1.7 0.5
24 4.8 3.4 1.9 0.2
25 5.0 3.0 1.6 0.2
26 5.0 3.4 1.6 0.4
27 5.2 3.5 1.5 0.2
28 5.2 3.4 1.4 0.2
29 4.7 3.2 1.6 0.2
.. ... ... ... ...
120 6.9 3.2 5.7 2.3
121 5.6 2.8 4.9 2.0
122 7.7 2.8 6.7 2.0
123 6.3 2.7 4.9 1.8
124 6.7 3.3 5.7 2.1
125 7.2 3.2 6.0 1.8
126 6.2 2.8 4.8 1.8
127 6.1 3.0 4.9 1.8
128 6.4 2.8 5.6 2.1
129 7.2 3.0 5.8 1.6
130 7.4 2.8 6.1 1.9
131 7.9 3.8 6.4 2.0
132 6.4 2.8 5.6 2.2
133 6.3 2.8 5.1 1.5
134 6.1 2.6 5.6 1.4
135 7.7 3.0 6.1 2.3
136 6.3 3.4 5.6 2.4
137 6.4 3.1 5.5 1.8
138 6.0 3.0 4.8 1.8
139 6.9 3.1 5.4 2.1
140 6.7 3.1 5.6 2.4
141 6.9 3.1 5.1 2.3
142 5.8 2.7 5.1 1.9
143 6.8 3.2 5.9 2.3
144 6.7 3.3 5.7 2.5
145 6.7 3.0 5.2 2.3
146 6.3 2.5 5.0 1.9
147 6.5 3.0 5.2 2.0
148 6.2 3.4 5.4 2.3
149 5.9 3.0 5.1 1.8
[150 rows x 4 columns]
[Finished in 1.5s]
接下来我们借助Numpy、Scipy和Pandas这三款神器来完成基础的数据相关分析实践:
#Numpy
#计算这个数据集中第1列和第3列的相关性
X=df['sepal_length']
Y=df['petal_length']
result_np=np.corrcoef(X,Y)
print('result_np: ', result_np)
#计算df中4个维度的相关关系,这里rowvar代表以列为维度
result_nps=np.corrcoef(df,rowvar=False)
print('result_nps: ', result_nps)
#Scipy
result_sc=scipy.stats.pearsonr(X,Y)
print('result_sc: ', result_sc) #相关性和P值
#Pandas
result_pd1=X.corr(Y)
result_pd2=df.corr()
print('result_pd1: ', result_pd1)
print('result_pd2: ', result_pd2)
结果输出如下所示:
('result_np: ', array([[1. , 0.87175378],
[0.87175378, 1. ]]))
('result_nps: ', array([[ 1. , -0.11756978, 0.87175378, 0.81794113],
[-0.11756978, 1. , -0.4284401 , -0.36612593],
[ 0.87175378, -0.4284401 , 1. , 0.96286543],
[ 0.81794113, -0.36612593, 0.96286543, 1. ]]))
('result_sc: ', (0.8717537758865832, 1.0386674194497583e-47))
('result_pd1: ', 0.8717537758865831)
('result_pd2: ', sepal_length sepal_width petal_length petal_width
sepal_length 1.000000 -0.117570 0.871754 0.817941
sepal_width -0.117570 1.000000 -0.428440 -0.366126
petal_length 0.871754 -0.428440 1.000000 0.962865
petal_width 0.817941 -0.366126 0.962865 1.000000)
一些需要解释的点也都放到代码里面去了,这里就不再多解释了。
数值型数据的结果直接来看总是那么不直观形象,所以往往数据分析里面就会用到数据可视化,这里我们也对分析结果进行相应的可视化展示。
首先来看简单的可视化:
plt.clf()
plt.figure(figsize=(8,8))
sns.pairplot(df)
plt.title('RelationAnalysis')
plt.savefig('1.png')
结果如下所示:
之后,我们分别以每一列为对比基准来进行可视化展示:
1、以sepal_width为基准:
2、以petal_width为基准:
3、以sepal_length为基准:
4、以petal_length为基准:
上面的可视化是对数据的分布进行的直接的可视化分析展示,之后我们同样可以借助于热力图来完成相关性分析数据的可视化。
plt.clf()
figure,ax=plt.subplots(figsize=(8,8))
sns.heatmap(df.corr(),square=True,annot=True,ax=ax)
plt.title('HeatMapAnalysis')
plt.savefig('4.png')
结果如下所示:
热力图的展示形式可以是非常多种多样的,感兴趣的话可以参考我之前的文章,这里就不多加累赘了。
上一篇: 京瓷255一体机怎么创建共享文件夹权限?
下一篇: Java基础-类与对象