美文网首页Pandas.Numpy.数据分析
探索性数据分析和数据可视化(上)

探索性数据分析和数据可视化(上)

作者: 梦捷者 | 来源:发表于2019-04-22 15:13 被阅读66次

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代码示例
#在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、探索变量关系及其可视化(数据集来描述变量之间的关系) 简单示例的问题 把问题进行数据格式化

  • 步骤:
  1. 准备工作: 加载相关模块及设置绘图样式
  2. 加载数据: 加载并查看数据
  3. 提出问题: 快速回答一些简单的问题
  4. 可视化: 通过matplotlib及seaborn绘制并验证数据分布
  5. 发现: 数据中是否存在更深层次的的信息?
# #!/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)

相关文章

网友评论

    本文标题:探索性数据分析和数据可视化(上)

    本文链接:https://www.haomeiwen.com/subject/sxzegqtx.html