综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目
目录
1.结构化数据挖掘
1.1依赖库导入和数据读取
1.2各品牌机型及售价统计
1.3视频录制规格与价格关联性分析
2.结构化数据预处理
2.1筛选特征
2.2特征标签归一化及编码
1.结构化数据挖掘
1.1依赖库导入和数据读取
导入必要的依赖库,读取 csv 格式数据集转化为 Dataframe 格式,命名为 data,使用 pandas 必要接口,并打印数据集的前五个样本。
# 数据导入和观察
import pandas as pd
data = pd.read_csv('cleaned_all_phones.csv')
data.head()
说明:
import pandas as pd
导入Pandas库,并将其简称为pd。Pandas是一个强大的数据分析和处理库,广泛用于数据清洗、转换、分析和可视化。
data = pd.read_csv('cleaned_all_phones.csv')
使用Pandas的read_csv()函数加载一个名为cleaned_all_phones.csv的CSV文件。这个文件可能包含手机相关的数据,例如品牌、价格、性能指标等。read_csv()函数会将CSV文件读取为一个DataFrame对象,这是Pandas中用于存储表格数据的主要数据结构。
data.head()
调用head()方法显示DataFrame的前五行数据。这是数据探索的常用操作,用于快速查看数据的结构和内容。
1.2各品牌机型及售价统计
统计各品牌发布的机型数量,并绘制机型数量关于品牌的柱形图,统计个品牌发布的机型的价格均值,并绘制机型价格均值关于品牌的柱形图。
# 可视化数据分布
import matplotlib.pyplot as plt
import seaborn as snsfig, ax = plt.subplots(1,2,figsize=(20,6))brand_counts = data['brand'].value_counts()sns.barplot(x=brand_counts.index, y=brand_counts.values, ax=ax[0],color='red')
ax[0].set_xlabel('Brand')
ax[0].set_ylabel('Count')
ax[0].set_title('Brand Distribution')
ax[0].tick_params(axis='x',rotation=90)brand_price_mean = data.groupby('brand')['price(USD)'].mean()sns.barplot(x=brand_price_mean.index, y=brand_price_mean.values, ax=ax[1],color='red')
ax[1].set_xlabel('Brand')
ax[1].set_ylabel('Averge Price')
ax[1].set_title('Brand X Price Distribution')
ax[1].tick_params(axis='x',rotation=90)plt.tight_layout()
plt.show()
说明:
seaborn:基于matplotlib的高级绘图库,提供了更简洁的API和更美观的默认样式,特别适合用于统计图表的绘制。
fig,ax = plt.subplots(1,2,figsize=(20,6))
使用plt.subplots()创建一个包含1行2列的图形布局,总尺寸为20×6英寸。
fig表示整个图形对象,ax是一个包含两个子图的数组,分别用于绘制不同的图表。
brand_counts = data['brand'].values_counts()
brand_counts_mean = data.groupby('brand')['price(USD)'].mean()
brand_counts:使用value_counts()方法统计brand列中每个品牌出现的次数。
brand_price_mean:使用groupby()方法按品牌分组,并计算每个品牌的平均价格。
sns.barplot(x=brand_counts.index,y=brand_counts.values,ax=ax[0],color='red')
ax[0].set_xlabel('Brand')
ax[0].set_ylabel('Count')
ax[0].set_title('Brand Distribution')
ax[0].tick_params(axis='x',rotation=90)
使用seaborn的barplot()方法绘制柱状图:
x=brand_counts.index:品牌名称作为横轴
y=brand_counts.values:品牌出现的次数作为纵轴
ax=ax[0]:指定将图表绘制在第一个子图上
color='red':将柱子的颜色设置为红色
使用ax[0].set_xlabel()、ax[0].set_ylabel()和ax[0].set_title()设置横轴标签、纵轴标签和标题。
使用ax[0].tick_params(axis='x', rotation=90)将横轴标签旋转90度,避免标签重叠。
sns.barplot(x=brand_price_mean.index,y=brand_price_mean.values,ax[1],color='red')
ax[1].set_xlabel('Brand')
ax[1].set_ylabel('Average Price')
ax[1].set_title('Brand X Price Distribution')
ax[1].tick_params(axis='x',rotation=90)
绘制第二个子图,参数同上
库的应用拓展
Matplotlib的更多功能
自定义图表样式:
plt.style.use('ggplot') # 使用ggplot风格
添加网格线:
ax[0].grid(axis='y', linestyle='--', alpha=0.7)
添加注释:
ax[0].annotate('Highest Count', xy=('Brand A', 100), xytext=(10, 10),
arrowprops=dict(facecolor='black', shrink=0.05))
Seaborn的更多功能
绘制箱线图:
sns.boxplot(x='brand', y='price(USD)', data=data)
绘制热力图:
sns.heatmap(data.corr(), annot=True, cmap='coolwarm')
绘制散点图矩阵:
sns.pairplot(data, hue='brand')
结合Pandas进行更复杂的数据分析
分组统计:
brand_stats = data.groupby('brand').agg({'price(USD)': ['mean', 'median', 'std']})
条件筛选与可视化:
high_price_brands = data[data['price(USD)'] > 1000]
sns.scatterplot(x='brand', y='price(USD)', data=high_price_brands)
1.3视频录制规格与价格关联性分析
以 10 种不同的视频录制规格作为特征,分别绘制价格有关这 10 种特征的 10 张箱线图,将 10 张箱线图打印在一个同画布上。
# 分析某个(某些)特征与标签(1:1)的关系可以用到箱线图sns.boxplot()
video_feature = [col for col in data.columns if col.startswith('video')]plt.subplots(4,3,figsize=(30,30))
for idx,feature in enumerate(video_feature,start=1):
plt.subplot(4,3,idx) sns.boxplot(x=feature, y='price(USD)', data=data, hue=feature, palette={False:'red',True:'blue'}) # plt.xlabel('feature')
plt.ylabel('price(USD)')
plt.title('price box plot')
说明:
video_feature = [col for col in data.columns if col.startswith('vedio_')]
使用列表推导式从data的列名中筛选出以“video”开头的特征列
这些特征可能与视频功能相关,例如video_resolution(视频分辨率)、video_fps(视频帧率)等
for idx,feature in enumerate(vedio_feature,start=1):plt.subplot(4,3,idx)sns.boxplot(x=feature,y='price(USD)',data=data,hue=feature,palette={False:'red',True:'blue'})
plt.xlabel('feature')
plt.ylabel('price(USD)')
plt.title('price box plot')
enumerate(video_feature, start=1):遍历video_feature列表,并为每个特征分配一个索引(从1开始)。
plt.subplot(4, 3, idx):根据索引将每个箱线图绘制在对应的子图位置。
sns.boxplot():使用Seaborn的boxplot()方法绘制箱线图
x=feature:将特征列作为横轴。
y='price(USD)':将价格作为纵轴。
data=data:指定数据源。
hue=feature:根据特征的值对箱线图进行分组(假设特征是布尔类型,如True或False)。
palette={False: 'red', True: 'blue'}:为分组设置颜色,False为红色,True为蓝色。
plt.xlabel('feature')、plt.ylabel('price(USD)')、plt.title('price box plot'):设置横轴标签、纵轴标签和标题
补充:
箱线图的作用
为什么可以用箱线图分析特征与标签的关系?
箱线图是一种用于展示一组数据的五数概括(最小值、第一四分位数、中位数、第三四分位数和最大值)的图表。通过箱体和须线直观地展示了数据的分布情况,包括中位数、分布范围、异常值等。
分析特征与标签的关系:
在机器学习和数据分析中,箱线图可以用来分析特征与标签之间的关系,尤其是当特征是分类变量(如布尔值、类别标签)时:
分布差异:通过比较不同特征值对应的标签分布,可以直观地看出特征值对标签的影响。例如,某些特征值可能导致标签值的分布更集中或更分散。
异常值检测:箱线图可以清晰地展示异常值,帮助分析特征与异常标签值之间的关系。
适用场景:
特征是分类变量:当特征是布尔值(如True/False)或类别标签时,箱线图可以很好地展示不同类别对应的标签分布差异。例如,video_feature可能是布尔值(如是否支持高清视频录制),箱线图可以直观地展示支持与不支持高清视频的手机价格分布差异。
标签是连续变量:箱线图适用于分析连续标签(如价格)的分布情况。通过箱线图,可以快速判断特征对标签分布的影响。
限制:
特征是连续变量时的局限性:如果特征是连续变量,箱线图可能不太适用。因为箱线图主要用于分类变量的分布比较。对于连续特征,需要先将其离散化(如分桶),或者使用其他图表(如散点图、回归线图)来分析与标签的关系。
复杂关系的局限性:箱线图主要用于展示分布差异,但对于复杂的因果关系或非线性关系,可能需要结合其他分析方法(如相关性分析、回归分析)来进一步验证。
精简总结:
箱线图通过展示数据的五数概括和分布情况,可以帮助分析分类特征与连续标签之间的关系。它特别适合用于比较不同特征值对应的标签分布差异和检测异常值。对于连续特征,可能需要先进行离散化处理,或者使用其他图表进行分析。
从箱线图可以看出vedio_特征为True的手机价格分布在大体上是比False的要高的,即vedio特征的有无会影响price
2.结构化数据预处理
2.1筛选特征
使用 pandas 拷贝一份数据集,命名为 df,取 'price (USD)' 为标签 y, 其他为特征集合 X,删除 X 中无关特征,只保留:'inches', 'battery', 'ram (GB)', 'weight (g)', 'storage (GB) 等特征,统计 name 特征中包含 'pro' 或 'max' 的样本,新建布尔特征 'has_pro_or_max'。
# 拷贝一份数据来做为模型训练前的预处理,不破坏原数据
df = data.copy()X = df[['inches', 'battery', 'ram(GB)', 'weight(g)', 'storage(GB)']] #, *video_feature]
y = df['price(USD)']X['has_pro_or_max'] = data['phone_name'].map(lambda x:1 if 'Pro' in x or 'Max' in x else 0)
# X['has_pro_or_max'] = df['phone_name'].str.contains('pro|max',case=False,regex=True).astype(int)X
说明:
X['has_pro_or_max'] = data['phone_name'].map(lambda x:1 if 'Pro' in x or 'Max' in x else 0)
通过map()方法和lambda函数,为每个手机名称检查是否包含“Pro”或“Max”字样
如果包含,则返回1,表示该手机名称中包含“Pro”或“Max”;如果不包含,则返回0
这个新特征has_pro_or_max被添加到特征集X中,用于捕捉品牌型号中可能影响价格的关键词
# X['has_pro_or_max'] = df['phone_name'].str.contains('pro|max', case=False, regex=True).astype(int)
使用str.contains()方法检查phone_name列中是否包含“pro”或“max”(不区分大小写)
case=False:忽略大小写
regex=True:允许使用正则表达式
astype(int):将布尔值(True/False)转换为整数(1/0)
这种方法与map()和lambda函数的效果相同,但更简洁
2.2特征标签归一化及编码
编写数据预处理函数 preprocessing,对标签和特征用 sklearn 中的 StandardScaler 进行归一化。
并且在该函数中,调用接口进行划分 80% 数据为训练集,20% 数据为测试集,函数的返回值为训练集和测试集的特征和标签。
调用该函数进行数据预处理和数据集划分,并打印出训练集和测试集的数组形状。
# 对标签和特征归一化,切分数据集
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import numpy as npdef df_preprocessing(X,y):
std = StandardScaler()
X = std.fit_transform(X)
y = std.fit_transform(y.values.reshape(-1,1)) X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)return X_train,X_test,y_train,y_testX_train,X_test,y_train,y_test = df_preprocessing(X,y)#X_train.shape,X_test.shape,y_train.shape,y_test.shapeprint('Number transactions X_train dataset:',X_train.shape)
print('Number transactions y_train dataset:',y_train.shape)
print('Number transactions X_test dataset:',X_test.shape)
print('Number transactions y_test dataset:',y_test.shape)
说明:
def df_preprocessing(X, y):std = StandardScaler()X = std.fit_transform(X)y = std.fit_transform(y.values.reshape(-1,1))
StandardScaler 的使用:
对特征 X 进行标准化:X = std.fit_transform(X)。
对标签 y 进行标准化:y = std.fit_transform(y.values.reshape(-1, 1))。
y.values.reshape(-1, 1):将 y 从一维数组转换为二维数组,因为 StandardScaler 需要二维输入。
改进建议
标签是否需要标准化?
在许多回归任务中,标签不需要标准化,因为模型的输出可以直接与原始标签进行比较;如果对标签进行标准化,后续需要将预测结果反向转换为原始尺度
如果确实需要标准化标签,建议在预测后进行反标准化:
y_pred = std.inverse_transform(y_pred)
保存标准化器的状态
在实际应用中,标准化器(StandardScaler)的状态(均值和标准差)需要保存,以便在模型部署时对新数据进行相同的标准化处理
可以通过 joblib 或 pickle 保存标准化器:
from joblib import dump
dump(std, 'scaler.joblib')
处理异常值
在标准化之前,建议检查数据中是否存在异常值,因为异常值会对标准化产生较大影响
相关文章:

