综合使用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)

使用seabornbarplot()方法绘制柱状图

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:根据特征的值对箱线图进行分组(假设特征是布尔类型,如TrueFalse)。

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')

处理异常值

在标准化之前,建议检查数据中是否存在异常值,因为异常值会对标准化产生较大影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30934.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯题型

蓝桥杯 蓝桥杯题型分类语法基础艺术与篮球(日期问题)时间显示(时间问题)跑步计划(日期问题)偶串(字符)最长子序列(字符)字母数(进制转换)6个0&…

Linux常见指令

Linux常见指令 1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令和rm指令7、man指令8、cp指令9、mv指令10、cat指令11、重定向12、more指令13、less指令14、head指令15、tail指令16、管道17、时间相关指令18、cal指令19、find指令20、grep指令21、zip/unzip指…

C++:入门详解(关于C与C++基本差别)

目录 一.C的第一个程序 二.命名空间(namespace) 1.命名空间的定义与使用: (1)命名空间里可以定义变量,函数,结构体等多种类型 (2)命名空间调用(&#xf…

智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验

一、概述 当AI浪潮席卷全球,教育领域也未能幸免。AI学习机,这个打着“个性化学习”、“精准提分”旗号的新兴产品,正以惊人的速度占领市场。从一线城市到偏远乡镇,从学龄前儿童到高考备考生,AI学习机的广告铺天盖地&am…

字符串相乘——力扣

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 "2", num2 "3" …

C/C++蓝桥杯算法真题打卡(Day3)

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

关于OceanBase与CDH适配的经验分享

CDH是Cloudera早期推出的一个开源平台版本&#xff0c;它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台&#xff0c;专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目&#xff0c;Cloudera构建了一个功能…

【CSS3】筑基篇

目录 复合选择器后代选择器子选择器并集选择器交集选择器伪类选择器 CSS 三大特性继承性层叠性优先级 背景属性背景色背景图背景图平铺方式背景图位置背景图缩放背景图固定背景复合属性 显示模式显示模式块级元素行内元素行内块元素 转换显示模式 结构伪类选择器结构伪类选择器…

假设检验与置信区间在机器学习中的应用

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 &#x1f4da; 引言 在机器学…

鸿蒙Next-应用检测、安装以及企业内部商店的实现

一、企业内部应用检测和更新升级 A应用检测是否安装B应用 canOpenApp():boolean{ try { let link schB://com.example.test/open; // 替换成你目标应用的link串儿 let canOpen bundleManager.canOpenLink(link); console.log("canOpen:"canOpen…

Locker 是 Godot 的一个开源插件,它提供了一种快速且可扩展的方式来使用不同的策略保存和加载数据,并且具有开箱即用的 JSON 和加密功能。

一、软件介绍 文末提供下载 Locker 插件是在 Godot 4.3 中创建的框架&#xff0c;旨在简化在 Godot 项目中保存、加载和管理数据的过程。该插件的主要目标之一是对用户自定义开放&#xff0c;允许使用不同的用户定义策略来访问数据。并且具有开箱即用的 JSON 和加密功能。 二、…

(更新完)LPZero: Language Model Zero-cost Proxy Search from Zero

LPZero代码 摘要 神经架构搜索 (NAS) 有助于自动执行有效的神经网络搜索&#xff0c;同时需要大量的计算资源&#xff0c;尤其是对于语言模型。零样本 NAS 利用零成本 (ZC) 代理来估计模型性能&#xff0c;从而显着降低计算需求。然而&#xff0c;现有的 ZC 代理严重依赖于深…

Varlens(手机上的单反)Ver.1.9.3 高级版.apk

Varlens 是一款专业级手机摄影软件&#xff0c;旨在通过丰富的功能和高自由度参数调节&#xff0c;让手机拍摄效果媲美微单相机。以下是核心功能总结&#xff1a; 一、核心功能 专业拍摄模式 支持手动/自动/程序模式&#xff0c;可调节ISO、快门速度、EV、白平衡等参数27 提供…

Unity2017打包出来后的场景一片红

bug展示&#xff1a; 解决办法&#xff1a; Edit——Project Settings——Graphics——添加下面这俩Shader(用于UI展示)即可。

VS Code C++ 开发环境配置

VS Code 是当前非常流行的开发工具. 本文讲述如何配置 VS Code 作为 C开发环境. 本文将按照如下步骤来介绍如何配置 VS Code 作为 C开发环境. 安装编译器安装插件配置工作区 第一个步骤的具体操作会因为系统不同或者方案不同而有不同的选择. 环境要求 首先需要立即 VS Code…

html-表格标签

一、表格标签 1. 表格的主要作用 表格主要用于显示&#xff64;展示数据,因为它可以让数据显示的非常的规整,可读性非常好&#xff61;特别是后台展示数据 的时候,能够熟练运用表格就显得很重要&#xff61;一个清爽简约的表格能够把繁杂的数据表现得很有条理&#xff61; 总…

ROS2-话题学习

强烈推荐教程&#xff1a; 《ROS 2机器人开发从入门到实践》3.2.2订阅小说并合成语音_哔哩哔哩_bilibili 构建功能包 # create package demo_python_pkg ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg 自己写的代码放在./demo_python_pkg/…

Java在小米SU7 Ultra汽车中的技术赋能

目录 一、智能驾驶“大脑”与实时数据 场景一&#xff1a;海量数据的分布式计算 场景二&#xff1a;实时决策的毫秒级响应 场景三&#xff1a;弹性扩展与容错机制 技术隐喻&#xff1a; 二、车载信息系统&#xff08;IVI&#xff09;的交互 场景一&#xff1a;Android Automo…

Oracle RAC配置原理详解:构建高可用与高性能的数据库集群

在现代企业级应用中&#xff0c;数据库的高可用性和高性能是至关重要的。Oracle Real Application Clusters&#xff08;RAC&#xff09;是Oracle数据库提供的一种集群解决方案&#xff0c;能够将多个数据库实例部署在不同的服务器上&#xff0c;实现负载均衡和故障切换&#x…

ESP8266TCP客户端(单连接TCP Client)

单连接TCP Client 电脑作为服务器&#xff0c;8266作为客户端 1.配置WiFi模式 ATCWMODE3 //softAPstation mode 相应&#xff1a;ok 2.连接路由器 ATCWJAP“SSID”&#xff0c;“password” //SSID就是wifi的名字&#xff0c; password WIFI密码 响应&#xff…