Wstęp

W tym raporcie chcemy przedstawić analizę książek z serwisu Kaggle:

  1. Główny zbiór danych: https://www.kaggle.com/datasets/saurabhbagchi/books-dataset

  2. Zbiór danych do analizy wydania książek w poszczególnych latach oraz analizy podziału książek według języka: https://www.kaggle.com/datasets/drahulsingh/best-selling-books

Za pomocą analizy danych chcemy odpowiedzieć na następujące pytania:

  1. Jakie są najczęściej oceniane książki oraz którzy autorzy opublikowali najwięcej dzieł?

    • Zidentyfikujemy 15 książek z największą liczbą ocen i pokażemy, które tytuły przyciągają największe zainteresowanie czytelników.

    • Wskażemy top 10 pisarzy z największym dorobkiem literackim.

    • Pokażemy, jakie książki są najwyżej i najgorzej oceniane.

  2. Jaki jest podział książek według języka, rodzaju i poziomu ocen?

    • Pokażemy, jakie języki dominują w literaturze, analizując dystrybucję książek według ich oryginalnego języka.

    • Przeanalizujemy, jaki typ książek dominuje na rynku.

    • Przeanalizujemy procentowy udział książek w trzech głównych grupach ocen: niskich (0–3), średnich (3–4) i wysokich (4–5).

  3. Jaki jest wpływ gatunku na średnią ocenę i różne korelacje?

    • Zweryfikujemy, które gatunki książek uzyskują najwyższe średnie oceny.

    • Zbadamy korelację między średnią oceną książki a liczbą wystawionych recenzji.

Import danych i bibliotek

#install.packages("plotly")
#install.packages("dplyr")
#install.packages("tidyverse")
#install.packages("ggplot2")
#install.packages("knitr")

suppressPackageStartupMessages(library(plotly))
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(tidyverse))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(knitr))

#books <- read.csv("/Users/macbookpro/Desktop/Books_df.csv")
#language_data <- read.csv("/Users/macbookpro/Desktop/best_selling_books.csv") 

books <- read.csv("C:\\Users\\Darina\\Downloads\\Books_df.csv")
language_data <- read.csv("C:\\Users\\Darina\\Downloads\\best_selling_books.csv")

#"C:\\Users\\kriku\\Downloads\\Projekt R\\Books_df.csv"
#"C:\\Users\\kriku\\Downloads\\Projekt R\\best_selling_books.csv"

#"/Users/macbookpro/Desktop/Books_df.csv"
#"/Users/macbookpro/Desktop/best_selling_books.csv"

#view(books)
#view(language_data)
#names(books)

1.Ranking książek i autorów

Top 15 najpopularniejszych książek za ilością ocen

most_rated_books <- books %>%
  distinct(Title, .keep_all = TRUE) %>%
  arrange(desc(No..of.People.rated)) %>% 
  slice(1:15) %>%  
  select(Title, No..of.People.rated) %>% 
  mutate(Title = str_sub(Title, 1, 20))

