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