精华内容
下载资源
问答
  • Python数据分析实例

    万次阅读 多人点赞 2019-06-14 22:13:37
    Python数据分析 Python爬取网页数据

    Python数据分析

    Python爬取网页数据

    // An highlighted block
    import requests
    if __name__=="__main__":
        response = requests.get("https://book.douban.com/subject/26986954/")
        content = response.content.decode("utf-8")
        print(content)
    
    // An highlighted block
    import requests
    url="https://pro.jd.com/mall/active/4BNKTNkRMHJ48QQ5LrUf6AsydtZ6/index.html"
    try:
        r=requests.get(url)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        print(r.text[:100])
    except:
        print("爬取失败")
    

    Python生成柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    num_list = [1.5,0.6,7.8,6]  
    plt.bar(range(len(num_list)), num_list,color='rbgy')  
    plt.show()  
    

    在这里插入图片描述
    Python生成堆状柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    name_list = ['Monday','Tuesday','Friday','Sunday']  
    num_list = [1.5,0.6,7.8,6]  
    num_list1 = [1,2,3,1]  
    plt.bar(range(len(num_list)), num_list, label='boy',fc = 'y')  
    plt.bar(range(len(num_list)), num_list1, bottom=num_list, label='girl',tick_label = name_list,fc = 'r')  
    plt.legend()  
    plt.show()  
    

    在这里插入图片描述
    Python生成竖状柱状图

    // An highlighted block
    import matplotlib.pyplot as plt  
      
    name_list = ['Monday','Tuesday','Friday','Sunday']  
    num_list = [1.5,0.6,7.8,6]  
    num_list1 = [1,2,3,1]  
    x =list(range(len(num_list)))  
    total_width, n = 0.8, 2  
    width = total_width / n  
      
    plt.bar(x, num_list, width=width, label='boy',fc = 'y')  
    for i in range(len(x)):  
        x[i] = x[i] + width  
    plt.bar(x, num_list1, width=width, label='girl',tick_label = name_list,fc = 'r')  
    plt.legend()  
    plt.show()  
    

    在这里插入图片描述
    Python生成折线图

    // An highlighted block
    import pandas as pd
    import numpy as np
     
    df = pd.DataFrame(np.random.rand(15, 4), columns=['a', 'b', 'c', 'd'])
    df.plot.area() 
    

    在这里插入图片描述
    Python生成柱状图

    // An highlighted block
    import pandas as pd
    import numpy as np
     
    df = pd.DataFrame(3 * np.random.rand(5), index=['a', 'b', 'c', 'd','e'], columns=['x'])
    df.plot.pie(subplots=True)
    

    在这里插入图片描述
    Python生成箱型图

    // An highlighted block
    #首先导入基本的绘图包
    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    #添加成绩表
    plt.style.use("ggplot")
    plt.rcParams['axes.unicode_minus'] = False
    plt.rcParams['font.sans-serif']=['SimHei'] 
    
    #新建一个空的DataFrame
    df=pd.DataFrame()
    
    // An highlighted block
    df["英语"]=[76,90,97,71,70,93,86,83,78,85,81]
    df["经济数学"]=[65,95,51,74,78,63,91,82,75,71,55]
    df["西方经济学"]=[93,81,76,88,66,79,83,92,78,86,78]
    df["计算机应用基础"]=[85,78,81,95,70,67,82,72,80,81,77]
    df
    
    // An highlighted block
    plt.boxplot(x=df.values,labels=df.columns,whis=1.5)
    plt.show()
    

    在这里插入图片描述

    // An highlighted block
    #用pandas自带的画图工具更快
    df.boxplot()
    plt.show()
    

    在这里插入图片描述
    Python生成正态分布图

    // An highlighted block
    # -*- coding:utf-8 -*-
    # Python实现正态分布
    # 绘制正态分布概率密度函数
    import numpy as np
    import matplotlib.pyplot as plt
    import math
    
    u = 0  # 均值μ
    u01 = -2
    sig = math.sqrt(0.2)  # 标准差δ
    
    x = np.linspace(u - 3 * sig, u + 3 * sig, 50)
    y_sig = np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2 * math.pi) * sig)
    print(x)
    print("=" * 20)
    print(y_sig)
    plt.plot(x, y_sig, "r-", linewidth=2)
    plt.grid(True)
    plt.show()
    

    在这里插入图片描述
    喜欢的小伙伴可以尝试一下哦

    这是小编公众号,请动动您可爱的小手手,关注一下💓😘
    在这里插入图片描述

    展开全文
  • 学习了Python的各种基础语法和常用包后,你是否对如何使用Python在实际工作中进行数据分析一头雾水?如果是,今天这篇文章一定能带给你一些用数据分析解决实际问题的思路。数据分析的目的决定了你的分析步骤,比如你...

    0a25224121810bb2afdcae42e89b9091.png

    学习了Python的各种基础语法和常用包后,你是否对如何使用Python在实际工作中进行数据分析一头雾水?如果是,今天这篇文章一定能带给你一些用数据分析解决实际问题的思路。

    数据分析的目的决定了你的分析步骤,比如你的分析的目标是提供商业可视化方案,或者是建立模型进行预测,再或者是通过数据挖掘发现并改善现有流程等。今天我们介绍一个简单的数据分析例子-根据销售记录创建可视化报表。


    我是一名药品销售公司的分析师,今天运营部的小丽发给我一份我们某一家药店的销售记录,希望我可以从销售数据中得到以下指标:

    • 月均消费次数
    • 月均消费金额
    • 客单价
    • 消费趋势

    我想作为一个优秀的数据分析师,这个请求完全小菜一叠。我告诉小丽:没问题,我会用代码计算这些指标并做一个PDF的可视化报告给你,未来有相似的需求只要改改数据和参数就能生成一样的报表啦!

    在分析前,我先整理了一下这个分析任务的大致步骤:

    1. 提出问题,理解需求
    2. 导入、理解数据
    3. 数据清洗
    4. 构建模型
    5. 数据可视化

    1. 提出问题,理解需求

    这是用数据分析解决问题非常重要的一步。因为如果没有理解业务背景、前提和需求就进行分析,就很难得到满足客户要求的解决方案。

    我首先要理解小丽的需求和方案的截至日期,明白这4个指标的含义和计算方法。一般来说对于新的概念我会在网络搜索相关信息再与客户确认,从而确保对问题的理解和前提是和客户一致的。我通过网络查询和小丽的讨论我整理了指标的计算:

    • 月均消费次数 = 总消费次数/月份数 (一个社保卡号代表一个人,同一天内的同一个卡号的所有消费算一次消费)
    • 月均消费金额 = 总消费金额/月份数
    • 客单价 = 总消费金额/总消费次数
    • 消费趋势 可视化图标展现1.每月消费次数变化 2.每月消费金额变化 3.每月客单价变化

    其次我会确定需要的数据。根据问题的不同,可能需要从数据库,网络,或者文件(CSV, EXCEL, TXT)获取数据。这个需求中小丽提供给我的Excel销售记录就够用了。

    最后要和客户确认问题的解决方案是什么,是一个模型、一份商业分析报告、还是可视化报表。这里小丽要求是PDF的指标和可视化报告,所以我决定使用Python和Jupyter Notebook分析数据,设计指标和制作可视化图形。这样下次有相似的需求只要输入数据改动一些参数就可以另存为PDF文档。

    2. 导入、理解数据

    接下来就是导入数据,理解数据的基本属性,比如数据的类型、数据的大小、是否有缺失值、是否需要转换数据等。

    # 导入数据包,一般习惯在分析开头导入所有数据包。
    from datetime import datetime
    import pandas as pd
    from pylab import mpl
    import matplotlib.pylab as plt # 数据可视化
    plt.style.use('ggplot') # 设置风格使图标更美观
    mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体雅黑,使图标可以显示中文
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    
    # 关闭warnings
    import warnings
    warnings.filterwarnings('ignore')
    # 数据导入
    # Excel文件路经
    f_path = r'/mnt/data-ubuntu/Projects/data_science_chinese/input/朝阳医院2018年销售数据.xlsx'
    df = pd.read_excel(f_path)
    # 打印查看数据前5行
    df.head() 

    968cabe6cb44ee7b676e9e895baeae8c.png
    df前五行
    # 查看数据类型
    df.dtypes
    购药时间 object
    社保卡号 float64
    商品编码 float64
    商品名称 object
    销售数量 float64
    应收金额 float64
    实收金额 float64
    dtype: object
    #数据大小
    df.shape
    (6578, 7)
    # 检查缺失值
    df.isnull().sum()
    购药时间 2
    社保卡号 2
    商品编码 1
    商品名称 1
    销售数量 1
    应收金额 1
    实收金额 1
    dtype: int64
    # 检查数据统计
    df.describe()
    

    983e75244f998e7b5bae0e741dce3da8.png
    数据统计结果

    经过上面步骤我知道:

    • 购药时间不是日期格式,我们需要转换时间格式。
    • 社保卡号和商品编码应该转换为字符格式,因为它们只是一串编号。
    • 数据存在少量缺失值需要处理。
    • 销售数量、应收金额和实收金额存在不合理的负值需要查看。
    • 应收金额和实收金额出现较大值(可能为异常值)需要进一步查看。

    3. 数据清洗

    数据清洗的目的是使得数据更整洁,方便后续建模和可视化。一般数据清洗的步骤分为1.选择子集。2.列名重命名。3.缺失值处理。4.数据类型转换。5.异常值处理。6.数据排序。

    根据问题的需求和对数据的理解,我确定了以下数据清洗步骤。

    3.1 缺失值处理

    要处理缺失值的原因是,缺失值会使计算、可视化、或有些模型的应用发生错误。 处理缺失值有多种方法:一般常用方法有1.删除行或列。2.补全缺失值。其中补全缺失值需要对数据和业务背景有一定了解。这里不再展开,有兴趣的同学可以看下这篇文章。

    # 简单看下缺失值
    df[df.isna().any(axis=1)]
    

    78aa63befa9c7667c5a07cdc624489bd.png
    缺失值结果
    # 删除所有缺失值的行
    print(f'删除缺失值前:{df.shape}')
    df.dropna(inplace = True)
    print(f'删除缺失值后:{df.shape}')
    删除缺失值前:(6578, 7)
    删除缺失值后:(6575, 7)

    这样我们就删除了包含缺失值的3行数据。

    3.2 数据类型转换

    正确的数据类型才能使得后面数据分析正常进行,我们需要根据问题的背景去决定数据类型。这里根据经验社保卡号和商品编码是字符串类型,而不是数字。

    # 购药时间转换成日期格式
    df['购药时间'] = df['购药时间'] 
                    .map(lambda x: x.split(' ')[0])
    # errors='coerce'值如果有不合理日期格式'%Y-%m-%d'则返回NaT。
    df['购药时间'] = pd.to_datetime(df.loc[:,'购药时间'],
                                   errors='coerce',
                                   format = '%Y-%m-%d')
    # 社保卡号和商品编码转换成字符格式
    df['社保卡号'] = df['社保卡号'].astype('int').astype('str')
    df['商品编码'] = df['商品编码'].astype('int').astype('str')
    
    # 删除日期错误的行
    print(f'删除错误日期前:{df.shape}')
    df.dropna(inplace = True)
    print(f'删除错误日期后:{df.shape}')
    df.dtypes
    删除错误日期前:(6575, 7)
    删除错误日期后:(6552, 7)
    购药时间 datetime64[ns]
    社保卡号 object
    商品编码 object
    商品名称 object
    销售数量 float64
    应收金额 float64
    实收金额 float64
    dtype: object

    3.3 异常值处理

    异常值的出现可能会导致我们分析中计算或者模型的不准确。异常值一般是指极大值、极小值或者其他不符合问题背景的值,然后通过对问题和数据的再理解,搜集背景知识,或和客户讨论是否要进行相应的数据处理。

    # 查看极值
    df[(df['应收金额']>2000)|(df['销售数量']<0)]

    61807082150e484d013b630f77f8dd6b.png
    部分极值截图

    经过与小丽的确认后呢,我知道负数代表退货,我不需要计算进去。此外有2笔销售金额较大的是正常数据,因为购买数量大并且药价相对高。

    在实际工作中也会碰到相似的问题,有时候需要一定的背景知识才能决定如何处理。

    # 删除销量为负数的行
    print(f'删除销量为负前:{df.shape}')
    df = df[df['销售数量']>0]
    print(f'删除销量为负后:{df.shape}')
    删除销量为负前:(6552, 7)
    删除销量为负后:(6509, 7)

    3.4 数据排序

    因为我处理的数据是销售数据有销售时间,按照时间排序有助于建模和数据可视化。

    # 数据按照购药时间
    df = df.sort_values(by = '购药时间')
    # 重写整理index
    df.reset_index(drop = True, inplace = True)
    df.head()
    

    d437d2ef9ce04ed97a7300a724c6f05d.png
    排序后数据表

    4. 模型构建

    根据我们的目的,这里模型构建是指计算客户要求的指标。通过之前和小丽的讨论已经理整理好了指标的计算:

    • 月均消费次数 = 总消费次数/月份数 (一个社保卡号代表一个人,同一天内的同一个卡号的所有消费算一次消费)
    • 月均消费金额 = 总消费金额/月份数
    • 客单价 = 总消费金额/总消费次数
    • 消费趋势 可视化图标展现1.每月消费次数变化 2.每月消费金额变化 3.每月客单价变化

    首先要确定总月份数,如果不是完整的月份数据,我们再计算月均值的时候需要额外考虑。

    # 生成年列和月列方便后期计算
    df['购药时间_年'] = df['购药时间'].dt.year
    df['购药时间_月'] = df['购药时间'].dt.month
    # 检查每个月天数
    df 
        .groupby([df['购药时间_年'],df['购药时间_月']]) 
        .nunique() 
        .loc[:,'购药时间']
    购药时间_年 购药时间_月
    2018 1 31
    2 28
    3 31
    4 30
    5 31
    6 30
    7 19
    Name: 购药时间, dtype: int64

    我发现7月只有19天的数据,于是与小丽确认后我只要计算完整月份的数据,所以我就删除了7月的数据。

    # 删除7月数据
    df = df[df['购药时间_月'] != 7]
    # 总月份数,以年月合并数据。表格的index数量就是月份数
    num_month = df 
                .groupby([df['购药时间_年'],df['购药时间_月']]) 
                .count() 
                .index 
                .size
    print(f'数据一共包含{num_month}个月份。')

    下一步我需要生成一个指标的数据表格df_kpi,方便数据处理和计算。

    # 月消费次数表并合并到总表
    df_kpi = df 
                .groupby([df['购药时间_年'],df['购药时间_月']]) 
                .nunique() 
                .reset_index() 
                .loc[:, ['购药时间_年', '购药时间_月', '社保卡号']]
    df_kpi.columns = ['购药时间_年', '购药时间_月', '当月消费次数']
    # 当月消费金额表并合并到总表
    df_temp = df 
                .groupby([df['购药时间_年'],df['购药时间_月']]) 
                .sum() 
                .reset_index() 
                .loc[:, ['购药时间_年', '购药时间_月', '实收金额']]
    df_temp.columns = ['购药时间_年', '购药时间_月', '当月消费金额']
    df_kpi = df_kpi.merge(df_temp, how = 'inner', on =['购药时间_年', '购药时间_月'])
    # 当月客单价
    df_kpi['当月客单价'] = (df_kpi['当月消费金额']/df_kpi['当月消费次数']).round(2)
    df_kpi
    

    dd1360d3e1ee57eced7d39dc3652631e.png
    kpi数据表
    # 计算指标
    kpi_avg_visit = df_kpi['当月消费次数'].sum()/num_month
    kpi_avg_sales = df_kpi['当月消费金额'].sum()/num_month
    print(f'月均消费次数为:{kpi_avg_visit:.2f}')
    print(f'月均消费金额:{kpi_avg_sales:.2f}')
    print(f'客单价:{kpi_avg_sales/kpi_avg_visit:.2f}')
    月均消费次数为:654.50
    月均消费金额:45652.46
    客单价:69.75

    5. 数据可视化

    俗话说“一图胜千言”(我也不知道哪里来的俗话。。。),用图表来展示数据可以更简洁地表达内容,还可以展示出一些隐藏信息。

    # 月消费次数趋势图
    df_kpi.set_index(['购药时间_年', '购药时间_月'])['当月消费次数'] 
        .plot(kind = 'bar',
              figsize = (10,6),
              title = '月消费次数趋势图',
              color = 'steelblue')
    plt.show()

    2df9a46cd7c17306573f058f4997300c.png
    # 月消费金额趋势图
    df_kpi.set_index(['购药时间_年', '购药时间_月'])['当月消费金额'] 
        .plot(kind = 'bar',
              figsize = (10,6),
              title = '月消费金额趋势图',
              color = 'darkseagreen')
    plt.show()

    5c35cd638e216a2d0dcfcba550989472.png
    # 月消费次数趋势图
    df_kpi.set_index(['购药时间_年', '购药时间_月'])['当月客单价'] 
        .plot(kind = 'bar',
              figsize = (10,6),
              title = '月客单价趋势图',
              color = 'coral')
    plt.show()

    a040ca2b3ad415866e023ba63f59575e.png

    从月趋势图我们看到:

    • 月消费次数和月消费金额在2月比较低,也许是因为春节放假和2月天数少的影响。
    • 客单价在3,4月相对较低,而其他月份比较平稳。

    以上就是用Python进行数据分析的简单步骤,需要对应Jupyter notebook的同学请点这里。感激你的阅读!

    展开全文
  • 现在我们有一组从2006年到2016年1000部最流行的电影数据数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data在data文件夹存放有IMDB-Movie-Data.csv文件,路径:path = '../data/IMDB-Movie-Data.csv'...

    436f66aa047026495370b5f109c7929d.png

    现在我们有一组从2006年到2016年1000部最流行的电影数据,

    数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data

    c8f2bddf037b33ee5743b45a6231a11e.png

    在data文件夹存放有IMDB-Movie-Data.csv文件,路径:path = '../data/IMDB-Movie-Data.csv'

    • 问题:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?

    • #导入必要的库
    • import pandas as pd
    • #定位文件具体路径
    • path = 'IMDB-Movie-Data.csv'
    • df = pd.read_csv(path)
    • df

    dc5e012498fe3e13094c1e360a617213.png
    • #查看文件前4条数据 df.head(4)
    • #查看文件后4条数据 df.tail(4)
    • display(df.shape,df.head(4),df.tail(4))

    58828a8429676c6274e8e1333981b533.png
    • #将Year设置为行索引
    • df1 = df.index = df['Year']
    • df1

    ec6376c9432e6d243172e55d132cde67.png
    • #删除'Metascore'列
    • df2 = df.drop('Metascore',axis=1)
    • df2

    80e87df2275d4dcc676916bbc550e38c.png
    • #所有列的平均值
    • df.mean()
    • #取评分的平均值
    • df3 = df.mean()['Rating']
    • print('这些电影数据中评分的平均分是:%.1f分'%df3)
    • # 使用drop_duplicates()方法去重
    • df4 = df.drop_duplicates('Director',inplace=False)
    • #计算导演人数
    • print(len(df4))

    cd5306f818c3614d017d6f768f7a8814.png

    或者如下:

    9a0f68d469fc360e581bca2cfdc50a77.png
    展开全文
  • 读取数据 二,x=live占比dead占比 matplotlib圆饼图 三,x=性别, y=live占比 seaborn柱状图 四,x=客舱等级, y=live占比 seaborn柱状图 五,x=各客舱等级(性别), y=live占比 seaborn柱状图 六,x=年龄 ...

    a61e61bd2d98c82abe0fda092a31e0c5.png

    matplotlib圆饼图、直方图、箱型图、柱状图, seaborn柱状图、小提琴图,常用函数:

    cad_draw1 = train_data['Survived'].value_counts()
    plt.axis('equal')
    plt.pie(cad_draw1,
           explode = [0.1,0],
           labels = ['死亡','生存'],
           colors=['r', 'g'],
           autopct='%.2f%%',
           pctdistance=0.6,
           labeldistance = 1.1,
           shadow = True,
           startangle=0,
           radius=1.5,
           frame=False)
    n = 1
    plt.savefig('存活圆饼图_%d.png' % n, dpi=200)
    一,导入模块.读取数据
    二,x=live占比dead占比 matplotlib圆饼图
    三,x=性别, y=live占比 seaborn柱状图
    四,x=客舱等级, y=live占比 seaborn柱状图
    五,x=各客舱等级(性别), y=live占比 seaborn柱状图
    六,x=年龄 matplotlib直方图,箱型图
    七,x=年龄 y=live占比 seaborn柱状图
    八,x=船样等级(dead或live), y=年龄 seaborn小提琴图
    x=性别 (dead或live), y=年龄 seaborn小提琴图
    九,x=有同乘的兄弟姐妹、配偶live占比dead占比 matplotlib圆饼图
    x=无同乘的兄弟姐妹、配偶live占比dead占比 matplotlib圆饼图
    x=有同乘的父母/小孩 live占比dead占比 matplotlib圆饼图
    x=无同乘的父母/小孩live占比dead占比 matplotlib圆饼图
    十,x=同乘的兄弟姐妹/配偶数, y=live占比 matplotlib柱状图
    x=同乘的父母/小孩数, y=live占比 matplotlib柱状图
    x=同乘的兄弟姐妹/配偶/父母/小孩数,y=live占比 matplotlib柱状图
    十一, x=票价 matplotlib直方图,箱型图
    x=dead/live , y=平均票价 matplotlib 柱状图
    十二, 利用KNN分类模型,对结果进行预测

    一,导入模块.读取数据

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import os
    import time
    # 导入时间模块
    
    
    import warnings
    warnings.filterwarnings('ignore') 
    # 不发出警告
    
    import matplotlib as mpl
    mpl.rcParams['font.sans-serif'] = ['KaiTi']
    mpl.rcParams['font.serif'] = ['KaiTi']
    mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题,或者转换负号为字符串,中文不显
    
    
    
    
    # 读取数据
    
    os.chdir('C:/Users/Administrator/Desktop/train_S1111111111111/')
    train_data = pd.read_csv('train.csv')
    test_data = pd.read_csv('test.csv')

    ca346ab63e725a614bef979935eadfd8.png

    二,x=live占比dead占比 matplotlib圆饼图

    sns.set()
    sns.set_style("ticks")
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
    plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
    sns.set(font='SimHei') # 解决Seaborn中文显示问题
    
    cad_draw1 = train_data['Survived'].value_counts()
    plt.axis('equal')
    plt.pie(cad_draw1,
           explode = [0.1,0],
           labels = ['死亡','生存'],
           colors=['r', 'g'],
           autopct='%.2f%%',
           pctdistance=0.6,
           labeldistance = 1.1,
           shadow = True,
           startangle=0,
           radius=1.5,
           frame=False)
    n = 1
    plt.savefig('存活圆饼图_%d.png' % n, dpi=200)

    940e108d12d0f8a45d7c7d197dd6df7e.png

    存活比例为38.38%

    三,x=性别,y=live占比 Seaborn柱状图

    # 男性和女性存活情况
    cad_draw2 = train_data[['Sex','Survived']].groupby(['Sex']).mean().reset_index()
    sns.barplot(x="Sex", y="Survived", 
    #            hue="class", 
                data=cad_draw2,
    #            palette = 'hls', 
                palette = ['r','g'], 
                order = ['male','female'],  # 筛选类别
                capsize = 0.05,  # 误差线横向延伸宽度
                saturation=1,   # 颜色饱和度
                errcolor = 'gray',errwidth = 2,  # 误差线颜色,宽度
                ci = 'sd'    # 置信区间误差 → 0-100内值、'sd'、None
                )
    
    
    survive_sex = train_data.groupby(['Sex','Survived'])['Survived'].count()
    print(survive_sex)
    # 女性生存率较高
    print('女性存活率为%.2f%%,男性存活率为%.2f%%' % 
         (survive_sex.loc['female',1]/survive_sex.loc['female'].sum()*100, 
          survive_sex.loc['male',1]/survive_sex.loc['male'].sum()*100))

    1d2bcf03a3c8654c3df9b8754c90a53e.png

    ae46fcfff5ccf812ae3e62eade6e3aec.png

    女性存活率为74.20%,男性存活率为18.89%

    四,x=客舱等级,y=live占比 matplotlib柱状图

    cad_draw3 = train_data[['Pclass','Survived']].groupby(['Pclass']).mean().reset_index()
    sns.barplot(x="Pclass", y="Survived", 
    #            hue="class", 
                data=cad_draw3,
                palette = 'hls', 
    #            palette = ['r','g'], 
    #            order = ['male','female'],  # 筛选类别
                capsize = 0.05,  # 误差线横向延伸宽度
                saturation=1,   # 颜色饱和度
                errcolor = 'gray',errwidth = 2,  # 误差线颜色,宽度
                ci = 'sd'    # 置信区间误差 → 0-100内值、'sd'、None
                )
    
    
    survive_Pclass = train_data.groupby(['Pclass','Survived'])['Survived'].count()
    print(survive_Pclass)
    # 一等客舱生存率较高
    
    print('一等客舱存活率为%.2f%%,二等存活率为%.2f%%,三等存活率为%.2f%%' % 
         (survive_Pclass.loc[1,1]/survive_Pclass.loc[1].sum()*100, 
          survive_Pclass.loc[2,1]/survive_Pclass.loc[2].sum()*100,
          survive_Pclass.loc[3,1]/survive_Pclass.loc[3].sum()*100))

    f952ca7f57262e1d1233987614a85895.png

    3577d0c7a3ec090d6419695727cd2008.png

    一等客舱存活率为62.96%,二等存活率为47.28%,三等存活率为24.24%

    五,x=客舱等级,y=live占比 matplotlib柱状图

    cad_draw5 = train_data.groupby(['Sex','Pclass']).mean()['Survived'].reset_index()
    sns.barplot(x="Pclass", y="Survived", 
                hue="Sex", 
                data=cad_draw4,
    #            palette = 'hls', 
                palette = ['g','r'], 
    #            order = ['male','female'],  # 筛选类别
    #            capsize = 0.05,  # 误差线横向延伸宽度
                saturation=1,   # 颜色饱和度
    #            errcolor = 'gray',errwidth = 2,  # 误差线颜色,宽度
    #            ci = 'sd'    # 置信区间误差 → 0-100内值、'sd'、None
                )

    74677224aaacfa464cf1f78fc15b1fa9.png

    六,x=年龄 matplotlib直方图,箱型图

    #age字段去空值
    train_data_age = train_data[train_data['Age'].notnull()]
    #年龄直方图
    plt.figure(figsize=(12,5))
    plt.subplot(121)
    train_data_age['Age'].hist(bins=70)
    plt.xlabel('Age')
    plt.ylabel('Num')
    
    #年龄箱型图
    plt.subplot(122)
    train_data.boxplot(column='Age',showfliers=False)
    
    
    train_data_age['Age'].describe()

    bb5159f9e2605d45e4e0bebbde2cd5d3.png

    108f2607293add053ba46d499326a3fb.png

    总体年龄分布: 去掉缺失值后样本有714,平均年龄约为30岁,标准差14岁,最小年龄0.42,最大年龄80

    七,x=年龄,y=live占比 seaborn柱状图

    train_data_age['Age_int'] = train_data_age['Age'].astype(int)
    average_age = train_data_age[["Age_int", "Survived"]].groupby(['Age_int'],as_index=False).mean()
    
    plt.figure(figsize=(18,4))
    sns.barplot(x="Age_int", y="Survived", 
    #            hue="class", 
                data=average_age,
                palette = 'hls', 
    #            palette = ['r','g'], 
    #            order = ['male','female'],  # 筛选类别
                capsize = 0.05,  # 误差线横向延伸宽度
                saturation=1,   # 颜色饱和度
    #            errcolor = 'gray',errwidth = 2,  # 误差线颜色,宽度
    #            ci = 'sd'    # 置信区间误差 → 0-100内值、'sd'、None
                )

    349e3300f0cb543960400559742189a4.png

    灾难中,老人和小孩存活率较高

    八,x=船样等级(dead或live),y=年龄 seaborn小提琴图

    x=性别 (dead或live),y=年龄 seaborn小提琴图

    fig,ax = plt.subplots(1,2, figsize = (18,8))
    
    sns.violinplot("Pclass","Age",hue="Survived",data=train_data_age,split=True,ax=ax[0])
    ax[0].set_title('Pclass and Age vs Survived')
    ax[0].set_yticks(range(0,110,10))
    
    sns.violinplot("Sex","Age",hue="Survived",data=train_data_age,split=True,ax=ax[1])
    ax[1].set_title('Sex and Age vs Survived')
    ax[1].set_yticks(range(0,110,10))

    f482c2c85eb0a4a6e6ec9a9c6a87580a.png

    按照不同船舱等级划分 → 船舱等级越高,存活者年龄越大,船舱等级1存活年龄集中在20-40岁,船舱等级2/3中有较多低龄乘客存活

    e73c85356397ec33b34f06a35068504e.png

    按照性别划分 → 男性女性存活者年龄主要分布在20-40岁,且均有较多低龄乘客,其中女性存活更多

    九,x=有同乘的兄弟姐妹、配偶live占比dead占比 matplotlib圆饼图

    x=无同乘的兄弟姐妹、配偶live占比dead占比 matplotlib圆饼图

    x=有同乘的父母/小孩 live占比dead占比 matplotlib圆饼图

    x=无同乘的父母/小孩live占比dead占比 matplotlib圆饼图

    sibsp_df = train_data[train_data['SibSp'] != 0]
    no_sibsp_df = train_data[train_data['SibSp'] == 0]
    # 筛选出有无兄弟姐妹数据
    
    parch_df = train_data[train_data['Parch'] != 0]  
    no_parch_df = train_data[train_data['Parch'] == 0]
    # 筛选出有无父母子女数据
    
    plt.figure(figsize=(12,3))
    plt.subplot(141)
    plt.axis('equal')
    sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct= '%1.1f%%',colormap = 'Blues')
    plt.xlabel('sibsp')
     
    plt.subplot(142)
    plt.axis('equal')
    no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct= '%1.1f%%',colormap = 'Blues')
    plt.xlabel('no_sibsp')
    
    plt.subplot(143)  
    plt.axis('equal')
    parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct= '%1.1f%%',colormap = 'Reds')  
    plt.xlabel('parch')  
     
    plt.subplot(144)  
    plt.axis('equal')
    no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived', 'Survived'], autopct = '%1.1f%%',colormap = 'Reds')  
    plt.xlabel('no_parch')
    

    a5fafb9b465079b5428c5686fc6bcb76.png

    有兄弟姐妹、父母子女的乘客存活率更大

    十,x=同乘的兄弟姐妹/配偶数, y=live占比 matplotlib柱状图

    x=同乘的父母/小孩数, y=live占比 matplotlib柱状图

    x=同乘的兄弟姐妹/配偶/父母/小孩数,y=live占比 matplotlib柱状图

    fig, ax=plt.subplots(1,2,figsize=(15,4))
    train_data[['Parch','Survived']].groupby(['Parch']).mean().plot.bar(ax=ax[0])
    ax[0].set_title('Parch and Survived')
    train_data[['SibSp','Survived']].groupby(['SibSp']).mean().plot.bar(ax=ax[1])
    ax[1].set_title('SibSp and Survived')
    # 查看兄弟姐妹个数与存活率
    
    train_data['Family_Size'] = train_data['Parch'] + train_data['SibSp']+1
    train_data[['Family_Size','Survived']].groupby(['Family_Size']).mean().plot.bar(figsize = (15,4))
    # 查看父母子女个数与存活率
    
    print('若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低')

    0bdd6fae2923c4b956cf2b3932019a0f.png

    若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低

    十一,x=票价 matplotlib 直方图,matplotlib箱型图

    x=dead/live ,y=平均票价 matplotlib柱状图

    # 票价分布和存活与否的关系
    
    fig, ax=plt.subplots(1,2,figsize=(15,4))
    train_data['Fare'].hist(bins=70, ax = ax[0])
    train_data.boxplot(column='Fare', by='Pclass', showfliers=False,ax = ax[1])
    # 查看票价分布情况
    
    fare_not_survived = train_data['Fare'][train_data['Survived'] == 0]
    fare_survived = train_data['Fare'][train_data['Survived'] == 1]
    # 基于票价,筛选出生存与否的数据
    average_fare = pd.DataFrame([fare_not_survived.mean(),fare_survived.mean()])
    std_fare = pd.DataFrame([fare_not_survived.std(),fare_survived.std()])
    average_fare.plot(yerr=std_fare,kind='bar',legend=False,figsize = (15,4),grid = True)
    # 查看票价与是否生还的关系
    
    print('生还者的平均票价要大于未生还者的平均票价')

    9c4173263cc9873bb994996088bfe876.png

    十二,利用KNN分类模型,对结果进行预测

    '''
    5、利用KNN分类模型,对结果进行预测
    要求:
    ① 模型训练字段:'Survived','Pclass','Sex','Age','Fare','Family_Size'
    ② 模型预测test.csv样本数据的生还率
    提示:
    ①	 训练数据集中,性别改为数字表示 → 1代表男性,0代表女性
    
    '''
    
    # 数据清洗,提取训练字段
    
    knn_train = train_data[['Survived','Pclass','Sex','Age','Fare','Family_Size']].dropna()
    knn_train['Sex'][knn_train['Sex'] == 'male'] = 1 
    knn_train['Sex'][knn_train['Sex'] == 'female'] = 0
    
    test_data['Family_Size'] = test_data['Parch'] + test_data['SibSp']+1
    knn_test = test_data[['Pclass','Sex','Age','Fare','Family_Size']].dropna()
    knn_test['Sex'][knn_test['Sex'] == 'male'] = 1 
    knn_test['Sex'][knn_test['Sex'] == 'female'] = 0
    
    print('清洗后训练集样本数据量为%i个' % len(knn_train))
    knn_train.head()
    print('清洗后测试集样本数据量为%i个' % len(knn_test))
    knn_test.head()
     
    
    
    # 模型预测test.csv样本数据的生还率
    
    from sklearn import neighbors  
    # 导入KNN分类模块
    
    knn = neighbors.KNeighborsClassifier() 
    knn.fit(knn_train[['Pclass','Sex','Age','Fare','Family_Size']], knn_train['Survived'])
    # 构建模型
    
    knn_test['predict'] = knn.predict(knn_test)
    pre_survived = knn_test[knn_test['predict'] == 1].reset_index()
    del pre_survived['index']
    # 预测存货情况
    
    print('finished!')
    
    pre_survived
    展开全文
  • 商铺数据加载及存储在data文件夹存放有商铺数据.csv文件,路径:path = '../data/商铺数据.csv'要求: 1、成功读取“商铺数据.csv”文件,并展示打印出来 2、打印前10条数据,了解数据的基本信息 3.获取商户的星级...
  • 结合python辅助做空间指标评价,得到餐饮选址位置 * 课程这里以“素菜馆为例” 课程数据 ① net_population.shp → 投影坐标系,上海1km²格网内的人口密度数据 ② road.shp → 投影坐标西,上海道路数据 要求: ① ...
  • Python数据分析实战(高清版)PDF百度网盘链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg提取码:ux8t复制这段内容后打开百度网盘手机App,操作更方便哦内容简介 · · · · · ·Python 简单易学,拥有...
  • bokeh柱状图 、折线图、浮动散点图、散点图、堆叠图,matplotlib饼图,常用函数:data_S = ...print('数据时间周期为:n', data_S['date'].unique()) data_S['period'] = pd.cut(data_S['date'],[4,10,11,14],labels...
  • 本文实例讲述了Python数据分析pandas模块用法。分享给大家供大家参考,具体如下:pandaspandas10分钟入门,可以查看官网:10 minutes to pandas也可以查看更复杂的cookbookpandas是非常强大的数据分析包,pandas 是...
  • 原标题:零基础学习python数据分析——类和实例零基础学习之python数据分析小课堂又来啦!科多大数据带你来学习数据分析。面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如...
  • serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False%matplotlib inline数据...
  • 作为数据分析师,除了熟练各种分析工具外,更重要的是分析、解决问题的能力以及扎实的数学功底,尤其是统计学。本文将用一个例子,一步一步展示1)分析问题的步骤,2)更具需求选择合适工具和数据获取,3)和统计学知识...
  • serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False%matplotlib inline数据...
  • 系列文章总目录:Python数据分析及可视化实例目录本节及下一节Scipy是数据分析绕不过去的基础,虽说Pandas大体上可以完成绝大多数清洗工作,但还是有必要做个简单的介绍:学习源码:# coding: utf-8 # # Numpy基本...
  • 系列文章总目录:Python数据分析及可视化实例目录强大到没有朋友的科学计算库,不知道怎么介绍ta!大牛张若愚出了厚本的《Python 科学计算》第二版《python科学计算第二版》完整版-CSDN下载里面包罗万象,就不做搬运...
  • serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False%matplotlib inline数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,616
精华内容 1,446
关键字:

python数据分析实例

python 订阅