g1 <- ggplot(most_rated_books, aes(x = Title, y = No..of.People.rated)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  theme_minimal() +
  xlab("Book Title") +
  ylab("Number of Ratings") +
  ggtitle("Most Popular Books by Number of Ratings") 
ggplotly(g1)

Top 10 autorwów

# Liczba książek na autora
books_per_author <- books %>%
  count(Author) %>%
  arrange(desc(n)) %>%
  slice(1:10)
books_per_author
##                     Author   n
## 1       Wonder House Books 389
## 2              Maple Press 110
## 3              Jeff Kinney  86
## 4             J.K. Rowling  84
## 5   Dreamland Publications  78
## 6             Team Pegasus  54
## 7              Sudha Murty  51
## 8   Oswaal Editorial Board  47
## 9             Rick Riordan  46
## 10 Om Books Editorial Team  44
g6 <- ggplot(books_per_author, aes(x = reorder(Author, -n), y = n)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  theme_minimal() +
  xlab("Author") +
  ylab("Number of Books") +
  ggtitle("Top 10 Authors by Number of Books") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(g6)

Najwyżej i najgorzej oceniane książki

# Najwyżej oceniane oceniane książki
highest_rated <- books %>%
  filter(Rating == max(Rating)) %>%
  select(Title, Author, Rating)     # sumarycznie 240 książek

# Najgorzej oceniane książki
lowest_rated <- books %>%
  filter(Rating == min(Rating)) %>%
  select(Title, Author, Rating)     # sumarycznie 306 książek

# Tabela dla najwyżej ocenianych książek
highest_rated %>%
  slice(1:10) %>%
  kable(col.names = c("Title", "Author", "Rating"), caption = "Top 10 Highest Rated Books")
Top 10 Highest Rated Books
Title Author Rating
The Supernatural Quiz Book: 500 Questions and Answers on Supernatural: 500 Questions and Answers on Supernatural Season 1 Light Bulb Quizzes 5
அசுரனின் காதல் (Tamil Edition) Ebin Rider 5
Funny Jokes for 15 Year Old Teens: The Ultimate Q&A, One-Liner, Dad, Knock-Knock, Riddle, and Tongue Twister Collection! Hilarious and Silly Humor for Teenagers Cooper The Pooper 5
अभिनेता जीवन-एक संघर्ष: Evaluate yourself before you enter in the industry! (Hindi Edition) Pankaj Gupta 5
Marainthirunthu Paarkum Marmam Enna..!!!: மறைந்திருந்து பார்க்கும் மர்மம் என்ன..!!! (Tamil Edition) Thiyashi Vijay 5
One Sting Attached (Hindi)/Ishq Baki/इश्क़ बाक़ी: Bichhad Ke Bhi Na Bichhde, Aise Saath Ke Naam/बिछड़ के भी न बिछड़े, ऐसे साथ के नाम Pankaj Dubey/पंकज दुबे 5
Chautha Ank’Autobiography Ravindra Mahajani चौथा अंक माधवी रवींद्र महाजनी Madhavi Ravindra Mahajani 5
Jag Badalnara Baap Manus (Dr. Babasaheb Ambedkar) Jagdish Ohol 5
Snakes, Drugs and Rock ‘n’ Roll: My Early Years Romulus Whitaker 5
Own Your Body: A Doctor’s Life-saving Tips Dr. Shiv K Sarin 5
# Tabela dla najgorzej ocenianych książek
lowest_rated %>%
  slice(1:10) %>%
  kable(col.names = c("Title", "Author", "Rating"), caption = "Top 10 Lowest Rated Books")
Top 10 Lowest Rated Books
Title Author Rating
Changing The Lens: Exploring The Depths Of Film And Philosophy Dr Ruplekha Khullar & Sulagna Pal 0
The Musical Maverick: The Authorized Biography of Shankar Mahadevan Ashis Ghatak 0
Thirteen Plays of Bhasa: (2 Vols. Bound in One) A.C. Woolner Lakshman Sarup 0
Borsi Bhar Aanch Yatish Kumar 0
Breakout Trading Made Easy “ब्रेकआउट ट्रेडिंग मेड ईजी” Book in Hindi | Maximize your Profits with Simple Price Action Strategies | Sunil Gurjar Sunil Gurjar 0
Lilliput Land: How Small is Driving India’s Mega Consumption Story Rama Bijapurkar 0
My First Mini Library Of Learning Vol. 1 Puffin India 0
Ruskin Bond Short Stories - Set of 8 Bestselling Children Story Books Ruskin Bond 0
11 Rules For Life: Secrets to Level Up Chetan Bhagat 0
The Mystery of the Magic Mirror Shubira Prasad 0

2. Podziały książek

Podział książek wedlug roznych jezykow

top10_lang <- language_data %>%
  count(Original.language) %>%
  arrange(desc(n)) %>% 
  slice(1:15)
top10_lang
##    Original.language   n
## 1            English 131
## 2            Russian   6
## 3             French   5
## 4             German   5
## 5           Japanese   5
## 6            Chinese   4
## 7            Italian   4
## 8            Spanish   3
## 9              Hindi   2
## 10         Norwegian   2
## 11           Swedish   2
## 12             Czech   1
## 13             Dutch   1
## 14          Gujarati   1
## 15        Portuguese   1
# Wykres pączkowy

g2 <- top10_lang %>% plot_ly(labels = ~Original.language, values = ~n)
g2 <- g2 %>% add_pie(hole = 0.5)
g2 <- g2 %>% layout(title = "Books Distribution by Different Languages",  showlegend = T,
                      xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE),
                      yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

g2

Podział książek według typu

top8_type <- books %>%
  count(Type) %>%
  arrange(desc(n)) %>% 
  slice(1:8)
top8_type
##                Type    n
## 1         Paperback 4200
## 2    Kindle Edition 2347
## 3         Hardcover  787
## 4 Audible Audiobook  199
## 5        Board book  181
## 6 Perfect Paperback   45
## 7    Product Bundle   44
## 8   Unknown Binding   24
# Wykres kołowy podziału książek na typy

plot_ly(data=top8_type,values=~n,labels=~factor(Type),
  marker=list(colors=c("green","orange","blue")),
  type="pie") %>% layout(title="Distribution of Books by Type")

Procent książek w różnych przedziałach ocen

# Procent książek w różnych przedziałach ocen
rating_bins <- books %>%
  mutate(rating_group = case_when(
    Rating <= 3 ~ "0-3",
    Rating > 3 & Rating <= 4 ~ "3-4",
    Rating > 4 ~ "4-5"
  )) %>%
  count(rating_group) %>%
  mutate(percentage = n / sum(n) * 100)
rating_bins
##   rating_group    n percentage
## 1          0-3  395   4.982341
## 2          3-4  548   6.912210
## 3          4-5 6985  88.105449
plot_ly(data=rating_bins, values=~percentage, labels=~rating_group,
  marker=list(colors=c("red", "orange", "blue")),
  type="pie") %>%
  layout(title="Percentage of Books by Rating Group")

3. Korelacja

Załeżność śriedniej oceny od gatunku książki

g4 <- ggplot(books[books$Rating > 2.5, ], aes(x = reorder(Main.Genre, Rating, FUN = median), y = Rating)) +
  geom_boxplot() +
  coord_flip() +
  theme_bw() +
  labs(title = "Boxplot of Average Ratings by Genre",
       x = "Genre",
       y = "Average Rating")

ggplotly(g4)

Ilość wydanych książek w poszczególnych latach

 #Ilość książek wydanych w poszczególnych latach
 year_distribution <- language_data %>%
   group_by(First.published) %>%
   summarise(count = n()) %>%
   arrange(desc(count))
head(year_distribution)
## # A tibble: 6 × 2
##   First.published count
##             <int> <int>
## 1            1979     5
## 2            1974     4
## 3            1988     4
## 4            1992     4
## 5            2000     4
## 6            2012     4
g5 <- ggplot(year_distribution[year_distribution$First.published !=1304,], aes(x = First.published, y = count, size = count)) +
  geom_point(alpha = 0.7, color = "blue") +
  theme_minimal() +
  labs(
    title = "Bubble Plot of Publication Counts by Year",
    x = "Year of First Publication",
    y = "Number of Publications",
    size = "Count"
  ) +
  scale_size_continuous(range = c(2, 10))

ggplotly(g5)

Korelacja między ocenami a liczbą ocen

# Korelacja między ocenami a liczbą ocen
correlation <- cor(books$Rating, books$No..of.People.rated)

g3 <- ggplot(books, aes(x = Rating, y = No..of.People.rated)) +
  geom_point(alpha = 0.5, color = "blue") +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal() +
  xlab("Rating") +
  ylab("Number of Ratings") +
  ggtitle(paste("Correlation between Rating and Number of Ratings: r =", round(correlation, 2)))

ggplotly(g3)
## `geom_smooth()` using formula = 'y ~ x'