特征工程入门与实践读书笔记——第二章

本文深入探讨了数据科学中的数据等级概念,包括定类、定序、定距和定比等级,以及如何针对不同等级的数据进行有效的统计分析和可视化。通过实例展示了如何使用Python的Pandas库进行数据预处理、分析和可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第2章 特征理解:我的数据集里有什么

本章的任务:

a.结构化数据与非结构化数据

b.定量数据与定性数据

c.数据的4个等级

d.探索性数据分析与数据可视化

e.描述性

2.1 数据结构的有无

一定要把无结构数据变成有结构的,就是一行代表一个样本,一列代表一个属性。

2.2 定量数据与定性数据

个人的理解:就是数据值型连续的数字与categorically 数据。

这里面设计几个本人认为比较有用的代码

dfpandasDateframe类型

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)如何可视化

图标定类定序定距定比
条形图/饼图有时可行×
茎叶图×
箱线图×
直方图××有时可行

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值