综合使用pandas、numpy、matplotlib、seaborn库做数据分析、挖掘、可视化项目
目录 1.结构化数据挖掘 1.1依赖库导入和数据读取 1.2各品牌机型及售价统计 1.3视频录制规格与价格关联性分析 2.结构化数据预处理 2.1筛选特征 2.2特征标签归一化及编码 1.结构化数据挖掘 1.1依赖库导入和数据读取 导入必要的依赖库,读取 csv 格式数据集转化为 Data…...

docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...

十、Redis 主从复制:原理解析、配置实践与优化策略
Redis 主从复制:原理解析、配置实践与优化策略 Redis 作为高性能的 NoSQL 数据库,主从复制(Master-Slave Replication) 是其核心特性之一。主从复制用于数据冗余、读负载分担、故障恢复,是 Redis 构建高可用架构的基础。本文将深入解析 Redis 主从复制的配置方法、复制机…...

使用JMeter(组件详细介绍+使用方式及步骤)
JSON操作符 在我们使用请求时,经常会遇到JSON格式的请求体,所以在介绍组件之前我会将介绍部分操作符,在进行操作时是很重要的 Operator Description $ 表示根元素 当前元素 * 通配符,所有节点 .. 选择所有符合条件的节点 .name 子元素,name是子元素名称 [start:e…...

lamp平台的应用
一.lamp介绍 网站: 静态网站 动态网站 【php语言 .php结尾的文件】 作用:运行php语言编写的动态网站应用 lamp LinuxApache【负责解析静态资源】MySQL【负责存储网站产生的数据】PHP【负责解析动态资源】 如上图所示,是lamp平台中三…...

蓝桥杯4T平台(串口打印电压值)
知识点:串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…...

使用ASIWebPageRequest库编写Objective-C下载器程序
使用 ASIWebPageRequest 库编写 Objective-C 下载器程序是一个简单且高效的方式来处理 HTTP 请求。在 ASIHTTPRequest 和 ASIWebPageRequest 中,ASIWebPageRequest 是专门用于下载网页及其资源的库。 1. 安装 ASIWebPageRequest 首先,你需要安装 ASIHT…...

代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
101. 孤岛的总面积//思路大概是先计算面积,然后如果有接触路面就返回false。可能稍微多余算了太多无用面积。 #include<bits/stdc.h> using namespace std; void sum(vector<vector<bool>>& finded,const vector<vector<int>>&a…...

迷你世界脚本出生点接口:Spawnport
出生点接口:Spawnport 彼得兔 更新时间: 2023-04-26 10:19:56 具体函数名及描述如下: 序号 函数名 函数描述 1 getSpawnPoint(...) 获取默认出生点 2 setSpawnPoint(...) 设置出生点位置 3 getChunkValidSpawnPos(...) 获取区块有效刷新点…...

双链路提升网络传输的可靠性扩展可用带宽
为了提升网络传输的可靠性或增加网络可用带宽, 通常使用双链路冗余备份或者双链路聚合的方式。 本文介绍几种双链路网络通信的案例。 5GWiFi冗余传输 双Socket绑定不同网络接口:通过Android的ConnectivityManager绑定5G蜂窝网络和WiFi的Socket连接&…...

Pytest测试用例执行跳过的3种方式
文章目录 1.前言2.使用 pytest.mark.skip 标记无条件跳过3.使用 pytest.mark.skipif 标记根据条件跳过4. 执行pytest.skip()方法跳过测试用例 1.前言 在实际场景中,我们可能某条测试用例没写完,代码执行时会报错,或者是在一些条件下不让某些…...

【蓝桥杯】每天一题,理解逻辑(3/90)【Leetcode 快乐数】
闲话系列:每日一题,秃头有我,Hello!!!!!,我是IF‘Maxue,欢迎大佬们来参观我写的蓝桥杯系列,我好久没有更新博客了,因为up猪我寒假用自己的劳动换了…...

深度学习Save Best、Early Stop
一、Save Best 今天的大模型,在训练过程中可能会终止,但是模型其实是可以接着练的,假设GPU挂了,可以接着训练,在原有的权重上,训练其实就是更新w,如果前面对w进行了存档,那么可以从…...

数据库与存储优化
一、MySQL深度优化 索引优化 B树索引结构 结构特点: 平衡多路搜索树,所有数据存储在叶子节点,非叶子节点仅存键值和指针。叶子节点通过双向链表连接,支持范围查询高效遍历。 优势: 减少磁盘IO(高扇出&#…...

Android15请求动态申请存储权限完整示例
效果: 1.修改AndroidManifest.xml增加如下内容: <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-perm...

C/C++蓝桥杯算法真题打卡(Day3)
一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码: #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

【数据结构与算法】Java描述:第二节:LinkedList 链表
一、链表的概念与结构 1.1 概念: 通俗的来说,链表是由一个个结点连接起来的就叫链表。 1.2 结构: 链表存储的数据 在 物理上是不一定连续的,它是由前面链接后面,一个个连起来的。 二、Java底层的 LinkedList 2.1…...

LLM run
lmstudio lmstudio ollama ollama N 卡使用自带UI gpu加速推理 ,选择满足条件的, ds模型选择列表 https://ollama.com/library/deepseek-r1 a卡当前支持的显卡型号 I卡 gpu加速配置 2025.3 intel Official project optimization https://www.modelscope.cn/m…...

k8s面试题总结(十)
1.为什么HDFS不适合存储小文件? 元数据存储在NameNode内存中,一个节点的内存是有限的。存储大量的小文件会消耗过多的寻道时间 同等大小一个大文件的访问速度一定比多个小文件访问速度快 3.NameNode存储block的数量是有限的 比如你一个block元数据需要消…...

android中activity1和activity2中接收定时消息
android中activity1和activity2中接收定时消息 业务类 import java.util.Timer; import java.util.TimerTask;public class MyAnager {private MyAnager() {}private static MyAnager instance;//回调接口onRecvTaskpublic interface OnMsgListener {void onRecvTask(String a…...

Non-Homophilic Graph Pre-Training and Prompt Learning
Non-Homophilic Graph Pre-Training and Prompt Learning KDD25 #paper/⭐# 目的:对异配图进行prompt 方法 邻居节点的综合嵌入 s v 1 ∣ V ( S v ) ∣ ∑ u ∈ V ( S v ) h u ⋅ s i m ( h u , h v ) , \mathbf{s}_{v}\frac{1}{|V(S_{v})|}\su…...

Ollama 框架本地部署教程:开源定制,为AI 项目打造专属解决方案!
Ollama 是一款开源的本地大语言模型(LLM)运行框架,用于管理和运行语言模型。具有以下核心特点: 开源可定制:采用 MIT 开源协议,开发者能自由使用、阅读源码并定制,可根据自身需求进行功能扩展和…...

unittest框架 核心知识的系统复习及与pytest的对比
1. unittest 介绍 是什么:Python 标准库自带的单元测试框架,遵循 xUnit 架构(类似Java的JUnit)。 核心概念: TestCase:测试用例的基类,所有测试类需继承它。 TestSuite:测试套件&a…...

vue面试宝典之二
39.vue2和vue3中源码是如何解析模版的 new vue()的时候实例化了类之后根据传进去的option进行模版的类型div还是text还是啥进行匹配,同时拿到节点的值进行绑定,比如正则匹配{{}}将匹配到的变量拿去跟option中的data查找到具体的值…...

ESLint 深度解析:原理、规则与插件开发实践
在前端开发的复杂生态中,保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具,其默认规则与插件能满足多数常见需求,但面对特定团队规范或项目独特要求,自定义 ESLint 插件便成为有力的扩展手段…...

洛谷P1091
题目如下 思路 谢谢观看...

随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…...

江科大51单片机笔记【9】DS1302时钟可调时钟(下)
在写代码前,记得把上一节的跳线帽给插回去,不然LCD无法显示 一.DS1302时钟 1.编写DS1302.c文件 (1)重新对端口定义名字 sbit DS1302_SCLKP3^6; sbit DS1302_IOP3^4; sbit DS1302_CEP3^5;(2)初始化 因为…...

ssm_mysql_暖心家装平台
收藏关注不迷路!! 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多…...

一周学会Flask3 Python Web开发-SQLAlchemy简介及安装
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy是Python编程语言下的一款开源软件。提供了SQL工具包及对象关系映射(ORM)工具,…...