Analiza danych jest kluczowym krokiem w procesie zrozumienia i wyciągania informacji z danych. W tym raporcie przeprowadzimy analizę zbioru danych ‘ships’, dostępnego w bibliotece MASS w programie R. Zbiór ten zawiera informacje takie jak liczba przypadków awarii, łączne miesiące pracy statków z podziałem na ich typ, rok budowy i okres eksploatacji. Głównym celem analizy jest zbadanie awaryjności statków.
W naszej analizie będziemy korzystać z kilku bibliotek R, takich jak MASS do wczytania zbioru danych oraz ggplot2 do wizualizacji ich. Poniżej załadujemy te biblioteki.
Aby załadować bibioteki należy je najpierw pobrać, można zrobić to za pomocą funkcji install.packages(‘nazwa’).
library(MASS)
library(ggplot2)
## Warning: pakiet 'ggplot2' został zbudowany w wersji R 4.2.3
Teraz wczytamy zbiór danych ‘ships’ i wyświtlimy 6 pierwszych wierzszy za pomocą funkcji head
head(ships)
## type year period service incidents
## 1 A 60 60 127 0
## 2 A 60 75 63 0
## 3 A 65 60 1095 3
## 4 A 65 75 1095 4
## 5 A 70 60 1512 6
## 6 A 70 75 3353 18
Po załadowaniu danych warto spojrzeć na ich strukturę. Użyjemy funkcji str oraz summary, aby uzyskać ogólny przegląd struktury danych oraz podstawowe statystyki.
str(ships)
## 'data.frame': 40 obs. of 5 variables:
## $ type : Factor w/ 5 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 2 2 ...
## $ year : int 60 60 65 65 70 70 75 75 60 60 ...
## $ period : int 60 75 60 75 60 75 60 75 60 75 ...
## $ service : int 127 63 1095 1095 1512 3353 0 2244 44882 17176 ...
## $ incidents: int 0 0 3 4 6 18 0 11 39 29 ...
summary(ships)
## type year period service incidents
## A:8 Min. :60.00 Min. :60.0 Min. : 0.0 Min. : 0.0
## B:8 1st Qu.:63.75 1st Qu.:60.0 1st Qu.: 175.8 1st Qu.: 0.0
## C:8 Median :67.50 Median :67.5 Median : 782.0 Median : 2.0
## D:8 Mean :67.50 Mean :67.5 Mean : 4089.3 Mean : 8.9
## E:8 3rd Qu.:71.25 3rd Qu.:75.0 3rd Qu.: 2078.5 3rd Qu.:11.0
## Max. :75.00 Max. :75.0 Max. :44882.0 Max. :58.0
Podsumowanie to zawiera informacje takie jak średnia, mediana, wartości minimalne i maksymalne oraz kwartyle dla każdej danej zmiennej. Dzięki tym dwóm funkcjom uzyskujemy kompleksowy przegląd struktury danych i ich charakterystyki, co ułatwi nam dalszą analizę.
Zacznijmy od stwórzenia wykresu słupkowego pokazującego liczbę awarii danych typów statków wyprodukowanych w konkretnych latach za pomocą funkcji ggplot. Wizualizacja danych jest kluczowym elementem analizy, ponieważ ułatwia nam ich zrozumienie.
ggplot(ships, aes(x = year, y = incidents, fill = type)) +
geom_bar(stat = "identity", position = "dodge") +
scale_fill_manual(values = c("darkblue", "royalblue", "skyblue3", "skyblue", "plum4"))+
labs(title = "Liczba awarii według typu statku i roku produkcji",
x = "Rok produkcji",
y = "Liczba awarii",
fill = "Typ statku") +
theme_minimal()
Na powyższym wykresie można zauważyć, jak liczba awarii różni się w zależności od typu statku oraz roku produkcji. Możemy wyciągnąc wstępne wnioski, że liczba przypadków awarii zależy od typu statku, roku produkcji oraz że najczęściej awarią ulegają statki typu B.
Funkcja summary wyświtliła nam podstawowe statystyki dla każdej kolumny zawartej w zbiorze danych. Chcemy jednak przyjrzeć się lepiej liczbie awarii.
summary(ships$incidents)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 0.0 2.0 8.9 11.0 58.0
Otrzymujemy informacje o tym, że:
Przeciętna liczba awarii statków wynosi 8,9,
25% statków uległo liczbie awarii nie większej niż 0,
50% statków uległo liczbie awarii nie większej niż 2,
75% statków uległo liczbie awarii nie większej niż 11
Minimalna liczba wypadków wynosi 0, a maksymalna 58
Teraz policzymy wariancje oraz odchylenie standardowe dla liczby awarii.
print(paste('Wariancja wynosi :', round(var(ships$incidents), 2)))
## [1] "Wariancja wynosi : 223.84"
print(paste('Odchylenie standardowe wynosi :' , round(sd(ships$incidents), 2)))
## [1] "Odchylenie standardowe wynosi : 14.96"
Liczba awarii odchyla się od wartości średniej przeciętnie o 14,96.
Jak mogliśmy zauważyć na powyższym wykresie, liczba awarii różni się ze względu na typ statku oraz roku produkcji. Przyjrzyjmy się dokładniej podstawowym statystyką dla konkretnych typów statków.
summary(ships$incidents[ships$type=='A'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 3.50 5.25 7.25 18.00
summary(ships$incidents[ships$type=='B'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 16.50 34.00 31.62 46.25 58.00
summary(ships$incidents[ships$type=='C'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.75 1.00 1.50 1.25 6.00
summary(ships$incidents[ships$type=='D'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 0.000 0.000 2.125 2.500 11.000
summary(ships$incidents[ships$type=='E'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 3 4 7 12
Teraz przyjrzyjmy się rozkładowi liczby awarii dla różnych typów statków za pomocą wykresu pudełkowego
ggplot(ships, aes(x = type, y = incidents)) +
geom_boxplot(fill = "lightblue", color = "darkblue", alpha = 0.7) +
labs(title = "Liczba awarii według typu statku",
x = "Typ statku",
y = "Liczba wypadków")
Na wykresie każdy pudełko reprezentuje rozkład liczby awarii dla danego typu statku. Mediana (linia wewnątrz pudełka) oraz rozpiętość międzykwartylowa (długość pudełka) pozwalają nam zobaczyć, jak rozkłady różnią się między różnymi typami statków.
Na podstawie wykresu możemy wywnioskować, że najbardziej awaryjnym typem statku jest typ B a najrzadziej awarią ulegały statki typu C.
Zacznijmy znowu od obliczenia statystyk podstawowych dla awaryjności statków wyproduktowanych w konkretnych latach
summary(ships$incidents[ships$year=='60'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0 0 0 7 1 39
summary(ships$incidents[ships$year=='65'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.25 3.50 13.30 7.00 58.00
summary(ships$incidents[ships$year=='70'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2.00 5.25 8.50 11.80 12.00 44.00
summary(ships$incidents[ships$year=='75'])
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 0.00 0.50 3.50 3.25 18.00
Teraz przedstawy na wykresie średnią liczbę wypadków z podziałem na rok produkcji.
ggplot(ships, aes(x = factor(year), y = incidents)) +
geom_bar(stat = "summary", fun = "mean", fill = "skyblue", color = "darkblue") +
labs(title = "Średnia liczba awarii dla statków wyprodukowanych w konkretnych latach",
x = "Rok produkcji",
y = "Średnia liczba awarii") +
theme_minimal()
Na podstawie wykresu można zauważyć, że statki z lat 75. i 60. mają niższą średnią liczbę awarii niż statki z lat 65. i 70. Statki wyprodukowane w latach 65. mają najwyższą średnią liczbę awarii w porównaniu do innych lat.
Aby zbadać zależność między liczbą awarii a łącznym czasem pracy możemy obliczyć współczynnik korelacji liniowej Pearsona, który mierzy siłę i kierunek liniowego związku między dwiema zmiennymi.
Zmienną niezależną będzie łączny czasu pracy. Natomiast zmienną zależną liczba awarii.
round(cor(ships$service, ships$incidents),4)
## [1] 0.8525
Współczynnik korelacji Persona jest równy 0,8525, zatem występuje silna, dodatnia zależność liniowa. Mówi nam to, że zazwyczaj wraz ze wzrostem łącznego czasupracy rośnie liczba awarii.
Zobaczmy jak ta zależność wygląda na wykresie
plot(ships$service, ships$incidents, xlab = "Łączny czas pracy (miesiące)", ylab = "Liczba awarii",
main = "Zależność między liczbą awarii a łącznym czasem pracy",
xlim = c(0, 4000))
Dodajmy do wykresu linie regresji
m1=lm(ships$incidents~ships$service)
plot(ships$service, ships$incidents, xlab = "Łączny czas pracy (miesiące)", ylab = "Liczba awarii",
main = "Zależność między liczbą awarii a łącznym czasem pracy",
xlim = c(0, 4000))
abline(m1, col='darkblue', lwd=2)
Dodana niebieska linia regresji przedstawia trend ogólnej zależności między liczbą awarii a czasem pracy. Linia jest nachylona w górę, co oznacza dodatnią korelację.
Podsumowując analiza danych dotyczących awaryjności statków pozwoliła na zgłębienie zależności między różnymi zmiennymi, takimi jak rok produkcji, typ statku czy łączny czas pracy, a liczbą awarii. Analiza statystyk i wykresu pudełkowego dla różnych typów statków wykazała istotne różnice w liczbie awarii między nimi. Typ B okazał się najbardziej awaryjnym typem statku, charakteryzującym się najwyższą medianą i szerokim zakresem międzykwartylowym.