1、什么是探索性数据分析?
- 探索性数据分析的概念
(1)简称----Exploratory Data Analysis, EDA 探索性数据分析比验证性数据分析更加实用 - EDA的目的
- EDA常用工具
2、python常用的可视化工具
2、1 Matplotlib
plt.imshow(),即混淆矩阵在机器学习中有大用,看对角线上的值,越高越准确,比如(房屋数、卧室数、房价,当房屋数和卧室数确定矩阵的形状时,房价充当值,颜色来区分价格的高低)
# 引入matplotlib包
import matplotlib.pyplot as plt
%matplotlib inline(在jupyter notebook中必加)
# 创建figure
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)#采用add_subplot函数做一个2行2列的子图,此时返回的是第一个子图
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
# 在subplot上作图
import numpy as np
random_arr = np.random.randn(100)
# 默认是在最后一次使用的subplot位置上作图,但是在jupyter notebook里无效
plt.plot(random_arr)
plt.show()#默认展示一个线图
# 在指定subplot作图
import scipy as sp
from scipy import stats
x = np.linspace(-5, 15, 50)
#print(x.shape)
# 绘制高斯分布
plt.plot(x, sp.stats.norm.pdf(x=x, loc=5, scale=2))#norm表示正态分布,pdf表示密度函数,loc表示中值,范围为0到2。
# 叠加直方图
plt.hist(sp.stats.norm.rvs(loc=5, scale=2, size=200), bins=50, normed=True, color='red', alpha=0.5)
plt.show()
# 绘制直方图
plt.hist(np.random.randn(100), bins=10, color='b', alpha=0.3)
plt.show()
# 绘制散点图
x = np.arange(50)
y = x + 5 * np.random.rand(50)
plt.scatter(x, y)
# 柱状图(以下绘制两个柱状图)
x = np.arange(5)
y1, y2 = np.random.randint(1, 25, size=(2, 5))
width = 0.25
ax = plt.subplot(1,1,1)
ax.bar(x, y1, width, color='r')
ax.bar(x+width, y2, width, color='g')
ax.set_xticks(x+width)
ax.set_xticklabels(['a', 'b', 'c', 'd', 'e'])
plt.show()
# 矩阵绘图
m = np.random.rand(10,10)
print(m)
plt.imshow(m, interpolation='nearest', cmap=plt.cm.ocean)#interpolation='nearest'设置一个差值方法,cmap=plt.cm.ocean为camp设置一个主题,海洋色主题。
plt.colorbar()#显示颜色条
plt.show()
**注意:
matplotlib的设置:
plt.rc()
参考文档:https://matplotlib.org/users/customizing.html
import matplotlib.pyplot as plt
#•plt.subplots()的使用
fig, subplot_arr = plt.subplots(2,2)
print(fig)
subplot_arr[0,0].hist(np.random.randn(100), bins=10, color='b', alpha=0.3)
plt.show()
#•颜色、标签、线型
fig, axes = plt.subplots(2)
axes[0].plot(np.random.randint(0, 100, 50), 'ro--')
# 等价
axes[1].plot(np.random.randint(0, 100, 50), color='r', linestyle='dashed', marker='o')
#刻度、标签、图例
fig, ax = plt.subplots(1)
ax.plot(np.random.randn(1000).cumsum(), label='line0')
# 设置刻度
#plt.xlim([0,500])
ax.set_xlim([0, 800])
# 设置显示的刻度
#plt.xticks([0,500])
ax.set_xticks(range(0,500,100))
# 设置刻度标签
ax.set_yticklabels(['Jan', 'Feb', 'Mar'])
# 设置坐标轴标签
ax.set_xlabel('Number')
ax.set_ylabel('Month')
# 设置标题
ax.set_title('Example')
# 图例
ax.plot(np.random.randn(1000).cumsum(), label='line1')
ax.plot(np.random.randn(1000).cumsum(), label='line2')
ax.legend()
ax.legend(loc='best')
plt.legend()
2、2 Seaborn
-
Seaborn介绍
(1)什么是serborn?
seaborn可以对pandas数据进行操作,对matplotlib进行了一系列的简化操作
(2)特点
参考文档: -
内置主题:http://seaborn.pydata.org/tutorial/aesthetics.html#aesthetics-tutorial
-
单一变量:http://seaborn.pydata.org/examples/distplot_options.html
-
比较:http://seaborn.pydata.org/examples/grouped_violinplots.html
-
线性回归模型:http://seaborn.pydata.org/examples/anscombes_quartet.html
-
独立变量:http://seaborn.pydata.org/examples/pointplot_anova.html
-
不独立变量:http://seaborn.pydata.org/examples/logistic_regression.html
-
矩阵数据:http://seaborn.pydata.org/examples/heatmap_annotation.html
-
矩阵间的结构:
http://seaborn.pydata.org/examples/structured_heatmap.html#structured-heatmap -
分割区域制图:
http://seaborn.pydata.org/examples/faceted_histogram.html#faceted-histogram -
复杂:http://seaborn.pydata.org/examples/many_facets.html
(3)安装
-
数据集分布可视化
-
类别数据可视化
- seaborn代码示例
#在pycharm中操作
#!/usr/bin/env python
# coding: utf-8
# # Seaborn
import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
# * 数据集分布可视化
# 单变量分布
x1 = np.random.normal(size=1000)
sns.distplot(x1)
plt.show()
x2 = np.random.randint(0, 100, 500)
sns.distplot(x2)
plt.show()
# 直方图
sns.distplot(x1, bins=20, kde=False, rug=True)
plt.show()
# 核密度估计
sns.distplot(x2, hist=False, rug=True)
sns.kdeplot(x2, shade=True)
sns.rugplot(x2)
plt.show()
# 拟合参数分布
sns.distplot(x1, kde=False, fit=stats.gamma)
plt.show()
# # 双变量分布
df_obj1 = pd.DataFrame({"x": np.random.randn(500),
"y": np.random.randn(500)})
df_obj2 = pd.DataFrame({"x": np.random.randn(500),
"y": np.random.randint(0, 100, 500)})
# # 散布图
sns.jointplot(x="x", y="y", data=df_obj1)
plt.show()
# 二维直方图
sns.jointplot(x="x", y="y", data=df_obj1, kind="hex")
plt.show()
# 核密度估计
sns.jointplot(x="x", y="y", data=df_obj1, kind="kde")
plt.show()
# # 数据集中变量间关系可视化
dataset = sns.load_dataset("tips")
# print(dataset)
#dataset = sns.load_dataset("iris")
# sns.pairplot(dataset)
# plt.show()
# # # 类别数据可视化
#titanic = sns.load_dataset('titanic')
#planets = sns.load_dataset('planets')
#flights = sns.load_dataset('flights')
#iris = sns.load_dataset('iris')
exercise = sns.load_dataset('exercise')
# # * 类别散布图
# sns.stripplot(x="diet", y="pulse", data=exercise)
#
# sns.swarmplot(x="diet", y="pulse", data=exercise, hue='kind')
# plt.show()
# # * 类别内数据分布
# # 盒子图
sns.boxplot(x="diet", y="pulse", data=exercise)
plt.show()
sns.boxplot(x="diet", y="pulse", data=exercise, hue='kind')
plt.show()
# # 小提琴图
#sns.violinplot(x="diet", y="pulse", data=exercise)
sns.violinplot(x="diet", y="pulse", data=exercise, hue='kind')
plt.show()
# # 类别内统计图
# 柱状图
sns.barplot(x="diet", y="pulse", data=exercise, hue='kind')
# 点图
sns.pointplot(x="diet", y="pulse", data=exercise, hue='kind')
2、3 pycharts
已经介绍了。!!!!!!!
3、探索变量关系及其可视化(数据集来描述变量之间的关系) 简单示例的问题 把问题进行数据格式化
- 步骤:
- 准备工作: 加载相关模块及设置绘图样式
- 加载数据: 加载并查看数据
- 提出问题: 快速回答一些简单的问题
- 可视化: 通过matplotlib及seaborn绘制并验证数据分布
- 发现: 数据中是否存在更深层次的的信息?
# #!/usr/bin/env python
# # coding: utf-8
# # ## 探索变量关系及其可视化
#
# # ### 步骤
# #
# # 1. **准备工作:** 加载相关模块及设置绘图样式
# # 2. **加载数据:** 加载并查看数据
# # 3. **提出问题:** 快速回答一些简单的问题
# # 4. **可视化:** 通过matplotlib及seaborn绘制并验证数据分布
# # 5. **发现:** 数据中是否存在更深层次的的信息?
#
# # ### 1. 准备工作
#
# # 加载相关模块并设置绘图样式
import warnings
warnings.simplefilter('ignore')
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
from pandas import set_option
set_option("display.max_rows", 16)
LARGE_FIGSIZE = (12, 8)
## 2. 加载数据
# 读取csv数据集
lexp = pd.read_csv('D:\zfile\lexpectancy.csv')
# 数据预览
# print(lexp.head())
# # 查看数据形状
# print(lexp.shape)#248行56列(第一个参数代表行,第二个代表列)
# # 查看数据集信息
# print(lexp.info())
# 设置行索引为'Country'列
lexp = lexp.set_index('Country')
# print(lexp.head())
# ### 3. 初期EDA
# **Q1. 1960~2013年间,整体的平均寿命是否延长?**
# lexp.mean().plot()#pandas自带绘图的工具,有plot
# plt.show()
# **Q2. 1960年哪些国家拥有最长/最短的平均寿命?**
# idxmax 和 idxmin 提供列中对应数据最大值和最小值的索引值
print(lexp['1960'].idxmax())
print(lexp['1960'].idxmin())
# # **Q3. 1960年寿命的最大、最小及平均值?**
# max and min provide the values
print(np.round(lexp['1960'].max()))
print(np.round(lexp['1960'].min()))
print(np.round(lexp['1960'].mean()))
# # **Q4. 任意年的最大、最小、平均寿命?**
def high_low_mean(year):
print("{}年:".format(year))
print(lexp[year].idxmin(), "有最小寿命值:", np.round(lexp[year].min()))
print(lexp[year].idxmax(), "有最大寿命值:", np.round(lexp[year].max()))
print("平均寿命值: ", np.round(lexp[year].mean()))
high_low_mean('2000')
# # **Q5. 哪个国家有最大/最小的寿命增长率?**
# gain = (value_in_2013 - value_in_1960)/value_in_1960
lexp['gain'] = np.round((lexp['2013']-lexp['1960'])/lexp['1960'],2)
# print(lexp.head())
gain = lexp['gain']
# print(gain.head())
# 去掉空值并排序
lexp_gain = gain.dropna().sort_values(ascending=False)
# print(lexp_gain.head())
# 增长率最高的10个国家
# print(lexp_gain.head(10))
# 增长率最低的10个国家
# print(lexp_gain.tail(10))
# 删除列
del lexp['gain']
# 增长率直方图
# lexp_gain.hist()
# plt.show()
# 增长率核密度估计
# lexp_gain.plot(kind='kde')
# plt.show()
# 增长率柱状图,并保存
# ax = lexp_gain.plot(kind='bar', figsize=(50,25))
# fig = ax.get_figure()
# fig.savefig('gains.png')
# plt.show()
# # ## 4. 变量关系及分布的可视化
# # ### 直方图
# lexp.hist(column='1960', bins=20)
# plt.show()
# # 使用subplots对比1960和2013年的数据分布
# f, (ax1, ax2) = plt.subplots(2)
# lexp.hist(column='1960', ax=ax1)
# lexp.hist(column='2013', color='green', ax=ax2)
# plt.show()
# # 同一个图中绘制两个子图
# f, (ax1) = plt.subplots(1,figsize=LARGE_FIGSIZE)
# lexp.hist(column='1960',bins=30, ax=ax1)
# lexp.hist(column='2013',bins=30, color='blue', ax=ax1)
# plt.xlabel('Life Expectancy')
# plt.ylabel('Number of Countries')
# plt.title("1960 vs 2013")
# plt.show()
# # 定义函数比较任意两年的分布比较
# def compare_hist(year1,year2):
# f, (ax1) = plt.subplots(1,figsize=LARGE_FIGSIZE)
# lexp.hist(column=year1,bins=20, ax=ax1);
# lexp.hist(column=year2,bins=20, color='blue', ax=ax1);
# plt.xlabel('Life Expectancy')
# plt.ylabel('Number of Countries')
# plt.title(str(year1) + " vs " + str(year2))
# plt.show()
#
# compare_hist('2000','2010')
### 核密度估计 及 Rugplot
# # 重新读取csv数据集
# lexp['2010'].dropna()
# sns.distplot(lexp['2010'].dropna(), hist=False, kde=True, rug=False, bins=25)
# def sns_compare(year1,year2):
# f, (ax1) = plt.subplots(1, figsize=LARGE_FIGSIZE)
# for yr in range(int(year1),int(year2)):
# sns.distplot(lexp[str(yr)].dropna(), hist=False, kde=True, rug=False, bins=25)
#
# sns_compare('2000','2010')
# plt.show()
# # 同一图中对比
# f, ax1 = plt.subplots(1, figsize=LARGE_FIGSIZE)
# sns.distplot(lexp['1960'].dropna(),hist=True, kde=True, rug=False, bins=25);
# sns.distplot(lexp['2010'].dropna(),hist=True, kde=True, rug=False, bins=25);
# plt.xlabel('Life Expectancy');
# plt.ylabel('Number of Countries');
# plt.title('Life Expectancy: 1960 vs 2010')
# plt.show()
# # FaceGrid
# fig = sns.FacetGrid(lexp,aspect=4)
# decades = [str(year) for year in range(1960, 2000) if year%10==0]
# for year in decades:
# fig.map(sns.kdeplot, year, color=np.random.rand(3,1))
# plt.show()
# # #### 盒形图
# lexp.boxplot(column='1960');
# lexp.boxplot(column=['1960','2010']);
# def boxplot_compare(year1,year2):
# f, (ax1) = plt.subplots(1, figsize=LARGE_FIGSIZE)
# lexp.boxplot(column=[year1,year2]);
# boxplot_compare('1990', '2010')
# plt.show()
# # #### 小提琴图
# sns.violinplot(lexp['1960'])
sns.violinplot(lexp['1960'], palette="Set2",linewidth=5)
sns.violinplot(lexp['2010'],linewidth=5)
# def violin_compare(year1, year2):
# f, (ax1) = plt.subplots(1, figsize=LARGE_FIGSIZE)
# sns.violinplot(lexp[year1], palette="Set2")
# sns.violinplot(lexp[year2])
#
# violin_compare('1990', '2010')
# plt.show()
# # ## 5. 发现
# lexp.head()
# 数据转置
transform = lexp.T
transform.head()
# 去掉Code行
t = transform.ix[1:]
# verify first few lines
t.head()
# 比较两个国家的寿命趋势
t['Norway'].plot()
t['Mali'].plot()
plt.legend();
print("Norway Percentage Gain = ", lexp_gain['Norway'])
print("Mali Percentage Gain = ", lexp_gain['Mali'])
# # ### 1960 - 2013寿命趋势可视化
fig = plt.figure(figsize=LARGE_FIGSIZE)
lexp.boxplot(sym="*") # sym表示盒形图中的异常值
plt.xticks(rotation='vertical')
lexp['1977'].idxmin()
lexp['1993'].idxmin()
fig = plt.figure(figsize=(20,10), dpi=200)
t['Cambodia'].plot(marker='o', color='blue');
t['Rwanda'].plot(marker='o',color='green');
lexp.mean().plot(color='red', label='Mean');
plt.xticks(rotation='vertical');
plt.legend()
plt.show()
# # ### 国家间比较
def compare(countries):
for country in countries:
t[country].plot(figsize=(20,10))
print(country, lexp_gain[country])
plt.legend();
# create a list of the ten countries with lowest life expectancy in 1960
bot10 = lexp.sort_values(by='1960')['1960'].head(10).index.tolist()
# create a list of the ten countries with the highest life expectancy in 1960
top10 = lexp.sort_values(by='1960')['1960'].dropna().tail(10).index.tolist()
bot10
compare(bot10)
compare(top10)
sub_sahara=['Namibia','Botswana','South Africa','Uganda','Kenya']
compare(sub_sahara)
latam = ['Argentina','Bolivia','Colombia','Chile','Brazil','Paraguay','Uruguay']
compare(latam)
africa = ['Nigeria','South Africa','Niger','Tanzania','Zambia']
compare(africa)
网友评论