為啥我敢說(shuō)Python是數(shù)據(jù)分析界的扛把子語(yǔ)言?
共 8711字,需瀏覽 18分鐘
·
2024-04-18 21:28
首先聲明下這篇文字不是賣課的,也不是無(wú)腦吹Python,咱只講事實(shí),認(rèn)認(rèn)真真討論下Python是不是數(shù)據(jù)分析領(lǐng)域最好的語(yǔ)言。
因?yàn)槲以谥跎峡吹椒浅6嗳嗽趩?wèn)這個(gè)問(wèn)題,想必大家是關(guān)心的。我的觀點(diǎn)是,目前來(lái)看所有編程語(yǔ)言里,做數(shù)據(jù)分析Python是最好的選擇,沒有之一。
列舉幾個(gè)事實(shí):
1、Kaggle、天池等數(shù)據(jù)比賽用的最多的語(yǔ)言是Python,其次是R語(yǔ)言。
2、最新4月TIOBE編程語(yǔ)言排名,Python斷層第一,流行度16.41%,第二是C語(yǔ)言,約10.21%。
3、NASA處理黑洞圖片所用的工具是Python,Python在NASA內(nèi)部被廣泛用于航天數(shù)據(jù)處理分析。
4、Chatgpt算法和后端大規(guī)模使用Python,其官方接口就有Python api。
Python作為數(shù)據(jù)分析的熱門語(yǔ)言有它的必然性,我理解有三個(gè)方面原因。
一、Python擁有大量數(shù)據(jù)科學(xué)第三方庫(kù)
這些第三方庫(kù)拿來(lái)即用,廣泛用于數(shù)學(xué)計(jì)算、數(shù)據(jù)處理、數(shù)據(jù)建模、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)等等,極大的節(jié)省了數(shù)據(jù)分析的軟硬件成本。
-
pandas:python中的Excel,用于數(shù)據(jù)處理、分析,非常方便。
-
numpy:用于數(shù)組計(jì)算的庫(kù),大部分機(jī)器學(xué)習(xí)、深度學(xué)習(xí)都基于numpy。
-
scipy:用于數(shù)學(xué)和工程計(jì)算的庫(kù),堪比Matlab。
-
Scikit-Learn:集合了幾乎所有機(jī)器學(xué)習(xí)模型的庫(kù),拿來(lái)即用,非常方便。
-
Matplotlib:用于繪制可視化圖表的庫(kù),沒有什么是它畫不了的圖。
其他的就更多了,不一一贅述。
二、Python有Jupyter notebook這樣專門用于數(shù)據(jù)科學(xué)的開發(fā)平臺(tái)
Kaggle、天池就是基于notebook提供數(shù)據(jù)分析服務(wù),很多公司的數(shù)據(jù)分析平臺(tái)也是基于notebook,搭建在私有或公有云上。
Jupyter是集編程、筆記、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、可視化、教學(xué)演示、交互協(xié)作等于一體的超級(jí)web應(yīng)用,而且支持python、R、Julia、Scala等超40種語(yǔ)言。
雖然說(shuō)支持這么多語(yǔ)言,但Python是Jupyter最好的搭檔,因?yàn)镻ython有IPython。Jupyter最大的特點(diǎn)是代碼即寫可即運(yùn)行,其可被應(yīng)用于全過(guò)程計(jì)算:開發(fā)、文檔編寫、運(yùn)行代碼和展示結(jié)果。
比如我用matplotlib繪制一張曲線圖,只需要輸入腳本代碼并執(zhí)行,便可以在Jupyter上顯示相應(yīng)圖表。
Jupyter中所有交互計(jì)算、編寫說(shuō)明文檔、數(shù)學(xué)公式、圖片以及其他富媒體形式的輸入和輸出,都是以文檔的形式體現(xiàn)的。
這些文檔是保存為后綴名為.ipynb的JSON格式文件,不僅便于版本控制,也方便與他人共享。
此外,文檔還可以導(dǎo)出為:HTML、LaTeX、PDF等格式。
Jupyter還支持安裝插件,和VsCode類似。插件類型也很豐富,包括了代碼調(diào)試、可視化、文本編輯等等。
既然同樣是編程工具,那Jupyter和Pycharm、VsCode的使用場(chǎng)景有什么區(qū)別呢?
Jupyter主要是用來(lái)做數(shù)據(jù)科學(xué),其包含數(shù)據(jù)分析、數(shù)據(jù)可視化、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、機(jī)器人等等,任何Python數(shù)據(jù)科學(xué)第三方庫(kù)都能在Jupyter上得到很好的應(yīng)用和支持。
現(xiàn)在幾乎所有的數(shù)據(jù)比賽平臺(tái)都以Jupyter作為編輯工具,在上面實(shí)現(xiàn)各種數(shù)據(jù)分析場(chǎng)景。
在產(chǎn)品上,Jupyter不僅有簡(jiǎn)潔的Notebook ,還有工作臺(tái)式的Lab,甚至線上平臺(tái)化部署的Hub,對(duì)個(gè)人、團(tuán)隊(duì)、企業(yè)都可以完美支持。
三、最重要的原因,Python易學(xué)、易用、易讀
這實(shí)在太關(guān)鍵了,做數(shù)據(jù)分析不會(huì)太去關(guān)注編程語(yǔ)言本身的復(fù)雜特性,越是簡(jiǎn)單越有利于提高效率。
首先,我不需要關(guān)注代碼的細(xì)節(jié),比如申明類型、編譯、調(diào)試等,因?yàn)槲抑皇怯脕?lái)分析處理數(shù)據(jù),又不要開發(fā)大型軟件,運(yùn)行他個(gè)十幾年。
其次能用第三方庫(kù),就不需要自己去開發(fā)工具,能極大地提升數(shù)據(jù)分析效率。
只要結(jié)果完美,其他的并不重要。
Python就是有這樣的優(yōu)勢(shì),代碼簡(jiǎn)潔,有上千個(gè)數(shù)據(jù)科學(xué)相關(guān)第三方庫(kù)供你使用。
所以相比其他語(yǔ)言,python最大程度上降低了使用門檻。
比如說(shuō)構(gòu)建一個(gè)簡(jiǎn)單的分類模型。
這是Python代碼:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
# 示例數(shù)據(jù)
X = np.array([[1, 2], [2, 3], [3, 1], [2, 1], [3, 3], [4, 4], [5, 5]])
y = np.array([0, 0, 1, 1, 0, 1, 1])
# 劃分訓(xùn)練集和測(cè)試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 創(chuàng)建邏輯回歸模型
model = LogisticRegression()
# 訓(xùn)練模型
model.fit(X_train, y_train)
# 預(yù)測(cè)測(cè)試集
y_pred = model.predict(X_test)
# 評(píng)估模型
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
這是Java代碼:
import weka.classifiers.Classifier;
import weka.classifiers.functions.SMO;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
public class ClassificationExample {
public static void main(String[] args) throws Exception {
// 加載數(shù)據(jù)
DataSource source = new DataSource("data.csv");
Instances data = source.getDataSet();
// 設(shè)置類別索引(通常是最后一列)
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
// 構(gòu)建分類器(這里使用SMO,一種支持向量機(jī)算法)
Classifier cls = new SMO();
// 訓(xùn)練模型
cls.buildClassifier(data);
// 測(cè)試模型
double[] testInstance = {4.5, 4.5}; // 一個(gè)新的測(cè)試實(shí)例
Instances test = new Instances(data, 1); // 創(chuàng)建一個(gè)只包含一個(gè)實(shí)例的數(shù)據(jù)集
test.add(testInstance);
// 對(duì)測(cè)試實(shí)例進(jìn)行分類
double predictedClass = cls.classifyInstance(test.firstInstance());
String className = data.classAttribute().value((int) predictedClass);
// 輸出預(yù)測(cè)結(jié)果
System.out.println("Predicted class for instance [4.5, 4.5]: " + className);
}
}
這是C++代碼:
import weka.classifiers.Classifier;
import weka.classifiers.functions.SMO;
import weka.core.Instances;
import weka.core.converters.ConverterUtils.DataSource;
public class ClassificationExample {
public static void main(String[] args) throws Exception {
// 加載數(shù)據(jù)
DataSource source = new DataSource("data.csv");
Instances data = source.getDataSet();
// 設(shè)置類別索引(通常是最后一列)
if (data.classIndex() == -1)
data.setClassIndex(data.numAttributes() - 1);
// 構(gòu)建分類器(這里使用SMO,一種支持向量機(jī)算法)
Classifier cls = new SMO();
// 訓(xùn)練模型
cls.buildClassifier(data);
// 測(cè)試模型
double[] testInstance = {4.5, 4.5}; // 一個(gè)新的測(cè)試實(shí)例
Instances test = new Instances(data, 1); // 創(chuàng)建一個(gè)只包含一個(gè)實(shí)例的數(shù)據(jù)集
test.add(testInstance);
// 對(duì)測(cè)試實(shí)例進(jìn)行分類
double predictedClass = cls.classifyInstance(test.firstInstance());
String className = data.classAttribute().value((int) predictedClass);
// 輸出預(yù)測(cè)結(jié)果
System.out.println("Predicted class for instance [4.5, 4.5]: " + className);
}
}
對(duì)比下,很明顯地能看出來(lái),Python代碼會(huì)更加簡(jiǎn)潔,少了很多語(yǔ)法上的規(guī)則限制,其第三方庫(kù)的使用也更加容易。
綜上來(lái)說(shuō),從事數(shù)據(jù)分析想要選一個(gè)編程語(yǔ)言,Python是最好的選擇,會(huì)讓你少走一些彎路。
最后,分享幾本不錯(cuò)的Python數(shù)據(jù)分析入門資料,大家可以在公眾號(hào)后臺(tái)回復(fù):data,即可獲得
加入知識(shí)星球【我們談?wù)摂?shù)據(jù)科學(xué)】
600+小伙伴一起學(xué)習(xí)!
