[Python數據分析] 2-單因子探索分析與可視化

I.理論部分
 
1)概念相關:
集中趨勢:均值,中位數,衆數,分位數
離中趨勢:標準差,方差
數據分佈:偏度係數,峯度係數,正態分佈,三大分佈
抽樣理論:抽樣誤差(確定樣本量)、抽樣精度
 
2)數據分類
定類(類別):根據事物離散,無差別屬性進行的分類。性別,民族
定序(順序):可以界定數據的大小,但不能測定差值。低中高
定距(間隔):可以界定數據大小的同時測定差值,但無絕對零點(乘除比率等無意義)。溫度
定比(比率):可以界定數據大小,可以測定差值,有絕對零點(乘除比率有意義)。身高,體重
 
3)單屬性分析:
1.異常值分析
    連續異常值:[下分位數-K*(Q3-Q1),上分位數+K*(Q3-Q1)]
    離散異常值:空值
    知識異常值:不符合常理的值
2.對比分析
    比較什麼?
        絕對數比較,
        相對數比較,
        結構相對數:部分與總體
        比例相對數:總體內不同部分的數值進行比較
        比較相對數:同一時空下相似或者同質的數值進行的比較
        動態相對數:增速等
        強度相對數:性質不同但有相互聯繫屬性相互的聯合,平均
    怎麼比?
        時間維度:同比,環比
        空間維度:
        經驗與計劃:進度與排期的比較
3.結構分析
    靜態:分析總體的組成(總體的結構)
    動態:分析結構變化的趨勢
4.分佈分析
    直接獲得的概率分佈
    判斷是不是正態分佈
    極大似然(相似程度的衡量)
 
 
II.編碼實現
 
1)準備工作
pip install pandas  #cmd中利用pip安裝所需要的包pandas,numpy,scipy
ipmort pandas as pd  #IDE中調用所需的包,包括了pandas,scipy.stats
df = pd.read_csv(" 文件路徑")  #數據的選取
 
pandas庫顯示不完全的問題使用下列代碼:
pd.set_option('display.max_columns', None)  #顯示所有列
pd.set_option('display.max_rows', None)  #顯示所有行
pd.set_option('max_colwidth',100)  #設置value的顯示長度爲100,默認爲50
 
2)一些簡單操作
單series數據查看,目的是爲了尋找異常值,此處以HR表中department列爲例
d_s = df["department"]
d_s.sum()  #求和
d_s.mean()  #均值
d_s.median()  #中位數
d_s.quantile(q=0.25)  #四分位數
d_s.mode()  #衆數
d_s.std()  #標準差
d_s.var()  #方差
d_s.skew()  #偏度係數
d_s.kurt()  #峯度係數
d_s.value_counts()  #按照類型計數
d_s.value_counts(normalize = True).sort_index()  #按照類型計算百分比,並排序
d_s.where(d_s != "sale")  #顯示不爲sale的值,即sale值記爲空值
d_s.dropna()  #刪除空值
d_s.isnull()  # 列出是否有異常值
d_s[d_s.isnull()]  # 查看哪些是空置
df[df["department"].isnull()]   # 查看空值數據
 
