第2章 特征理解:我的数据集里有什么
本章的任务:
a.结构化数据与非结构化数据
b.定量数据与定性数据
c.数据的4个等级
d.探索性数据分析与数据可视化
e.描述性
2.1 数据结构的有无
一定要把无结构数据变成有结构的,就是一行代表一个样本,一列代表一个属性。
2.2 定量数据与定性数据
个人的理解:就是数据值型连续的数字与categorically 数据。
这里面设计几个本人认为比较有用的代码
df
为pandas
的Dateframe
类型
df.info()
# 可以用来查看数据有多少行,是否有缺失值,以及每列的数据类型。
df.isnull.sum()
计算缺失值
df.describe()
描述数据
某一列字符串替换
文章中介绍的方法是用map写函数,但是我习惯用 df.str.replace('被替换的字符串','替换后的字符串')
df
中的某一列数据类型转换,df.astype(需要转成的数据类型)
为了进一步研究定量数据和定性数据,我们开始研究数据的4个等级。
2.3 数据的4个等级
a. nominal level (定类等级)
这种数据的结构最弱。 如 血型 A、B、O 等 没有好坏等级区分 。
可以统计每一个类别有多少。
df.value_counts() # 统计每一个类别下的个数
df.value_counts().sort_values(ascending=False).head(排名前多少位的类别).plot(kind= 什么类型的图 如 bar line pie 等等)
b. ordinal level(定序等级)
如打分 1-10 或者等级 A B C D
这里除了和定类等级一样的操作,还可以计算中位数和百分数。
data = pd.read_excel('sfo 2018_data file_final_Weighted.xlsx')
artRatings = data['Q7ART']
print(artRatings)artRatings = artRatings[(artRatings >= 1) & (artRatings <= 5)]
artRatings = artRatings.astype(str)
print(artRatings)
print(artRatings.describe())
artRatings.value_counts().plot(kind = 'pie')
artRatings.value_counts().plot(kind = 'box') # 用来计算箱体图 但是不适合
除了书上提到的方法,其它经验总结
(1) 无论是nominal level还是ordinal level如果里面类别中的有几种都数目很少,可以合并为一种,这也是避免过拟合的一种很好的方法。例如我经常看到的类别统计中的 其它 。
(2) 相近的类可以合并到一起,例如材质各种木材(硬木 、软木)、各种石材(大理石 地砖),不管什么都可以分成 木材 和石材。 注:这一条完全要根据业务实现,如果对于家里装修肯定不能这么粗糙的分析。
c. interval level
climate = pd.read_csv('GlobalLandTemperaturesByCity.csv')
climate.dropna(axis = 0, inplace =True) # 移除缺失值
print(climate.head())
climate.isnull().sum()
climate['AverageTemperature'].nunique() # 显示不重复值的数量
climate['AverageTemperature'].hist()
plt.show()
climate['AverageTemperature'].describe()
climate['dt'] = pd.to_datetime(climate['dt'])
climate['dt'].map(lambda value: value.year)
#代码技巧:有时候需要每行都算的时候,先用df的自带函数,比如开始我想直接用climate['dt'].year,如果不行就map 往往可以成功
climate_sub_us = climate.loc[climate['Country']=='United States'] # 只看美国的数据
# .loc 与iloc 对比
1.loc意义:通过行标签索引行数据
例: loc[n]表示索引的是第n行(index 是整数)
loc[‘d’]表示索引的是第’d’行(index 是字符)
2. .iloc :通过行号获取行数据,不能是字符
3. ix——结合前两种的混合索引
三者区别:
ix / loc 可以通过行号和行标签进行索引,比如 df.loc['a'] , df.loc[1], df.ix['a'] , df.ix[1]
而iloc只能通过行号索引 , df.iloc[0] 是对的, 而df.iloc['a'] 是错误的
建议:
当用行号索引的时候, 尽量用 iloc 来进行索引; 而用标签索引的时候用 loc , ix 尽量别用。
climate_sub_us['century'] = climate.loc[climate['Country'] == 'United States']['year'].map(lambda x: int(x / 100 + 1))
climate_sub_us['AverageTemperature'].hist(by=climate_sub_us['century'])
plt.show()
climate_sub_us.groupby('century')['AverageTemperature'].mean().plot(kind='line')
plt.show()
century_change = climate_sub_us.groupby('century')['AverageTemperature'].mean()
x = climate_sub_us['year']
y = climate_sub_us['AverageTemperature']
fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(x, y)
plt.show()
# climate_sub_us.groupby('year').mean()['AverageTemperature'].plot()
climate_sub_us.groupby('year')['AverageTemperature'].mean().plot()
plt.show(
climate_sub_us.groupby('year').mean()['AverageTemperature'].rolling(10).mean().plot()
plt.show()
d. ratio level
注:groupby
一个[列名] 得到的pd.Series
[[列名]] 这样得到的才是dataframe
fig = plt.figure(figsize=(15, 5))
ax = fig.gca()
salary_ranges = pd.read_csv('Salary_Ranges_by_Job_Classification.csv')
salary_ranges['Biweekly High Rate'] = salary_ranges['Biweekly High Rate'].str.replace('$', '')
salary_ranges['Biweekly High Rate'] = salary_ranges['Biweekly High Rate'].astype(float)
salary_ranges['Grade'] = salary_ranges['Grade'].astype(str)
salary_ranges.groupby('Grade')[['Biweekly High Rate']].mean().sort_values('Biweekly High Rate', ascending=False) .head(
20).plot.bar(stacked=False, ax=ax, color='darkorange')
ax.set_title('Top 20 Grade by Mean Biweekly High Rate')
plt.show()
fig = plt.figure(figsize=(15, 5))
ax = fig.gca()
salary_ranges.groupby('Grade')[['Biweekly High Rate']].mean().sort_values('Biweekly High Rate', ascending=False) .head(
20).plot.bar(stacked=False, ax=ax, color='darkorange')
ax.set_title('Less 20 Grade by Mean Biweekly High Rate')
plt.show()
sorted_df = salary_ranges.groupby('Grade')[['Biweekly High Rate']].mean().sort_values('Biweekly High Rate', ascending=False)
print(sorted_df)
print(sorted_df.iloc[0][0]/sorted_df.iloc[-1][0])
到现在,第二章的内容基本上结束了,自我感觉这章基本上就是在教python里面的pandas,很基础,但是很关键。强烈建议大家不要复制代码,而且自己真正的敲一遍。
2.4 总结
当拿到一个数据的时候,应该做那些?
(1)数据是否有组织
(2)每列数据定性还是定量,数值还是字符串。
等级 | 属性 | 例子 |
---|---|---|
定类 | 离散 | 二分类 |
无序 | 人名 | |
定序 | 有序类别 | 李克特量表 |
比较 | 考试等级 | |
定距 | 数据差别有意义 | 温度 |
定比 | 连续,存在有意义的绝对零点,可以做除法。(例如$100是$50的两倍) |
(3)每列处于哪个等级 定类 定序 定距 定比
不同的数据等级可以进行的统计
统计量 | 定类 | 定序 | 定距 | 定比 |
---|---|---|---|---|
众数 | √ | √ | √ | 有时可行 |
中位数 | × | √ | √ | √ |
差值、最小值、最大值 | × | √ | √ | √ |
均值 | × | × | √ | √ |
标准差 | × | × | √ | √ |
(4)如何可视化
图标 | 定类 | 定序 | 定距 | 定比 |
---|---|---|---|---|
条形图/饼图 | √ | √ | 有时可行 | × |
茎叶图 | × | √ | √ | √ |
箱线图 | × | √ | √ | √ |
直方图 | × | × | 有时可行 | √ |