More changes and diagrams
This commit is contained in:
parent
a5640bcd1b
commit
05242e4ed0
2 changed files with 99 additions and 15 deletions
|
@ -1,5 +1,5 @@
|
|||
---
|
||||
title: "Watchtower - Git Commits analysieren"
|
||||
title: "Git Commits analysieren"
|
||||
author: "Jannis von Hagen"
|
||||
date: "`r Sys.Date()`"
|
||||
output: html_document
|
||||
|
@ -10,8 +10,9 @@ output: html_document
|
|||
|
||||
|
||||
```{r echo=FALSE, include=FALSE, warning = FALSE}
|
||||
system("get.data.bat")
|
||||
system("format.data.bat")
|
||||
|
||||
#system("get.data.bat")
|
||||
#system("format.data.bat")
|
||||
|
||||
diffs <- read.delim("data/diffs.txt")
|
||||
commits <- read.csv("data/commits.txt", sep=";")
|
||||
|
@ -20,6 +21,8 @@ install.packages('plyr', repos = "http://cran.us.r-project.org")
|
|||
install.packages('anytime', repos = "http://cran.us.r-project.org")
|
||||
library('plyr')
|
||||
library('anytime')
|
||||
library('ggplot2')
|
||||
library('lubridate')
|
||||
```
|
||||
|
||||
<hr />
|
||||
|
@ -33,6 +36,13 @@ library('anytime')
|
|||
- 2 Aufbereitung der Daten
|
||||
- 2.0 Quelle
|
||||
- 2.1 Variablen
|
||||
- 2.2 Bedeutungen
|
||||
- 3 Untersuchung
|
||||
- 3.1 Commits über Zeit
|
||||
- 3.2 Tageszeit der Commits einer Person
|
||||
- 3.3 Menge an Commits pro Person
|
||||
- 3.4 Menge an Änderungen pro Person
|
||||
- 3.5 Unterzeichnete Commits
|
||||
|
||||
## 1 Einleitung
|
||||
|
||||
|
@ -83,7 +93,7 @@ Die Variablen die Ausgelesen werden beinhalten zwei Datensets mit einer 1:n Bezi
|
|||
- Remove *//Menge an entfernten Codezeilen*
|
||||
- File *//Die spezifische Datei die verändert wurde*
|
||||
|
||||
### 2.3 Bedeutungen
|
||||
### 2.2 Bedeutungen
|
||||
|
||||
Die Daten besitzen keine Fehler, müssen allerdings noch interpretiert werden.
|
||||
|
||||
|
@ -91,18 +101,77 @@ Die Daten besitzen keine Fehler, müssen allerdings noch interpretiert werden.
|
|||
**Time** Ist eine Unix Timestamp, also die Zeit in Sekunden seit 1970, da wir für die Analyse aber eher die Tageszeit benötigen müssen die Daten erst umgewandelt werden.
|
||||
|
||||
```{r}
|
||||
commits$time <- lapply(commits$time, anytime)
|
||||
commits$time <- anytime(commits$time)
|
||||
```
|
||||
|
||||
|
||||
|
||||
**Signed** nutzt ein einzelnes Zeichen um anzuzeigen, ob der Commit signiert wurde,
|
||||
dies kann bei der Analyse berücksichtigt werden und benötigt keiner eigenen Umwandlung.
|
||||
|
||||
**add** und **remove** von aus **diffs** hat manche Einträge die ein "-" anstatt einer Zahl besitzen.
|
||||
Dies wird von Git benutzt, um anzuzeigen, dass es sich um eine binäre Datei handelt, bei welcher Zeilen Unterschiede keine logische Bedeutung haben.
|
||||
Allerdings ist die tatsache, dass eine Binäre Datei geändert wurde eine weitere Variable, die möglicherweise für
|
||||
das Model interessant sein könnte.
|
||||
Diese Einträge werden mithilfe eines Skriptes entfernt und die Anzahl pro Commit, wird zu dem Commit als **binaries** hinzugefügt.
|
||||
|
||||
## 3 Untersuchung
|
||||
|
||||
### 3.1 Commits über Zeit
|
||||
```{r}
|
||||
ggplot(as.data.frame(
|
||||
table(paste(
|
||||
format(na.omit(anydate(commits$time)), "%Y"), #Get the year
|
||||
sprintf("%02i", na.omit((as.POSIXlt(commits$time)$mon)) %/% 3L + 1L), #Quarter of the year
|
||||
sep = "/"))),
|
||||
aes(x=Var1, y=Freq)) + geom_point() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) +
|
||||
xlab("Zeit") +
|
||||
ylab("Commits")
|
||||
```
|
||||
|
||||
Die vorhergehende Graphik zeigt an, wie viele Commits pro Quartal eines Jahres angefallen sind,
|
||||
interessant ist hier, dass die commits in Monaten in welchen eine neue Version der Software veröffentlicht wurde besonders hoch sind. Auch gibt es einen Commit der angeblich 1970 erstellt wurde. Dies zeigt eine der ersten Möglichkeiten auf, mit der man auffällige Commits erkennen kann.
|
||||
|
||||
|
||||
- **Falls die Jahreszahl stark von der Jahreszahl anderer Commits aufweicht ist sie auffällig**
|
||||
|
||||
### 3.2 Tageszeit der Commits einer Person
|
||||
|
||||
Man kann theoretisch die Tageszeit des Datensatzes analysieren, allerdings gäbe das keine Guten Ergebnisse, da Zeitzohnen existieren und theoretisch von jedem Land aus commited werden kann. Eine Bewertung der muss daher von den anderen Commits der Person abhängen.
|
||||
|
||||
```{r warning = FALSE}
|
||||
times <- aggregate(as.numeric(hm(format(as.POSIXlt(time), "%H %M"))) ~ email, commits, mean)
|
||||
times$`as.numeric(hm(format(as.POSIXlt(time), "%H %M")))` <- as.POSIXlt(times$`as.numeric(hm(format(as.POSIXlt(time), "%H %M")))`)
|
||||
|
||||
ggplot(times,
|
||||
aes(x=as.POSIXct(`as.numeric(hm(format(as.POSIXlt(time), "%H %M")))`, "%H %M"))) + geom_histogram(bins=48) +
|
||||
scale_x_datetime(date_labels = "%H:%M") +
|
||||
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
|
||||
```
|
||||
Das Diagram zeigt das Arithmetische Mittel der Zeiten wann ein Nutzer einen Commit erstellt hat. Aufällig hier ist, dass trotz der Theoretischen Zeitzonenverteilung ein Großteil der Nutzer zu ähnlichen Zeiten Commited.
|
||||
Dies ist dadurch zu erklären, dass ein Großteil der Nutzer aus den USA bzw. Europa kommt und das somit diese Zeiten besonders häufig vorkommen.
|
||||
Zum bestimmen von auffälligen Commits sollte die Abweichung von eines Commits von der sonstigen Tageszeit des Nutzers benutzt werden. Hierzu muss ein Nutzer aber schon eine gewisse Menge an Commits haben.
|
||||
|
||||
### 3.3 Menge an Commits pro Person
|
||||
|
||||
```{r}
|
||||
```
|
||||
Die Menge an vorherigen Commits einer Person ist ebenfalls ein Faktor der einberechnet werden kann.
|
||||
Je weniger commits eine Person besitzt destso aufälliger sollte ein Commit gewertet werden.
|
||||
Hier zu bedenken ist, dass die Zahl der Commits einer Person bei 0 startet und langsam wächst,
|
||||
nur weil eine Person wenig Commits hat, heißt das also nicht das ein Commit schädlich ist, es kann lediglich ein Faktor sein.
|
||||
|
||||
### 3.4 Dateien die Geändert wurden
|
||||
Wir können geänderte Dateien in den Zusammenhang miteinander setzen um auffälige Muster zu finden,
|
||||
wenn Dateien geändert werden die sonst nicht zusammen geändert werden.
|
||||
|
||||
|
||||
### 3.5 Unterzeichnete Commits
|
||||
```{r}
|
||||
|
||||
```
|
||||
Signierte Commits existieren um den Urheber eines Commits festzustellen zu können, sodass keine Commits unter falschen Namen veröffentlicht werden können, ohne das dass System des Nutzers gehackt wurde. Ein Commit der signiert wurde ist somit vertrauenswürdiger als andere Commits, aber falls ein Nutzer der sonst nie Signiert plötzlich Signiert sollte dies auch einberechnet werden.
|
||||
|
||||
## 4 Ausblick
|
||||
- Diagramme für andere Faktoren fertigstellen
|
||||
- Datensatz transformieren um besser für die ML nutzbar zu sein
|
||||
- ML Ansatzum für jeden Commit einen Confidence Score generieren
|
||||
|
||||
## Quellen
|
||||
|
||||
|
@ -118,16 +187,29 @@ Sämtlicher Quellcode dieser Arbeit ist online verfügbar unter:
|
|||
- SDL
|
||||
- Url: https://www.libsdl.org/
|
||||
- Zugriff: 20.11.2024
|
||||
|
||||
## Dependencies
|
||||
- **Git**
|
||||
*Repository herunterladen und statistiken extrahieren*
|
||||
- **Windows**
|
||||
*Die Setup Skripts sind aktuell nur als .bat Dateien vorhanden*
|
||||
- **Beef**
|
||||
*C# Ähnliche Sprache, welche ich als Skriptsprache verwende*
|
||||
- **R**
|
||||
*Analysesprache für dieses Projekt*
|
||||
- **R Markdown**
|
||||
*Um dieses Dokument zu generieren*
|
||||
- **Anytime**
|
||||
*Unix Timestamp zu Zeit Objekt umwandeln*
|
||||
- **Plyr**
|
||||
*Utility Funktionen für Datensätze*
|
||||
|
||||
## Worterklärungen
|
||||
- Repository
|
||||
*Ein Aufbewahrungs/Sammlungs -ort für Software Quellcode*
|
||||
- Commit
|
||||
*Eine bestimmte Änderung an einem Repository. Kann Datein hinzufügen, entfernen oder Ändern*
|
||||
- Binäre Datei
|
||||
*Ein Dateityp, welcher ein bestimmtes Program zum lesen braucht und nicht in Textform vorhanden ist. Die meisten Bild Dateien sind zum Beispiel Binäre Dateien*
|
||||
|
||||
|
||||
```{r}
|
||||
commits_u <- count(commits$name, 'commits$name')
|
||||
barplot(commits_u$freq, names.arg=commits_u$commits.name)
|
||||
```
|
||||
</div>
|
|
@ -23,8 +23,9 @@ class BinaryTester
|
|||
String outputDiffs = new .();
|
||||
File.ReadAllText("../data/diffs.txt", inputDiffs);
|
||||
|
||||
|
||||
var e = inputDiffs.Split('\n');
|
||||
outputDiffs.Append(scope $"{e.GetNext()}\n");
|
||||
outputDiffs.Append(scope $"{e.GetNext().Value}\n");
|
||||
lines: for(var line in e)
|
||||
{
|
||||
///Check if the line contains a binary diff, increment the counter and extract it
|
||||
|
@ -33,6 +34,7 @@ class BinaryTester
|
|||
if(!binaryDiffs.ContainsKeyAlt<StringView>(name))
|
||||
binaryDiffs.Add(new .(name), 0);
|
||||
|
||||
|
||||
for(var part in parts)
|
||||
{
|
||||
if(part == "-")
|
||||
|
|
Loading…
Add table
Reference in a new issue