3)對比分析
1.清除空值
df = df.dropna(axis=0,how='any')  #刪除空值axis=(0行,1列),how(any任一爲空,all所有爲空)
2.清除其他異常值
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]  #刪除其餘
3.對比部門之間的關係
df.groupby("department").mean()
4.切片
df.loc[:,["last_evaluation","department"]].groupby("department").mean()
5.自己定義函數對比
df.loc[:,["average_monthly_hours","department"]].groupby("department").apply(lambda x:x.max()-x.min())
 
 
III.初級可視化
1)柱狀圖:橫軸爲類,有意義的爲它的高度,此處以工資這一列不同工資水平的人數做柱狀圖
# 調用庫
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件讀取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改變樣式(背景色,字體,字號,顏色
sns.set_style(style="darkgrid")
sns.set_context(context="poster",font_scale=0.5)
# 如果要用色塊中的某個顏色,要改成數組形式再做標註:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 加標題
plt.title("SALARY")
# 橫座標
plt.xlabel("salary")
# 縱座標
plt.ylabel("number")
# 製圖(橫軸爲salary對應的數字,縱軸爲salary對應的數量),同時可以指定寬度
plt.bar(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts(),width=0.5)
# 橫軸標註(用salary對應數字的index覆蓋salary對應的數字)
plt.xticks(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts().index)
# 修改橫縱座標的顯示範圍,發現只顯示了一半,橫座標需要加0.5
plt.axis([0,4,0,10000])
# 用zip函數確定確定標註位置和標註的值
for x,y in zip(np.arange(len(df["salary"].value_counts()))+0.5,df["salary"].value_counts()):
    plt.text(x,y,y,ha="center",va="bottom")
# seaborn爲matplotib的封裝,所以後者的命令前者也可以用,下面爲seaborn的命令,hue向下鑽取
sns.countplot(x="salary",hue="department",data=df)
 
# 顯示圖表
plt.show()
 
 
 
2)直方圖,橫軸爲一個區間,有意義的是他的面積
# 調用庫
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件讀取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改變樣式(背景色,字體,字號,顏色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色塊中的某個顏色,要改成數組形式再做標註:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 製圖,***其他圖形也可以這樣設置在一頁上生成類似格式的圖***
f = plt.figure()
# 在一行三列第一個位置添加一個直方圖
f.add_subplot(1,3,1)
# 參數kde,hist分別對應曲線和直方,不需要改爲False即可
sns.distplot(df["satisfaction_level"],bins=10)
f.add_subplot(1,3,2)
sns.distplot(df["last_evaluation"],bins=10)
f.add_subplot(1,3,3)
sns.distplot(df["average_monthly_hours"],bins=10)
 
# 顯示圖表
plt.show()
 
 
 
3)箱線圖
# 調用庫
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件讀取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改變樣式(背景色,字體,字號,顏色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色塊中的某個顏色,要改成數組形式再做標註:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# x,y分別代表橫,豎,參數saturation確定方框的邊界,參數whis確定上分位數再向上的幾倍的分位數間距爲上界
sns.boxplot(x=df["time_spend_company"],saturation=0.75,whis=3)
 
# 顯示圖表
plt.show()
 
 
 
4)折線圖:事物變化趨勢
# 調用庫
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件讀取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 用seaborn改變樣式(背景色,字體,字號,顏色
sns.set_style(style="whitegrid")
sns.set_context(context="paper",font_scale=0.8)
# 如果要用色塊中的某個顏色,要改成數組形式再做標註:sns.set_palette([sns.color_palette("RdBu", n_colors=7)][5])
sns.set_palette(sns.color_palette("RdBu", n_colors=7))
 
# 繪製time_spend_company和left的折線圖
sub_df=df.groupby("time_spend_company").mean()
sns.pointplot(sub_df.index,sub_df["left"])
# 或者可以這樣畫 
# sns.pointplot(x="time_spend_company",y="left",data=df)
 
# 顯示圖表
plt.show()
 
 
 
4)餅圖:查看百分比,無法用seaborn繪製,利用matplotlib繪製
# 調用庫
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
 
# 文件讀取
df = pd.read_csv(r"C:\Users\Administrator\sample_code\data\HR.csv")
df = df.dropna(axis=0,how='any')
df = df[df["last_evaluation"]<=1][df["salary"]!="nme"][df["department"]!="sale"]
 
# 設定標籤
lbs=df["department"].value_counts().index
# 設定分離塊
explodes=[0.1 if i=="sales" else 0 for i in lbs]
# 製圖,autopct="%1.1f%%"設定顯示值,color可以採用seaborn的內容
plt.pie(df["department"].value_counts(normalize=True),explode=explodes,labels=lbs,autopct="%1.1f%%",colors=sns.color_palette("Reds"))
 
# 顯示圖表
plt.show()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章