1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        手摸手教你數據可視化?。ǜ綄嵗v解)

        共 6992字,需瀏覽 14分鐘

         ·

        2020-08-31 01:25

        ↑↑↑關注后"星標"Datawhale
        每日干貨?&?每月組隊學習,不錯過
        Datawhale干貨
        作者:CrescentAI,華南理工大學,Datawhale優(yōu)秀學習者


        前言

        本文對課程數據集及泰坦尼克號數據集進行了實例講解,一步一步帶你繪制數據可視化中常用的五種圖形,并對數據間可能存在的相關性做出了闡述。

        繪制常用圖形

        常用圖形有:

        • plt.scatter() 散點圖
        • plt.plot() ? ?折線圖
        • plt.bar() 直方圖
        • plt.pie() 餅圖
        • plt.boxplot() 箱型圖
        ?本次實例數據集可在后臺回復【學生成績】來獲取。
        #導入相應的包
        import numpy as np
        import pandas as pd
        import matplotlib.pyplot as plt
        %matplotlib inline

        #圖可以顯示中文和負號
        plt.rcParams['font.sans-serif']='SimHei'
        plt.rcParams['axes.unicode_minus']=False
        data = pd.read_excel("D:\data\student-score\student-score.xlsx")
        data.head()
        data = data.drop(columns = ["序號","品德","科學"],axis = 1) #由于品德和科學的總分與其他學科不一致,為了圖片顯示效果,刪除這兩個學科成績
        data.loc[:,"總分"] = data.loc[:,"語文"] + data.loc[:,"數學"] + data.loc[:,"英語"]  #重新計算總分成績
        data.head()

        接著我們還可以查看其數據結構:

        data.shape  #查看數據結構

        # 輸出
        (629, 6)

        以及查看各學科的缺失值情況:

        data.isnull().sum()  #查看缺失值情況

        '''
        姓名 0
        學校 0
        語文 1
        數學 0
        英語 0
        總分 1
        dtype: int64
        '''

        對于這些缺失值,我們可以選擇使用dropna()函數刪除:

        data = data.dropna()  #刪除缺失值
        data.shape # (628, 6)

        再使用describe()函數進行簡單的統計描述:

        data.describe()  #簡單統計描述

        散點圖

        gp = data.groupby(by = "學校",as_index=False)  #以學校為分組依據進行分組
        data1=gp.mean() #分組后的聚合運算為計算均值
        data1.head()

        得到結果:

        # 繪制各學科成績散點圖
        plt.figure(figsize=(6,4))
        plt.scatter(data1["總分"],data1["語文"],marker='v')
        plt.scatter(data1["總分"],data1["數學"],marker='o')
        plt.scatter(data1["總分"],data1["英語"],marker='*')
        plt.title("各學校成績散點圖",fontsize = 14)
        plt.xlabel("總成績")
        plt.ylabel("各學科成績")
        plt.legend(["語文","數學","英語"]);
        # 繪制各學科成績散點圖
        plt.figure(figsize=(6,4))
        plt.scatter(data1["總分"],data1["語文"],marker='v')
        plt.title("各學校語文與總分成績散點圖",fontsize = 14)
        plt.xlabel("總成績")
        plt.ylabel("各學科成績")
        plt.legend(["語文"])

        #
        # 繪制各學科成績散點圖
        data1.plot.scatter(x = "總分", y = "語文")
        plt.title("語文與總分成績散點圖")
        data1.plot.scatter(x = "總分", y = "數學")
        plt.title("數學與總分成績散點圖")
        data1.plot.scatter(x = "總分", y = "英語")
        plt.title("英語與總分成績散點圖")
        # plt.show()

        得到Text(0.5, 1.0, '英語與總分成績散點圖'),且散點圖結果如下:

        折線圖

        data1.head()
        data1["序號"]=data1.學校.str.extract('(\d+)')
        data1
        ser1 = data1.序號
        ser1

        得到輸出:

        0     10
        1 11
        2 12
        3 13
        4 14
        5 15
        6 16
        7 17
        8 18
        9 19
        10 1
        11 20
        12 21
        13 2
        14 3
        15 4
        16 5
        17 6
        18 7
        19 8
        20 9
        Name: 序號, dtype: object

        接著:

        ser1 = ser1.astype("int")
        ser1

        得到輸出:

        0     10
        1 11
        2 12
        3 13
        4 14
        5 15
        6 16
        7 17
        8 18
        9 19
        10 1
        11 20
        12 21
        13 2
        14 3
        15 4
        16 5
        17 6
        18 7
        19 8
        20 9
        Name: 序號, dtype: int32

        可以嘗試刪除序號列,并且重設索引列:

        del data1["序號"]
        data1.index = ser1
        data1

        再按照索引排序,可得到相應結果:

        data1=data1.sort_index()
        data1

        接著查看一共有多少行數據作為x軸數據

        len(data1) # 21

        再將各科成績數據進行繪圖,得到折線圖結果:

        plt.figure(figsize=(10,4))
        plt.plot(range(21),data1.iloc[:,1],'-*') #選取語文成績數據
        plt.plot(range(21),data1.iloc[:,2],'-o') #選取數學成績數據
        plt.plot(range(21),data1.iloc[:,3],'-v') #選取英語成績數據
        plt.title('各學科成績變化走勢圖')
        plt.xlabel('各學校')
        plt.ylabel('學科成績')
        plt.xticks(range(21),data1["學校"],rotation=30) #rotation=30控制文字傾斜角度
        plt.legend(['語文','數學','英語']);

        直方圖

        yw = data1.loc[:,"學校":"語文"]  #提取數據繪制直方圖,直方圖原理,每個需要被畫圖的標簽對應一個數值
        yw = yw.T
        yw
        yw.columns = yw.iloc[0]  #將學校字段轉換成列索引
        yw1 = yw.drop("學校",axis=0) #刪多余的行信息
        yw1

        再將語文成績數據進行繪圖,得到直方圖結果:

        # 每個學校語文平均成績的直方圖
        plt.figure(figsize=(12,4))
        plt.bar(range(21),yw.loc["語文",:],width=0.5)
        plt.title("語文成績直方圖",fontsize = 14)
        plt.ylabel("語文成績",fontsize = 14)
        plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x軸刻度為各學校名稱
        sx = data1.loc[:,["學校","數學"]]
        sx = sx.T
        sx
        sx.columns = sx.iloc[0]
        sx = sx.drop("學校",axis=0)
        sx

        再將數學平均成績數據進行繪圖,得到直方圖結果:

        # 每個學校數學平均成績的直方圖
        plt.figure(figsize=(12,4))
        plt.bar(range(21),sx.loc["數學",:],width=0.5)
        plt.title("數學成績直方圖",fontsize = 14)
        plt.ylabel("數學成績",fontsize = 14)
        plt.xticks(range(21),yw.iloc[0],rotation=30,fontsize = 12); #x軸刻度為各學校名稱

        將多個學科成績畫到一副圖中

        data1
        data2 = data1.drop("總分",axis = 1)  #新建一個dataframe,刪掉總分列,因為總分和單科成績相差太多,影響繪圖效果
        data2.head()
        # 將多個學科成績畫到一張圖中  #截取前十
        data2.plot.bar(x = '學校',y = ['語文','數學','英語'],figsize=(16,6),width=0.7,rot = 30,title = "各學科成績直方圖"); #rot空值標簽傾斜程度

        餅圖

        data2.head()
        plt.figure(figsize=(4,4),dpi=80)
        plt.pie(data2.iloc[0,1:] #選取數據源
        ,labels=['語文','數學','英語']
        ,autopct='%1.2f') #設置百分比經度
        # ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區(qū)之間的間隙
        # ,colors=['r','g','b']) #設置餅圖各個扇區(qū)的顏色
        plt.title('第1小學各學科成績占比',fontsize=12);
        #fontsize設定字體的大小,xlabel,ylabel,title里面都可以設定
        pic2 = plt.figure(figsize=(8,8),dpi=80)

        fig1 = pic2.add_subplot(2,2,1) #第一個子圖
        plt.pie(data2.iloc[0,1:] #選取數據源 第10小學各學科成績
        ,labels=['語文','數學','英語']
        ,autopct='%1.2f') #設置百分比經度
        # ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區(qū)之間的間隙
        # ,colors=['r','g','b']) #設置餅圖各個扇區(qū)的顏色
        plt.title('第1小學各學科成績占比',fontsize=12)

        fig2 = pic2.add_subplot(2,2,2) #第二個字圖
        plt.pie(data2.iloc[1,1:] #選取數據源,第11小學各學科成績
        ,labels=['語文','數學','英語']
        ,autopct='%1.2f') #設置百分比經度
        # ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區(qū)之間的間隙
        # ,colors=['r','g','b']) #設置餅圖各個扇區(qū)的顏色
        plt.title('第2小學各學科成績占比',fontsize=12)

        fig3 = pic2.add_subplot(2,2,3) #第二個字圖
        plt.pie(data2.iloc[2,1:] #選取數據源,第12小學各學科成績
        ,labels=['語文','數學','英語']
        ,autopct='%1.2f') #設置百分比經度
        # ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區(qū)之間的間隙
        # ,colors=['r','g','b']) #設置餅圖各個扇區(qū)的顏色
        plt.title('第3小學各學科成績占比',fontsize=12)

        fig4 = pic2.add_subplot(2,2,4) #第二個字圖
        plt.pie(data2.iloc[3,1:] #選取數據源,第13小學各學科成績
        ,labels=['語文','數學','英語']
        ,autopct='%1.2f') #設置百分比經度
        # ,explode=[0.1,0.02,0.02] #設置餅圖各個扇區(qū)之間的間隙
        # ,colors=['r','g','b']) #設置餅圖各個扇區(qū)的顏色
        plt.title('第4小學各學科成績占比',fontsize=12);

        箱型圖

        data.head()
        data_1 = data.loc[data['學校'] =="第1小學"]  #提取第一小學的所有信息
        score = (list(data_1.iloc[:,2]),list(data_1.iloc[:,3]),list(data_1.iloc[:,4]))

        plt.figure(figsize=(8,6))
        plt.boxplot(score
        ,labels=['語文','數學','英語']
        ,notch=True #缺口中位數位置
        ,sym='*'#設定異常值的形狀
        ,whis=1.5); #設定幾倍標準差之外的數據算是異常值,默認是1.5

        泰坦尼克號數據

        text = pd.read_csv(r'result.csv')
        text.head()

        男女中生存人數分布情況

        sex = text.groupby('Sex')['Survived'].sum()
        sex.plot.bar(color='chocolate')
        plt.title('survived_count')
        plt.show()

        女性比男性生存人數多。

        男女中生存人與死亡人數的比例

        text.groupby(['Sex','Survived'])['Survived'].count().unstack().plot(kind='bar',stacked='True')
        plt.title('survived_count')
        plt.ylabel('count')

        # Text(0, 0.5, 'count')

        男女性生存與死亡人數的占比偏差比較大。

        不同票價的人生存和死亡人數分布情況

        # 排序后繪折線圖
        fare_sur = text.groupby(['Fare'])['Survived'].value_counts().sort_values(ascending=False)
        fig = plt.figure(figsize=(20, 18))
        fare_sur.plot(grid=True)
        plt.legend()
        plt.show()

        不同的票價所反映出來的生存人數是非常明顯的,票價低的人死亡數量高是因為離甲板遠,且逃生機會大大降低。

        # 排序前繪折線圖
        fare_sur1 = text.groupby(['Fare'])['Survived'].value_counts()
        fig = plt.figure(figsize=(20, 18))
        fare_sur1.plot(grid=True)
        plt.legend()
        plt.show()

        不同倉位等級的人生存和死亡人員的分布情況

        # 1表示生存,0表示死亡
        pclass_sur = text.groupby(['Pclass'])['Survived'].value_counts()

        import seaborn as sns
        sns.countplot(x="Pclass", hue="Survived", data=text)

        #
        不同年齡的人生存與死亡人數分布情況
        facet = sns.FacetGrid(text, hue="Survived",aspect=3)
        facet.map(sns.kdeplot,'Age',shade= True)
        facet.set(xlim=(0, text['Age'].max()))
        facet.add_legend()

        #
        不同倉位等級的人年齡分布情況
        text.Age[text.Pclass == 1].plot(kind='kde')
        text.Age[text.Pclass == 2].plot(kind='kde')
        text.Age[text.Pclass == 3].plot(kind='kde')
        plt.xlabel("age")
        plt.legend((1,2,3),loc="best")

        #

        “整理不易,三連
        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            荒淫无耻未删减版电影 | 揉我胸啊嗯出水了h苏桃 | 炙热滚烫的液体喷进她体内 | 操黑丝骚逼 | 午夜久操| 有肏屄的视频吗 | 玩浓毛人妻18p | 午夜福利一二三区 | 欧美又大又粗又长 | 91看片淫黄大片在线天堂最新 |