美文网首页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