Auf der Suche nach dem Schlüsselwort "Maschinelles Lernen" habe ich 246.632 Repositories für maschinelles Lernen gefunden. Da sie alle mit dieser Branche verwandt sind, erwartete ich von ihren Besitzern, dass sie Experten sind oder zumindest kompetent genug im maschinellen Lernen. Daher habe ich beschlossen, die Profile dieser Benutzer zu analysieren und die Ergebnisse der Analyse anzuzeigen.
Wie ich gearbeitet habe
Werkzeuge
Ich habe drei Schabewerkzeuge verwendet:
- Schöne Suppe zum Abrufen der URL aller mit maschinellem Lernen gekennzeichneten Repositorys. Es ist eine Python-Bibliothek, die das Scraping erheblich erleichtert.
- PyGithub . Python- Github API v3. Github- (, , ..) Python-.
- Requests .
Methoden
Ich habe alles andere als analysiert, aber nur die Eigentümer und 30 aktivsten Mitwirkenden der 90 Top-Repositories, die in den Suchergebnissen angezeigt wurden.
Nachdem ich Duplikate und Profile von Organisationen wie udacity entfernt hatte, erhielt ich eine Liste mit 1208 Benutzern. Für jeden von ihnen habe ich die Informationen für 20 Schlüsselparameter analysiert.
new_profile.info ()
Die ersten 13 Parameter wurden von hier erhalten.
Den Rest habe ich aus den Repositories des Benutzers genommen:
- total_stars Gesamtsterne aller Repositories
- max_star maximale Anzahl von Sternen aller Repositories
- Gabeln Gesamtzahl der Gabeln aller Repositorys
- Beschreibungen Beschreibungen aus allen Benutzer-Repositories aller Repos
- Beitrag Anzahl der Beiträge für das letzte Jahr
Daten visualisieren
Histogramme
Nach dem Bereinigen der Daten war die interessanteste Phase an der Reihe: die Datenvisualisierung. Ich habe dafür Plotly verwendet.
import matplotlib.pyplot as plt
import numpy as np
import plotly.express as px # for plotting
import altair as alt # for plotting
import datapane as dp # for creating a report for your findings
top_followers = new_profile.sort_values(by='followers', axis=0, ascending=False)
fig = px.bar(top_followers,
x='user_name',
y='followers',
hover_data=['followers'],
)
fig.show()
Folgendes ist passiert .
Das Histogramm ist etwas umständlich, da es einen sehr langen Benutzerschwanz mit weniger als 100 Followern hat. Daher ist es besser, es zu vergrößern.
Wie Sie sehen können, hat llSourcell (Siraj Raval) die meisten Anhänger (36261). Der zweitbeliebteste hat dreimal weniger Anhänger (12682).
Wir können weitermachen und herausfinden, dass 1% der Profile 41% aller Follower haben!
>>> top_n = int(len(top_followers) * 0.01)12>>> sum(top_followers.iloc[0: top_n,:].loc[:, 'followers'])/sum(top_followers.followers)0.41293075864408607
Als nächstes visualisieren wir Informationen zu total_stars, max_star, Gabeln mithilfe einer logarithmischen Skala.
figs = [] # list to save all the plots and table
features = ['followers',
'following',
'total_stars',
'max_star',
'forks',
'contribution']
for col in features:
top_col = new_profile.sort_values(by=col, axis=0, ascending=False)
log_y = False
#change scale of y-axis of every feature to log except contribution
if col != 'contribution':
log_y = True
fig = px.bar(top_col,
x='user_name',
y=col,
hover_data=[col],
log_y = log_y
)
fig.update_layout({'plot_bgcolor': 'rgba(36, 83, 97, 0.06)'}) #change background coor
fig.show()
figs.append(dp.Plot(fig))
Es stellt sich heraus , wie diese .
Das resultierende Bild kommt der Verteilung nach dem Zipf-Gesetz sehr nahe. Wir sprechen über das empirische Muster der Verteilung der Häufigkeit von Wörtern in einer natürlichen Sprache: Wenn alle Wörter der Sprache in absteigender Reihenfolge der Häufigkeit ihrer Verwendung angeordnet sind. Wir haben hier eine ähnliche Abhängigkeit.
Korrelation
Aber was ist mit Abhängigkeiten zwischen Schlüsseldatenpunkten? Und wie stark sind diese Abhängigkeiten? Ich habe dispers_matrix verwendet, um das herauszufinden.
correlation = px.scatter_matrix(new_profile, dimensions=['forks', 'total_stars', 'followers',
'following', 'max_star','contribution'],
title='Correlation between datapoints',
width=800, height=800)
correlation.show()
corr = new_profile.corr()
figs.append(dp.Plot(correlation))
figs.append(dp.Table(corr))
corr
Es stellt sich heraus , wie diese und so weiter .
Die stärksten positiven Beziehungen entstehen zwischen:
- Maximale Anzahl von Sternen und Gesamtzahl von Sternen (0,939)
- Gabeln und Gesamtsterne (0,929)
- Die Anzahl der Gabeln und die Anzahl der Anhänger (0,774)
- Follower und Gesamtsterne (0,632)
Programmiersprachen
Um herauszufinden, welche Programmiersprachen unter GitHub-Profilbesitzern am häufigsten vorkommen, habe ich einige zusätzliche Analysen durchgeführt.
# Collect languages from all repos of al users
languages = []
for language in list(new_profile['languages']):
try:
languages += language
except:
languages += ['None']
# Count the frequency of each language
from collections import Counter
occ = dict(Counter(languages))
# Remove languages below count of 10
top_languages = [(language, frequency) for language, frequency in occ.items() if frequency > 10]
top_languages = list(zip(*top_languages))
language_df = pd.DataFrame(data = {'languages': top_languages[0],
'frequency': top_languages[1]})
language_df.sort_values(by='frequency', axis=0, inplace=True, ascending=False)
language = px.bar(language_df, y='frequency', x='languages',
title='Frequency of languages')
figs.append(dp.Plot(language))
language.show()
Dementsprechend gehören zu den Top 10 Sprachen:
- Python
- JavaScript
- Html
- Jupyter Notizbuch
- Shell usw.
Ort
Um zu verstehen, in welchen Teilen der Welt sich die Profilbesitzer befinden, müssen Sie die folgende Aufgabe ausführen - um den Standort der Benutzer zu visualisieren. Unter den analysierten Profilen ist die Geographie für 31% angegeben. Zur Visualisierung verwenden wir geopy.geocoders.Nominatim
from geopy.geocoders import Nominatim
import folium
geolocator = Nominatim(user_agent='my_app')
locations = list(new_profile['location'])
# Extract lats and lons
lats = []
lons = []
exceptions = []
for loc in locations:
try:
location = geolocator.geocode(loc)
lats.append(location.latitude)
lons.append(location.longitude)
print(location.address)
except:
print('exception', loc)
exceptions.append(loc)
print(len(exceptions)) # output: 17
# Remove the locations not found in map
location_df = new_profile[~new_profile.location.isin(exceptions)]
location_df['latitude'] = lats
location_df['longitude'] = lons
Um eine Karte zu erstellen, verwenden Sie Plotlys dispers_geo
# Visualize with Plotly's scatter_geo
m = px.scatter_geo(location_df, lat='latitude', lon='longitude',
color='total_stars', size='forks',
hover_data=['user_name','followers'],
title='Locations of Top Users')
m.show()
figs.append(dp.Plot(m))
Laut diesem Link steht die Originalkarte mit Zoom zur Verfügung.
Beschreibung der Repo- und Bio-Nutzer
Viele Benutzer hinterlassen eine Beschreibung für ihre Repositories und stellen auch ihre eigene Biografie zur Verfügung. Um dies alles zu visualisieren, verwenden wir W ordCloud! für Python.
import string
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
nltk.download('stopwords')
nltk.download('punkt')
nltk.download('wordnet')
def process_text(features):
'''Function to process texts'''
features = [row for row in features if row != None]
text = ' '.join(features)
# lowercase
text = text.lower()
#remove punctuation
text = text.translate(str.maketrans('', '', string.punctuation))
#remove stopwords
stop_words = set(stopwords.words('english'))
#tokenize
tokens = word_tokenize(text)
new_text = [i for i in tokens if not i in stop_words]
new_text = ' '.join(new_text)
return new_text
def make_wordcloud(new_text):
'''Function to make wordcloud'''
wordcloud = WordCloud(width = 800, height = 800,
background_color ='white',
min_font_size = 10).generate(new_text)
fig = plt.figure(figsize = (8, 8), facecolor = None)
plt.imshow(wordcloud)
plt.axis("off")
plt.tight_layout(pad = 0)
plt.show()
return fig
descriptions = []
for desc in new_profile['descriptions']:
try:
descriptions += desc
except:
pass
descriptions = process_text(descriptions)
cloud = make_wordcloud(descriptions)
figs.append(dp.Plot(cloud))
Und das Gleiche gilt für Bio
bios = []
for bio in new_profile['bio']:
try:
bios.append(bio)
except:
pass
text = process_text(bios)
cloud = make_wordcloud(text)
figs.append(dp.Plot(cloud))
Wie Sie sehen können, stimmen die Schlüsselwörter mit denen überein, die Sie von Spezialisten für maschinelles Lernen erwarten können.
Ergebnisse
Die Daten wurden von Benutzern und Autoren von 90 Repositories mit der besten Übereinstimmung für den Schlüssel "Maschinelles Lernen" empfangen. Es gibt jedoch keine Garantie dafür, dass alle Top-Profilbesitzer von Experten für maschinelles Lernen auf der Liste stehen.
Trotzdem ist dieser Artikel ein gutes Beispiel dafür, wie die gesammelten Daten bereinigt und visualisiert werden können. Das Ergebnis wird Sie höchstwahrscheinlich überraschen. Und das ist nicht seltsam, da Data Science dabei hilft, Ihr Wissen zur Analyse Ihrer Umgebung einzusetzen.
Wenn nötig, können Sie den Code dieses Artikels abspalten und damit machen, was Sie wollen. hier ist das repo </ a.
, Data Science AR- Banuba - Skillbox.
, «» github- . , , ..
:
1) , , . ( , 'contribution'). , .
'contribution' , . .
, , . , , ().
2) , . , . , , . , , - . ( ), - , , .
: , . .