今天,讓我們活動活動筋骨,來一場數據分析的演練,下方代碼親跑無誤!
另外,還是老樣子,值得深入學習的知識,添加了對應的官方文檔鏈接!
1.數據加載
<code>import
numpyas
npimport
pandasas
pd/<code>
<code>data
=pd.read_csv("Adult.csv"
)data
.head()/<code>
輸出結果:
注意:文件擴展名可能並不總是反映其真實結構。 CSV文件中的值是否真的以逗號分隔呢?
查看過原數據文件之後,發現是以tab鍵分隔的,為了以正常的格式讀取顯示,解決辦法就是:
<code>data
=pd.read_csv("Adult.csv"
,sep="\t"
)data
.head()/<code>
輸出結果:
2.數據理解
- X(序號);
- age(年齡);
- workclass(工作類型);
- education(教育程度);
- occupation(職業);
- capital.gain(資本收益);
- capital.loss(資本損失);
- native.country(國籍);
- salaries(工資);
- jobsatisfaction(工作滿意度);
- male(男性);
- female(女性)
3.數據清洗
3.1 樣本數據相關信息概覽
<code>data
.info
()/<code>
輸出結果:
<code>data
.describe
()/<code>
輸出結果:
沒發現特別的異樣,再來看看其他數據~
3.2 查看非數值數據的取值
<code>for
i
in
data
:if
pd
.api
.types
.is_object_dtype
(data
[i]
):i
+": "+str
(data
[i]
.unique
()))/<code>
輸出結果:
發現一水兒的錯誤,應該怎麼辦?
- 多個屬性出現缺失值?,包括age、workclass、occupation、native.country;
- 年齡age出現負數-57,出現超大值320;
- workclass中存在拼寫錯誤:privat;
- native.country中存在錯誤:' United-States'、'Unitedstates'和'UnitedStates'應該是屬於同一個值,並且我們還發現:' United-States'和 'United-States' 竟然也不是同一個值,原來,是因為某些值的前面存在空格的原因;
- jobsatisfaction存在字符串“Very good”。
接下來,一個一個解決~
3.3 去掉字符串前空格
<code>for
iin
data
:if
pd.api.types.is_object_dtype(data
[i]):data
[i]=data
[i].str.strip()/<code>
3.4 處理缺失值?
3.4.1 查看缺失值數量及百分比
<code>total = (data
=="?"
).sum() percent = (data
=="?"
).sum() /len(data
)*100
pd.concat([total, percent], axis =1
,keys= ['Total'
,'Percent'
])/<code>
更多關於concat的用法,請戳官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html
輸出結果:
3.4.2 直接去掉包含缺失值?的行(第一種處理方法:一招團滅~)
<code>data1
= data[data.age !='?'
]data2
=data[(data !='?'
).all(1
)] /<code>
3.4.3 用np.nan替換所有非敏感值(第二種處理方法)
<code>data
= data.replace('?'
,np.nan)/<code>
接下來,挨個兒找問題單挑!
==處理age列==
<code> data['age'] = data['age'].replace(['-57'
,'320'
], np.nan) age_num = pd.to_numeric(data
['age'
],errors
='coerce'
) age_mean =int
(age_num.mean())data
['age'
].replace(np.nan, age_mean, inplace=True
) /<code>
==處理workclass列==
<code>data['workclass'
].replace(np.nan,"Private"
,inplace=True
) data['workclass'
].replace('privat'
,"Private"
,inplace=True
) /<code>
找個辦法驗證一下:
<code>data
[
'workclass'
].unique
()/<code>
輸出結果:
確實沒問題哈,繼續~
==處理occupation列==
<code>data['occupation'
].replace(np.nan,"Other"
,inplace=True
) /<code>
==處理native.country列==
<code>data
['native.country'
].replace('Unitedstates'
,'United-States'
,inplace = True)data
['native.country'
].replace('UnitedStates'
,'United-States'
,inplace = True)data
['native.country'
].replace(np.nan,'United-States'
,inplace = True) # 把native
.country列的空值替換為'United-States'
,也可以把空值的行去掉/<code>
==處理jobsatisfaction列==
<code>data
[data
['jobsatisfaction'
]=='Very good'
]data
.replace('Very good'
,15
, inplace = True) # 查看數據集之後,這裡把'Very good'
替換成了15
,也可以替換成其它合適的數,或者直接去掉,因為只有一條這樣的數據,不影響。/<code>
4.數據可視化
4.1 age列頻率直方圖
<code>data
['age'
]=data
['age'
].astype("int64"
) plt.hist(data
['age'
],bins=7
,density=True,color="#436EEE"
)/<code>
輸出結果:
4.2 occupation列相對頻率直方圖
<code>counts=data
['occupation'
].value_counts() counts=counts/sum(counts) sns.barplot(counts.index, counts.values, palette="rocket"
) plt.xticks(rotation=90
)/<code>
輸出結果:
4.3 salaries 密度直方圖
<code>data
["salaries"
].plot(kind="kde"
) # 密度圖 plt.hist(data
['salaries'
],bins=14
,density=True,color="#436EEE"
)/<code>
輸出結果:
4.4 Male and Female餅圖
<code>gender = data[['male', 'female']]
.agg(['count'
]) /len
(data) # agg:指定軸上的一項或多項操作進行彙總 labels = ["male"
,"female"
] plt.pie(x=gender, labels=labels, autopct='%1.1f%%'
)/<code>
輸出結果:
更多關於agg的用法,請戳官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.agg.html
4.5 創建並打印一個數據框,其中每一行代表一個職業,每一列代表一個受教育程度,並且表格中的單元格包含具有相應職業和受教育程度的人們的平均工資。
<code>crossdf=pd.crosstab(data
['occupation'
],data
['education'
],values=data
['salaries'
],aggfunc=np.average) crossdf/<code>
輸出結果:
<code>for
index
, row in crossdf.iterrows(): fig = plt.figure(figsize=[9
,6
]) sns.barplot(row.sort_values().index, row.sort_values().values, palette="rocket"
) plt.xticks(rotation=90
) plt.title(index
)/<code>
部分輸出結果:
大家可以通過評論或私信的方式提出對本文的建議,也可以通過點贊加轉發的方式表達對本文的支持!
感謝大家!!!
如果需要代碼,請大家在評論區留言即可,如果方便的話,也可隨手來個轉發+關注噢。